<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[199738] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/199738">199738</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2016-04-19 12:46:21 -0700 (Tue, 19 Apr 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Update ANGLE
https://bugs.webkit.org/show_bug.cgi?id=156755

Reviewed by Dean Jackson.

Source/ThirdParty/ANGLE:

Huge list of changed files omitted.

Source/WebCore:

* CMakeLists.txt:
* platform/graphics/ANGLEWebKitBridge.h:
(WebCore::ANGLEWebKitBridge::getResources):
* platform/graphics/cairo/GraphicsContext3DCairo.cpp:
(WebCore::GraphicsContext3D::GraphicsContext3D):
Continue to compile successfully with new ANGLE.

LayoutTests:

* webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved-expected.txt: Removed.
* webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved.html: Removed.
Removed invalid test based on https://github.com/KhronosGroup/WebGL/pull/1230</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceThirdPartyANGLEANGLEplist">trunk/Source/ThirdParty/ANGLE/ANGLE.plist</a></li>
<li><a href="#trunkSourceThirdPartyANGLEANGLExcodeprojprojectpbxproj">trunk/Source/ThirdParty/ANGLE/ANGLE.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceThirdPartyANGLEAUTHORS">trunk/Source/ThirdParty/ANGLE/AUTHORS</a></li>
<li><a href="#trunkSourceThirdPartyANGLEBUILDgn">trunk/Source/ThirdParty/ANGLE/BUILD.gn</a></li>
<li><a href="#trunkSourceThirdPartyANGLECMakeListstxt">trunk/Source/ThirdParty/ANGLE/CMakeLists.txt</a></li>
<li><a href="#trunkSourceThirdPartyANGLECONTRIBUTORS">trunk/Source/ThirdParty/ANGLE/CONTRIBUTORS</a></li>
<li><a href="#trunkSourceThirdPartyANGLEChangeLog">trunk/Source/ThirdParty/ANGLE/ChangeLog</a></li>
<li><a href="#trunkSourceThirdPartyANGLEDEPS">trunk/Source/ThirdParty/ANGLE/DEPS</a></li>
<li><a href="#trunkSourceThirdPartyANGLEREADMEmd">trunk/Source/ThirdParty/ANGLE/README.md</a></li>
<li><a href="#trunkSourceThirdPartyANGLEangleisolate">trunk/Source/ThirdParty/ANGLE/angle.isolate</a></li>
<li><a href="#trunkSourceThirdPartyANGLEchangesdiff">trunk/Source/ThirdParty/ANGLE/changes.diff</a></li>
<li><a href="#trunkSourceThirdPartyANGLEcodereviewsettings">trunk/Source/ThirdParty/ANGLE/codereview.settings</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeEGLeglexth">trunk/Source/ThirdParty/ANGLE/include/EGL/eglext.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeEGLeglplatformh">trunk/Source/ThirdParty/ANGLE/include/EGL/eglplatform.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeGLES2gl2h">trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeGLES2gl2exth">trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2ext.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeGLES2gl2platformh">trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2platform.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeGLES3gl3h">trunk/Source/ThirdParty/ANGLE/include/GLES3/gl3.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeGLES3gl3platformh">trunk/Source/ThirdParty/ANGLE/include/GLES3/gl3platform.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeGLSLANGShaderLangh">trunk/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeGLSLANGShaderVarsh">trunk/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeangle_glh">trunk/Source/ThirdParty/ANGLE/include/angle_gl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeangle_windowsstoreh">trunk/Source/ThirdParty/ANGLE/include/angle_windowsstore.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeplatformPlatformh">trunk/Source/ThirdParty/ANGLE/include/platform/Platform.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrcanglegyp">trunk/Source/ThirdParty/ANGLE/src/angle.gyp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonOptionalh">trunk/Source/ThirdParty/ANGLE/src/common/Optional.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonOptional_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/common/Optional_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonangleutilscpp">trunk/Source/ThirdParty/ANGLE/src/common/angleutils.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonangleutilsh">trunk/Source/ThirdParty/ANGLE/src/common/angleutils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommondebugcpp">trunk/Source/ThirdParty/ANGLE/src/common/debug.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommondebugh">trunk/Source/ThirdParty/ANGLE/src/common/debug.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonmathutilcpp">trunk/Source/ThirdParty/ANGLE/src/common/mathutil.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonmathutilh">trunk/Source/ThirdParty/ANGLE/src/common/mathutil.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonutilitiescpp">trunk/Source/ThirdParty/ANGLE/src/common/utilities.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonutilitiesh">trunk/Source/ThirdParty/ANGLE/src/common/utilities.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonversionh">trunk/Source/ThirdParty/ANGLE/src/common/version.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorDiagnosticsBasecpp">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorDiagnosticsBaseh">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorDirectiveParsercpp">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorDirectiveParserh">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorExpressionParsercpp">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorExpressionParserh">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorExpressionParsery">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.y</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorInputcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorInputh">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorMacrocpp">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorMacroh">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorMacroExpandercpp">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorMacroExpanderh">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorPreprocessorcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorTokenizercpp">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorTokenizerh">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessorTokenizerl">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.l</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilerpreprocessornumeric_lexh">trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/numeric_lex.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorASTMetadataHLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorASTMetadataHLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorArrayReturnValueToOutParametercpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorArrayReturnValueToOutParameterh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorBaseTypesh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BaseTypes.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorBuiltInFunctionEmulatorcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorBuiltInFunctionEmulatorh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorBuiltInFunctionEmulatorGLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorBuiltInFunctionEmulatorGLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorBuiltInFunctionEmulatorHLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorCallDAGcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorCodeGencpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/CodeGen.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorCommonh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Common.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorCompilercpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorCompilerh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorDiagnosticsh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorDirectiveHandlercpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorDirectiveHandlerh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorEmulatePrecisioncpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorEmulatePrecisionh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorExtensionBehaviorh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorFlagStd140Structsh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorForLoopUnrollcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ForLoopUnroll.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorForLoopUnrollh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ForLoopUnroll.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorInfoSinkcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorInitializecpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorInitializeDllcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeDll.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorInitializeParseContexth">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeParseContext.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorInitializeVariablesh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeVariables.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorIntermNodecpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorIntermNodeh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorIntermTraversecpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermTraverse.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorIntermediatecpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Intermediate.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorNodeSearchh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/NodeSearch.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorOperatorcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorOperatorh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorOutputESSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputESSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorOutputGLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorOutputGLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorOutputGLSLBasecpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorOutputGLSLBaseh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorOutputHLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorOutputHLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorParseContextcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorParseContexth">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorPoolAlloch">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRegenerateStructNamesh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RegenerateStructNames.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRenameFunctionh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RenameFunction.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRewriteElseBlockscpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRewriteElseBlocksh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorScalarizeVecAndMatConstructorArgscpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorScalarizeVecAndMatConstructorArgsh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSearchSymbolcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSearchSymbolh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateArrayInitializationcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateArrayInitializationh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateDeclarationscpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateDeclarationsh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorShaderLangcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderLang.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorShaderVarscpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderVars.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorStructureHLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorStructureHLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSymbolTablecpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSymbolTableh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorESSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorESSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorGLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorGLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorHLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorHLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorTypescpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorTypesh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorUnfoldShortCircuitASTh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorUniformHLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorUniformHLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorUtilsHLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorUtilsHLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorValidateLimitationscpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorValidateLimitationsh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorValidateOutputscpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorValidateOutputsh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorValidateSwitchh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorVariableInfocpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VariableInfo.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorVariableInfoh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VariableInfo.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorVersionGLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorVersionGLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorblocklayoutcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorblocklayouth">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorblocklayoutHLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatordepgraphDependencyGraphcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraph.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatordepgraphDependencyGraphh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraph.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatordepgraphDependencyGraphBuilderh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraphBuilder.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatordepgraphDependencyGraphOutputcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraphOutput.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorgenerate_parsersh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/generate_parser.sh</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorglslangh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorglslangl">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.l</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorglslangy">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.y</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorglslang_lexcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_lex.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorglslang_tabcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorglslang_tabh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorintermOutcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/intermOut.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorintermediateh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/intermediate.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatortimingRestrictFragmentShaderTimingcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/timing/RestrictFragmentShaderTiming.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatortimingRestrictVertexShaderTimingh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/timing/RestrictVertexShaderTiming.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorutilcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/util.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorutilh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/util.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilergypi">trunk/Source/ThirdParty/ANGLE/src/compiler.gypi</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccopy_compiler_dllbat">trunk/Source/ThirdParty/ANGLE/src/copy_compiler_dll.bat</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEAttributeMapcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/AttributeMap.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEAttributeMaph">trunk/Source/ThirdParty/ANGLE/src/libANGLE/AttributeMap.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEBinaryStreamh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/BinaryStream.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEBuffercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Buffer.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEBufferh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Buffer.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLECapscpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Caps.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLECapsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Caps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLECompilercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLECompilerh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEConfigcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEConfigh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEConfig_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEContextcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Context.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEContexth">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Context.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEDatacpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Data.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEDatah">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Data.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEDevicecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Device.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEDeviceh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Device.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEDisplaycpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEDisplayh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Display.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEErrorcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEErrorh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEErrorinl">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.inl</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEFencecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Fence.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEFenceh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Fence.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEFramebuffercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEFramebufferh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEFramebufferAttachmentcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/FramebufferAttachment.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEFramebufferAttachmenth">trunk/Source/ThirdParty/ANGLE/src/libANGLE/FramebufferAttachment.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEHandleAllocatorcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEHandleAllocatorh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEHandleAllocator_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEImageIndexcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/ImageIndex.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEImageIndexh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/ImageIndex.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEPlatformcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Platform.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEProgramcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEProgramh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEQuerycpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Query.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEQueryh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Query.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLERefCountObjecth">trunk/Source/ThirdParty/ANGLE/src/libANGLE/RefCountObject.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLERenderbuffercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Renderbuffer.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLERenderbufferh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Renderbuffer.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEResourceManagercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEResourceManagerh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEResourceManager_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLESamplercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Sampler.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLESamplerh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Sampler.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEShadercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Shader.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEShaderh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Shader.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEStatecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/State.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEStateh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/State.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLESurfacecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLESurfaceh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLESurface_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLETexturecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Texture.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLETextureh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Texture.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLETransformFeedbackcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLETransformFeedbackh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLETransformFeedback_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEUniformcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Uniform.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEUniformh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Uniform.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEVertexArraycpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexArray.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEVertexArrayh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexArray.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEVertexAttributecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEVertexAttributeh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEangletypescpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEangletypesh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEfeaturesh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/features.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEformatutilscpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEformatutilsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEhistogram_macrosh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/histogram_macros.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEqueryconversionscpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/queryconversions.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEqueryconversionsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/queryconversions.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererBufferImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/BufferImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererBufferImpl_mockh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/BufferImpl_mock.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererCompilerImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/CompilerImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererDeviceImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DeviceImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererDisplayImplcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DisplayImpl.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererDisplayImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DisplayImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererFramebufferImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/FramebufferImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererImplFactoryh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImplFactory.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererProgramImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererQueryImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/QueryImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererRenderbufferImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/RenderbufferImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererRenderercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/Renderer.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererRendererh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/Renderer.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererShaderImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererSurfaceImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererTextureImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TextureImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererTransformFeedbackImpl_mockh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TransformFeedbackImpl_mock.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererVertexArrayImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/VertexArrayImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dBufferD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/BufferD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dBufferD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/BufferD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dCompilerD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/CompilerD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dCompilerD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/CompilerD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDeviceD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DeviceD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDeviceD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DeviceD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDisplayD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DisplayD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDisplayD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DisplayD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDynamicHLSLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DynamicHLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDynamicHLSLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DynamicHLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dFramebufferD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/FramebufferD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dFramebufferD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/FramebufferD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dHLSLCompilercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/HLSLCompiler.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dHLSLCompilerh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/HLSLCompiler.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dImageD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ImageD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dImageD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ImageD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dIndexBufferh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexBuffer.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dIndexDataManagercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexDataManager.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dIndexDataManagerh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexDataManager.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dProgramD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ProgramD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dProgramD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ProgramD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dRenderTargetD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderTargetD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dRenderbufferD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dRenderbufferD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderbufferD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dRendererD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RendererD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dRendererD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RendererD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dShaderD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ShaderD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dShaderD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ShaderD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dSurfaceD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SurfaceD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dSurfaceD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SurfaceD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dSwapChainD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SwapChainD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dTextureD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dTextureD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dTextureStorageh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureStorage.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVertexBuffercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexBuffer.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVertexBufferh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexBuffer.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVertexDataManagercpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexDataManager.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVertexDataManagerh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexDataManager.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Blit11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Blit11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Blit11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Buffer11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Buffer11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Buffer11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Clear11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Clear11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Clear11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11DebugAnnotator11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11DebugAnnotator11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Fence11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Framebuffer11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Framebuffer11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Image11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Image11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Image11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Image11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11InputLayoutCachecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11InputLayoutCacheh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11NativeWindowh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/NativeWindow.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11PixelTransfer11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Query11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Query11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Query11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Query11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11RenderStateCachecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11RenderStateCacheh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11RenderTarget11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11RenderTarget11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Renderer11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Renderer11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11ShaderExecutable11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11SwapChain11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11SwapChain11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11TextureStorage11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11TextureStorage11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Trim11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Trim11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11VertexArray11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11VertexBuffer11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11VertexBuffer11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11copyvertexinl">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11formatutils11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11formatutils11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/formatutils11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11renderer11_utilscpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11renderer11_utilsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledbuffertotexture11_gsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledbuffertotexture11_ps_4fh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledbuffertotexture11_ps_4ih">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledbuffertotexture11_ps_4uih">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledbuffertotexture11_vsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearfloat11_fl9psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearfloat11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearfloat11vsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11vs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearsint11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearsint11vsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11vs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearuint11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearuint11vsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11vs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthrough2d11vsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthrough3d11gsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthrough3d11vsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughdepth2d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughlum2d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughlum3d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum3d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughlumalpha2d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughlumalpha3d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha3d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr2d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr2di11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2di11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr2dui11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2dui11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr3d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr3di11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3di11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr3dui11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3dui11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg2d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg2di11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2di11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg2dui11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2dui11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg3d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg3di11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3di11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg3dui11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3dui11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb2d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb2di11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2di11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb2dui11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2dui11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb3d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb3di11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3di11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb3dui11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3dui11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba2d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba2di11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2di11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba2dui11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dui11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba3d11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba3di11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3di11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba3dui11psh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3dui11ps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlef2darraypsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlef2dpsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlef3dpsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlei2darraypsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlei2dpsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlei3dpsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzleui2darraypsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzleui2dpsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzleui3dpsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shadersgenerate_shadersbat">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11win32NativeWindowcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtCoreWindowNativeWindowcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtCoreWindowNativeWindowh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtCoreWindowNativeWindow_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtInspectableNativeWindowcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtInspectableNativeWindowh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtSwapChainPanelNativeWindowcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtSwapChainPanelNativeWindowh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtSwapChainPanelNativeWindow_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Blit9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Buffer9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Buffer9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Buffer9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9DebugAnnotator9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9DebugAnnotator9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Framebuffer9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Framebuffer9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Image9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Image9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Image9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Image9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Query9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Query9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Query9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Query9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9RenderTarget9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9RenderTarget9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Renderer9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Renderer9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Renderer9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9ShaderExecutable9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9SwapChain9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9SwapChain9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9TextureStorage9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9TextureStorage9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9VertexArray9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9VertexBuffer9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9VertexBuffer9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9VertexDeclarationCachecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9VertexDeclarationCacheh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9formatutils9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9formatutils9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/formatutils9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9renderer9_utilscpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9renderer9_utilsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shaderscompiledcomponentmaskpsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shaderscompiledflipyvsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/flipyvs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shaderscompiledluminancepsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shaderscompiledpassthroughpsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shaderscompiledstandardvsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shadersgenerate_shadersbat">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/generate_shaders.bat</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9vertexconversionh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dformatutilsD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/formatutilsD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dimageformatsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/imageformats.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dloadimagecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dloadimageh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglBufferGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BufferGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglBufferGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BufferGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglCompilerGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/CompilerGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglCompilerGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/CompilerGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglDisplayGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/DisplayGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglDisplayGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/DisplayGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglFramebufferGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglFramebufferGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglFunctionsGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FunctionsGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglFunctionsGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FunctionsGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglProgramGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglProgramGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglQueryGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/QueryGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglQueryGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/QueryGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglRenderbufferGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RenderbufferGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglRenderbufferGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RenderbufferGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglRendererGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RendererGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglRendererGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RendererGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglShaderGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglShaderGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglStateManagerGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/StateManagerGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglStateManagerGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/StateManagerGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglSurfaceGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SurfaceGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglSurfaceGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SurfaceGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglTextureGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TextureGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglTextureGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TextureGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglTransformFeedbackGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglTransformFeedbackGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TransformFeedbackGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglVertexArrayGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/VertexArrayGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglVertexArrayGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/VertexArrayGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglformatutilsglcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/formatutilsgl.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglformatutilsglh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/formatutilsgl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglfunctionsgl_enumsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/functionsgl_enums.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglfunctionsgl_typedefsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/functionsgl_typedefs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglrenderergl_utilscpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglrenderergl_utilsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglDisplayWGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglDisplayWGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglFunctionsWGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglFunctionsWGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/FunctionsWGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglPbufferSurfaceWGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglPbufferSurfaceWGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglWindowSurfaceWGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglWindowSurfaceWGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglwgl_utilscpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/wgl_utils.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglwgl_utilsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/wgl_utils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEvalidationEGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEvalidationEGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEvalidationEScpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEvalidationESh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEvalidationES2cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEvalidationES2h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEvalidationES3cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEvalidationES3h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibEGLlibEGLcpp">trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibEGLlibEGLdef">trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.def</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibEGLlibEGLrc">trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.rc</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibEGLgypi">trunk/Source/ThirdParty/ANGLE/src/libEGL.gypi</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_eglcpp">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_egl_extcpp">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_egl_exth">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_gles_2_0cpp">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_gles_2_0_extcpp">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0_ext.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_gles_2_0_exth">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0_ext.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_gles_3_0cpp">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_3_0.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2global_statecpp">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2libGLESv2cpp">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2libGLESv2def">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.def</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2libGLESv2rc">trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.rc</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibGLESv2gypi">trunk/Source/ThirdParty/ANGLE/src/libGLESv2.gypi</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrcthird_partycompilerArrayBoundsClampercpp">trunk/Source/ThirdParty/ANGLE/src/third_party/compiler/ArrayBoundsClamper.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrcthird_partymurmurhashMurmurHash3cpp">trunk/Source/ThirdParty/ANGLE/src/third_party/murmurhash/MurmurHash3.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrcthird_partymurmurhashMurmurHash3h">trunk/Source/ThirdParty/ANGLE/src/third_party/murmurhash/MurmurHash3.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilEGLWindowcpp">trunk/Source/ThirdParty/ANGLE/util/EGLWindow.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilEGLWindowh">trunk/Source/ThirdParty/ANGLE/util/EGLWindow.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilOSWindowcpp">trunk/Source/ThirdParty/ANGLE/util/OSWindow.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilOSWindowh">trunk/Source/ThirdParty/ANGLE/util/OSWindow.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilrandom_utilscpp">trunk/Source/ThirdParty/ANGLE/util/random_utils.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilrandom_utilsh">trunk/Source/ThirdParty/ANGLE/util/random_utils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilshader_utilscpp">trunk/Source/ThirdParty/ANGLE/util/shader_utils.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilshader_utilsh">trunk/Source/ThirdParty/ANGLE/util/shader_utils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilutilgyp">trunk/Source/ThirdParty/ANGLE/util/util.gyp</a></li>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsANGLEWebKitBridgeh">trunk/Source/WebCore/platform/graphics/ANGLEWebKitBridge.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscairoGraphicsContext3DCairocpp">trunk/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceThirdPartyANGLEincludeGLES3gl31h">trunk/Source/ThirdParty/ANGLE/include/GLES3/gl31.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEincludeGLES3gl32h">trunk/Source/ThirdParty/ANGLE/include/GLES3/gl32.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonBitSetIteratorh">trunk/Source/ThirdParty/ANGLE/src/common/BitSetIterator.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonBitSetIterator_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/common/BitSetIterator_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonFloat16ToFloat32cpp">trunk/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonFloat16ToFloat32py">trunk/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.py</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonmathutil_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/common/mathutil_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonmatrix_utilsh">trunk/Source/ThirdParty/ANGLE/src/common/matrix_utils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonmatrix_utils_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/common/matrix_utils_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonstring_utilscpp">trunk/Source/ThirdParty/ANGLE/src/common/string_utils.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonstring_utilsh">trunk/Source/ThirdParty/ANGLE/src/common/string_utils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccommonstring_utils_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/common/string_utils_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorCachecpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorCacheh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorDeferGlobalInitializerscpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorDeferGlobalInitializersh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorExtensionGLSLcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorExtensionGLSLh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRecordConstantPrecisioncpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRecordConstantPrecisionh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRemoveDynamicIndexingcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRemoveDynamicIndexingh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRemovePowcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRemovePowh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRewriteDoWhilecpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorRewriteDoWhileh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateExpressionsReturningArrayscpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateExpressionsReturningArraysh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorUnfoldShortCircuitToIfcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorUnfoldShortCircuitToIfh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorValidateGlobalInitializercpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorValidateGlobalInitializerh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorValidateMaxParameterscpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorValidateMaxParametersh">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEBinaryStream_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/BinaryStream_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEDebugcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Debug.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEDebugh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Debug.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEImagecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEImageh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEImage_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEIndexRangeCachecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/IndexRangeCache.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEIndexRangeCacheh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/IndexRangeCache.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEProgram_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEStreamcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Stream.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEStreamh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Stream.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEVersionh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Version.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEVersioninl">trunk/Source/ThirdParty/ANGLE/src/libANGLE/Version.inl</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEVertexAttributeinl">trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.inl</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEangletypesinl">trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.inl</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererFramebufferImpl_mockh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/FramebufferImpl_mock.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererImageImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImageImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererImageImpl_mockh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImageImpl_mock.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererProgramImpl_mockh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramImpl_mock.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererRenderbufferImpl_mockh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/RenderbufferImpl_mock.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererSamplerImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SamplerImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererStreamImplh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/StreamImpl.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererTextureImpl_mockh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TextureImpl_mock.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dEGLImageD3Dcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/EGLImageD3D.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dEGLImageD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/EGLImageD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dSamplerD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SamplerD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVaryingPackingcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VaryingPacking.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVaryingPackingh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VaryingPacking.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dWorkaroundsD3Dh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/WorkaroundsD3D.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11StateManager11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11StateManager11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/StateManager11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Stream11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Stream11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Stream11h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Stream11.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11VertexArray11cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11dxgi_support_datajson">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11dxgi_support_tablecpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11dxgi_support_tableh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11gen_dxgi_support_tablespy">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11gen_load_functions_tablepy">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_load_functions_table.py</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11gen_texture_format_tablepy">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11load_functions_datajson">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_data.json</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11load_functions_tableh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_table.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11load_functions_table_autogencpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_table_autogen.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11texture_format_datajson">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11texture_format_mapjson">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11texture_format_tableh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11texture_format_table_autogencpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11texture_format_table_autogenh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9StateManager9cpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9StateManager9h">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/StateManager9.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dloadimage_etccpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage_etc.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererd3dloadimage_etch">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage_etc.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglBlitGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BlitGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglBlitGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BlitGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglFeatureSupportGLmd">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FeatureSupportGL.md</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglSamplerGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SamplerGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglSamplerGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SamplerGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglWorkaroundsGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/WorkaroundsGL.h</a></li>
<li>trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/</li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglcglDisplayCGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/DisplayCGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglcglDisplayCGLmm">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglcglPbufferSurfaceCGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglcglPbufferSurfaceCGLmm">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglcglWindowSurfaceCGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglcglWindowSurfaceCGLmm">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm</a></li>
<li>trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/</li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxDisplayGLXcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxDisplayGLXh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/DisplayGLX.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxFBConfigCompatibilitymd">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FBConfigCompatibility.md</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxFunctionsGLXcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxFunctionsGLXh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FunctionsGLX.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxPbufferSurfaceGLXcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxPbufferSurfaceGLXh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxSurfaceGLXh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/SurfaceGLX.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxWindowSurfaceGLXcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxWindowSurfaceGLXh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxfunctionsglx_typedefsh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/functionsglx_typedefs.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglglxplatform_glxh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/platform_glx.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglDXGISwapChainWindowSurfaceWGLcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLErendererglwglDXGISwapChainWindowSurfaceWGLh">trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLEvalidationES_unittestcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES_unittest.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilMatrixcpp">trunk/Source/ThirdParty/ANGLE/util/Matrix.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilMatrixh">trunk/Source/ThirdParty/ANGLE/util/Matrix.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilOSPixmaph">trunk/Source/ThirdParty/ANGLE/util/OSPixmap.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilVectorcpp">trunk/Source/ThirdParty/ANGLE/util/Vector.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilVectorh">trunk/Source/ThirdParty/ANGLE/util/Vector.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilgeometry_utilscpp">trunk/Source/ThirdParty/ANGLE/util/geometry_utils.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilgeometry_utilsh">trunk/Source/ThirdParty/ANGLE/util/geometry_utils.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEutilsystem_utilsh">trunk/Source/ThirdParty/ANGLE/util/system_utils.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkLayoutTestswebgl102conformanceglslreservedwebgl_preprocessor_reservedexpectedtxt">trunk/LayoutTests/webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved-expected.txt</a></li>
<li><a href="#trunkLayoutTestswebgl102conformanceglslreservedwebgl_preprocessor_reservedhtml">trunk/LayoutTests/webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved.html</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorQualifierAlivecpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierAlive.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSimplifyArrayAssignmentcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyArrayAssignment.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorSimplifyArrayAssignmenth">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyArrayAssignment.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorUnfoldShortCircuitcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuit.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorUnfoldShortCircuith">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuit.h</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrccompilertranslatorparseConstcpp">trunk/Source/ThirdParty/ANGLE/src/compiler/translator/parseConst.cpp</a></li>
<li><a href="#trunkSourceThirdPartyANGLEsrclibANGLERefCountObjectcpp">trunk/Source/ThirdParty/ANGLE/src/libANGLE/RefCountObject.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/LayoutTests/ChangeLog        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2016-04-19  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Update ANGLE
+        https://bugs.webkit.org/show_bug.cgi?id=156755
+
+        Reviewed by Dean Jackson.
+
+        * webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved-expected.txt: Removed.
+        * webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved.html: Removed.
+        Removed invalid test based on https://github.com/KhronosGroup/WebGL/pull/1230
+
</ins><span class="cx"> 2016-04-19  Youenn Fablet  &lt;youenn.fablet@crf.canon.fr&gt;
</span><span class="cx"> 
</span><span class="cx">         imported/w3c/web-platform-tests/streams/readable-streams/general.https.html is a flaky failure
</span></span></pre></div>
<a id="trunkLayoutTestswebgl102conformanceglslreservedwebgl_preprocessor_reservedexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved-expected.txt (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved-expected.txt        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/LayoutTests/webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved-expected.txt        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,5 +0,0 @@
</span><del>-This test runs the WebGL Test listed below in an iframe and reports PASS or FAIL.
-
-Test: ../../../resources/webgl_test_files/conformance/glsl/reserved/webgl_preprocessor_reserved.html
-PASS
-
</del></span></pre></div>
<a id="trunkLayoutTestswebgl102conformanceglslreservedwebgl_preprocessor_reservedhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved.html (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved.html        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/LayoutTests/webgl/1.0.2/conformance/glsl/reserved/webgl_preprocessor_reserved.html        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,18 +0,0 @@
</span><del>-&lt;!-- This file is auto-generated by generate-webgl-tests.py. DO NOT EDIT --&gt;
-&lt;!DOCTYPE html&gt;
-&lt;html&gt;
-&lt;head&gt;
-&lt;meta charset=&quot;utf-8&quot;&gt;
-&lt;title&gt;WebGL Conformance Test Wrapper for webgl_preprocessor_reserved.html&lt;/title&gt;
-&lt;script type=&quot;text/javascript&quot; src=&quot;../../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
-&lt;script type=&quot;text/javascript&quot; src=&quot;../../../resources/webkit-webgl-test-harness.js&quot;&gt;&lt;/script&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;p&gt;This test runs the WebGL Test listed below in an iframe and reports PASS or FAIL.&lt;/p&gt;
-Test: &lt;a href=&quot;../../../resources/webgl_test_files/conformance/glsl/reserved/webgl_preprocessor_reserved.html&quot;&gt;../../../resources/webgl_test_files/conformance/glsl/reserved/webgl_preprocessor_reserved.html&lt;/a&gt;
-&lt;div id=&quot;result&quot;&gt;&lt;/div&gt;
-&lt;div id=&quot;iframe&quot;&gt;
-&lt;iframe src=&quot;../../../resources/webgl_test_files/conformance/glsl/reserved/webgl_preprocessor_reserved.html&quot; width=&quot;800&quot; height=&quot;600&quot;&gt;&lt;/iframe&gt;
-&lt;/div&gt;
-&lt;/body&gt;
-&lt;/html&gt;
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEANGLEplist"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/ANGLE.plist (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/ANGLE.plist        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/ANGLE.plist        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,7 +10,7 @@
</span><span class="cx">         &lt;key&gt;OpenSourceWebsiteURL&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;http://code.google.com/p/angleproject/&lt;/string&gt;
</span><span class="cx">         &lt;key&gt;OpenSourceSCM&lt;/key&gt;
</span><del>-        &lt;string&gt;git clone https://chromium.googlesource.com/angle/angle &amp;amp;&amp;amp; cd angle &amp;amp;&amp;amp; git checkout b11e2483742db884bd0af41f78f528240577356b&lt;/string&gt;
</del><ins>+        &lt;string&gt;git clone https://chromium.googlesource.com/angle/angle &amp;amp;&amp;amp; cd angle &amp;amp;&amp;amp; git checkout 6684007a77572f3616fc453138b0ef5f7d42d038&lt;/string&gt;
</ins><span class="cx">         &lt;key&gt;OpenSourceImportDate&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;2014-04-29&lt;/string&gt;
</span><span class="cx">         &lt;key&gt;OpenSourceLicense&lt;/key&gt;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEANGLExcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/ANGLE.xcodeproj/project.pbxproj (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/ANGLE.xcodeproj/project.pbxproj        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/ANGLE.xcodeproj/project.pbxproj        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -57,13 +57,11 @@
</span><span class="cx">                 31012E5018B97B9B0039062F /* OutputGLSLBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012DE018B97B9B0039062F /* OutputGLSLBase.h */; };
</span><span class="cx">                 31012E5118B97B9B0039062F /* OutputHLSL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31012DE118B97B9B0039062F /* OutputHLSL.cpp */; };
</span><span class="cx">                 31012E5218B97B9B0039062F /* OutputHLSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012DE218B97B9B0039062F /* OutputHLSL.h */; };
</span><del>-                31012E5318B97B9B0039062F /* parseConst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31012DE318B97B9B0039062F /* parseConst.cpp */; };
</del><span class="cx">                 31012E5418B97B9B0039062F /* ParseContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31012DE418B97B9B0039062F /* ParseContext.cpp */; };
</span><span class="cx">                 31012E5518B97B9B0039062F /* ParseContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012DE518B97B9B0039062F /* ParseContext.h */; };
</span><span class="cx">                 31012E5618B97B9B0039062F /* PoolAlloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31012DE618B97B9B0039062F /* PoolAlloc.cpp */; };
</span><span class="cx">                 31012E5718B97B9B0039062F /* PoolAlloc.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012DE718B97B9B0039062F /* PoolAlloc.h */; };
</span><span class="cx">                 31012E5818B97B9B0039062F /* Pragma.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012DE818B97B9B0039062F /* Pragma.h */; };
</span><del>-                31012E5918B97B9B0039062F /* QualifierAlive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31012DE918B97B9B0039062F /* QualifierAlive.cpp */; };
</del><span class="cx">                 31012E5A18B97B9B0039062F /* QualifierAlive.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012DEA18B97B9B0039062F /* QualifierAlive.h */; };
</span><span class="cx">                 31012E5D18B97B9B0039062F /* RenameFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012DED18B97B9B0039062F /* RenameFunction.h */; };
</span><span class="cx">                 31012E5E18B97B9B0039062F /* RewriteElseBlocks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31012DEE18B97B9B0039062F /* RewriteElseBlocks.cpp */; };
</span><span class="lines">@@ -84,8 +82,6 @@
</span><span class="cx">                 31012E6E18B97B9B0039062F /* TranslatorHLSL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31012DFF18B97B9B0039062F /* TranslatorHLSL.cpp */; };
</span><span class="cx">                 31012E6F18B97B9B0039062F /* TranslatorHLSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012E0018B97B9B0039062F /* TranslatorHLSL.h */; };
</span><span class="cx">                 31012E7018B97B9B0039062F /* Types.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012E0118B97B9B0039062F /* Types.h */; };
</span><del>-                31012E7118B97B9B0039062F /* UnfoldShortCircuit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31012E0218B97B9B0039062F /* UnfoldShortCircuit.cpp */; };
-                31012E7218B97B9B0039062F /* UnfoldShortCircuit.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012E0318B97B9B0039062F /* UnfoldShortCircuit.h */; };
</del><span class="cx">                 31012E7318B97B9B0039062F /* UnfoldShortCircuitAST.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31012E0418B97B9B0039062F /* UnfoldShortCircuitAST.cpp */; };
</span><span class="cx">                 31012E7418B97B9B0039062F /* UnfoldShortCircuitAST.h in Headers */ = {isa = PBXBuildFile; fileRef = 31012E0518B97B9B0039062F /* UnfoldShortCircuitAST.h */; };
</span><span class="cx">                 31012E7718B97B9B0039062F /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31012E0818B97B9B0039062F /* util.cpp */; };
</span><span class="lines">@@ -142,8 +138,6 @@
</span><span class="cx">                 5C1DBC3F1B04375F00235552 /* SeparateDeclarations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1DBC181B04375F00235552 /* SeparateDeclarations.cpp */; };
</span><span class="cx">                 5C1DBC401B04375F00235552 /* SeparateDeclarations.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1DBC191B04375F00235552 /* SeparateDeclarations.h */; };
</span><span class="cx">                 5C1DBC411B04375F00235552 /* ShaderVars.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1DBC1A1B04375F00235552 /* ShaderVars.cpp */; };
</span><del>-                5C1DBC421B04375F00235552 /* SimplifyArrayAssignment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1DBC1B1B04375F00235552 /* SimplifyArrayAssignment.cpp */; };
-                5C1DBC431B04375F00235552 /* SimplifyArrayAssignment.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1DBC1C1B04375F00235552 /* SimplifyArrayAssignment.h */; };
</del><span class="cx">                 5C1DBC441B04375F00235552 /* Types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1DBC1D1B04375F00235552 /* Types.cpp */; };
</span><span class="cx">                 5C1DBC451B04375F00235552 /* ValidateSwitch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1DBC1E1B04375F00235552 /* ValidateSwitch.cpp */; };
</span><span class="cx">                 5C1DBC461B04375F00235552 /* ValidateSwitch.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1DBC1F1B04375F00235552 /* ValidateSwitch.h */; };
</span><span class="lines">@@ -193,7 +187,6 @@
</span><span class="cx">                 5C1DBE021B0438D300235552 /* Query.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1DBC791B0438D200235552 /* Query.h */; };
</span><span class="cx">                 5C1DBE031B0438D300235552 /* queryconversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1DBC7A1B0438D200235552 /* queryconversions.cpp */; };
</span><span class="cx">                 5C1DBE041B0438D300235552 /* queryconversions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1DBC7B1B0438D200235552 /* queryconversions.h */; };
</span><del>-                5C1DBE051B0438D300235552 /* RefCountObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1DBC7C1B0438D200235552 /* RefCountObject.cpp */; };
</del><span class="cx">                 5C1DBE061B0438D300235552 /* RefCountObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1DBC7D1B0438D200235552 /* RefCountObject.h */; };
</span><span class="cx">                 5C1DBE071B0438D300235552 /* Renderbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1DBC7E1B0438D200235552 /* Renderbuffer.cpp */; };
</span><span class="cx">                 5C1DBE081B0438D300235552 /* Renderbuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1DBC7F1B0438D200235552 /* Renderbuffer.h */; };
</span><span class="lines">@@ -225,6 +218,28 @@
</span><span class="cx">                 5C1DBF401B0438D300235552 /* VertexArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1DBDD01B0438D300235552 /* VertexArray.h */; };
</span><span class="cx">                 5C1DBF411B0438D300235552 /* VertexAttribute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C1DBDD11B0438D300235552 /* VertexAttribute.cpp */; };
</span><span class="cx">                 5C1DBF421B0438D300235552 /* VertexAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1DBDD21B0438D300235552 /* VertexAttribute.h */; };
</span><ins>+                5C315CFE1CC5B6DA00776697 /* Cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CE81CC5B6DA00776697 /* Cache.cpp */; };
+                5C315CFF1CC5B6DA00776697 /* Cache.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CE91CC5B6DA00776697 /* Cache.h */; };
+                5C315D001CC5B6DA00776697 /* DeferGlobalInitializers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CEA1CC5B6DA00776697 /* DeferGlobalInitializers.cpp */; };
+                5C315D011CC5B6DA00776697 /* DeferGlobalInitializers.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CEB1CC5B6DA00776697 /* DeferGlobalInitializers.h */; };
+                5C315D021CC5B6DA00776697 /* ExtensionGLSL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CEC1CC5B6DA00776697 /* ExtensionGLSL.cpp */; };
+                5C315D031CC5B6DA00776697 /* ExtensionGLSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CED1CC5B6DA00776697 /* ExtensionGLSL.h */; };
+                5C315D041CC5B6DA00776697 /* RecordConstantPrecision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CEE1CC5B6DA00776697 /* RecordConstantPrecision.cpp */; };
+                5C315D051CC5B6DA00776697 /* RecordConstantPrecision.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CEF1CC5B6DA00776697 /* RecordConstantPrecision.h */; };
+                5C315D061CC5B6DA00776697 /* RemoveDynamicIndexing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CF01CC5B6DA00776697 /* RemoveDynamicIndexing.cpp */; };
+                5C315D071CC5B6DA00776697 /* RemoveDynamicIndexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CF11CC5B6DA00776697 /* RemoveDynamicIndexing.h */; };
+                5C315D081CC5B6DA00776697 /* RemovePow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CF21CC5B6DA00776697 /* RemovePow.cpp */; };
+                5C315D091CC5B6DA00776697 /* RemovePow.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CF31CC5B6DA00776697 /* RemovePow.h */; };
+                5C315D0A1CC5B6DA00776697 /* RewriteDoWhile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CF41CC5B6DA00776697 /* RewriteDoWhile.cpp */; };
+                5C315D0B1CC5B6DA00776697 /* RewriteDoWhile.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CF51CC5B6DA00776697 /* RewriteDoWhile.h */; };
+                5C315D0C1CC5B6DA00776697 /* SeparateExpressionsReturningArrays.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CF61CC5B6DA00776697 /* SeparateExpressionsReturningArrays.cpp */; };
+                5C315D0D1CC5B6DA00776697 /* SeparateExpressionsReturningArrays.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CF71CC5B6DA00776697 /* SeparateExpressionsReturningArrays.h */; };
+                5C315D0E1CC5B6DA00776697 /* UnfoldShortCircuitToIf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CF81CC5B6DA00776697 /* UnfoldShortCircuitToIf.cpp */; };
+                5C315D0F1CC5B6DA00776697 /* UnfoldShortCircuitToIf.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CF91CC5B6DA00776697 /* UnfoldShortCircuitToIf.h */; };
+                5C315D101CC5B6DA00776697 /* ValidateGlobalInitializer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CFA1CC5B6DA00776697 /* ValidateGlobalInitializer.cpp */; };
+                5C315D111CC5B6DA00776697 /* ValidateGlobalInitializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CFB1CC5B6DA00776697 /* ValidateGlobalInitializer.h */; };
+                5C315D121CC5B6DA00776697 /* ValidateMaxParameters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C315CFC1CC5B6DA00776697 /* ValidateMaxParameters.cpp */; };
+                5C315D131CC5B6DA00776697 /* ValidateMaxParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C315CFD1CC5B6DA00776697 /* ValidateMaxParameters.h */; };
</ins><span class="cx">                 5C9FFF4E19102A000025B8FA /* FlagStd140Structs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C9FFF4C19102A000025B8FA /* FlagStd140Structs.cpp */; };
</span><span class="cx">                 5C9FFF4F19102A000025B8FA /* FlagStd140Structs.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C9FFF4D19102A000025B8FA /* FlagStd140Structs.h */; };
</span><span class="cx">                 5CC7D452191024E4000B8C1F /* LoopInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CC7D44B191024E3000B8C1F /* LoopInfo.cpp */; };
</span><span class="lines">@@ -346,13 +361,11 @@
</span><span class="cx">                 31012DE018B97B9B0039062F /* OutputGLSLBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OutputGLSLBase.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012DE118B97B9B0039062F /* OutputHLSL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OutputHLSL.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012DE218B97B9B0039062F /* OutputHLSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OutputHLSL.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                31012DE318B97B9B0039062F /* parseConst.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parseConst.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 31012DE418B97B9B0039062F /* ParseContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParseContext.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012DE518B97B9B0039062F /* ParseContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParseContext.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012DE618B97B9B0039062F /* PoolAlloc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PoolAlloc.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012DE718B97B9B0039062F /* PoolAlloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PoolAlloc.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012DE818B97B9B0039062F /* Pragma.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pragma.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                31012DE918B97B9B0039062F /* QualifierAlive.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QualifierAlive.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 31012DEA18B97B9B0039062F /* QualifierAlive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QualifierAlive.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012DED18B97B9B0039062F /* RenameFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenameFunction.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012DEE18B97B9B0039062F /* RewriteElseBlocks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RewriteElseBlocks.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -373,8 +386,6 @@
</span><span class="cx">                 31012DFF18B97B9B0039062F /* TranslatorHLSL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TranslatorHLSL.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012E0018B97B9B0039062F /* TranslatorHLSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TranslatorHLSL.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012E0118B97B9B0039062F /* Types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Types.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                31012E0218B97B9B0039062F /* UnfoldShortCircuit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnfoldShortCircuit.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                31012E0318B97B9B0039062F /* UnfoldShortCircuit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnfoldShortCircuit.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 31012E0418B97B9B0039062F /* UnfoldShortCircuitAST.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnfoldShortCircuitAST.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012E0518B97B9B0039062F /* UnfoldShortCircuitAST.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnfoldShortCircuitAST.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 31012E0818B97B9B0039062F /* util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = util.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -431,8 +442,6 @@
</span><span class="cx">                 5C1DBC181B04375F00235552 /* SeparateDeclarations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SeparateDeclarations.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C1DBC191B04375F00235552 /* SeparateDeclarations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SeparateDeclarations.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C1DBC1A1B04375F00235552 /* ShaderVars.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShaderVars.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                5C1DBC1B1B04375F00235552 /* SimplifyArrayAssignment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimplifyArrayAssignment.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                5C1DBC1C1B04375F00235552 /* SimplifyArrayAssignment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimplifyArrayAssignment.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 5C1DBC1D1B04375F00235552 /* Types.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Types.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C1DBC1E1B04375F00235552 /* ValidateSwitch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ValidateSwitch.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C1DBC1F1B04375F00235552 /* ValidateSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ValidateSwitch.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -483,7 +492,6 @@
</span><span class="cx">                 5C1DBC791B0438D200235552 /* Query.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Query.h; path = src/libANGLE/Query.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C1DBC7A1B0438D200235552 /* queryconversions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = queryconversions.cpp; path = src/libANGLE/queryconversions.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C1DBC7B1B0438D200235552 /* queryconversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = queryconversions.h; path = src/libANGLE/queryconversions.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                5C1DBC7C1B0438D200235552 /* RefCountObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RefCountObject.cpp; path = src/libANGLE/RefCountObject.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 5C1DBC7D1B0438D200235552 /* RefCountObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RefCountObject.h; path = src/libANGLE/RefCountObject.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C1DBC7E1B0438D200235552 /* Renderbuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Renderbuffer.cpp; path = src/libANGLE/Renderbuffer.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C1DBC7F1B0438D200235552 /* Renderbuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Renderbuffer.h; path = src/libANGLE/Renderbuffer.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -515,6 +523,28 @@
</span><span class="cx">                 5C1DBDD01B0438D300235552 /* VertexArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VertexArray.h; path = src/libANGLE/VertexArray.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C1DBDD11B0438D300235552 /* VertexAttribute.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VertexAttribute.cpp; path = src/libANGLE/VertexAttribute.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C1DBDD21B0438D300235552 /* VertexAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VertexAttribute.h; path = src/libANGLE/VertexAttribute.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                5C315CE81CC5B6DA00776697 /* Cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Cache.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CE91CC5B6DA00776697 /* Cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cache.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CEA1CC5B6DA00776697 /* DeferGlobalInitializers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DeferGlobalInitializers.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CEB1CC5B6DA00776697 /* DeferGlobalInitializers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeferGlobalInitializers.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CEC1CC5B6DA00776697 /* ExtensionGLSL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExtensionGLSL.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CED1CC5B6DA00776697 /* ExtensionGLSL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExtensionGLSL.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CEE1CC5B6DA00776697 /* RecordConstantPrecision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RecordConstantPrecision.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CEF1CC5B6DA00776697 /* RecordConstantPrecision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecordConstantPrecision.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CF01CC5B6DA00776697 /* RemoveDynamicIndexing.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoveDynamicIndexing.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CF11CC5B6DA00776697 /* RemoveDynamicIndexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoveDynamicIndexing.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CF21CC5B6DA00776697 /* RemovePow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemovePow.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CF31CC5B6DA00776697 /* RemovePow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemovePow.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CF41CC5B6DA00776697 /* RewriteDoWhile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RewriteDoWhile.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CF51CC5B6DA00776697 /* RewriteDoWhile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RewriteDoWhile.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CF61CC5B6DA00776697 /* SeparateExpressionsReturningArrays.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SeparateExpressionsReturningArrays.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CF71CC5B6DA00776697 /* SeparateExpressionsReturningArrays.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SeparateExpressionsReturningArrays.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CF81CC5B6DA00776697 /* UnfoldShortCircuitToIf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnfoldShortCircuitToIf.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CF91CC5B6DA00776697 /* UnfoldShortCircuitToIf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnfoldShortCircuitToIf.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CFA1CC5B6DA00776697 /* ValidateGlobalInitializer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ValidateGlobalInitializer.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CFB1CC5B6DA00776697 /* ValidateGlobalInitializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ValidateGlobalInitializer.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CFC1CC5B6DA00776697 /* ValidateMaxParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ValidateMaxParameters.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C315CFD1CC5B6DA00776697 /* ValidateMaxParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ValidateMaxParameters.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 5C9FFF4C19102A000025B8FA /* FlagStd140Structs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FlagStd140Structs.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5C9FFF4D19102A000025B8FA /* FlagStd140Structs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlagStd140Structs.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5CC7D44B191024E3000B8C1F /* LoopInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LoopInfo.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -580,6 +610,28 @@
</span><span class="cx">                 31012D9F18B97B9B0039062F /* translator */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><ins>+                                5C315CE81CC5B6DA00776697 /* Cache.cpp */,
+                                5C315CE91CC5B6DA00776697 /* Cache.h */,
+                                5C315CEA1CC5B6DA00776697 /* DeferGlobalInitializers.cpp */,
+                                5C315CEB1CC5B6DA00776697 /* DeferGlobalInitializers.h */,
+                                5C315CEC1CC5B6DA00776697 /* ExtensionGLSL.cpp */,
+                                5C315CED1CC5B6DA00776697 /* ExtensionGLSL.h */,
+                                5C315CEE1CC5B6DA00776697 /* RecordConstantPrecision.cpp */,
+                                5C315CEF1CC5B6DA00776697 /* RecordConstantPrecision.h */,
+                                5C315CF01CC5B6DA00776697 /* RemoveDynamicIndexing.cpp */,
+                                5C315CF11CC5B6DA00776697 /* RemoveDynamicIndexing.h */,
+                                5C315CF21CC5B6DA00776697 /* RemovePow.cpp */,
+                                5C315CF31CC5B6DA00776697 /* RemovePow.h */,
+                                5C315CF41CC5B6DA00776697 /* RewriteDoWhile.cpp */,
+                                5C315CF51CC5B6DA00776697 /* RewriteDoWhile.h */,
+                                5C315CF61CC5B6DA00776697 /* SeparateExpressionsReturningArrays.cpp */,
+                                5C315CF71CC5B6DA00776697 /* SeparateExpressionsReturningArrays.h */,
+                                5C315CF81CC5B6DA00776697 /* UnfoldShortCircuitToIf.cpp */,
+                                5C315CF91CC5B6DA00776697 /* UnfoldShortCircuitToIf.h */,
+                                5C315CFA1CC5B6DA00776697 /* ValidateGlobalInitializer.cpp */,
+                                5C315CFB1CC5B6DA00776697 /* ValidateGlobalInitializer.h */,
+                                5C315CFC1CC5B6DA00776697 /* ValidateMaxParameters.cpp */,
+                                5C315CFD1CC5B6DA00776697 /* ValidateMaxParameters.h */,
</ins><span class="cx">                                 5C1DBBF91B04375E00235552 /* ArrayReturnValueToOutParameter.cpp */,
</span><span class="cx">                                 5C1DBBFA1B04375E00235552 /* ArrayReturnValueToOutParameter.h */,
</span><span class="cx">                                 5C1DBBFB1B04375F00235552 /* ASTMetadataHLSL.cpp */,
</span><span class="lines">@@ -614,8 +666,6 @@
</span><span class="cx">                                 5C1DBC181B04375F00235552 /* SeparateDeclarations.cpp */,
</span><span class="cx">                                 5C1DBC191B04375F00235552 /* SeparateDeclarations.h */,
</span><span class="cx">                                 5C1DBC1A1B04375F00235552 /* ShaderVars.cpp */,
</span><del>-                                5C1DBC1B1B04375F00235552 /* SimplifyArrayAssignment.cpp */,
-                                5C1DBC1C1B04375F00235552 /* SimplifyArrayAssignment.h */,
</del><span class="cx">                                 5C1DBC1D1B04375F00235552 /* Types.cpp */,
</span><span class="cx">                                 5C1DBC1E1B04375F00235552 /* ValidateSwitch.cpp */,
</span><span class="cx">                                 5C1DBC1F1B04375F00235552 /* ValidateSwitch.h */,
</span><span class="lines">@@ -670,13 +720,11 @@
</span><span class="cx">                                 31012DE018B97B9B0039062F /* OutputGLSLBase.h */,
</span><span class="cx">                                 31012DE118B97B9B0039062F /* OutputHLSL.cpp */,
</span><span class="cx">                                 31012DE218B97B9B0039062F /* OutputHLSL.h */,
</span><del>-                                31012DE318B97B9B0039062F /* parseConst.cpp */,
</del><span class="cx">                                 31012DE418B97B9B0039062F /* ParseContext.cpp */,
</span><span class="cx">                                 31012DE518B97B9B0039062F /* ParseContext.h */,
</span><span class="cx">                                 31012DE618B97B9B0039062F /* PoolAlloc.cpp */,
</span><span class="cx">                                 31012DE718B97B9B0039062F /* PoolAlloc.h */,
</span><span class="cx">                                 31012DE818B97B9B0039062F /* Pragma.h */,
</span><del>-                                31012DE918B97B9B0039062F /* QualifierAlive.cpp */,
</del><span class="cx">                                 31012DEA18B97B9B0039062F /* QualifierAlive.h */,
</span><span class="cx">                                 31012DED18B97B9B0039062F /* RenameFunction.h */,
</span><span class="cx">                                 31012DEE18B97B9B0039062F /* RewriteElseBlocks.cpp */,
</span><span class="lines">@@ -693,8 +741,6 @@
</span><span class="cx">                                 31012DFF18B97B9B0039062F /* TranslatorHLSL.cpp */,
</span><span class="cx">                                 31012E0018B97B9B0039062F /* TranslatorHLSL.h */,
</span><span class="cx">                                 31012E0118B97B9B0039062F /* Types.h */,
</span><del>-                                31012E0218B97B9B0039062F /* UnfoldShortCircuit.cpp */,
-                                31012E0318B97B9B0039062F /* UnfoldShortCircuit.h */,
</del><span class="cx">                                 31012E0418B97B9B0039062F /* UnfoldShortCircuitAST.cpp */,
</span><span class="cx">                                 31012E0518B97B9B0039062F /* UnfoldShortCircuitAST.h */,
</span><span class="cx">                                 31012E0818B97B9B0039062F /* util.cpp */,
</span><span class="lines">@@ -795,7 +841,6 @@
</span><span class="cx">                                 5C1DBC791B0438D200235552 /* Query.h */,
</span><span class="cx">                                 5C1DBC7A1B0438D200235552 /* queryconversions.cpp */,
</span><span class="cx">                                 5C1DBC7B1B0438D200235552 /* queryconversions.h */,
</span><del>-                                5C1DBC7C1B0438D200235552 /* RefCountObject.cpp */,
</del><span class="cx">                                 5C1DBC7D1B0438D200235552 /* RefCountObject.h */,
</span><span class="cx">                                 5C1DBC7E1B0438D200235552 /* Renderbuffer.cpp */,
</span><span class="cx">                                 5C1DBC7F1B0438D200235552 /* Renderbuffer.h */,
</span><span class="lines">@@ -989,6 +1034,8 @@
</span><span class="cx">                         isa = PBXHeadersBuildPhase;
</span><span class="cx">                         buildActionMask = 2147483647;
</span><span class="cx">                         files = (
</span><ins>+                                5C315D131CC5B6DA00776697 /* ValidateMaxParameters.h in Headers */,
+                                5C315D071CC5B6DA00776697 /* RemoveDynamicIndexing.h in Headers */,
</ins><span class="cx">                                 31012E3C18B97B9B0039062F /* InitializeParseContext.h in Headers */,
</span><span class="cx">                                 A08C3CDD16D6CB61003F0B83 /* ArrayBoundsClamper.h in Headers */,
</span><span class="cx">                                 5CC7D46F19102621000B8C1F /* debug.h in Headers */,
</span><span class="lines">@@ -999,10 +1046,10 @@
</span><span class="cx">                                 31012E5518B97B9B0039062F /* ParseContext.h in Headers */,
</span><span class="cx">                                 5C1DBDEF1B0438D300235552 /* Fence.h in Headers */,
</span><span class="cx">                                 31012E2C18B97B9B0039062F /* ForLoopUnroll.h in Headers */,
</span><ins>+                                5C315D031CC5B6DA00776697 /* ExtensionGLSL.h in Headers */,
</ins><span class="cx">                                 31012E6D18B97B9B0039062F /* TranslatorGLSL.h in Headers */,
</span><span class="cx">                                 5C1DBC3E1B04375F00235552 /* SeparateArrayInitialization.h in Headers */,
</span><span class="cx">                                 31012E4618B97B9B0039062F /* MMap.h in Headers */,
</span><del>-                                5C1DBC431B04375F00235552 /* SimplifyArrayAssignment.h in Headers */,
</del><span class="cx">                                 5CC7D47319102621000B8C1F /* mathutil.h in Headers */,
</span><span class="cx">                                 31012E6B18B97B9B0039062F /* TranslatorESSL.h in Headers */,
</span><span class="cx">                                 5C1DBE001B0438D300235552 /* Program.h in Headers */,
</span><span class="lines">@@ -1011,6 +1058,7 @@
</span><span class="cx">                                 31012E2018B97B9B0039062F /* DependencyGraphOutput.h in Headers */,
</span><span class="cx">                                 31012E7C18B97B9B0039062F /* VariableInfo.h in Headers */,
</span><span class="cx">                                 5C1DBDDB1B0438D300235552 /* Caps.h in Headers */,
</span><ins>+                                5C315D091CC5B6DA00776697 /* RemovePow.h in Headers */,
</ins><span class="cx">                                 5C1DBE021B0438D300235552 /* Query.h in Headers */,
</span><span class="cx">                                 31012E6118B97B9B0039062F /* SearchSymbol.h in Headers */,
</span><span class="cx">                                 5C1DBF311B0438D300235552 /* Texture.h in Headers */,
</span><span class="lines">@@ -1029,12 +1077,14 @@
</span><span class="cx">                                 5CC7D47119102621000B8C1F /* event_tracer.h in Headers */,
</span><span class="cx">                                 5C1DBDE71B0438D300235552 /* Device.h in Headers */,
</span><span class="cx">                                 5C1DBE061B0438D300235552 /* RefCountObject.h in Headers */,
</span><ins>+                                5C315D051CC5B6DA00776697 /* RecordConstantPrecision.h in Headers */,
</ins><span class="cx">                                 31012E5D18B97B9B0039062F /* RenameFunction.h in Headers */,
</span><span class="cx">                                 5C1DBDFA1B0438D300235552 /* histogram_macros.h in Headers */,
</span><span class="cx">                                 5C1DBDD71B0438D300235552 /* BinaryStream.h in Headers */,
</span><span class="cx">                                 31012E3A18B97B9B0039062F /* InitializeGlobals.h in Headers */,
</span><span class="cx">                                 5C1DBC291B04375F00235552 /* BuiltInFunctionEmulatorGLSL.h in Headers */,
</span><span class="cx">                                 5C1DBBE61B04075B00235552 /* ShaderVars.h in Headers */,
</span><ins>+                                5C315D0B1CC5B6DA00776697 /* RewriteDoWhile.h in Headers */,
</ins><span class="cx">                                 5C1DBC251B04375F00235552 /* blocklayout.h in Headers */,
</span><span class="cx">                                 5C1DBC271B04375F00235552 /* blocklayoutHLSL.h in Headers */,
</span><span class="cx">                                 31012E8018B97B9B0039062F /* VersionGLSL.h in Headers */,
</span><span class="lines">@@ -1043,6 +1093,7 @@
</span><span class="cx">                                 5C1DBDD91B0438D300235552 /* Buffer.h in Headers */,
</span><span class="cx">                                 31012E2718B97B9B0039062F /* Diagnostics.h in Headers */,
</span><span class="cx">                                 5C1DBC361B04375F00235552 /* PruneEmptyDeclarations.h in Headers */,
</span><ins>+                                5C315D011CC5B6DA00776697 /* DeferGlobalInitializers.h in Headers */,
</ins><span class="cx">                                 5C1DBDF61B0438D300235552 /* FramebufferAttachment.h in Headers */,
</span><span class="cx">                                 5CC7D46B19102620000B8C1F /* angleutils.h in Headers */,
</span><span class="cx">                                 31012E3218B97B9B0039062F /* glslang_tab.h in Headers */,
</span><span class="lines">@@ -1055,7 +1106,6 @@
</span><span class="cx">                                 5CC7D458191024E4000B8C1F /* ValidateOutputs.h in Headers */,
</span><span class="cx">                                 31012E7418B97B9B0039062F /* UnfoldShortCircuitAST.h in Headers */,
</span><span class="cx">                                 5C1DBDF41B0438D300235552 /* Framebuffer.h in Headers */,
</span><del>-                                31012E7218B97B9B0039062F /* UnfoldShortCircuit.h in Headers */,
</del><span class="cx">                                 A264F8B316974DED006FAA5A /* ExpressionParser.h in Headers */,
</span><span class="cx">                                 31012E3518B97B9B0039062F /* InfoSink.h in Headers */,
</span><span class="cx">                                 5C1DBF3A1B0438D300235552 /* validationES.h in Headers */,
</span><span class="lines">@@ -1069,6 +1119,7 @@
</span><span class="cx">                                 31012E6718B97B9B0039062F /* RestrictFragmentShaderTiming.h in Headers */,
</span><span class="cx">                                 5CC7D47B19102621000B8C1F /* version.h in Headers */,
</span><span class="cx">                                 5C1DBF281B0438D300235552 /* Sampler.h in Headers */,
</span><ins>+                                5C315D111CC5B6DA00776697 /* ValidateGlobalInitializer.h in Headers */,
</ins><span class="cx">                                 5C1DBF381B0438D300235552 /* validationEGL.h in Headers */,
</span><span class="cx">                                 5C1DBF3C1B0438D300235552 /* validationES2.h in Headers */,
</span><span class="cx">                                 31012E7818B97B9B0039062F /* util.h in Headers */,
</span><span class="lines">@@ -1079,10 +1130,12 @@
</span><span class="cx">                                 A264F8CD169762AA006FAA5A /* khrplatform.h in Headers */,
</span><span class="cx">                                 5C1DBBF71B0436EC00235552 /* tls.h in Headers */,
</span><span class="cx">                                 5C1DBBF51B0436EC00235552 /* platform.h in Headers */,
</span><ins>+                                5C315D0F1CC5B6DA00776697 /* UnfoldShortCircuitToIf.h in Headers */,
</ins><span class="cx">                                 5CC7D47A19102621000B8C1F /* utilities.h in Headers */,
</span><span class="cx">                                 31012E3918B97B9B0039062F /* InitializeDll.h in Headers */,
</span><span class="cx">                                 5C1DBBF21B0436EC00235552 /* MemoryBuffer.h in Headers */,
</span><span class="cx">                                 A264F8B716974DED006FAA5A /* Lexer.h in Headers */,
</span><ins>+                                5C315D0D1CC5B6DA00776697 /* SeparateExpressionsReturningArrays.h in Headers */,
</ins><span class="cx">                                 A264F8B916974DED006FAA5A /* Macro.h in Headers */,
</span><span class="cx">                                 31012E5A18B97B9B0039062F /* QualifierAlive.h in Headers */,
</span><span class="cx">                                 31012E5718B97B9B0039062F /* PoolAlloc.h in Headers */,
</span><span class="lines">@@ -1119,6 +1172,7 @@
</span><span class="cx">                                 31012E7A18B97B9B0039062F /* ValidateLimitations.h in Headers */,
</span><span class="cx">                                 5C1DBC341B04375F00235552 /* Operator.h in Headers */,
</span><span class="cx">                                 5C1DBC401B04375F00235552 /* SeparateDeclarations.h in Headers */,
</span><ins>+                                5C315CFF1CC5B6DA00776697 /* Cache.h in Headers */,
</ins><span class="cx">                                 5C1DBDD61B0438D300235552 /* AttributeMap.h in Headers */,
</span><span class="cx">                                 31012E3318B97B9B0039062F /* HashNames.h in Headers */,
</span><span class="cx">                                 A264F8C216974DED006FAA5A /* Token.h in Headers */,
</span><span class="lines">@@ -1188,14 +1242,17 @@
</span><span class="cx">                                 31012E2618B97B9B0039062F /* Diagnostics.cpp in Sources */,
</span><span class="cx">                                 31012E3D18B97B9B0039062F /* InitializeVariables.cpp in Sources */,
</span><span class="cx">                                 31012E7F18B97B9B0039062F /* VersionGLSL.cpp in Sources */,
</span><ins>+                                5C315D0A1CC5B6DA00776697 /* RewriteDoWhile.cpp in Sources */,
</ins><span class="cx">                                 A08C3CDC16D6CB61003F0B83 /* ArrayBoundsClamper.cpp in Sources */,
</span><span class="cx">                                 5C1DBC451B04375F00235552 /* ValidateSwitch.cpp in Sources */,
</span><span class="cx">                                 5C1DBDF51B0438D300235552 /* FramebufferAttachment.cpp in Sources */,
</span><span class="cx">                                 5C1DBC441B04375F00235552 /* Types.cpp in Sources */,
</span><span class="cx">                                 72309A56183C27DE00370B93 /* Tokenizer.cpp in Sources */,
</span><span class="cx">                                 31012E6C18B97B9B0039062F /* TranslatorGLSL.cpp in Sources */,
</span><ins>+                                5C315D0E1CC5B6DA00776697 /* UnfoldShortCircuitToIf.cpp in Sources */,
</ins><span class="cx">                                 5C1DBF411B0438D300235552 /* VertexAttribute.cpp in Sources */,
</span><span class="cx">                                 A264F8AC16974DED006FAA5A /* DiagnosticsBase.cpp in Sources */,
</span><ins>+                                5C315D101CC5B6DA00776697 /* ValidateGlobalInitializer.cpp in Sources */,
</ins><span class="cx">                                 5C1DBDE41B0438D300235552 /* Data.cpp in Sources */,
</span><span class="cx">                                 5C1DBF291B0438D300235552 /* Shader.cpp in Sources */,
</span><span class="cx">                                 31012E1518B97B9B0039062F /* CodeGen.cpp in Sources */,
</span><span class="lines">@@ -1204,7 +1261,7 @@
</span><span class="cx">                                 5CC7D47219102621000B8C1F /* mathutil.cpp in Sources */,
</span><span class="cx">                                 5C1DBE071B0438D300235552 /* Renderbuffer.cpp in Sources */,
</span><span class="cx">                                 31012E3B18B97B9B0039062F /* InitializeParseContext.cpp in Sources */,
</span><del>-                                5C1DBE051B0438D300235552 /* RefCountObject.cpp in Sources */,
</del><ins>+                                5C315D021CC5B6DA00776697 /* ExtensionGLSL.cpp in Sources */,
</ins><span class="cx">                                 5CC7D47019102621000B8C1F /* event_tracer.cpp in Sources */,
</span><span class="cx">                                 5C1DBF371B0438D300235552 /* validationEGL.cpp in Sources */,
</span><span class="cx">                                 31012E3118B97B9B0039062F /* glslang_tab.cpp in Sources */,
</span><span class="lines">@@ -1220,6 +1277,7 @@
</span><span class="cx">                                 A264F8AE16974DED006FAA5A /* DirectiveHandlerBase.cpp in Sources */,
</span><span class="cx">                                 31012E4D18B97B9B0039062F /* OutputGLSL.cpp in Sources */,
</span><span class="cx">                                 31012E3018B97B9B0039062F /* glslang_lex.cpp in Sources */,
</span><ins>+                                5C315D001CC5B6DA00776697 /* DeferGlobalInitializers.cpp in Sources */,
</ins><span class="cx">                                 5C1DBDE61B0438D300235552 /* Device.cpp in Sources */,
</span><span class="cx">                                 5C1DBDDF1B0438D300235552 /* Config.cpp in Sources */,
</span><span class="cx">                                 5C1DBDEA1B0438D300235552 /* Error.cpp in Sources */,
</span><span class="lines">@@ -1235,11 +1293,10 @@
</span><span class="cx">                                 31012E6018B97B9B0039062F /* SearchSymbol.cpp in Sources */,
</span><span class="cx">                                 72309A58183C27F300370B93 /* ExpressionParser.cpp in Sources */,
</span><span class="cx">                                 31012E2818B97B9B0039062F /* DirectiveHandler.cpp in Sources */,
</span><del>-                                31012E5918B97B9B0039062F /* QualifierAlive.cpp in Sources */,
-                                31012E7118B97B9B0039062F /* UnfoldShortCircuit.cpp in Sources */,
</del><span class="cx">                                 31012E6418B97B9B0039062F /* SymbolTable.cpp in Sources */,
</span><span class="cx">                                 5C1DBF351B0438D300235552 /* Uniform.cpp in Sources */,
</span><span class="cx">                                 5C1DBC261B04375F00235552 /* blocklayoutHLSL.cpp in Sources */,
</span><ins>+                                5C315D081CC5B6DA00776697 /* RemovePow.cpp in Sources */,
</ins><span class="cx">                                 A264F8B416974DED006FAA5A /* Input.cpp in Sources */,
</span><span class="cx">                                 5C1DBC301B04375F00235552 /* IntermNode.cpp in Sources */,
</span><span class="cx">                                 5CC7D47919102621000B8C1F /* utilities.cpp in Sources */,
</span><span class="lines">@@ -1262,7 +1319,6 @@
</span><span class="cx">                                 5C1DBC411B04375F00235552 /* ShaderVars.cpp in Sources */,
</span><span class="cx">                                 5C1DBF331B0438D300235552 /* TransformFeedback.cpp in Sources */,
</span><span class="cx">                                 31012E3418B97B9B0039062F /* InfoSink.cpp in Sources */,
</span><del>-                                31012E5318B97B9B0039062F /* parseConst.cpp in Sources */,
</del><span class="cx">                                 5C1DBC201B04375F00235552 /* ArrayReturnValueToOutParameter.cpp in Sources */,
</span><span class="cx">                                 31012E5618B97B9B0039062F /* PoolAlloc.cpp in Sources */,
</span><span class="cx">                                 31012E6618B97B9B0039062F /* RestrictFragmentShaderTiming.cpp in Sources */,
</span><span class="lines">@@ -1272,12 +1328,15 @@
</span><span class="cx">                                 31012E7718B97B9B0039062F /* util.cpp in Sources */,
</span><span class="cx">                                 5C1DBDE21B0438D300235552 /* Context.cpp in Sources */,
</span><span class="cx">                                 31012E5118B97B9B0039062F /* OutputHLSL.cpp in Sources */,
</span><ins>+                                5C315D0C1CC5B6DA00776697 /* SeparateExpressionsReturningArrays.cpp in Sources */,
</ins><span class="cx">                                 31012E3618B97B9B0039062F /* Initialize.cpp in Sources */,
</span><span class="cx">                                 5C1DBE011B0438D300235552 /* Query.cpp in Sources */,
</span><span class="cx">                                 5C1DBF391B0438D300235552 /* validationES.cpp in Sources */,
</span><span class="cx">                                 5C1DBDFF1B0438D300235552 /* Program.cpp in Sources */,
</span><ins>+                                5C315D041CC5B6DA00776697 /* RecordConstantPrecision.cpp in Sources */,
</ins><span class="cx">                                 31012E7B18B97B9B0039062F /* VariableInfo.cpp in Sources */,
</span><span class="cx">                                 5C1DBF2B1B0438D300235552 /* State.cpp in Sources */,
</span><ins>+                                5C315D061CC5B6DA00776697 /* RemoveDynamicIndexing.cpp in Sources */,
</ins><span class="cx">                                 5C1DBBF61B0436EC00235552 /* tls.cpp in Sources */,
</span><span class="cx">                                 5CC7D452191024E4000B8C1F /* LoopInfo.cpp in Sources */,
</span><span class="cx">                                 5C1DBC3F1B04375F00235552 /* SeparateDeclarations.cpp in Sources */,
</span><span class="lines">@@ -1285,15 +1344,16 @@
</span><span class="cx">                                 31012E7D18B97B9B0039062F /* VariablePacker.cpp in Sources */,
</span><span class="cx">                                 5C1DBDF31B0438D300235552 /* Framebuffer.cpp in Sources */,
</span><span class="cx">                                 31012E1F18B97B9B0039062F /* DependencyGraphOutput.cpp in Sources */,
</span><ins>+                                5C315D121CC5B6DA00776697 /* ValidateMaxParameters.cpp in Sources */,
</ins><span class="cx">                                 5C1DBDD81B0438D300235552 /* Buffer.cpp in Sources */,
</span><span class="cx">                                 5C1DBDD31B0438D300235552 /* angletypes.cpp in Sources */,
</span><span class="cx">                                 5C1DBF251B0438D300235552 /* ResourceManager.cpp in Sources */,
</span><span class="cx">                                 31012E4B18B97B9B0039062F /* OutputESSL.cpp in Sources */,
</span><span class="cx">                                 A264F8BE16974DED006FAA5A /* Preprocessor.cpp in Sources */,
</span><ins>+                                5C315CFE1CC5B6DA00776697 /* Cache.cpp in Sources */,
</ins><span class="cx">                                 5C1DBDEE1B0438D300235552 /* Fence.cpp in Sources */,
</span><span class="cx">                                 5CC7D457191024E4000B8C1F /* ValidateOutputs.cpp in Sources */,
</span><span class="cx">                                 5C1DBBF01B0436EC00235552 /* angleutils.cpp in Sources */,
</span><del>-                                5C1DBC421B04375F00235552 /* SimplifyArrayAssignment.cpp in Sources */,
</del><span class="cx">                                 31012E2B18B97B9B0039062F /* ForLoopUnroll.cpp in Sources */,
</span><span class="cx">                                 5C1DBC3D1B04375F00235552 /* SeparateArrayInitialization.cpp in Sources */,
</span><span class="cx">                                 5C9FFF4E19102A000025B8FA /* FlagStd140Structs.cpp in Sources */,
</span><span class="lines">@@ -1325,6 +1385,10 @@
</span><span class="cx">                         isa = XCBuildConfiguration;
</span><span class="cx">                         baseConfigurationReference = 5D7C59C51208C68B001C873E /* ANGLE.xcconfig */;
</span><span class="cx">                         buildSettings = {
</span><ins>+                                GCC_PREPROCESSOR_DEFINITIONS = (
+                                        ANGLE_ENABLE_OPENGL,
+                                        ANGLE_ENABLE_GLSL,
+                                );
</ins><span class="cx">                         };
</span><span class="cx">                         name = Production;
</span><span class="cx">                 };
</span><span class="lines">@@ -1347,6 +1411,10 @@
</span><span class="cx">                         isa = XCBuildConfiguration;
</span><span class="cx">                         baseConfigurationReference = 5D7C59C51208C68B001C873E /* ANGLE.xcconfig */;
</span><span class="cx">                         buildSettings = {
</span><ins>+                                GCC_PREPROCESSOR_DEFINITIONS = (
+                                        ANGLE_ENABLE_OPENGL,
+                                        ANGLE_ENABLE_GLSL,
+                                );
</ins><span class="cx">                         };
</span><span class="cx">                         name = Debug;
</span><span class="cx">                 };
</span><span class="lines">@@ -1354,6 +1422,10 @@
</span><span class="cx">                         isa = XCBuildConfiguration;
</span><span class="cx">                         baseConfigurationReference = 5D7C59C51208C68B001C873E /* ANGLE.xcconfig */;
</span><span class="cx">                         buildSettings = {
</span><ins>+                                GCC_PREPROCESSOR_DEFINITIONS = (
+                                        ANGLE_ENABLE_OPENGL,
+                                        ANGLE_ENABLE_GLSL,
+                                );
</ins><span class="cx">                         };
</span><span class="cx">                         name = Release;
</span><span class="cx">                 };
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEAUTHORS"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/AUTHORS (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/AUTHORS        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/AUTHORS        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> NVIDIA Corporation
</span><span class="cx"> Opera Software ASA
</span><span class="cx"> The Qt Company Ltd.
</span><ins>+Advanced Micro Devices, Inc.
</ins><span class="cx"> 
</span><span class="cx"> Jacek Caban
</span><span class="cx"> Mark Callow
</span><span class="lines">@@ -41,3 +42,5 @@
</span><span class="cx"> Yuri O'Donnell
</span><span class="cx"> Josh Soref
</span><span class="cx"> Maks Naumov
</span><ins>+Jinyoung Hur
+Sebastian Bergstein
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEBUILDgn"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/BUILD.gn (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/BUILD.gn        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/BUILD.gn        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,25 +1,34 @@
</span><del>-# Copyright 2014 The Chromium Authors. All rights reserved.
</del><ins>+# Copyright 2014-2015 The Chromium Authors. All rights reserved.
</ins><span class="cx"> # Use of this source code is governed by a BSD-style license that can be
</span><span class="cx"> # found in the LICENSE file.
</span><span class="cx"> 
</span><del>-gles_gypi = exec_script(
-  &quot;//build/gypi_to_gn.py&quot;,
-  [ rebase_path(&quot;src/libGLESv2.gypi&quot;) ],
-  &quot;scope&quot;,
-  [ &quot;src/libGLESv2.gypi&quot; ])
</del><ins>+# import the use_x11 variable
+import(&quot;//build/config/ui.gni&quot;)
+import(&quot;//third_party/angle/build/angle_common.gni&quot;)
</ins><span class="cx"> 
</span><del>-compiler_gypi = exec_script(
-  &quot;//build/gypi_to_gn.py&quot;,
-  [ rebase_path(&quot;src/compiler.gypi&quot;) ],
-  &quot;scope&quot;,
-  [ &quot;src/compiler.gypi&quot; ])
</del><ins>+angle_git_is_present = exec_script(&quot;src/commit_id.py&quot;,
+                                   [
+                                     &quot;check&quot;,
+                                     rebase_path(&quot;.&quot;, root_build_dir),
+                                   ],
+                                   &quot;value&quot;)
</ins><span class="cx"> 
</span><ins>+angle_use_commit_id = angle_git_is_present == 1
+
+gles_gypi = exec_script(&quot;//build/gypi_to_gn.py&quot;,
+                        [ rebase_path(&quot;src/libGLESv2.gypi&quot;) ],
+                        &quot;scope&quot;,
+                        [ &quot;src/libGLESv2.gypi&quot; ])
+
+compiler_gypi = exec_script(&quot;//build/gypi_to_gn.py&quot;,
+                            [ rebase_path(&quot;src/compiler.gypi&quot;) ],
+                            &quot;scope&quot;,
+                            [ &quot;src/compiler.gypi&quot; ])
+
</ins><span class="cx"> # This config is exported to dependent targets (and also applied to internal
</span><span class="cx"> # ones).
</span><span class="cx"> config(&quot;external_config&quot;) {
</span><del>-  include_dirs = [
-    &quot;include&quot;,
-  ]
</del><ins>+  include_dirs = [ &quot;include&quot; ]
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> # This config is applied to internal Angle targets (not pushed to dependents).
</span><span class="lines">@@ -30,27 +39,15 @@
</span><span class="cx">   ]
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-angle_enable_d3d9 = false
-angle_enable_d3d11 = false
-angle_enable_gl = false
-
</del><span class="cx"> if (is_win) {
</span><del>-  angle_enable_d3d9 = true
-  angle_enable_d3d11 = true
-  angle_enable_gl = true
-
-  import(&quot;//build/config/win/visual_studio_version.gni&quot;)
</del><span class="cx">   copy(&quot;copy_compiler_dll&quot;) {
</span><del>-    sources = [ &quot;$windows_sdk_path/Redist/D3D/$target_cpu/d3dcompiler_47.dll&quot; ]
-    outputs = [ &quot;$root_build_dir/d3dcompiler_47.dll&quot; ]
</del><ins>+    sources = [
+      &quot;$windows_sdk_path/Redist/D3D/$target_cpu/d3dcompiler_47.dll&quot;,
+    ]
+    outputs = [
+      &quot;$root_out_dir/d3dcompiler_47.dll&quot;,
+    ]
</ins><span class="cx">   }
</span><del>-
-}  # is_win
-
-angle_enable_hlsl = false
-
-if (angle_enable_d3d9 || angle_enable_d3d11) {
-  angle_enable_hlsl = true
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> component(&quot;translator&quot;) {
</span><span class="lines">@@ -61,11 +58,6 @@
</span><span class="cx"> 
</span><span class="cx">   defines = [ &quot;ANGLE_TRANSLATOR_IMPLEMENTATION&quot; ]
</span><span class="cx"> 
</span><del>-  if (angle_enable_hlsl) {
-    sources += rebase_path(compiler_gypi.angle_translator_lib_hlsl_sources, &quot;.&quot;, &quot;src&quot;)
-    defines += [ &quot;ANGLE_ENABLE_HLSL&quot; ]
-  }
-
</del><span class="cx">   configs -= [ &quot;//build/config/compiler:chromium_code&quot; ]
</span><span class="cx">   configs += [
</span><span class="cx">     &quot;:internal_config&quot;,
</span><span class="lines">@@ -87,7 +79,8 @@
</span><span class="cx">     &quot;include/GLES2/gl2ext.h&quot;,
</span><span class="cx">     &quot;include/GLES2/gl2platform.h&quot;,
</span><span class="cx">     &quot;include/GLES3/gl3.h&quot;,
</span><del>-    &quot;include/GLES3/gl3ext.h&quot;,
</del><ins>+    &quot;include/GLES3/gl31.h&quot;,
+    &quot;include/GLES3/gl32.h&quot;,
</ins><span class="cx">     &quot;include/GLES3/gl3platform.h&quot;,
</span><span class="cx">     &quot;include/GLSLANG/ShaderLang.h&quot;,
</span><span class="cx">     &quot;include/KHR/khrplatform.h&quot;,
</span><span class="lines">@@ -108,20 +101,45 @@
</span><span class="cx">   defines = [ &quot;ANGLE_TRANSLATOR_STATIC&quot; ]
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+config(&quot;debug_annotations_config&quot;) {
+  if (is_debug) {
+    defines = [ &quot;ANGLE_ENABLE_DEBUG_ANNOTATIONS&quot; ]
+  }
+}
+
</ins><span class="cx"> static_library(&quot;angle_common&quot;) {
</span><span class="cx">   sources = rebase_path(gles_gypi.libangle_common_sources, &quot;.&quot;, &quot;src&quot;)
</span><ins>+
</ins><span class="cx">   configs -= [ &quot;//build/config/compiler:chromium_code&quot; ]
</span><span class="cx">   configs += [
</span><span class="cx">     &quot;:internal_config&quot;,
</span><ins>+    &quot;:debug_annotations_config&quot;,
+    &quot;//build/config/compiler:no_chromium_code&quot;,
</ins><span class="cx">   ]
</span><ins>+
+  public_deps = [ &quot;:commit_id&quot; ]
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static_library(&quot;translator_lib&quot;) {
</span><span class="cx">   sources = rebase_path(compiler_gypi.angle_translator_lib_sources, &quot;.&quot;, &quot;src&quot;)
</span><ins>+  defines = []
</ins><span class="cx"> 
</span><ins>+  if (angle_enable_essl) {
+    sources +=
+        rebase_path(compiler_gypi.angle_translator_lib_essl_sources, &quot;.&quot;, &quot;src&quot;)
+    defines += [ &quot;ANGLE_ENABLE_ESSL&quot; ]
+  }
+
+  if (angle_enable_glsl) {
+    sources +=
+        rebase_path(compiler_gypi.angle_translator_lib_glsl_sources, &quot;.&quot;, &quot;src&quot;)
+    defines += [ &quot;ANGLE_ENABLE_GLSL&quot; ]
+  }
+
</ins><span class="cx">   if (angle_enable_hlsl) {
</span><del>-    sources += rebase_path(compiler_gypi.angle_translator_lib_hlsl_sources, &quot;.&quot;, &quot;src&quot;)
-    defines = [ &quot;ANGLE_ENABLE_HLSL&quot; ]
</del><ins>+    sources +=
+        rebase_path(compiler_gypi.angle_translator_lib_hlsl_sources, &quot;.&quot;, &quot;src&quot;)
+    defines += [ &quot;ANGLE_ENABLE_HLSL&quot; ]
</ins><span class="cx">   }
</span><span class="cx">   configs -= [ &quot;//build/config/compiler:chromium_code&quot; ]
</span><span class="cx">   configs += [
</span><span class="lines">@@ -167,19 +185,32 @@
</span><span class="cx">   include_dirs = [ &quot;$root_gen_dir/angle&quot; ]
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-action(&quot;commit_id&quot;) {
-  script = &quot;src/commit_id.py&quot;
</del><ins>+commit_id_output_file = &quot;$root_gen_dir/angle/id/commit.h&quot;
+if (angle_use_commit_id) {
+  action(&quot;commit_id&quot;) {
+    script = &quot;src/commit_id.py&quot;
+    outputs = [
+      commit_id_output_file,
+    ]
</ins><span class="cx"> 
</span><del>-  output_file = &quot;$root_gen_dir/angle/id/commit.h&quot;
-  outputs = [ output_file ]
</del><ins>+    args = [
+      &quot;gen&quot;,
+      rebase_path(&quot;.&quot;, root_build_dir),
+      rebase_path(commit_id_output_file, root_build_dir),
+    ]
</ins><span class="cx"> 
</span><del>-  args = [
-    &quot;gen&quot;,
-    rebase_path(&quot;.&quot;, root_build_dir),
-    rebase_path(output_file, root_build_dir),
-  ]
-
-  public_configs = [ &quot;:commit_id_config&quot; ]
</del><ins>+    public_configs = [ &quot;:commit_id_config&quot; ]
+  }
+} else {
+  copy(&quot;commit_id&quot;) {
+    sources = [
+      &quot;src/commit.h&quot;,
+    ]
+    outputs = [
+      commit_id_output_file,
+    ]
+    public_configs = [ &quot;:commit_id_config&quot; ]
+  }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> config(&quot;libANGLE_config&quot;) {
</span><span class="lines">@@ -194,12 +225,26 @@
</span><span class="cx">   if (angle_enable_gl) {
</span><span class="cx">     defines += [ &quot;ANGLE_ENABLE_OPENGL&quot; ]
</span><span class="cx">   }
</span><ins>+  if (use_x11) {
+    defines += [ &quot;ANGLE_USE_X11&quot; ]
+  }
</ins><span class="cx">   defines += [
</span><del>-    &quot;GL_APICALL=&quot;,
-    &quot;GL_GLEXT_PROTOTYPES=&quot;,
-    &quot;EGLAPI=&quot;,
</del><ins>+    &quot;GL_GLEXT_PROTOTYPES&quot;,
+    &quot;EGL_EGLEXT_PROTOTYPES&quot;,
</ins><span class="cx">   ]
</span><ins>+
</ins><span class="cx">   if (is_win) {
</span><ins>+    defines += [
+      &quot;GL_APICALL=&quot;,
+      &quot;EGLAPI=&quot;,
+    ]
+  } else {
+    defines += [
+      &quot;GL_APICALL=__attribute__((visibility(\&quot;default\&quot;)))&quot;,
+      &quot;EGLAPI=__attribute__((visibility(\&quot;default\&quot;)))&quot;,
+    ]
+  }
+  if (is_win) {
</ins><span class="cx">     cflags += [ &quot;/wd4530&quot; ]  # C++ exception handler used, but unwind semantics are not enabled.
</span><span class="cx">   }
</span><span class="cx"> }
</span><span class="lines">@@ -209,18 +254,20 @@
</span><span class="cx"> 
</span><span class="cx">   include_dirs = []
</span><span class="cx">   libs = []
</span><del>-  defines = [
-    &quot;LIBANGLE_IMPLEMENTATION&quot;,
</del><ins>+  defines = [ &quot;LIBANGLE_IMPLEMENTATION&quot; ]
+
+  deps = [
+    &quot;:angle_common&quot;,
+    &quot;:commit_id&quot;,
+    &quot;:includes&quot;,
+    &quot;:translator_static&quot;,
</ins><span class="cx">   ]
</span><span class="cx"> 
</span><span class="cx">   # Shared D3D sources.
</span><span class="cx">   if (angle_enable_d3d9 || angle_enable_d3d11) {
</span><span class="cx">     sources += rebase_path(gles_gypi.libangle_d3d_shared_sources, &quot;.&quot;, &quot;src&quot;)
</span><span class="cx"> 
</span><del>-    defines += [
-      &quot;ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ &quot; +
-        &quot;\&quot;d3dcompiler_47.dll\&quot;, \&quot;d3dcompiler_46.dll\&quot;, \&quot;d3dcompiler_43.dll\&quot; }&quot;,
-    ]
</del><ins>+    defines += [ &quot;ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ &quot; + &quot;\&quot;d3dcompiler_47.dll\&quot;, \&quot;d3dcompiler_46.dll\&quot;, \&quot;d3dcompiler_43.dll\&quot; }&quot; ]
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   if (angle_enable_d3d9) {
</span><span class="lines">@@ -241,30 +288,32 @@
</span><span class="cx">     if (is_win) {
</span><span class="cx">       sources += rebase_path(gles_gypi.libangle_gl_wgl_sources, &quot;.&quot;, &quot;src&quot;)
</span><span class="cx">     }
</span><ins>+    if (use_x11) {
+      sources += rebase_path(gles_gypi.libangle_gl_glx_sources, &quot;.&quot;, &quot;src&quot;)
+      deps += [
+        &quot;src/third_party/libXNVCtrl:libXNVCtrl&quot;
+      ]
+      libs += [
+        &quot;X11&quot;,
+        &quot;Xi&quot;,
+        &quot;Xext&quot;,
+      ]
+    }
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   if (is_debug) {
</span><del>-    defines += [
-      &quot;ANGLE_GENERATE_SHADER_DEBUG_INFO&quot;,
-      &quot;ANGLE_ENABLE_DEBUG_ANNOTATIONS&quot;,
-    ]
</del><ins>+    defines += [ &quot;ANGLE_GENERATE_SHADER_DEBUG_INFO&quot; ]
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   configs -= [ &quot;//build/config/compiler:chromium_code&quot; ]
</span><span class="cx">   configs += [
</span><span class="cx">     &quot;:commit_id_config&quot;,
</span><ins>+    &quot;:debug_annotations_config&quot;,
</ins><span class="cx">     &quot;:libANGLE_config&quot;,
</span><span class="cx">     &quot;:internal_config&quot;,
</span><span class="cx">     &quot;//build/config/compiler:no_chromium_code&quot;,
</span><span class="cx">   ]
</span><span class="cx"> 
</span><del>-  deps = [
-    &quot;:commit_id&quot;,
-    &quot;:includes&quot;,
-    &quot;:translator_static&quot;,
-    &quot;:angle_common&quot;,
-  ]
-
</del><span class="cx">   if (is_win) {
</span><span class="cx">     deps += [ &quot;:copy_compiler_dll&quot; ]
</span><span class="cx">   }
</span><span class="lines">@@ -274,21 +323,20 @@
</span><span class="cx">   sources = rebase_path(gles_gypi.libglesv2_sources, &quot;.&quot;, &quot;src&quot;)
</span><span class="cx"> 
</span><span class="cx">   if (is_win) {
</span><del>-    ldflags = [ &quot;/DEF:&quot; +
-                rebase_path(&quot;src/libGLESv2/libGLESv2.def&quot;, root_build_dir) ]
</del><ins>+    ldflags =
+        [ &quot;/DEF:&quot; + rebase_path(&quot;src/libGLESv2/libGLESv2.def&quot;, root_build_dir) ]
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   configs -= [ &quot;//build/config/compiler:chromium_code&quot; ]
</span><span class="cx">   configs += [
</span><span class="cx">     &quot;:internal_config&quot;,
</span><span class="cx">     &quot;:commit_id_config&quot;,
</span><ins>+    &quot;:debug_annotations_config&quot;,
</ins><span class="cx">     &quot;:libANGLE_config&quot;,
</span><span class="cx">     &quot;//build/config/compiler:no_chromium_code&quot;,
</span><span class="cx">   ]
</span><span class="cx"> 
</span><del>-  defines = [
-    &quot;LIBGLESV2_IMPLEMENTATION&quot;,
-  ]
</del><ins>+  defines = [ &quot;LIBGLESV2_IMPLEMENTATION&quot; ]
</ins><span class="cx"> 
</span><span class="cx">   deps = [
</span><span class="cx">     &quot;:includes&quot;,
</span><span class="lines">@@ -300,24 +348,73 @@
</span><span class="cx">   sources = rebase_path(gles_gypi.libegl_sources, &quot;.&quot;, &quot;src&quot;)
</span><span class="cx"> 
</span><span class="cx">   if (is_win) {
</span><del>-    ldflags = [ &quot;/DEF:&quot; +
-                rebase_path(&quot;src/libEGL/libEGL.def&quot;, root_build_dir) ]
</del><ins>+    ldflags = [ &quot;/DEF:&quot; + rebase_path(&quot;src/libEGL/libEGL.def&quot;, root_build_dir) ]
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">   configs -= [ &quot;//build/config/compiler:chromium_code&quot; ]
</span><span class="cx">   configs += [
</span><span class="cx">     &quot;:internal_config&quot;,
</span><span class="cx">     &quot;:commit_id_config&quot;,
</span><ins>+    &quot;:debug_annotations_config&quot;,
</ins><span class="cx">     &quot;:libANGLE_config&quot;,
</span><span class="cx">     &quot;//build/config/compiler:no_chromium_code&quot;,
</span><span class="cx">   ]
</span><span class="cx"> 
</span><ins>+  defines = [ &quot;LIBEGL_IMPLEMENTATION&quot; ]
+
+  deps = [
+    &quot;:includes&quot;,
+    &quot;:libGLESv2&quot;,
+  ]
+}
+
+util_gypi = exec_script(&quot;//build/gypi_to_gn.py&quot;,
+                        [ rebase_path(&quot;util/util.gyp&quot;) ],
+                        &quot;scope&quot;,
+                        [ &quot;util/util.gyp&quot; ])
+
+config(&quot;angle_util_config&quot;) {
+  include_dirs = [ &quot;util&quot; ]
+  if (is_linux) {
+    libs = [ &quot;X11&quot; ]
+  }
+}
+
+static_library(&quot;angle_util&quot;) {
+  sources = rebase_path(util_gypi.util_sources, &quot;.&quot;, &quot;util&quot;)
+
+  if (is_win) {
+    sources += rebase_path(util_gypi.util_win32_sources, &quot;.&quot;, &quot;util&quot;)
+  }
+
+  if (is_linux) {
+    sources += rebase_path(util_gypi.util_linux_sources, &quot;.&quot;, &quot;util&quot;)
+    libs = [ &quot;rt&quot; ]
+  }
+
+  if (is_mac) {
+    sources += rebase_path(util_gypi.util_osx_sources, &quot;.&quot;, &quot;util&quot;)
+  }
+
+  if (use_x11) {
+    sources += rebase_path(util_gypi.util_x11_sources, &quot;.&quot;, &quot;util&quot;)
+  }
+
</ins><span class="cx">   defines = [
</span><del>-    &quot;LIBEGL_IMPLEMENTATION&quot;,
</del><ins>+    &quot;GL_GLEXT_PROTOTYPES&quot;,
+    &quot;EGL_EGLEXT_PROTOTYPES&quot;,
</ins><span class="cx">   ]
</span><span class="cx"> 
</span><ins>+  configs += [ &quot;:debug_annotations_config&quot; ]
+
+  public_configs = [
+    &quot;:angle_util_config&quot;,
+    &quot;:internal_config&quot;,
+  ]
+
</ins><span class="cx">   deps = [
</span><del>-    &quot;:includes&quot;,
</del><ins>+    &quot;:angle_common&quot;,
+    &quot;:libEGL&quot;,
</ins><span class="cx">     &quot;:libGLESv2&quot;,
</span><span class="cx">   ]
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLECMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/CMakeLists.txt (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/CMakeLists.txt        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/CMakeLists.txt        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -74,7 +74,6 @@
</span><span class="cx">     src/compiler/translator/SearchSymbol.cpp
</span><span class="cx">     src/compiler/translator/TranslatorESSL.cpp
</span><span class="cx">     src/compiler/translator/TranslatorGLSL.cpp
</span><del>-    src/compiler/translator/UnfoldShortCircuit.cpp
</del><span class="cx">     src/compiler/translator/VersionGLSL.cpp
</span><span class="cx">     src/compiler/translator/ASTMetadataHLSL.cpp
</span><span class="cx">     src/compiler/translator/blocklayoutHLSL.cpp
</span><span class="lines">@@ -89,9 +88,11 @@
</span><span class="cx">     src/compiler/translator/ArrayReturnValueToOutParameter.cpp
</span><span class="cx">     src/compiler/translator/blocklayout.cpp
</span><span class="cx">     src/compiler/translator/BuiltInFunctionEmulator.cpp
</span><ins>+    src/compiler/translator/Cache.cpp
</ins><span class="cx">     src/compiler/translator/CallDAG.cpp
</span><span class="cx">     src/compiler/translator/CodeGen.cpp
</span><span class="cx">     src/compiler/translator/Compiler.cpp
</span><ins>+    src/compiler/translator/DeferGlobalInitializers.cpp
</ins><span class="cx">     src/compiler/translator/Diagnostics.cpp
</span><span class="cx">     src/compiler/translator/DirectiveHandler.cpp
</span><span class="cx">     src/compiler/translator/EmulatePrecision.cpp
</span><span class="lines">@@ -108,27 +109,31 @@
</span><span class="cx">     src/compiler/translator/IntermTraverse.cpp
</span><span class="cx">     src/compiler/translator/LoopInfo.cpp
</span><span class="cx">     src/compiler/translator/Operator.cpp
</span><del>-    src/compiler/translator/parseConst.cpp
</del><span class="cx">     src/compiler/translator/ParseContext.cpp
</span><span class="cx">     src/compiler/translator/PoolAlloc.cpp
</span><span class="cx">     src/compiler/translator/PruneEmptyDeclarations.cpp
</span><del>-    src/compiler/translator/QualifierAlive.cpp
</del><span class="cx">     src/compiler/translator/RegenerateStructNames.cpp
</span><ins>+    src/compiler/translator/RemoveDynamicIndexing.cpp
+    src/compiler/translator/RemovePow.cpp
</ins><span class="cx">     src/compiler/translator/RemoveSwitchFallThrough.cpp
</span><ins>+    src/compiler/translator/RewriteDoWhile.cpp
</ins><span class="cx">     src/compiler/translator/RewriteElseBlocks.cpp
</span><span class="cx">     src/compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp
</span><span class="cx">     src/compiler/translator/SearchSymbol.cpp
</span><span class="cx">     src/compiler/translator/SeparateArrayInitialization.cpp
</span><span class="cx">     src/compiler/translator/SeparateDeclarations.cpp
</span><ins>+    src/compiler/translator/SeparateExpressionsReturningArrays.cpp
</ins><span class="cx">     src/compiler/translator/ShaderLang.cpp
</span><span class="cx">     src/compiler/translator/ShaderVars.cpp
</span><del>-    src/compiler/translator/SimplifyArrayAssignment.cpp
</del><span class="cx">     src/compiler/translator/SymbolTable.cpp
</span><span class="cx">     src/compiler/translator/Types.cpp
</span><span class="cx">     src/compiler/translator/UnfoldShortCircuit.cpp
</span><span class="cx">     src/compiler/translator/UnfoldShortCircuitAST.cpp
</span><ins>+    src/compiler/translator/UnfoldShortCircuitToIf.cpp
</ins><span class="cx">     src/compiler/translator/util.cpp
</span><ins>+    src/compiler/translator/ValidateGlobalInitializer.cpp
</ins><span class="cx">     src/compiler/translator/ValidateLimitations.cpp
</span><ins>+    src/compiler/translator/ValidateMaxParameters.cpp
</ins><span class="cx">     src/compiler/translator/ValidateOutputs.cpp
</span><span class="cx">     src/compiler/translator/ValidateSwitch.cpp
</span><span class="cx">     src/compiler/translator/VariableInfo.cpp
</span><span class="lines">@@ -150,6 +155,7 @@
</span><span class="cx">     src/libANGLE/Config.cpp
</span><span class="cx">     src/libANGLE/Context.cpp
</span><span class="cx">     src/libANGLE/Data.cpp
</span><ins>+    src/libANGLE/Debug.cpp
</ins><span class="cx">     src/libANGLE/Device.cpp
</span><span class="cx">     src/libANGLE/Display.cpp
</span><span class="cx">     src/libANGLE/Error.cpp
</span><span class="lines">@@ -159,6 +165,8 @@
</span><span class="cx">     src/libANGLE/Framebuffer.cpp
</span><span class="cx">     src/libANGLE/FramebufferAttachment.cpp
</span><span class="cx">     src/libANGLE/HandleAllocator.cpp
</span><ins>+    src/libANGLE/IndexRangeCache.cpp
+    src/libANGLE/Image.cpp
</ins><span class="cx">     src/libANGLE/ImageIndex.cpp
</span><span class="cx">     src/libANGLE/Platform.cpp
</span><span class="cx">     src/libANGLE/Program.cpp
</span><span class="lines">@@ -166,8 +174,10 @@
</span><span class="cx">     src/libANGLE/queryconversions.cpp
</span><span class="cx">     src/libANGLE/RefCountObject.cpp
</span><span class="cx">     src/libANGLE/Renderbuffer.cpp
</span><ins>+    src/libANGLE/Stream.cpp
</ins><span class="cx">     src/libANGLE/renderer/d3d/BufferD3D.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/CompilerD3D.cpp
</span><ins>+    src/libANGLE/renderer/d3d/EGLImageD3D.cpp
</ins><span class="cx">     src/libANGLE/renderer/d3d/copyimage.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d11/Blit11.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
</span><span class="lines">@@ -185,11 +195,18 @@
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp
</span><ins>+    src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
+    src/libANGLE/renderer/d3d/d3d11/Stream11.cpp
</ins><span class="cx">     src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d11/Trim11.cpp
</span><ins>+    src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
</ins><span class="cx">     src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp
</span><ins>+    src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp
+    src/libANGLE/renderer/d3d/d3d11/loadimage_etc.cpp
+    src/libANGLE/renderer/d3d/d3d11/load_functions_table_autogen.cpp
+    src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp
</ins><span class="cx">     src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d9/Blit9.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp
</span><span class="lines">@@ -204,6 +221,7 @@
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp
</span><ins>+    src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp
</ins><span class="cx">     src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp
</span><span class="lines">@@ -227,15 +245,12 @@
</span><span class="cx">     src/libANGLE/renderer/d3d/ShaderExecutableD3D.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/SurfaceD3D.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/TextureD3D.cpp
</span><del>-    src/libANGLE/renderer/d3d/TextureStorage.cpp
</del><span class="cx">     src/libANGLE/renderer/d3d/TransformFeedbackD3D.cpp
</span><ins>+    src/libANGLE/renderer/d3d/VaryingPacking.cpp
</ins><span class="cx">     src/libANGLE/renderer/d3d/VertexBuffer.cpp
</span><span class="cx">     src/libANGLE/renderer/d3d/VertexDataManager.cpp
</span><span class="cx">     src/libANGLE/renderer/DeviceImpl.cpp
</span><span class="cx">     src/libANGLE/renderer/DisplayImpl.cpp
</span><del>-    src/libANGLE/renderer/IndexRangeCache.cpp
-    src/libANGLE/renderer/ProgramImpl.cpp
-    src/libANGLE/renderer/RenderbufferImpl.cpp
</del><span class="cx">     src/libANGLE/renderer/Renderer.cpp
</span><span class="cx">     src/libANGLE/renderer/SurfaceImpl.cpp
</span><span class="cx">     src/libANGLE/ResourceManager.cpp
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLECONTRIBUTORS"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/CONTRIBUTORS (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/CONTRIBUTORS        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/CONTRIBUTORS        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,104 +1,111 @@
</span><del>-# This is the official list of people who can contribute
-# (and who have contributed) code to the ANGLE project
-# repository.
-# The AUTHORS file lists the copyright holders; this file
-# lists people.  For example, Google employees are listed here
-# but not in AUTHORS, because Google holds the copyright.
-#
-
-TransGaming Inc.
- Nicolas Capens
- Daniel Koch
- Geoff Lang
- Andrew Lewycky
- Jamie Madill
- Gavriel State
- Shannon Woods
-
-Google Inc.
- Brent Austin
- Michael Bai
- John Bauman
- Peter Beverloo
- Steve Block
- Rachel Blum
- Eric Boren
- Henry Bridge
- Nat Duca
- Peter Kasting
- Vangelis Kokkevis
- Zhenyao Mo
- Daniel Nicoara
- Alastair Patrick
- Alok Priyadarshi
- Kenneth Russell
- Brian Salomon
- Gregg Tavares
- Jeff Timanus
- Ben Vanik
- Adrienne Walker
- thestig@chromium.org
- Justin Schuh
- Scott Graham
- Corentin Wallez
-
-Adobe Systems Inc.
- Alexandru Chiculita
- Steve Minns
- Max Vujovic
-
-Autodesk, Inc.
- Ranger Harke
-
-Cloud Party, Inc.
- Conor Dickinson
-
-The Qt Company Ltd.
- Andrew Knight
-
-Imagination Technologies Ltd.
- Gregoire Payen de La Garanderie
-
-Intel Corporation
- Jin Yang
- Andy Chen
- Josh Triplett
- Sudarsana Nagineni
-
-Klarälvdalens Datakonsult AB
- Milian Wolff
-
-Mozilla Corp.
- Ehsan Akhgari
- Jeff Gilbert
- Mike Hommey
- Benoit Jacob
- Makoto Kato
- Vladimir Vukicevic
-
-Turbulenz
- Michael Braithwaite
-
-Ulrik Persson (ddefrostt)
-Mark Banner (standard8mbp)
-David Kilzer
-Jacek Caban
-Tibor den Ouden
-Régis Fénéon
-
-Microsoft Corporation
- Cooper Partin
- Austin Kinross
- Minmin Gong
-
-Microsoft Open Technologies, Inc.
- Cooper Partin
- Austin Kinross
-
-NVIDIA Corporation
- Olli Etuaho
- Arun Patole
- Qingqing Deng
-
-Opera Software ASA
- Daniel Bratell
</del><ins>+# This is the official list of people who can contribute
+# (and who have contributed) code to the ANGLE project
+# repository.
+# The AUTHORS file lists the copyright holders; this file
+# lists people.  For example, Google employees are listed here
+# but not in AUTHORS, because Google holds the copyright.
+#
+
+TransGaming Inc.
+ Nicolas Capens
+ Daniel Koch
+ Geoff Lang
+ Andrew Lewycky
+ Jamie Madill
+ Gavriel State
+ Shannon Woods
+
+Google Inc.
+ Brent Austin
+ Michael Bai
+ John Bauman
+ Peter Beverloo
+ Steve Block
+ Rachel Blum
+ Eric Boren
+ Henry Bridge
+ Nat Duca
+ Peter Kasting
+ Vangelis Kokkevis
+ Zhenyao Mo
+ Daniel Nicoara
+ Alastair Patrick
+ Alok Priyadarshi
+ Kenneth Russell
+ Brian Salomon
+ Gregg Tavares
+ Jeff Timanus
+ Ben Vanik
+ Adrienne Walker
+ thestig@chromium.org
+ Justin Schuh
+ Scott Graham
+ Corentin Wallez
+
+Adobe Systems Inc.
+ Alexandru Chiculita
+ Steve Minns
+ Max Vujovic
+
+Autodesk, Inc.
+ Ranger Harke
+
+Cloud Party, Inc.
+ Conor Dickinson
+
+The Qt Company Ltd.
+ Andrew Knight
+
+Imagination Technologies Ltd.
+ Gregoire Payen de La Garanderie
+
+Intel Corporation
+ Jin Yang
+ Andy Chen
+ Josh Triplett
+ Sudarsana Nagineni
+
+Klarälvdalens Datakonsult AB
+ Milian Wolff
+
+Mozilla Corp.
+ Ehsan Akhgari
+ Jeff Gilbert
+ Mike Hommey
+ Benoit Jacob
+ Makoto Kato
+ Vladimir Vukicevic
+
+Turbulenz
+ Michael Braithwaite
+
+Ulrik Persson (ddefrostt)
+Mark Banner (standard8mbp)
+David Kilzer
+Jacek Caban
+Tibor den Ouden
+Régis Fénéon
+Sebastian Bergstein
+
+Microsoft Corporation
+ Cooper Partin
+ Austin Kinross
+ Minmin Gong
+ Shawn Hargreaves
+
+Microsoft Open Technologies, Inc.
+ Cooper Partin
+ Austin Kinross
+
+NVIDIA Corporation
+ Olli Etuaho
+ Arun Patole
+ Qingqing Deng
+ Kimmo Kinnunen
+
+Opera Software ASA
+ Daniel Bratell
+ Tomasz Moniuszko
+
+Advanced Micro Devices, Inc.
+ Russ Lind
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/ChangeLog (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/ChangeLog        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/ChangeLog        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2016-04-19  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Update ANGLE
+        https://bugs.webkit.org/show_bug.cgi?id=156755
+
+        Reviewed by Dean Jackson.
+
+        Huge list of changed files omitted.
+
</ins><span class="cx"> 2016-04-12  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove failing assertion in ANGLE
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEDEPS"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/DEPS (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/DEPS        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/DEPS        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,27 +1,106 @@
</span><ins>+vars = {
+  'chromium_git': 'https://chromium.googlesource.com',
+}
+
</ins><span class="cx"> deps = {
</span><span class="cx">   &quot;third_party/gyp&quot;:
</span><del>-      &quot;http://gyp.googlecode.com/svn/trunk@1987&quot;,
</del><ins>+      Var('chromium_git') + &quot;/external/gyp@81c2e5ff92af29bab61c982808076ddce3d200a2&quot;,
</ins><span class="cx"> 
</span><span class="cx">   # TODO(kbr): figure out how to better stay in sync with Chromium's
</span><span class="cx">   # versions of googletest and googlemock.
</span><span class="cx">   &quot;src/tests/third_party/googletest&quot;:
</span><del>-      &quot;http://googletest.googlecode.com/svn/trunk@629&quot;,
</del><ins>+      Var('chromium_git') + &quot;/external/googletest.git@9855a87157778d39b95eccfb201a9dc90f6d61c6&quot;,
</ins><span class="cx"> 
</span><span class="cx">   &quot;src/tests/third_party/googlemock&quot;:
</span><del>-      &quot;http://googlemock.googlecode.com/svn/trunk@410&quot;,
</del><ins>+      Var('chromium_git') + &quot;/external/googlemock.git@b2cb211e49d872101d991201362d7b97d7d69910&quot;,
</ins><span class="cx"> 
</span><del>-  &quot;src/tests/third_party/deqp&quot;:
-      &quot;https://android.googlesource.com/platform/external/deqp@c7661bcd3bcec04b1abf6c3b290c4150db565604&quot;,
</del><ins>+  # Cherry is a dEQP management GUI written in Go. We use it for viewing test results.
+  &quot;third_party/cherry&quot;:
+      &quot;https://android.googlesource.com/platform/external/cherry@af6c09fe05115f0cca61ae23ee871bda27cf1ff5&quot;,
</ins><span class="cx"> 
</span><del>-  &quot;src/tests/third_party/libpng&quot;:
</del><ins>+  &quot;third_party/deqp/src&quot;:
+      &quot;https://android.googlesource.com/platform/external/deqp@cc0ded6c77267bbb14d21aac358fc5d9690c07f8&quot;,
+
+  &quot;third_party/libpng&quot;:
</ins><span class="cx">       &quot;https://android.googlesource.com/platform/external/libpng@094e181e79a3d6c23fd005679025058b7df1ad6c&quot;,
</span><span class="cx"> 
</span><del>-  &quot;src/tests/third_party/zlib&quot;:
-      &quot;https://chromium.googlesource.com/chromium/src/third_party/zlib@afd8c4593c010c045902f6c0501718f1823064a3&quot;,
</del><ins>+  &quot;third_party/zlib&quot;:
+      Var('chromium_git') + &quot;/chromium/src/third_party/zlib@afd8c4593c010c045902f6c0501718f1823064a3&quot;,
+
+  &quot;buildtools&quot;:
+      Var('chromium_git') + '/chromium/buildtools.git@125d157607de4d7c95bf8b02dd580aae17962f19',
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> hooks = [
</span><ins>+  # Pull clang-format binaries using checked-in hashes.
</ins><span class="cx">   {
</span><ins>+    'name': 'clang_format_win',
+    'pattern': '.',
+    'action': [ 'download_from_google_storage',
+                '--no_resume',
+                '--platform=win32',
+                '--no_auth',
+                '--bucket', 'chromium-clang-format',
+                '-s', 'buildtools/win/clang-format.exe.sha1',
+    ],
+  },
+  {
+    'name': 'clang_format_mac',
+    'pattern': '.',
+    'action': [ 'download_from_google_storage',
+                '--no_resume',
+                '--platform=darwin',
+                '--no_auth',
+                '--bucket', 'chromium-clang-format',
+                '-s', 'buildtools/mac/clang-format.sha1',
+    ],
+  },
+  {
+    'name': 'clang_format_linux',
+    'pattern': '.',
+    'action': [ 'download_from_google_storage',
+                '--no_resume',
+                '--platform=linux*',
+                '--no_auth',
+                '--bucket', 'chromium-clang-format',
+                '-s', 'buildtools/linux64/clang-format.sha1',
+    ],
+  },
+  # Pull GN binaries using checked-in hashes.
+  {
+    'name': 'gn_win',
+    'pattern': '.',
+    'action': [ 'download_from_google_storage',
+                '--no_resume',
+                '--platform=win32',
+                '--no_auth',
+                '--bucket', 'chromium-gn',
+                '-s', 'buildtools/win/gn.exe.sha1',
+    ],
+  },
+  {
+    'name': 'gn_mac',
+    'pattern': '.',
+    'action': [ 'download_from_google_storage',
+                '--no_resume',
+                '--platform=darwin',
+                '--no_auth',
+                '--bucket', 'chromium-gn',
+                '-s', 'buildtools/mac/gn.sha1',
+    ],
+  },
+  {
+    'name': 'gn_linux64',
+    'pattern': '.',
+    'action': [ 'download_from_google_storage',
+                '--no_resume',
+                '--platform=linux*',
+                '--no_auth',
+                '--bucket', 'chromium-gn',
+                '-s', 'buildtools/linux64/gn.sha1',
+    ],
+  },
+  {
</ins><span class="cx">     # A change to a .gyp, .gypi, or to GYP itself should run the generator.
</span><span class="cx">     &quot;pattern&quot;: &quot;.&quot;,
</span><span class="cx">     &quot;action&quot;: [&quot;python&quot;, &quot;build/gyp_angle&quot;],
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEREADMEmd"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/README.md (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/README.md        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/README.md        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,22 +1,44 @@
</span><span class="cx"> #ANGLE
</span><del>-The goal of ANGLE is to allow Windows users to seamlessly run WebGL and other OpenGL ES content by translating OpenGL ES API calls to DirectX 9 or DirectX 11 API calls.
</del><ins>+The goal of ANGLE is to allow users of multiple operating systems to seamlessly run WebGL and other OpenGL ES content by translating OpenGL ES API calls to one of the hardware-supported APIs available for that platform. ANGLE currently provides translation from OpenGL ES 2.0 to desktop OpenGL, Direct3D 9, and Direct3D 11. Support for translation from OpenGL ES 3.0 to all of these APIs is nearing completion, and future plans include enabling validated ES-to-ES support.
</ins><span class="cx"> 
</span><del>-ANGLE is a conformant implementation of the OpenGL ES 2.0 specification that is hardware‐accelerated via Direct3D. ANGLE v1.0.772 was certified compliant by passing the ES 2.0.3 conformance tests in October 2011. ANGLE also provides an implementation of the EGL 1.4 specification. Work on ANGLE's OpenGL ES 3.0 implementation is currently in progress, but should not be considered stable.
</del><ins>+|                |  Direct3D 9   |    Direct3D 11      |    Desktop GL      |    GL ES  |
+|----------------|:-------------:|:-------------------:|:------------------:|:---------:|
+| OpenGL ES 2.0  |    complete   |      complete       |     complete       |   planned |
+| OpenGL ES 3.0  |               |  nearing completion | nearing completion |   planned |
+[Level of OpenGL ES support via backing renderers]
</ins><span class="cx"> 
</span><ins>+
+|             |    Direct3D 9  |   Direct3D 11  |   Desktop GL  |
+|------------:|:--------------:|:--------------:|:-------------:|
+| Windows     |        *       |        *       |       *       |
+| Linux       |                |                |       *       |
+| Mac OS X    |                |                |   in progress |
+[Platform support via backing renderers]
+
+ANGLE v1.0.772 was certified compliant by passing the ES 2.0.3 conformance tests in October 2011. ANGLE also provides an implementation of the EGL 1.4 specification.
+
</ins><span class="cx"> ANGLE is used as the default WebGL backend for both Google Chrome and Mozilla Firefox on Windows platforms. Chrome uses ANGLE for all graphics rendering on Windows, including the accelerated Canvas2D implementation and the Native Client sandbox environment.
</span><span class="cx"> 
</span><span class="cx"> Portions of the ANGLE shader compiler are used as a shader validator and translator by WebGL implementations across multiple platforms. It is used on Mac OS X, Linux, and in mobile variants of the browsers. Having one shader validator helps to ensure that a consistent set of GLSL ES shaders are accepted across browsers and platforms. The shader translator can be used to translate shaders to other shading languages, and to optionally apply shader modifications to work around bugs or quirks in the native graphics drivers. The translator targets Desktop GLSL, Direct3D HLSL, and even ESSL for native GLES2 platforms.
</span><span class="cx"> 
</span><ins>+##Browsing
+Browse ANGLE's source in the [repository](https://chromium.googlesource.com/angle/angle)
+
</ins><span class="cx"> ##Building
</span><del>-For building instructions, visit the [dev setup wiki](https://code.google.com/p/angleproject/wiki/DevSetup).
</del><ins>+View the [Dev setup instructions](doc/DevSetup.md). For generating a Windows Store version of ANGLE view the [Windows Store instructions](doc/BuildingAngleForWindowsStore.md)
</ins><span class="cx"> 
</span><span class="cx"> ##Contributing
</span><span class="cx"> * Join our [Google group](https://groups.google.com/group/angleproject) to keep up to date.
</span><span class="cx"> * Join us on IRC in the #ANGLEproject channel on FreeNode.
</span><del>-* Read about ANGLE development on the [wiki](http://code.google.com/p/angleproject/w/list).
-* Become a [code contributor](https://code.google.com/p/angleproject/wiki/ContributingCode).
</del><ins>+* Read about ANGLE development in our [documentation](doc).
+* Become a [code contributor](doc/ContributingCode.md).
+* Refer to ANGLE's [coding standard](doc/CodingStandard.md).
+* Learn how to [build ANGLE for Chromium development](doc/BuildingAngleForChromiumDevelopment.md).
+* [Choose an ANGLE branch](doc/ChoosingANGLEBranch.md) to track in your own project.
</ins><span class="cx"> * File bugs in the [issue tracker](http://code.google.com/p/angleproject/issues/list) (preferably with an isolated test-case).
</span><span class="cx"> * Read about WebGL on the [Khronos WebGL Wiki](http://khronos.org/webgl/wiki/Main_Page).
</span><del>-* Learn about implementation details in the [OpenGL Insights chapter on ANGLE](http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-ANGLE.pdf) and this [ANGLE presentation](https://code.google.com/p/angleproject/downloads/detail?name=ANGLE%20and%20Cross-Platform%20WebGL%20Support.pdf&amp;can=2&amp;q=).
</del><ins>+* Learn about implementation details in the [OpenGL Insights chapter on ANGLE](http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-ANGLE.pdf) and this [ANGLE presentation](https://drive.google.com/file/d/0Bw29oYeC09QbbHoxNE5EUFh0RGs/view?usp=sharing).
</ins><span class="cx"> * Learn about the past, present, and future of the ANGLE implementation in [this recent presentation](https://docs.google.com/presentation/d/1CucIsdGVDmdTWRUbg68IxLE5jXwCb2y1E9YVhQo0thg/pub?start=false&amp;loop=false).
</span><del>-* If you use ANGLE in your own project, we'd love to hear about it!
</del><span class="cx">\ No newline at end of file
</span><ins>+* Notes on [debugging ANGLE](doc/DebuggingTips.md).
+* If you use ANGLE in your own project, we'd love to hear about it!
+
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEangleisolate"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/angle.isolate (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/angle.isolate        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/angle.isolate        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,6 +1,9 @@
</span><span class="cx"> # Copyright 2015 The ANGLE Project Authors. All rights reserved.
</span><span class="cx"> # Use of this source code is governed by a BSD-style license that can be
</span><span class="cx"> # found in the LICENSE file.
</span><ins>+
+# This isolate expresses the Chromium project's default runtime
+# dependencies.
</ins><span class="cx"> {
</span><span class="cx">   'conditions': [
</span><span class="cx">     ['OS==&quot;win&quot;', {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEchangesdiff"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/changes.diff (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/changes.diff        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/changes.diff        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> diff --git a/include/GLSLANG/ShaderLang.h b/include/GLSLANG/ShaderLang.h
</span><del>-index e750e32..7d3f415 100644
</del><ins>+index 78f8ef6..b7fdf55 100644
</ins><span class="cx"> --- a/include/GLSLANG/ShaderLang.h
</span><span class="cx"> +++ b/include/GLSLANG/ShaderLang.h
</span><span class="cx"> @@ -25,7 +25,7 @@
</span><span class="lines">@@ -11,21 +11,17 @@
</span><span class="cx">  
</span><span class="cx">  #include &lt;map&gt;
</span><span class="cx">  #include &lt;string&gt;
</span><del>-diff --git a/src/common/mathutil.h b/src/common/mathutil.h
-index 9f5c9fd..7959da8 100644
---- a/src/common/mathutil.h
-+++ b/src/common/mathutil.h
-@@ -478,7 +478,7 @@ inline unsigned int average(unsigned int a, unsigned int b)

- inline signed int average(signed int a, signed int b)
- {
--    return ((long long)a + (long long)b) / 2;
-+    return (signed int)((long long)a + (long long)b) / 2;
- }

- inline float average(float a, float b)
</del><ins>+@@ -343,7 +343,7 @@ COMPILER_EXPORT const std::string &amp;ShGetBuiltInResourcesString(const ShHandle ha
+ // type: Specifies the type of shader - GL_FRAGMENT_SHADER or GL_VERTEX_SHADER.
+ // spec: Specifies the language spec the compiler must conform to -
+ //       SH_GLES2_SPEC or SH_WEBGL_SPEC.
+-// output: Specifies the output code type - for example SH_ESSL_OUTPUT, SH_GLSL_OUTPUT,
++// output: Specifies the output code type - for example SH_ESSL_OUTPUT, SH_GLSL_COMPATIBILITY_OUTPUT,
+ //         SH_HLSL_3_0_OUTPUT or SH_HLSL_4_1_OUTPUT. Note: Each output type may only
+ //         be supported in some configurations.
+ // resources: Specifies the built-in resources.
</ins><span class="cx"> diff --git a/src/common/version.h b/src/common/version.h
</span><del>-index 758c78d..2a44709 100644
</del><ins>+index e7ffa7c..b653ae3 100644
</ins><span class="cx"> --- a/src/common/version.h
</span><span class="cx"> +++ b/src/common/version.h
</span><span class="cx"> @@ -7,7 +7,7 @@
</span><span class="lines">@@ -38,524 +34,142 @@
</span><span class="cx">  #define ANGLE_MAJOR_VERSION 2
</span><span class="cx">  #define ANGLE_MINOR_VERSION 1
</span><span class="cx"> diff --git a/src/compiler/preprocessor/ExpressionParser.cpp b/src/compiler/preprocessor/ExpressionParser.cpp
</span><del>-index 683195c..851183e 100644
</del><ins>+index 193b150..b38b7ae 100644
</ins><span class="cx"> --- a/src/compiler/preprocessor/ExpressionParser.cpp
</span><span class="cx"> +++ b/src/compiler/preprocessor/ExpressionParser.cpp
</span><span class="cx"> @@ -1,5 +1,7 @@
</span><span class="cx">  /* A Bison parser, made by GNU Bison 3.0.4.  */
</span><span class="cx">  
</span><del>-+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ 
</del><ins>++/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */
</ins><span class="cx"> +
</span><span class="cx">  /* Bison implementation for Yacc-like parsers in C
</span><span class="cx">  
</span><span class="cx">     Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
</span><span class="cx"> diff --git a/src/compiler/preprocessor/Tokenizer.cpp b/src/compiler/preprocessor/Tokenizer.cpp
</span><del>-index 75df434..dd9d41a 100644
</del><ins>+index eb6156f..1caee47 100644
</ins><span class="cx"> --- a/src/compiler/preprocessor/Tokenizer.cpp
</span><span class="cx"> +++ b/src/compiler/preprocessor/Tokenizer.cpp
</span><del>-@@ -6,6 +6,11 @@
- //
</del><ins>+@@ -712,7 +712,7 @@ static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
+ static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
+ #endif
</ins><span class="cx">  
</span><del>- // This file is auto-generated by generate_parser.sh. DO NOT EDIT!
-+// This file was edited anyways to ignore clang warnings.
-+#if defined(__clang__)
-+#pragma clang diagnostic push
-+#pragma GCC diagnostic ignored &quot;-Wunneeded-internal-declaration&quot;
-+#endif
</del><ins>+-#ifndef YY_NO_INPUT
++#if 0 //#ifndef YY_NO_INPUT
</ins><span class="cx">  
</span><ins>+ #ifdef __cplusplus
+ static int yyinput (yyscan_t yyscanner );
+@@ -1526,7 +1526,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
+        return yy_is_jam ? 0 : yy_current_state;
+ }
</ins><span class="cx">  
</span><ins>+-#ifndef YY_NO_INPUT
++#if 0 //#ifndef YY_NO_INPUT
+ #ifdef __cplusplus
+     static int yyinput (yyscan_t yyscanner)
+ #else
+diff --git a/src/compiler/translator/CodeGen.cpp b/src/compiler/translator/CodeGen.cpp
+index f099bcc..fe7c4f1 100644
+--- a/src/compiler/translator/CodeGen.cpp
++++ b/src/compiler/translator/CodeGen.cpp
+@@ -4,6 +4,8 @@
+ // found in the LICENSE file.
+ //
</ins><span class="cx">  
</span><del>-diff --git a/src/compiler/translator/CallDAG.cpp b/src/compiler/translator/CallDAG.cpp
-index 1d1eb8b..95dbea1 100644
---- a/src/compiler/translator/CallDAG.cpp
-+++ b/src/compiler/translator/CallDAG.cpp
-@@ -71,10 +71,10 @@ class CallDAG::CallDAGCreator : public TIntermTraverser
-             record.callees.reserve(data.callees.size());
-             for (auto &amp;callee : data.callees)
-             {
--                record.callees.push_back(callee-&gt;index);
-+                record.callees.push_back(static_cast&lt;int&gt;(callee-&gt;index));
-             }

--            (*idToIndex)[data.node-&gt;getFunctionId()] = data.index;
-+            (*idToIndex)[data.node-&gt;getFunctionId()] = static_cast&lt;int&gt;(data.index);
-         }
-     }

-diff --git a/src/compiler/translator/Compiler.cpp b/src/compiler/translator/Compiler.cpp
-index 8b5b12f..5c029ba 100644
---- a/src/compiler/translator/Compiler.cpp
-+++ b/src/compiler/translator/Compiler.cpp
-@@ -528,15 +528,15 @@ bool TCompiler::checkCallDepth()
-             infoSink.info &lt;&lt; &quot;Call stack too deep (larger than &quot; &lt;&lt; maxCallStackDepth
-                           &lt;&lt; &quot;) with the following call chain: &quot; &lt;&lt; record.name;

--            int currentFunction = i;
-+            signed long long currentFunction = i;
-             int currentDepth = depth;

-             while (currentFunction != -1)
-             {
--                infoSink.info &lt;&lt; &quot; -&gt; &quot; &lt;&lt; mCallDag.getRecordFromIndex(currentFunction).name;
-+                infoSink.info &lt;&lt; &quot; -&gt; &quot; &lt;&lt; mCallDag.getRecordFromIndex(static_cast&lt;size_t&gt;(currentFunction)).name;

-                 int nextFunction = -1;
--                for (auto&amp; calleeIndex : mCallDag.getRecordFromIndex(currentFunction).callees)
-+                for (auto&amp; calleeIndex : mCallDag.getRecordFromIndex(static_cast&lt;size_t&gt;(currentFunction)).callees)
-                 {
-                     if (depths[calleeIndex] == currentDepth - 1)
-                     {
-@@ -558,7 +558,7 @@ bool TCompiler::checkCallDepth()
- bool TCompiler::tagUsedFunctions()
</del><ins>++#include &quot;compiler/translator/Compiler.h&quot;
++
+ #ifdef ANGLE_ENABLE_ESSL
+ #include &quot;compiler/translator/TranslatorESSL.h&quot;
+ #endif
+diff --git a/src/compiler/translator/ShaderLang.cpp b/src/compiler/translator/ShaderLang.cpp
+index 421597b..a58e917 100644
+--- a/src/compiler/translator/ShaderLang.cpp
++++ b/src/compiler/translator/ShaderLang.cpp
+@@ -374,4 +374,4 @@ const std::map&lt;std::string, unsigned int&gt; *ShGetUniformRegisterMap(const ShHandl
+     static std::map&lt;std::string, unsigned int&gt; map;
+     return &amp;map;
+ #endif  // ANGLE_ENABLE_HLSL
+-}
+\ No newline at end of file
++}
+diff --git a/src/compiler/translator/TranslatorHLSL.cpp b/src/compiler/translator/TranslatorHLSL.cpp
+index 111a38b..2940260 100644
+--- a/src/compiler/translator/TranslatorHLSL.cpp
++++ b/src/compiler/translator/TranslatorHLSL.cpp
+@@ -75,4 +75,4 @@ unsigned int TranslatorHLSL::getInterfaceBlockRegister(const std::string &amp;interf
+ const std::map&lt;std::string, unsigned int&gt; *TranslatorHLSL::getUniformRegisterMap() const
</ins><span class="cx">  {
</span><del>-     // Search from main, starting from the end of the DAG as it usually is the root.
--    for (int i = mCallDag.size(); i-- &gt; 0;)
-+    for (size_t i = mCallDag.size(); i--;)
-     {
-         if (mCallDag.getRecordFromIndex(i).name == &quot;main(&quot;)
-         {
-diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
-index cd7ffc4..1cd787c 100644
---- a/src/compiler/translator/ParseContext.cpp
-+++ b/src/compiler/translator/ParseContext.cpp
-@@ -511,7 +511,7 @@ bool TParseContext::constructorErrorCheck(const TSourceLoc&amp; line, TIntermNode* n
-     {
-         if (type-&gt;isUnsizedArray())
-         {
--            type-&gt;setArraySize(function.getParamCount());
-+            type-&gt;setArraySize(static_cast&lt;int&gt;(function.getParamCount()));
-         }
-         else if (static_cast&lt;size_t&gt;(type-&gt;getArraySize()) != function.getParamCount())
-         {
-diff --git a/src/compiler/translator/VariableInfo.cpp b/src/compiler/translator/VariableInfo.cpp
-index 808db95..1aa9e59 100644
---- a/src/compiler/translator/VariableInfo.cpp
-+++ b/src/compiler/translator/VariableInfo.cpp
-@@ -55,7 +55,7 @@ void ExpandVariable(const ShaderVariable &amp;variable,
-     {
-         if (variable.isArray())
-         {
--            for (size_t elementIndex = 0; elementIndex &lt; variable.elementCount(); elementIndex++)
-+            for (unsigned int elementIndex = 0; elementIndex &lt; variable.elementCount(); elementIndex++)
-             {
-                 std::string lname = name + ::ArrayString(elementIndex);
-                 std::string lmappedName = mappedName + ::ArrayString(elementIndex);
-diff --git a/src/compiler/translator/blocklayout.cpp b/src/compiler/translator/blocklayout.cpp
-index 7c74105..7cc6315 100644
---- a/src/compiler/translator/blocklayout.cpp
-+++ b/src/compiler/translator/blocklayout.cpp
-@@ -27,7 +27,7 @@ BlockMemberInfo BlockLayoutEncoder::encodeType(GLenum type, unsigned int arraySi
</del><ins>+     return &amp;mUniformRegisterMap;
+-}
+\ No newline at end of file
++}
+diff --git a/src/compiler/translator/TranslatorHLSL.h b/src/compiler/translator/TranslatorHLSL.h
+index 40cfd70..4e84612 100644
+--- a/src/compiler/translator/TranslatorHLSL.h
++++ b/src/compiler/translator/TranslatorHLSL.h
+@@ -13,7 +13,9 @@ class TranslatorHLSL : public TCompiler
+ {
+   public:
+     TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output);
++#ifdef ANGLE_ENABLE_HLSL
+     TranslatorHLSL *getAsTranslatorHLSL() override { return this; }
++#endif
</ins><span class="cx">  
</span><del>-     getBlockLayoutInfo(type, arraySize, isRowMajorMatrix, &amp;arrayStride, &amp;matrixStride);

--    const BlockMemberInfo memberInfo(mCurrentOffset * BytesPerComponent, arrayStride * BytesPerComponent, matrixStride * BytesPerComponent, isRowMajorMatrix);
-+    const BlockMemberInfo memberInfo(static_cast&lt;int&gt;(mCurrentOffset * BytesPerComponent), arrayStride * BytesPerComponent, matrixStride * BytesPerComponent, isRowMajorMatrix);

-     advanceOffset(type, arraySize, isRowMajorMatrix, arrayStride, matrixStride);

</del><ins>+     bool hasInterfaceBlock(const std::string &amp;interfaceBlockName) const;
+     unsigned int getInterfaceBlockRegister(const std::string &amp;interfaceBlockName) const;
+diff --git a/src/compiler/translator/glslang_lex.cpp b/src/compiler/translator/glslang_lex.cpp
+index ff6c2d6..1af876b 100644
+--- a/src/compiler/translator/glslang_lex.cpp
++++ b/src/compiler/translator/glslang_lex.cpp
+@@ -2090,7 +2090,7 @@ case YY_STATE_EOF(FIELDS):
+        YY_BREAK
+ case 239:
+ YY_RULE_SETUP
+-{ assert(false); return 0; }
++{ return 0; }
+        YY_BREAK
+ case 240:
+ YY_RULE_SETUP
</ins><span class="cx"> diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp
</span><del>-index 03cef93..6fb0d46 100644
</del><ins>+index 8b4fbd2..a799d29 100644
</ins><span class="cx"> --- a/src/compiler/translator/glslang_tab.cpp
</span><span class="cx"> +++ b/src/compiler/translator/glslang_tab.cpp
</span><span class="cx"> @@ -1,5 +1,7 @@
</span><span class="cx">  /* A Bison parser, made by GNU Bison 3.0.4.  */
</span><span class="cx">  
</span><del>-+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ 
</del><ins>++/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */
</ins><span class="cx"> +
</span><span class="cx">  /* Bison implementation for Yacc-like parsers in C
</span><span class="cx">  
</span><span class="cx">     Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
</span><del>-diff --git a/src/libANGLE/Config.cpp b/src/libANGLE/Config.cpp
-index 1b1fc50..2a68d5b 100644
---- a/src/libANGLE/Config.cpp
-+++ b/src/libANGLE/Config.cpp
-@@ -64,7 +64,7 @@ Config::Config()
- EGLint ConfigSet::add(const Config &amp;config)
- {
-     // Set the config's ID to a small number that starts at 1 ([EGL 1.5] section 3.4)
--    EGLint id = mConfigs.size() + 1;
-+    EGLint id = static_cast&lt;EGLint&gt;(mConfigs.size() + 1);
</del><ins>+diff --git a/src/compiler/translator/glslang_tab.h b/src/compiler/translator/glslang_tab.h
+index 7331594..eb7ef39 100644
+--- a/src/compiler/translator/glslang_tab.h
++++ b/src/compiler/translator/glslang_tab.h
+@@ -1,5 +1,7 @@
+ /* A Bison parser, made by GNU Bison 3.0.4.  */
</ins><span class="cx">  
</span><del>-     Config copyConfig(config);
-     copyConfig.configID = id;
-diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
-index 545284a..c8ea993 100644
---- a/src/libANGLE/Context.cpp
-+++ b/src/libANGLE/Context.cpp
-@@ -838,7 +838,7 @@ void Context::getIntegerv(GLenum pname, GLint *params)
-       case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: *params = mCaps.maxTransformFeedbackInterleavedComponents; break;
-       case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:       *params = mCaps.maxTransformFeedbackSeparateAttributes;    break;
-       case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:    *params = mCaps.maxTransformFeedbackSeparateComponents;    break;
--      case GL_NUM_COMPRESSED_TEXTURE_FORMATS:           *params = mCaps.compressedTextureFormats.size();                break;
-+      case GL_NUM_COMPRESSED_TEXTURE_FORMATS:           *params = static_cast&lt;GLint&gt;(mCaps.compressedTextureFormats.size());  break;
-       case GL_MAX_SAMPLES_ANGLE:                        *params = mCaps.maxSamples;                                     break;
-       case GL_MAX_VIEWPORT_DIMS:
-         {
-@@ -853,13 +853,13 @@ void Context::getIntegerv(GLenum pname, GLint *params)
-         *params = mResetStrategy;
-         break;
-       case GL_NUM_SHADER_BINARY_FORMATS:
--        *params = mCaps.shaderBinaryFormats.size();
-+        *params = static_cast&lt;GLint&gt;(mCaps.shaderBinaryFormats.size());
-         break;
-       case GL_SHADER_BINARY_FORMATS:
-         std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
-         break;
-       case GL_NUM_PROGRAM_BINARY_FORMATS:
--        *params = mCaps.programBinaryFormats.size();
-+        *params = static_cast&lt;GLint&gt;(mCaps.programBinaryFormats.size());
-         break;
-       case GL_PROGRAM_BINARY_FORMATS:
-         std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
-@@ -939,19 +939,19 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
-       case GL_COMPRESSED_TEXTURE_FORMATS:
-         {
-             *type = GL_INT;
--            *numParams = mCaps.compressedTextureFormats.size();
-+            *numParams = static_cast&lt;unsigned int&gt;(mCaps.compressedTextureFormats.size());
-         }
-         return true;
-       case GL_PROGRAM_BINARY_FORMATS_OES:
-         {
-             *type = GL_INT;
--            *numParams = mCaps.programBinaryFormats.size();
-+            *numParams = static_cast&lt;unsigned int&gt;(mCaps.programBinaryFormats.size());
-         }
-         return true;
-       case GL_SHADER_BINARY_FORMATS:
-         {
-             *type = GL_INT;
--            *numParams = mCaps.shaderBinaryFormats.size();
-+            *numParams = static_cast&lt;unsigned int&gt;(mCaps.shaderBinaryFormats.size());
-         }
-         return true;
</del><ins>++/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */
++
+ /* Bison interface for Yacc-like parsers in C
</ins><span class="cx">  
</span><del>-diff --git a/src/libANGLE/Framebuffer.cpp b/src/libANGLE/Framebuffer.cpp
-index faee83c..3870e69 100644
---- a/src/libANGLE/Framebuffer.cpp
-+++ b/src/libANGLE/Framebuffer.cpp
-@@ -269,7 +269,7 @@ bool Framebuffer::hasEnabledColorAttachment() const
- {
-     for (size_t colorAttachment = 0; colorAttachment &lt; mData.mColorAttachments.size(); ++colorAttachment)
</del><ins>+    Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+diff --git a/src/libANGLE/Display.cpp b/src/libANGLE/Display.cpp
+index c94dff2..4de579b 100644
+--- a/src/libANGLE/Display.cpp
++++ b/src/libANGLE/Display.cpp
+@@ -139,6 +139,7 @@ rx::DisplayImpl *CreateDisplayFromAttribs(const AttributeMap &amp;attribMap)
+     switch (displayType)
</ins><span class="cx">      {
</span><del>--        if (isEnabledColorAttachment(colorAttachment))
-+        if (static_cast&lt;unsigned int&gt;(isEnabledColorAttachment(colorAttachment)))
-         {
-             return true;
-         }
-@@ -287,7 +287,7 @@ bool Framebuffer::usingExtendedDrawBuffers() const
- {
-     for (size_t colorAttachment = 1; colorAttachment &lt; mData.mColorAttachments.size(); ++colorAttachment)
-     {
--        if (isEnabledColorAttachment(colorAttachment))
-+        if (static_cast&lt;unsigned int&gt;(isEnabledColorAttachment(colorAttachment)))
-         {
-             return true;
-         }
-diff --git a/src/libANGLE/ImageIndex.cpp b/src/libANGLE/ImageIndex.cpp
-index ac7302d..538258f 100644
---- a/src/libANGLE/ImageIndex.cpp
-+++ b/src/libANGLE/ImageIndex.cpp
-@@ -35,7 +35,7 @@ ImageIndex ImageIndex::Make2D(GLint mipIndex)
- ImageIndex ImageIndex::MakeCube(GLenum target, GLint mipIndex)
- {
-     ASSERT(gl::IsCubeMapTextureTarget(target));
--    return ImageIndex(target, mipIndex, CubeMapTextureTargetToLayerIndex(target));
-+    return ImageIndex(target, mipIndex, static_cast&lt;int&gt;(CubeMapTextureTargetToLayerIndex(target)));
- }

- ImageIndex ImageIndex::Make2DArray(GLint mipIndex, GLint layerIndex)
-@@ -50,7 +50,7 @@ ImageIndex ImageIndex::Make3D(GLint mipIndex, GLint layerIndex)

- ImageIndex ImageIndex::MakeGeneric(GLenum target, GLint mipIndex)
- {
--    GLint layerIndex = IsCubeMapTextureTarget(target) ? CubeMapTextureTargetToLayerIndex(target) : ENTIRE_LEVEL;
-+    GLint layerIndex = IsCubeMapTextureTarget(target) ? static_cast&lt;GLint&gt;(CubeMapTextureTargetToLayerIndex(target)) : ENTIRE_LEVEL;
-     return ImageIndex(target, mipIndex, layerIndex);
- }

-diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
-index e215379..42f09b9 100644
---- a/src/libANGLE/Program.cpp
-+++ b/src/libANGLE/Program.cpp
-@@ -483,7 +483,7 @@ Error Program::saveBinary(GLenum *binaryFormat, void *binary, GLsizei bufSize, G
-         return error;
-     }

--    GLsizei streamLength = stream.length();
-+    GLsizei streamLength = static_cast&lt;GLsizei&gt;(stream.length());
-     const void *streamData = stream.data();

-     if (streamLength &gt; bufSize)
-@@ -645,7 +645,7 @@ void Program::getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length,

-             if (length)
-             {
--                *length = strlen(name);
-+                *length = static_cast&lt;GLsizei&gt;(strlen(name));
-             }
-         }

-@@ -762,7 +762,7 @@ void Program::getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, G

-             if (length)
-             {
--                *length = strlen(name);
-+                *length = static_cast&lt;GLsizei&gt;(strlen(name));
-             }
-         }

-@@ -790,7 +790,7 @@ GLint Program::getActiveUniformCount()
- {
-     if (mLinked)
-     {
--        return mProgram-&gt;getUniforms().size();
-+        return static_cast&lt;GLint&gt;(mProgram-&gt;getUniforms().size());
-     }
-     else
-     {
-@@ -804,7 +804,7 @@ GLint Program::getActiveUniformMaxLength()

-     if (mLinked)
-     {
--        unsigned int numUniforms = mProgram-&gt;getUniforms().size();
-+        unsigned int numUniforms = static_cast&lt;unsigned int&gt;(mProgram-&gt;getUniforms().size());
-         for (unsigned int uniformIndex = 0; uniformIndex &lt; numUniforms; uniformIndex++)
-         {
-             if (!mProgram-&gt;getUniforms()[uniformIndex]-&gt;name.empty())
-@@ -1042,7 +1042,7 @@ void Program::updateSamplerMapping()

- GLuint Program::getActiveUniformBlockCount()
- {
--    return mProgram-&gt;getUniformBlocks().size();
-+    return static_cast&lt;GLuint&gt;(mProgram-&gt;getUniformBlocks().size());
- }

- void Program::getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const
-@@ -1065,7 +1065,7 @@ void Program::getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSiz

-         if (length)
-         {
--            *length = strlen(uniformBlockName);
-+            *length = static_cast&lt;GLsizei&gt;(strlen(uniformBlockName));
-         }
-     }
- }
-@@ -1111,13 +1111,13 @@ GLint Program::getActiveUniformBlockMaxLength()

-     if (mLinked)
-     {
--        unsigned int numUniformBlocks = mProgram-&gt;getUniformBlocks().size();
-+        unsigned int numUniformBlocks = static_cast&lt;unsigned int&gt;(mProgram-&gt;getUniformBlocks().size());
-         for (unsigned int uniformBlockIndex = 0; uniformBlockIndex &lt; numUniformBlocks; uniformBlockIndex++)
-         {
-             const UniformBlock &amp;uniformBlock = *mProgram-&gt;getUniformBlocks()[uniformBlockIndex];
-             if (!uniformBlock.name.empty())
-             {
--                const int length = uniformBlock.name.length() + 1;
-+                const int length = static_cast&lt;int&gt;(uniformBlock.name.length() + 1);

-                 // Counting in &quot;[0]&quot;.
-                 const int arrayLength = (uniformBlock.isArrayElement() ? 3 : 0);
-@@ -1466,7 +1466,7 @@ bool Program::areMatchingInterfaceBlocks(gl::InfoLog &amp;infoLog, const sh::Interfa
-         infoLog.append(&quot;Layout qualifiers differ for interface block '%s' between vertex and fragment shaders&quot;, blockName);
-         return false;
-     }
--    const unsigned int numBlockMembers = vertexInterfaceBlock.fields.size();
-+    const unsigned int numBlockMembers = static_cast&lt;unsigned int&gt;(vertexInterfaceBlock.fields.size());
-     for (unsigned int blockMemberIndex = 0; blockMemberIndex &lt; numBlockMembers; blockMemberIndex++)
-     {
-         const sh::InterfaceBlockField &amp;vertexMember = vertexInterfaceBlock.fields[blockMemberIndex];
-@@ -1510,7 +1510,7 @@ bool Program::linkValidateVariablesBase(InfoLog &amp;infoLog, const std::string &amp;var
-         infoLog.append(&quot;Structure lengths for %s differ between vertex and fragment shaders&quot;, variableName.c_str());
-         return false;
-     }
--    const unsigned int numMembers = vertexVariable.fields.size();
-+    const unsigned int numMembers = static_cast&lt;unsigned int&gt;(vertexVariable.fields.size());
-     for (unsigned int memberIndex = 0; memberIndex &lt; numMembers; memberIndex++)
-     {
-         const sh::ShaderVariable &amp;vertexMember = vertexVariable.fields[memberIndex];
-diff --git a/src/libANGLE/Renderbuffer.cpp b/src/libANGLE/Renderbuffer.cpp
-index 85b920b..34cc365 100644
---- a/src/libANGLE/Renderbuffer.cpp
-+++ b/src/libANGLE/Renderbuffer.cpp
-@@ -42,8 +42,8 @@ Error Renderbuffer::setStorage(GLenum internalformat, size_t width, size_t heigh
-         return error;
-     }

--    mWidth = width;
--    mHeight = height;
-+    mWidth = static_cast&lt;GLsizei&gt;(width);
-+    mHeight = static_cast&lt;GLsizei&gt;(height);
-     mInternalFormat = internalformat;
-     mSamples = 0;

-@@ -58,10 +58,10 @@ Error Renderbuffer::setStorageMultisample(size_t samples, GLenum internalformat,
-         return error;
-     }

--    mWidth = width;
--    mHeight = height;
-+    mWidth = static_cast&lt;GLsizei&gt;(width);
-+    mHeight = static_cast&lt;GLsizei&gt;(height);
-     mInternalFormat = internalformat;
--    mSamples = samples;
-+    mSamples = static_cast&lt;GLsizei&gt;(samples);

-     return Error(GL_NO_ERROR);
- }
-diff --git a/src/libANGLE/Shader.cpp b/src/libANGLE/Shader.cpp
-index 7af4ff3..5106e95 100644
---- a/src/libANGLE/Shader.cpp
-+++ b/src/libANGLE/Shader.cpp
-@@ -66,7 +66,7 @@ void Shader::setSource(GLsizei count, const char *const *string, const GLint *le

- int Shader::getInfoLogLength() const
- {
--    return  mShader-&gt;getInfoLog().empty() ? 0 : (mShader-&gt;getInfoLog().length() + 1);
-+    return  mShader-&gt;getInfoLog().empty() ? 0 : static_cast&lt;int&gt;(mShader-&gt;getInfoLog().length() + 1);
- }

- void Shader::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
-@@ -89,12 +89,12 @@ void Shader::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const

- int Shader::getSourceLength() const
- {
--    return mSource.empty() ? 0 : (mSource.length() + 1);
-+    return mSource.empty() ? 0 : static_cast&lt;int&gt;(mSource.length() + 1);
- }

- int Shader::getTranslatedSourceLength() const
- {
--    return mShader-&gt;getTranslatedSource().empty() ? 0 : (mShader-&gt;getTranslatedSource().length() + 1);
-+    return mShader-&gt;getTranslatedSource().empty() ? 0 : static_cast&lt;int&gt;(mShader-&gt;getTranslatedSource().length() + 1);
- }

- void Shader::getSourceImpl(const std::string &amp;source, GLsizei bufSize, GLsizei *length, char *buffer)
-diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
-index f731774..f6837f4 100644
---- a/src/libANGLE/State.cpp
-+++ b/src/libANGLE/State.cpp
-@@ -569,7 +569,7 @@ void State::setActiveSampler(unsigned int active)

- unsigned int State::getActiveSampler() const
- {
--    return mActiveSampler;
-+    return static_cast&lt;unsigned int&gt;(mActiveSampler);
- }

- void State::setSamplerTexture(GLenum type, Texture *texture)
-@@ -1192,7 +1192,7 @@ void State::getIntegerv(const gl::Data &amp;data, GLenum pname, GLint *params)
-       case GL_UNPACK_ROW_LENGTH:                        *params = mUnpack.rowLength;                              break;
-       case GL_GENERATE_MIPMAP_HINT:                     *params = mGenerateMipmapHint;                            break;
-       case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:      *params = mFragmentShaderDerivativeHint;                  break;
--      case GL_ACTIVE_TEXTURE:                           *params = (mActiveSampler + GL_TEXTURE0);                 break;
-+      case GL_ACTIVE_TEXTURE:                           *params = static_cast&lt;GLint&gt;(mActiveSampler + GL_TEXTURE0);     break;
-       case GL_STENCIL_FUNC:                             *params = mDepthStencil.stencilFunc;                      break;
-       case GL_STENCIL_REF:                              *params = mStencilRef;                                    break;
-       case GL_STENCIL_VALUE_MASK:                       *params = clampToInt(mDepthStencil.stencilMask);          break;
-@@ -1316,19 +1316,19 @@ void State::getIntegerv(const gl::Data &amp;data, GLenum pname, GLint *params)
</del><ins>+       case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
++#if defined(ANGLE_ENABLE_OPENGL)
+ #if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
+         // Default to D3D displays
+         impl = new rx::DisplayD3D();
+@@ -150,6 +151,7 @@ rx::DisplayImpl *CreateDisplayFromAttribs(const AttributeMap &amp;attribMap)
+         // No display available
+         UNREACHABLE();
+ #endif
++#endif
</ins><span class="cx">          break;
</span><del>-       case GL_TEXTURE_BINDING_2D:
-         ASSERT(mActiveSampler &lt; mMaxCombinedTextureImageUnits);
--        *params = getSamplerTextureId(mActiveSampler, GL_TEXTURE_2D) ;
-+        *params = getSamplerTextureId(static_cast&lt;unsigned int&gt;(mActiveSampler), GL_TEXTURE_2D) ;
-         break;
-       case GL_TEXTURE_BINDING_CUBE_MAP:
-         ASSERT(mActiveSampler &lt; mMaxCombinedTextureImageUnits);
--        *params = getSamplerTextureId(mActiveSampler, GL_TEXTURE_CUBE_MAP);
-+        *params = getSamplerTextureId(static_cast&lt;unsigned int&gt;(mActiveSampler), GL_TEXTURE_CUBE_MAP);
-         break;
-       case GL_TEXTURE_BINDING_3D:
-         ASSERT(mActiveSampler &lt; mMaxCombinedTextureImageUnits);
--        *params = getSamplerTextureId(mActiveSampler, GL_TEXTURE_3D);
-+        *params = getSamplerTextureId(static_cast&lt;unsigned int&gt;(mActiveSampler), GL_TEXTURE_3D);
-         break;
-       case GL_TEXTURE_BINDING_2D_ARRAY:
-         ASSERT(mActiveSampler &lt; mMaxCombinedTextureImageUnits);
--        *params = getSamplerTextureId(mActiveSampler, GL_TEXTURE_2D_ARRAY);
-+        *params = getSamplerTextureId(static_cast&lt;unsigned int&gt;(mActiveSampler), GL_TEXTURE_2D_ARRAY);
-         break;
-       case GL_UNIFORM_BUFFER_BINDING:
-         *params = mGenericUniformBuffer.id();
-diff --git a/src/libANGLE/Surface.cpp b/src/libANGLE/Surface.cpp
-index c42b69d..9742f5d 100644
---- a/src/libANGLE/Surface.cpp
-+++ b/src/libANGLE/Surface.cpp
-@@ -135,12 +135,12 @@ EGLint Surface::isFixedSize() const
</del><span class="cx">  
</span><del>- EGLint Surface::getWidth() const
- {
--    return mFixedSize ? mFixedWidth : mImplementation-&gt;getWidth();
-+    return mFixedSize ? static_cast&lt;EGLint&gt;(mFixedWidth) : mImplementation-&gt;getWidth();
- }

- EGLint Surface::getHeight() const
- {
--    return mFixedSize ? mFixedHeight : mImplementation-&gt;getHeight();
-+    return mFixedSize ? static_cast&lt;EGLint&gt;(mFixedHeight) : mImplementation-&gt;getHeight();
- }

- Error Surface::bindTexImage(gl::Texture *texture, EGLint buffer)
-diff --git a/src/libANGLE/Texture.cpp b/src/libANGLE/Texture.cpp
-index 1ab5c7d..437ba0d 100644
---- a/src/libANGLE/Texture.cpp
-+++ b/src/libANGLE/Texture.cpp
-@@ -266,7 +266,7 @@ Error Texture::setStorage(GLenum target, size_t levels, GLenum internalFormat, c

-     releaseTexImage();

--    mImmutableLevelCount = levels;
-+    mImmutableLevelCount = static_cast&lt;GLsizei&gt;(levels);
-     clearImageDescs();
-     setImageDescChain(levels, size, internalFormat);

-@@ -295,16 +295,16 @@ void Texture::setImageDescChain(size_t levels, Extents baseSize, GLenum sizedInt
- {
-     for (size_t level = 0; level &lt; levels; level++)
-     {
--        Extents levelSize(std::max&lt;size_t&gt;(baseSize.width &gt;&gt; level, 1),
--                          std::max&lt;size_t&gt;(baseSize.height &gt;&gt; level, 1),
--                          (mTarget == GL_TEXTURE_2D_ARRAY) ? baseSize.depth : std::max&lt;size_t&gt;(baseSize.depth &gt;&gt; level, 1));
-+        Extents levelSize(std::max&lt;int&gt;(baseSize.width &gt;&gt; level, 1),
-+                          std::max&lt;int&gt;(baseSize.height &gt;&gt; level, 1),
-+                          (mTarget == GL_TEXTURE_2D_ARRAY) ? baseSize.depth : std::max&lt;int&gt;(baseSize.depth &gt;&gt; level, 1));
-         ImageDesc levelInfo(levelSize, sizedInternalFormat);

-         if (mTarget == GL_TEXTURE_CUBE_MAP)
-         {
-             for (size_t face = FirstCubeMapTextureTarget; face &lt;= LastCubeMapTextureTarget; face++)
-             {
--                setImageDesc(face, level, levelInfo);
-+                setImageDesc(static_cast&lt;GLenum&gt;(face), level, levelInfo);
-             }
-         }
-         else
-@@ -571,12 +571,12 @@ Texture::SamplerCompletenessCache::SamplerCompletenessCache()

- GLsizei Texture::getAttachmentWidth(const gl::FramebufferAttachment::Target &amp;target) const
- {
--    return getWidth(target.textureIndex().type, target.textureIndex().mipIndex);
-+    return static_cast&lt;GLsizei&gt;(getWidth(target.textureIndex().type, target.textureIndex().mipIndex));
- }

- GLsizei Texture::getAttachmentHeight(const gl::FramebufferAttachment::Target &amp;target) const
- {
--    return getHeight(target.textureIndex().type, target.textureIndex().mipIndex);
-+    return static_cast&lt;GLsizei&gt;(getHeight(target.textureIndex().type, target.textureIndex().mipIndex));
- }

- GLenum Texture::getAttachmentInternalFormat(const gl::FramebufferAttachment::Target &amp;target) const
-diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
-index 1896138..2a288a2 100644
---- a/src/libANGLE/validationES.cpp
-+++ b/src/libANGLE/validationES.cpp
-@@ -174,7 +174,7 @@ bool ValidMipLevel(const Context *context, GLenum target, GLint level)
-       default: UNREACHABLE();
-     }

--    return level &lt;= gl::log2(maxDimension);
-+    return level &lt;= gl::log2(static_cast&lt;int&gt;(maxDimension));
- }

- bool ValidImageSize(const Context *context, GLenum target, GLint level,
</del><ins>+       case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEcodereviewsettings"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/codereview.settings (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/codereview.settings        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/codereview.settings        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-# This file is used by gcl to get repository specific information.
-GERRIT_HOST: chromium-review.googlesource.com
-GERRIT_PORT: 29418
-CODE_REVIEW_SERVER: chromium-review.googlesource.com
</del><ins>+# This file is used by git cl to get repository specific information.
+CODE_REVIEW_SERVER: https://chromium-review.googlesource.com
+GERRIT_HOST: True
+TRYSERVER_GERRIT_URL: https://chromium-review.googlesource.com
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeEGLeglexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/EGL/eglext.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/EGL/eglext.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/EGL/eglext.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,7 +6,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> /*
</span><del>-** Copyright (c) 2013-2014 The Khronos Group Inc.
</del><ins>+** Copyright (c) 2013-2016 The Khronos Group Inc.
</ins><span class="cx"> **
</span><span class="cx"> ** Permission is hereby granted, free of charge, to any person obtaining a
</span><span class="cx"> ** copy of this software and/or associated documentation files (the
</span><span class="lines">@@ -33,12 +33,12 @@
</span><span class="cx"> ** used to make the header, and the header can be found at
</span><span class="cx"> **   http://www.opengl.org/registry/
</span><span class="cx"> **
</span><del>-** Khronos $Revision: 27018 $ on $Date: 2014-06-10 08:06:12 -0700 (Tue, 10 Jun 2014) $
</del><ins>+** Khronos $Revision: 32432 $ on $Date: 2016-02-09 23:01:07 -0800 (Tue, 09 Feb 2016) $
</ins><span class="cx"> */
</span><span class="cx"> 
</span><span class="cx"> #include &lt;EGL/eglplatform.h&gt;
</span><span class="cx"> 
</span><del>-#define EGL_EGLEXT_VERSION 20140610
</del><ins>+#define EGL_EGLEXT_VERSION 20160209
</ins><span class="cx"> 
</span><span class="cx"> /* Generated C header for:
</span><span class="cx">  * API: egl
</span><span class="lines">@@ -94,12 +94,55 @@
</span><span class="cx"> #define EGL_OPENGL_ES3_BIT_KHR            0x00000040
</span><span class="cx"> #endif /* EGL_KHR_create_context */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_KHR_create_context_no_error
+#define EGL_KHR_create_context_no_error 1
+#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR   0x31B3
+#endif /* EGL_KHR_create_context_no_error */
+
+#ifndef EGL_KHR_debug
+#define EGL_KHR_debug 1
+typedef void *EGLLabelKHR;
+typedef void *EGLObjectKHR;
+typedef void (EGLAPIENTRY  *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message);
+#define EGL_OBJECT_THREAD_KHR             0x33B0
+#define EGL_OBJECT_DISPLAY_KHR            0x33B1
+#define EGL_OBJECT_CONTEXT_KHR            0x33B2
+#define EGL_OBJECT_SURFACE_KHR            0x33B3
+#define EGL_OBJECT_IMAGE_KHR              0x33B4
+#define EGL_OBJECT_SYNC_KHR               0x33B5
+#define EGL_OBJECT_STREAM_KHR             0x33B6
+#define EGL_DEBUG_MSG_CRITICAL_KHR        0x33B9
+#define EGL_DEBUG_MSG_ERROR_KHR           0x33BA
+#define EGL_DEBUG_MSG_WARN_KHR            0x33BB
+#define EGL_DEBUG_MSG_INFO_KHR            0x33BC
+#define EGL_DEBUG_CALLBACK_KHR            0x33B8
+typedef EGLint (EGLAPIENTRYP PFNEGLDEBUGMESSAGECONTROLKHRPROC) (EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEBUGKHRPROC) (EGLint attribute, EGLAttrib *value);
+typedef EGLint (EGLAPIENTRYP PFNEGLLABELOBJECTKHRPROC) (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLint EGLAPIENTRY eglDebugMessageControlKHR (EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDebugKHR (EGLint attribute, EGLAttrib *value);
+EGLAPI EGLint EGLAPIENTRY eglLabelObjectKHR (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label);
+#endif
+#endif /* EGL_KHR_debug */
+
</ins><span class="cx"> #ifndef EGL_KHR_fence_sync
</span><span class="cx"> #define EGL_KHR_fence_sync 1
</span><ins>+typedef khronos_utime_nanoseconds_t EGLTimeKHR;
</ins><span class="cx"> #ifdef KHRONOS_SUPPORT_INT64
</span><span class="cx"> #define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0
</span><span class="cx"> #define EGL_SYNC_CONDITION_KHR            0x30F8
</span><span class="cx"> #define EGL_SYNC_FENCE_KHR                0x30F9
</span><ins>+typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync);
+typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR (EGLDisplay dpy, EGLSyncKHR sync);
+EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+#endif
</ins><span class="cx"> #endif /* KHRONOS_SUPPORT_INT64 */
</span><span class="cx"> #endif /* EGL_KHR_fence_sync */
</span><span class="cx"> 
</span><span class="lines">@@ -207,6 +250,15 @@
</span><span class="cx"> #endif
</span><span class="cx"> #endif /* EGL_KHR_lock_surface3 */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_KHR_partial_update
+#define EGL_KHR_partial_update 1
+#define EGL_BUFFER_AGE_KHR                0x313D
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglSetDamageRegionKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+#endif
+#endif /* EGL_KHR_partial_update */
+
</ins><span class="cx"> #ifndef EGL_KHR_platform_android
</span><span class="cx"> #define EGL_KHR_platform_android 1
</span><span class="cx"> #define EGL_PLATFORM_ANDROID_KHR          0x3141
</span><span class="lines">@@ -230,7 +282,6 @@
</span><span class="cx"> 
</span><span class="cx"> #ifndef EGL_KHR_reusable_sync
</span><span class="cx"> #define EGL_KHR_reusable_sync 1
</span><del>-typedef khronos_utime_nanoseconds_t EGLTimeKHR;
</del><span class="cx"> #ifdef KHRONOS_SUPPORT_INT64
</span><span class="cx"> #define EGL_SYNC_STATUS_KHR               0x30F1
</span><span class="cx"> #define EGL_SIGNALED_KHR                  0x30F2
</span><span class="lines">@@ -242,17 +293,9 @@
</span><span class="cx"> #define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR   0x0001
</span><span class="cx"> #define EGL_FOREVER_KHR                   0xFFFFFFFFFFFFFFFFull
</span><span class="cx"> #define EGL_NO_SYNC_KHR                   ((EGLSyncKHR)0)
</span><del>-typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
-typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync);
-typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
</del><span class="cx"> typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
</span><del>-typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
</del><span class="cx"> #ifdef EGL_EGLEXT_PROTOTYPES
</span><del>-EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
-EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR (EGLDisplay dpy, EGLSyncKHR sync);
-EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
</del><span class="cx"> EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
</span><del>-EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
</del><span class="cx"> #endif
</span><span class="cx"> #endif /* KHRONOS_SUPPORT_INT64 */
</span><span class="cx"> #endif /* EGL_KHR_reusable_sync */
</span><span class="lines">@@ -354,6 +397,14 @@
</span><span class="cx"> #define EGL_KHR_surfaceless_context 1
</span><span class="cx"> #endif /* EGL_KHR_surfaceless_context */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_KHR_swap_buffers_with_damage
+#define EGL_KHR_swap_buffers_with_damage 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+#endif
+#endif /* EGL_KHR_swap_buffers_with_damage */
+
</ins><span class="cx"> #ifndef EGL_KHR_vg_parent_image
</span><span class="cx"> #define EGL_KHR_vg_parent_image 1
</span><span class="cx"> #define EGL_VG_PARENT_IMAGE_KHR           0x30BA
</span><span class="lines">@@ -410,11 +461,17 @@
</span><span class="cx"> #define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200
</span><span class="cx"> #endif /* EGL_ANGLE_d3d_share_handle_client_buffer */
</span><span class="cx"> 
</span><del>-#ifndef EGL_ANGLE_window_fixed_size
-#define EGL_ANGLE_window_fixed_size 1
-#define EGL_FIXED_SIZE_ANGLE        0x3201
-#endif /* EGL_ANGLE_window_fixed_size */
</del><ins>+#ifndef EGL_ANGLE_device_d3d
+#define EGL_ANGLE_device_d3d 1
+#define EGL_D3D9_DEVICE_ANGLE             0x33A0
+#define EGL_D3D11_DEVICE_ANGLE            0x33A1
+#endif /* EGL_ANGLE_device_d3d */
</ins><span class="cx"> 
</span><ins>+#ifndef EGL_ANGLE_keyed_mutex
+#define EGL_ANGLE_keyed_mutex 1
+#define EGL_DXGI_KEYED_MUTEX_ANGLE        0x33A2
+#endif /* EGL_ANGLE_keyed_mutex */
+
</ins><span class="cx"> #ifndef EGL_ANGLE_query_surface_pointer
</span><span class="cx"> #define EGL_ANGLE_query_surface_pointer 1
</span><span class="cx"> typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);
</span><span class="lines">@@ -438,6 +495,11 @@
</span><span class="cx"> #define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1
</span><span class="cx"> #endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_ANGLE_direct_composition
+#define EGL_ANGLE_direct_composition 1
+#define EGL_DIRECT_COMPOSITION_ANGLE 0x33A5
+#endif /* EGL_ANGLE_direct_composition */
+
</ins><span class="cx"> #ifndef EGL_ANGLE_platform_angle
</span><span class="cx"> #define EGL_ANGLE_platform_angle 1
</span><span class="cx"> #define EGL_PLATFORM_ANGLE_ANGLE          0x3202
</span><span class="lines">@@ -464,12 +526,47 @@
</span><span class="cx"> #define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320E
</span><span class="cx"> #endif /* EGL_ANGLE_platform_angle_opengl */
</span><span class="cx"> 
</span><del>-#ifndef EGL_ANGLE_device_d3d
-#define EGL_ANGLE_device_d3d 1
-#define EGL_D3D9_DEVICE_ANGLE             0x33A0
-#define EGL_D3D11_DEVICE_ANGLE            0x33A1
-#endif /* EGL_ANGLE_device_d3d */
</del><ins>+#ifndef EGL_ANGLE_window_fixed_size
+#define EGL_ANGLE_window_fixed_size 1
+#define EGL_FIXED_SIZE_ANGLE              0x3201
+#endif /* EGL_ANGLE_window_fixed_size */
</ins><span class="cx"> 
</span><ins>+#ifndef EGL_ANGLE_x11_visual
+#define EGL_ANGLE_x11_visual
+#define EGL_X11_VISUAL_ID_ANGLE 0x33A3
+#endif /* EGL_ANGLE_x11_visual */
+
+#ifndef EGL_ANGLE_flexible_surface_compatibility
+#define EGL_ANGLE_flexible_surface_compatibility 1
+#define EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE 0x33A6
+#endif /* EGL_ANGLE_flexible_surface_compatibility */
+
+#ifndef EGL_ANGLE_surface_orientation
+#define EGL_ANGLE_surface_orientation
+#define EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE 0x33A7
+#define EGL_SURFACE_ORIENTATION_ANGLE 0x33A8
+#define EGL_SURFACE_ORIENTATION_INVERT_X_ANGLE 0x0001
+#define EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE 0x0002
+#endif /* EGL_ANGLE_surface_orientation */
+
+#ifndef EGL_ANGLE_experimental_present_path
+#define EGL_ANGLE_experimental_present_path
+#define EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE 0x33A4
+#define EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE 0x33A9
+#define EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE 0x33AA
+#endif /* EGL_ANGLE_experimental_present_path */
+
+#ifndef EGL_ANGLE_stream_producer_d3d_texture_nv12
+#define EGL_ANGLE_stream_producer_d3d_texture_nv12
+#define EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE 0x3AAB
+typedef EGLBoolean(EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERD3DTEXTURENV12ANGLEPROC)(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+typedef EGLBoolean(EGLAPIENTRYP PFNEGLSTREAMPOSTD3DTEXTURENV12ANGLEPROC)(EGLDisplay dpy, EGLStreamKHR stream, void *texture, const EGLAttrib *attrib_list);
+#ifdef EGL_EXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglCreateStreamProducerD3DTextureNV12ANGLE(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamPostD3DTextureNV12ANGLE(EGLDisplay dpy, EGLStreamKHR stream, void *texture, const EGLAttrib *attrib_list);
+#endif
+#endif /* EGL_ANGLE_stream_producer_d3d_texture_nv12 */
+
</ins><span class="cx"> #ifndef EGL_ARM_pixmap_multisample_discard
</span><span class="cx"> #define EGL_ARM_pixmap_multisample_discard 1
</span><span class="cx"> #define EGL_DISCARD_SAMPLES_ARM           0x3286
</span><span class="lines">@@ -510,6 +607,30 @@
</span><span class="cx"> #endif
</span><span class="cx"> #endif /* EGL_EXT_device_base */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_ANGLE_device_creation
+#define EGL_ANGLE_device_creation 1
+typedef EGLDeviceEXT (EGLAPIENTRYP PFNEGLCREATEDEVICEANGLEPROC) (EGLint device_type, void *native_device, const EGLAttrib *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASEDEVICEANGLEPROC) (EGLDeviceEXT device);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLDeviceEXT EGLAPIENTRY eglCreateDeviceANGLE (EGLint device_type, void *native_device, const EGLAttrib *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglReleaseDeviceANGLE (EGLDeviceEXT device);
+#endif
+#endif /* EGL_ANGLE_device_creation */
+
+#ifndef EGL_EXT_device_drm
+#define EGL_EXT_device_drm 1
+#define EGL_DRM_DEVICE_FILE_EXT           0x3233
+#endif /* EGL_EXT_device_drm */
+
+#ifndef EGL_EXT_device_enumeration
+#define EGL_EXT_device_enumeration 1
+#endif /* EGL_EXT_device_enumeration */
+
+#ifndef EGL_EXT_device_openwf
+#define EGL_EXT_device_openwf 1
+#define EGL_OPENWF_DEVICE_ID_EXT          0x3237
+#endif /* EGL_EXT_device_openwf */
+
</ins><span class="cx"> #ifndef EGL_EXT_device_query
</span><span class="cx"> #define EGL_EXT_device_query 1
</span><span class="cx"> #endif /* EGL_EXT_device_query */
</span><span class="lines">@@ -545,6 +666,48 @@
</span><span class="cx"> #define EGL_MULTIVIEW_VIEW_COUNT_EXT      0x3134
</span><span class="cx"> #endif /* EGL_EXT_multiview_window */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_EXT_output_base
+#define EGL_EXT_output_base 1
+typedef void *EGLOutputLayerEXT;
+typedef void *EGLOutputPortEXT;
+#define EGL_NO_OUTPUT_LAYER_EXT           ((EGLOutputLayerEXT)0)
+#define EGL_NO_OUTPUT_PORT_EXT            ((EGLOutputPortEXT)0)
+#define EGL_BAD_OUTPUT_LAYER_EXT          0x322D
+#define EGL_BAD_OUTPUT_PORT_EXT           0x322E
+#define EGL_SWAP_INTERVAL_EXT             0x322F
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value);
+typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value);
+typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputLayersEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputPortsEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports);
+EGLAPI EGLBoolean EGLAPIENTRY eglOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value);
+EGLAPI const char *EGLAPIENTRY eglQueryOutputLayerStringEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name);
+EGLAPI EGLBoolean EGLAPIENTRY eglOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value);
+EGLAPI const char *EGLAPIENTRY eglQueryOutputPortStringEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name);
+#endif
+#endif /* EGL_EXT_output_base */
+
+#ifndef EGL_EXT_output_drm
+#define EGL_EXT_output_drm 1
+#define EGL_DRM_CRTC_EXT                  0x3234
+#define EGL_DRM_PLANE_EXT                 0x3235
+#define EGL_DRM_CONNECTOR_EXT             0x3236
+#endif /* EGL_EXT_output_drm */
+
+#ifndef EGL_EXT_output_openwf
+#define EGL_EXT_output_openwf 1
+#define EGL_OPENWF_PIPELINE_ID_EXT        0x3238
+#define EGL_OPENWF_PORT_ID_EXT            0x3239
+#endif /* EGL_EXT_output_openwf */
+
</ins><span class="cx"> #ifndef EGL_EXT_platform_base
</span><span class="cx"> #define EGL_EXT_platform_base 1
</span><span class="cx"> typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *native_display, const EGLint *attrib_list);
</span><span class="lines">@@ -578,6 +741,14 @@
</span><span class="cx"> #define EGL_PROTECTED_CONTENT_EXT         0x32C0
</span><span class="cx"> #endif /* EGL_EXT_protected_surface */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_EXT_stream_consumer_egloutput
+#define EGL_EXT_stream_consumer_egloutput 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerOutputEXT (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer);
+#endif
+#endif /* EGL_EXT_stream_consumer_egloutput */
+
</ins><span class="cx"> #ifndef EGL_EXT_swap_buffers_with_damage
</span><span class="cx"> #define EGL_EXT_swap_buffers_with_damage 1
</span><span class="cx"> typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
</span><span class="lines">@@ -586,6 +757,35 @@
</span><span class="cx"> #endif
</span><span class="cx"> #endif /* EGL_EXT_swap_buffers_with_damage */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_EXT_yuv_surface
+#define EGL_EXT_yuv_surface 1
+#define EGL_YUV_ORDER_EXT                 0x3301
+#define EGL_YUV_NUMBER_OF_PLANES_EXT      0x3311
+#define EGL_YUV_SUBSAMPLE_EXT             0x3312
+#define EGL_YUV_DEPTH_RANGE_EXT           0x3317
+#define EGL_YUV_CSC_STANDARD_EXT          0x330A
+#define EGL_YUV_PLANE_BPP_EXT             0x331A
+#define EGL_YUV_BUFFER_EXT                0x3300
+#define EGL_YUV_ORDER_YUV_EXT             0x3302
+#define EGL_YUV_ORDER_YVU_EXT             0x3303
+#define EGL_YUV_ORDER_YUYV_EXT            0x3304
+#define EGL_YUV_ORDER_UYVY_EXT            0x3305
+#define EGL_YUV_ORDER_YVYU_EXT            0x3306
+#define EGL_YUV_ORDER_VYUY_EXT            0x3307
+#define EGL_YUV_ORDER_AYUV_EXT            0x3308
+#define EGL_YUV_SUBSAMPLE_4_2_0_EXT       0x3313
+#define EGL_YUV_SUBSAMPLE_4_2_2_EXT       0x3314
+#define EGL_YUV_SUBSAMPLE_4_4_4_EXT       0x3315
+#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT   0x3318
+#define EGL_YUV_DEPTH_RANGE_FULL_EXT      0x3319
+#define EGL_YUV_CSC_STANDARD_601_EXT      0x330B
+#define EGL_YUV_CSC_STANDARD_709_EXT      0x330C
+#define EGL_YUV_CSC_STANDARD_2020_EXT     0x330D
+#define EGL_YUV_PLANE_BPP_0_EXT           0x331B
+#define EGL_YUV_PLANE_BPP_8_EXT           0x331C
+#define EGL_YUV_PLANE_BPP_10_EXT          0x331D
+#endif /* EGL_EXT_yuv_surface */
+
</ins><span class="cx"> #ifndef EGL_HI_clientpixmap
</span><span class="cx"> #define EGL_HI_clientpixmap 1
</span><span class="cx"> struct EGLClientPixmapHI {
</span><span class="lines">@@ -617,6 +817,12 @@
</span><span class="cx"> #define EGL_CONTEXT_PRIORITY_LOW_IMG      0x3103
</span><span class="cx"> #endif /* EGL_IMG_context_priority */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_IMG_image_plane_attribs
+#define EGL_IMG_image_plane_attribs 1
+#define EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG 0x3105
+#define EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG 0x3106
+#endif /* EGL_IMG_image_plane_attribs */
+
</ins><span class="cx"> #ifndef EGL_MESA_drm_image
</span><span class="cx"> #define EGL_MESA_drm_image 1
</span><span class="cx"> #define EGL_DRM_BUFFER_FORMAT_MESA        0x31D0
</span><span class="lines">@@ -634,6 +840,16 @@
</span><span class="cx"> #endif
</span><span class="cx"> #endif /* EGL_MESA_drm_image */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_MESA_image_dma_buf_export
+#define EGL_MESA_image_dma_buf_export 1
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageQueryMESA (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers);
+EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageMESA (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets);
+#endif
+#endif /* EGL_MESA_image_dma_buf_export */
+
</ins><span class="cx"> #ifndef EGL_MESA_platform_gbm
</span><span class="cx"> #define EGL_MESA_platform_gbm 1
</span><span class="cx"> #define EGL_PLATFORM_GBM_MESA             0x31D7
</span><span class="lines">@@ -678,6 +894,13 @@
</span><span class="cx"> #define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133
</span><span class="cx"> #endif /* EGL_NV_coverage_sample_resolve */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_NV_cuda_event
+#define EGL_NV_cuda_event 1
+#define EGL_CUDA_EVENT_HANDLE_NV          0x323B
+#define EGL_SYNC_CUDA_EVENT_NV            0x323C
+#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV   0x323D
+#endif /* EGL_NV_cuda_event */
+
</ins><span class="cx"> #ifndef EGL_NV_depth_nonlinear
</span><span class="cx"> #define EGL_NV_depth_nonlinear 1
</span><span class="cx"> #define EGL_DEPTH_ENCODING_NV             0x30E2
</span><span class="lines">@@ -685,6 +908,11 @@
</span><span class="cx"> #define EGL_DEPTH_ENCODING_NONLINEAR_NV   0x30E3
</span><span class="cx"> #endif /* EGL_NV_depth_nonlinear */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_NV_device_cuda
+#define EGL_NV_device_cuda 1
+#define EGL_CUDA_DEVICE_NV                0x323A
+#endif /* EGL_NV_device_cuda */
+
</ins><span class="cx"> #ifndef EGL_NV_native_query
</span><span class="cx"> #define EGL_NV_native_query 1
</span><span class="cx"> typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType *display_id);
</span><span class="lines">@@ -710,6 +938,43 @@
</span><span class="cx"> #endif
</span><span class="cx"> #endif /* EGL_NV_post_sub_buffer */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_NV_stream_consumer_gltexture_yuv
+#define EGL_NV_stream_consumer_gltexture_yuv 1
+#define EGL_YUV_PLANE0_TEXTURE_UNIT_NV    0x332C
+#define EGL_YUV_PLANE1_TEXTURE_UNIT_NV    0x332D
+#define EGL_YUV_PLANE2_TEXTURE_UNIT_NV    0x332E
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLAttrib *attrib_list);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV (EGLDisplay dpy, EGLStreamKHR stream, EGLAttrib *attrib_list);
+#endif
+#endif /* EGL_NV_stream_consumer_gltexture_yuv */
+
+#ifndef EGL_NV_stream_metadata
+#define EGL_NV_stream_metadata 1
+#define EGL_MAX_STREAM_METADATA_BLOCKS_NV 0x3250
+#define EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV 0x3251
+#define EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV 0x3252
+#define EGL_PRODUCER_METADATA_NV          0x3253
+#define EGL_CONSUMER_METADATA_NV          0x3254
+#define EGL_PENDING_METADATA_NV           0x3328
+#define EGL_METADATA0_SIZE_NV             0x3255
+#define EGL_METADATA1_SIZE_NV             0x3256
+#define EGL_METADATA2_SIZE_NV             0x3257
+#define EGL_METADATA3_SIZE_NV             0x3258
+#define EGL_METADATA0_TYPE_NV             0x3259
+#define EGL_METADATA1_TYPE_NV             0x325A
+#define EGL_METADATA2_TYPE_NV             0x325B
+#define EGL_METADATA3_TYPE_NV             0x325C
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBNVPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data);
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribNV (EGLDisplay dpy, EGLint attribute, EGLAttrib *value);
+EGLAPI EGLBoolean EGLAPIENTRY eglSetStreamMetadataNV (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamMetadataNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data);
+#endif
+#endif /* EGL_NV_stream_metadata */
+
</ins><span class="cx"> #ifndef EGL_NV_stream_sync
</span><span class="cx"> #define EGL_NV_stream_sync 1
</span><span class="cx"> #define EGL_SYNC_NEW_FRAME_NV             0x321F
</span><span class="lines">@@ -767,6 +1032,16 @@
</span><span class="cx"> #endif /* KHRONOS_SUPPORT_INT64 */
</span><span class="cx"> #endif /* EGL_NV_system_time */
</span><span class="cx"> 
</span><ins>+#ifndef EGL_TIZEN_image_native_buffer
+#define EGL_TIZEN_image_native_buffer 1
+#define EGL_NATIVE_BUFFER_TIZEN           0x32A0
+#endif /* EGL_TIZEN_image_native_buffer */
+
+#ifndef EGL_TIZEN_image_native_surface
+#define EGL_TIZEN_image_native_surface 1
+#define EGL_NATIVE_SURFACE_TIZEN          0x32A1
+#endif /* EGL_TIZEN_image_native_surface */
+
</ins><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> }
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeEGLeglplatformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/EGL/eglplatform.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/EGL/eglplatform.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/EGL/eglplatform.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx"> */
</span><span class="cx"> 
</span><span class="cx"> /* Platform-specific types and definitions for egl.h
</span><del>- * $Revision: 23432 $ on $Date: 2013-10-09 00:57:24 -0700 (Wed, 09 Oct 2013) $
</del><ins>+ * $Revision: 30994 $ on $Date: 2015-04-30 13:36:48 -0700 (Thu, 30 Apr 2015) $
</ins><span class="cx">  *
</span><span class="cx">  * Adopters may modify khrplatform.h and this file to suit their platform.
</span><span class="cx">  * You are encouraged to submit all modifications to the Khronos group so that
</span><span class="lines">@@ -99,6 +99,12 @@
</span><span class="cx"> typedef struct egl_native_pixmap_t*     EGLNativePixmapType;
</span><span class="cx"> typedef void*                           EGLNativeDisplayType;
</span><span class="cx"> 
</span><ins>+#elif defined(USE_OZONE)
+
+typedef intptr_t EGLNativeDisplayType;
+typedef intptr_t EGLNativeWindowType;
+typedef intptr_t EGLNativePixmapType;
+
</ins><span class="cx"> #elif defined(__unix__)
</span><span class="cx"> 
</span><span class="cx"> /* X11 (tentative)  */
</span><span class="lines">@@ -111,11 +117,15 @@
</span><span class="cx"> 
</span><span class="cx"> #elif defined(__GNUC__) &amp;&amp; ( defined(__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__MACOS_CLASSIC__) )
</span><span class="cx"> 
</span><del>-// TODO(jmadill): native implementation for OSX
</del><ins>+#if defined(__OBJC__)
+@class CALayer;
+#else
+class CALayer;
+#endif
</ins><span class="cx"> 
</span><span class="cx"> typedef void *EGLNativeDisplayType;
</span><span class="cx"> typedef void *EGLNativePixmapType;
</span><del>-typedef void *EGLNativeWindowType;
</del><ins>+typedef CALayer *EGLNativeWindowType;
</ins><span class="cx"> 
</span><span class="cx"> #else
</span><span class="cx"> #error &quot;Platform not recognized&quot;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeGLES2gl2h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,56 +1,87 @@
</span><span class="cx"> #ifndef __gl2_h_
</span><del>-#define __gl2_h_
</del><ins>+#define __gl2_h_ 1
</ins><span class="cx"> 
</span><del>-/* $Revision: 20555 $ on $Date:: 2013-02-12 14:32:47 -0800 #$ */
-
-#include &lt;GLES2/gl2platform.h&gt;
-
</del><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> extern &quot;C&quot; {
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> /*
</span><del>- * This document is licensed under the SGI Free Software B License Version
- * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
- */
</del><ins>+** Copyright (c) 2013-2015 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** &quot;Materials&quot;), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+**   http://www.opengl.org/registry/
+**
+** Khronos $Revision: 31811 $ on $Date: 2015-08-10 00:01:11 -0700 (Mon, 10 Aug 2015) $
+*/
</ins><span class="cx"> 
</span><del>-/*-------------------------------------------------------------------------
- * Data type definitions
- *-----------------------------------------------------------------------*/
</del><ins>+#include &lt;GLES2/gl2platform.h&gt;
</ins><span class="cx"> 
</span><del>-typedef void             GLvoid;
-typedef char             GLchar;
-typedef unsigned int     GLenum;
-typedef unsigned char    GLboolean;
-typedef unsigned int     GLbitfield;
-typedef khronos_int8_t   GLbyte;
-typedef short            GLshort;
-typedef int              GLint;
-typedef int              GLsizei;
-typedef khronos_uint8_t  GLubyte;
-typedef unsigned short   GLushort;
-typedef unsigned int     GLuint;
-typedef khronos_float_t  GLfloat;
-typedef khronos_float_t  GLclampf;
-typedef khronos_int32_t  GLfixed;
</del><ins>+#ifndef GL_APIENTRYP
+#define GL_APIENTRYP GL_APIENTRY*
+#endif
</ins><span class="cx"> 
</span><del>-/* GL types for handling large vertex buffer objects */
-typedef khronos_intptr_t GLintptr;
-typedef khronos_ssize_t  GLsizeiptr;
</del><ins>+/* Generated on date 20150809 */
</ins><span class="cx"> 
</span><del>-/* OpenGL ES core versions */
-#define GL_ES_VERSION_2_0                 1
</del><ins>+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
</ins><span class="cx"> 
</span><del>-/* ClearBufferMask */
</del><ins>+#ifndef GL_ES_VERSION_2_0
+#define GL_ES_VERSION_2_0 1
+#include &lt;KHR/khrplatform.h&gt;
+typedef khronos_int8_t GLbyte;
+typedef khronos_float_t GLclampf;
+typedef khronos_int32_t GLfixed;
+typedef short GLshort;
+typedef unsigned short GLushort;
+typedef void GLvoid;
+typedef struct __GLsync *GLsync;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef unsigned int GLenum;
+typedef unsigned int GLuint;
+typedef char GLchar;
+typedef khronos_float_t GLfloat;
+typedef khronos_ssize_t GLsizeiptr;
+typedef khronos_intptr_t GLintptr;
+typedef unsigned int GLbitfield;
+typedef int GLint;
+typedef unsigned char GLboolean;
+typedef int GLsizei;
+typedef khronos_uint8_t GLubyte;
</ins><span class="cx"> #define GL_DEPTH_BUFFER_BIT               0x00000100
</span><span class="cx"> #define GL_STENCIL_BUFFER_BIT             0x00000400
</span><span class="cx"> #define GL_COLOR_BUFFER_BIT               0x00004000
</span><del>-
-/* Boolean */
</del><span class="cx"> #define GL_FALSE                          0
</span><span class="cx"> #define GL_TRUE                           1
</span><del>-
-/* BeginMode */
</del><span class="cx"> #define GL_POINTS                         0x0000
</span><span class="cx"> #define GL_LINES                          0x0001
</span><span class="cx"> #define GL_LINE_LOOP                      0x0002
</span><span class="lines">@@ -58,18 +89,6 @@
</span><span class="cx"> #define GL_TRIANGLES                      0x0004
</span><span class="cx"> #define GL_TRIANGLE_STRIP                 0x0005
</span><span class="cx"> #define GL_TRIANGLE_FAN                   0x0006
</span><del>-
-/* AlphaFunction (not supported in ES20) */
-/*      GL_NEVER */
-/*      GL_LESS */
-/*      GL_EQUAL */
-/*      GL_LEQUAL */
-/*      GL_GREATER */
-/*      GL_NOTEQUAL */
-/*      GL_GEQUAL */
-/*      GL_ALWAYS */
-
-/* BlendingFactorDest */
</del><span class="cx"> #define GL_ZERO                           0
</span><span class="cx"> #define GL_ONE                            1
</span><span class="cx"> #define GL_SRC_COLOR                      0x0300
</span><span class="lines">@@ -78,29 +97,15 @@
</span><span class="cx"> #define GL_ONE_MINUS_SRC_ALPHA            0x0303
</span><span class="cx"> #define GL_DST_ALPHA                      0x0304
</span><span class="cx"> #define GL_ONE_MINUS_DST_ALPHA            0x0305
</span><del>-
-/* BlendingFactorSrc */
-/*      GL_ZERO */
-/*      GL_ONE */
</del><span class="cx"> #define GL_DST_COLOR                      0x0306
</span><span class="cx"> #define GL_ONE_MINUS_DST_COLOR            0x0307
</span><span class="cx"> #define GL_SRC_ALPHA_SATURATE             0x0308
</span><del>-/*      GL_SRC_ALPHA */
-/*      GL_ONE_MINUS_SRC_ALPHA */
-/*      GL_DST_ALPHA */
-/*      GL_ONE_MINUS_DST_ALPHA */
-
-/* BlendEquationSeparate */
</del><span class="cx"> #define GL_FUNC_ADD                       0x8006
</span><span class="cx"> #define GL_BLEND_EQUATION                 0x8009
</span><del>-#define GL_BLEND_EQUATION_RGB             0x8009    /* same as BLEND_EQUATION */
</del><ins>+#define GL_BLEND_EQUATION_RGB             0x8009
</ins><span class="cx"> #define GL_BLEND_EQUATION_ALPHA           0x883D
</span><del>-
-/* BlendSubtract */
</del><span class="cx"> #define GL_FUNC_SUBTRACT                  0x800A
</span><span class="cx"> #define GL_FUNC_REVERSE_SUBTRACT          0x800B
</span><del>-
-/* Separate Blend Functions */
</del><span class="cx"> #define GL_BLEND_DST_RGB                  0x80C8
</span><span class="cx"> #define GL_BLEND_SRC_RGB                  0x80C9
</span><span class="cx"> #define GL_BLEND_DST_ALPHA                0x80CA
</span><span class="lines">@@ -110,38 +115,19 @@
</span><span class="cx"> #define GL_CONSTANT_ALPHA                 0x8003
</span><span class="cx"> #define GL_ONE_MINUS_CONSTANT_ALPHA       0x8004
</span><span class="cx"> #define GL_BLEND_COLOR                    0x8005
</span><del>-
-/* Buffer Objects */
</del><span class="cx"> #define GL_ARRAY_BUFFER                   0x8892
</span><span class="cx"> #define GL_ELEMENT_ARRAY_BUFFER           0x8893
</span><span class="cx"> #define GL_ARRAY_BUFFER_BINDING           0x8894
</span><span class="cx"> #define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895
</span><del>-
</del><span class="cx"> #define GL_STREAM_DRAW                    0x88E0
</span><span class="cx"> #define GL_STATIC_DRAW                    0x88E4
</span><span class="cx"> #define GL_DYNAMIC_DRAW                   0x88E8
</span><del>-
</del><span class="cx"> #define GL_BUFFER_SIZE                    0x8764
</span><span class="cx"> #define GL_BUFFER_USAGE                   0x8765
</span><del>-
</del><span class="cx"> #define GL_CURRENT_VERTEX_ATTRIB          0x8626
</span><del>-
-/* CullFaceMode */
</del><span class="cx"> #define GL_FRONT                          0x0404
</span><span class="cx"> #define GL_BACK                           0x0405
</span><span class="cx"> #define GL_FRONT_AND_BACK                 0x0408
</span><del>-
-/* DepthFunction */
-/*      GL_NEVER */
-/*      GL_LESS */
-/*      GL_EQUAL */
-/*      GL_LEQUAL */
-/*      GL_GREATER */
-/*      GL_NOTEQUAL */
-/*      GL_GEQUAL */
-/*      GL_ALWAYS */
-
-/* EnableCap */
</del><span class="cx"> #define GL_TEXTURE_2D                     0x0DE1
</span><span class="cx"> #define GL_CULL_FACE                      0x0B44
</span><span class="cx"> #define GL_BLEND                          0x0BE2
</span><span class="lines">@@ -152,19 +138,13 @@
</span><span class="cx"> #define GL_POLYGON_OFFSET_FILL            0x8037
</span><span class="cx"> #define GL_SAMPLE_ALPHA_TO_COVERAGE       0x809E
</span><span class="cx"> #define GL_SAMPLE_COVERAGE                0x80A0
</span><del>-
-/* ErrorCode */
</del><span class="cx"> #define GL_NO_ERROR                       0
</span><span class="cx"> #define GL_INVALID_ENUM                   0x0500
</span><span class="cx"> #define GL_INVALID_VALUE                  0x0501
</span><span class="cx"> #define GL_INVALID_OPERATION              0x0502
</span><span class="cx"> #define GL_OUT_OF_MEMORY                  0x0505
</span><del>-
-/* FrontFaceDirection */
</del><span class="cx"> #define GL_CW                             0x0900
</span><span class="cx"> #define GL_CCW                            0x0901
</span><del>-
-/* GetPName */
</del><span class="cx"> #define GL_LINE_WIDTH                     0x0B21
</span><span class="cx"> #define GL_ALIASED_POINT_SIZE_RANGE       0x846D
</span><span class="cx"> #define GL_ALIASED_LINE_WIDTH_RANGE       0x846E
</span><span class="lines">@@ -191,7 +171,6 @@
</span><span class="cx"> #define GL_STENCIL_BACK_WRITEMASK         0x8CA5
</span><span class="cx"> #define GL_VIEWPORT                       0x0BA2
</span><span class="cx"> #define GL_SCISSOR_BOX                    0x0C10
</span><del>-/*      GL_SCISSOR_TEST */
</del><span class="cx"> #define GL_COLOR_CLEAR_VALUE              0x0C22
</span><span class="cx"> #define GL_COLOR_WRITEMASK                0x0C23
</span><span class="cx"> #define GL_UNPACK_ALIGNMENT               0x0CF5
</span><span class="lines">@@ -206,32 +185,18 @@
</span><span class="cx"> #define GL_DEPTH_BITS                     0x0D56
</span><span class="cx"> #define GL_STENCIL_BITS                   0x0D57
</span><span class="cx"> #define GL_POLYGON_OFFSET_UNITS           0x2A00
</span><del>-/*      GL_POLYGON_OFFSET_FILL */
</del><span class="cx"> #define GL_POLYGON_OFFSET_FACTOR          0x8038
</span><span class="cx"> #define GL_TEXTURE_BINDING_2D             0x8069
</span><span class="cx"> #define GL_SAMPLE_BUFFERS                 0x80A8
</span><span class="cx"> #define GL_SAMPLES                        0x80A9
</span><span class="cx"> #define GL_SAMPLE_COVERAGE_VALUE          0x80AA
</span><span class="cx"> #define GL_SAMPLE_COVERAGE_INVERT         0x80AB
</span><del>-
-/* GetTextureParameter */
-/*      GL_TEXTURE_MAG_FILTER */
-/*      GL_TEXTURE_MIN_FILTER */
-/*      GL_TEXTURE_WRAP_S */
-/*      GL_TEXTURE_WRAP_T */
-
</del><span class="cx"> #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
</span><span class="cx"> #define GL_COMPRESSED_TEXTURE_FORMATS     0x86A3
</span><del>-
-/* HintMode */
</del><span class="cx"> #define GL_DONT_CARE                      0x1100
</span><span class="cx"> #define GL_FASTEST                        0x1101
</span><span class="cx"> #define GL_NICEST                         0x1102
</span><del>-
-/* HintTarget */
-#define GL_GENERATE_MIPMAP_HINT            0x8192
-
-/* DataType */
</del><ins>+#define GL_GENERATE_MIPMAP_HINT           0x8192
</ins><span class="cx"> #define GL_BYTE                           0x1400
</span><span class="cx"> #define GL_UNSIGNED_BYTE                  0x1401
</span><span class="cx"> #define GL_SHORT                          0x1402
</span><span class="lines">@@ -240,44 +205,35 @@
</span><span class="cx"> #define GL_UNSIGNED_INT                   0x1405
</span><span class="cx"> #define GL_FLOAT                          0x1406
</span><span class="cx"> #define GL_FIXED                          0x140C
</span><del>-
-/* PixelFormat */
</del><span class="cx"> #define GL_DEPTH_COMPONENT                0x1902
</span><span class="cx"> #define GL_ALPHA                          0x1906
</span><span class="cx"> #define GL_RGB                            0x1907
</span><span class="cx"> #define GL_RGBA                           0x1908
</span><span class="cx"> #define GL_LUMINANCE                      0x1909
</span><span class="cx"> #define GL_LUMINANCE_ALPHA                0x190A
</span><del>-
-/* PixelType */
-/*      GL_UNSIGNED_BYTE */
</del><span class="cx"> #define GL_UNSIGNED_SHORT_4_4_4_4         0x8033
</span><span class="cx"> #define GL_UNSIGNED_SHORT_5_5_5_1         0x8034
</span><span class="cx"> #define GL_UNSIGNED_SHORT_5_6_5           0x8363
</span><del>-
-/* Shaders */
-#define GL_FRAGMENT_SHADER                  0x8B30
-#define GL_VERTEX_SHADER                    0x8B31
-#define GL_MAX_VERTEX_ATTRIBS               0x8869
-#define GL_MAX_VERTEX_UNIFORM_VECTORS       0x8DFB
-#define GL_MAX_VARYING_VECTORS              0x8DFC
</del><ins>+#define GL_FRAGMENT_SHADER                0x8B30
+#define GL_VERTEX_SHADER                  0x8B31
+#define GL_MAX_VERTEX_ATTRIBS             0x8869
+#define GL_MAX_VERTEX_UNIFORM_VECTORS     0x8DFB
+#define GL_MAX_VARYING_VECTORS            0x8DFC
</ins><span class="cx"> #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
</span><del>-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS   0x8B4C
-#define GL_MAX_TEXTURE_IMAGE_UNITS          0x8872
-#define GL_MAX_FRAGMENT_UNIFORM_VECTORS     0x8DFD
-#define GL_SHADER_TYPE                      0x8B4F
-#define GL_DELETE_STATUS                    0x8B80
-#define GL_LINK_STATUS                      0x8B82
-#define GL_VALIDATE_STATUS                  0x8B83
-#define GL_ATTACHED_SHADERS                 0x8B85
-#define GL_ACTIVE_UNIFORMS                  0x8B86
-#define GL_ACTIVE_UNIFORM_MAX_LENGTH        0x8B87
-#define GL_ACTIVE_ATTRIBUTES                0x8B89
-#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH      0x8B8A
-#define GL_SHADING_LANGUAGE_VERSION         0x8B8C
-#define GL_CURRENT_PROGRAM                  0x8B8D
-
-/* StencilFunction */
</del><ins>+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_TEXTURE_IMAGE_UNITS        0x8872
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS   0x8DFD
+#define GL_SHADER_TYPE                    0x8B4F
+#define GL_DELETE_STATUS                  0x8B80
+#define GL_LINK_STATUS                    0x8B82
+#define GL_VALIDATE_STATUS                0x8B83
+#define GL_ATTACHED_SHADERS               0x8B85
+#define GL_ACTIVE_UNIFORMS                0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH      0x8B87
+#define GL_ACTIVE_ATTRIBUTES              0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH    0x8B8A
+#define GL_SHADING_LANGUAGE_VERSION       0x8B8C
+#define GL_CURRENT_PROGRAM                0x8B8D
</ins><span class="cx"> #define GL_NEVER                          0x0200
</span><span class="cx"> #define GL_LESS                           0x0201
</span><span class="cx"> #define GL_EQUAL                          0x0202
</span><span class="lines">@@ -286,9 +242,6 @@
</span><span class="cx"> #define GL_NOTEQUAL                       0x0205
</span><span class="cx"> #define GL_GEQUAL                         0x0206
</span><span class="cx"> #define GL_ALWAYS                         0x0207
</span><del>-
-/* StencilOp */
-/*      GL_ZERO */
</del><span class="cx"> #define GL_KEEP                           0x1E00
</span><span class="cx"> #define GL_REPLACE                        0x1E01
</span><span class="cx"> #define GL_INCR                           0x1E02
</span><span class="lines">@@ -296,35 +249,21 @@
</span><span class="cx"> #define GL_INVERT                         0x150A
</span><span class="cx"> #define GL_INCR_WRAP                      0x8507
</span><span class="cx"> #define GL_DECR_WRAP                      0x8508
</span><del>-
-/* StringName */
</del><span class="cx"> #define GL_VENDOR                         0x1F00
</span><span class="cx"> #define GL_RENDERER                       0x1F01
</span><span class="cx"> #define GL_VERSION                        0x1F02
</span><span class="cx"> #define GL_EXTENSIONS                     0x1F03
</span><del>-
-/* TextureMagFilter */
</del><span class="cx"> #define GL_NEAREST                        0x2600
</span><span class="cx"> #define GL_LINEAR                         0x2601
</span><del>-
-/* TextureMinFilter */
-/*      GL_NEAREST */
-/*      GL_LINEAR */
</del><span class="cx"> #define GL_NEAREST_MIPMAP_NEAREST         0x2700
</span><span class="cx"> #define GL_LINEAR_MIPMAP_NEAREST          0x2701
</span><span class="cx"> #define GL_NEAREST_MIPMAP_LINEAR          0x2702
</span><span class="cx"> #define GL_LINEAR_MIPMAP_LINEAR           0x2703
</span><del>-
-/* TextureParameterName */
</del><span class="cx"> #define GL_TEXTURE_MAG_FILTER             0x2800
</span><span class="cx"> #define GL_TEXTURE_MIN_FILTER             0x2801
</span><span class="cx"> #define GL_TEXTURE_WRAP_S                 0x2802
</span><span class="cx"> #define GL_TEXTURE_WRAP_T                 0x2803
</span><del>-
-/* TextureTarget */
-/*      GL_TEXTURE_2D */
</del><span class="cx"> #define GL_TEXTURE                        0x1702
</span><del>-
</del><span class="cx"> #define GL_TEXTURE_CUBE_MAP               0x8513
</span><span class="cx"> #define GL_TEXTURE_BINDING_CUBE_MAP       0x8514
</span><span class="cx"> #define GL_TEXTURE_CUBE_MAP_POSITIVE_X    0x8515
</span><span class="lines">@@ -334,8 +273,6 @@
</span><span class="cx"> #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z    0x8519
</span><span class="cx"> #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z    0x851A
</span><span class="cx"> #define GL_MAX_CUBE_MAP_TEXTURE_SIZE      0x851C
</span><del>-
-/* TextureUnit */
</del><span class="cx"> #define GL_TEXTURE0                       0x84C0
</span><span class="cx"> #define GL_TEXTURE1                       0x84C1
</span><span class="cx"> #define GL_TEXTURE2                       0x84C2
</span><span class="lines">@@ -369,13 +306,9 @@
</span><span class="cx"> #define GL_TEXTURE30                      0x84DE
</span><span class="cx"> #define GL_TEXTURE31                      0x84DF
</span><span class="cx"> #define GL_ACTIVE_TEXTURE                 0x84E0
</span><del>-
-/* TextureWrapMode */
</del><span class="cx"> #define GL_REPEAT                         0x2901
</span><span class="cx"> #define GL_CLAMP_TO_EDGE                  0x812F
</span><span class="cx"> #define GL_MIRRORED_REPEAT                0x8370
</span><del>-
-/* Uniform Types */
</del><span class="cx"> #define GL_FLOAT_VEC2                     0x8B50
</span><span class="cx"> #define GL_FLOAT_VEC3                     0x8B51
</span><span class="cx"> #define GL_FLOAT_VEC4                     0x8B52
</span><span class="lines">@@ -391,48 +324,34 @@
</span><span class="cx"> #define GL_FLOAT_MAT4                     0x8B5C
</span><span class="cx"> #define GL_SAMPLER_2D                     0x8B5E
</span><span class="cx"> #define GL_SAMPLER_CUBE                   0x8B60
</span><del>-
-/* Vertex Arrays */
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED        0x8622
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE           0x8623
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE         0x8624
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE           0x8625
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED     0x886A
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER        0x8645
</del><ins>+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED    0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE       0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE     0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE       0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER    0x8645
</ins><span class="cx"> #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
</span><del>-
-/* Read Format */
-#define GL_IMPLEMENTATION_COLOR_READ_TYPE   0x8B9A
</del><ins>+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
</ins><span class="cx"> #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
</span><del>-
-/* Shader Source */
</del><span class="cx"> #define GL_COMPILE_STATUS                 0x8B81
</span><span class="cx"> #define GL_INFO_LOG_LENGTH                0x8B84
</span><span class="cx"> #define GL_SHADER_SOURCE_LENGTH           0x8B88
</span><span class="cx"> #define GL_SHADER_COMPILER                0x8DFA
</span><del>-
-/* Shader Binary */
</del><span class="cx"> #define GL_SHADER_BINARY_FORMATS          0x8DF8
</span><span class="cx"> #define GL_NUM_SHADER_BINARY_FORMATS      0x8DF9
</span><del>-
-/* Shader Precision-Specified Types */
</del><span class="cx"> #define GL_LOW_FLOAT                      0x8DF0
</span><span class="cx"> #define GL_MEDIUM_FLOAT                   0x8DF1
</span><span class="cx"> #define GL_HIGH_FLOAT                     0x8DF2
</span><span class="cx"> #define GL_LOW_INT                        0x8DF3
</span><span class="cx"> #define GL_MEDIUM_INT                     0x8DF4
</span><span class="cx"> #define GL_HIGH_INT                       0x8DF5
</span><del>-
-/* Framebuffer Object. */
</del><span class="cx"> #define GL_FRAMEBUFFER                    0x8D40
</span><span class="cx"> #define GL_RENDERBUFFER                   0x8D41
</span><del>-
</del><span class="cx"> #define GL_RGBA4                          0x8056
</span><span class="cx"> #define GL_RGB5_A1                        0x8057
</span><span class="cx"> #define GL_RGB565                         0x8D62
</span><span class="cx"> #define GL_DEPTH_COMPONENT16              0x81A5
</span><span class="cx"> #define GL_STENCIL_INDEX8                 0x8D48
</span><del>-
</del><span class="cx"> #define GL_RENDERBUFFER_WIDTH             0x8D42
</span><span class="cx"> #define GL_RENDERBUFFER_HEIGHT            0x8D43
</span><span class="cx"> #define GL_RENDERBUFFER_INTERNAL_FORMAT   0x8D44
</span><span class="lines">@@ -442,185 +361,319 @@
</span><span class="cx"> #define GL_RENDERBUFFER_ALPHA_SIZE        0x8D53
</span><span class="cx"> #define GL_RENDERBUFFER_DEPTH_SIZE        0x8D54
</span><span class="cx"> #define GL_RENDERBUFFER_STENCIL_SIZE      0x8D55
</span><del>-
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE           0x8CD0
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME           0x8CD1
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL         0x8CD2
</del><ins>+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
</ins><span class="cx"> #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
</span><del>-
</del><span class="cx"> #define GL_COLOR_ATTACHMENT0              0x8CE0
</span><span class="cx"> #define GL_DEPTH_ATTACHMENT               0x8D00
</span><span class="cx"> #define GL_STENCIL_ATTACHMENT             0x8D20
</span><del>-
</del><span class="cx"> #define GL_NONE                           0
</span><del>-
-#define GL_FRAMEBUFFER_COMPLETE                      0x8CD5
-#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT         0x8CD6
</del><ins>+#define GL_FRAMEBUFFER_COMPLETE           0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
</ins><span class="cx"> #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
</span><del>-#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS         0x8CD9
-#define GL_FRAMEBUFFER_UNSUPPORTED                   0x8CDD
-
</del><ins>+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_UNSUPPORTED        0x8CDD
</ins><span class="cx"> #define GL_FRAMEBUFFER_BINDING            0x8CA6
</span><span class="cx"> #define GL_RENDERBUFFER_BINDING           0x8CA7
</span><span class="cx"> #define GL_MAX_RENDERBUFFER_SIZE          0x84E8
</span><del>-
</del><span class="cx"> #define GL_INVALID_FRAMEBUFFER_OPERATION  0x0506
</span><ins>+typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
+typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);
+typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);
+typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode);
+typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader);
+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture);
+typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width);
+typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units);
+typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);
+typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
</ins><span class="cx"> 
</span><del>-/*-------------------------------------------------------------------------
- * GL core functions.
- *-----------------------------------------------------------------------*/
-
</del><span class="cx"> #if defined(_MSC_VER) &amp;&amp; !defined(ANGLE_WEBKIT_WIN)
</span><span class="cx"> #include &lt;GLES2/gl2softlinking.h&gt;
</span><span class="cx"> #else
</span><span class="cx"> 
</span><del>-GL_APICALL void         GL_APIENTRY glActiveTexture (GLenum texture);
-GL_APICALL void         GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
-GL_APICALL void         GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar* name);
-GL_APICALL void         GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
-GL_APICALL void         GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
-GL_APICALL void         GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
-GL_APICALL void         GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
-GL_APICALL void         GL_APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-GL_APICALL void         GL_APIENTRY glBlendEquation ( GLenum mode );
-GL_APICALL void         GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
-GL_APICALL void         GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
-GL_APICALL void         GL_APIENTRY glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-GL_APICALL void         GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
-GL_APICALL void         GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
-GL_APICALL GLenum       GL_APIENTRY glCheckFramebufferStatus (GLenum target);
-GL_APICALL void         GL_APIENTRY glClear (GLbitfield mask);
-GL_APICALL void         GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-GL_APICALL void         GL_APIENTRY glClearDepthf (GLclampf depth);
-GL_APICALL void         GL_APIENTRY glClearStencil (GLint s);
-GL_APICALL void         GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
-GL_APICALL void         GL_APIENTRY glCompileShader (GLuint shader);
-GL_APICALL void         GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data);
-GL_APICALL void         GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data);
-GL_APICALL void         GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-GL_APICALL void         GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-GL_APICALL GLuint       GL_APIENTRY glCreateProgram (void);
-GL_APICALL GLuint       GL_APIENTRY glCreateShader (GLenum type);
-GL_APICALL void         GL_APIENTRY glCullFace (GLenum mode);
-GL_APICALL void         GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint* buffers);
-GL_APICALL void         GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers);
-GL_APICALL void         GL_APIENTRY glDeleteProgram (GLuint program);
-GL_APICALL void         GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers);
-GL_APICALL void         GL_APIENTRY glDeleteShader (GLuint shader);
-GL_APICALL void         GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint* textures);
-GL_APICALL void         GL_APIENTRY glDepthFunc (GLenum func);
-GL_APICALL void         GL_APIENTRY glDepthMask (GLboolean flag);
-GL_APICALL void         GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar);
-GL_APICALL void         GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
-GL_APICALL void         GL_APIENTRY glDisable (GLenum cap);
-GL_APICALL void         GL_APIENTRY glDisableVertexAttribArray (GLuint index);
-GL_APICALL void         GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
-GL_APICALL void         GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
-GL_APICALL void         GL_APIENTRY glEnable (GLenum cap);
-GL_APICALL void         GL_APIENTRY glEnableVertexAttribArray (GLuint index);
-GL_APICALL void         GL_APIENTRY glFinish (void);
-GL_APICALL void         GL_APIENTRY glFlush (void);
-GL_APICALL void         GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-GL_APICALL void         GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-GL_APICALL void         GL_APIENTRY glFrontFace (GLenum mode);
-GL_APICALL void         GL_APIENTRY glGenBuffers (GLsizei n, GLuint* buffers);
-GL_APICALL void         GL_APIENTRY glGenerateMipmap (GLenum target);
-GL_APICALL void         GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint* framebuffers);
-GL_APICALL void         GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint* renderbuffers);
-GL_APICALL void         GL_APIENTRY glGenTextures (GLsizei n, GLuint* textures);
-GL_APICALL void         GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-GL_APICALL void         GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-GL_APICALL void         GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
-GL_APICALL GLint        GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar* name);
-GL_APICALL void         GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean* params);
-GL_APICALL void         GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params);
-GL_APICALL GLenum       GL_APIENTRY glGetError (void);
-GL_APICALL void         GL_APIENTRY glGetFloatv (GLenum pname, GLfloat* params);
-GL_APICALL void         GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params);
-GL_APICALL void         GL_APIENTRY glGetIntegerv (GLenum pname, GLint* params);
-GL_APICALL void         GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint* params);
-GL_APICALL void         GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
-GL_APICALL void         GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params);
-GL_APICALL void         GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint* params);
-GL_APICALL void         GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
-GL_APICALL void         GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
-GL_APICALL void         GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
-GL_APICALL const GLubyte* GL_APIENTRY glGetString (GLenum name);
-GL_APICALL void         GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat* params);
-GL_APICALL void         GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint* params);
-GL_APICALL void         GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat* params);
-GL_APICALL void         GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint* params);
-GL_APICALL GLint        GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar* name);
-GL_APICALL void         GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params);
-GL_APICALL void         GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params);
-GL_APICALL void         GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid** pointer);
-GL_APICALL void         GL_APIENTRY glHint (GLenum target, GLenum mode);
-GL_APICALL GLboolean    GL_APIENTRY glIsBuffer (GLuint buffer);
-GL_APICALL GLboolean    GL_APIENTRY glIsEnabled (GLenum cap);
-GL_APICALL GLboolean    GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
-GL_APICALL GLboolean    GL_APIENTRY glIsProgram (GLuint program);
-GL_APICALL GLboolean    GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
-GL_APICALL GLboolean    GL_APIENTRY glIsShader (GLuint shader);
-GL_APICALL GLboolean    GL_APIENTRY glIsTexture (GLuint texture);
-GL_APICALL void         GL_APIENTRY glLineWidth (GLfloat width);
-GL_APICALL void         GL_APIENTRY glLinkProgram (GLuint program);
-GL_APICALL void         GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
-GL_APICALL void         GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
-GL_APICALL void         GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
-GL_APICALL void         GL_APIENTRY glReleaseShaderCompiler (void);
-GL_APICALL void         GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-GL_APICALL void         GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert);
-GL_APICALL void         GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
-GL_APICALL void         GL_APIENTRY glShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length);
-GL_APICALL void         GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length);
-GL_APICALL void         GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
-GL_APICALL void         GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
-GL_APICALL void         GL_APIENTRY glStencilMask (GLuint mask);
-GL_APICALL void         GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
-GL_APICALL void         GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
-GL_APICALL void         GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
-GL_APICALL void         GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
-GL_APICALL void         GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
-GL_APICALL void         GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat* params);
-GL_APICALL void         GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
-GL_APICALL void         GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint* params);
-GL_APICALL void         GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels);
-GL_APICALL void         GL_APIENTRY glUniform1f (GLint location, GLfloat x);
-GL_APICALL void         GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat* v);
-GL_APICALL void         GL_APIENTRY glUniform1i (GLint location, GLint x);
-GL_APICALL void         GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint* v);
-GL_APICALL void         GL_APIENTRY glUniform2f (GLint location, GLfloat x, GLfloat y);
-GL_APICALL void         GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat* v);
-GL_APICALL void         GL_APIENTRY glUniform2i (GLint location, GLint x, GLint y);
-GL_APICALL void         GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint* v);
-GL_APICALL void         GL_APIENTRY glUniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z);
-GL_APICALL void         GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat* v);
-GL_APICALL void         GL_APIENTRY glUniform3i (GLint location, GLint x, GLint y, GLint z);
-GL_APICALL void         GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint* v);
-GL_APICALL void         GL_APIENTRY glUniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-GL_APICALL void         GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat* v);
-GL_APICALL void         GL_APIENTRY glUniform4i (GLint location, GLint x, GLint y, GLint z, GLint w);
-GL_APICALL void         GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint* v);
-GL_APICALL void         GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void         GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void         GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void         GL_APIENTRY glUseProgram (GLuint program);
-GL_APICALL void         GL_APIENTRY glValidateProgram (GLuint program);
-GL_APICALL void         GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x);
-GL_APICALL void         GL_APIENTRY glVertexAttrib1fv (GLuint indx, const GLfloat* values);
-GL_APICALL void         GL_APIENTRY glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y);
-GL_APICALL void         GL_APIENTRY glVertexAttrib2fv (GLuint indx, const GLfloat* values);
-GL_APICALL void         GL_APIENTRY glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z);
-GL_APICALL void         GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat* values);
-GL_APICALL void         GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-GL_APICALL void         GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat* values);
-GL_APICALL void         GL_APIENTRY glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);
-GL_APICALL void         GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
-
</del><ins>+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
+GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d);
+GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
+GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
+GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFinish (void);
+GL_APICALL void GL_APIENTRY glFlush (void);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL GLenum GL_APIENTRY glGetError (void);
+GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name);
+GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
</ins><span class="cx"> #endif
</span><ins>+#endif
+#endif /* GL_ES_VERSION_2_0 */
</ins><span class="cx"> 
</span><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#endif /* __gl2_h_ */
</del><ins>+#endif
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeGLES2gl2exth"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2ext.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2ext.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2ext.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,1370 +1,960 @@
</span><span class="cx"> #ifndef __gl2ext_h_
</span><del>-#define __gl2ext_h_
</del><ins>+#define __gl2ext_h_ 1
</ins><span class="cx"> 
</span><del>-/* $Revision: 20795 $ on $Date:: 2013-03-07 01:01:58 -0800 #$ */
-
</del><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> extern &quot;C&quot; {
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> /*
</span><del>- * This document is licensed under the SGI Free Software B License Version
- * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
- */
</del><ins>+** Copyright (c) 2013-2015 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** &quot;Materials&quot;), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+**   http://www.opengl.org/registry/
+**
+** Khronos $Revision: 31902 $ on $Date: 2015-09-03 15:44:53 -0700 (Thu, 03 Sep 2015) $
+*/
</ins><span class="cx"> 
</span><span class="cx"> #ifndef GL_APIENTRYP
</span><del>-#   define GL_APIENTRYP GL_APIENTRY*
</del><ins>+#define GL_APIENTRYP GL_APIENTRY*
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * OES extension tokens
- *------------------------------------------------------------------------*/
</del><ins>+/* Generated on date 20150903 */
</ins><span class="cx"> 
</span><del>-/* GL_OES_compressed_ETC1_RGB8_texture */
-#ifndef GL_OES_compressed_ETC1_RGB8_texture
-#define GL_ETC1_RGB8_OES                                        0x8D64
-#endif
</del><ins>+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]
+ * Versions emitted: _nomatch_^
+ * Default extensions included: gles2
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
</ins><span class="cx"> 
</span><del>-/* GL_OES_compressed_paletted_texture */
-#ifndef GL_OES_compressed_paletted_texture
-#define GL_PALETTE4_RGB8_OES                                    0x8B90
-#define GL_PALETTE4_RGBA8_OES                                   0x8B91
-#define GL_PALETTE4_R5_G6_B5_OES                                0x8B92
-#define GL_PALETTE4_RGBA4_OES                                   0x8B93
-#define GL_PALETTE4_RGB5_A1_OES                                 0x8B94
-#define GL_PALETTE8_RGB8_OES                                    0x8B95
-#define GL_PALETTE8_RGBA8_OES                                   0x8B96
-#define GL_PALETTE8_R5_G6_B5_OES                                0x8B97
-#define GL_PALETTE8_RGBA4_OES                                   0x8B98
-#define GL_PALETTE8_RGB5_A1_OES                                 0x8B99
</del><ins>+#ifndef GL_KHR_blend_equation_advanced
+#define GL_KHR_blend_equation_advanced 1
+#define GL_MULTIPLY_KHR                   0x9294
+#define GL_SCREEN_KHR                     0x9295
+#define GL_OVERLAY_KHR                    0x9296
+#define GL_DARKEN_KHR                     0x9297
+#define GL_LIGHTEN_KHR                    0x9298
+#define GL_COLORDODGE_KHR                 0x9299
+#define GL_COLORBURN_KHR                  0x929A
+#define GL_HARDLIGHT_KHR                  0x929B
+#define GL_SOFTLIGHT_KHR                  0x929C
+#define GL_DIFFERENCE_KHR                 0x929E
+#define GL_EXCLUSION_KHR                  0x92A0
+#define GL_HSL_HUE_KHR                    0x92AD
+#define GL_HSL_SATURATION_KHR             0x92AE
+#define GL_HSL_COLOR_KHR                  0x92AF
+#define GL_HSL_LUMINOSITY_KHR             0x92B0
+typedef void (GL_APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBlendBarrierKHR (void);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_KHR_blend_equation_advanced */
</ins><span class="cx"> 
</span><del>-/* GL_OES_depth24 */
-#ifndef GL_OES_depth24
-#define GL_DEPTH_COMPONENT24_OES                                0x81A6
-#endif
</del><ins>+#ifndef GL_KHR_blend_equation_advanced_coherent
+#define GL_KHR_blend_equation_advanced_coherent 1
+#define GL_BLEND_ADVANCED_COHERENT_KHR    0x9285
+#endif /* GL_KHR_blend_equation_advanced_coherent */
</ins><span class="cx"> 
</span><del>-/* GL_OES_depth32 */
-#ifndef GL_OES_depth32
-#define GL_DEPTH_COMPONENT32_OES                                0x81A7
-#endif
</del><ins>+#ifndef GL_KHR_context_flush_control
+#define GL_KHR_context_flush_control 1
+#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR   0x82FB
+#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x82FC
+#endif /* GL_KHR_context_flush_control */
</ins><span class="cx"> 
</span><del>-/* GL_OES_depth_texture */
-/* No new tokens introduced by this extension. */
-
-/* GL_OES_EGL_image */
-#ifndef GL_OES_EGL_image
-typedef void* GLeglImageOES;
</del><ins>+#ifndef GL_KHR_debug
+#define GL_KHR_debug 1
+typedef void (GL_APIENTRY  *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+#define GL_SAMPLER                        0x82E6
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR   0x8242
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243
+#define GL_DEBUG_CALLBACK_FUNCTION_KHR    0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM_KHR  0x8245
+#define GL_DEBUG_SOURCE_API_KHR           0x8246
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247
+#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR   0x8249
+#define GL_DEBUG_SOURCE_APPLICATION_KHR   0x824A
+#define GL_DEBUG_SOURCE_OTHER_KHR         0x824B
+#define GL_DEBUG_TYPE_ERROR_KHR           0x824C
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E
+#define GL_DEBUG_TYPE_PORTABILITY_KHR     0x824F
+#define GL_DEBUG_TYPE_PERFORMANCE_KHR     0x8250
+#define GL_DEBUG_TYPE_OTHER_KHR           0x8251
+#define GL_DEBUG_TYPE_MARKER_KHR          0x8268
+#define GL_DEBUG_TYPE_PUSH_GROUP_KHR      0x8269
+#define GL_DEBUG_TYPE_POP_GROUP_KHR       0x826A
+#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C
+#define GL_DEBUG_GROUP_STACK_DEPTH_KHR    0x826D
+#define GL_BUFFER_KHR                     0x82E0
+#define GL_SHADER_KHR                     0x82E1
+#define GL_PROGRAM_KHR                    0x82E2
+#define GL_VERTEX_ARRAY_KHR               0x8074
+#define GL_QUERY_KHR                      0x82E3
+#define GL_PROGRAM_PIPELINE_KHR           0x82E4
+#define GL_SAMPLER_KHR                    0x82E6
+#define GL_MAX_LABEL_LENGTH_KHR           0x82E8
+#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR   0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR  0x9144
+#define GL_DEBUG_LOGGED_MESSAGES_KHR      0x9145
+#define GL_DEBUG_SEVERITY_HIGH_KHR        0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM_KHR      0x9147
+#define GL_DEBUG_SEVERITY_LOW_KHR         0x9148
+#define GL_DEBUG_OUTPUT_KHR               0x92E0
+#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR     0x00000002
+#define GL_STACK_OVERFLOW_KHR             0x0503
+#define GL_STACK_UNDERFLOW_KHR            0x0504
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, const void *userParam);
+typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC) (void);
+typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRPROC) (GLenum pname, void **params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDebugMessageControlKHR (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+GL_APICALL void GL_APIENTRY glDebugMessageInsertKHR (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHR (GLDEBUGPROCKHR callback, const void *userParam);
+GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHR (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+GL_APICALL void GL_APIENTRY glPushDebugGroupKHR (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+GL_APICALL void GL_APIENTRY glPopDebugGroupKHR (void);
+GL_APICALL void GL_APIENTRY glObjectLabelKHR (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+GL_APICALL void GL_APIENTRY glGetObjectLabelKHR (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+GL_APICALL void GL_APIENTRY glObjectPtrLabelKHR (const void *ptr, GLsizei length, const GLchar *label);
+GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHR (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+GL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, void **params);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_KHR_debug */
</ins><span class="cx"> 
</span><del>-/* GL_OES_EGL_image_external */
-#ifndef GL_OES_EGL_image_external
-/* GLeglImageOES defined in GL_OES_EGL_image already. */
-#define GL_TEXTURE_EXTERNAL_OES                                 0x8D65
-#define GL_SAMPLER_EXTERNAL_OES                                 0x8D66
-#define GL_TEXTURE_BINDING_EXTERNAL_OES                         0x8D67
-#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES                     0x8D68
-#endif
</del><ins>+#ifndef GL_KHR_no_error
+#define GL_KHR_no_error 1
+#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR  0x00000008
+#endif /* GL_KHR_no_error */
</ins><span class="cx"> 
</span><del>-/* GL_OES_element_index_uint */
-#ifndef GL_OES_element_index_uint
-#define GL_UNSIGNED_INT                                         0x1405
-#endif
</del><ins>+#ifndef GL_KHR_robust_buffer_access_behavior
+#define GL_KHR_robust_buffer_access_behavior 1
+#endif /* GL_KHR_robust_buffer_access_behavior */
</ins><span class="cx"> 
</span><del>-/* GL_OES_get_program_binary */
-#ifndef GL_OES_get_program_binary
-#define GL_PROGRAM_BINARY_LENGTH_OES                            0x8741
-#define GL_NUM_PROGRAM_BINARY_FORMATS_OES                       0x87FE
-#define GL_PROGRAM_BINARY_FORMATS_OES                           0x87FF
</del><ins>+#ifndef GL_KHR_robustness
+#define GL_KHR_robustness 1
+#define GL_CONTEXT_ROBUST_ACCESS_KHR      0x90F3
+#define GL_LOSE_CONTEXT_ON_RESET_KHR      0x8252
+#define GL_GUILTY_CONTEXT_RESET_KHR       0x8253
+#define GL_INNOCENT_CONTEXT_RESET_KHR     0x8254
+#define GL_UNKNOWN_CONTEXT_RESET_KHR      0x8255
+#define GL_RESET_NOTIFICATION_STRATEGY_KHR 0x8256
+#define GL_NO_RESET_NOTIFICATION_KHR      0x8261
+#define GL_CONTEXT_LOST_KHR               0x0507
+typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSKHRPROC) (void);
+typedef void (GL_APIENTRYP PFNGLREADNPIXELSKHRPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusKHR (void);
+GL_APICALL void GL_APIENTRY glReadnPixelsKHR (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+GL_APICALL void GL_APIENTRY glGetnUniformfvKHR (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetnUniformivKHR (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+GL_APICALL void GL_APIENTRY glGetnUniformuivKHR (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_KHR_robustness */
</ins><span class="cx"> 
</span><del>-/* GL_OES_mapbuffer */
-#ifndef GL_OES_mapbuffer
-#define GL_WRITE_ONLY_OES                                       0x88B9
-#define GL_BUFFER_ACCESS_OES                                    0x88BB
-#define GL_BUFFER_MAPPED_OES                                    0x88BC
-#define GL_BUFFER_MAP_POINTER_OES                               0x88BD
-#endif
</del><ins>+#ifndef GL_KHR_texture_compression_astc_hdr
+#define GL_KHR_texture_compression_astc_hdr 1
+#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR   0x93B0
+#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR   0x93B1
+#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR   0x93B2
+#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR   0x93B3
+#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR   0x93B4
+#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR   0x93B5
+#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR   0x93B6
+#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR   0x93B7
+#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR  0x93B8
+#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR  0x93B9
+#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR  0x93BA
+#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB
+#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC
+#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD
+#endif /* GL_KHR_texture_compression_astc_hdr */
</ins><span class="cx"> 
</span><del>-/* GL_OES_packed_depth_stencil */
-#ifndef GL_OES_packed_depth_stencil
-#define GL_DEPTH_STENCIL_OES                                    0x84F9
-#define GL_UNSIGNED_INT_24_8_OES                                0x84FA
-#define GL_DEPTH24_STENCIL8_OES                                 0x88F0
-#endif
-
-/* GL_OES_required_internalformat */
-#ifndef GL_OES_required_internalformat 
-#define GL_ALPHA8_OES                                           0x803C
-#define GL_DEPTH_COMPONENT16_OES                                0x81A5
-/* reuse GL_DEPTH_COMPONENT24_OES */                            
-/* reuse GL_DEPTH24_STENCIL8_OES */                             
-/* reuse GL_DEPTH_COMPONENT32_OES */                            
-#define GL_LUMINANCE4_ALPHA4_OES                                0x8043
-#define GL_LUMINANCE8_ALPHA8_OES                                0x8045
-#define GL_LUMINANCE8_OES                                       0x8040
-#define GL_RGBA4_OES                                            0x8056
-#define GL_RGB5_A1_OES                                          0x8057
-#define GL_RGB565_OES                                           0x8D62
-/* reuse GL_RGB8_OES */                              
-/* reuse GL_RGBA8_OES */  
-/* reuse GL_RGB10_EXT */
-/* reuse GL_RGB10_A2_EXT */
-#endif 
-
-/* GL_OES_rgb8_rgba8 */
-#ifndef GL_OES_rgb8_rgba8
-#define GL_RGB8_OES                                             0x8051
-#define GL_RGBA8_OES                                            0x8058
-#endif
-
-/* GL_OES_standard_derivatives */
-#ifndef GL_OES_standard_derivatives
-#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES                  0x8B8B
-#endif
-
-/* GL_OES_stencil1 */
-#ifndef GL_OES_stencil1
-#define GL_STENCIL_INDEX1_OES                                   0x8D46
-#endif
-
-/* GL_OES_stencil4 */
-#ifndef GL_OES_stencil4
-#define GL_STENCIL_INDEX4_OES                                   0x8D47
-#endif
-
-#ifndef GL_OES_surfaceless_context
-#define GL_FRAMEBUFFER_UNDEFINED_OES                            0x8219
-#endif
-
-/* GL_OES_texture_3D */
-#ifndef GL_OES_texture_3D
-#define GL_TEXTURE_WRAP_R_OES                                   0x8072
-#define GL_TEXTURE_3D_OES                                       0x806F
-#define GL_TEXTURE_BINDING_3D_OES                               0x806A
-#define GL_MAX_3D_TEXTURE_SIZE_OES                              0x8073
-#define GL_SAMPLER_3D_OES                                       0x8B5F
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES        0x8CD4
-#endif
-
-/* GL_OES_texture_float */
-/* No new tokens introduced by this extension. */
-
-/* GL_OES_texture_float_linear */
-/* No new tokens introduced by this extension. */
-
-/* GL_OES_texture_half_float */
-#ifndef GL_OES_texture_half_float
-#define GL_HALF_FLOAT_OES                                       0x8D61
-#endif
-
-/* GL_OES_texture_half_float_linear */
-/* No new tokens introduced by this extension. */
-
-/* GL_OES_texture_npot */
-/* No new tokens introduced by this extension. */
-
-/* GL_OES_vertex_array_object */
-#ifndef GL_OES_vertex_array_object
-#define GL_VERTEX_ARRAY_BINDING_OES                             0x85B5
-#endif
-
-/* GL_OES_vertex_half_float */
-/* GL_HALF_FLOAT_OES defined in GL_OES_texture_half_float already. */
-
-/* GL_OES_vertex_type_10_10_10_2 */
-#ifndef GL_OES_vertex_type_10_10_10_2
-#define GL_UNSIGNED_INT_10_10_10_2_OES                          0x8DF6
-#define GL_INT_10_10_10_2_OES                                   0x8DF7
-#endif
-
-/*------------------------------------------------------------------------*
- * KHR extension tokens
- *------------------------------------------------------------------------*/
-
-#ifndef GL_KHR_debug
-typedef void (GL_APIENTRYP GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);
-#define GL_DEBUG_OUTPUT_SYNCHRONOUS                             0x8242
-#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH                     0x8243
-#define GL_DEBUG_CALLBACK_FUNCTION                              0x8244
-#define GL_DEBUG_CALLBACK_USER_PARAM                            0x8245
-#define GL_DEBUG_SOURCE_API                                     0x8246
-#define GL_DEBUG_SOURCE_WINDOW_SYSTEM                           0x8247
-#define GL_DEBUG_SOURCE_SHADER_COMPILER                         0x8248
-#define GL_DEBUG_SOURCE_THIRD_PARTY                             0x8249
-#define GL_DEBUG_SOURCE_APPLICATION                             0x824A
-#define GL_DEBUG_SOURCE_OTHER                                   0x824B
-#define GL_DEBUG_TYPE_ERROR                                     0x824C
-#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR                       0x824D
-#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR                        0x824E
-#define GL_DEBUG_TYPE_PORTABILITY                               0x824F
-#define GL_DEBUG_TYPE_PERFORMANCE                               0x8250
-#define GL_DEBUG_TYPE_OTHER                                     0x8251
-#define GL_DEBUG_TYPE_MARKER                                    0x8268
-#define GL_DEBUG_TYPE_PUSH_GROUP                                0x8269
-#define GL_DEBUG_TYPE_POP_GROUP                                 0x826A
-#define GL_DEBUG_SEVERITY_NOTIFICATION                          0x826B
-#define GL_MAX_DEBUG_GROUP_STACK_DEPTH                          0x826C
-#define GL_DEBUG_GROUP_STACK_DEPTH                              0x826D
-#define GL_BUFFER                                               0x82E0
-#define GL_SHADER                                               0x82E1
-#define GL_PROGRAM                                              0x82E2
-#define GL_QUERY                                                0x82E3
-/* PROGRAM_PIPELINE only in GL */                               
-#define GL_SAMPLER                                              0x82E6
-/* DISPLAY_LIST only in GL */                                   
-#define GL_MAX_LABEL_LENGTH                                     0x82E8
-#define GL_MAX_DEBUG_MESSAGE_LENGTH                             0x9143
-#define GL_MAX_DEBUG_LOGGED_MESSAGES                            0x9144
-#define GL_DEBUG_LOGGED_MESSAGES                                0x9145
-#define GL_DEBUG_SEVERITY_HIGH                                  0x9146
-#define GL_DEBUG_SEVERITY_MEDIUM                                0x9147
-#define GL_DEBUG_SEVERITY_LOW                                   0x9148
-#define GL_DEBUG_OUTPUT                                         0x92E0
-#define GL_CONTEXT_FLAG_DEBUG_BIT                               0x00000002
-#define GL_STACK_OVERFLOW                                       0x0503
-#define GL_STACK_UNDERFLOW                                      0x0504
-#endif
-
</del><span class="cx"> #ifndef GL_KHR_texture_compression_astc_ldr
</span><del>-#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR                         0x93B0
-#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR                         0x93B1
-#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR                         0x93B2
-#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR                         0x93B3
-#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR                         0x93B4
-#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR                         0x93B5
-#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR                         0x93B6
-#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR                         0x93B7
-#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR                        0x93B8
-#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR                        0x93B9
-#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR                        0x93BA
-#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR                       0x93BB
-#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR                       0x93BC
-#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR                       0x93BD
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR                 0x93D0
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR                 0x93D1
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR                 0x93D2
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR                 0x93D3
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR                 0x93D4
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR                 0x93D5
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR                 0x93D6
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR                 0x93D7
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR                0x93D8
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR                0x93D9
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR                0x93DA
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR               0x93DB
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR               0x93DC
-#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR               0x93DD
-#endif
</del><ins>+#define GL_KHR_texture_compression_astc_ldr 1
+#endif /* GL_KHR_texture_compression_astc_ldr */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * AMD extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_AMD_compressed_3DC_texture */
-#ifndef GL_AMD_compressed_3DC_texture
-#define GL_3DC_X_AMD                                            0x87F9
-#define GL_3DC_XY_AMD                                           0x87FA
</del><ins>+#ifndef GL_OES_EGL_image
+#define GL_OES_EGL_image 1
+typedef void *GLeglImageOES;
+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);
+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image);
+GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_OES_EGL_image */
</ins><span class="cx"> 
</span><del>-/* GL_AMD_compressed_ATC_texture */
-#ifndef GL_AMD_compressed_ATC_texture
-#define GL_ATC_RGB_AMD                                          0x8C92
-#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD                          0x8C93
-#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD                      0x87EE
-#endif
</del><ins>+#ifndef GL_OES_EGL_image_external
+#define GL_OES_EGL_image_external 1
+#define GL_TEXTURE_EXTERNAL_OES           0x8D65
+#define GL_TEXTURE_BINDING_EXTERNAL_OES   0x8D67
+#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68
+#define GL_SAMPLER_EXTERNAL_OES           0x8D66
+#endif /* GL_OES_EGL_image_external */
</ins><span class="cx"> 
</span><del>-/* GL_AMD_performance_monitor */
-#ifndef GL_AMD_performance_monitor
-#define GL_COUNTER_TYPE_AMD                                     0x8BC0
-#define GL_COUNTER_RANGE_AMD                                    0x8BC1
-#define GL_UNSIGNED_INT64_AMD                                   0x8BC2
-#define GL_PERCENTAGE_AMD                                       0x8BC3
-#define GL_PERFMON_RESULT_AVAILABLE_AMD                         0x8BC4
-#define GL_PERFMON_RESULT_SIZE_AMD                              0x8BC5
-#define GL_PERFMON_RESULT_AMD                                   0x8BC6
-#endif
</del><ins>+#ifndef GL_OES_EGL_image_external_essl3
+#define GL_OES_EGL_image_external_essl3 1
+#endif /* GL_OES_EGL_image_external_essl3 */
</ins><span class="cx"> 
</span><del>-/* GL_AMD_program_binary_Z400 */
-#ifndef GL_AMD_program_binary_Z400
-#define GL_Z400_BINARY_AMD                                      0x8740
-#endif
</del><ins>+#ifndef GL_OES_compressed_ETC1_RGB8_sub_texture
+#define GL_OES_compressed_ETC1_RGB8_sub_texture 1
+#endif /* GL_OES_compressed_ETC1_RGB8_sub_texture */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * ANGLE extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_ANGLE_depth_texture */
-#ifndef GL_ANGLE_depth_texture
-#define GL_DEPTH_COMPONENT                                      0x1902
-#define GL_DEPTH_STENCIL_OES                                    0x84F9
-#define GL_UNSIGNED_SHORT                                       0x1403
-#define GL_UNSIGNED_INT                                         0x1405
-#define GL_UNSIGNED_INT_24_8_OES                                0x84FA
-#define GL_DEPTH_COMPONENT16                                    0x81A5
-#define GL_DEPTH_COMPONENT32_OES                                0x81A7
-#define GL_DEPTH24_STENCIL8_OES                                 0x88F0
-#endif
-
-/* GL_ANGLE_framebuffer_blit */
-#ifndef GL_ANGLE_framebuffer_blit
-#define GL_READ_FRAMEBUFFER_ANGLE                               0x8CA8
-#define GL_DRAW_FRAMEBUFFER_ANGLE                               0x8CA9
-#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE                       0x8CA6
-#define GL_READ_FRAMEBUFFER_BINDING_ANGLE                       0x8CAA
-#endif
-
-/* GL_ANGLE_framebuffer_multisample */
-#ifndef GL_ANGLE_framebuffer_multisample
-#define GL_RENDERBUFFER_SAMPLES_ANGLE                           0x8CAB
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE             0x8D56
-#define GL_MAX_SAMPLES_ANGLE                                    0x8D57
-#endif
-
-/* GL_ANGLE_instanced_arrays */
-#ifndef GL_ANGLE_instanced_arrays 
-#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE                    0x88FE
-#endif
-
-/* GL_ANGLE_pack_reverse_row_order */
-#ifndef GL_ANGLE_pack_reverse_row_order 
-#define GL_PACK_REVERSE_ROW_ORDER_ANGLE                         0x93A4
-#endif
-
-/* GL_ANGLE_program_binary */
-#ifndef GL_ANGLE_program_binary
-#define GL_PROGRAM_BINARY_ANGLE                                 0x93A6
-#endif
-
-/* GL_ANGLE_texture_compression_dxt3 */
-#ifndef GL_ANGLE_texture_compression_dxt3 
-#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE                      0x83F2
-#endif
-
-/* GL_ANGLE_texture_compression_dxt5 */
-#ifndef GL_ANGLE_texture_compression_dxt5 
-#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE                      0x83F3
-#endif
-
-/* GL_ANGLE_texture_usage */
-#ifndef GL_ANGLE_texture_usage 
-#define GL_TEXTURE_USAGE_ANGLE                                  0x93A2
-#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE                         0x93A3
-#endif
-
-/* GL_ANGLE_translated_shader_source */
-#ifndef GL_ANGLE_translated_shader_source 
-#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE                0x93A0
-#endif
-
-/*------------------------------------------------------------------------*
- * APPLE extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_APPLE_copy_texture_levels */
-/* No new tokens introduced by this extension. */
-    
-/* GL_APPLE_framebuffer_multisample */
-#ifndef GL_APPLE_framebuffer_multisample
-#define GL_RENDERBUFFER_SAMPLES_APPLE                           0x8CAB
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE             0x8D56
-#define GL_MAX_SAMPLES_APPLE                                    0x8D57
-#define GL_READ_FRAMEBUFFER_APPLE                               0x8CA8
-#define GL_DRAW_FRAMEBUFFER_APPLE                               0x8CA9
-#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE                       0x8CA6
-#define GL_READ_FRAMEBUFFER_BINDING_APPLE                       0x8CAA
-#endif
-
-/* GL_APPLE_rgb_422 */
-#ifndef GL_APPLE_rgb_422
-#define GL_RGB_422_APPLE                                        0x8A1F
-#define GL_UNSIGNED_SHORT_8_8_APPLE                             0x85BA
-#define GL_UNSIGNED_SHORT_8_8_REV_APPLE                         0x85BB
-#endif
-
-/* GL_APPLE_sync */
-#ifndef GL_APPLE_sync
-
-#ifndef __gl3_h_
-/* These types are defined with reference to &lt;inttypes.h&gt;
- * in the Apple extension spec, but here we use the Khronos
- * portable types in khrplatform.h, and assume those types 
- * are always defined.
- * If any other extensions using these types are defined, 
- * the typedefs must move out of this block and be shared.
- */
-typedef khronos_int64_t GLint64;
-typedef khronos_uint64_t GLuint64;
-typedef struct __GLsync *GLsync;
-#endif
-
-#define GL_SYNC_OBJECT_APPLE                                    0x8A53
-#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE                        0x9111
-#define GL_OBJECT_TYPE_APPLE                                    0x9112
-#define GL_SYNC_CONDITION_APPLE                                 0x9113
-#define GL_SYNC_STATUS_APPLE                                    0x9114
-#define GL_SYNC_FLAGS_APPLE                                     0x9115
-#define GL_SYNC_FENCE_APPLE                                     0x9116
-#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE                     0x9117
-#define GL_UNSIGNALED_APPLE                                     0x9118
-#define GL_SIGNALED_APPLE                                       0x9119
-#define GL_ALREADY_SIGNALED_APPLE                               0x911A
-#define GL_TIMEOUT_EXPIRED_APPLE                                0x911B
-#define GL_CONDITION_SATISFIED_APPLE                            0x911C
-#define GL_WAIT_FAILED_APPLE                                    0x911D
-#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE                        0x00000001
-#define GL_TIMEOUT_IGNORED_APPLE                                0xFFFFFFFFFFFFFFFFull
-#endif
-
-/* GL_APPLE_texture_format_BGRA8888 */
-#ifndef GL_APPLE_texture_format_BGRA8888
-#define GL_BGRA_EXT                                             0x80E1
-#endif
-
-/* GL_APPLE_texture_max_level */
-#ifndef GL_APPLE_texture_max_level
-#define GL_TEXTURE_MAX_LEVEL_APPLE                              0x813D
-#endif
-
-/*------------------------------------------------------------------------*
- * ARM extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_ARM_mali_program_binary */
-#ifndef GL_ARM_mali_program_binary
-#define GL_MALI_PROGRAM_BINARY_ARM                              0x8F61
-#endif
-
-/* GL_ARM_mali_shader_binary */
-#ifndef GL_ARM_mali_shader_binary
-#define GL_MALI_SHADER_BINARY_ARM                               0x8F60
-#endif
-
-/* GL_ARM_rgba8 */
-/* No new tokens introduced by this extension. */
-
-/*------------------------------------------------------------------------*
- * EXT extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_EXT_blend_minmax */
-#ifndef GL_EXT_blend_minmax
-#define GL_MIN_EXT                                              0x8007
-#define GL_MAX_EXT                                              0x8008
-#endif
-
-/* GL_EXT_color_buffer_half_float */
-#ifndef GL_EXT_color_buffer_half_float
-#define GL_RGBA16F_EXT                                          0x881A
-#define GL_RGB16F_EXT                                           0x881B
-#define GL_RG16F_EXT                                            0x822F
-#define GL_R16F_EXT                                             0x822D
-#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT            0x8211
-#define GL_UNSIGNED_NORMALIZED_EXT                              0x8C17
-#endif
-
-/* GL_EXT_debug_label */
-#ifndef GL_EXT_debug_label
-#define GL_PROGRAM_PIPELINE_OBJECT_EXT                          0x8A4F
-#define GL_PROGRAM_OBJECT_EXT                                   0x8B40
-#define GL_SHADER_OBJECT_EXT                                    0x8B48
-#define GL_BUFFER_OBJECT_EXT                                    0x9151
-#define GL_QUERY_OBJECT_EXT                                     0x9153
-#define GL_VERTEX_ARRAY_OBJECT_EXT                              0x9154
-#endif
-
-/* GL_EXT_debug_marker */
-/* No new tokens introduced by this extension. */
-
-/* GL_EXT_discard_framebuffer */
-#ifndef GL_EXT_discard_framebuffer
-#define GL_COLOR_EXT                                            0x1800
-#define GL_DEPTH_EXT                                            0x1801
-#define GL_STENCIL_EXT                                          0x1802
-#endif
-
-/* GL_EXT_map_buffer_range */
-#ifndef GL_EXT_map_buffer_range
-#define GL_MAP_READ_BIT_EXT                                     0x0001
-#define GL_MAP_WRITE_BIT_EXT                                    0x0002
-#define GL_MAP_INVALIDATE_RANGE_BIT_EXT                         0x0004
-#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT                        0x0008
-#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT                           0x0010
-#define GL_MAP_UNSYNCHRONIZED_BIT_EXT                           0x0020
-#endif
-
-/* GL_EXT_multisampled_render_to_texture */
-#ifndef GL_EXT_multisampled_render_to_texture
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT           0x8D6C
-/* reuse values from GL_EXT_framebuffer_multisample (desktop extension) */ 
-#define GL_RENDERBUFFER_SAMPLES_EXT                             0x8CAB
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT               0x8D56
-#define GL_MAX_SAMPLES_EXT                                      0x8D57
-#endif
-
-/* GL_EXT_multiview_draw_buffers */
-#ifndef GL_EXT_multiview_draw_buffers
-#define GL_COLOR_ATTACHMENT_EXT                                 0x90F0
-#define GL_MULTIVIEW_EXT                                        0x90F1
-#define GL_DRAW_BUFFER_EXT                                      0x0C01
-#define GL_READ_BUFFER_EXT                                      0x0C02
-#define GL_MAX_MULTIVIEW_BUFFERS_EXT                            0x90F2
-#endif
-
-/* GL_EXT_multi_draw_arrays */
-/* No new tokens introduced by this extension. */
-
-/* GL_EXT_occlusion_query_boolean */
-#ifndef GL_EXT_occlusion_query_boolean
-#define GL_ANY_SAMPLES_PASSED_EXT                               0x8C2F
-#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT                  0x8D6A
-#define GL_CURRENT_QUERY_EXT                                    0x8865
-#define GL_QUERY_RESULT_EXT                                     0x8866
-#define GL_QUERY_RESULT_AVAILABLE_EXT                           0x8867
-#endif
-
-/* GL_EXT_read_format_bgra */
-#ifndef GL_EXT_read_format_bgra
-#define GL_BGRA_EXT                                             0x80E1
-#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT                       0x8365
-#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT                       0x8366
-#endif
-
-/* GL_EXT_robustness */
-#ifndef GL_EXT_robustness
-/* reuse GL_NO_ERROR */
-#define GL_GUILTY_CONTEXT_RESET_EXT                             0x8253
-#define GL_INNOCENT_CONTEXT_RESET_EXT                           0x8254
-#define GL_UNKNOWN_CONTEXT_RESET_EXT                            0x8255
-#define GL_CONTEXT_ROBUST_ACCESS_EXT                            0x90F3
-#define GL_RESET_NOTIFICATION_STRATEGY_EXT                      0x8256
-#define GL_LOSE_CONTEXT_ON_RESET_EXT                            0x8252
-#define GL_NO_RESET_NOTIFICATION_EXT                            0x8261
-#endif
-
-/* GL_EXT_separate_shader_objects */
-#ifndef GL_EXT_separate_shader_objects
-#define GL_VERTEX_SHADER_BIT_EXT                                0x00000001
-#define GL_FRAGMENT_SHADER_BIT_EXT                              0x00000002
-#define GL_ALL_SHADER_BITS_EXT                                  0xFFFFFFFF
-#define GL_PROGRAM_SEPARABLE_EXT                                0x8258
-#define GL_ACTIVE_PROGRAM_EXT                                   0x8259
-#define GL_PROGRAM_PIPELINE_BINDING_EXT                         0x825A
-#endif
-
-/* GL_EXT_shader_framebuffer_fetch */
-#ifndef GL_EXT_shader_framebuffer_fetch
-#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT                 0x8A52
-#endif
-
-/* GL_EXT_shader_texture_lod */
-/* No new tokens introduced by this extension. */
-
-/* GL_EXT_shadow_samplers */
-#ifndef GL_EXT_shadow_samplers
-#define GL_TEXTURE_COMPARE_MODE_EXT                             0x884C
-#define GL_TEXTURE_COMPARE_FUNC_EXT                             0x884D
-#define GL_COMPARE_REF_TO_TEXTURE_EXT                           0x884E
-#define GL_SAMPLER_2D_SHADOW_EXT                                0x8B62
-#endif
-
-/* GL_EXT_sRGB */
-#ifndef GL_EXT_sRGB
-#define GL_SRGB_EXT                                             0x8C40
-#define GL_SRGB_ALPHA_EXT                                       0x8C42
-#define GL_SRGB8_ALPHA8_EXT                                     0x8C43
-#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT            0x8210
-#endif
-
-/* GL_EXT_texture_compression_dxt1 */
-#ifndef GL_EXT_texture_compression_dxt1
-#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT                         0x83F0
-#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT                        0x83F1
-#endif
-
-/* GL_EXT_texture_filter_anisotropic */
-#ifndef GL_EXT_texture_filter_anisotropic
-#define GL_TEXTURE_MAX_ANISOTROPY_EXT                           0x84FE
-#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT                       0x84FF
-#endif
-
-/* GL_EXT_texture_format_BGRA8888 */
-#ifndef GL_EXT_texture_format_BGRA8888
-#define GL_BGRA_EXT                                             0x80E1
-#endif
-
-/* GL_EXT_texture_rg */
-#ifndef GL_EXT_texture_rg
-#define GL_RED_EXT                                              0x1903
-#define GL_RG_EXT                                               0x8227
-#define GL_R8_EXT                                               0x8229
-#define GL_RG8_EXT                                              0x822B
-#endif
-
-/* GL_EXT_texture_storage */
-#ifndef GL_EXT_texture_storage
-#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT                         0x912F
-#define GL_ALPHA8_EXT                                           0x803C  
-#define GL_LUMINANCE8_EXT                                       0x8040
-#define GL_LUMINANCE8_ALPHA8_EXT                                0x8045
-#define GL_RGBA32F_EXT                                          0x8814  
-#define GL_RGB32F_EXT                                           0x8815
-#define GL_ALPHA32F_EXT                                         0x8816
-#define GL_LUMINANCE32F_EXT                                     0x8818
-#define GL_LUMINANCE_ALPHA32F_EXT                               0x8819
-/* reuse GL_RGBA16F_EXT */
-/* reuse GL_RGB16F_EXT */
-#define GL_ALPHA16F_EXT                                         0x881C
-#define GL_LUMINANCE16F_EXT                                     0x881E
-#define GL_LUMINANCE_ALPHA16F_EXT                               0x881F
-#define GL_RGB10_A2_EXT                                         0x8059  
-#define GL_RGB10_EXT                                            0x8052
-#define GL_BGRA8_EXT                                            0x93A1
-#define GL_R8_EXT                                               0x8229
-#define GL_RG8_EXT                                              0x822B
-#define GL_R32F_EXT                                             0x822E  
-#define GL_RG32F_EXT                                            0x8230
-#define GL_R16F_EXT                                             0x822D
-#define GL_RG16F_EXT                                            0x822F
-#endif
-
-/* GL_EXT_texture_type_2_10_10_10_REV */
-#ifndef GL_EXT_texture_type_2_10_10_10_REV
-#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT                      0x8368
-#endif
-
-/* GL_EXT_unpack_subimage */
-#ifndef GL_EXT_unpack_subimage
-#define GL_UNPACK_ROW_LENGTH_EXT                                0x0CF2
-#define GL_UNPACK_SKIP_ROWS_EXT                                 0x0CF3
-#define GL_UNPACK_SKIP_PIXELS_EXT                               0x0CF4
-#endif
-
-/*------------------------------------------------------------------------*
- * DMP extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_DMP_shader_binary */
-#ifndef GL_DMP_shader_binary
-#define GL_SHADER_BINARY_DMP                                    0x9250
-#endif
-
-/*------------------------------------------------------------------------*
- * FJ extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_FJ_shader_binary_GCCSO */
-#ifndef GL_FJ_shader_binary_GCCSO
-#define GL_GCCSO_SHADER_BINARY_F                                0x9260
-#endif
-
-/*------------------------------------------------------------------------*
- * IMG extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_IMG_program_binary */
-#ifndef GL_IMG_program_binary
-#define GL_SGX_PROGRAM_BINARY_IMG                               0x9130
-#endif
-
-/* GL_IMG_read_format */
-#ifndef GL_IMG_read_format
-#define GL_BGRA_IMG                                             0x80E1
-#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG                       0x8365
-#endif
-
-/* GL_IMG_shader_binary */
-#ifndef GL_IMG_shader_binary
-#define GL_SGX_BINARY_IMG                                       0x8C0A
-#endif
-
-/* GL_IMG_texture_compression_pvrtc */
-#ifndef GL_IMG_texture_compression_pvrtc
-#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG                      0x8C00
-#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG                      0x8C01
-#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG                     0x8C02
-#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG                     0x8C03
-#endif
-
-/* GL_IMG_texture_compression_pvrtc2 */
-#ifndef GL_IMG_texture_compression_pvrtc2
-#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG                     0x9137
-#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG                     0x9138
-#endif
-
-/* GL_IMG_multisampled_render_to_texture */
-#ifndef GL_IMG_multisampled_render_to_texture
-#define GL_RENDERBUFFER_SAMPLES_IMG                             0x9133
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG               0x9134
-#define GL_MAX_SAMPLES_IMG                                      0x9135
-#define GL_TEXTURE_SAMPLES_IMG                                  0x9136
-#endif
-
-/*------------------------------------------------------------------------*
- * NV extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_NV_coverage_sample */
-#ifndef GL_NV_coverage_sample
-#define GL_COVERAGE_COMPONENT_NV                                0x8ED0
-#define GL_COVERAGE_COMPONENT4_NV                               0x8ED1
-#define GL_COVERAGE_ATTACHMENT_NV                               0x8ED2
-#define GL_COVERAGE_BUFFERS_NV                                  0x8ED3
-#define GL_COVERAGE_SAMPLES_NV                                  0x8ED4
-#define GL_COVERAGE_ALL_FRAGMENTS_NV                            0x8ED5
-#define GL_COVERAGE_EDGE_FRAGMENTS_NV                           0x8ED6
-#define GL_COVERAGE_AUTOMATIC_NV                                0x8ED7
-#define GL_COVERAGE_BUFFER_BIT_NV                               0x8000
-#endif
-
-/* GL_NV_depth_nonlinear */
-#ifndef GL_NV_depth_nonlinear
-#define GL_DEPTH_COMPONENT16_NONLINEAR_NV                       0x8E2C
-#endif
-
-/* GL_NV_draw_buffers */
-#ifndef GL_NV_draw_buffers
-#define GL_MAX_DRAW_BUFFERS_NV                                  0x8824
-#define GL_DRAW_BUFFER0_NV                                      0x8825
-#define GL_DRAW_BUFFER1_NV                                      0x8826
-#define GL_DRAW_BUFFER2_NV                                      0x8827
-#define GL_DRAW_BUFFER3_NV                                      0x8828
-#define GL_DRAW_BUFFER4_NV                                      0x8829
-#define GL_DRAW_BUFFER5_NV                                      0x882A
-#define GL_DRAW_BUFFER6_NV                                      0x882B
-#define GL_DRAW_BUFFER7_NV                                      0x882C
-#define GL_DRAW_BUFFER8_NV                                      0x882D
-#define GL_DRAW_BUFFER9_NV                                      0x882E
-#define GL_DRAW_BUFFER10_NV                                     0x882F
-#define GL_DRAW_BUFFER11_NV                                     0x8830
-#define GL_DRAW_BUFFER12_NV                                     0x8831
-#define GL_DRAW_BUFFER13_NV                                     0x8832
-#define GL_DRAW_BUFFER14_NV                                     0x8833
-#define GL_DRAW_BUFFER15_NV                                     0x8834
-#define GL_COLOR_ATTACHMENT0_NV                                 0x8CE0
-#define GL_COLOR_ATTACHMENT1_NV                                 0x8CE1
-#define GL_COLOR_ATTACHMENT2_NV                                 0x8CE2
-#define GL_COLOR_ATTACHMENT3_NV                                 0x8CE3
-#define GL_COLOR_ATTACHMENT4_NV                                 0x8CE4
-#define GL_COLOR_ATTACHMENT5_NV                                 0x8CE5
-#define GL_COLOR_ATTACHMENT6_NV                                 0x8CE6
-#define GL_COLOR_ATTACHMENT7_NV                                 0x8CE7
-#define GL_COLOR_ATTACHMENT8_NV                                 0x8CE8
-#define GL_COLOR_ATTACHMENT9_NV                                 0x8CE9
-#define GL_COLOR_ATTACHMENT10_NV                                0x8CEA
-#define GL_COLOR_ATTACHMENT11_NV                                0x8CEB
-#define GL_COLOR_ATTACHMENT12_NV                                0x8CEC
-#define GL_COLOR_ATTACHMENT13_NV                                0x8CED
-#define GL_COLOR_ATTACHMENT14_NV                                0x8CEE
-#define GL_COLOR_ATTACHMENT15_NV                                0x8CEF
-#endif
-
-/* GL_EXT_draw_buffers */
-#ifndef GL_EXT_draw_buffers
-#define GL_MAX_DRAW_BUFFERS_EXT                                  0x8824
-#define GL_DRAW_BUFFER0_EXT                                      0x8825
-#define GL_DRAW_BUFFER1_EXT                                      0x8826
-#define GL_DRAW_BUFFER2_EXT                                      0x8827
-#define GL_DRAW_BUFFER3_EXT                                      0x8828
-#define GL_DRAW_BUFFER4_EXT                                      0x8829
-#define GL_DRAW_BUFFER5_EXT                                      0x882A
-#define GL_DRAW_BUFFER6_EXT                                      0x882B
-#define GL_DRAW_BUFFER7_EXT                                      0x882C
-#define GL_DRAW_BUFFER8_EXT                                      0x882D
-#define GL_DRAW_BUFFER9_EXT                                      0x882E
-#define GL_DRAW_BUFFER10_EXT                                     0x882F
-#define GL_DRAW_BUFFER11_EXT                                     0x8830
-#define GL_DRAW_BUFFER12_EXT                                     0x8831
-#define GL_DRAW_BUFFER13_EXT                                     0x8832
-#define GL_DRAW_BUFFER14_EXT                                     0x8833
-#define GL_DRAW_BUFFER15_EXT                                     0x8834
-#define GL_COLOR_ATTACHMENT0_EXT                                 0x8CE0
-#define GL_COLOR_ATTACHMENT1_EXT                                 0x8CE1
-#define GL_COLOR_ATTACHMENT2_EXT                                 0x8CE2
-#define GL_COLOR_ATTACHMENT3_EXT                                 0x8CE3
-#define GL_COLOR_ATTACHMENT4_EXT                                 0x8CE4
-#define GL_COLOR_ATTACHMENT5_EXT                                 0x8CE5
-#define GL_COLOR_ATTACHMENT6_EXT                                 0x8CE6
-#define GL_COLOR_ATTACHMENT7_EXT                                 0x8CE7
-#define GL_COLOR_ATTACHMENT8_EXT                                 0x8CE8
-#define GL_COLOR_ATTACHMENT9_EXT                                 0x8CE9
-#define GL_COLOR_ATTACHMENT10_EXT                                0x8CEA
-#define GL_COLOR_ATTACHMENT11_EXT                                0x8CEB
-#define GL_COLOR_ATTACHMENT12_EXT                                0x8CEC
-#define GL_COLOR_ATTACHMENT13_EXT                                0x8CED
-#define GL_COLOR_ATTACHMENT14_EXT                                0x8CEE
-#define GL_COLOR_ATTACHMENT15_EXT                                0x8CEF
-#define GL_MAX_COLOR_ATTACHMENTS_EXT                             0x8CDF
-#endif
-
-/* GL_NV_draw_instanced */
-/* No new tokens introduced by this extension. */
-
-/* GL_NV_fbo_color_attachments */
-#ifndef GL_NV_fbo_color_attachments
-#define GL_MAX_COLOR_ATTACHMENTS_NV                             0x8CDF
-/* GL_COLOR_ATTACHMENT{0-15}_NV defined in GL_NV_draw_buffers already. */
-#endif
-
-/* GL_NV_fence */
-#ifndef GL_NV_fence
-#define GL_ALL_COMPLETED_NV                                     0x84F2
-#define GL_FENCE_STATUS_NV                                      0x84F3
-#define GL_FENCE_CONDITION_NV                                   0x84F4
-#endif
-
-/* GL_NV_framebuffer_blit */
-#ifndef GL_NV_framebuffer_blit
-#define GL_READ_FRAMEBUFFER_NV                                  0x8CA8
-#define GL_DRAW_FRAMEBUFFER_NV                                  0x8CA9
-#define GL_DRAW_FRAMEBUFFER_BINDING_NV                          0x8CA6 
-#define GL_READ_FRAMEBUFFER_BINDING_NV                          0x8CAA
-#endif
-
-/* GL_NV_framebuffer_multisample */
-#ifndef GL_NV_framebuffer_multisample
-#define GL_RENDERBUFFER_SAMPLES_NV                              0x8CAB
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV                0x8D56
-#define GL_MAX_SAMPLES_NV                                       0x8D57
-#endif
-
-/* GL_NV_generate_mipmap_sRGB */
-/* No new tokens introduced by this extension. */
-
-/* GL_NV_instanced_arrays */
-#ifndef GL_NV_instanced_arrays
-#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV                       0x88FE
-#endif
-
-/* GL_NV_read_buffer */
-#ifndef GL_NV_read_buffer
-#define GL_READ_BUFFER_NV                                       0x0C02
-#endif
-
-/* GL_NV_read_buffer_front */
-/* No new tokens introduced by this extension. */
-
-/* GL_NV_read_depth */
-/* No new tokens introduced by this extension. */
-
-/* GL_NV_read_depth_stencil */
-/* No new tokens introduced by this extension. */
-
-/* GL_NV_read_stencil */
-/* No new tokens introduced by this extension. */
-
-/* GL_NV_shadow_samplers_array */
-#ifndef GL_NV_shadow_samplers_array
-#define GL_SAMPLER_2D_ARRAY_SHADOW_NV                           0x8DC4
-#endif                                             
-                                                   
-/* GL_NV_shadow_samplers_cube */
-#ifndef GL_NV_shadow_samplers_cube                 
-#define GL_SAMPLER_CUBE_SHADOW_NV                               0x8DC5
-#endif
-
-/* GL_NV_sRGB_formats */
-#ifndef GL_NV_sRGB_formats
-#define GL_SLUMINANCE_NV                                        0x8C46
-#define GL_SLUMINANCE_ALPHA_NV                                  0x8C44
-#define GL_SRGB8_NV                                             0x8C41
-#define GL_SLUMINANCE8_NV                                       0x8C47
-#define GL_SLUMINANCE8_ALPHA8_NV                                0x8C45
-#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV                         0x8C4C
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV                   0x8C4D
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV                   0x8C4E
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV                   0x8C4F
-#define GL_ETC1_SRGB8_NV                                        0x88EE
-#endif
-
-/* GL_NV_texture_border_clamp */
-#ifndef GL_NV_texture_border_clamp
-#define GL_TEXTURE_BORDER_COLOR_NV                              0x1004
-#define GL_CLAMP_TO_BORDER_NV                                   0x812D
-#endif
-
-/* GL_NV_texture_compression_s3tc_update */
-/* No new tokens introduced by this extension. */
-
-/* GL_NV_texture_npot_2D_mipmap */
-/* No new tokens introduced by this extension. */
-
-/*------------------------------------------------------------------------*
- * QCOM extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_QCOM_alpha_test */
-#ifndef GL_QCOM_alpha_test
-#define GL_ALPHA_TEST_QCOM                                      0x0BC0
-#define GL_ALPHA_TEST_FUNC_QCOM                                 0x0BC1
-#define GL_ALPHA_TEST_REF_QCOM                                  0x0BC2
-#endif
-
-/* GL_QCOM_binning_control */
-#ifndef GL_QCOM_binning_control
-#define GL_BINNING_CONTROL_HINT_QCOM                            0x8FB0
-#define GL_CPU_OPTIMIZED_QCOM                                   0x8FB1
-#define GL_GPU_OPTIMIZED_QCOM                                   0x8FB2
-#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM                    0x8FB3
-#endif
-
-/* GL_QCOM_driver_control */
-/* No new tokens introduced by this extension. */
-
-/* GL_QCOM_extended_get */
-#ifndef GL_QCOM_extended_get
-#define GL_TEXTURE_WIDTH_QCOM                                   0x8BD2
-#define GL_TEXTURE_HEIGHT_QCOM                                  0x8BD3
-#define GL_TEXTURE_DEPTH_QCOM                                   0x8BD4
-#define GL_TEXTURE_INTERNAL_FORMAT_QCOM                         0x8BD5
-#define GL_TEXTURE_FORMAT_QCOM                                  0x8BD6
-#define GL_TEXTURE_TYPE_QCOM                                    0x8BD7
-#define GL_TEXTURE_IMAGE_VALID_QCOM                             0x8BD8
-#define GL_TEXTURE_NUM_LEVELS_QCOM                              0x8BD9
-#define GL_TEXTURE_TARGET_QCOM                                  0x8BDA
-#define GL_TEXTURE_OBJECT_VALID_QCOM                            0x8BDB
-#define GL_STATE_RESTORE                                        0x8BDC
-#endif
-
-/* GL_QCOM_extended_get2 */
-/* No new tokens introduced by this extension. */
-
-/* GL_QCOM_perfmon_global_mode */
-#ifndef GL_QCOM_perfmon_global_mode
-#define GL_PERFMON_GLOBAL_MODE_QCOM                             0x8FA0
-#endif
-
-/* GL_QCOM_writeonly_rendering */
-#ifndef GL_QCOM_writeonly_rendering
-#define GL_WRITEONLY_RENDERING_QCOM                             0x8823
-#endif
-
-/* GL_QCOM_tiled_rendering */
-#ifndef GL_QCOM_tiled_rendering
-#define GL_COLOR_BUFFER_BIT0_QCOM                               0x00000001
-#define GL_COLOR_BUFFER_BIT1_QCOM                               0x00000002
-#define GL_COLOR_BUFFER_BIT2_QCOM                               0x00000004
-#define GL_COLOR_BUFFER_BIT3_QCOM                               0x00000008
-#define GL_COLOR_BUFFER_BIT4_QCOM                               0x00000010
-#define GL_COLOR_BUFFER_BIT5_QCOM                               0x00000020
-#define GL_COLOR_BUFFER_BIT6_QCOM                               0x00000040
-#define GL_COLOR_BUFFER_BIT7_QCOM                               0x00000080
-#define GL_DEPTH_BUFFER_BIT0_QCOM                               0x00000100
-#define GL_DEPTH_BUFFER_BIT1_QCOM                               0x00000200
-#define GL_DEPTH_BUFFER_BIT2_QCOM                               0x00000400
-#define GL_DEPTH_BUFFER_BIT3_QCOM                               0x00000800
-#define GL_DEPTH_BUFFER_BIT4_QCOM                               0x00001000
-#define GL_DEPTH_BUFFER_BIT5_QCOM                               0x00002000
-#define GL_DEPTH_BUFFER_BIT6_QCOM                               0x00004000
-#define GL_DEPTH_BUFFER_BIT7_QCOM                               0x00008000
-#define GL_STENCIL_BUFFER_BIT0_QCOM                             0x00010000
-#define GL_STENCIL_BUFFER_BIT1_QCOM                             0x00020000
-#define GL_STENCIL_BUFFER_BIT2_QCOM                             0x00040000
-#define GL_STENCIL_BUFFER_BIT3_QCOM                             0x00080000
-#define GL_STENCIL_BUFFER_BIT4_QCOM                             0x00100000
-#define GL_STENCIL_BUFFER_BIT5_QCOM                             0x00200000
-#define GL_STENCIL_BUFFER_BIT6_QCOM                             0x00400000
-#define GL_STENCIL_BUFFER_BIT7_QCOM                             0x00800000
-#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM                         0x01000000
-#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM                         0x02000000
-#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM                         0x04000000
-#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM                         0x08000000
-#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM                         0x10000000
-#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM                         0x20000000
-#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM                         0x40000000
-#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM                         0x80000000
-#endif
-
-/*------------------------------------------------------------------------*
- * VIV extension tokens
- *------------------------------------------------------------------------*/
-
-/* GL_VIV_shader_binary */
-#ifndef GL_VIV_shader_binary
-#define GL_SHADER_BINARY_VIV                                    0x8FC4
-#endif
-
-/*------------------------------------------------------------------------*
- * End of extension tokens, start of corresponding extension functions
- *------------------------------------------------------------------------*/
-
-/*------------------------------------------------------------------------*
- * OES extension functions
- *------------------------------------------------------------------------*/
-
-/* GL_OES_compressed_ETC1_RGB8_texture */
</del><span class="cx"> #ifndef GL_OES_compressed_ETC1_RGB8_texture
</span><span class="cx"> #define GL_OES_compressed_ETC1_RGB8_texture 1
</span><del>-#endif
</del><ins>+#define GL_ETC1_RGB8_OES                  0x8D64
+#endif /* GL_OES_compressed_ETC1_RGB8_texture */
</ins><span class="cx"> 
</span><del>-/* GL_OES_compressed_paletted_texture */
</del><span class="cx"> #ifndef GL_OES_compressed_paletted_texture
</span><span class="cx"> #define GL_OES_compressed_paletted_texture 1
</span><ins>+#define GL_PALETTE4_RGB8_OES              0x8B90
+#define GL_PALETTE4_RGBA8_OES             0x8B91
+#define GL_PALETTE4_R5_G6_B5_OES          0x8B92
+#define GL_PALETTE4_RGBA4_OES             0x8B93
+#define GL_PALETTE4_RGB5_A1_OES           0x8B94
+#define GL_PALETTE8_RGB8_OES              0x8B95
+#define GL_PALETTE8_RGBA8_OES             0x8B96
+#define GL_PALETTE8_R5_G6_B5_OES          0x8B97
+#define GL_PALETTE8_RGBA4_OES             0x8B98
+#define GL_PALETTE8_RGB5_A1_OES           0x8B99
+#endif /* GL_OES_compressed_paletted_texture */
+
+#ifndef GL_OES_copy_image
+#define GL_OES_copy_image 1
+typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAOESPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glCopyImageSubDataOES (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_OES_copy_image */
</ins><span class="cx"> 
</span><del>-/* GL_OES_depth24 */
</del><span class="cx"> #ifndef GL_OES_depth24
</span><span class="cx"> #define GL_OES_depth24 1
</span><del>-#endif
</del><ins>+#define GL_DEPTH_COMPONENT24_OES          0x81A6
+#endif /* GL_OES_depth24 */
</ins><span class="cx"> 
</span><del>-/* GL_OES_depth32 */
</del><span class="cx"> #ifndef GL_OES_depth32
</span><span class="cx"> #define GL_OES_depth32 1
</span><del>-#endif
</del><ins>+#define GL_DEPTH_COMPONENT32_OES          0x81A7
+#endif /* GL_OES_depth32 */
</ins><span class="cx"> 
</span><del>-/* GL_OES_depth_texture */
</del><span class="cx"> #ifndef GL_OES_depth_texture
</span><span class="cx"> #define GL_OES_depth_texture 1
</span><del>-#endif
</del><ins>+#endif /* GL_OES_depth_texture */
</ins><span class="cx"> 
</span><del>-/* GL_OES_EGL_image */
-#ifndef GL_OES_EGL_image
-#define GL_OES_EGL_image 1
</del><ins>+#ifndef GL_OES_draw_buffers_indexed
+#define GL_OES_draw_buffers_indexed 1
+#define GL_MIN                            0x8007
+#define GL_MAX                            0x8008
+typedef void (GL_APIENTRYP PFNGLENABLEIOESPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLDISABLEIOESPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIOESPROC) (GLuint buf, GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIOESPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCIOESPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIOESPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKIOESPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIOESPROC) (GLenum target, GLuint index);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image);
-GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image);
</del><ins>+GL_APICALL void GL_APIENTRY glEnableiOES (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glDisableiOES (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glBlendEquationiOES (GLuint buf, GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparateiOES (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunciOES (GLuint buf, GLenum src, GLenum dst);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparateiOES (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+GL_APICALL void GL_APIENTRY glColorMaskiOES (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+GL_APICALL GLboolean GL_APIENTRY glIsEnablediOES (GLenum target, GLuint index);
</ins><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);
-typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);
-#endif
</del><ins>+#endif /* GL_OES_draw_buffers_indexed */
</ins><span class="cx"> 
</span><del>-/* GL_OES_EGL_image_external */
-#ifndef GL_OES_EGL_image_external
-#define GL_OES_EGL_image_external 1
-/* glEGLImageTargetTexture2DOES defined in GL_OES_EGL_image already. */
</del><ins>+#ifndef GL_OES_draw_elements_base_vertex
+#define GL_OES_draw_elements_base_vertex 1
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexOES (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexOES (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_OES_draw_elements_base_vertex */
</ins><span class="cx"> 
</span><del>-/* GL_OES_element_index_uint */
</del><span class="cx"> #ifndef GL_OES_element_index_uint
</span><span class="cx"> #define GL_OES_element_index_uint 1
</span><del>-#endif
</del><ins>+#endif /* GL_OES_element_index_uint */
</ins><span class="cx"> 
</span><del>-/* GL_OES_fbo_render_mipmap */
</del><span class="cx"> #ifndef GL_OES_fbo_render_mipmap
</span><span class="cx"> #define GL_OES_fbo_render_mipmap 1
</span><del>-#endif
</del><ins>+#endif /* GL_OES_fbo_render_mipmap */
</ins><span class="cx"> 
</span><del>-/* GL_OES_fragment_precision_high */
</del><span class="cx"> #ifndef GL_OES_fragment_precision_high
</span><span class="cx"> #define GL_OES_fragment_precision_high 1
</span><ins>+#endif /* GL_OES_fragment_precision_high */
+
+#ifndef GL_OES_geometry_point_size
+#define GL_OES_geometry_point_size 1
+#endif /* GL_OES_geometry_point_size */
+
+#ifndef GL_OES_geometry_shader
+#define GL_OES_geometry_shader 1
+#define GL_GEOMETRY_SHADER_OES            0x8DD9
+#define GL_GEOMETRY_SHADER_BIT_OES        0x00000004
+#define GL_GEOMETRY_LINKED_VERTICES_OUT_OES 0x8916
+#define GL_GEOMETRY_LINKED_INPUT_TYPE_OES 0x8917
+#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES 0x8918
+#define GL_GEOMETRY_SHADER_INVOCATIONS_OES 0x887F
+#define GL_LAYER_PROVOKING_VERTEX_OES     0x825E
+#define GL_LINES_ADJACENCY_OES            0x000A
+#define GL_LINE_STRIP_ADJACENCY_OES       0x000B
+#define GL_TRIANGLES_ADJACENCY_OES        0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY_OES   0x000D
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES 0x8A2C
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8A32
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES 0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES 0x9124
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES 0x8DE1
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES 0x8E5A
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES 0x8C29
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES 0x92CF
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES 0x92D5
+#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES 0x90CD
+#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES 0x90D7
+#define GL_FIRST_VERTEX_CONVENTION_OES    0x8E4D
+#define GL_LAST_VERTEX_CONVENTION_OES     0x8E4E
+#define GL_UNDEFINED_VERTEX_OES           0x8260
+#define GL_PRIMITIVES_GENERATED_OES       0x8C87
+#define GL_FRAMEBUFFER_DEFAULT_LAYERS_OES 0x9312
+#define GL_MAX_FRAMEBUFFER_LAYERS_OES     0x9317
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES 0x8DA8
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES 0x8DA7
+#define GL_REFERENCED_BY_GEOMETRY_SHADER_OES 0x9309
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREOESPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFramebufferTextureOES (GLenum target, GLenum attachment, GLuint texture, GLint level);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_OES_geometry_shader */
</ins><span class="cx"> 
</span><del>-/* GL_OES_get_program_binary */
</del><span class="cx"> #ifndef GL_OES_get_program_binary
</span><span class="cx"> #define GL_OES_get_program_binary 1
</span><ins>+#define GL_PROGRAM_BINARY_LENGTH_OES      0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS_OES     0x87FF
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
-GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length);
</del><ins>+GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const void *binary, GLint length);
</ins><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
-typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length);
-#endif
</del><ins>+#endif /* GL_OES_get_program_binary */
</ins><span class="cx"> 
</span><del>-/* GL_OES_mapbuffer */
</del><ins>+#ifndef GL_OES_gpu_shader5
+#define GL_OES_gpu_shader5 1
+#endif /* GL_OES_gpu_shader5 */
+
</ins><span class="cx"> #ifndef GL_OES_mapbuffer
</span><span class="cx"> #define GL_OES_mapbuffer 1
</span><ins>+#define GL_WRITE_ONLY_OES                 0x88B9
+#define GL_BUFFER_ACCESS_OES              0x88BB
+#define GL_BUFFER_MAPPED_OES              0x88BC
+#define GL_BUFFER_MAP_POINTER_OES         0x88BD
+typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access);
+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void* GL_APIENTRY glMapBufferOES (GLenum target, GLenum access);
</del><ins>+GL_APICALL void *GL_APIENTRY glMapBufferOES (GLenum target, GLenum access);
</ins><span class="cx"> GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target);
</span><del>-GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, GLvoid** params);
</del><ins>+GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void **params);
</ins><span class="cx"> #endif
</span><del>-typedef void* (GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access);
-typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target);
-typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, GLvoid** params);
-#endif
</del><ins>+#endif /* GL_OES_mapbuffer */
</ins><span class="cx"> 
</span><del>-/* GL_OES_packed_depth_stencil */
</del><span class="cx"> #ifndef GL_OES_packed_depth_stencil
</span><span class="cx"> #define GL_OES_packed_depth_stencil 1
</span><ins>+#define GL_DEPTH_STENCIL_OES              0x84F9
+#define GL_UNSIGNED_INT_24_8_OES          0x84FA
+#define GL_DEPTH24_STENCIL8_OES           0x88F0
+#endif /* GL_OES_packed_depth_stencil */
+
+#ifndef GL_OES_primitive_bounding_box
+#define GL_OES_primitive_bounding_box 1
+#define GL_PRIMITIVE_BOUNDING_BOX_OES     0x92BE
+typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXOESPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glPrimitiveBoundingBoxOES (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_OES_primitive_bounding_box */
</ins><span class="cx"> 
</span><del>-/* GL_OES_required_internalformat */
</del><span class="cx"> #ifndef GL_OES_required_internalformat
</span><span class="cx"> #define GL_OES_required_internalformat 1
</span><del>-#endif
</del><ins>+#define GL_ALPHA8_OES                     0x803C
+#define GL_DEPTH_COMPONENT16_OES          0x81A5
+#define GL_LUMINANCE4_ALPHA4_OES          0x8043
+#define GL_LUMINANCE8_ALPHA8_OES          0x8045
+#define GL_LUMINANCE8_OES                 0x8040
+#define GL_RGBA4_OES                      0x8056
+#define GL_RGB5_A1_OES                    0x8057
+#define GL_RGB565_OES                     0x8D62
+#define GL_RGB8_OES                       0x8051
+#define GL_RGBA8_OES                      0x8058
+#define GL_RGB10_EXT                      0x8052
+#define GL_RGB10_A2_EXT                   0x8059
+#endif /* GL_OES_required_internalformat */
</ins><span class="cx"> 
</span><del>-/* GL_OES_rgb8_rgba8 */
</del><span class="cx"> #ifndef GL_OES_rgb8_rgba8
</span><span class="cx"> #define GL_OES_rgb8_rgba8 1
</span><ins>+#endif /* GL_OES_rgb8_rgba8 */
+
+#ifndef GL_OES_sample_shading
+#define GL_OES_sample_shading 1
+#define GL_SAMPLE_SHADING_OES             0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE_OES   0x8C37
+typedef void (GL_APIENTRYP PFNGLMINSAMPLESHADINGOESPROC) (GLfloat value);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glMinSampleShadingOES (GLfloat value);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_OES_sample_shading */
</ins><span class="cx"> 
</span><del>-/* GL_OES_standard_derivatives */
</del><ins>+#ifndef GL_OES_sample_variables
+#define GL_OES_sample_variables 1
+#endif /* GL_OES_sample_variables */
+
+#ifndef GL_OES_shader_image_atomic
+#define GL_OES_shader_image_atomic 1
+#endif /* GL_OES_shader_image_atomic */
+
+#ifndef GL_OES_shader_io_blocks
+#define GL_OES_shader_io_blocks 1
+#endif /* GL_OES_shader_io_blocks */
+
+#ifndef GL_OES_shader_multisample_interpolation
+#define GL_OES_shader_multisample_interpolation 1
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5C
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES 0x8E5D
+#endif /* GL_OES_shader_multisample_interpolation */
+
</ins><span class="cx"> #ifndef GL_OES_standard_derivatives
</span><span class="cx"> #define GL_OES_standard_derivatives 1
</span><del>-#endif
</del><ins>+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B
+#endif /* GL_OES_standard_derivatives */
</ins><span class="cx"> 
</span><del>-/* GL_OES_stencil1 */
</del><span class="cx"> #ifndef GL_OES_stencil1
</span><span class="cx"> #define GL_OES_stencil1 1
</span><del>-#endif
</del><ins>+#define GL_STENCIL_INDEX1_OES             0x8D46
+#endif /* GL_OES_stencil1 */
</ins><span class="cx"> 
</span><del>-/* GL_OES_stencil4 */
</del><span class="cx"> #ifndef GL_OES_stencil4
</span><span class="cx"> #define GL_OES_stencil4 1
</span><del>-#endif
</del><ins>+#define GL_STENCIL_INDEX4_OES             0x8D47
+#endif /* GL_OES_stencil4 */
</ins><span class="cx"> 
</span><span class="cx"> #ifndef GL_OES_surfaceless_context
</span><span class="cx"> #define GL_OES_surfaceless_context 1
</span><ins>+#define GL_FRAMEBUFFER_UNDEFINED_OES      0x8219
+#endif /* GL_OES_surfaceless_context */
+
+#ifndef GL_OES_tessellation_point_size
+#define GL_OES_tessellation_point_size 1
+#endif /* GL_OES_tessellation_point_size */
+
+#ifndef GL_OES_tessellation_shader
+#define GL_OES_tessellation_shader 1
+#define GL_PATCHES_OES                    0x000E
+#define GL_PATCH_VERTICES_OES             0x8E72
+#define GL_TESS_CONTROL_OUTPUT_VERTICES_OES 0x8E75
+#define GL_TESS_GEN_MODE_OES              0x8E76
+#define GL_TESS_GEN_SPACING_OES           0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER_OES      0x8E78
+#define GL_TESS_GEN_POINT_MODE_OES        0x8E79
+#define GL_ISOLINES_OES                   0x8E7A
+#define GL_QUADS_OES                      0x0007
+#define GL_FRACTIONAL_ODD_OES             0x8E7B
+#define GL_FRACTIONAL_EVEN_OES            0x8E7C
+#define GL_MAX_PATCH_VERTICES_OES         0x8E7D
+#define GL_MAX_TESS_GEN_LEVEL_OES         0x8E7E
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E7F
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E80
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES 0x8E81
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES 0x8E82
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES 0x8E83
+#define GL_MAX_TESS_PATCH_COMPONENTS_OES  0x8E84
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES 0x8E85
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES 0x8E86
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES 0x8E89
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES 0x8E8A
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES 0x886C
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES 0x886D
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E1F
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES 0x92CD
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES 0x92CE
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES 0x92D3
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES 0x92D4
+#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES 0x90CB
+#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES 0x90CC
+#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES 0x90D8
+#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES 0x90D9
+#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES 0x8221
+#define GL_IS_PER_PATCH_OES               0x92E7
+#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES 0x9307
+#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES 0x9308
+#define GL_TESS_CONTROL_SHADER_OES        0x8E88
+#define GL_TESS_EVALUATION_SHADER_OES     0x8E87
+#define GL_TESS_CONTROL_SHADER_BIT_OES    0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT_OES 0x00000010
+typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIOESPROC) (GLenum pname, GLint value);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glPatchParameteriOES (GLenum pname, GLint value);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_OES_tessellation_shader */
</ins><span class="cx"> 
</span><del>-/* GL_OES_texture_3D */
</del><span class="cx"> #ifndef GL_OES_texture_3D
</span><span class="cx"> #define GL_OES_texture_3D 1
</span><ins>+#define GL_TEXTURE_WRAP_R_OES             0x8072
+#define GL_TEXTURE_3D_OES                 0x806F
+#define GL_TEXTURE_BINDING_3D_OES         0x806A
+#define GL_MAX_3D_TEXTURE_SIZE_OES        0x8073
+#define GL_SAMPLER_3D_OES                 0x8B5F
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
-GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);
</del><ins>+GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
</span><del>-GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
-GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);
</del><ins>+GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
-typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);
-typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
-typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);
-typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOES) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
</del><ins>+#endif /* GL_OES_texture_3D */
+
+#ifndef GL_OES_texture_border_clamp
+#define GL_OES_texture_border_clamp 1
+#define GL_TEXTURE_BORDER_COLOR_OES       0x1004
+#define GL_CLAMP_TO_BORDER_OES            0x812D
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, const GLuint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, const GLuint *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexParameterIivOES (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexParameterIuivOES (GLenum target, GLenum pname, const GLuint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIivOES (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIuivOES (GLenum target, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glSamplerParameterIivOES (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterIuivOES (GLuint sampler, GLenum pname, const GLuint *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIivOES (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivOES (GLuint sampler, GLenum pname, GLuint *params);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_OES_texture_border_clamp */
</ins><span class="cx"> 
</span><del>-/* GL_OES_texture_float */
</del><ins>+#ifndef GL_OES_texture_buffer
+#define GL_OES_texture_buffer 1
+#define GL_TEXTURE_BUFFER_OES             0x8C2A
+#define GL_TEXTURE_BUFFER_BINDING_OES     0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE_OES    0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER_OES     0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES 0x8C2D
+#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES 0x919F
+#define GL_SAMPLER_BUFFER_OES             0x8DC2
+#define GL_INT_SAMPLER_BUFFER_OES         0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_OES 0x8DD8
+#define GL_IMAGE_BUFFER_OES               0x9051
+#define GL_INT_IMAGE_BUFFER_OES           0x905C
+#define GL_UNSIGNED_INT_IMAGE_BUFFER_OES  0x9067
+#define GL_TEXTURE_BUFFER_OFFSET_OES      0x919D
+#define GL_TEXTURE_BUFFER_SIZE_OES        0x919E
+typedef void (GL_APIENTRYP PFNGLTEXBUFFEROESPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEOESPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexBufferOES (GLenum target, GLenum internalformat, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTexBufferRangeOES (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+#endif
+#endif /* GL_OES_texture_buffer */
+
+#ifndef GL_OES_texture_compression_astc
+#define GL_OES_texture_compression_astc 1
+#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0
+#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1
+#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2
+#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3
+#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4
+#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5
+#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6
+#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7
+#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8
+#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9
+#endif /* GL_OES_texture_compression_astc */
+
+#ifndef GL_OES_texture_cube_map_array
+#define GL_OES_texture_cube_map_array 1
+#define GL_TEXTURE_CUBE_MAP_ARRAY_OES     0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES 0x900A
+#define GL_SAMPLER_CUBE_MAP_ARRAY_OES     0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900F
+#define GL_IMAGE_CUBE_MAP_ARRAY_OES       0x9054
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY_OES   0x905F
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x906A
+#endif /* GL_OES_texture_cube_map_array */
+
</ins><span class="cx"> #ifndef GL_OES_texture_float
</span><span class="cx"> #define GL_OES_texture_float 1
</span><del>-#endif
</del><ins>+#endif /* GL_OES_texture_float */
</ins><span class="cx"> 
</span><del>-/* GL_OES_texture_float_linear */
</del><span class="cx"> #ifndef GL_OES_texture_float_linear
</span><span class="cx"> #define GL_OES_texture_float_linear 1
</span><del>-#endif
</del><ins>+#endif /* GL_OES_texture_float_linear */
</ins><span class="cx"> 
</span><del>-/* GL_OES_texture_half_float */
</del><span class="cx"> #ifndef GL_OES_texture_half_float
</span><span class="cx"> #define GL_OES_texture_half_float 1
</span><del>-#endif
</del><ins>+#define GL_HALF_FLOAT_OES                 0x8D61
+#endif /* GL_OES_texture_half_float */
</ins><span class="cx"> 
</span><del>-/* GL_OES_texture_half_float_linear */
</del><span class="cx"> #ifndef GL_OES_texture_half_float_linear
</span><span class="cx"> #define GL_OES_texture_half_float_linear 1
</span><del>-#endif
</del><ins>+#endif /* GL_OES_texture_half_float_linear */
</ins><span class="cx"> 
</span><del>-/* GL_OES_texture_npot */
</del><span class="cx"> #ifndef GL_OES_texture_npot
</span><span class="cx"> #define GL_OES_texture_npot 1
</span><ins>+#endif /* GL_OES_texture_npot */
+
+#ifndef GL_OES_texture_stencil8
+#define GL_OES_texture_stencil8 1
+#define GL_STENCIL_INDEX_OES              0x1901
+#define GL_STENCIL_INDEX8_OES             0x8D48
+#endif /* GL_OES_texture_stencil8 */
+
+#ifndef GL_OES_texture_storage_multisample_2d_array
+#define GL_OES_texture_storage_multisample_2d_array 1
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES 0x9102
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES 0x9105
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910D
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexStorage3DMultisampleOES (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_OES_texture_storage_multisample_2d_array */
</ins><span class="cx"> 
</span><del>-/* GL_OES_vertex_array_object */
</del><ins>+#ifndef GL_OES_texture_view
+#define GL_OES_texture_view 1
+#define GL_TEXTURE_VIEW_MIN_LEVEL_OES     0x82DB
+#define GL_TEXTURE_VIEW_NUM_LEVELS_OES    0x82DC
+#define GL_TEXTURE_VIEW_MIN_LAYER_OES     0x82DD
+#define GL_TEXTURE_VIEW_NUM_LAYERS_OES    0x82DE
+#define GL_TEXTURE_IMMUTABLE_LEVELS       0x82DF
+typedef void (GL_APIENTRYP PFNGLTEXTUREVIEWOESPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTextureViewOES (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+#endif
+#endif /* GL_OES_texture_view */
+
</ins><span class="cx"> #ifndef GL_OES_vertex_array_object
</span><span class="cx"> #define GL_OES_vertex_array_object 1
</span><ins>+#define GL_VERTEX_ARRAY_BINDING_OES       0x85B5
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays);
+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays);
</span><span class="cx"> GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array);
-typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays);
-typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays);
-typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array);
-#endif
</del><ins>+#endif /* GL_OES_vertex_array_object */
</ins><span class="cx"> 
</span><del>-/* GL_OES_vertex_half_float */
</del><span class="cx"> #ifndef GL_OES_vertex_half_float
</span><span class="cx"> #define GL_OES_vertex_half_float 1
</span><del>-#endif
</del><ins>+#endif /* GL_OES_vertex_half_float */
</ins><span class="cx"> 
</span><del>-/* GL_OES_vertex_type_10_10_10_2 */
</del><span class="cx"> #ifndef GL_OES_vertex_type_10_10_10_2
</span><span class="cx"> #define GL_OES_vertex_type_10_10_10_2 1
</span><del>-#endif
</del><ins>+#define GL_UNSIGNED_INT_10_10_10_2_OES    0x8DF6
+#define GL_INT_10_10_10_2_OES             0x8DF7
+#endif /* GL_OES_vertex_type_10_10_10_2 */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * KHR extension functions
- *------------------------------------------------------------------------*/
-
-#ifndef GL_KHR_debug
-#define GL_KHR_debug 1
-#ifdef GL_GLEXT_PROTOTYPES
-GL_APICALL void GL_APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
-GL_APICALL void GL_APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
-GL_APICALL void GL_APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam);
-GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
-GL_APICALL void GL_APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message);
-GL_APICALL void GL_APIENTRY glPopDebugGroup (void);
-GL_APICALL void GL_APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
-GL_APICALL void GL_APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
-GL_APICALL void GL_APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label);
-GL_APICALL void GL_APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
-GL_APICALL void GL_APIENTRY glGetPointerv (GLenum pname, void **params);
-#endif 
-typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
-typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
-typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam);
-typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
-typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message);
-typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void);
-typedef void (GL_APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
-typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
-typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label);
-typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
-typedef void (GL_APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, void **params);
-#endif
-
-#ifndef GL_KHR_texture_compression_astc_ldr
-#define GL_KHR_texture_compression_astc_ldr 1
-#endif
-
-
-/*------------------------------------------------------------------------*
- * AMD extension functions
- *------------------------------------------------------------------------*/
-
-/* GL_AMD_compressed_3DC_texture */
</del><span class="cx"> #ifndef GL_AMD_compressed_3DC_texture
</span><span class="cx"> #define GL_AMD_compressed_3DC_texture 1
</span><del>-#endif
</del><ins>+#define GL_3DC_X_AMD                      0x87F9
+#define GL_3DC_XY_AMD                     0x87FA
+#endif /* GL_AMD_compressed_3DC_texture */
</ins><span class="cx"> 
</span><del>-/* GL_AMD_compressed_ATC_texture */
</del><span class="cx"> #ifndef GL_AMD_compressed_ATC_texture
</span><span class="cx"> #define GL_AMD_compressed_ATC_texture 1
</span><del>-#endif
</del><ins>+#define GL_ATC_RGB_AMD                    0x8C92
+#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD    0x8C93
+#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE
+#endif /* GL_AMD_compressed_ATC_texture */
</ins><span class="cx"> 
</span><del>-/* AMD_performance_monitor */
</del><span class="cx"> #ifndef GL_AMD_performance_monitor
</span><span class="cx"> #define GL_AMD_performance_monitor 1
</span><ins>+#define GL_COUNTER_TYPE_AMD               0x8BC0
+#define GL_COUNTER_RANGE_AMD              0x8BC1
+#define GL_UNSIGNED_INT64_AMD             0x8BC2
+#define GL_PERCENTAGE_AMD                 0x8BC3
+#define GL_PERFMON_RESULT_AVAILABLE_AMD   0x8BC4
+#define GL_PERFMON_RESULT_SIZE_AMD        0x8BC5
+#define GL_PERFMON_RESULT_AMD             0x8BC6
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups);
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data);
+typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);
+typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);
+typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList);
+typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);
+typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);
</span><del>-GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data);
</del><ins>+GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors);
</span><del>-GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList);
</del><ins>+GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups);
-typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);
-typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);
-typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);
-typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data);
-typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);
-typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);
-typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList);
-typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);
-typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);
-typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);
-#endif
</del><ins>+#endif /* GL_AMD_performance_monitor */
</ins><span class="cx"> 
</span><del>-/* GL_AMD_program_binary_Z400 */
</del><span class="cx"> #ifndef GL_AMD_program_binary_Z400
</span><span class="cx"> #define GL_AMD_program_binary_Z400 1
</span><del>-#endif
</del><ins>+#define GL_Z400_BINARY_AMD                0x8740
+#endif /* GL_AMD_program_binary_Z400 */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * ANGLE extension functions
- *------------------------------------------------------------------------*/
</del><ins>+#ifndef GL_ANDROID_extension_pack_es31a
+#define GL_ANDROID_extension_pack_es31a 1
+#endif /* GL_ANDROID_extension_pack_es31a */
</ins><span class="cx"> 
</span><del>-/* GL_ANGLE_depth_texture */
</del><span class="cx"> #ifndef GL_ANGLE_depth_texture
</span><span class="cx"> #define GL_ANGLE_depth_texture 1
</span><del>-#endif
</del><ins>+#endif /* GL_ANGLE_depth_texture */
</ins><span class="cx"> 
</span><del>-/* GL_ANGLE_framebuffer_blit */
</del><span class="cx"> #ifndef GL_ANGLE_framebuffer_blit
</span><span class="cx"> #define GL_ANGLE_framebuffer_blit 1
</span><ins>+#define GL_READ_FRAMEBUFFER_ANGLE         0x8CA8
+#define GL_DRAW_FRAMEBUFFER_ANGLE         0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6
+#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA
+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-#endif
</del><ins>+#endif /* GL_ANGLE_framebuffer_blit */
</ins><span class="cx"> 
</span><del>-/* GL_ANGLE_framebuffer_multisample */
</del><span class="cx"> #ifndef GL_ANGLE_framebuffer_multisample
</span><span class="cx"> #define GL_ANGLE_framebuffer_multisample 1
</span><ins>+#define GL_RENDERBUFFER_SAMPLES_ANGLE     0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56
+#define GL_MAX_SAMPLES_ANGLE              0x8D57
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-#endif
</del><ins>+#endif /* GL_ANGLE_framebuffer_multisample */
</ins><span class="cx"> 
</span><del>-#ifndef GL_ANGLE_instanced_arrays 
</del><ins>+#ifndef GL_ANGLE_instanced_arrays
</ins><span class="cx"> #define GL_ANGLE_instanced_arrays 1
</span><ins>+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
-typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
-typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor);
-#endif
</del><ins>+#endif /* GL_ANGLE_instanced_arrays */
</ins><span class="cx"> 
</span><del>-/* GL_ANGLE_pack_reverse_row_order */
-#ifndef GL_ANGLE_pack_reverse_row_order 
</del><ins>+#ifndef GL_ANGLE_pack_reverse_row_order
</ins><span class="cx"> #define GL_ANGLE_pack_reverse_row_order 1
</span><del>-#endif
</del><ins>+#define GL_PACK_REVERSE_ROW_ORDER_ANGLE   0x93A4
+#endif /* GL_ANGLE_pack_reverse_row_order */
</ins><span class="cx"> 
</span><del>-/* GL_ANGLE_program_binary */
</del><span class="cx"> #ifndef GL_ANGLE_program_binary
</span><span class="cx"> #define GL_ANGLE_program_binary 1
</span><del>-#endif
</del><ins>+#define GL_PROGRAM_BINARY_ANGLE           0x93A6
+#endif /* GL_ANGLE_program_binary */
</ins><span class="cx"> 
</span><del>-/* GL_ANGLE_texture_compression_dxt3 */
-#ifndef GL_ANGLE_texture_compression_dxt3 
</del><ins>+#ifndef GL_ANGLE_texture_compression_dxt3
</ins><span class="cx"> #define GL_ANGLE_texture_compression_dxt3 1
</span><del>-#endif
</del><ins>+#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2
+#endif /* GL_ANGLE_texture_compression_dxt3 */
</ins><span class="cx"> 
</span><del>-/* GL_ANGLE_texture_compression_dxt5 */
-#ifndef GL_ANGLE_texture_compression_dxt5 
</del><ins>+#ifndef GL_ANGLE_texture_compression_dxt5
</ins><span class="cx"> #define GL_ANGLE_texture_compression_dxt5 1
</span><del>-#endif
</del><ins>+#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3
+#endif /* GL_ANGLE_texture_compression_dxt5 */
</ins><span class="cx"> 
</span><del>-/* GL_ANGLE_texture_usage */
-#ifndef GL_ANGLE_texture_usage 
</del><ins>+#ifndef GL_ANGLE_texture_usage
</ins><span class="cx"> #define GL_ANGLE_texture_usage 1
</span><del>-#endif
</del><ins>+#define GL_TEXTURE_USAGE_ANGLE            0x93A2
+#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE   0x93A3
+#endif /* GL_ANGLE_texture_usage */
</ins><span class="cx"> 
</span><del>-#ifndef GL_ANGLE_translated_shader_source 
</del><ins>+#ifndef GL_ANGLE_translated_shader_source
</ins><span class="cx"> #define GL_ANGLE_translated_shader_source 1
</span><ins>+#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
+typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);
-#endif
</del><ins>+#endif /* GL_ANGLE_translated_shader_source */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * APPLE extension functions
- *------------------------------------------------------------------------*/
</del><ins>+#ifndef GL_APPLE_clip_distance
+#define GL_APPLE_clip_distance 1
+#define GL_MAX_CLIP_DISTANCES_APPLE       0x0D32
+#define GL_CLIP_DISTANCE0_APPLE           0x3000
+#define GL_CLIP_DISTANCE1_APPLE           0x3001
+#define GL_CLIP_DISTANCE2_APPLE           0x3002
+#define GL_CLIP_DISTANCE3_APPLE           0x3003
+#define GL_CLIP_DISTANCE4_APPLE           0x3004
+#define GL_CLIP_DISTANCE5_APPLE           0x3005
+#define GL_CLIP_DISTANCE6_APPLE           0x3006
+#define GL_CLIP_DISTANCE7_APPLE           0x3007
+#endif /* GL_APPLE_clip_distance */
</ins><span class="cx"> 
</span><del>-/* GL_APPLE_copy_texture_levels */
</del><ins>+#ifndef GL_APPLE_color_buffer_packed_float
+#define GL_APPLE_color_buffer_packed_float 1
+#endif /* GL_APPLE_color_buffer_packed_float */
+
</ins><span class="cx"> #ifndef GL_APPLE_copy_texture_levels
</span><span class="cx"> #define GL_APPLE_copy_texture_levels 1
</span><ins>+typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
-#endif
</del><ins>+#endif /* GL_APPLE_copy_texture_levels */
</ins><span class="cx"> 
</span><del>-/* GL_APPLE_framebuffer_multisample */
</del><span class="cx"> #ifndef GL_APPLE_framebuffer_multisample
</span><span class="cx"> #define GL_APPLE_framebuffer_multisample 1
</span><ins>+#define GL_RENDERBUFFER_SAMPLES_APPLE     0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56
+#define GL_MAX_SAMPLES_APPLE              0x8D57
+#define GL_READ_FRAMEBUFFER_APPLE         0x8CA8
+#define GL_DRAW_FRAMEBUFFER_APPLE         0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6
+#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum, GLsizei, GLenum, GLsizei, GLsizei);
</del><ins>+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void);
</span><del>-#endif /* GL_GLEXT_PROTOTYPES */
-typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void);
</del><span class="cx"> #endif
</span><ins>+#endif /* GL_APPLE_framebuffer_multisample */
</ins><span class="cx"> 
</span><del>-/* GL_APPLE_rgb_422 */
</del><span class="cx"> #ifndef GL_APPLE_rgb_422
</span><span class="cx"> #define GL_APPLE_rgb_422 1
</span><del>-#endif
</del><ins>+#define GL_RGB_422_APPLE                  0x8A1F
+#define GL_UNSIGNED_SHORT_8_8_APPLE       0x85BA
+#define GL_UNSIGNED_SHORT_8_8_REV_APPLE   0x85BB
+#define GL_RGB_RAW_422_APPLE              0x8A51
+#endif /* GL_APPLE_rgb_422 */
</ins><span class="cx"> 
</span><del>-/* GL_APPLE_sync */
</del><span class="cx"> #ifndef GL_APPLE_sync
</span><span class="cx"> #define GL_APPLE_sync 1
</span><ins>+#define GL_SYNC_OBJECT_APPLE              0x8A53
+#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE  0x9111
+#define GL_OBJECT_TYPE_APPLE              0x9112
+#define GL_SYNC_CONDITION_APPLE           0x9113
+#define GL_SYNC_STATUS_APPLE              0x9114
+#define GL_SYNC_FLAGS_APPLE               0x9115
+#define GL_SYNC_FENCE_APPLE               0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117
+#define GL_UNSIGNALED_APPLE               0x9118
+#define GL_SIGNALED_APPLE                 0x9119
+#define GL_ALREADY_SIGNALED_APPLE         0x911A
+#define GL_TIMEOUT_EXPIRED_APPLE          0x911B
+#define GL_CONDITION_SATISFIED_APPLE      0x911C
+#define GL_WAIT_FAILED_APPLE              0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE  0x00000001
+#define GL_TIMEOUT_IGNORED_APPLE          0xFFFFFFFFFFFFFFFFull
+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync);
+typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync);
+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags);
</span><span class="cx"> GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync);
</span><span class="lines">@@ -1374,287 +964,892 @@
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
</span><span class="cx"> #endif
</span><del>-typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags);
-typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync);
-typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync);
-typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
-typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
-typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params);
-typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
-#endif
</del><ins>+#endif /* GL_APPLE_sync */
</ins><span class="cx"> 
</span><del>-/* GL_APPLE_texture_format_BGRA8888 */
</del><span class="cx"> #ifndef GL_APPLE_texture_format_BGRA8888
</span><span class="cx"> #define GL_APPLE_texture_format_BGRA8888 1
</span><del>-#endif
</del><ins>+#define GL_BGRA_EXT                       0x80E1
+#define GL_BGRA8_EXT                      0x93A1
+#endif /* GL_APPLE_texture_format_BGRA8888 */
</ins><span class="cx"> 
</span><del>-/* GL_APPLE_texture_max_level */
</del><span class="cx"> #ifndef GL_APPLE_texture_max_level
</span><span class="cx"> #define GL_APPLE_texture_max_level 1
</span><del>-#endif
</del><ins>+#define GL_TEXTURE_MAX_LEVEL_APPLE        0x813D
+#endif /* GL_APPLE_texture_max_level */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * ARM extension functions
- *------------------------------------------------------------------------*/
</del><ins>+#ifndef GL_APPLE_texture_packed_float
+#define GL_APPLE_texture_packed_float 1
+#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B
+#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E
+#define GL_R11F_G11F_B10F_APPLE           0x8C3A
+#define GL_RGB9_E5_APPLE                  0x8C3D
+#endif /* GL_APPLE_texture_packed_float */
</ins><span class="cx"> 
</span><del>-/* GL_ARM_mali_program_binary */
</del><span class="cx"> #ifndef GL_ARM_mali_program_binary
</span><span class="cx"> #define GL_ARM_mali_program_binary 1
</span><del>-#endif
</del><ins>+#define GL_MALI_PROGRAM_BINARY_ARM        0x8F61
+#endif /* GL_ARM_mali_program_binary */
</ins><span class="cx"> 
</span><del>-/* GL_ARM_mali_shader_binary */
</del><span class="cx"> #ifndef GL_ARM_mali_shader_binary
</span><span class="cx"> #define GL_ARM_mali_shader_binary 1
</span><del>-#endif
</del><ins>+#define GL_MALI_SHADER_BINARY_ARM         0x8F60
+#endif /* GL_ARM_mali_shader_binary */
</ins><span class="cx"> 
</span><del>-/* GL_ARM_rgba8 */
</del><span class="cx"> #ifndef GL_ARM_rgba8
</span><span class="cx"> #define GL_ARM_rgba8 1
</span><ins>+#endif /* GL_ARM_rgba8 */
+
+#ifndef GL_ARM_shader_framebuffer_fetch
+#define GL_ARM_shader_framebuffer_fetch 1
+#define GL_FETCH_PER_SAMPLE_ARM           0x8F65
+#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66
+#endif /* GL_ARM_shader_framebuffer_fetch */
+
+#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil
+#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1
+#endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */
+
+#ifndef GL_DMP_program_binary
+#define GL_DMP_program_binary 1
+#define GL_SMAPHS30_PROGRAM_BINARY_DMP    0x9251
+#define GL_SMAPHS_PROGRAM_BINARY_DMP      0x9252
+#define GL_DMP_PROGRAM_BINARY_DMP         0x9253
+#endif /* GL_DMP_program_binary */
+
+#ifndef GL_DMP_shader_binary
+#define GL_DMP_shader_binary 1
+#define GL_SHADER_BINARY_DMP              0x9250
+#endif /* GL_DMP_shader_binary */
+
+#ifndef GL_EXT_YUV_target
+#define GL_EXT_YUV_target 1
+#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT    0x8BE7
+#endif /* GL_EXT_YUV_target */
+
+#ifndef GL_EXT_base_instance
+#define GL_EXT_base_instance 1
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawArraysInstancedBaseInstanceEXT (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseInstanceEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexBaseInstanceEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_EXT_base_instance */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * EXT extension functions
- *------------------------------------------------------------------------*/
</del><ins>+#ifndef GL_EXT_blend_func_extended
+#define GL_EXT_blend_func_extended 1
+#define GL_SRC1_COLOR_EXT                 0x88F9
+#define GL_SRC1_ALPHA_EXT                 0x8589
+#define GL_ONE_MINUS_SRC1_COLOR_EXT       0x88FA
+#define GL_ONE_MINUS_SRC1_ALPHA_EXT       0x88FB
+#define GL_SRC_ALPHA_SATURATE_EXT         0x0308
+#define GL_LOCATION_INDEX_EXT             0x930F
+#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC
+typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name);
+typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar *name);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBindFragDataLocationIndexedEXT (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name);
+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocationIndexEXT (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL GLint GL_APIENTRY glGetFragDataIndexEXT (GLuint program, const GLchar *name);
+#endif
+#endif /* GL_EXT_blend_func_extended */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_blend_minmax */
</del><span class="cx"> #ifndef GL_EXT_blend_minmax
</span><span class="cx"> #define GL_EXT_blend_minmax 1
</span><ins>+#define GL_MIN_EXT                        0x8007
+#define GL_MAX_EXT                        0x8008
+#endif /* GL_EXT_blend_minmax */
+
+#ifndef GL_EXT_buffer_storage
+#define GL_EXT_buffer_storage 1
+#define GL_MAP_READ_BIT                   0x0001
+#define GL_MAP_WRITE_BIT                  0x0002
+#define GL_MAP_PERSISTENT_BIT_EXT         0x0040
+#define GL_MAP_COHERENT_BIT_EXT           0x0080
+#define GL_DYNAMIC_STORAGE_BIT_EXT        0x0100
+#define GL_CLIENT_STORAGE_BIT_EXT         0x0200
+#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000
+#define GL_BUFFER_IMMUTABLE_STORAGE_EXT   0x821F
+#define GL_BUFFER_STORAGE_FLAGS_EXT       0x8220
+typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBufferStorageEXT (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_EXT_buffer_storage */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_color_buffer_half_float */
</del><ins>+#ifndef GL_EXT_color_buffer_float
+#define GL_EXT_color_buffer_float 1
+#endif /* GL_EXT_color_buffer_float */
+
</ins><span class="cx"> #ifndef GL_EXT_color_buffer_half_float
</span><span class="cx"> #define GL_EXT_color_buffer_half_float 1
</span><ins>+#define GL_RGBA16F_EXT                    0x881A
+#define GL_RGB16F_EXT                     0x881B
+#define GL_RG16F_EXT                      0x822F
+#define GL_R16F_EXT                       0x822D
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211
+#define GL_UNSIGNED_NORMALIZED_EXT        0x8C17
+#endif /* GL_EXT_color_buffer_half_float */
+
+#ifndef GL_EXT_copy_image
+#define GL_EXT_copy_image 1
+typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glCopyImageSubDataEXT (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_EXT_copy_image */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_debug_label */
</del><span class="cx"> #ifndef GL_EXT_debug_label
</span><span class="cx"> #define GL_EXT_debug_label 1
</span><ins>+#define GL_PROGRAM_PIPELINE_OBJECT_EXT    0x8A4F
+#define GL_PROGRAM_OBJECT_EXT             0x8B40
+#define GL_SHADER_OBJECT_EXT              0x8B48
+#define GL_BUFFER_OBJECT_EXT              0x9151
+#define GL_QUERY_OBJECT_EXT               0x9153
+#define GL_VERTEX_ARRAY_OBJECT_EXT        0x9154
+#define GL_TRANSFORM_FEEDBACK             0x8E22
+typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label);
-typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
-#endif
</del><ins>+#endif /* GL_EXT_debug_label */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_debug_marker */
</del><span class="cx"> #ifndef GL_EXT_debug_marker
</span><span class="cx"> #define GL_EXT_debug_marker 1
</span><ins>+typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker);
+typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker);
+typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker);
-typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker);
-typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void);
-#endif
</del><ins>+#endif /* GL_EXT_debug_marker */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_discard_framebuffer */
</del><span class="cx"> #ifndef GL_EXT_discard_framebuffer
</span><span class="cx"> #define GL_EXT_discard_framebuffer 1
</span><ins>+#define GL_COLOR_EXT                      0x1800
+#define GL_DEPTH_EXT                      0x1801
+#define GL_STENCIL_EXT                    0x1802
+typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
</del><ins>+#endif /* GL_EXT_discard_framebuffer */
+
+#ifndef GL_EXT_disjoint_timer_query
+#define GL_EXT_disjoint_timer_query 1
+#define GL_QUERY_COUNTER_BITS_EXT         0x8864
+#define GL_CURRENT_QUERY_EXT              0x8865
+#define GL_QUERY_RESULT_EXT               0x8866
+#define GL_QUERY_RESULT_AVAILABLE_EXT     0x8867
+#define GL_TIME_ELAPSED_EXT               0x88BF
+#define GL_TIMESTAMP_EXT                  0x8E28
+#define GL_GPU_DISJOINT_EXT               0x8FBB
+typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target);
+GL_APICALL void GL_APIENTRY glQueryCounterEXT (GLuint id, GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectivEXT (GLuint id, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_EXT_disjoint_timer_query */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_map_buffer_range */
</del><ins>+#ifndef GL_EXT_draw_buffers
+#define GL_EXT_draw_buffers 1
+#define GL_MAX_COLOR_ATTACHMENTS_EXT      0x8CDF
+#define GL_MAX_DRAW_BUFFERS_EXT           0x8824
+#define GL_DRAW_BUFFER0_EXT               0x8825
+#define GL_DRAW_BUFFER1_EXT               0x8826
+#define GL_DRAW_BUFFER2_EXT               0x8827
+#define GL_DRAW_BUFFER3_EXT               0x8828
+#define GL_DRAW_BUFFER4_EXT               0x8829
+#define GL_DRAW_BUFFER5_EXT               0x882A
+#define GL_DRAW_BUFFER6_EXT               0x882B
+#define GL_DRAW_BUFFER7_EXT               0x882C
+#define GL_DRAW_BUFFER8_EXT               0x882D
+#define GL_DRAW_BUFFER9_EXT               0x882E
+#define GL_DRAW_BUFFER10_EXT              0x882F
+#define GL_DRAW_BUFFER11_EXT              0x8830
+#define GL_DRAW_BUFFER12_EXT              0x8831
+#define GL_DRAW_BUFFER13_EXT              0x8832
+#define GL_DRAW_BUFFER14_EXT              0x8833
+#define GL_DRAW_BUFFER15_EXT              0x8834
+#define GL_COLOR_ATTACHMENT0_EXT          0x8CE0
+#define GL_COLOR_ATTACHMENT1_EXT          0x8CE1
+#define GL_COLOR_ATTACHMENT2_EXT          0x8CE2
+#define GL_COLOR_ATTACHMENT3_EXT          0x8CE3
+#define GL_COLOR_ATTACHMENT4_EXT          0x8CE4
+#define GL_COLOR_ATTACHMENT5_EXT          0x8CE5
+#define GL_COLOR_ATTACHMENT6_EXT          0x8CE6
+#define GL_COLOR_ATTACHMENT7_EXT          0x8CE7
+#define GL_COLOR_ATTACHMENT8_EXT          0x8CE8
+#define GL_COLOR_ATTACHMENT9_EXT          0x8CE9
+#define GL_COLOR_ATTACHMENT10_EXT         0x8CEA
+#define GL_COLOR_ATTACHMENT11_EXT         0x8CEB
+#define GL_COLOR_ATTACHMENT12_EXT         0x8CEC
+#define GL_COLOR_ATTACHMENT13_EXT         0x8CED
+#define GL_COLOR_ATTACHMENT14_EXT         0x8CEE
+#define GL_COLOR_ATTACHMENT15_EXT         0x8CEF
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei n, const GLenum *bufs);
+#endif
+#endif /* GL_EXT_draw_buffers */
+
+#ifndef GL_EXT_draw_buffers_indexed
+#define GL_EXT_draw_buffers_indexed 1
+typedef void (GL_APIENTRYP PFNGLENABLEIEXTPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKIEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glEnableiEXT (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glDisableiEXT (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glBlendEquationiEXT (GLuint buf, GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparateiEXT (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunciEXT (GLuint buf, GLenum src, GLenum dst);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparateiEXT (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+GL_APICALL void GL_APIENTRY glColorMaskiEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+GL_APICALL GLboolean GL_APIENTRY glIsEnablediEXT (GLenum target, GLuint index);
+#endif
+#endif /* GL_EXT_draw_buffers_indexed */
+
+#ifndef GL_EXT_draw_elements_base_vertex
+#define GL_EXT_draw_elements_base_vertex 1
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex);
+#endif
+#endif /* GL_EXT_draw_elements_base_vertex */
+
+#ifndef GL_EXT_draw_instanced
+#define GL_EXT_draw_instanced 1
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+#endif
+#endif /* GL_EXT_draw_instanced */
+
+#ifndef GL_EXT_float_blend
+#define GL_EXT_float_blend 1
+#endif /* GL_EXT_float_blend */
+
+#ifndef GL_EXT_geometry_point_size
+#define GL_EXT_geometry_point_size 1
+#endif /* GL_EXT_geometry_point_size */
+
+#ifndef GL_EXT_geometry_shader
+#define GL_EXT_geometry_shader 1
+#define GL_GEOMETRY_SHADER_EXT            0x8DD9
+#define GL_GEOMETRY_SHADER_BIT_EXT        0x00000004
+#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916
+#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917
+#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918
+#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F
+#define GL_LAYER_PROVOKING_VERTEX_EXT     0x825E
+#define GL_LINES_ADJACENCY_EXT            0x000A
+#define GL_LINE_STRIP_ADJACENCY_EXT       0x000B
+#define GL_TRIANGLES_ADJACENCY_EXT        0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY_EXT   0x000D
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5
+#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD
+#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7
+#define GL_FIRST_VERTEX_CONVENTION_EXT    0x8E4D
+#define GL_LAST_VERTEX_CONVENTION_EXT     0x8E4E
+#define GL_UNDEFINED_VERTEX_EXT           0x8260
+#define GL_PRIMITIVES_GENERATED_EXT       0x8C87
+#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312
+#define GL_MAX_FRAMEBUFFER_LAYERS_EXT     0x9317
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7
+#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level);
+#endif
+#endif /* GL_EXT_geometry_shader */
+
+#ifndef GL_EXT_gpu_shader5
+#define GL_EXT_gpu_shader5 1
+#endif /* GL_EXT_gpu_shader5 */
+
+#ifndef GL_EXT_instanced_arrays
+#define GL_EXT_instanced_arrays 1
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glVertexAttribDivisorEXT (GLuint index, GLuint divisor);
+#endif
+#endif /* GL_EXT_instanced_arrays */
+
</ins><span class="cx"> #ifndef GL_EXT_map_buffer_range
</span><span class="cx"> #define GL_EXT_map_buffer_range 1
</span><ins>+#define GL_MAP_READ_BIT_EXT               0x0001
+#define GL_MAP_WRITE_BIT_EXT              0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT_EXT   0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT  0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT     0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT_EXT     0x0020
+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void* GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
</del><ins>+GL_APICALL void *GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length);
</span><span class="cx"> #endif
</span><del>-typedef void* (GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
-typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
</del><ins>+#endif /* GL_EXT_map_buffer_range */
+
+#ifndef GL_EXT_multi_draw_arrays
+#define GL_EXT_multi_draw_arrays 1
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_EXT_multi_draw_arrays */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_multisampled_render_to_texture */
</del><ins>+#ifndef GL_EXT_multi_draw_indirect
+#define GL_EXT_multi_draw_indirect 1
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glMultiDrawArraysIndirectEXT (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+GL_APICALL void GL_APIENTRY glMultiDrawElementsIndirectEXT (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+#endif
+#endif /* GL_EXT_multi_draw_indirect */
+
+#ifndef GL_EXT_multisampled_compatibility
+#define GL_EXT_multisampled_compatibility 1
+#define GL_MULTISAMPLE_EXT                0x809D
+#define GL_SAMPLE_ALPHA_TO_ONE_EXT        0x809F
+#endif /* GL_EXT_multisampled_compatibility */
+
</ins><span class="cx"> #ifndef GL_EXT_multisampled_render_to_texture
</span><span class="cx"> #define GL_EXT_multisampled_render_to_texture 1
</span><del>-#ifdef GL_GLEXT_PROTOTYPES
-GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum, GLsizei, GLenum, GLsizei, GLsizei);
-GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei);
-#endif
</del><ins>+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C
+#define GL_RENDERBUFFER_SAMPLES_EXT       0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
+#define GL_MAX_SAMPLES_EXT                0x8D57
</ins><span class="cx"> typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
</span><span class="cx"> typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
</span><ins>+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_EXT_multisampled_render_to_texture */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_multiview_draw_buffers */
</del><span class="cx"> #ifndef GL_EXT_multiview_draw_buffers
</span><span class="cx"> #define GL_EXT_multiview_draw_buffers 1
</span><ins>+#define GL_COLOR_ATTACHMENT_EXT           0x90F0
+#define GL_MULTIVIEW_EXT                  0x90F1
+#define GL_DRAW_BUFFER_EXT                0x0C01
+#define GL_READ_BUFFER_EXT                0x0C02
+#define GL_MAX_MULTIVIEW_BUFFERS_EXT      0x90F2
+typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index);
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index);
-typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices);
-typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data);
-#endif
</del><ins>+#endif /* GL_EXT_multiview_draw_buffers */
</ins><span class="cx"> 
</span><del>-#ifndef GL_EXT_multi_draw_arrays
-#define GL_EXT_multi_draw_arrays 1
</del><ins>+#ifndef GL_EXT_occlusion_query_boolean
+#define GL_EXT_occlusion_query_boolean 1
+#define GL_ANY_SAMPLES_PASSED_EXT         0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A
+#endif /* GL_EXT_occlusion_query_boolean */
+
+#ifndef GL_EXT_post_depth_coverage
+#define GL_EXT_post_depth_coverage 1
+#endif /* GL_EXT_post_depth_coverage */
+
+#ifndef GL_EXT_primitive_bounding_box
+#define GL_EXT_primitive_bounding_box 1
+#define GL_PRIMITIVE_BOUNDING_BOX_EXT     0x92BE
+typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXEXTPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum, const GLint *, const GLsizei *, GLsizei);
-GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei);
-#endif /* GL_GLEXT_PROTOTYPES */
-typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount);
-typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount);
</del><ins>+GL_APICALL void GL_APIENTRY glPrimitiveBoundingBoxEXT (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_EXT_primitive_bounding_box */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_occlusion_query_boolean */
-#ifndef GL_EXT_occlusion_query_boolean
-#define GL_EXT_occlusion_query_boolean 1
</del><ins>+#ifndef GL_EXT_pvrtc_sRGB
+#define GL_EXT_pvrtc_sRGB 1
+#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54
+#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55
+#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56
+#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57
+#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG 0x93F0
+#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG 0x93F1
+#endif /* GL_EXT_pvrtc_sRGB */
+
+#ifndef GL_EXT_raster_multisample
+#define GL_EXT_raster_multisample 1
+#define GL_RASTER_MULTISAMPLE_EXT         0x9327
+#define GL_RASTER_SAMPLES_EXT             0x9328
+#define GL_MAX_RASTER_SAMPLES_EXT         0x9329
+#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A
+#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B
+#define GL_EFFECTIVE_RASTER_SAMPLES_EXT   0x932C
+typedef void (GL_APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids);
-GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids);
-GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id);
-GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id);
-GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target);
-GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params);
-GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params);
</del><ins>+GL_APICALL void GL_APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations);
</ins><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids);
-typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids);
-typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id);
-typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id);
-typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target);
-typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
-typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params);
-#endif
</del><ins>+#endif /* GL_EXT_raster_multisample */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_read_format_bgra */
</del><span class="cx"> #ifndef GL_EXT_read_format_bgra
</span><span class="cx"> #define GL_EXT_read_format_bgra 1
</span><del>-#endif
</del><ins>+#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365
+#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366
+#endif /* GL_EXT_read_format_bgra */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_robustness */
</del><ins>+#ifndef GL_EXT_render_snorm
+#define GL_EXT_render_snorm 1
+#define GL_R8_SNORM                       0x8F94
+#define GL_RG8_SNORM                      0x8F95
+#define GL_RGBA8_SNORM                    0x8F97
+#define GL_R16_SNORM_EXT                  0x8F98
+#define GL_RG16_SNORM_EXT                 0x8F99
+#define GL_RGBA16_SNORM_EXT               0x8F9B
+#endif /* GL_EXT_render_snorm */
+
</ins><span class="cx"> #ifndef GL_EXT_robustness
</span><span class="cx"> #define GL_EXT_robustness 1
</span><ins>+#define GL_GUILTY_CONTEXT_RESET_EXT       0x8253
+#define GL_INNOCENT_CONTEXT_RESET_EXT     0x8254
+#define GL_UNKNOWN_CONTEXT_RESET_EXT      0x8255
+#define GL_CONTEXT_ROBUST_ACCESS_EXT      0x90F3
+#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256
+#define GL_LOSE_CONTEXT_ON_RESET_EXT      0x8252
+#define GL_NO_RESET_NOTIFICATION_EXT      0x8261
+typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void);
+typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
</span><del>-GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, float *params);
</del><ins>+GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params);
</span><span class="cx"> #endif
</span><del>-typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void);
-typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
-typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, float *params);
-typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
-#endif
</del><ins>+#endif /* GL_EXT_robustness */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_separate_shader_objects */
</del><ins>+#ifndef GL_EXT_sRGB
+#define GL_EXT_sRGB 1
+#define GL_SRGB_EXT                       0x8C40
+#define GL_SRGB_ALPHA_EXT                 0x8C42
+#define GL_SRGB8_ALPHA8_EXT               0x8C43
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210
+#endif /* GL_EXT_sRGB */
+
+#ifndef GL_EXT_sRGB_write_control
+#define GL_EXT_sRGB_write_control 1
+#define GL_FRAMEBUFFER_SRGB_EXT           0x8DB9
+#endif /* GL_EXT_sRGB_write_control */
+
</ins><span class="cx"> #ifndef GL_EXT_separate_shader_objects
</span><span class="cx"> #define GL_EXT_separate_shader_objects 1
</span><ins>+#define GL_ACTIVE_PROGRAM_EXT             0x8259
+#define GL_VERTEX_SHADER_BIT_EXT          0x00000001
+#define GL_FRAGMENT_SHADER_BIT_EXT        0x00000002
+#define GL_ALL_SHADER_BITS_EXT            0xFFFFFFFF
+#define GL_PROGRAM_SEPARABLE_EXT          0x8258
+#define GL_PROGRAM_PIPELINE_BINDING_EXT   0x825A
+typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program);
+typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines);
+typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program);
</del><span class="cx"> GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program);
</span><ins>+GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline);
</ins><span class="cx"> GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings);
</span><del>-GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline);
</del><span class="cx"> GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines);
</span><ins>+GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params);
</ins><span class="cx"> GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value);
</span><del>-GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params);
-GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint x);
-GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint x, GLint y);
-GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z);
-GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);
-GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat x);
-GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat x, GLfloat y);
-GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);
-GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
</del><ins>+GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
</span><ins>+GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
</span><ins>+GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
</span><ins>+GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
</span><del>-GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
-GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
-GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
-GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
</del><span class="cx"> GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
</span><ins>+GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program);
</ins><span class="cx"> GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline);
</span><del>-GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
</del><ins>+GL_APICALL void GL_APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
</ins><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
-typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program);
-typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings);
-typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
-typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines);
-typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines);
-typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
-typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);
-typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint x);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint x, GLint y);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat x);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
-typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-#endif
</del><ins>+#endif /* GL_EXT_separate_shader_objects */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_shader_framebuffer_fetch */
</del><span class="cx"> #ifndef GL_EXT_shader_framebuffer_fetch
</span><span class="cx"> #define GL_EXT_shader_framebuffer_fetch 1
</span><del>-#endif
</del><ins>+#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52
+#endif /* GL_EXT_shader_framebuffer_fetch */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_shader_texture_lod */
</del><ins>+#ifndef GL_EXT_shader_implicit_conversions
+#define GL_EXT_shader_implicit_conversions 1
+#endif /* GL_EXT_shader_implicit_conversions */
+
+#ifndef GL_EXT_shader_integer_mix
+#define GL_EXT_shader_integer_mix 1
+#endif /* GL_EXT_shader_integer_mix */
+
+#ifndef GL_EXT_shader_io_blocks
+#define GL_EXT_shader_io_blocks 1
+#endif /* GL_EXT_shader_io_blocks */
+
+#ifndef GL_EXT_shader_pixel_local_storage
+#define GL_EXT_shader_pixel_local_storage 1
+#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63
+#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67
+#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64
+#endif /* GL_EXT_shader_pixel_local_storage */
+
</ins><span class="cx"> #ifndef GL_EXT_shader_texture_lod
</span><span class="cx"> #define GL_EXT_shader_texture_lod 1
</span><del>-#endif
</del><ins>+#endif /* GL_EXT_shader_texture_lod */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_shadow_samplers */
</del><span class="cx"> #ifndef GL_EXT_shadow_samplers
</span><span class="cx"> #define GL_EXT_shadow_samplers 1
</span><ins>+#define GL_TEXTURE_COMPARE_MODE_EXT       0x884C
+#define GL_TEXTURE_COMPARE_FUNC_EXT       0x884D
+#define GL_COMPARE_REF_TO_TEXTURE_EXT     0x884E
+#define GL_SAMPLER_2D_SHADOW_EXT          0x8B62
+#endif /* GL_EXT_shadow_samplers */
+
+#ifndef GL_EXT_sparse_texture
+#define GL_EXT_sparse_texture 1
+#define GL_TEXTURE_SPARSE_EXT             0x91A6
+#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT    0x91A7
+#define GL_NUM_SPARSE_LEVELS_EXT          0x91AA
+#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT     0x91A8
+#define GL_VIRTUAL_PAGE_SIZE_X_EXT        0x9195
+#define GL_VIRTUAL_PAGE_SIZE_Y_EXT        0x9196
+#define GL_VIRTUAL_PAGE_SIZE_Z_EXT        0x9197
+#define GL_TEXTURE_2D_ARRAY               0x8C1A
+#define GL_TEXTURE_3D                     0x806F
+#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT    0x9198
+#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199
+#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A
+#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9
+typedef void (GL_APIENTRYP PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexPageCommitmentEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_EXT_sparse_texture */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_sRGB */
-#ifndef GL_EXT_sRGB
-#define GL_EXT_sRGB 1
</del><ins>+#ifndef GL_EXT_tessellation_point_size
+#define GL_EXT_tessellation_point_size 1
+#endif /* GL_EXT_tessellation_point_size */
+
+#ifndef GL_EXT_tessellation_shader
+#define GL_EXT_tessellation_shader 1
+#define GL_PATCHES_EXT                    0x000E
+#define GL_PATCH_VERTICES_EXT             0x8E72
+#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75
+#define GL_TESS_GEN_MODE_EXT              0x8E76
+#define GL_TESS_GEN_SPACING_EXT           0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER_EXT      0x8E78
+#define GL_TESS_GEN_POINT_MODE_EXT        0x8E79
+#define GL_ISOLINES_EXT                   0x8E7A
+#define GL_QUADS_EXT                      0x0007
+#define GL_FRACTIONAL_ODD_EXT             0x8E7B
+#define GL_FRACTIONAL_EVEN_EXT            0x8E7C
+#define GL_MAX_PATCH_VERTICES_EXT         0x8E7D
+#define GL_MAX_TESS_GEN_LEVEL_EXT         0x8E7E
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E7F
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E80
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT 0x8E81
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT 0x8E82
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT 0x8E83
+#define GL_MAX_TESS_PATCH_COMPONENTS_EXT  0x8E84
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT 0x8E85
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT 0x8E86
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT 0x8E89
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT 0x8E8A
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT 0x886C
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT 0x886D
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E1F
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT 0x92CD
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT 0x92CE
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT 0x92D3
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT 0x92D4
+#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT 0x90CB
+#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT 0x90CC
+#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT 0x90D8
+#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT 0x90D9
+#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221
+#define GL_IS_PER_PATCH_EXT               0x92E7
+#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT 0x9307
+#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT 0x9308
+#define GL_TESS_CONTROL_SHADER_EXT        0x8E88
+#define GL_TESS_EVALUATION_SHADER_EXT     0x8E87
+#define GL_TESS_CONTROL_SHADER_BIT_EXT    0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010
+typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIEXTPROC) (GLenum pname, GLint value);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glPatchParameteriEXT (GLenum pname, GLint value);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_EXT_tessellation_shader */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_texture_compression_dxt1 */
</del><ins>+#ifndef GL_EXT_texture_border_clamp
+#define GL_EXT_texture_border_clamp 1
+#define GL_TEXTURE_BORDER_COLOR_EXT       0x1004
+#define GL_CLAMP_TO_BORDER_EXT            0x812D
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, const GLuint *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glSamplerParameterIivEXT (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterIuivEXT (GLuint sampler, GLenum pname, const GLuint *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIivEXT (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivEXT (GLuint sampler, GLenum pname, GLuint *params);
+#endif
+#endif /* GL_EXT_texture_border_clamp */
+
+#ifndef GL_EXT_texture_buffer
+#define GL_EXT_texture_buffer 1
+#define GL_TEXTURE_BUFFER_EXT             0x8C2A
+#define GL_TEXTURE_BUFFER_BINDING_EXT     0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT    0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER_EXT     0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D
+#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT 0x919F
+#define GL_SAMPLER_BUFFER_EXT             0x8DC2
+#define GL_INT_SAMPLER_BUFFER_EXT         0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8
+#define GL_IMAGE_BUFFER_EXT               0x9051
+#define GL_INT_IMAGE_BUFFER_EXT           0x905C
+#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT  0x9067
+#define GL_TEXTURE_BUFFER_OFFSET_EXT      0x919D
+#define GL_TEXTURE_BUFFER_SIZE_EXT        0x919E
+typedef void (GL_APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEEXTPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+#endif
+#endif /* GL_EXT_texture_buffer */
+
</ins><span class="cx"> #ifndef GL_EXT_texture_compression_dxt1
</span><span class="cx"> #define GL_EXT_texture_compression_dxt1 1
</span><del>-#endif
</del><ins>+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT   0x83F0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT  0x83F1
+#endif /* GL_EXT_texture_compression_dxt1 */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_texture_filter_anisotropic */
</del><ins>+#ifndef GL_EXT_texture_compression_s3tc
+#define GL_EXT_texture_compression_s3tc 1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT  0x83F2
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT  0x83F3
+#endif /* GL_EXT_texture_compression_s3tc */
+
+#ifndef GL_EXT_texture_cube_map_array
+#define GL_EXT_texture_cube_map_array 1
+#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT     0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A
+#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT     0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F
+#define GL_IMAGE_CUBE_MAP_ARRAY_EXT       0x9054
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT   0x905F
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A
+#endif /* GL_EXT_texture_cube_map_array */
+
</ins><span class="cx"> #ifndef GL_EXT_texture_filter_anisotropic
</span><span class="cx"> #define GL_EXT_texture_filter_anisotropic 1
</span><del>-#endif
</del><ins>+#define GL_TEXTURE_MAX_ANISOTROPY_EXT     0x84FE
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+#endif /* GL_EXT_texture_filter_anisotropic */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_texture_format_BGRA8888 */
</del><ins>+#ifndef GL_EXT_texture_filter_minmax
+#define GL_EXT_texture_filter_minmax 1
+#endif /* GL_EXT_texture_filter_minmax */
+
</ins><span class="cx"> #ifndef GL_EXT_texture_format_BGRA8888
</span><span class="cx"> #define GL_EXT_texture_format_BGRA8888 1
</span><del>-#endif
</del><ins>+#endif /* GL_EXT_texture_format_BGRA8888 */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_texture_rg */
</del><ins>+#ifndef GL_EXT_texture_norm16
+#define GL_EXT_texture_norm16 1
+#define GL_R16_EXT                        0x822A
+#define GL_RG16_EXT                       0x822C
+#define GL_RGBA16_EXT                     0x805B
+#define GL_RGB16_EXT                      0x8054
+#define GL_RGB16_SNORM_EXT                0x8F9A
+#endif /* GL_EXT_texture_norm16 */
+
</ins><span class="cx"> #ifndef GL_EXT_texture_rg
</span><span class="cx"> #define GL_EXT_texture_rg 1
</span><del>-#endif
</del><ins>+#define GL_RED_EXT                        0x1903
+#define GL_RG_EXT                         0x8227
+#define GL_R8_EXT                         0x8229
+#define GL_RG8_EXT                        0x822B
+#endif /* GL_EXT_texture_rg */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_texture_storage */
</del><ins>+#ifndef GL_EXT_texture_sRGB_R8
+#define GL_EXT_texture_sRGB_R8 1
+#define GL_SR8_EXT                        0x8FBD
+#endif /* GL_EXT_texture_sRGB_R8 */
+
+#ifndef GL_EXT_texture_sRGB_RG8
+#define GL_EXT_texture_sRGB_RG8 1
+#define GL_SRG8_EXT                       0x8FBE
+#endif /* GL_EXT_texture_sRGB_RG8 */
+
+#ifndef GL_EXT_texture_sRGB_decode
+#define GL_EXT_texture_sRGB_decode 1
+#define GL_TEXTURE_SRGB_DECODE_EXT        0x8A48
+#define GL_DECODE_EXT                     0x8A49
+#define GL_SKIP_DECODE_EXT                0x8A4A
+#endif /* GL_EXT_texture_sRGB_decode */
+
</ins><span class="cx"> #ifndef GL_EXT_texture_storage
</span><span class="cx"> #define GL_EXT_texture_storage 1
</span><ins>+#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT   0x912F
+#define GL_ALPHA8_EXT                     0x803C
+#define GL_LUMINANCE8_EXT                 0x8040
+#define GL_LUMINANCE8_ALPHA8_EXT          0x8045
+#define GL_RGBA32F_EXT                    0x8814
+#define GL_RGB32F_EXT                     0x8815
+#define GL_ALPHA32F_EXT                   0x8816
+#define GL_LUMINANCE32F_EXT               0x8818
+#define GL_LUMINANCE_ALPHA32F_EXT         0x8819
+#define GL_ALPHA16F_EXT                   0x881C
+#define GL_LUMINANCE16F_EXT               0x881E
+#define GL_LUMINANCE_ALPHA16F_EXT         0x881F
+#define GL_R32F_EXT                       0x822E
+#define GL_RG32F_EXT                      0x8230
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
</span><span class="lines">@@ -1663,148 +1858,356 @@
</span><span class="cx"> GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
-typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
-typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-#endif
</del><ins>+#endif /* GL_EXT_texture_storage */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_texture_type_2_10_10_10_REV */
</del><span class="cx"> #ifndef GL_EXT_texture_type_2_10_10_10_REV
</span><span class="cx"> #define GL_EXT_texture_type_2_10_10_10_REV 1
</span><ins>+#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368
+#endif /* GL_EXT_texture_type_2_10_10_10_REV */
+
+#ifndef GL_EXT_texture_view
+#define GL_EXT_texture_view 1
+#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT     0x82DB
+#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT    0x82DC
+#define GL_TEXTURE_VIEW_MIN_LAYER_EXT     0x82DD
+#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT    0x82DE
+typedef void (GL_APIENTRYP PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTextureViewEXT (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_EXT_texture_view */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_unpack_subimage */
</del><span class="cx"> #ifndef GL_EXT_unpack_subimage
</span><span class="cx"> #define GL_EXT_unpack_subimage 1
</span><del>-#endif
</del><ins>+#define GL_UNPACK_ROW_LENGTH_EXT          0x0CF2
+#define GL_UNPACK_SKIP_ROWS_EXT           0x0CF3
+#define GL_UNPACK_SKIP_PIXELS_EXT         0x0CF4
+#endif /* GL_EXT_unpack_subimage */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * DMP extension functions
- *------------------------------------------------------------------------*/
-
-/* GL_DMP_shader_binary */
-#ifndef GL_DMP_shader_binary
-#define GL_DMP_shader_binary 1
-#endif
-
-/*------------------------------------------------------------------------*
- * FJ extension functions
- *------------------------------------------------------------------------*/
-
-/* GL_FJ_shader_binary_GCCSO */
</del><span class="cx"> #ifndef GL_FJ_shader_binary_GCCSO
</span><span class="cx"> #define GL_FJ_shader_binary_GCCSO 1
</span><ins>+#define GL_GCCSO_SHADER_BINARY_FJ         0x9260
+#endif /* GL_FJ_shader_binary_GCCSO */
+
+#ifndef GL_IMG_multisampled_render_to_texture
+#define GL_IMG_multisampled_render_to_texture 1
+#define GL_RENDERBUFFER_SAMPLES_IMG       0x9133
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134
+#define GL_MAX_SAMPLES_IMG                0x9135
+#define GL_TEXTURE_SAMPLES_IMG            0x9136
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_IMG_multisampled_render_to_texture */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * IMG extension functions
- *------------------------------------------------------------------------*/
-
-/* GL_IMG_program_binary */
</del><span class="cx"> #ifndef GL_IMG_program_binary
</span><span class="cx"> #define GL_IMG_program_binary 1
</span><del>-#endif
</del><ins>+#define GL_SGX_PROGRAM_BINARY_IMG         0x9130
+#endif /* GL_IMG_program_binary */
</ins><span class="cx"> 
</span><del>-/* GL_IMG_read_format */
</del><span class="cx"> #ifndef GL_IMG_read_format
</span><span class="cx"> #define GL_IMG_read_format 1
</span><del>-#endif
</del><ins>+#define GL_BGRA_IMG                       0x80E1
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365
+#endif /* GL_IMG_read_format */
</ins><span class="cx"> 
</span><del>-/* GL_IMG_shader_binary */
</del><span class="cx"> #ifndef GL_IMG_shader_binary
</span><span class="cx"> #define GL_IMG_shader_binary 1
</span><del>-#endif
</del><ins>+#define GL_SGX_BINARY_IMG                 0x8C0A
+#endif /* GL_IMG_shader_binary */
</ins><span class="cx"> 
</span><del>-/* GL_IMG_texture_compression_pvrtc */
</del><span class="cx"> #ifndef GL_IMG_texture_compression_pvrtc
</span><span class="cx"> #define GL_IMG_texture_compression_pvrtc 1
</span><del>-#endif
</del><ins>+#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00
+#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01
+#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02
+#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03
+#endif /* GL_IMG_texture_compression_pvrtc */
</ins><span class="cx"> 
</span><del>-/* GL_IMG_texture_compression_pvrtc2 */
</del><span class="cx"> #ifndef GL_IMG_texture_compression_pvrtc2
</span><span class="cx"> #define GL_IMG_texture_compression_pvrtc2 1
</span><ins>+#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137
+#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138
+#endif /* GL_IMG_texture_compression_pvrtc2 */
+
+#ifndef GL_INTEL_framebuffer_CMAA
+#define GL_INTEL_framebuffer_CMAA 1
+typedef void (GL_APIENTRYP PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glApplyFramebufferAttachmentCMAAINTEL (void);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_INTEL_framebuffer_CMAA */
</ins><span class="cx"> 
</span><del>-/* GL_IMG_multisampled_render_to_texture */
-#ifndef GL_IMG_multisampled_render_to_texture
-#define GL_IMG_multisampled_render_to_texture 1
</del><ins>+#ifndef GL_INTEL_performance_query
+#define GL_INTEL_performance_query 1
+#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000
+#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001
+#define GL_PERFQUERY_WAIT_INTEL           0x83FB
+#define GL_PERFQUERY_FLUSH_INTEL          0x83FA
+#define GL_PERFQUERY_DONOT_FLUSH_INTEL    0x83F9
+#define GL_PERFQUERY_COUNTER_EVENT_INTEL  0x94F0
+#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1
+#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2
+#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3
+#define GL_PERFQUERY_COUNTER_RAW_INTEL    0x94F4
+#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5
+#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8
+#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9
+#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA
+#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB
+#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC
+#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD
+#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE
+#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF
+#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500
+typedef void (GL_APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle);
+typedef void (GL_APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle);
+typedef void (GL_APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle);
+typedef void (GL_APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle);
+typedef void (GL_APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId);
+typedef void (GL_APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId);
+typedef void (GL_APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue);
+typedef void (GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten);
+typedef void (GL_APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId);
+typedef void (GL_APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum, GLsizei, GLenum, GLsizei, GLsizei);
-GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei);
</del><ins>+GL_APICALL void GL_APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle);
+GL_APICALL void GL_APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle);
+GL_APICALL void GL_APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle);
+GL_APICALL void GL_APIENTRY glEndPerfQueryINTEL (GLuint queryHandle);
+GL_APICALL void GL_APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId);
+GL_APICALL void GL_APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId);
+GL_APICALL void GL_APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue);
+GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten);
+GL_APICALL void GL_APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId);
+GL_APICALL void GL_APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask);
</ins><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
</del><ins>+#endif /* GL_INTEL_performance_query */
+
+#ifndef GL_NV_bindless_texture
+#define GL_NV_bindless_texture 1
+typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture);
+typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle);
+typedef void (GL_APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle);
+typedef GLuint64 (GL_APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
+typedef void (GL_APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access);
+typedef void (GL_APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle);
+typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values);
+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle);
+typedef GLboolean (GL_APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL GLuint64 GL_APIENTRY glGetTextureHandleNV (GLuint texture);
+GL_APICALL GLuint64 GL_APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler);
+GL_APICALL void GL_APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle);
+GL_APICALL void GL_APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle);
+GL_APICALL GLuint64 GL_APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
+GL_APICALL void GL_APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access);
+GL_APICALL void GL_APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle);
+GL_APICALL void GL_APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value);
+GL_APICALL void GL_APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value);
+GL_APICALL void GL_APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value);
+GL_APICALL void GL_APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values);
+GL_APICALL GLboolean GL_APIENTRY glIsTextureHandleResidentNV (GLuint64 handle);
+GL_APICALL GLboolean GL_APIENTRY glIsImageHandleResidentNV (GLuint64 handle);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_NV_bindless_texture */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * NV extension functions
- *------------------------------------------------------------------------*/
</del><ins>+#ifndef GL_NV_blend_equation_advanced
+#define GL_NV_blend_equation_advanced 1
+#define GL_BLEND_OVERLAP_NV               0x9281
+#define GL_BLEND_PREMULTIPLIED_SRC_NV     0x9280
+#define GL_BLUE_NV                        0x1905
+#define GL_COLORBURN_NV                   0x929A
+#define GL_COLORDODGE_NV                  0x9299
+#define GL_CONJOINT_NV                    0x9284
+#define GL_CONTRAST_NV                    0x92A1
+#define GL_DARKEN_NV                      0x9297
+#define GL_DIFFERENCE_NV                  0x929E
+#define GL_DISJOINT_NV                    0x9283
+#define GL_DST_ATOP_NV                    0x928F
+#define GL_DST_IN_NV                      0x928B
+#define GL_DST_NV                         0x9287
+#define GL_DST_OUT_NV                     0x928D
+#define GL_DST_OVER_NV                    0x9289
+#define GL_EXCLUSION_NV                   0x92A0
+#define GL_GREEN_NV                       0x1904
+#define GL_HARDLIGHT_NV                   0x929B
+#define GL_HARDMIX_NV                     0x92A9
+#define GL_HSL_COLOR_NV                   0x92AF
+#define GL_HSL_HUE_NV                     0x92AD
+#define GL_HSL_LUMINOSITY_NV              0x92B0
+#define GL_HSL_SATURATION_NV              0x92AE
+#define GL_INVERT_OVG_NV                  0x92B4
+#define GL_INVERT_RGB_NV                  0x92A3
+#define GL_LIGHTEN_NV                     0x9298
+#define GL_LINEARBURN_NV                  0x92A5
+#define GL_LINEARDODGE_NV                 0x92A4
+#define GL_LINEARLIGHT_NV                 0x92A7
+#define GL_MINUS_CLAMPED_NV               0x92B3
+#define GL_MINUS_NV                       0x929F
+#define GL_MULTIPLY_NV                    0x9294
+#define GL_OVERLAY_NV                     0x9296
+#define GL_PINLIGHT_NV                    0x92A8
+#define GL_PLUS_CLAMPED_ALPHA_NV          0x92B2
+#define GL_PLUS_CLAMPED_NV                0x92B1
+#define GL_PLUS_DARKER_NV                 0x9292
+#define GL_PLUS_NV                        0x9291
+#define GL_RED_NV                         0x1903
+#define GL_SCREEN_NV                      0x9295
+#define GL_SOFTLIGHT_NV                   0x929C
+#define GL_SRC_ATOP_NV                    0x928E
+#define GL_SRC_IN_NV                      0x928A
+#define GL_SRC_NV                         0x9286
+#define GL_SRC_OUT_NV                     0x928C
+#define GL_SRC_OVER_NV                    0x9288
+#define GL_UNCORRELATED_NV                0x9282
+#define GL_VIVIDLIGHT_NV                  0x92A6
+#define GL_XOR_NV                         0x1506
+typedef void (GL_APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLBLENDBARRIERNVPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBlendParameteriNV (GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glBlendBarrierNV (void);
+#endif
+#endif /* GL_NV_blend_equation_advanced */
</ins><span class="cx"> 
</span><del>-/* GL_NV_coverage_sample */
</del><ins>+#ifndef GL_NV_blend_equation_advanced_coherent
+#define GL_NV_blend_equation_advanced_coherent 1
+#define GL_BLEND_ADVANCED_COHERENT_NV     0x9285
+#endif /* GL_NV_blend_equation_advanced_coherent */
+
+#ifndef GL_NV_conditional_render
+#define GL_NV_conditional_render 1
+#define GL_QUERY_WAIT_NV                  0x8E13
+#define GL_QUERY_NO_WAIT_NV               0x8E14
+#define GL_QUERY_BY_REGION_WAIT_NV        0x8E15
+#define GL_QUERY_BY_REGION_NO_WAIT_NV     0x8E16
+typedef void (GL_APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode);
+typedef void (GL_APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode);
+GL_APICALL void GL_APIENTRY glEndConditionalRenderNV (void);
+#endif
+#endif /* GL_NV_conditional_render */
+
+#ifndef GL_NV_conservative_raster
+#define GL_NV_conservative_raster 1
+#define GL_CONSERVATIVE_RASTERIZATION_NV  0x9346
+#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347
+#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348
+#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349
+typedef void (GL_APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits);
+#endif
+#endif /* GL_NV_conservative_raster */
+
+#ifndef GL_NV_copy_buffer
+#define GL_NV_copy_buffer 1
+#define GL_COPY_READ_BUFFER_NV            0x8F36
+#define GL_COPY_WRITE_BUFFER_NV           0x8F37
+typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glCopyBufferSubDataNV (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+#endif
+#endif /* GL_NV_copy_buffer */
+
</ins><span class="cx"> #ifndef GL_NV_coverage_sample
</span><span class="cx"> #define GL_NV_coverage_sample 1
</span><ins>+#define GL_COVERAGE_COMPONENT_NV          0x8ED0
+#define GL_COVERAGE_COMPONENT4_NV         0x8ED1
+#define GL_COVERAGE_ATTACHMENT_NV         0x8ED2
+#define GL_COVERAGE_BUFFERS_NV            0x8ED3
+#define GL_COVERAGE_SAMPLES_NV            0x8ED4
+#define GL_COVERAGE_ALL_FRAGMENTS_NV      0x8ED5
+#define GL_COVERAGE_EDGE_FRAGMENTS_NV     0x8ED6
+#define GL_COVERAGE_AUTOMATIC_NV          0x8ED7
+#define GL_COVERAGE_BUFFER_BIT_NV         0x00008000
+typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask);
+typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask);
-typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation);
-#endif
</del><ins>+#endif /* GL_NV_coverage_sample */
</ins><span class="cx"> 
</span><del>-/* GL_NV_depth_nonlinear */
</del><span class="cx"> #ifndef GL_NV_depth_nonlinear
</span><span class="cx"> #define GL_NV_depth_nonlinear 1
</span><del>-#endif
</del><ins>+#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C
+#endif /* GL_NV_depth_nonlinear */
</ins><span class="cx"> 
</span><del>-/* GL_NV_draw_buffers */
</del><span class="cx"> #ifndef GL_NV_draw_buffers
</span><span class="cx"> #define GL_NV_draw_buffers 1
</span><ins>+#define GL_MAX_DRAW_BUFFERS_NV            0x8824
+#define GL_DRAW_BUFFER0_NV                0x8825
+#define GL_DRAW_BUFFER1_NV                0x8826
+#define GL_DRAW_BUFFER2_NV                0x8827
+#define GL_DRAW_BUFFER3_NV                0x8828
+#define GL_DRAW_BUFFER4_NV                0x8829
+#define GL_DRAW_BUFFER5_NV                0x882A
+#define GL_DRAW_BUFFER6_NV                0x882B
+#define GL_DRAW_BUFFER7_NV                0x882C
+#define GL_DRAW_BUFFER8_NV                0x882D
+#define GL_DRAW_BUFFER9_NV                0x882E
+#define GL_DRAW_BUFFER10_NV               0x882F
+#define GL_DRAW_BUFFER11_NV               0x8830
+#define GL_DRAW_BUFFER12_NV               0x8831
+#define GL_DRAW_BUFFER13_NV               0x8832
+#define GL_DRAW_BUFFER14_NV               0x8833
+#define GL_DRAW_BUFFER15_NV               0x8834
+#define GL_COLOR_ATTACHMENT0_NV           0x8CE0
+#define GL_COLOR_ATTACHMENT1_NV           0x8CE1
+#define GL_COLOR_ATTACHMENT2_NV           0x8CE2
+#define GL_COLOR_ATTACHMENT3_NV           0x8CE3
+#define GL_COLOR_ATTACHMENT4_NV           0x8CE4
+#define GL_COLOR_ATTACHMENT5_NV           0x8CE5
+#define GL_COLOR_ATTACHMENT6_NV           0x8CE6
+#define GL_COLOR_ATTACHMENT7_NV           0x8CE7
+#define GL_COLOR_ATTACHMENT8_NV           0x8CE8
+#define GL_COLOR_ATTACHMENT9_NV           0x8CE9
+#define GL_COLOR_ATTACHMENT10_NV          0x8CEA
+#define GL_COLOR_ATTACHMENT11_NV          0x8CEB
+#define GL_COLOR_ATTACHMENT12_NV          0x8CEC
+#define GL_COLOR_ATTACHMENT13_NV          0x8CED
+#define GL_COLOR_ATTACHMENT14_NV          0x8CEE
+#define GL_COLOR_ATTACHMENT15_NV          0x8CEF
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs);
-#endif
</del><ins>+#endif /* GL_NV_draw_buffers */
</ins><span class="cx"> 
</span><del>-/* GL_EXT_draw_buffers */
-#ifndef GL_EXT_draw_buffers
-#define GL_EXT_draw_buffers 1
-#ifdef GL_GLEXT_PROTOTYPES
-GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei n, const GLenum *bufs);
-#endif
-typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs);
-#endif
-
-/* GL_NV_draw_instanced */
</del><span class="cx"> #ifndef GL_NV_draw_instanced
</span><span class="cx"> #define GL_NV_draw_instanced 1
</span><ins>+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glDrawArraysInstancedNV (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
</span><del>-GL_APICALL void GL_APIENTRY glDrawElementsInstancedNV (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);
</del><ins>+GL_APICALL void GL_APIENTRY glDrawElementsInstancedNV (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
</ins><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
-typedef void (GL_APIENTRYP PFNDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);
-#endif
</del><ins>+#endif /* GL_NV_draw_instanced */
</ins><span class="cx"> 
</span><del>-/* GL_NV_fbo_color_attachments */
</del><ins>+#ifndef GL_NV_explicit_attrib_location
+#define GL_NV_explicit_attrib_location 1
+#endif /* GL_NV_explicit_attrib_location */
+
</ins><span class="cx"> #ifndef GL_NV_fbo_color_attachments
</span><span class="cx"> #define GL_NV_fbo_color_attachments 1
</span><del>-#endif
</del><ins>+#define GL_MAX_COLOR_ATTACHMENTS_NV       0x8CDF
+#endif /* GL_NV_fbo_color_attachments */
</ins><span class="cx"> 
</span><del>-/* GL_NV_fence */
</del><span class="cx"> #ifndef GL_NV_fence
</span><span class="cx"> #define GL_NV_fence 1
</span><del>-#ifdef GL_GLEXT_PROTOTYPES
-GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei, const GLuint *);
-GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei, GLuint *);
-GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint);
-GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint);
-GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *);
-GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint);
-GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint, GLenum);
-#endif
</del><ins>+#define GL_ALL_COMPLETED_NV               0x84F2
+#define GL_FENCE_STATUS_NV                0x84F3
+#define GL_FENCE_CONDITION_NV             0x84F4
</ins><span class="cx"> typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences);
</span><span class="cx"> typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences);
</span><span class="cx"> typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence);
</span><span class="lines">@@ -1812,135 +2215,628 @@
</span><span class="cx"> typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params);
</span><span class="cx"> typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence);
</span><span class="cx"> typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);
</span><ins>+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences);
+GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences);
+GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint fence);
+GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint fence);
+GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint fence);
+GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_NV_fence */
</ins><span class="cx"> 
</span><del>-/* GL_NV_framebuffer_blit */
</del><ins>+#ifndef GL_NV_fill_rectangle
+#define GL_NV_fill_rectangle 1
+#define GL_FILL_RECTANGLE_NV              0x933C
+#endif /* GL_NV_fill_rectangle */
+
+#ifndef GL_NV_fragment_coverage_to_color
+#define GL_NV_fragment_coverage_to_color 1
+#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV  0x92DD
+#define GL_FRAGMENT_COVERAGE_COLOR_NV     0x92DE
+typedef void (GL_APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFragmentCoverageColorNV (GLuint color);
+#endif
+#endif /* GL_NV_fragment_coverage_to_color */
+
+#ifndef GL_NV_fragment_shader_interlock
+#define GL_NV_fragment_shader_interlock 1
+#endif /* GL_NV_fragment_shader_interlock */
+
</ins><span class="cx"> #ifndef GL_NV_framebuffer_blit
</span><span class="cx"> #define GL_NV_framebuffer_blit 1
</span><ins>+#define GL_READ_FRAMEBUFFER_NV            0x8CA8
+#define GL_DRAW_FRAMEBUFFER_NV            0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING_NV    0x8CA6
+#define GL_READ_FRAMEBUFFER_BINDING_NV    0x8CAA
+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void GL_APIENTRY glBlitFramebufferNV (int srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
</del><ins>+GL_APICALL void GL_APIENTRY glBlitFramebufferNV (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
</ins><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
</del><ins>+#endif /* GL_NV_framebuffer_blit */
+
+#ifndef GL_NV_framebuffer_mixed_samples
+#define GL_NV_framebuffer_mixed_samples 1
+#define GL_COVERAGE_MODULATION_TABLE_NV   0x9331
+#define GL_COLOR_SAMPLES_NV               0x8E20
+#define GL_DEPTH_SAMPLES_NV               0x932D
+#define GL_STENCIL_SAMPLES_NV             0x932E
+#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F
+#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330
+#define GL_COVERAGE_MODULATION_NV         0x9332
+#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333
+typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glGetCoverageModulationTableNV (GLsizei bufsize, GLfloat *v);
+GL_APICALL void GL_APIENTRY glCoverageModulationNV (GLenum components);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_NV_framebuffer_mixed_samples */
</ins><span class="cx"> 
</span><del>-/* GL_NV_framebuffer_multisample */
</del><span class="cx"> #ifndef GL_NV_framebuffer_multisample
</span><span class="cx"> #define GL_NV_framebuffer_multisample 1
</span><ins>+#define GL_RENDERBUFFER_SAMPLES_NV        0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56
+#define GL_MAX_SAMPLES_NV                 0x8D57
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><del>-GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleNV ( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
</del><ins>+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleNV (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
</ins><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNRENDERBUFFERSTORAGEMULTISAMPLENVPROC) ( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-#endif
</del><ins>+#endif /* GL_NV_framebuffer_multisample */
</ins><span class="cx"> 
</span><del>-/* GL_NV_generate_mipmap_sRGB */
</del><span class="cx"> #ifndef GL_NV_generate_mipmap_sRGB
</span><span class="cx"> #define GL_NV_generate_mipmap_sRGB 1
</span><del>-#endif
</del><ins>+#endif /* GL_NV_generate_mipmap_sRGB */
</ins><span class="cx"> 
</span><del>-/* GL_NV_instanced_arrays */
</del><ins>+#ifndef GL_NV_geometry_shader_passthrough
+#define GL_NV_geometry_shader_passthrough 1
+#endif /* GL_NV_geometry_shader_passthrough */
+
+#ifndef GL_NV_image_formats
+#define GL_NV_image_formats 1
+#endif /* GL_NV_image_formats */
+
</ins><span class="cx"> #ifndef GL_NV_instanced_arrays
</span><span class="cx"> #define GL_NV_instanced_arrays 1
</span><ins>+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glVertexAttribDivisorNV (GLuint index, GLuint divisor);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor);
</del><ins>+#endif /* GL_NV_instanced_arrays */
+
+#ifndef GL_NV_internalformat_sample_query
+#define GL_NV_internalformat_sample_query 1
+#define GL_TEXTURE_2D_MULTISAMPLE         0x9100
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY   0x9102
+#define GL_MULTISAMPLES_NV                0x9371
+#define GL_SUPERSAMPLE_SCALE_X_NV         0x9372
+#define GL_SUPERSAMPLE_SCALE_Y_NV         0x9373
+#define GL_CONFORMANT_NV                  0x9374
+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_NV_internalformat_sample_query */
</ins><span class="cx"> 
</span><del>-/* GL_NV_read_buffer */
</del><ins>+#ifndef GL_NV_non_square_matrices
+#define GL_NV_non_square_matrices 1
+#define GL_FLOAT_MAT2x3_NV                0x8B65
+#define GL_FLOAT_MAT2x4_NV                0x8B66
+#define GL_FLOAT_MAT3x2_NV                0x8B67
+#define GL_FLOAT_MAT3x4_NV                0x8B68
+#define GL_FLOAT_MAT4x2_NV                0x8B69
+#define GL_FLOAT_MAT4x3_NV                0x8B6A
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+#endif
+#endif /* GL_NV_non_square_matrices */
+
+#ifndef GL_NV_path_rendering
+#define GL_NV_path_rendering 1
+#define GL_PATH_FORMAT_SVG_NV             0x9070
+#define GL_PATH_FORMAT_PS_NV              0x9071
+#define GL_STANDARD_FONT_NAME_NV          0x9072
+#define GL_SYSTEM_FONT_NAME_NV            0x9073
+#define GL_FILE_NAME_NV                   0x9074
+#define GL_PATH_STROKE_WIDTH_NV           0x9075
+#define GL_PATH_END_CAPS_NV               0x9076
+#define GL_PATH_INITIAL_END_CAP_NV        0x9077
+#define GL_PATH_TERMINAL_END_CAP_NV       0x9078
+#define GL_PATH_JOIN_STYLE_NV             0x9079
+#define GL_PATH_MITER_LIMIT_NV            0x907A
+#define GL_PATH_DASH_CAPS_NV              0x907B
+#define GL_PATH_INITIAL_DASH_CAP_NV       0x907C
+#define GL_PATH_TERMINAL_DASH_CAP_NV      0x907D
+#define GL_PATH_DASH_OFFSET_NV            0x907E
+#define GL_PATH_CLIENT_LENGTH_NV          0x907F
+#define GL_PATH_FILL_MODE_NV              0x9080
+#define GL_PATH_FILL_MASK_NV              0x9081
+#define GL_PATH_FILL_COVER_MODE_NV        0x9082
+#define GL_PATH_STROKE_COVER_MODE_NV      0x9083
+#define GL_PATH_STROKE_MASK_NV            0x9084
+#define GL_COUNT_UP_NV                    0x9088
+#define GL_COUNT_DOWN_NV                  0x9089
+#define GL_PATH_OBJECT_BOUNDING_BOX_NV    0x908A
+#define GL_CONVEX_HULL_NV                 0x908B
+#define GL_BOUNDING_BOX_NV                0x908D
+#define GL_TRANSLATE_X_NV                 0x908E
+#define GL_TRANSLATE_Y_NV                 0x908F
+#define GL_TRANSLATE_2D_NV                0x9090
+#define GL_TRANSLATE_3D_NV                0x9091
+#define GL_AFFINE_2D_NV                   0x9092
+#define GL_AFFINE_3D_NV                   0x9094
+#define GL_TRANSPOSE_AFFINE_2D_NV         0x9096
+#define GL_TRANSPOSE_AFFINE_3D_NV         0x9098
+#define GL_UTF8_NV                        0x909A
+#define GL_UTF16_NV                       0x909B
+#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C
+#define GL_PATH_COMMAND_COUNT_NV          0x909D
+#define GL_PATH_COORD_COUNT_NV            0x909E
+#define GL_PATH_DASH_ARRAY_COUNT_NV       0x909F
+#define GL_PATH_COMPUTED_LENGTH_NV        0x90A0
+#define GL_PATH_FILL_BOUNDING_BOX_NV      0x90A1
+#define GL_PATH_STROKE_BOUNDING_BOX_NV    0x90A2
+#define GL_SQUARE_NV                      0x90A3
+#define GL_ROUND_NV                       0x90A4
+#define GL_TRIANGULAR_NV                  0x90A5
+#define GL_BEVEL_NV                       0x90A6
+#define GL_MITER_REVERT_NV                0x90A7
+#define GL_MITER_TRUNCATE_NV              0x90A8
+#define GL_SKIP_MISSING_GLYPH_NV          0x90A9
+#define GL_USE_MISSING_GLYPH_NV           0x90AA
+#define GL_PATH_ERROR_POSITION_NV         0x90AB
+#define GL_ACCUM_ADJACENT_PAIRS_NV        0x90AD
+#define GL_ADJACENT_PAIRS_NV              0x90AE
+#define GL_FIRST_TO_REST_NV               0x90AF
+#define GL_PATH_GEN_MODE_NV               0x90B0
+#define GL_PATH_GEN_COEFF_NV              0x90B1
+#define GL_PATH_GEN_COMPONENTS_NV         0x90B3
+#define GL_PATH_STENCIL_FUNC_NV           0x90B7
+#define GL_PATH_STENCIL_REF_NV            0x90B8
+#define GL_PATH_STENCIL_VALUE_MASK_NV     0x90B9
+#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD
+#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE
+#define GL_PATH_COVER_DEPTH_FUNC_NV       0x90BF
+#define GL_PATH_DASH_OFFSET_RESET_NV      0x90B4
+#define GL_MOVE_TO_RESETS_NV              0x90B5
+#define GL_MOVE_TO_CONTINUES_NV           0x90B6
+#define GL_CLOSE_PATH_NV                  0x00
+#define GL_MOVE_TO_NV                     0x02
+#define GL_RELATIVE_MOVE_TO_NV            0x03
+#define GL_LINE_TO_NV                     0x04
+#define GL_RELATIVE_LINE_TO_NV            0x05
+#define GL_HORIZONTAL_LINE_TO_NV          0x06
+#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07
+#define GL_VERTICAL_LINE_TO_NV            0x08
+#define GL_RELATIVE_VERTICAL_LINE_TO_NV   0x09
+#define GL_QUADRATIC_CURVE_TO_NV          0x0A
+#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B
+#define GL_CUBIC_CURVE_TO_NV              0x0C
+#define GL_RELATIVE_CUBIC_CURVE_TO_NV     0x0D
+#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV   0x0E
+#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F
+#define GL_SMOOTH_CUBIC_CURVE_TO_NV       0x10
+#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11
+#define GL_SMALL_CCW_ARC_TO_NV            0x12
+#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV   0x13
+#define GL_SMALL_CW_ARC_TO_NV             0x14
+#define GL_RELATIVE_SMALL_CW_ARC_TO_NV    0x15
+#define GL_LARGE_CCW_ARC_TO_NV            0x16
+#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV   0x17
+#define GL_LARGE_CW_ARC_TO_NV             0x18
+#define GL_RELATIVE_LARGE_CW_ARC_TO_NV    0x19
+#define GL_RESTART_PATH_NV                0xF0
+#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV    0xF2
+#define GL_DUP_LAST_CUBIC_CURVE_TO_NV     0xF4
+#define GL_RECT_NV                        0xF6
+#define GL_CIRCULAR_CCW_ARC_TO_NV         0xF8
+#define GL_CIRCULAR_CW_ARC_TO_NV          0xFA
+#define GL_CIRCULAR_TANGENT_ARC_TO_NV     0xFC
+#define GL_ARC_TO_NV                      0xFE
+#define GL_RELATIVE_ARC_TO_NV             0xFF
+#define GL_BOLD_BIT_NV                    0x01
+#define GL_ITALIC_BIT_NV                  0x02
+#define GL_GLYPH_WIDTH_BIT_NV             0x01
+#define GL_GLYPH_HEIGHT_BIT_NV            0x02
+#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04
+#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08
+#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10
+#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20
+#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40
+#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80
+#define GL_GLYPH_HAS_KERNING_BIT_NV       0x100
+#define GL_FONT_X_MIN_BOUNDS_BIT_NV       0x00010000
+#define GL_FONT_Y_MIN_BOUNDS_BIT_NV       0x00020000
+#define GL_FONT_X_MAX_BOUNDS_BIT_NV       0x00040000
+#define GL_FONT_Y_MAX_BOUNDS_BIT_NV       0x00080000
+#define GL_FONT_UNITS_PER_EM_BIT_NV       0x00100000
+#define GL_FONT_ASCENDER_BIT_NV           0x00200000
+#define GL_FONT_DESCENDER_BIT_NV          0x00400000
+#define GL_FONT_HEIGHT_BIT_NV             0x00800000
+#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV  0x01000000
+#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000
+#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000
+#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000
+#define GL_FONT_HAS_KERNING_BIT_NV        0x10000000
+#define GL_ROUNDED_RECT_NV                0xE8
+#define GL_RELATIVE_ROUNDED_RECT_NV       0xE9
+#define GL_ROUNDED_RECT2_NV               0xEA
+#define GL_RELATIVE_ROUNDED_RECT2_NV      0xEB
+#define GL_ROUNDED_RECT4_NV               0xEC
+#define GL_RELATIVE_ROUNDED_RECT4_NV      0xED
+#define GL_ROUNDED_RECT8_NV               0xEE
+#define GL_RELATIVE_ROUNDED_RECT8_NV      0xEF
+#define GL_RELATIVE_RECT_NV               0xF7
+#define GL_FONT_GLYPHS_AVAILABLE_NV       0x9368
+#define GL_FONT_TARGET_UNAVAILABLE_NV     0x9369
+#define GL_FONT_UNAVAILABLE_NV            0x936A
+#define GL_FONT_UNINTELLIGIBLE_NV         0x936B
+#define GL_CONIC_CURVE_TO_NV              0x1A
+#define GL_RELATIVE_CONIC_CURVE_TO_NV     0x1B
+#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV  0x20000000
+#define GL_STANDARD_FONT_FORMAT_NV        0x936C
+#define GL_PATH_PROJECTION_NV             0x1701
+#define GL_PATH_MODELVIEW_NV              0x1700
+#define GL_PATH_MODELVIEW_STACK_DEPTH_NV  0x0BA3
+#define GL_PATH_MODELVIEW_MATRIX_NV       0x0BA6
+#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36
+#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3
+#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4
+#define GL_PATH_PROJECTION_MATRIX_NV      0x0BA7
+#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38
+#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4
+#define GL_FRAGMENT_INPUT_NV              0x936D
+typedef GLuint (GL_APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range);
+typedef void (GL_APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range);
+typedef GLboolean (GL_APIENTRYP PFNGLISPATHNVPROC) (GLuint path);
+typedef void (GL_APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (GL_APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (GL_APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (GL_APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (GL_APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString);
+typedef void (GL_APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (GL_APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (GL_APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights);
+typedef void (GL_APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath);
+typedef void (GL_APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);
+typedef void (GL_APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value);
+typedef void (GL_APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray);
+typedef void (GL_APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units);
+typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func);
+typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode);
+typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode);
+typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value);
+typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands);
+typedef void (GL_APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords);
+typedef void (GL_APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray);
+typedef void (GL_APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);
+typedef void (GL_APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics);
+typedef void (GL_APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);
+typedef GLboolean (GL_APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y);
+typedef GLboolean (GL_APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y);
+typedef GLfloat (GL_APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments);
+typedef GLboolean (GL_APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);
+typedef void (GL_APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode);
+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]);
+typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef GLenum (GL_APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL GLuint GL_APIENTRY glGenPathsNV (GLsizei range);
+GL_APICALL void GL_APIENTRY glDeletePathsNV (GLuint path, GLsizei range);
+GL_APICALL GLboolean GL_APIENTRY glIsPathNV (GLuint path);
+GL_APICALL void GL_APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString);
+GL_APICALL void GL_APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL void GL_APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL void GL_APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights);
+GL_APICALL void GL_APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath);
+GL_APICALL void GL_APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);
+GL_APICALL void GL_APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value);
+GL_APICALL void GL_APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value);
+GL_APICALL void GL_APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray);
+GL_APICALL void GL_APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glPathCoverDepthFuncNV (GLenum func);
+GL_APICALL void GL_APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value);
+GL_APICALL void GL_APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value);
+GL_APICALL void GL_APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands);
+GL_APICALL void GL_APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords);
+GL_APICALL void GL_APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray);
+GL_APICALL void GL_APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);
+GL_APICALL void GL_APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics);
+GL_APICALL void GL_APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);
+GL_APICALL GLboolean GL_APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y);
+GL_APICALL GLboolean GL_APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y);
+GL_APICALL GLfloat GL_APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments);
+GL_APICALL GLboolean GL_APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);
+GL_APICALL void GL_APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]);
+GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL GLenum GL_APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL void GL_APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs);
+GL_APICALL void GL_APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params);
+#endif
+#endif /* GL_NV_path_rendering */
+
+#ifndef GL_NV_path_rendering_shared_edge
+#define GL_NV_path_rendering_shared_edge 1
+#define GL_SHARED_EDGE_NV                 0xC0
+#endif /* GL_NV_path_rendering_shared_edge */
+
+#ifndef GL_NV_polygon_mode
+#define GL_NV_polygon_mode 1
+#define GL_POLYGON_MODE_NV                0x0B40
+#define GL_POLYGON_OFFSET_POINT_NV        0x2A01
+#define GL_POLYGON_OFFSET_LINE_NV         0x2A02
+#define GL_POINT_NV                       0x1B00
+#define GL_LINE_NV                        0x1B01
+#define GL_FILL_NV                        0x1B02
+typedef void (GL_APIENTRYP PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glPolygonModeNV (GLenum face, GLenum mode);
+#endif
+#endif /* GL_NV_polygon_mode */
+
</ins><span class="cx"> #ifndef GL_NV_read_buffer
</span><span class="cx"> #define GL_NV_read_buffer 1
</span><ins>+#define GL_READ_BUFFER_NV                 0x0C02
+typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode);
-#endif
</del><ins>+#endif /* GL_NV_read_buffer */
</ins><span class="cx"> 
</span><del>-/* GL_NV_read_buffer_front */
</del><span class="cx"> #ifndef GL_NV_read_buffer_front
</span><span class="cx"> #define GL_NV_read_buffer_front 1
</span><del>-#endif
</del><ins>+#endif /* GL_NV_read_buffer_front */
</ins><span class="cx"> 
</span><del>-/* GL_NV_read_depth */
</del><span class="cx"> #ifndef GL_NV_read_depth
</span><span class="cx"> #define GL_NV_read_depth 1
</span><del>-#endif
</del><ins>+#endif /* GL_NV_read_depth */
</ins><span class="cx"> 
</span><del>-/* GL_NV_read_depth_stencil */
</del><span class="cx"> #ifndef GL_NV_read_depth_stencil
</span><span class="cx"> #define GL_NV_read_depth_stencil 1
</span><del>-#endif
</del><ins>+#endif /* GL_NV_read_depth_stencil */
</ins><span class="cx"> 
</span><del>-/* GL_NV_read_stencil */
</del><span class="cx"> #ifndef GL_NV_read_stencil
</span><span class="cx"> #define GL_NV_read_stencil 1
</span><ins>+#endif /* GL_NV_read_stencil */
+
+#ifndef GL_NV_sRGB_formats
+#define GL_NV_sRGB_formats 1
+#define GL_SLUMINANCE_NV                  0x8C46
+#define GL_SLUMINANCE_ALPHA_NV            0x8C44
+#define GL_SRGB8_NV                       0x8C41
+#define GL_SLUMINANCE8_NV                 0x8C47
+#define GL_SLUMINANCE8_ALPHA8_NV          0x8C45
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV   0x8C4C
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F
+#define GL_ETC1_SRGB8_NV                  0x88EE
+#endif /* GL_NV_sRGB_formats */
+
+#ifndef GL_NV_sample_locations
+#define GL_NV_sample_locations 1
+#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D
+#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E
+#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F
+#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340
+#define GL_SAMPLE_LOCATION_NV             0x8E50
+#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341
+#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342
+#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glResolveDepthValuesNV (void);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_NV_sample_locations */
</ins><span class="cx"> 
</span><del>-/* GL_NV_shadow_samplers_array */
</del><ins>+#ifndef GL_NV_sample_mask_override_coverage
+#define GL_NV_sample_mask_override_coverage 1
+#endif /* GL_NV_sample_mask_override_coverage */
+
+#ifndef GL_NV_shader_noperspective_interpolation
+#define GL_NV_shader_noperspective_interpolation 1
+#endif /* GL_NV_shader_noperspective_interpolation */
+
</ins><span class="cx"> #ifndef GL_NV_shadow_samplers_array
</span><span class="cx"> #define GL_NV_shadow_samplers_array 1
</span><del>-#endif
</del><ins>+#define GL_SAMPLER_2D_ARRAY_SHADOW_NV     0x8DC4
+#endif /* GL_NV_shadow_samplers_array */
</ins><span class="cx"> 
</span><del>-/* GL_NV_shadow_samplers_cube */
</del><span class="cx"> #ifndef GL_NV_shadow_samplers_cube
</span><span class="cx"> #define GL_NV_shadow_samplers_cube 1
</span><del>-#endif
</del><ins>+#define GL_SAMPLER_CUBE_SHADOW_NV         0x8DC5
+#endif /* GL_NV_shadow_samplers_cube */
</ins><span class="cx"> 
</span><del>-/* GL_NV_sRGB_formats */
-#ifndef GL_NV_sRGB_formats
-#define GL_NV_sRGB_formats 1
-#endif
-
-/* GL_NV_texture_border_clamp */
</del><span class="cx"> #ifndef GL_NV_texture_border_clamp
</span><span class="cx"> #define GL_NV_texture_border_clamp 1
</span><del>-#endif
</del><ins>+#define GL_TEXTURE_BORDER_COLOR_NV        0x1004
+#define GL_CLAMP_TO_BORDER_NV             0x812D
+#endif /* GL_NV_texture_border_clamp */
</ins><span class="cx"> 
</span><del>-/* GL_NV_texture_compression_s3tc_update */
</del><span class="cx"> #ifndef GL_NV_texture_compression_s3tc_update
</span><span class="cx"> #define GL_NV_texture_compression_s3tc_update 1
</span><del>-#endif
</del><ins>+#endif /* GL_NV_texture_compression_s3tc_update */
</ins><span class="cx"> 
</span><del>-/* GL_NV_texture_npot_2D_mipmap */
</del><span class="cx"> #ifndef GL_NV_texture_npot_2D_mipmap
</span><span class="cx"> #define GL_NV_texture_npot_2D_mipmap 1
</span><ins>+#endif /* GL_NV_texture_npot_2D_mipmap */
+
+#ifndef GL_NV_viewport_array
+#define GL_NV_viewport_array 1
+#define GL_MAX_VIEWPORTS_NV               0x825B
+#define GL_VIEWPORT_SUBPIXEL_BITS_NV      0x825C
+#define GL_VIEWPORT_BOUNDS_RANGE_NV       0x825D
+#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F
+typedef void (GL_APIENTRYP PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v);
+typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint *v);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f);
+typedef void (GL_APIENTRYP PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat *data);
+typedef void (GL_APIENTRYP PFNGLENABLEINVPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLDISABLEINVPROC) (GLenum target, GLuint index);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDINVPROC) (GLenum target, GLuint index);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glViewportArrayvNV (GLuint first, GLsizei count, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glViewportIndexedfNV (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+GL_APICALL void GL_APIENTRY glViewportIndexedfvNV (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glScissorArrayvNV (GLuint first, GLsizei count, const GLint *v);
+GL_APICALL void GL_APIENTRY glScissorIndexedNV (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glScissorIndexedvNV (GLuint index, const GLint *v);
+GL_APICALL void GL_APIENTRY glDepthRangeArrayfvNV (GLuint first, GLsizei count, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glDepthRangeIndexedfNV (GLuint index, GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glGetFloati_vNV (GLenum target, GLuint index, GLfloat *data);
+GL_APICALL void GL_APIENTRY glEnableiNV (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glDisableiNV (GLenum target, GLuint index);
+GL_APICALL GLboolean GL_APIENTRY glIsEnablediNV (GLenum target, GLuint index);
</ins><span class="cx"> #endif
</span><ins>+#endif /* GL_NV_viewport_array */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * QCOM extension functions
- *------------------------------------------------------------------------*/
</del><ins>+#ifndef GL_NV_viewport_array2
+#define GL_NV_viewport_array2 1
+#endif /* GL_NV_viewport_array2 */
</ins><span class="cx"> 
</span><del>-/* GL_QCOM_alpha_test */
</del><ins>+#ifndef GL_OVR_multiview
+#define GL_OVR_multiview 1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632
+#define GL_MAX_VIEWS_OVR                  0x9631
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
+#endif
+#endif /* GL_OVR_multiview */
+
+#ifndef GL_OVR_multiview2
+#define GL_OVR_multiview2 1
+#endif /* GL_OVR_multiview2 */
+
</ins><span class="cx"> #ifndef GL_QCOM_alpha_test
</span><span class="cx"> #define GL_QCOM_alpha_test 1
</span><ins>+#define GL_ALPHA_TEST_QCOM                0x0BC0
+#define GL_ALPHA_TEST_FUNC_QCOM           0x0BC1
+#define GL_ALPHA_TEST_REF_QCOM            0x0BC2
+typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref);
-#endif
</del><ins>+#endif /* GL_QCOM_alpha_test */
</ins><span class="cx"> 
</span><del>-/* GL_QCOM_binning_control */
</del><span class="cx"> #ifndef GL_QCOM_binning_control
</span><span class="cx"> #define GL_QCOM_binning_control 1
</span><del>-#endif
</del><ins>+#define GL_BINNING_CONTROL_HINT_QCOM      0x8FB0
+#define GL_CPU_OPTIMIZED_QCOM             0x8FB1
+#define GL_GPU_OPTIMIZED_QCOM             0x8FB2
+#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3
+#endif /* GL_QCOM_binning_control */
</ins><span class="cx"> 
</span><del>-/* GL_QCOM_driver_control */
</del><span class="cx"> #ifndef GL_QCOM_driver_control
</span><span class="cx"> #define GL_QCOM_driver_control 1
</span><ins>+typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls);
+typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString);
+typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);
+typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls);
-typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString);
-typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);
-typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);
-#endif
</del><ins>+#endif /* GL_QCOM_driver_control */
</ins><span class="cx"> 
</span><del>-/* GL_QCOM_extended_get */
</del><span class="cx"> #ifndef GL_QCOM_extended_get
</span><span class="cx"> #define GL_QCOM_extended_get 1
</span><ins>+#define GL_TEXTURE_WIDTH_QCOM             0x8BD2
+#define GL_TEXTURE_HEIGHT_QCOM            0x8BD3
+#define GL_TEXTURE_DEPTH_QCOM             0x8BD4
+#define GL_TEXTURE_INTERNAL_FORMAT_QCOM   0x8BD5
+#define GL_TEXTURE_FORMAT_QCOM            0x8BD6
+#define GL_TEXTURE_TYPE_QCOM              0x8BD7
+#define GL_TEXTURE_IMAGE_VALID_QCOM       0x8BD8
+#define GL_TEXTURE_NUM_LEVELS_QCOM        0x8BD9
+#define GL_TEXTURE_TARGET_QCOM            0x8BDA
+#define GL_TEXTURE_OBJECT_VALID_QCOM      0x8BDB
+#define GL_STATE_RESTORE                  0x8BDC
+typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures);
+typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);
+typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);
+typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);
+typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels);
+typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void **params);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);
</span><span class="lines">@@ -1948,66 +2844,99 @@
</span><span class="cx"> GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param);
</span><del>-GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels);
-GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, GLvoid **params);
</del><ins>+GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels);
+GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, void **params);
</ins><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures);
-typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);
-typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);
-typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);
-typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);
-typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param);
-typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels);
-typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, GLvoid **params);
-#endif
</del><ins>+#endif /* GL_QCOM_extended_get */
</ins><span class="cx"> 
</span><del>-/* GL_QCOM_extended_get2 */
</del><span class="cx"> #ifndef GL_QCOM_extended_get2
</span><span class="cx"> #define GL_QCOM_extended_get2 1
</span><ins>+typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders);
+typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms);
+typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms);
</span><span class="cx"> GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders);
-typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms);
-typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program);
-typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length);
-#endif
</del><ins>+#endif /* GL_QCOM_extended_get2 */
</ins><span class="cx"> 
</span><del>-/* GL_QCOM_perfmon_global_mode */
</del><span class="cx"> #ifndef GL_QCOM_perfmon_global_mode
</span><span class="cx"> #define GL_QCOM_perfmon_global_mode 1
</span><del>-#endif
</del><ins>+#define GL_PERFMON_GLOBAL_MODE_QCOM       0x8FA0
+#endif /* GL_QCOM_perfmon_global_mode */
</ins><span class="cx"> 
</span><del>-/* GL_QCOM_writeonly_rendering */
-#ifndef GL_QCOM_writeonly_rendering
-#define GL_QCOM_writeonly_rendering 1
-#endif
-
-/* GL_QCOM_tiled_rendering */
</del><span class="cx"> #ifndef GL_QCOM_tiled_rendering
</span><span class="cx"> #define GL_QCOM_tiled_rendering 1
</span><ins>+#define GL_COLOR_BUFFER_BIT0_QCOM         0x00000001
+#define GL_COLOR_BUFFER_BIT1_QCOM         0x00000002
+#define GL_COLOR_BUFFER_BIT2_QCOM         0x00000004
+#define GL_COLOR_BUFFER_BIT3_QCOM         0x00000008
+#define GL_COLOR_BUFFER_BIT4_QCOM         0x00000010
+#define GL_COLOR_BUFFER_BIT5_QCOM         0x00000020
+#define GL_COLOR_BUFFER_BIT6_QCOM         0x00000040
+#define GL_COLOR_BUFFER_BIT7_QCOM         0x00000080
+#define GL_DEPTH_BUFFER_BIT0_QCOM         0x00000100
+#define GL_DEPTH_BUFFER_BIT1_QCOM         0x00000200
+#define GL_DEPTH_BUFFER_BIT2_QCOM         0x00000400
+#define GL_DEPTH_BUFFER_BIT3_QCOM         0x00000800
+#define GL_DEPTH_BUFFER_BIT4_QCOM         0x00001000
+#define GL_DEPTH_BUFFER_BIT5_QCOM         0x00002000
+#define GL_DEPTH_BUFFER_BIT6_QCOM         0x00004000
+#define GL_DEPTH_BUFFER_BIT7_QCOM         0x00008000
+#define GL_STENCIL_BUFFER_BIT0_QCOM       0x00010000
+#define GL_STENCIL_BUFFER_BIT1_QCOM       0x00020000
+#define GL_STENCIL_BUFFER_BIT2_QCOM       0x00040000
+#define GL_STENCIL_BUFFER_BIT3_QCOM       0x00080000
+#define GL_STENCIL_BUFFER_BIT4_QCOM       0x00100000
+#define GL_STENCIL_BUFFER_BIT5_QCOM       0x00200000
+#define GL_STENCIL_BUFFER_BIT6_QCOM       0x00400000
+#define GL_STENCIL_BUFFER_BIT7_QCOM       0x00800000
+#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM   0x01000000
+#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM   0x02000000
+#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM   0x04000000
+#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM   0x08000000
+#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM   0x10000000
+#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM   0x20000000
+#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM   0x40000000
+#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM   0x80000000
+typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask);
</ins><span class="cx"> #ifdef GL_GLEXT_PROTOTYPES
</span><span class="cx"> GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
</span><span class="cx"> GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask);
</span><span class="cx"> #endif
</span><del>-typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
-typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask);
-#endif
</del><ins>+#endif /* GL_QCOM_tiled_rendering */
</ins><span class="cx"> 
</span><del>-/*------------------------------------------------------------------------*
- * VIV extension tokens
- *------------------------------------------------------------------------*/
</del><ins>+#ifndef GL_QCOM_writeonly_rendering
+#define GL_QCOM_writeonly_rendering 1
+#define GL_WRITEONLY_RENDERING_QCOM       0x8823
+#endif /* GL_QCOM_writeonly_rendering */
</ins><span class="cx"> 
</span><del>-/* GL_VIV_shader_binary */
</del><span class="cx"> #ifndef GL_VIV_shader_binary
</span><span class="cx"> #define GL_VIV_shader_binary 1
</span><del>-#endif
</del><ins>+#define GL_SHADER_BINARY_VIV              0x8FC4
+#endif /* GL_VIV_shader_binary */
</ins><span class="cx"> 
</span><ins>+#ifndef GL_ANGLE_lossy_etc_decode
+#define GL_ANGLE_lossy_etc_decode 1
+#define GL_ETC1_RGB8_LOSSY_DECODE_ANGLE                                  0x9690
+#define GL_COMPRESSED_R11_LOSSY_DECODE_EAC_ANGLE                         0x9691
+#define GL_COMPRESSED_SIGNED_R11_LOSSY_DECODE_EAC_ANGLE                  0x9692
+#define GL_COMPRESSED_RG11_LOSSY_DECODE_EAC_ANGLE                        0x9693
+#define GL_COMPRESSED_SIGNED_RG11_LOSSY_DECODE_EAC_ANGLE                 0x9694
+#define GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE                       0x9695
+#define GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE                      0x9696
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE   0x9697
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE  0x9698
+#define GL_COMPRESSED_RGBA8_LOSSY_DECODE_ETC2_EAC_ANGLE                  0x9699
+#define GL_COMPRESSED_SRGB8_ALPHA8_LOSSY_DECODE_ETC2_EAC_ANGLE           0x969A
+#endif /* GL_ANGLE_lossy_etc_decode */
+
</ins><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#endif /* __gl2ext_h_ */
</del><ins>+#endif
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeGLES2gl2platformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2platform.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2platform.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/GLES2/gl2platform.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #ifndef __gl2platform_h_
</span><span class="cx"> #define __gl2platform_h_
</span><span class="cx"> 
</span><del>-/* $Revision: 10602 $ on $Date:: 2010-03-04 22:35:34 -0800 #$ */
</del><ins>+/* $Revision: 23328 $ on $Date:: 2013-10-02 02:28:28 -0700 #$ */
</ins><span class="cx"> 
</span><span class="cx"> /*
</span><span class="cx">  * This document is licensed under the SGI Free Software B License Version
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeGLES3gl3h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/GLES3/gl3.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/GLES3/gl3.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/GLES3/gl3.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,18 +1,12 @@
</span><span class="cx"> #ifndef __gl3_h_
</span><del>-#define __gl3_h_
</del><ins>+#define __gl3_h_ 1
</ins><span class="cx"> 
</span><del>-/* 
- * gl3.h last updated on $Date: 2013-02-12 14:37:24 -0800 (Tue, 12 Feb 2013) $
- */
-
-#include &lt;GLES3/gl3platform.h&gt;
-
</del><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> extern &quot;C&quot; {
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> /*
</span><del>-** Copyright (c) 2007-2013 The Khronos Group Inc.
</del><ins>+** Copyright (c) 2013-2015 The Khronos Group Inc.
</ins><span class="cx"> **
</span><span class="cx"> ** Permission is hereby granted, free of charge, to any person obtaining a
</span><span class="cx"> ** copy of this software and/or associated documentation files (the
</span><span class="lines">@@ -33,1027 +27,1181 @@
</span><span class="cx"> ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
</span><span class="cx"> ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
</span><span class="cx"> */
</span><ins>+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+**   http://www.opengl.org/registry/
+**
+** Khronos $Revision: 31811 $ on $Date: 2015-08-10 00:01:11 -0700 (Mon, 10 Aug 2015) $
+*/
</ins><span class="cx"> 
</span><del>-/*-------------------------------------------------------------------------
- * Data type definitions
- *-----------------------------------------------------------------------*/
</del><ins>+#include &lt;GLES3/gl3platform.h&gt;
</ins><span class="cx"> 
</span><del>-/* OpenGL ES 2.0 */
</del><ins>+#ifndef GL_APIENTRYP
+#define GL_APIENTRYP GL_APIENTRY*
+#endif
</ins><span class="cx"> 
</span><del>-typedef void             GLvoid;
-typedef char             GLchar;
-typedef unsigned int     GLenum;
-typedef unsigned char    GLboolean;
-typedef unsigned int     GLbitfield;
-typedef khronos_int8_t   GLbyte;
-typedef short            GLshort;
-typedef int              GLint;
-typedef int              GLsizei;
-typedef khronos_uint8_t  GLubyte;
-typedef unsigned short   GLushort;
-typedef unsigned int     GLuint;
-typedef khronos_float_t  GLfloat;
-typedef khronos_float_t  GLclampf;
-typedef khronos_int32_t  GLfixed;
-typedef khronos_intptr_t GLintptr;
-typedef khronos_ssize_t  GLsizeiptr;
</del><ins>+/* Generated on date 20150809 */
</ins><span class="cx"> 
</span><del>-/* OpenGL ES 3.0 */
</del><ins>+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]|3\.0
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
</ins><span class="cx"> 
</span><del>-typedef unsigned short   GLhalf;
-typedef khronos_int64_t  GLint64;
</del><ins>+#ifndef GL_ES_VERSION_2_0
+#define GL_ES_VERSION_2_0 1
+#include &lt;KHR/khrplatform.h&gt;
+typedef khronos_int8_t GLbyte;
+typedef khronos_float_t GLclampf;
+typedef khronos_int32_t GLfixed;
+typedef short GLshort;
+typedef unsigned short GLushort;
+typedef void GLvoid;
+typedef struct __GLsync *GLsync;
+typedef khronos_int64_t GLint64;
</ins><span class="cx"> typedef khronos_uint64_t GLuint64;
</span><del>-typedef struct __GLsync *GLsync;
</del><ins>+typedef unsigned int GLenum;
+typedef unsigned int GLuint;
+typedef char GLchar;
+typedef khronos_float_t GLfloat;
+typedef khronos_ssize_t GLsizeiptr;
+typedef khronos_intptr_t GLintptr;
+typedef unsigned int GLbitfield;
+typedef int GLint;
+typedef unsigned char GLboolean;
+typedef int GLsizei;
+typedef khronos_uint8_t GLubyte;
+#define GL_DEPTH_BUFFER_BIT               0x00000100
+#define GL_STENCIL_BUFFER_BIT             0x00000400
+#define GL_COLOR_BUFFER_BIT               0x00004000
+#define GL_FALSE                          0
+#define GL_TRUE                           1
+#define GL_POINTS                         0x0000
+#define GL_LINES                          0x0001
+#define GL_LINE_LOOP                      0x0002
+#define GL_LINE_STRIP                     0x0003
+#define GL_TRIANGLES                      0x0004
+#define GL_TRIANGLE_STRIP                 0x0005
+#define GL_TRIANGLE_FAN                   0x0006
+#define GL_ZERO                           0
+#define GL_ONE                            1
+#define GL_SRC_COLOR                      0x0300
+#define GL_ONE_MINUS_SRC_COLOR            0x0301
+#define GL_SRC_ALPHA                      0x0302
+#define GL_ONE_MINUS_SRC_ALPHA            0x0303
+#define GL_DST_ALPHA                      0x0304
+#define GL_ONE_MINUS_DST_ALPHA            0x0305
+#define GL_DST_COLOR                      0x0306
+#define GL_ONE_MINUS_DST_COLOR            0x0307
+#define GL_SRC_ALPHA_SATURATE             0x0308
+#define GL_FUNC_ADD                       0x8006
+#define GL_BLEND_EQUATION                 0x8009
+#define GL_BLEND_EQUATION_RGB             0x8009
+#define GL_BLEND_EQUATION_ALPHA           0x883D
+#define GL_FUNC_SUBTRACT                  0x800A
+#define GL_FUNC_REVERSE_SUBTRACT          0x800B
+#define GL_BLEND_DST_RGB                  0x80C8
+#define GL_BLEND_SRC_RGB                  0x80C9
+#define GL_BLEND_DST_ALPHA                0x80CA
+#define GL_BLEND_SRC_ALPHA                0x80CB
+#define GL_CONSTANT_COLOR                 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR       0x8002
+#define GL_CONSTANT_ALPHA                 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA       0x8004
+#define GL_BLEND_COLOR                    0x8005
+#define GL_ARRAY_BUFFER                   0x8892
+#define GL_ELEMENT_ARRAY_BUFFER           0x8893
+#define GL_ARRAY_BUFFER_BINDING           0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895
+#define GL_STREAM_DRAW                    0x88E0
+#define GL_STATIC_DRAW                    0x88E4
+#define GL_DYNAMIC_DRAW                   0x88E8
+#define GL_BUFFER_SIZE                    0x8764
+#define GL_BUFFER_USAGE                   0x8765
+#define GL_CURRENT_VERTEX_ATTRIB          0x8626
+#define GL_FRONT                          0x0404
+#define GL_BACK                           0x0405
+#define GL_FRONT_AND_BACK                 0x0408
+#define GL_TEXTURE_2D                     0x0DE1
+#define GL_CULL_FACE                      0x0B44
+#define GL_BLEND                          0x0BE2
+#define GL_DITHER                         0x0BD0
+#define GL_STENCIL_TEST                   0x0B90
+#define GL_DEPTH_TEST                     0x0B71
+#define GL_SCISSOR_TEST                   0x0C11
+#define GL_POLYGON_OFFSET_FILL            0x8037
+#define GL_SAMPLE_ALPHA_TO_COVERAGE       0x809E
+#define GL_SAMPLE_COVERAGE                0x80A0
+#define GL_NO_ERROR                       0
+#define GL_INVALID_ENUM                   0x0500
+#define GL_INVALID_VALUE                  0x0501
+#define GL_INVALID_OPERATION              0x0502
+#define GL_OUT_OF_MEMORY                  0x0505
+#define GL_CW                             0x0900
+#define GL_CCW                            0x0901
+#define GL_LINE_WIDTH                     0x0B21
+#define GL_ALIASED_POINT_SIZE_RANGE       0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE       0x846E
+#define GL_CULL_FACE_MODE                 0x0B45
+#define GL_FRONT_FACE                     0x0B46
+#define GL_DEPTH_RANGE                    0x0B70
+#define GL_DEPTH_WRITEMASK                0x0B72
+#define GL_DEPTH_CLEAR_VALUE              0x0B73
+#define GL_DEPTH_FUNC                     0x0B74
+#define GL_STENCIL_CLEAR_VALUE            0x0B91
+#define GL_STENCIL_FUNC                   0x0B92
+#define GL_STENCIL_FAIL                   0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL        0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS        0x0B96
+#define GL_STENCIL_REF                    0x0B97
+#define GL_STENCIL_VALUE_MASK             0x0B93
+#define GL_STENCIL_WRITEMASK              0x0B98
+#define GL_STENCIL_BACK_FUNC              0x8800
+#define GL_STENCIL_BACK_FAIL              0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL   0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS   0x8803
+#define GL_STENCIL_BACK_REF               0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK        0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK         0x8CA5
+#define GL_VIEWPORT                       0x0BA2
+#define GL_SCISSOR_BOX                    0x0C10
+#define GL_COLOR_CLEAR_VALUE              0x0C22
+#define GL_COLOR_WRITEMASK                0x0C23
+#define GL_UNPACK_ALIGNMENT               0x0CF5
+#define GL_PACK_ALIGNMENT                 0x0D05
+#define GL_MAX_TEXTURE_SIZE               0x0D33
+#define GL_MAX_VIEWPORT_DIMS              0x0D3A
+#define GL_SUBPIXEL_BITS                  0x0D50
+#define GL_RED_BITS                       0x0D52
+#define GL_GREEN_BITS                     0x0D53
+#define GL_BLUE_BITS                      0x0D54
+#define GL_ALPHA_BITS                     0x0D55
+#define GL_DEPTH_BITS                     0x0D56
+#define GL_STENCIL_BITS                   0x0D57
+#define GL_POLYGON_OFFSET_UNITS           0x2A00
+#define GL_POLYGON_OFFSET_FACTOR          0x8038
+#define GL_TEXTURE_BINDING_2D             0x8069
+#define GL_SAMPLE_BUFFERS                 0x80A8
+#define GL_SAMPLES                        0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE          0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT         0x80AB
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS     0x86A3
+#define GL_DONT_CARE                      0x1100
+#define GL_FASTEST                        0x1101
+#define GL_NICEST                         0x1102
+#define GL_GENERATE_MIPMAP_HINT           0x8192
+#define GL_BYTE                           0x1400
+#define GL_UNSIGNED_BYTE                  0x1401
+#define GL_SHORT                          0x1402
+#define GL_UNSIGNED_SHORT                 0x1403
+#define GL_INT                            0x1404
+#define GL_UNSIGNED_INT                   0x1405
+#define GL_FLOAT                          0x1406
+#define GL_FIXED                          0x140C
+#define GL_DEPTH_COMPONENT                0x1902
+#define GL_ALPHA                          0x1906
+#define GL_RGB                            0x1907
+#define GL_RGBA                           0x1908
+#define GL_LUMINANCE                      0x1909
+#define GL_LUMINANCE_ALPHA                0x190A
+#define GL_UNSIGNED_SHORT_4_4_4_4         0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1         0x8034
+#define GL_UNSIGNED_SHORT_5_6_5           0x8363
+#define GL_FRAGMENT_SHADER                0x8B30
+#define GL_VERTEX_SHADER                  0x8B31
+#define GL_MAX_VERTEX_ATTRIBS             0x8869
+#define GL_MAX_VERTEX_UNIFORM_VECTORS     0x8DFB
+#define GL_MAX_VARYING_VECTORS            0x8DFC
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_TEXTURE_IMAGE_UNITS        0x8872
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS   0x8DFD
+#define GL_SHADER_TYPE                    0x8B4F
+#define GL_DELETE_STATUS                  0x8B80
+#define GL_LINK_STATUS                    0x8B82
+#define GL_VALIDATE_STATUS                0x8B83
+#define GL_ATTACHED_SHADERS               0x8B85
+#define GL_ACTIVE_UNIFORMS                0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH      0x8B87
+#define GL_ACTIVE_ATTRIBUTES              0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH    0x8B8A
+#define GL_SHADING_LANGUAGE_VERSION       0x8B8C
+#define GL_CURRENT_PROGRAM                0x8B8D
+#define GL_NEVER                          0x0200
+#define GL_LESS                           0x0201
+#define GL_EQUAL                          0x0202
+#define GL_LEQUAL                         0x0203
+#define GL_GREATER                        0x0204
+#define GL_NOTEQUAL                       0x0205
+#define GL_GEQUAL                         0x0206
+#define GL_ALWAYS                         0x0207
+#define GL_KEEP                           0x1E00
+#define GL_REPLACE                        0x1E01
+#define GL_INCR                           0x1E02
+#define GL_DECR                           0x1E03
+#define GL_INVERT                         0x150A
+#define GL_INCR_WRAP                      0x8507
+#define GL_DECR_WRAP                      0x8508
+#define GL_VENDOR                         0x1F00
+#define GL_RENDERER                       0x1F01
+#define GL_VERSION                        0x1F02
+#define GL_EXTENSIONS                     0x1F03
+#define GL_NEAREST                        0x2600
+#define GL_LINEAR                         0x2601
+#define GL_NEAREST_MIPMAP_NEAREST         0x2700
+#define GL_LINEAR_MIPMAP_NEAREST          0x2701
+#define GL_NEAREST_MIPMAP_LINEAR          0x2702
+#define GL_LINEAR_MIPMAP_LINEAR           0x2703
+#define GL_TEXTURE_MAG_FILTER             0x2800
+#define GL_TEXTURE_MIN_FILTER             0x2801
+#define GL_TEXTURE_WRAP_S                 0x2802
+#define GL_TEXTURE_WRAP_T                 0x2803
+#define GL_TEXTURE                        0x1702
+#define GL_TEXTURE_CUBE_MAP               0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP       0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X    0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X    0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y    0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y    0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z    0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z    0x851A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE      0x851C
+#define GL_TEXTURE0                       0x84C0
+#define GL_TEXTURE1                       0x84C1
+#define GL_TEXTURE2                       0x84C2
+#define GL_TEXTURE3                       0x84C3
+#define GL_TEXTURE4                       0x84C4
+#define GL_TEXTURE5                       0x84C5
+#define GL_TEXTURE6                       0x84C6
+#define GL_TEXTURE7                       0x84C7
+#define GL_TEXTURE8                       0x84C8
+#define GL_TEXTURE9                       0x84C9
+#define GL_TEXTURE10                      0x84CA
+#define GL_TEXTURE11                      0x84CB
+#define GL_TEXTURE12                      0x84CC
+#define GL_TEXTURE13                      0x84CD
+#define GL_TEXTURE14                      0x84CE
+#define GL_TEXTURE15                      0x84CF
+#define GL_TEXTURE16                      0x84D0
+#define GL_TEXTURE17                      0x84D1
+#define GL_TEXTURE18                      0x84D2
+#define GL_TEXTURE19                      0x84D3
+#define GL_TEXTURE20                      0x84D4
+#define GL_TEXTURE21                      0x84D5
+#define GL_TEXTURE22                      0x84D6
+#define GL_TEXTURE23                      0x84D7
+#define GL_TEXTURE24                      0x84D8
+#define GL_TEXTURE25                      0x84D9
+#define GL_TEXTURE26                      0x84DA
+#define GL_TEXTURE27                      0x84DB
+#define GL_TEXTURE28                      0x84DC
+#define GL_TEXTURE29                      0x84DD
+#define GL_TEXTURE30                      0x84DE
+#define GL_TEXTURE31                      0x84DF
+#define GL_ACTIVE_TEXTURE                 0x84E0
+#define GL_REPEAT                         0x2901
+#define GL_CLAMP_TO_EDGE                  0x812F
+#define GL_MIRRORED_REPEAT                0x8370
+#define GL_FLOAT_VEC2                     0x8B50
+#define GL_FLOAT_VEC3                     0x8B51
+#define GL_FLOAT_VEC4                     0x8B52
+#define GL_INT_VEC2                       0x8B53
+#define GL_INT_VEC3                       0x8B54
+#define GL_INT_VEC4                       0x8B55
+#define GL_BOOL                           0x8B56
+#define GL_BOOL_VEC2                      0x8B57
+#define GL_BOOL_VEC3                      0x8B58
+#define GL_BOOL_VEC4                      0x8B59
+#define GL_FLOAT_MAT2                     0x8B5A
+#define GL_FLOAT_MAT3                     0x8B5B
+#define GL_FLOAT_MAT4                     0x8B5C
+#define GL_SAMPLER_2D                     0x8B5E
+#define GL_SAMPLER_CUBE                   0x8B60
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED    0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE       0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE     0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE       0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER    0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_COMPILE_STATUS                 0x8B81
+#define GL_INFO_LOG_LENGTH                0x8B84
+#define GL_SHADER_SOURCE_LENGTH           0x8B88
+#define GL_SHADER_COMPILER                0x8DFA
+#define GL_SHADER_BINARY_FORMATS          0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS      0x8DF9
+#define GL_LOW_FLOAT                      0x8DF0
+#define GL_MEDIUM_FLOAT                   0x8DF1
+#define GL_HIGH_FLOAT                     0x8DF2
+#define GL_LOW_INT                        0x8DF3
+#define GL_MEDIUM_INT                     0x8DF4
+#define GL_HIGH_INT                       0x8DF5
+#define GL_FRAMEBUFFER                    0x8D40
+#define GL_RENDERBUFFER                   0x8D41
+#define GL_RGBA4                          0x8056
+#define GL_RGB5_A1                        0x8057
+#define GL_RGB565                         0x8D62
+#define GL_DEPTH_COMPONENT16              0x81A5
+#define GL_STENCIL_INDEX8                 0x8D48
+#define GL_RENDERBUFFER_WIDTH             0x8D42
+#define GL_RENDERBUFFER_HEIGHT            0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT   0x8D44
+#define GL_RENDERBUFFER_RED_SIZE          0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE        0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE         0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE        0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE        0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE      0x8D55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_COLOR_ATTACHMENT0              0x8CE0
+#define GL_DEPTH_ATTACHMENT               0x8D00
+#define GL_STENCIL_ATTACHMENT             0x8D20
+#define GL_NONE                           0
+#define GL_FRAMEBUFFER_COMPLETE           0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_UNSUPPORTED        0x8CDD
+#define GL_FRAMEBUFFER_BINDING            0x8CA6
+#define GL_RENDERBUFFER_BINDING           0x8CA7
+#define GL_MAX_RENDERBUFFER_SIZE          0x84E8
+#define GL_INVALID_FRAMEBUFFER_OPERATION  0x0506
+typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
+typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);
+typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);
+typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode);
+typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader);
+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture);
+typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width);
+typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units);
+typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);
+typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
+GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d);
+GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
+GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
+GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFinish (void);
+GL_APICALL void GL_APIENTRY glFlush (void);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL GLenum GL_APIENTRY glGetError (void);
+GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name);
+GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_ES_VERSION_2_0 */
</ins><span class="cx"> 
</span><del>-/*-------------------------------------------------------------------------
- * Token definitions
- *-----------------------------------------------------------------------*/
-
-/* OpenGL ES core versions */
-#define GL_ES_VERSION_3_0                                1
-#define GL_ES_VERSION_2_0                                1
-
-/* OpenGL ES 2.0 */
-
-/* ClearBufferMask */
-#define GL_DEPTH_BUFFER_BIT                              0x00000100
-#define GL_STENCIL_BUFFER_BIT                            0x00000400
-#define GL_COLOR_BUFFER_BIT                              0x00004000
-
-/* Boolean */
-#define GL_FALSE                                         0
-#define GL_TRUE                                          1
-
-/* BeginMode */
-#define GL_POINTS                                        0x0000
-#define GL_LINES                                         0x0001
-#define GL_LINE_LOOP                                     0x0002
-#define GL_LINE_STRIP                                    0x0003
-#define GL_TRIANGLES                                     0x0004
-#define GL_TRIANGLE_STRIP                                0x0005
-#define GL_TRIANGLE_FAN                                  0x0006
-
-/* BlendingFactorDest */
-#define GL_ZERO                                          0
-#define GL_ONE                                           1
-#define GL_SRC_COLOR                                     0x0300
-#define GL_ONE_MINUS_SRC_COLOR                           0x0301
-#define GL_SRC_ALPHA                                     0x0302
-#define GL_ONE_MINUS_SRC_ALPHA                           0x0303
-#define GL_DST_ALPHA                                     0x0304
-#define GL_ONE_MINUS_DST_ALPHA                           0x0305
-
-/* BlendingFactorSrc */
-/*      GL_ZERO */
-/*      GL_ONE */
-#define GL_DST_COLOR                                     0x0306
-#define GL_ONE_MINUS_DST_COLOR                           0x0307
-#define GL_SRC_ALPHA_SATURATE                            0x0308
-/*      GL_SRC_ALPHA */
-/*      GL_ONE_MINUS_SRC_ALPHA */
-/*      GL_DST_ALPHA */
-/*      GL_ONE_MINUS_DST_ALPHA */
-
-/* BlendEquationSeparate */
-#define GL_FUNC_ADD                                      0x8006
-#define GL_BLEND_EQUATION                                0x8009
-#define GL_BLEND_EQUATION_RGB                            0x8009    /* same as BLEND_EQUATION */
-#define GL_BLEND_EQUATION_ALPHA                          0x883D
-
-/* BlendSubtract */
-#define GL_FUNC_SUBTRACT                                 0x800A
-#define GL_FUNC_REVERSE_SUBTRACT                         0x800B
-
-/* Separate Blend Functions */
-#define GL_BLEND_DST_RGB                                 0x80C8
-#define GL_BLEND_SRC_RGB                                 0x80C9
-#define GL_BLEND_DST_ALPHA                               0x80CA
-#define GL_BLEND_SRC_ALPHA                               0x80CB
-#define GL_CONSTANT_COLOR                                0x8001
-#define GL_ONE_MINUS_CONSTANT_COLOR                      0x8002
-#define GL_CONSTANT_ALPHA                                0x8003
-#define GL_ONE_MINUS_CONSTANT_ALPHA                      0x8004
-#define GL_BLEND_COLOR                                   0x8005
-
-/* Buffer Objects */
-#define GL_ARRAY_BUFFER                                  0x8892
-#define GL_ELEMENT_ARRAY_BUFFER                          0x8893
-#define GL_ARRAY_BUFFER_BINDING                          0x8894
-#define GL_ELEMENT_ARRAY_BUFFER_BINDING                  0x8895
-
-#define GL_STREAM_DRAW                                   0x88E0
-#define GL_STATIC_DRAW                                   0x88E4
-#define GL_DYNAMIC_DRAW                                  0x88E8
-
-#define GL_BUFFER_SIZE                                   0x8764
-#define GL_BUFFER_USAGE                                  0x8765
-
-#define GL_CURRENT_VERTEX_ATTRIB                         0x8626
-
-/* CullFaceMode */
-#define GL_FRONT                                         0x0404
-#define GL_BACK                                          0x0405
-#define GL_FRONT_AND_BACK                                0x0408
-
-/* DepthFunction */
-/*      GL_NEVER */
-/*      GL_LESS */
-/*      GL_EQUAL */
-/*      GL_LEQUAL */
-/*      GL_GREATER */
-/*      GL_NOTEQUAL */
-/*      GL_GEQUAL */
-/*      GL_ALWAYS */
-
-/* EnableCap */
-#define GL_TEXTURE_2D                                    0x0DE1
-#define GL_CULL_FACE                                     0x0B44
-#define GL_BLEND                                         0x0BE2
-#define GL_DITHER                                        0x0BD0
-#define GL_STENCIL_TEST                                  0x0B90
-#define GL_DEPTH_TEST                                    0x0B71
-#define GL_SCISSOR_TEST                                  0x0C11
-#define GL_POLYGON_OFFSET_FILL                           0x8037
-#define GL_SAMPLE_ALPHA_TO_COVERAGE                      0x809E
-#define GL_SAMPLE_COVERAGE                               0x80A0
-
-/* ErrorCode */
-#define GL_NO_ERROR                                      0
-#define GL_INVALID_ENUM                                  0x0500
-#define GL_INVALID_VALUE                                 0x0501
-#define GL_INVALID_OPERATION                             0x0502
-#define GL_OUT_OF_MEMORY                                 0x0505
-
-/* FrontFaceDirection */
-#define GL_CW                                            0x0900
-#define GL_CCW                                           0x0901
-
-/* GetPName */
-#define GL_LINE_WIDTH                                    0x0B21
-#define GL_ALIASED_POINT_SIZE_RANGE                      0x846D
-#define GL_ALIASED_LINE_WIDTH_RANGE                      0x846E
-#define GL_CULL_FACE_MODE                                0x0B45
-#define GL_FRONT_FACE                                    0x0B46
-#define GL_DEPTH_RANGE                                   0x0B70
-#define GL_DEPTH_WRITEMASK                               0x0B72
-#define GL_DEPTH_CLEAR_VALUE                             0x0B73
-#define GL_DEPTH_FUNC                                    0x0B74
-#define GL_STENCIL_CLEAR_VALUE                           0x0B91
-#define GL_STENCIL_FUNC                                  0x0B92
-#define GL_STENCIL_FAIL                                  0x0B94
-#define GL_STENCIL_PASS_DEPTH_FAIL                       0x0B95
-#define GL_STENCIL_PASS_DEPTH_PASS                       0x0B96
-#define GL_STENCIL_REF                                   0x0B97
-#define GL_STENCIL_VALUE_MASK                            0x0B93
-#define GL_STENCIL_WRITEMASK                             0x0B98
-#define GL_STENCIL_BACK_FUNC                             0x8800
-#define GL_STENCIL_BACK_FAIL                             0x8801
-#define GL_STENCIL_BACK_PASS_DEPTH_FAIL                  0x8802
-#define GL_STENCIL_BACK_PASS_DEPTH_PASS                  0x8803
-#define GL_STENCIL_BACK_REF                              0x8CA3
-#define GL_STENCIL_BACK_VALUE_MASK                       0x8CA4
-#define GL_STENCIL_BACK_WRITEMASK                        0x8CA5
-#define GL_VIEWPORT                                      0x0BA2
-#define GL_SCISSOR_BOX                                   0x0C10
-/*      GL_SCISSOR_TEST */
-#define GL_COLOR_CLEAR_VALUE                             0x0C22
-#define GL_COLOR_WRITEMASK                               0x0C23
-#define GL_UNPACK_ALIGNMENT                              0x0CF5
-#define GL_PACK_ALIGNMENT                                0x0D05
-#define GL_MAX_TEXTURE_SIZE                              0x0D33
-#define GL_MAX_VIEWPORT_DIMS                             0x0D3A
-#define GL_SUBPIXEL_BITS                                 0x0D50
-#define GL_RED_BITS                                      0x0D52
-#define GL_GREEN_BITS                                    0x0D53
-#define GL_BLUE_BITS                                     0x0D54
-#define GL_ALPHA_BITS                                    0x0D55
-#define GL_DEPTH_BITS                                    0x0D56
-#define GL_STENCIL_BITS                                  0x0D57
-#define GL_POLYGON_OFFSET_UNITS                          0x2A00
-/*      GL_POLYGON_OFFSET_FILL */
-#define GL_POLYGON_OFFSET_FACTOR                         0x8038
-#define GL_TEXTURE_BINDING_2D                            0x8069
-#define GL_SAMPLE_BUFFERS                                0x80A8
-#define GL_SAMPLES                                       0x80A9
-#define GL_SAMPLE_COVERAGE_VALUE                         0x80AA
-#define GL_SAMPLE_COVERAGE_INVERT                        0x80AB
-
-/* GetTextureParameter */
-/*      GL_TEXTURE_MAG_FILTER */
-/*      GL_TEXTURE_MIN_FILTER */
-/*      GL_TEXTURE_WRAP_S */
-/*      GL_TEXTURE_WRAP_T */
-
-#define GL_NUM_COMPRESSED_TEXTURE_FORMATS                0x86A2
-#define GL_COMPRESSED_TEXTURE_FORMATS                    0x86A3
-
-/* HintMode */
-#define GL_DONT_CARE                                     0x1100
-#define GL_FASTEST                                       0x1101
-#define GL_NICEST                                        0x1102
-
-/* HintTarget */
-#define GL_GENERATE_MIPMAP_HINT                          0x8192
-
-/* DataType */
-#define GL_BYTE                                          0x1400
-#define GL_UNSIGNED_BYTE                                 0x1401
-#define GL_SHORT                                         0x1402
-#define GL_UNSIGNED_SHORT                                0x1403
-#define GL_INT                                           0x1404
-#define GL_UNSIGNED_INT                                  0x1405
-#define GL_FLOAT                                         0x1406
-#define GL_FIXED                                         0x140C
-
-/* PixelFormat */
-#define GL_DEPTH_COMPONENT                               0x1902
-#define GL_ALPHA                                         0x1906
-#define GL_RGB                                           0x1907
-#define GL_RGBA                                          0x1908
-#define GL_LUMINANCE                                     0x1909
-#define GL_LUMINANCE_ALPHA                               0x190A
-
-/* PixelType */
-/*      GL_UNSIGNED_BYTE */
-#define GL_UNSIGNED_SHORT_4_4_4_4                        0x8033
-#define GL_UNSIGNED_SHORT_5_5_5_1                        0x8034
-#define GL_UNSIGNED_SHORT_5_6_5                          0x8363
-
-/* Shaders */
-#define GL_FRAGMENT_SHADER                               0x8B30
-#define GL_VERTEX_SHADER                                 0x8B31
-#define GL_MAX_VERTEX_ATTRIBS                            0x8869
-#define GL_MAX_VERTEX_UNIFORM_VECTORS                    0x8DFB
-#define GL_MAX_VARYING_VECTORS                           0x8DFC
-#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS              0x8B4D
-#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS                0x8B4C
-#define GL_MAX_TEXTURE_IMAGE_UNITS                       0x8872
-#define GL_MAX_FRAGMENT_UNIFORM_VECTORS                  0x8DFD
-#define GL_SHADER_TYPE                                   0x8B4F
-#define GL_DELETE_STATUS                                 0x8B80
-#define GL_LINK_STATUS                                   0x8B82
-#define GL_VALIDATE_STATUS                               0x8B83
-#define GL_ATTACHED_SHADERS                              0x8B85
-#define GL_ACTIVE_UNIFORMS                               0x8B86
-#define GL_ACTIVE_UNIFORM_MAX_LENGTH                     0x8B87
-#define GL_ACTIVE_ATTRIBUTES                             0x8B89
-#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH                   0x8B8A
-#define GL_SHADING_LANGUAGE_VERSION                      0x8B8C
-#define GL_CURRENT_PROGRAM                               0x8B8D
-
-/* StencilFunction */
-#define GL_NEVER                                         0x0200
-#define GL_LESS                                          0x0201
-#define GL_EQUAL                                         0x0202
-#define GL_LEQUAL                                        0x0203
-#define GL_GREATER                                       0x0204
-#define GL_NOTEQUAL                                      0x0205
-#define GL_GEQUAL                                        0x0206
-#define GL_ALWAYS                                        0x0207
-
-/* StencilOp */
-/*      GL_ZERO */
-#define GL_KEEP                                          0x1E00
-#define GL_REPLACE                                       0x1E01
-#define GL_INCR                                          0x1E02
-#define GL_DECR                                          0x1E03
-#define GL_INVERT                                        0x150A
-#define GL_INCR_WRAP                                     0x8507
-#define GL_DECR_WRAP                                     0x8508
-
-/* StringName */
-#define GL_VENDOR                                        0x1F00
-#define GL_RENDERER                                      0x1F01
-#define GL_VERSION                                       0x1F02
-#define GL_EXTENSIONS                                    0x1F03
-
-/* TextureMagFilter */
-#define GL_NEAREST                                       0x2600
-#define GL_LINEAR                                        0x2601
-
-/* TextureMinFilter */
-/*      GL_NEAREST */
-/*      GL_LINEAR */
-#define GL_NEAREST_MIPMAP_NEAREST                        0x2700
-#define GL_LINEAR_MIPMAP_NEAREST                         0x2701
-#define GL_NEAREST_MIPMAP_LINEAR                         0x2702
-#define GL_LINEAR_MIPMAP_LINEAR                          0x2703
-
-/* TextureParameterName */
-#define GL_TEXTURE_MAG_FILTER                            0x2800
-#define GL_TEXTURE_MIN_FILTER                            0x2801
-#define GL_TEXTURE_WRAP_S                                0x2802
-#define GL_TEXTURE_WRAP_T                                0x2803
-
-/* TextureTarget */
-/*      GL_TEXTURE_2D */
-#define GL_TEXTURE                                       0x1702
-
-#define GL_TEXTURE_CUBE_MAP                              0x8513
-#define GL_TEXTURE_BINDING_CUBE_MAP                      0x8514
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_X                   0x8515
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X                   0x8516
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y                   0x8517
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y                   0x8518
-#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z                   0x8519
-#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z                   0x851A
-#define GL_MAX_CUBE_MAP_TEXTURE_SIZE                     0x851C
-
-/* TextureUnit */
-#define GL_TEXTURE0                                      0x84C0
-#define GL_TEXTURE1                                      0x84C1
-#define GL_TEXTURE2                                      0x84C2
-#define GL_TEXTURE3                                      0x84C3
-#define GL_TEXTURE4                                      0x84C4
-#define GL_TEXTURE5                                      0x84C5
-#define GL_TEXTURE6                                      0x84C6
-#define GL_TEXTURE7                                      0x84C7
-#define GL_TEXTURE8                                      0x84C8
-#define GL_TEXTURE9                                      0x84C9
-#define GL_TEXTURE10                                     0x84CA
-#define GL_TEXTURE11                                     0x84CB
-#define GL_TEXTURE12                                     0x84CC
-#define GL_TEXTURE13                                     0x84CD
-#define GL_TEXTURE14                                     0x84CE
-#define GL_TEXTURE15                                     0x84CF
-#define GL_TEXTURE16                                     0x84D0
-#define GL_TEXTURE17                                     0x84D1
-#define GL_TEXTURE18                                     0x84D2
-#define GL_TEXTURE19                                     0x84D3
-#define GL_TEXTURE20                                     0x84D4
-#define GL_TEXTURE21                                     0x84D5
-#define GL_TEXTURE22                                     0x84D6
-#define GL_TEXTURE23                                     0x84D7
-#define GL_TEXTURE24                                     0x84D8
-#define GL_TEXTURE25                                     0x84D9
-#define GL_TEXTURE26                                     0x84DA
-#define GL_TEXTURE27                                     0x84DB
-#define GL_TEXTURE28                                     0x84DC
-#define GL_TEXTURE29                                     0x84DD
-#define GL_TEXTURE30                                     0x84DE
-#define GL_TEXTURE31                                     0x84DF
-#define GL_ACTIVE_TEXTURE                                0x84E0
-
-/* TextureWrapMode */
-#define GL_REPEAT                                        0x2901
-#define GL_CLAMP_TO_EDGE                                 0x812F
-#define GL_MIRRORED_REPEAT                               0x8370
-
-/* Uniform Types */
-#define GL_FLOAT_VEC2                                    0x8B50
-#define GL_FLOAT_VEC3                                    0x8B51
-#define GL_FLOAT_VEC4                                    0x8B52
-#define GL_INT_VEC2                                      0x8B53
-#define GL_INT_VEC3                                      0x8B54
-#define GL_INT_VEC4                                      0x8B55
-#define GL_BOOL                                          0x8B56
-#define GL_BOOL_VEC2                                     0x8B57
-#define GL_BOOL_VEC3                                     0x8B58
-#define GL_BOOL_VEC4                                     0x8B59
-#define GL_FLOAT_MAT2                                    0x8B5A
-#define GL_FLOAT_MAT3                                    0x8B5B
-#define GL_FLOAT_MAT4                                    0x8B5C
-#define GL_SAMPLER_2D                                    0x8B5E
-#define GL_SAMPLER_CUBE                                  0x8B60
-
-/* Vertex Arrays */
-#define GL_VERTEX_ATTRIB_ARRAY_ENABLED                   0x8622
-#define GL_VERTEX_ATTRIB_ARRAY_SIZE                      0x8623
-#define GL_VERTEX_ATTRIB_ARRAY_STRIDE                    0x8624
-#define GL_VERTEX_ATTRIB_ARRAY_TYPE                      0x8625
-#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED                0x886A
-#define GL_VERTEX_ATTRIB_ARRAY_POINTER                   0x8645
-#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING            0x889F
-
-/* Read Format */
-#define GL_IMPLEMENTATION_COLOR_READ_TYPE                0x8B9A
-#define GL_IMPLEMENTATION_COLOR_READ_FORMAT              0x8B9B
-
-/* Shader Source */
-#define GL_COMPILE_STATUS                                0x8B81
-#define GL_INFO_LOG_LENGTH                               0x8B84
-#define GL_SHADER_SOURCE_LENGTH                          0x8B88
-#define GL_SHADER_COMPILER                               0x8DFA
-
-/* Shader Binary */
-#define GL_SHADER_BINARY_FORMATS                         0x8DF8
-#define GL_NUM_SHADER_BINARY_FORMATS                     0x8DF9
-
-/* Shader Precision-Specified Types */
-#define GL_LOW_FLOAT                                     0x8DF0
-#define GL_MEDIUM_FLOAT                                  0x8DF1
-#define GL_HIGH_FLOAT                                    0x8DF2
-#define GL_LOW_INT                                       0x8DF3
-#define GL_MEDIUM_INT                                    0x8DF4
-#define GL_HIGH_INT                                      0x8DF5
-
-/* Framebuffer Object. */
-#define GL_FRAMEBUFFER                                   0x8D40
-#define GL_RENDERBUFFER                                  0x8D41
-
-#define GL_RGBA4                                         0x8056
-#define GL_RGB5_A1                                       0x8057
-#define GL_RGB565                                        0x8D62
-#define GL_DEPTH_COMPONENT16                             0x81A5
-#define GL_STENCIL_INDEX8                                0x8D48
-
-#define GL_RENDERBUFFER_WIDTH                            0x8D42
-#define GL_RENDERBUFFER_HEIGHT                           0x8D43
-#define GL_RENDERBUFFER_INTERNAL_FORMAT                  0x8D44
-#define GL_RENDERBUFFER_RED_SIZE                         0x8D50
-#define GL_RENDERBUFFER_GREEN_SIZE                       0x8D51
-#define GL_RENDERBUFFER_BLUE_SIZE                        0x8D52
-#define GL_RENDERBUFFER_ALPHA_SIZE                       0x8D53
-#define GL_RENDERBUFFER_DEPTH_SIZE                       0x8D54
-#define GL_RENDERBUFFER_STENCIL_SIZE                     0x8D55
-
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE            0x8CD0
-#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME            0x8CD1
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL          0x8CD2
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE  0x8CD3
-
-#define GL_COLOR_ATTACHMENT0                             0x8CE0
-#define GL_DEPTH_ATTACHMENT                              0x8D00
-#define GL_STENCIL_ATTACHMENT                            0x8D20
-
-#define GL_NONE                                          0
-
-#define GL_FRAMEBUFFER_COMPLETE                          0x8CD5
-#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT             0x8CD6
-#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT     0x8CD7
-#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS             0x8CD9
-#define GL_FRAMEBUFFER_UNSUPPORTED                       0x8CDD
-
-#define GL_FRAMEBUFFER_BINDING                           0x8CA6
-#define GL_RENDERBUFFER_BINDING                          0x8CA7
-#define GL_MAX_RENDERBUFFER_SIZE                         0x84E8
-
-#define GL_INVALID_FRAMEBUFFER_OPERATION                 0x0506
-
-/* OpenGL ES 3.0 */
-
-#define GL_READ_BUFFER                                   0x0C02
-#define GL_UNPACK_ROW_LENGTH                             0x0CF2
-#define GL_UNPACK_SKIP_ROWS                              0x0CF3
-#define GL_UNPACK_SKIP_PIXELS                            0x0CF4
-#define GL_PACK_ROW_LENGTH                               0x0D02
-#define GL_PACK_SKIP_ROWS                                0x0D03
-#define GL_PACK_SKIP_PIXELS                              0x0D04
-#define GL_COLOR                                         0x1800
-#define GL_DEPTH                                         0x1801
-#define GL_STENCIL                                       0x1802
-#define GL_RED                                           0x1903
-#define GL_RGB8                                          0x8051
-#define GL_RGBA8                                         0x8058
-#define GL_RGB10_A2                                      0x8059
-#define GL_TEXTURE_BINDING_3D                            0x806A
-#define GL_UNPACK_SKIP_IMAGES                            0x806D
-#define GL_UNPACK_IMAGE_HEIGHT                           0x806E
-#define GL_TEXTURE_3D                                    0x806F
-#define GL_TEXTURE_WRAP_R                                0x8072
-#define GL_MAX_3D_TEXTURE_SIZE                           0x8073
-#define GL_UNSIGNED_INT_2_10_10_10_REV                   0x8368
-#define GL_MAX_ELEMENTS_VERTICES                         0x80E8
-#define GL_MAX_ELEMENTS_INDICES                          0x80E9
-#define GL_TEXTURE_MIN_LOD                               0x813A
-#define GL_TEXTURE_MAX_LOD                               0x813B
-#define GL_TEXTURE_BASE_LEVEL                            0x813C
-#define GL_TEXTURE_MAX_LEVEL                             0x813D
-#define GL_MIN                                           0x8007
-#define GL_MAX                                           0x8008
-#define GL_DEPTH_COMPONENT24                             0x81A6
-#define GL_MAX_TEXTURE_LOD_BIAS                          0x84FD
-#define GL_TEXTURE_COMPARE_MODE                          0x884C
-#define GL_TEXTURE_COMPARE_FUNC                          0x884D
-#define GL_CURRENT_QUERY                                 0x8865
-#define GL_QUERY_RESULT                                  0x8866
-#define GL_QUERY_RESULT_AVAILABLE                        0x8867
-#define GL_BUFFER_MAPPED                                 0x88BC
-#define GL_BUFFER_MAP_POINTER                            0x88BD
-#define GL_STREAM_READ                                   0x88E1
-#define GL_STREAM_COPY                                   0x88E2
-#define GL_STATIC_READ                                   0x88E5
-#define GL_STATIC_COPY                                   0x88E6
-#define GL_DYNAMIC_READ                                  0x88E9
-#define GL_DYNAMIC_COPY                                  0x88EA
-#define GL_MAX_DRAW_BUFFERS                              0x8824
-#define GL_DRAW_BUFFER0                                  0x8825
-#define GL_DRAW_BUFFER1                                  0x8826
-#define GL_DRAW_BUFFER2                                  0x8827
-#define GL_DRAW_BUFFER3                                  0x8828
-#define GL_DRAW_BUFFER4                                  0x8829
-#define GL_DRAW_BUFFER5                                  0x882A
-#define GL_DRAW_BUFFER6                                  0x882B
-#define GL_DRAW_BUFFER7                                  0x882C
-#define GL_DRAW_BUFFER8                                  0x882D
-#define GL_DRAW_BUFFER9                                  0x882E
-#define GL_DRAW_BUFFER10                                 0x882F
-#define GL_DRAW_BUFFER11                                 0x8830
-#define GL_DRAW_BUFFER12                                 0x8831
-#define GL_DRAW_BUFFER13                                 0x8832
-#define GL_DRAW_BUFFER14                                 0x8833
-#define GL_DRAW_BUFFER15                                 0x8834
-#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS               0x8B49
-#define GL_MAX_VERTEX_UNIFORM_COMPONENTS                 0x8B4A
-#define GL_SAMPLER_3D                                    0x8B5F
-#define GL_SAMPLER_2D_SHADOW                             0x8B62
-#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT               0x8B8B
-#define GL_PIXEL_PACK_BUFFER                             0x88EB
-#define GL_PIXEL_UNPACK_BUFFER                           0x88EC
-#define GL_PIXEL_PACK_BUFFER_BINDING                     0x88ED
-#define GL_PIXEL_UNPACK_BUFFER_BINDING                   0x88EF
-#define GL_FLOAT_MAT2x3                                  0x8B65
-#define GL_FLOAT_MAT2x4                                  0x8B66
-#define GL_FLOAT_MAT3x2                                  0x8B67
-#define GL_FLOAT_MAT3x4                                  0x8B68
-#define GL_FLOAT_MAT4x2                                  0x8B69
-#define GL_FLOAT_MAT4x3                                  0x8B6A
-#define GL_SRGB                                          0x8C40
-#define GL_SRGB8                                         0x8C41
-#define GL_SRGB8_ALPHA8                                  0x8C43
-#define GL_COMPARE_REF_TO_TEXTURE                        0x884E
-#define GL_MAJOR_VERSION                                 0x821B
-#define GL_MINOR_VERSION                                 0x821C
-#define GL_NUM_EXTENSIONS                                0x821D
-#define GL_RGBA32F                                       0x8814
-#define GL_RGB32F                                        0x8815
-#define GL_RGBA16F                                       0x881A
-#define GL_RGB16F                                        0x881B
-#define GL_VERTEX_ATTRIB_ARRAY_INTEGER                   0x88FD
-#define GL_MAX_ARRAY_TEXTURE_LAYERS                      0x88FF
-#define GL_MIN_PROGRAM_TEXEL_OFFSET                      0x8904
-#define GL_MAX_PROGRAM_TEXEL_OFFSET                      0x8905
-#define GL_MAX_VARYING_COMPONENTS                        0x8B4B
-#define GL_TEXTURE_2D_ARRAY                              0x8C1A
-#define GL_TEXTURE_BINDING_2D_ARRAY                      0x8C1D
-#define GL_R11F_G11F_B10F                                0x8C3A
-#define GL_UNSIGNED_INT_10F_11F_11F_REV                  0x8C3B
-#define GL_RGB9_E5                                       0x8C3D
-#define GL_UNSIGNED_INT_5_9_9_9_REV                      0x8C3E
-#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH         0x8C76
-#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE                0x8C7F
-#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS    0x8C80
-#define GL_TRANSFORM_FEEDBACK_VARYINGS                   0x8C83
-#define GL_TRANSFORM_FEEDBACK_BUFFER_START               0x8C84
-#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE                0x8C85
-#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN         0x8C88
-#define GL_RASTERIZER_DISCARD                            0x8C89
</del><ins>+#ifndef GL_ES_VERSION_3_0
+#define GL_ES_VERSION_3_0 1
+typedef unsigned short GLhalf;
+#define GL_READ_BUFFER                    0x0C02
+#define GL_UNPACK_ROW_LENGTH              0x0CF2
+#define GL_UNPACK_SKIP_ROWS               0x0CF3
+#define GL_UNPACK_SKIP_PIXELS             0x0CF4
+#define GL_PACK_ROW_LENGTH                0x0D02
+#define GL_PACK_SKIP_ROWS                 0x0D03
+#define GL_PACK_SKIP_PIXELS               0x0D04
+#define GL_COLOR                          0x1800
+#define GL_DEPTH                          0x1801
+#define GL_STENCIL                        0x1802
+#define GL_RED                            0x1903
+#define GL_RGB8                           0x8051
+#define GL_RGBA8                          0x8058
+#define GL_RGB10_A2                       0x8059
+#define GL_TEXTURE_BINDING_3D             0x806A
+#define GL_UNPACK_SKIP_IMAGES             0x806D
+#define GL_UNPACK_IMAGE_HEIGHT            0x806E
+#define GL_TEXTURE_3D                     0x806F
+#define GL_TEXTURE_WRAP_R                 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE            0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV    0x8368
+#define GL_MAX_ELEMENTS_VERTICES          0x80E8
+#define GL_MAX_ELEMENTS_INDICES           0x80E9
+#define GL_TEXTURE_MIN_LOD                0x813A
+#define GL_TEXTURE_MAX_LOD                0x813B
+#define GL_TEXTURE_BASE_LEVEL             0x813C
+#define GL_TEXTURE_MAX_LEVEL              0x813D
+#define GL_MIN                            0x8007
+#define GL_MAX                            0x8008
+#define GL_DEPTH_COMPONENT24              0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS           0x84FD
+#define GL_TEXTURE_COMPARE_MODE           0x884C
+#define GL_TEXTURE_COMPARE_FUNC           0x884D
+#define GL_CURRENT_QUERY                  0x8865
+#define GL_QUERY_RESULT                   0x8866
+#define GL_QUERY_RESULT_AVAILABLE         0x8867
+#define GL_BUFFER_MAPPED                  0x88BC
+#define GL_BUFFER_MAP_POINTER             0x88BD
+#define GL_STREAM_READ                    0x88E1
+#define GL_STREAM_COPY                    0x88E2
+#define GL_STATIC_READ                    0x88E5
+#define GL_STATIC_COPY                    0x88E6
+#define GL_DYNAMIC_READ                   0x88E9
+#define GL_DYNAMIC_COPY                   0x88EA
+#define GL_MAX_DRAW_BUFFERS               0x8824
+#define GL_DRAW_BUFFER0                   0x8825
+#define GL_DRAW_BUFFER1                   0x8826
+#define GL_DRAW_BUFFER2                   0x8827
+#define GL_DRAW_BUFFER3                   0x8828
+#define GL_DRAW_BUFFER4                   0x8829
+#define GL_DRAW_BUFFER5                   0x882A
+#define GL_DRAW_BUFFER6                   0x882B
+#define GL_DRAW_BUFFER7                   0x882C
+#define GL_DRAW_BUFFER8                   0x882D
+#define GL_DRAW_BUFFER9                   0x882E
+#define GL_DRAW_BUFFER10                  0x882F
+#define GL_DRAW_BUFFER11                  0x8830
+#define GL_DRAW_BUFFER12                  0x8831
+#define GL_DRAW_BUFFER13                  0x8832
+#define GL_DRAW_BUFFER14                  0x8833
+#define GL_DRAW_BUFFER15                  0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS  0x8B4A
+#define GL_SAMPLER_3D                     0x8B5F
+#define GL_SAMPLER_2D_SHADOW              0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_PIXEL_PACK_BUFFER              0x88EB
+#define GL_PIXEL_UNPACK_BUFFER            0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING      0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING    0x88EF
+#define GL_FLOAT_MAT2x3                   0x8B65
+#define GL_FLOAT_MAT2x4                   0x8B66
+#define GL_FLOAT_MAT3x2                   0x8B67
+#define GL_FLOAT_MAT3x4                   0x8B68
+#define GL_FLOAT_MAT4x2                   0x8B69
+#define GL_FLOAT_MAT4x3                   0x8B6A
+#define GL_SRGB                           0x8C40
+#define GL_SRGB8                          0x8C41
+#define GL_SRGB8_ALPHA8                   0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE         0x884E
+#define GL_MAJOR_VERSION                  0x821B
+#define GL_MINOR_VERSION                  0x821C
+#define GL_NUM_EXTENSIONS                 0x821D
+#define GL_RGBA32F                        0x8814
+#define GL_RGB32F                         0x8815
+#define GL_RGBA16F                        0x881A
+#define GL_RGB16F                         0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER    0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS       0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET       0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET       0x8905
+#define GL_MAX_VARYING_COMPONENTS         0x8B4B
+#define GL_TEXTURE_2D_ARRAY               0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY       0x8C1D
+#define GL_R11F_G11F_B10F                 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV   0x8C3B
+#define GL_RGB9_E5                        0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV       0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS    0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD             0x8C89
</ins><span class="cx"> #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
</span><del>-#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS       0x8C8B
-#define GL_INTERLEAVED_ATTRIBS                           0x8C8C
-#define GL_SEPARATE_ATTRIBS                              0x8C8D
-#define GL_TRANSFORM_FEEDBACK_BUFFER                     0x8C8E
-#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING             0x8C8F
-#define GL_RGBA32UI                                      0x8D70
-#define GL_RGB32UI                                       0x8D71
-#define GL_RGBA16UI                                      0x8D76
-#define GL_RGB16UI                                       0x8D77
-#define GL_RGBA8UI                                       0x8D7C
-#define GL_RGB8UI                                        0x8D7D
-#define GL_RGBA32I                                       0x8D82
-#define GL_RGB32I                                        0x8D83
-#define GL_RGBA16I                                       0x8D88
-#define GL_RGB16I                                        0x8D89
-#define GL_RGBA8I                                        0x8D8E
-#define GL_RGB8I                                         0x8D8F
-#define GL_RED_INTEGER                                   0x8D94
-#define GL_RGB_INTEGER                                   0x8D98
-#define GL_RGBA_INTEGER                                  0x8D99
-#define GL_SAMPLER_2D_ARRAY                              0x8DC1
-#define GL_SAMPLER_2D_ARRAY_SHADOW                       0x8DC4
-#define GL_SAMPLER_CUBE_SHADOW                           0x8DC5
-#define GL_UNSIGNED_INT_VEC2                             0x8DC6
-#define GL_UNSIGNED_INT_VEC3                             0x8DC7
-#define GL_UNSIGNED_INT_VEC4                             0x8DC8
-#define GL_INT_SAMPLER_2D                                0x8DCA
-#define GL_INT_SAMPLER_3D                                0x8DCB
-#define GL_INT_SAMPLER_CUBE                              0x8DCC
-#define GL_INT_SAMPLER_2D_ARRAY                          0x8DCF
-#define GL_UNSIGNED_INT_SAMPLER_2D                       0x8DD2
-#define GL_UNSIGNED_INT_SAMPLER_3D                       0x8DD3
-#define GL_UNSIGNED_INT_SAMPLER_CUBE                     0x8DD4
-#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY                 0x8DD7
-#define GL_BUFFER_ACCESS_FLAGS                           0x911F
-#define GL_BUFFER_MAP_LENGTH                             0x9120
-#define GL_BUFFER_MAP_OFFSET                             0x9121
-#define GL_DEPTH_COMPONENT32F                            0x8CAC
-#define GL_DEPTH32F_STENCIL8                             0x8CAD
-#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV                0x8DAD
-#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING         0x8210
-#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE         0x8211
-#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE               0x8212
-#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE             0x8213
-#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE              0x8214
-#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE             0x8215
-#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE             0x8216
-#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE           0x8217
-#define GL_FRAMEBUFFER_DEFAULT                           0x8218
-#define GL_FRAMEBUFFER_UNDEFINED                         0x8219
-#define GL_DEPTH_STENCIL_ATTACHMENT                      0x821A
-#define GL_DEPTH_STENCIL                                 0x84F9
-#define GL_UNSIGNED_INT_24_8                             0x84FA
-#define GL_DEPTH24_STENCIL8                              0x88F0
-#define GL_UNSIGNED_NORMALIZED                           0x8C17
-#define GL_DRAW_FRAMEBUFFER_BINDING                      GL_FRAMEBUFFER_BINDING
-#define GL_READ_FRAMEBUFFER                              0x8CA8
-#define GL_DRAW_FRAMEBUFFER                              0x8CA9
-#define GL_READ_FRAMEBUFFER_BINDING                      0x8CAA
-#define GL_RENDERBUFFER_SAMPLES                          0x8CAB
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER          0x8CD4
-#define GL_MAX_COLOR_ATTACHMENTS                         0x8CDF
-#define GL_COLOR_ATTACHMENT1                             0x8CE1
-#define GL_COLOR_ATTACHMENT2                             0x8CE2
-#define GL_COLOR_ATTACHMENT3                             0x8CE3
-#define GL_COLOR_ATTACHMENT4                             0x8CE4
-#define GL_COLOR_ATTACHMENT5                             0x8CE5
-#define GL_COLOR_ATTACHMENT6                             0x8CE6
-#define GL_COLOR_ATTACHMENT7                             0x8CE7
-#define GL_COLOR_ATTACHMENT8                             0x8CE8
-#define GL_COLOR_ATTACHMENT9                             0x8CE9
-#define GL_COLOR_ATTACHMENT10                            0x8CEA
-#define GL_COLOR_ATTACHMENT11                            0x8CEB
-#define GL_COLOR_ATTACHMENT12                            0x8CEC
-#define GL_COLOR_ATTACHMENT13                            0x8CED
-#define GL_COLOR_ATTACHMENT14                            0x8CEE
-#define GL_COLOR_ATTACHMENT15                            0x8CEF
-#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE            0x8D56
-#define GL_MAX_SAMPLES                                   0x8D57
-#define GL_HALF_FLOAT                                    0x140B
-#define GL_MAP_READ_BIT                                  0x0001
-#define GL_MAP_WRITE_BIT                                 0x0002
-#define GL_MAP_INVALIDATE_RANGE_BIT                      0x0004
-#define GL_MAP_INVALIDATE_BUFFER_BIT                     0x0008
-#define GL_MAP_FLUSH_EXPLICIT_BIT                        0x0010
-#define GL_MAP_UNSYNCHRONIZED_BIT                        0x0020
-#define GL_RG                                            0x8227
-#define GL_RG_INTEGER                                    0x8228
-#define GL_R8                                            0x8229
-#define GL_RG8                                           0x822B
-#define GL_R16F                                          0x822D
-#define GL_R32F                                          0x822E
-#define GL_RG16F                                         0x822F
-#define GL_RG32F                                         0x8230
-#define GL_R8I                                           0x8231
-#define GL_R8UI                                          0x8232
-#define GL_R16I                                          0x8233
-#define GL_R16UI                                         0x8234
-#define GL_R32I                                          0x8235
-#define GL_R32UI                                         0x8236
-#define GL_RG8I                                          0x8237
-#define GL_RG8UI                                         0x8238
-#define GL_RG16I                                         0x8239
-#define GL_RG16UI                                        0x823A
-#define GL_RG32I                                         0x823B
-#define GL_RG32UI                                        0x823C
-#define GL_VERTEX_ARRAY_BINDING                          0x85B5
-#define GL_R8_SNORM                                      0x8F94
-#define GL_RG8_SNORM                                     0x8F95
-#define GL_RGB8_SNORM                                    0x8F96
-#define GL_RGBA8_SNORM                                   0x8F97
-#define GL_SIGNED_NORMALIZED                             0x8F9C
-#define GL_PRIMITIVE_RESTART_FIXED_INDEX                 0x8D69
-#define GL_COPY_READ_BUFFER                              0x8F36
-#define GL_COPY_WRITE_BUFFER                             0x8F37
-#define GL_COPY_READ_BUFFER_BINDING                      GL_COPY_READ_BUFFER
-#define GL_COPY_WRITE_BUFFER_BINDING                     GL_COPY_WRITE_BUFFER
-#define GL_UNIFORM_BUFFER                                0x8A11
-#define GL_UNIFORM_BUFFER_BINDING                        0x8A28
-#define GL_UNIFORM_BUFFER_START                          0x8A29
-#define GL_UNIFORM_BUFFER_SIZE                           0x8A2A
-#define GL_MAX_VERTEX_UNIFORM_BLOCKS                     0x8A2B
-#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS                   0x8A2D
-#define GL_MAX_COMBINED_UNIFORM_BLOCKS                   0x8A2E
-#define GL_MAX_UNIFORM_BUFFER_BINDINGS                   0x8A2F
-#define GL_MAX_UNIFORM_BLOCK_SIZE                        0x8A30
-#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS        0x8A31
-#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS      0x8A33
-#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT               0x8A34
-#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH          0x8A35
-#define GL_ACTIVE_UNIFORM_BLOCKS                         0x8A36
-#define GL_UNIFORM_TYPE                                  0x8A37
-#define GL_UNIFORM_SIZE                                  0x8A38
-#define GL_UNIFORM_NAME_LENGTH                           0x8A39
-#define GL_UNIFORM_BLOCK_INDEX                           0x8A3A
-#define GL_UNIFORM_OFFSET                                0x8A3B
-#define GL_UNIFORM_ARRAY_STRIDE                          0x8A3C
-#define GL_UNIFORM_MATRIX_STRIDE                         0x8A3D
-#define GL_UNIFORM_IS_ROW_MAJOR                          0x8A3E
-#define GL_UNIFORM_BLOCK_BINDING                         0x8A3F
-#define GL_UNIFORM_BLOCK_DATA_SIZE                       0x8A40
-#define GL_UNIFORM_BLOCK_NAME_LENGTH                     0x8A41
-#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS                 0x8A42
-#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES          0x8A43
-#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER     0x8A44
-#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER   0x8A46
-#define GL_INVALID_INDEX                                 0xFFFFFFFFu
-#define GL_MAX_VERTEX_OUTPUT_COMPONENTS                  0x9122
-#define GL_MAX_FRAGMENT_INPUT_COMPONENTS                 0x9125
-#define GL_MAX_SERVER_WAIT_TIMEOUT                       0x9111
-#define GL_OBJECT_TYPE                                   0x9112
-#define GL_SYNC_CONDITION                                0x9113
-#define GL_SYNC_STATUS                                   0x9114
-#define GL_SYNC_FLAGS                                    0x9115
-#define GL_SYNC_FENCE                                    0x9116
-#define GL_SYNC_GPU_COMMANDS_COMPLETE                    0x9117
-#define GL_UNSIGNALED                                    0x9118
-#define GL_SIGNALED                                      0x9119
-#define GL_ALREADY_SIGNALED                              0x911A
-#define GL_TIMEOUT_EXPIRED                               0x911B
-#define GL_CONDITION_SATISFIED                           0x911C
-#define GL_WAIT_FAILED                                   0x911D
-#define GL_SYNC_FLUSH_COMMANDS_BIT                       0x00000001
-#define GL_TIMEOUT_IGNORED                               0xFFFFFFFFFFFFFFFFull
-#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR                   0x88FE
-#define GL_ANY_SAMPLES_PASSED                            0x8C2F
-#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE               0x8D6A
-#define GL_SAMPLER_BINDING                               0x8919
-#define GL_RGB10_A2UI                                    0x906F
-#define GL_TEXTURE_SWIZZLE_R                             0x8E42
-#define GL_TEXTURE_SWIZZLE_G                             0x8E43
-#define GL_TEXTURE_SWIZZLE_B                             0x8E44
-#define GL_TEXTURE_SWIZZLE_A                             0x8E45
-#define GL_GREEN                                         0x1904
-#define GL_BLUE                                          0x1905
-#define GL_INT_2_10_10_10_REV                            0x8D9F
-#define GL_TRANSFORM_FEEDBACK                            0x8E22
-#define GL_TRANSFORM_FEEDBACK_PAUSED                     0x8E23
-#define GL_TRANSFORM_FEEDBACK_ACTIVE                     0x8E24
-#define GL_TRANSFORM_FEEDBACK_BINDING                    0x8E25
-#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT               0x8257
-#define GL_PROGRAM_BINARY_LENGTH                         0x8741
-#define GL_NUM_PROGRAM_BINARY_FORMATS                    0x87FE
-#define GL_PROGRAM_BINARY_FORMATS                        0x87FF
-#define GL_COMPRESSED_R11_EAC                            0x9270
-#define GL_COMPRESSED_SIGNED_R11_EAC                     0x9271
-#define GL_COMPRESSED_RG11_EAC                           0x9272
-#define GL_COMPRESSED_SIGNED_RG11_EAC                    0x9273
-#define GL_COMPRESSED_RGB8_ETC2                          0x9274
-#define GL_COMPRESSED_SRGB8_ETC2                         0x9275
-#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2      0x9276
-#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2     0x9277
-#define GL_COMPRESSED_RGBA8_ETC2_EAC                     0x9278
-#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC              0x9279
-#define GL_TEXTURE_IMMUTABLE_FORMAT                      0x912F
-#define GL_MAX_ELEMENT_INDEX                             0x8D6B
-#define GL_NUM_SAMPLE_COUNTS                             0x9380
-#define GL_TEXTURE_IMMUTABLE_LEVELS                      0x82DF
</del><ins>+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS            0x8C8C
+#define GL_SEPARATE_ATTRIBS               0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER      0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI                       0x8D70
+#define GL_RGB32UI                        0x8D71
+#define GL_RGBA16UI                       0x8D76
+#define GL_RGB16UI                        0x8D77
+#define GL_RGBA8UI                        0x8D7C
+#define GL_RGB8UI                         0x8D7D
+#define GL_RGBA32I                        0x8D82
+#define GL_RGB32I                         0x8D83
+#define GL_RGBA16I                        0x8D88
+#define GL_RGB16I                         0x8D89
+#define GL_RGBA8I                         0x8D8E
+#define GL_RGB8I                          0x8D8F
+#define GL_RED_INTEGER                    0x8D94
+#define GL_RGB_INTEGER                    0x8D98
+#define GL_RGBA_INTEGER                   0x8D99
+#define GL_SAMPLER_2D_ARRAY               0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW        0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW            0x8DC5
+#define GL_UNSIGNED_INT_VEC2              0x8DC6
+#define GL_UNSIGNED_INT_VEC3              0x8DC7
+#define GL_UNSIGNED_INT_VEC4              0x8DC8
+#define GL_INT_SAMPLER_2D                 0x8DCA
+#define GL_INT_SAMPLER_3D                 0x8DCB
+#define GL_INT_SAMPLER_CUBE               0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY           0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D        0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D        0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE      0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY  0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS            0x911F
+#define GL_BUFFER_MAP_LENGTH              0x9120
+#define GL_BUFFER_MAP_OFFSET              0x9121
+#define GL_DEPTH_COMPONENT32F             0x8CAC
+#define GL_DEPTH32F_STENCIL8              0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT            0x8218
+#define GL_FRAMEBUFFER_UNDEFINED          0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT       0x821A
+#define GL_DEPTH_STENCIL                  0x84F9
+#define GL_UNSIGNED_INT_24_8              0x84FA
+#define GL_DEPTH24_STENCIL8               0x88F0
+#define GL_UNSIGNED_NORMALIZED            0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING       0x8CA6
+#define GL_READ_FRAMEBUFFER               0x8CA8
+#define GL_DRAW_FRAMEBUFFER               0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING       0x8CAA
+#define GL_RENDERBUFFER_SAMPLES           0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS          0x8CDF
+#define GL_COLOR_ATTACHMENT1              0x8CE1
+#define GL_COLOR_ATTACHMENT2              0x8CE2
+#define GL_COLOR_ATTACHMENT3              0x8CE3
+#define GL_COLOR_ATTACHMENT4              0x8CE4
+#define GL_COLOR_ATTACHMENT5              0x8CE5
+#define GL_COLOR_ATTACHMENT6              0x8CE6
+#define GL_COLOR_ATTACHMENT7              0x8CE7
+#define GL_COLOR_ATTACHMENT8              0x8CE8
+#define GL_COLOR_ATTACHMENT9              0x8CE9
+#define GL_COLOR_ATTACHMENT10             0x8CEA
+#define GL_COLOR_ATTACHMENT11             0x8CEB
+#define GL_COLOR_ATTACHMENT12             0x8CEC
+#define GL_COLOR_ATTACHMENT13             0x8CED
+#define GL_COLOR_ATTACHMENT14             0x8CEE
+#define GL_COLOR_ATTACHMENT15             0x8CEF
+#define GL_COLOR_ATTACHMENT16             0x8CF0
+#define GL_COLOR_ATTACHMENT17             0x8CF1
+#define GL_COLOR_ATTACHMENT18             0x8CF2
+#define GL_COLOR_ATTACHMENT19             0x8CF3
+#define GL_COLOR_ATTACHMENT20             0x8CF4
+#define GL_COLOR_ATTACHMENT21             0x8CF5
+#define GL_COLOR_ATTACHMENT22             0x8CF6
+#define GL_COLOR_ATTACHMENT23             0x8CF7
+#define GL_COLOR_ATTACHMENT24             0x8CF8
+#define GL_COLOR_ATTACHMENT25             0x8CF9
+#define GL_COLOR_ATTACHMENT26             0x8CFA
+#define GL_COLOR_ATTACHMENT27             0x8CFB
+#define GL_COLOR_ATTACHMENT28             0x8CFC
+#define GL_COLOR_ATTACHMENT29             0x8CFD
+#define GL_COLOR_ATTACHMENT30             0x8CFE
+#define GL_COLOR_ATTACHMENT31             0x8CFF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES                    0x8D57
+#define GL_HALF_FLOAT                     0x140B
+#define GL_MAP_READ_BIT                   0x0001
+#define GL_MAP_WRITE_BIT                  0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT       0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT      0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT         0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT         0x0020
+#define GL_RG                             0x8227
+#define GL_RG_INTEGER                     0x8228
+#define GL_R8                             0x8229
+#define GL_RG8                            0x822B
+#define GL_R16F                           0x822D
+#define GL_R32F                           0x822E
+#define GL_RG16F                          0x822F
+#define GL_RG32F                          0x8230
+#define GL_R8I                            0x8231
+#define GL_R8UI                           0x8232
+#define GL_R16I                           0x8233
+#define GL_R16UI                          0x8234
+#define GL_R32I                           0x8235
+#define GL_R32UI                          0x8236
+#define GL_RG8I                           0x8237
+#define GL_RG8UI                          0x8238
+#define GL_RG16I                          0x8239
+#define GL_RG16UI                         0x823A
+#define GL_RG32I                          0x823B
+#define GL_RG32UI                         0x823C
+#define GL_VERTEX_ARRAY_BINDING           0x85B5
+#define GL_R8_SNORM                       0x8F94
+#define GL_RG8_SNORM                      0x8F95
+#define GL_RGB8_SNORM                     0x8F96
+#define GL_RGBA8_SNORM                    0x8F97
+#define GL_SIGNED_NORMALIZED              0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX  0x8D69
+#define GL_COPY_READ_BUFFER               0x8F36
+#define GL_COPY_WRITE_BUFFER              0x8F37
+#define GL_COPY_READ_BUFFER_BINDING       0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING      0x8F37
+#define GL_UNIFORM_BUFFER                 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING         0x8A28
+#define GL_UNIFORM_BUFFER_START           0x8A29
+#define GL_UNIFORM_BUFFER_SIZE            0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS      0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS    0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS    0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS    0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE         0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS          0x8A36
+#define GL_UNIFORM_TYPE                   0x8A37
+#define GL_UNIFORM_SIZE                   0x8A38
+#define GL_UNIFORM_NAME_LENGTH            0x8A39
+#define GL_UNIFORM_BLOCK_INDEX            0x8A3A
+#define GL_UNIFORM_OFFSET                 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE           0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE          0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR           0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING          0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE        0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH      0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS  0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX                  0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS   0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS  0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT        0x9111
+#define GL_OBJECT_TYPE                    0x9112
+#define GL_SYNC_CONDITION                 0x9113
+#define GL_SYNC_STATUS                    0x9114
+#define GL_SYNC_FLAGS                     0x9115
+#define GL_SYNC_FENCE                     0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE     0x9117
+#define GL_UNSIGNALED                     0x9118
+#define GL_SIGNALED                       0x9119
+#define GL_ALREADY_SIGNALED               0x911A
+#define GL_TIMEOUT_EXPIRED                0x911B
+#define GL_CONDITION_SATISFIED            0x911C
+#define GL_WAIT_FAILED                    0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT        0x00000001
+#define GL_TIMEOUT_IGNORED                0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR    0x88FE
+#define GL_ANY_SAMPLES_PASSED             0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_SAMPLER_BINDING                0x8919
+#define GL_RGB10_A2UI                     0x906F
+#define GL_TEXTURE_SWIZZLE_R              0x8E42
+#define GL_TEXTURE_SWIZZLE_G              0x8E43
+#define GL_TEXTURE_SWIZZLE_B              0x8E44
+#define GL_TEXTURE_SWIZZLE_A              0x8E45
+#define GL_GREEN                          0x1904
+#define GL_BLUE                           0x1905
+#define GL_INT_2_10_10_10_REV             0x8D9F
+#define GL_TRANSFORM_FEEDBACK             0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED      0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE      0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING     0x8E25
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH          0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS     0x87FE
+#define GL_PROGRAM_BINARY_FORMATS         0x87FF
+#define GL_COMPRESSED_R11_EAC             0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC      0x9271
+#define GL_COMPRESSED_RG11_EAC            0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC     0x9273
+#define GL_COMPRESSED_RGB8_ETC2           0x9274
+#define GL_COMPRESSED_SRGB8_ETC2          0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC      0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT       0x912F
+#define GL_MAX_ELEMENT_INDEX              0x8D6B
+#define GL_NUM_SAMPLE_COUNTS              0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS       0x82DF
+typedef void (GL_APIENTRYP PFNGLREADBUFFERPROC) (GLenum src);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLENDQUERYPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params);
+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params);
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
+typedef void (GL_APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);
+typedef void (GL_APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+typedef void (GL_APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
+typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+typedef GLuint (GL_APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCPROC) (GLsync sync);
+typedef void (GL_APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);
+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers);
+typedef void (GL_APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers);
+typedef GLboolean (GL_APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
+typedef void (GL_APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src);
+GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQuery (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQuery (GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target);
+GL_APICALL void GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params);
+GL_APICALL void GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GL_APICALL void *GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
+GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);
+GL_APICALL void GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
+GL_APICALL void GL_APIENTRY glEndTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+GL_APICALL void GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);
+GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);
+GL_APICALL void GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);
+GL_APICALL GLint GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUniform1ui (GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);
+GL_APICALL void GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+GL_APICALL const GLubyte *GL_APIENTRY glGetStringi (GLenum name, GLuint index);
+GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+GL_APICALL void GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+GL_APICALL void GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GL_APICALL GLboolean GL_APIENTRY glIsSync (GLsync sync);
+GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync);
+GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glGetInteger64v (GLenum pname, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GL_APICALL void GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);
+GL_APICALL void GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);
+GL_APICALL GLboolean GL_APIENTRY glIsSampler (GLuint sampler);
+GL_APICALL void GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler);
+GL_APICALL void GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
+GL_APICALL void GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);
+GL_APICALL void GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedback (GLuint id);
+GL_APICALL void GL_APIENTRY glPauseTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glResumeTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GL_APICALL void GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+GL_APICALL void GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#endif
+#endif /* GL_ES_VERSION_3_0 */
</ins><span class="cx"> 
</span><del>-/*-------------------------------------------------------------------------
- * Entrypoint definitions
- *-----------------------------------------------------------------------*/
-
-/* OpenGL ES 2.0 */
-
-GL_APICALL void           GL_APIENTRY glActiveTexture (GLenum texture);
-GL_APICALL void           GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
-GL_APICALL void           GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar* name);
-GL_APICALL void           GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
-GL_APICALL void           GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
-GL_APICALL void           GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
-GL_APICALL void           GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
-GL_APICALL void           GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-GL_APICALL void           GL_APIENTRY glBlendEquation (GLenum mode);
-GL_APICALL void           GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
-GL_APICALL void           GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
-GL_APICALL void           GL_APIENTRY glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-GL_APICALL void           GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
-GL_APICALL void           GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
-GL_APICALL GLenum         GL_APIENTRY glCheckFramebufferStatus (GLenum target);
-GL_APICALL void           GL_APIENTRY glClear (GLbitfield mask);
-GL_APICALL void           GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-GL_APICALL void           GL_APIENTRY glClearDepthf (GLfloat depth);
-GL_APICALL void           GL_APIENTRY glClearStencil (GLint s);
-GL_APICALL void           GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
-GL_APICALL void           GL_APIENTRY glCompileShader (GLuint shader);
-GL_APICALL void           GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data);
-GL_APICALL void           GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data);
-GL_APICALL void           GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-GL_APICALL void           GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-GL_APICALL GLuint         GL_APIENTRY glCreateProgram (void);
-GL_APICALL GLuint         GL_APIENTRY glCreateShader (GLenum type);
-GL_APICALL void           GL_APIENTRY glCullFace (GLenum mode);
-GL_APICALL void           GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint* buffers);
-GL_APICALL void           GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers);
-GL_APICALL void           GL_APIENTRY glDeleteProgram (GLuint program);
-GL_APICALL void           GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers);
-GL_APICALL void           GL_APIENTRY glDeleteShader (GLuint shader);
-GL_APICALL void           GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint* textures);
-GL_APICALL void           GL_APIENTRY glDepthFunc (GLenum func);
-GL_APICALL void           GL_APIENTRY glDepthMask (GLboolean flag);
-GL_APICALL void           GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
-GL_APICALL void           GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
-GL_APICALL void           GL_APIENTRY glDisable (GLenum cap);
-GL_APICALL void           GL_APIENTRY glDisableVertexAttribArray (GLuint index);
-GL_APICALL void           GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
-GL_APICALL void           GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
-GL_APICALL void           GL_APIENTRY glEnable (GLenum cap);
-GL_APICALL void           GL_APIENTRY glEnableVertexAttribArray (GLuint index);
-GL_APICALL void           GL_APIENTRY glFinish (void);
-GL_APICALL void           GL_APIENTRY glFlush (void);
-GL_APICALL void           GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-GL_APICALL void           GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-GL_APICALL void           GL_APIENTRY glFrontFace (GLenum mode);
-GL_APICALL void           GL_APIENTRY glGenBuffers (GLsizei n, GLuint* buffers);
-GL_APICALL void           GL_APIENTRY glGenerateMipmap (GLenum target);
-GL_APICALL void           GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint* framebuffers);
-GL_APICALL void           GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint* renderbuffers);
-GL_APICALL void           GL_APIENTRY glGenTextures (GLsizei n, GLuint* textures);
-GL_APICALL void           GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-GL_APICALL void           GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-GL_APICALL void           GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
-GL_APICALL GLint          GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar* name);
-GL_APICALL void           GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean* params);
-GL_APICALL void           GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params);
-GL_APICALL GLenum         GL_APIENTRY glGetError (void);
-GL_APICALL void           GL_APIENTRY glGetFloatv (GLenum pname, GLfloat* params);
-GL_APICALL void           GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetIntegerv (GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
-GL_APICALL void           GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
-GL_APICALL void           GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
-GL_APICALL void           GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
-GL_APICALL const GLubyte* GL_APIENTRY glGetString (GLenum name);
-GL_APICALL void           GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat* params);
-GL_APICALL void           GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat* params);
-GL_APICALL void           GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint* params);
-GL_APICALL GLint          GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar* name);
-GL_APICALL void           GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params);
-GL_APICALL void           GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid** pointer);
-GL_APICALL void           GL_APIENTRY glHint (GLenum target, GLenum mode);
-GL_APICALL GLboolean      GL_APIENTRY glIsBuffer (GLuint buffer);
-GL_APICALL GLboolean      GL_APIENTRY glIsEnabled (GLenum cap);
-GL_APICALL GLboolean      GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
-GL_APICALL GLboolean      GL_APIENTRY glIsProgram (GLuint program);
-GL_APICALL GLboolean      GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
-GL_APICALL GLboolean      GL_APIENTRY glIsShader (GLuint shader);
-GL_APICALL GLboolean      GL_APIENTRY glIsTexture (GLuint texture);
-GL_APICALL void           GL_APIENTRY glLineWidth (GLfloat width);
-GL_APICALL void           GL_APIENTRY glLinkProgram (GLuint program);
-GL_APICALL void           GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
-GL_APICALL void           GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
-GL_APICALL void           GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
-GL_APICALL void           GL_APIENTRY glReleaseShaderCompiler (void);
-GL_APICALL void           GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-GL_APICALL void           GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
-GL_APICALL void           GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
-GL_APICALL void           GL_APIENTRY glShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length);
-GL_APICALL void           GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length);
-GL_APICALL void           GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
-GL_APICALL void           GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
-GL_APICALL void           GL_APIENTRY glStencilMask (GLuint mask);
-GL_APICALL void           GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
-GL_APICALL void           GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
-GL_APICALL void           GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
-GL_APICALL void           GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
-GL_APICALL void           GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
-GL_APICALL void           GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat* params);
-GL_APICALL void           GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
-GL_APICALL void           GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint* params);
-GL_APICALL void           GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels);
-GL_APICALL void           GL_APIENTRY glUniform1f (GLint location, GLfloat x);
-GL_APICALL void           GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat* v);
-GL_APICALL void           GL_APIENTRY glUniform1i (GLint location, GLint x);
-GL_APICALL void           GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint* v);
-GL_APICALL void           GL_APIENTRY glUniform2f (GLint location, GLfloat x, GLfloat y);
-GL_APICALL void           GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat* v);
-GL_APICALL void           GL_APIENTRY glUniform2i (GLint location, GLint x, GLint y);
-GL_APICALL void           GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint* v);
-GL_APICALL void           GL_APIENTRY glUniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z);
-GL_APICALL void           GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat* v);
-GL_APICALL void           GL_APIENTRY glUniform3i (GLint location, GLint x, GLint y, GLint z);
-GL_APICALL void           GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint* v);
-GL_APICALL void           GL_APIENTRY glUniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-GL_APICALL void           GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat* v);
-GL_APICALL void           GL_APIENTRY glUniform4i (GLint location, GLint x, GLint y, GLint z, GLint w);
-GL_APICALL void           GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint* v);
-GL_APICALL void           GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void           GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void           GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void           GL_APIENTRY glUseProgram (GLuint program);
-GL_APICALL void           GL_APIENTRY glValidateProgram (GLuint program);
-GL_APICALL void           GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x);
-GL_APICALL void           GL_APIENTRY glVertexAttrib1fv (GLuint indx, const GLfloat* values);
-GL_APICALL void           GL_APIENTRY glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y);
-GL_APICALL void           GL_APIENTRY glVertexAttrib2fv (GLuint indx, const GLfloat* values);
-GL_APICALL void           GL_APIENTRY glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z);
-GL_APICALL void           GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat* values);
-GL_APICALL void           GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-GL_APICALL void           GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat* values);
-GL_APICALL void           GL_APIENTRY glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);
-GL_APICALL void           GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
-
-/* OpenGL ES 3.0 */
-
-GL_APICALL void           GL_APIENTRY glReadBuffer (GLenum mode);
-GL_APICALL void           GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices);
-GL_APICALL void           GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
-GL_APICALL void           GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);
-GL_APICALL void           GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-GL_APICALL void           GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
-GL_APICALL void           GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);
-GL_APICALL void           GL_APIENTRY glGenQueries (GLsizei n, GLuint* ids);
-GL_APICALL void           GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint* ids);
-GL_APICALL GLboolean      GL_APIENTRY glIsQuery (GLuint id);
-GL_APICALL void           GL_APIENTRY glBeginQuery (GLenum target, GLuint id);
-GL_APICALL void           GL_APIENTRY glEndQuery (GLenum target);
-GL_APICALL void           GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint* params);
-GL_APICALL GLboolean      GL_APIENTRY glUnmapBuffer (GLenum target);
-GL_APICALL void           GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, GLvoid** params);
-GL_APICALL void           GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum* bufs);
-GL_APICALL void           GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void           GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void           GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void           GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void           GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void           GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void           GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-GL_APICALL void           GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-GL_APICALL void           GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
-GL_APICALL GLvoid*        GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
-GL_APICALL void           GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
-GL_APICALL void           GL_APIENTRY glBindVertexArray (GLuint array);
-GL_APICALL void           GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint* arrays);
-GL_APICALL void           GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint* arrays);
-GL_APICALL GLboolean      GL_APIENTRY glIsVertexArray (GLuint array);
-GL_APICALL void           GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint* data);
-GL_APICALL void           GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
-GL_APICALL void           GL_APIENTRY glEndTransformFeedback (void);
-GL_APICALL void           GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
-GL_APICALL void           GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
-GL_APICALL void           GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode);
-GL_APICALL void           GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name);
-GL_APICALL void           GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
-GL_APICALL void           GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint* params);
-GL_APICALL void           GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
-GL_APICALL void           GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
-GL_APICALL void           GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint* v);
-GL_APICALL void           GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint* v);
-GL_APICALL void           GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint* params);
-GL_APICALL GLint          GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
-GL_APICALL void           GL_APIENTRY glUniform1ui (GLint location, GLuint v0);
-GL_APICALL void           GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
-GL_APICALL void           GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
-GL_APICALL void           GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-GL_APICALL void           GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint* value);
-GL_APICALL void           GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint* value);
-GL_APICALL void           GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint* value);
-GL_APICALL void           GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint* value);
-GL_APICALL void           GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint* value);
-GL_APICALL void           GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint* value);
-GL_APICALL void           GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat* value);
-GL_APICALL void           GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
-GL_APICALL const GLubyte* GL_APIENTRY glGetStringi (GLenum name, GLuint index);
-GL_APICALL void           GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
-GL_APICALL void           GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices);
-GL_APICALL void           GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
-GL_APICALL GLuint         GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar* uniformBlockName);
-GL_APICALL void           GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName);
-GL_APICALL void           GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
-GL_APICALL void           GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
-GL_APICALL void           GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount);
-GL_APICALL GLsync         GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
-GL_APICALL GLboolean      GL_APIENTRY glIsSync (GLsync sync);
-GL_APICALL void           GL_APIENTRY glDeleteSync (GLsync sync);
-GL_APICALL GLenum         GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
-GL_APICALL void           GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
-GL_APICALL void           GL_APIENTRY glGetInteger64v (GLenum pname, GLint64* params);
-GL_APICALL void           GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values);
-GL_APICALL void           GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64* data);
-GL_APICALL void           GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64* params);
-GL_APICALL void           GL_APIENTRY glGenSamplers (GLsizei count, GLuint* samplers);
-GL_APICALL void           GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint* samplers);
-GL_APICALL GLboolean      GL_APIENTRY glIsSampler (GLuint sampler);
-GL_APICALL void           GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler);
-GL_APICALL void           GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
-GL_APICALL void           GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint* param);
-GL_APICALL void           GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
-GL_APICALL void           GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat* param);
-GL_APICALL void           GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint* params);
-GL_APICALL void           GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat* params);
-GL_APICALL void           GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
-GL_APICALL void           GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
-GL_APICALL void           GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint* ids);
-GL_APICALL void           GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint* ids);
-GL_APICALL GLboolean      GL_APIENTRY glIsTransformFeedback (GLuint id);
-GL_APICALL void           GL_APIENTRY glPauseTransformFeedback (void);
-GL_APICALL void           GL_APIENTRY glResumeTransformFeedback (void);
-GL_APICALL void           GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary);
-GL_APICALL void           GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length);
-GL_APICALL void           GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
-GL_APICALL void           GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum* attachments);
-GL_APICALL void           GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
-GL_APICALL void           GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-GL_APICALL void           GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-GL_APICALL void           GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params);
-
</del><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> }
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeGLES3gl31h"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/include/GLES3/gl31.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/GLES3/gl31.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/include/GLES3/gl31.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,1524 @@
</span><ins>+#ifndef __gl31_h_
+#define __gl31_h_ 1
+
+#ifdef __cplusplus
+extern &quot;C&quot; {
+#endif
+
+/*
+** Copyright (c) 2013-2015 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** &quot;Materials&quot;), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+**   http://www.opengl.org/registry/
+**
+** Khronos $Revision$ on $Date$
+*/
+
+#include &lt;GLES3/gl3platform.h&gt;
+
+#ifndef GL_APIENTRYP
+#define GL_APIENTRYP GL_APIENTRY*
+#endif
+
+/* Generated on date 20150809 */
+
+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]|3\.[01]
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef GL_ES_VERSION_2_0
+#define GL_ES_VERSION_2_0 1
+#include &lt;KHR/khrplatform.h&gt;
+typedef khronos_int8_t GLbyte;
+typedef khronos_float_t GLclampf;
+typedef khronos_int32_t GLfixed;
+typedef short GLshort;
+typedef unsigned short GLushort;
+typedef void GLvoid;
+typedef struct __GLsync *GLsync;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef unsigned int GLenum;
+typedef unsigned int GLuint;
+typedef char GLchar;
+typedef khronos_float_t GLfloat;
+typedef khronos_ssize_t GLsizeiptr;
+typedef khronos_intptr_t GLintptr;
+typedef unsigned int GLbitfield;
+typedef int GLint;
+typedef unsigned char GLboolean;
+typedef int GLsizei;
+typedef khronos_uint8_t GLubyte;
+#define GL_DEPTH_BUFFER_BIT               0x00000100
+#define GL_STENCIL_BUFFER_BIT             0x00000400
+#define GL_COLOR_BUFFER_BIT               0x00004000
+#define GL_FALSE                          0
+#define GL_TRUE                           1
+#define GL_POINTS                         0x0000
+#define GL_LINES                          0x0001
+#define GL_LINE_LOOP                      0x0002
+#define GL_LINE_STRIP                     0x0003
+#define GL_TRIANGLES                      0x0004
+#define GL_TRIANGLE_STRIP                 0x0005
+#define GL_TRIANGLE_FAN                   0x0006
+#define GL_ZERO                           0
+#define GL_ONE                            1
+#define GL_SRC_COLOR                      0x0300
+#define GL_ONE_MINUS_SRC_COLOR            0x0301
+#define GL_SRC_ALPHA                      0x0302
+#define GL_ONE_MINUS_SRC_ALPHA            0x0303
+#define GL_DST_ALPHA                      0x0304
+#define GL_ONE_MINUS_DST_ALPHA            0x0305
+#define GL_DST_COLOR                      0x0306
+#define GL_ONE_MINUS_DST_COLOR            0x0307
+#define GL_SRC_ALPHA_SATURATE             0x0308
+#define GL_FUNC_ADD                       0x8006
+#define GL_BLEND_EQUATION                 0x8009
+#define GL_BLEND_EQUATION_RGB             0x8009
+#define GL_BLEND_EQUATION_ALPHA           0x883D
+#define GL_FUNC_SUBTRACT                  0x800A
+#define GL_FUNC_REVERSE_SUBTRACT          0x800B
+#define GL_BLEND_DST_RGB                  0x80C8
+#define GL_BLEND_SRC_RGB                  0x80C9
+#define GL_BLEND_DST_ALPHA                0x80CA
+#define GL_BLEND_SRC_ALPHA                0x80CB
+#define GL_CONSTANT_COLOR                 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR       0x8002
+#define GL_CONSTANT_ALPHA                 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA       0x8004
+#define GL_BLEND_COLOR                    0x8005
+#define GL_ARRAY_BUFFER                   0x8892
+#define GL_ELEMENT_ARRAY_BUFFER           0x8893
+#define GL_ARRAY_BUFFER_BINDING           0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895
+#define GL_STREAM_DRAW                    0x88E0
+#define GL_STATIC_DRAW                    0x88E4
+#define GL_DYNAMIC_DRAW                   0x88E8
+#define GL_BUFFER_SIZE                    0x8764
+#define GL_BUFFER_USAGE                   0x8765
+#define GL_CURRENT_VERTEX_ATTRIB          0x8626
+#define GL_FRONT                          0x0404
+#define GL_BACK                           0x0405
+#define GL_FRONT_AND_BACK                 0x0408
+#define GL_TEXTURE_2D                     0x0DE1
+#define GL_CULL_FACE                      0x0B44
+#define GL_BLEND                          0x0BE2
+#define GL_DITHER                         0x0BD0
+#define GL_STENCIL_TEST                   0x0B90
+#define GL_DEPTH_TEST                     0x0B71
+#define GL_SCISSOR_TEST                   0x0C11
+#define GL_POLYGON_OFFSET_FILL            0x8037
+#define GL_SAMPLE_ALPHA_TO_COVERAGE       0x809E
+#define GL_SAMPLE_COVERAGE                0x80A0
+#define GL_NO_ERROR                       0
+#define GL_INVALID_ENUM                   0x0500
+#define GL_INVALID_VALUE                  0x0501
+#define GL_INVALID_OPERATION              0x0502
+#define GL_OUT_OF_MEMORY                  0x0505
+#define GL_CW                             0x0900
+#define GL_CCW                            0x0901
+#define GL_LINE_WIDTH                     0x0B21
+#define GL_ALIASED_POINT_SIZE_RANGE       0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE       0x846E
+#define GL_CULL_FACE_MODE                 0x0B45
+#define GL_FRONT_FACE                     0x0B46
+#define GL_DEPTH_RANGE                    0x0B70
+#define GL_DEPTH_WRITEMASK                0x0B72
+#define GL_DEPTH_CLEAR_VALUE              0x0B73
+#define GL_DEPTH_FUNC                     0x0B74
+#define GL_STENCIL_CLEAR_VALUE            0x0B91
+#define GL_STENCIL_FUNC                   0x0B92
+#define GL_STENCIL_FAIL                   0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL        0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS        0x0B96
+#define GL_STENCIL_REF                    0x0B97
+#define GL_STENCIL_VALUE_MASK             0x0B93
+#define GL_STENCIL_WRITEMASK              0x0B98
+#define GL_STENCIL_BACK_FUNC              0x8800
+#define GL_STENCIL_BACK_FAIL              0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL   0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS   0x8803
+#define GL_STENCIL_BACK_REF               0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK        0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK         0x8CA5
+#define GL_VIEWPORT                       0x0BA2
+#define GL_SCISSOR_BOX                    0x0C10
+#define GL_COLOR_CLEAR_VALUE              0x0C22
+#define GL_COLOR_WRITEMASK                0x0C23
+#define GL_UNPACK_ALIGNMENT               0x0CF5
+#define GL_PACK_ALIGNMENT                 0x0D05
+#define GL_MAX_TEXTURE_SIZE               0x0D33
+#define GL_MAX_VIEWPORT_DIMS              0x0D3A
+#define GL_SUBPIXEL_BITS                  0x0D50
+#define GL_RED_BITS                       0x0D52
+#define GL_GREEN_BITS                     0x0D53
+#define GL_BLUE_BITS                      0x0D54
+#define GL_ALPHA_BITS                     0x0D55
+#define GL_DEPTH_BITS                     0x0D56
+#define GL_STENCIL_BITS                   0x0D57
+#define GL_POLYGON_OFFSET_UNITS           0x2A00
+#define GL_POLYGON_OFFSET_FACTOR          0x8038
+#define GL_TEXTURE_BINDING_2D             0x8069
+#define GL_SAMPLE_BUFFERS                 0x80A8
+#define GL_SAMPLES                        0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE          0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT         0x80AB
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS     0x86A3
+#define GL_DONT_CARE                      0x1100
+#define GL_FASTEST                        0x1101
+#define GL_NICEST                         0x1102
+#define GL_GENERATE_MIPMAP_HINT           0x8192
+#define GL_BYTE                           0x1400
+#define GL_UNSIGNED_BYTE                  0x1401
+#define GL_SHORT                          0x1402
+#define GL_UNSIGNED_SHORT                 0x1403
+#define GL_INT                            0x1404
+#define GL_UNSIGNED_INT                   0x1405
+#define GL_FLOAT                          0x1406
+#define GL_FIXED                          0x140C
+#define GL_DEPTH_COMPONENT                0x1902
+#define GL_ALPHA                          0x1906
+#define GL_RGB                            0x1907
+#define GL_RGBA                           0x1908
+#define GL_LUMINANCE                      0x1909
+#define GL_LUMINANCE_ALPHA                0x190A
+#define GL_UNSIGNED_SHORT_4_4_4_4         0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1         0x8034
+#define GL_UNSIGNED_SHORT_5_6_5           0x8363
+#define GL_FRAGMENT_SHADER                0x8B30
+#define GL_VERTEX_SHADER                  0x8B31
+#define GL_MAX_VERTEX_ATTRIBS             0x8869
+#define GL_MAX_VERTEX_UNIFORM_VECTORS     0x8DFB
+#define GL_MAX_VARYING_VECTORS            0x8DFC
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_TEXTURE_IMAGE_UNITS        0x8872
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS   0x8DFD
+#define GL_SHADER_TYPE                    0x8B4F
+#define GL_DELETE_STATUS                  0x8B80
+#define GL_LINK_STATUS                    0x8B82
+#define GL_VALIDATE_STATUS                0x8B83
+#define GL_ATTACHED_SHADERS               0x8B85
+#define GL_ACTIVE_UNIFORMS                0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH      0x8B87
+#define GL_ACTIVE_ATTRIBUTES              0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH    0x8B8A
+#define GL_SHADING_LANGUAGE_VERSION       0x8B8C
+#define GL_CURRENT_PROGRAM                0x8B8D
+#define GL_NEVER                          0x0200
+#define GL_LESS                           0x0201
+#define GL_EQUAL                          0x0202
+#define GL_LEQUAL                         0x0203
+#define GL_GREATER                        0x0204
+#define GL_NOTEQUAL                       0x0205
+#define GL_GEQUAL                         0x0206
+#define GL_ALWAYS                         0x0207
+#define GL_KEEP                           0x1E00
+#define GL_REPLACE                        0x1E01
+#define GL_INCR                           0x1E02
+#define GL_DECR                           0x1E03
+#define GL_INVERT                         0x150A
+#define GL_INCR_WRAP                      0x8507
+#define GL_DECR_WRAP                      0x8508
+#define GL_VENDOR                         0x1F00
+#define GL_RENDERER                       0x1F01
+#define GL_VERSION                        0x1F02
+#define GL_EXTENSIONS                     0x1F03
+#define GL_NEAREST                        0x2600
+#define GL_LINEAR                         0x2601
+#define GL_NEAREST_MIPMAP_NEAREST         0x2700
+#define GL_LINEAR_MIPMAP_NEAREST          0x2701
+#define GL_NEAREST_MIPMAP_LINEAR          0x2702
+#define GL_LINEAR_MIPMAP_LINEAR           0x2703
+#define GL_TEXTURE_MAG_FILTER             0x2800
+#define GL_TEXTURE_MIN_FILTER             0x2801
+#define GL_TEXTURE_WRAP_S                 0x2802
+#define GL_TEXTURE_WRAP_T                 0x2803
+#define GL_TEXTURE                        0x1702
+#define GL_TEXTURE_CUBE_MAP               0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP       0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X    0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X    0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y    0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y    0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z    0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z    0x851A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE      0x851C
+#define GL_TEXTURE0                       0x84C0
+#define GL_TEXTURE1                       0x84C1
+#define GL_TEXTURE2                       0x84C2
+#define GL_TEXTURE3                       0x84C3
+#define GL_TEXTURE4                       0x84C4
+#define GL_TEXTURE5                       0x84C5
+#define GL_TEXTURE6                       0x84C6
+#define GL_TEXTURE7                       0x84C7
+#define GL_TEXTURE8                       0x84C8
+#define GL_TEXTURE9                       0x84C9
+#define GL_TEXTURE10                      0x84CA
+#define GL_TEXTURE11                      0x84CB
+#define GL_TEXTURE12                      0x84CC
+#define GL_TEXTURE13                      0x84CD
+#define GL_TEXTURE14                      0x84CE
+#define GL_TEXTURE15                      0x84CF
+#define GL_TEXTURE16                      0x84D0
+#define GL_TEXTURE17                      0x84D1
+#define GL_TEXTURE18                      0x84D2
+#define GL_TEXTURE19                      0x84D3
+#define GL_TEXTURE20                      0x84D4
+#define GL_TEXTURE21                      0x84D5
+#define GL_TEXTURE22                      0x84D6
+#define GL_TEXTURE23                      0x84D7
+#define GL_TEXTURE24                      0x84D8
+#define GL_TEXTURE25                      0x84D9
+#define GL_TEXTURE26                      0x84DA
+#define GL_TEXTURE27                      0x84DB
+#define GL_TEXTURE28                      0x84DC
+#define GL_TEXTURE29                      0x84DD
+#define GL_TEXTURE30                      0x84DE
+#define GL_TEXTURE31                      0x84DF
+#define GL_ACTIVE_TEXTURE                 0x84E0
+#define GL_REPEAT                         0x2901
+#define GL_CLAMP_TO_EDGE                  0x812F
+#define GL_MIRRORED_REPEAT                0x8370
+#define GL_FLOAT_VEC2                     0x8B50
+#define GL_FLOAT_VEC3                     0x8B51
+#define GL_FLOAT_VEC4                     0x8B52
+#define GL_INT_VEC2                       0x8B53
+#define GL_INT_VEC3                       0x8B54
+#define GL_INT_VEC4                       0x8B55
+#define GL_BOOL                           0x8B56
+#define GL_BOOL_VEC2                      0x8B57
+#define GL_BOOL_VEC3                      0x8B58
+#define GL_BOOL_VEC4                      0x8B59
+#define GL_FLOAT_MAT2                     0x8B5A
+#define GL_FLOAT_MAT3                     0x8B5B
+#define GL_FLOAT_MAT4                     0x8B5C
+#define GL_SAMPLER_2D                     0x8B5E
+#define GL_SAMPLER_CUBE                   0x8B60
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED    0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE       0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE     0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE       0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER    0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_COMPILE_STATUS                 0x8B81
+#define GL_INFO_LOG_LENGTH                0x8B84
+#define GL_SHADER_SOURCE_LENGTH           0x8B88
+#define GL_SHADER_COMPILER                0x8DFA
+#define GL_SHADER_BINARY_FORMATS          0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS      0x8DF9
+#define GL_LOW_FLOAT                      0x8DF0
+#define GL_MEDIUM_FLOAT                   0x8DF1
+#define GL_HIGH_FLOAT                     0x8DF2
+#define GL_LOW_INT                        0x8DF3
+#define GL_MEDIUM_INT                     0x8DF4
+#define GL_HIGH_INT                       0x8DF5
+#define GL_FRAMEBUFFER                    0x8D40
+#define GL_RENDERBUFFER                   0x8D41
+#define GL_RGBA4                          0x8056
+#define GL_RGB5_A1                        0x8057
+#define GL_RGB565                         0x8D62
+#define GL_DEPTH_COMPONENT16              0x81A5
+#define GL_STENCIL_INDEX8                 0x8D48
+#define GL_RENDERBUFFER_WIDTH             0x8D42
+#define GL_RENDERBUFFER_HEIGHT            0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT   0x8D44
+#define GL_RENDERBUFFER_RED_SIZE          0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE        0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE         0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE        0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE        0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE      0x8D55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_COLOR_ATTACHMENT0              0x8CE0
+#define GL_DEPTH_ATTACHMENT               0x8D00
+#define GL_STENCIL_ATTACHMENT             0x8D20
+#define GL_NONE                           0
+#define GL_FRAMEBUFFER_COMPLETE           0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_UNSUPPORTED        0x8CDD
+#define GL_FRAMEBUFFER_BINDING            0x8CA6
+#define GL_RENDERBUFFER_BINDING           0x8CA7
+#define GL_MAX_RENDERBUFFER_SIZE          0x84E8
+#define GL_INVALID_FRAMEBUFFER_OPERATION  0x0506
+typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
+typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);
+typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);
+typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode);
+typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader);
+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture);
+typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width);
+typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units);
+typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);
+typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
+GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d);
+GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
+GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
+GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFinish (void);
+GL_APICALL void GL_APIENTRY glFlush (void);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL GLenum GL_APIENTRY glGetError (void);
+GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name);
+GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_ES_VERSION_2_0 */
+
+#ifndef GL_ES_VERSION_3_0
+#define GL_ES_VERSION_3_0 1
+typedef unsigned short GLhalf;
+#define GL_READ_BUFFER                    0x0C02
+#define GL_UNPACK_ROW_LENGTH              0x0CF2
+#define GL_UNPACK_SKIP_ROWS               0x0CF3
+#define GL_UNPACK_SKIP_PIXELS             0x0CF4
+#define GL_PACK_ROW_LENGTH                0x0D02
+#define GL_PACK_SKIP_ROWS                 0x0D03
+#define GL_PACK_SKIP_PIXELS               0x0D04
+#define GL_COLOR                          0x1800
+#define GL_DEPTH                          0x1801
+#define GL_STENCIL                        0x1802
+#define GL_RED                            0x1903
+#define GL_RGB8                           0x8051
+#define GL_RGBA8                          0x8058
+#define GL_RGB10_A2                       0x8059
+#define GL_TEXTURE_BINDING_3D             0x806A
+#define GL_UNPACK_SKIP_IMAGES             0x806D
+#define GL_UNPACK_IMAGE_HEIGHT            0x806E
+#define GL_TEXTURE_3D                     0x806F
+#define GL_TEXTURE_WRAP_R                 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE            0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV    0x8368
+#define GL_MAX_ELEMENTS_VERTICES          0x80E8
+#define GL_MAX_ELEMENTS_INDICES           0x80E9
+#define GL_TEXTURE_MIN_LOD                0x813A
+#define GL_TEXTURE_MAX_LOD                0x813B
+#define GL_TEXTURE_BASE_LEVEL             0x813C
+#define GL_TEXTURE_MAX_LEVEL              0x813D
+#define GL_MIN                            0x8007
+#define GL_MAX                            0x8008
+#define GL_DEPTH_COMPONENT24              0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS           0x84FD
+#define GL_TEXTURE_COMPARE_MODE           0x884C
+#define GL_TEXTURE_COMPARE_FUNC           0x884D
+#define GL_CURRENT_QUERY                  0x8865
+#define GL_QUERY_RESULT                   0x8866
+#define GL_QUERY_RESULT_AVAILABLE         0x8867
+#define GL_BUFFER_MAPPED                  0x88BC
+#define GL_BUFFER_MAP_POINTER             0x88BD
+#define GL_STREAM_READ                    0x88E1
+#define GL_STREAM_COPY                    0x88E2
+#define GL_STATIC_READ                    0x88E5
+#define GL_STATIC_COPY                    0x88E6
+#define GL_DYNAMIC_READ                   0x88E9
+#define GL_DYNAMIC_COPY                   0x88EA
+#define GL_MAX_DRAW_BUFFERS               0x8824
+#define GL_DRAW_BUFFER0                   0x8825
+#define GL_DRAW_BUFFER1                   0x8826
+#define GL_DRAW_BUFFER2                   0x8827
+#define GL_DRAW_BUFFER3                   0x8828
+#define GL_DRAW_BUFFER4                   0x8829
+#define GL_DRAW_BUFFER5                   0x882A
+#define GL_DRAW_BUFFER6                   0x882B
+#define GL_DRAW_BUFFER7                   0x882C
+#define GL_DRAW_BUFFER8                   0x882D
+#define GL_DRAW_BUFFER9                   0x882E
+#define GL_DRAW_BUFFER10                  0x882F
+#define GL_DRAW_BUFFER11                  0x8830
+#define GL_DRAW_BUFFER12                  0x8831
+#define GL_DRAW_BUFFER13                  0x8832
+#define GL_DRAW_BUFFER14                  0x8833
+#define GL_DRAW_BUFFER15                  0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS  0x8B4A
+#define GL_SAMPLER_3D                     0x8B5F
+#define GL_SAMPLER_2D_SHADOW              0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_PIXEL_PACK_BUFFER              0x88EB
+#define GL_PIXEL_UNPACK_BUFFER            0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING      0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING    0x88EF
+#define GL_FLOAT_MAT2x3                   0x8B65
+#define GL_FLOAT_MAT2x4                   0x8B66
+#define GL_FLOAT_MAT3x2                   0x8B67
+#define GL_FLOAT_MAT3x4                   0x8B68
+#define GL_FLOAT_MAT4x2                   0x8B69
+#define GL_FLOAT_MAT4x3                   0x8B6A
+#define GL_SRGB                           0x8C40
+#define GL_SRGB8                          0x8C41
+#define GL_SRGB8_ALPHA8                   0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE         0x884E
+#define GL_MAJOR_VERSION                  0x821B
+#define GL_MINOR_VERSION                  0x821C
+#define GL_NUM_EXTENSIONS                 0x821D
+#define GL_RGBA32F                        0x8814
+#define GL_RGB32F                         0x8815
+#define GL_RGBA16F                        0x881A
+#define GL_RGB16F                         0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER    0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS       0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET       0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET       0x8905
+#define GL_MAX_VARYING_COMPONENTS         0x8B4B
+#define GL_TEXTURE_2D_ARRAY               0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY       0x8C1D
+#define GL_R11F_G11F_B10F                 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV   0x8C3B
+#define GL_RGB9_E5                        0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV       0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS    0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD             0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS            0x8C8C
+#define GL_SEPARATE_ATTRIBS               0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER      0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI                       0x8D70
+#define GL_RGB32UI                        0x8D71
+#define GL_RGBA16UI                       0x8D76
+#define GL_RGB16UI                        0x8D77
+#define GL_RGBA8UI                        0x8D7C
+#define GL_RGB8UI                         0x8D7D
+#define GL_RGBA32I                        0x8D82
+#define GL_RGB32I                         0x8D83
+#define GL_RGBA16I                        0x8D88
+#define GL_RGB16I                         0x8D89
+#define GL_RGBA8I                         0x8D8E
+#define GL_RGB8I                          0x8D8F
+#define GL_RED_INTEGER                    0x8D94
+#define GL_RGB_INTEGER                    0x8D98
+#define GL_RGBA_INTEGER                   0x8D99
+#define GL_SAMPLER_2D_ARRAY               0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW        0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW            0x8DC5
+#define GL_UNSIGNED_INT_VEC2              0x8DC6
+#define GL_UNSIGNED_INT_VEC3              0x8DC7
+#define GL_UNSIGNED_INT_VEC4              0x8DC8
+#define GL_INT_SAMPLER_2D                 0x8DCA
+#define GL_INT_SAMPLER_3D                 0x8DCB
+#define GL_INT_SAMPLER_CUBE               0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY           0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D        0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D        0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE      0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY  0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS            0x911F
+#define GL_BUFFER_MAP_LENGTH              0x9120
+#define GL_BUFFER_MAP_OFFSET              0x9121
+#define GL_DEPTH_COMPONENT32F             0x8CAC
+#define GL_DEPTH32F_STENCIL8              0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT            0x8218
+#define GL_FRAMEBUFFER_UNDEFINED          0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT       0x821A
+#define GL_DEPTH_STENCIL                  0x84F9
+#define GL_UNSIGNED_INT_24_8              0x84FA
+#define GL_DEPTH24_STENCIL8               0x88F0
+#define GL_UNSIGNED_NORMALIZED            0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING       0x8CA6
+#define GL_READ_FRAMEBUFFER               0x8CA8
+#define GL_DRAW_FRAMEBUFFER               0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING       0x8CAA
+#define GL_RENDERBUFFER_SAMPLES           0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS          0x8CDF
+#define GL_COLOR_ATTACHMENT1              0x8CE1
+#define GL_COLOR_ATTACHMENT2              0x8CE2
+#define GL_COLOR_ATTACHMENT3              0x8CE3
+#define GL_COLOR_ATTACHMENT4              0x8CE4
+#define GL_COLOR_ATTACHMENT5              0x8CE5
+#define GL_COLOR_ATTACHMENT6              0x8CE6
+#define GL_COLOR_ATTACHMENT7              0x8CE7
+#define GL_COLOR_ATTACHMENT8              0x8CE8
+#define GL_COLOR_ATTACHMENT9              0x8CE9
+#define GL_COLOR_ATTACHMENT10             0x8CEA
+#define GL_COLOR_ATTACHMENT11             0x8CEB
+#define GL_COLOR_ATTACHMENT12             0x8CEC
+#define GL_COLOR_ATTACHMENT13             0x8CED
+#define GL_COLOR_ATTACHMENT14             0x8CEE
+#define GL_COLOR_ATTACHMENT15             0x8CEF
+#define GL_COLOR_ATTACHMENT16             0x8CF0
+#define GL_COLOR_ATTACHMENT17             0x8CF1
+#define GL_COLOR_ATTACHMENT18             0x8CF2
+#define GL_COLOR_ATTACHMENT19             0x8CF3
+#define GL_COLOR_ATTACHMENT20             0x8CF4
+#define GL_COLOR_ATTACHMENT21             0x8CF5
+#define GL_COLOR_ATTACHMENT22             0x8CF6
+#define GL_COLOR_ATTACHMENT23             0x8CF7
+#define GL_COLOR_ATTACHMENT24             0x8CF8
+#define GL_COLOR_ATTACHMENT25             0x8CF9
+#define GL_COLOR_ATTACHMENT26             0x8CFA
+#define GL_COLOR_ATTACHMENT27             0x8CFB
+#define GL_COLOR_ATTACHMENT28             0x8CFC
+#define GL_COLOR_ATTACHMENT29             0x8CFD
+#define GL_COLOR_ATTACHMENT30             0x8CFE
+#define GL_COLOR_ATTACHMENT31             0x8CFF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES                    0x8D57
+#define GL_HALF_FLOAT                     0x140B
+#define GL_MAP_READ_BIT                   0x0001
+#define GL_MAP_WRITE_BIT                  0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT       0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT      0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT         0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT         0x0020
+#define GL_RG                             0x8227
+#define GL_RG_INTEGER                     0x8228
+#define GL_R8                             0x8229
+#define GL_RG8                            0x822B
+#define GL_R16F                           0x822D
+#define GL_R32F                           0x822E
+#define GL_RG16F                          0x822F
+#define GL_RG32F                          0x8230
+#define GL_R8I                            0x8231
+#define GL_R8UI                           0x8232
+#define GL_R16I                           0x8233
+#define GL_R16UI                          0x8234
+#define GL_R32I                           0x8235
+#define GL_R32UI                          0x8236
+#define GL_RG8I                           0x8237
+#define GL_RG8UI                          0x8238
+#define GL_RG16I                          0x8239
+#define GL_RG16UI                         0x823A
+#define GL_RG32I                          0x823B
+#define GL_RG32UI                         0x823C
+#define GL_VERTEX_ARRAY_BINDING           0x85B5
+#define GL_R8_SNORM                       0x8F94
+#define GL_RG8_SNORM                      0x8F95
+#define GL_RGB8_SNORM                     0x8F96
+#define GL_RGBA8_SNORM                    0x8F97
+#define GL_SIGNED_NORMALIZED              0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX  0x8D69
+#define GL_COPY_READ_BUFFER               0x8F36
+#define GL_COPY_WRITE_BUFFER              0x8F37
+#define GL_COPY_READ_BUFFER_BINDING       0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING      0x8F37
+#define GL_UNIFORM_BUFFER                 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING         0x8A28
+#define GL_UNIFORM_BUFFER_START           0x8A29
+#define GL_UNIFORM_BUFFER_SIZE            0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS      0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS    0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS    0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS    0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE         0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS          0x8A36
+#define GL_UNIFORM_TYPE                   0x8A37
+#define GL_UNIFORM_SIZE                   0x8A38
+#define GL_UNIFORM_NAME_LENGTH            0x8A39
+#define GL_UNIFORM_BLOCK_INDEX            0x8A3A
+#define GL_UNIFORM_OFFSET                 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE           0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE          0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR           0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING          0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE        0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH      0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS  0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX                  0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS   0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS  0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT        0x9111
+#define GL_OBJECT_TYPE                    0x9112
+#define GL_SYNC_CONDITION                 0x9113
+#define GL_SYNC_STATUS                    0x9114
+#define GL_SYNC_FLAGS                     0x9115
+#define GL_SYNC_FENCE                     0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE     0x9117
+#define GL_UNSIGNALED                     0x9118
+#define GL_SIGNALED                       0x9119
+#define GL_ALREADY_SIGNALED               0x911A
+#define GL_TIMEOUT_EXPIRED                0x911B
+#define GL_CONDITION_SATISFIED            0x911C
+#define GL_WAIT_FAILED                    0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT        0x00000001
+#define GL_TIMEOUT_IGNORED                0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR    0x88FE
+#define GL_ANY_SAMPLES_PASSED             0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_SAMPLER_BINDING                0x8919
+#define GL_RGB10_A2UI                     0x906F
+#define GL_TEXTURE_SWIZZLE_R              0x8E42
+#define GL_TEXTURE_SWIZZLE_G              0x8E43
+#define GL_TEXTURE_SWIZZLE_B              0x8E44
+#define GL_TEXTURE_SWIZZLE_A              0x8E45
+#define GL_GREEN                          0x1904
+#define GL_BLUE                           0x1905
+#define GL_INT_2_10_10_10_REV             0x8D9F
+#define GL_TRANSFORM_FEEDBACK             0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED      0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE      0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING     0x8E25
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH          0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS     0x87FE
+#define GL_PROGRAM_BINARY_FORMATS         0x87FF
+#define GL_COMPRESSED_R11_EAC             0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC      0x9271
+#define GL_COMPRESSED_RG11_EAC            0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC     0x9273
+#define GL_COMPRESSED_RGB8_ETC2           0x9274
+#define GL_COMPRESSED_SRGB8_ETC2          0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC      0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT       0x912F
+#define GL_MAX_ELEMENT_INDEX              0x8D6B
+#define GL_NUM_SAMPLE_COUNTS              0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS       0x82DF
+typedef void (GL_APIENTRYP PFNGLREADBUFFERPROC) (GLenum src);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLENDQUERYPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params);
+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params);
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
+typedef void (GL_APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);
+typedef void (GL_APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+typedef void (GL_APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
+typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+typedef GLuint (GL_APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCPROC) (GLsync sync);
+typedef void (GL_APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);
+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers);
+typedef void (GL_APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers);
+typedef GLboolean (GL_APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
+typedef void (GL_APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src);
+GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQuery (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQuery (GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target);
+GL_APICALL void GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params);
+GL_APICALL void GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GL_APICALL void *GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
+GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);
+GL_APICALL void GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
+GL_APICALL void GL_APIENTRY glEndTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+GL_APICALL void GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);
+GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);
+GL_APICALL void GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);
+GL_APICALL GLint GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUniform1ui (GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);
+GL_APICALL void GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+GL_APICALL const GLubyte *GL_APIENTRY glGetStringi (GLenum name, GLuint index);
+GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+GL_APICALL void GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+GL_APICALL void GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GL_APICALL GLboolean GL_APIENTRY glIsSync (GLsync sync);
+GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync);
+GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glGetInteger64v (GLenum pname, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GL_APICALL void GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);
+GL_APICALL void GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);
+GL_APICALL GLboolean GL_APIENTRY glIsSampler (GLuint sampler);
+GL_APICALL void GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler);
+GL_APICALL void GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
+GL_APICALL void GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);
+GL_APICALL void GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedback (GLuint id);
+GL_APICALL void GL_APIENTRY glPauseTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glResumeTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GL_APICALL void GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+GL_APICALL void GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#endif
+#endif /* GL_ES_VERSION_3_0 */
+
+#ifndef GL_ES_VERSION_3_1
+#define GL_ES_VERSION_3_1 1
+#define GL_COMPUTE_SHADER                 0x91B9
+#define GL_MAX_COMPUTE_UNIFORM_BLOCKS     0x91BB
+#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC
+#define GL_MAX_COMPUTE_IMAGE_UNIFORMS     0x91BD
+#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262
+#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263
+#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264
+#define GL_MAX_COMPUTE_ATOMIC_COUNTERS    0x8265
+#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266
+#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB
+#define GL_MAX_COMPUTE_WORK_GROUP_COUNT   0x91BE
+#define GL_MAX_COMPUTE_WORK_GROUP_SIZE    0x91BF
+#define GL_COMPUTE_WORK_GROUP_SIZE        0x8267
+#define GL_DISPATCH_INDIRECT_BUFFER       0x90EE
+#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF
+#define GL_COMPUTE_SHADER_BIT             0x00000020
+#define GL_DRAW_INDIRECT_BUFFER           0x8F3F
+#define GL_DRAW_INDIRECT_BUFFER_BINDING   0x8F43
+#define GL_MAX_UNIFORM_LOCATIONS          0x826E
+#define GL_FRAMEBUFFER_DEFAULT_WIDTH      0x9310
+#define GL_FRAMEBUFFER_DEFAULT_HEIGHT     0x9311
+#define GL_FRAMEBUFFER_DEFAULT_SAMPLES    0x9313
+#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314
+#define GL_MAX_FRAMEBUFFER_WIDTH          0x9315
+#define GL_MAX_FRAMEBUFFER_HEIGHT         0x9316
+#define GL_MAX_FRAMEBUFFER_SAMPLES        0x9318
+#define GL_UNIFORM                        0x92E1
+#define GL_UNIFORM_BLOCK                  0x92E2
+#define GL_PROGRAM_INPUT                  0x92E3
+#define GL_PROGRAM_OUTPUT                 0x92E4
+#define GL_BUFFER_VARIABLE                0x92E5
+#define GL_SHADER_STORAGE_BLOCK           0x92E6
+#define GL_ATOMIC_COUNTER_BUFFER          0x92C0
+#define GL_TRANSFORM_FEEDBACK_VARYING     0x92F4
+#define GL_ACTIVE_RESOURCES               0x92F5
+#define GL_MAX_NAME_LENGTH                0x92F6
+#define GL_MAX_NUM_ACTIVE_VARIABLES       0x92F7
+#define GL_NAME_LENGTH                    0x92F9
+#define GL_TYPE                           0x92FA
+#define GL_ARRAY_SIZE                     0x92FB
+#define GL_OFFSET                         0x92FC
+#define GL_BLOCK_INDEX                    0x92FD
+#define GL_ARRAY_STRIDE                   0x92FE
+#define GL_MATRIX_STRIDE                  0x92FF
+#define GL_IS_ROW_MAJOR                   0x9300
+#define GL_ATOMIC_COUNTER_BUFFER_INDEX    0x9301
+#define GL_BUFFER_BINDING                 0x9302
+#define GL_BUFFER_DATA_SIZE               0x9303
+#define GL_NUM_ACTIVE_VARIABLES           0x9304
+#define GL_ACTIVE_VARIABLES               0x9305
+#define GL_REFERENCED_BY_VERTEX_SHADER    0x9306
+#define GL_REFERENCED_BY_FRAGMENT_SHADER  0x930A
+#define GL_REFERENCED_BY_COMPUTE_SHADER   0x930B
+#define GL_TOP_LEVEL_ARRAY_SIZE           0x930C
+#define GL_TOP_LEVEL_ARRAY_STRIDE         0x930D
+#define GL_LOCATION                       0x930E
+#define GL_VERTEX_SHADER_BIT              0x00000001
+#define GL_FRAGMENT_SHADER_BIT            0x00000002
+#define GL_ALL_SHADER_BITS                0xFFFFFFFF
+#define GL_PROGRAM_SEPARABLE              0x8258
+#define GL_ACTIVE_PROGRAM                 0x8259
+#define GL_PROGRAM_PIPELINE_BINDING       0x825A
+#define GL_ATOMIC_COUNTER_BUFFER_BINDING  0x92C1
+#define GL_ATOMIC_COUNTER_BUFFER_START    0x92C2
+#define GL_ATOMIC_COUNTER_BUFFER_SIZE     0x92C3
+#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0
+#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1
+#define GL_MAX_VERTEX_ATOMIC_COUNTERS     0x92D2
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS   0x92D6
+#define GL_MAX_COMBINED_ATOMIC_COUNTERS   0x92D7
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC
+#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS  0x92D9
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER    0x92DB
+#define GL_MAX_IMAGE_UNITS                0x8F38
+#define GL_MAX_VERTEX_IMAGE_UNIFORMS      0x90CA
+#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS    0x90CE
+#define GL_MAX_COMBINED_IMAGE_UNIFORMS    0x90CF
+#define GL_IMAGE_BINDING_NAME             0x8F3A
+#define GL_IMAGE_BINDING_LEVEL            0x8F3B
+#define GL_IMAGE_BINDING_LAYERED          0x8F3C
+#define GL_IMAGE_BINDING_LAYER            0x8F3D
+#define GL_IMAGE_BINDING_ACCESS           0x8F3E
+#define GL_IMAGE_BINDING_FORMAT           0x906E
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT      0x00000002
+#define GL_UNIFORM_BARRIER_BIT            0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT      0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
+#define GL_COMMAND_BARRIER_BIT            0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT       0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT     0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT      0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT        0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT     0x00001000
+#define GL_ALL_BARRIER_BITS               0xFFFFFFFF
+#define GL_IMAGE_2D                       0x904D
+#define GL_IMAGE_3D                       0x904E
+#define GL_IMAGE_CUBE                     0x9050
+#define GL_IMAGE_2D_ARRAY                 0x9053
+#define GL_INT_IMAGE_2D                   0x9058
+#define GL_INT_IMAGE_3D                   0x9059
+#define GL_INT_IMAGE_CUBE                 0x905B
+#define GL_INT_IMAGE_2D_ARRAY             0x905E
+#define GL_UNSIGNED_INT_IMAGE_2D          0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D          0x9064
+#define GL_UNSIGNED_INT_IMAGE_CUBE        0x9066
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY    0x9069
+#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9
+#define GL_READ_ONLY                      0x88B8
+#define GL_WRITE_ONLY                     0x88B9
+#define GL_READ_WRITE                     0x88BA
+#define GL_SHADER_STORAGE_BUFFER          0x90D2
+#define GL_SHADER_STORAGE_BUFFER_BINDING  0x90D3
+#define GL_SHADER_STORAGE_BUFFER_START    0x90D4
+#define GL_SHADER_STORAGE_BUFFER_SIZE     0x90D5
+#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6
+#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA
+#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB
+#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC
+#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD
+#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE  0x90DE
+#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF
+#define GL_SHADER_STORAGE_BARRIER_BIT     0x00002000
+#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39
+#define GL_DEPTH_STENCIL_TEXTURE_MODE     0x90EA
+#define GL_STENCIL_INDEX                  0x1901
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_SAMPLE_POSITION                0x8E50
+#define GL_SAMPLE_MASK                    0x8E51
+#define GL_SAMPLE_MASK_VALUE              0x8E52
+#define GL_TEXTURE_2D_MULTISAMPLE         0x9100
+#define GL_MAX_SAMPLE_MASK_WORDS          0x8E59
+#define GL_MAX_COLOR_TEXTURE_SAMPLES      0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES      0x910F
+#define GL_MAX_INTEGER_SAMPLES            0x9110
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_SAMPLES                0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_TEXTURE_WIDTH                  0x1000
+#define GL_TEXTURE_HEIGHT                 0x1001
+#define GL_TEXTURE_DEPTH                  0x8071
+#define GL_TEXTURE_INTERNAL_FORMAT        0x1003
+#define GL_TEXTURE_RED_SIZE               0x805C
+#define GL_TEXTURE_GREEN_SIZE             0x805D
+#define GL_TEXTURE_BLUE_SIZE              0x805E
+#define GL_TEXTURE_ALPHA_SIZE             0x805F
+#define GL_TEXTURE_DEPTH_SIZE             0x884A
+#define GL_TEXTURE_STENCIL_SIZE           0x88F1
+#define GL_TEXTURE_SHARED_SIZE            0x8C3F
+#define GL_TEXTURE_RED_TYPE               0x8C10
+#define GL_TEXTURE_GREEN_TYPE             0x8C11
+#define GL_TEXTURE_BLUE_TYPE              0x8C12
+#define GL_TEXTURE_ALPHA_TYPE             0x8C13
+#define GL_TEXTURE_DEPTH_TYPE             0x8C16
+#define GL_TEXTURE_COMPRESSED             0x86A1
+#define GL_SAMPLER_2D_MULTISAMPLE         0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE     0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_VERTEX_ATTRIB_BINDING          0x82D4
+#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET  0x82D5
+#define GL_VERTEX_BINDING_DIVISOR         0x82D6
+#define GL_VERTEX_BINDING_OFFSET          0x82D7
+#define GL_VERTEX_BINDING_STRIDE          0x82D8
+#define GL_VERTEX_BINDING_BUFFER          0x8F4F
+#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9
+#define GL_MAX_VERTEX_ATTRIB_BINDINGS     0x82DA
+#define GL_MAX_VERTEX_ATTRIB_STRIDE       0x82E5
+typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+typedef GLuint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings);
+typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines);
+typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers);
+typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val);
+typedef void (GL_APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex);
+typedef void (GL_APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+GL_APICALL void GL_APIENTRY glDispatchComputeIndirect (GLintptr indirect);
+GL_APICALL void GL_APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect);
+GL_APICALL void GL_APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect);
+GL_APICALL void GL_APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program);
+GL_APICALL void GL_APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program);
+GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings);
+GL_APICALL void GL_APIENTRY glBindProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines);
+GL_APICALL void GL_APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines);
+GL_APICALL GLboolean GL_APIENTRY glIsProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glValidateProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+GL_APICALL void GL_APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data);
+GL_APICALL void GL_APIENTRY glMemoryBarrier (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glMemoryBarrierByRegion (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GL_APICALL void GL_APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val);
+GL_APICALL void GL_APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask);
+GL_APICALL void GL_APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+GL_APICALL void GL_APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+GL_APICALL void GL_APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GL_APICALL void GL_APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex);
+GL_APICALL void GL_APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor);
+#endif
+#endif /* GL_ES_VERSION_3_1 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeGLES3gl32h"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/include/GLES3/gl32.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/GLES3/gl32.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/include/GLES3/gl32.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,1825 @@
</span><ins>+#ifndef __gl32_h_
+#define __gl32_h_ 1
+
+#ifdef __cplusplus
+extern &quot;C&quot; {
+#endif
+
+/*
+** Copyright (c) 2013-2015 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** &quot;Materials&quot;), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+**   http://www.opengl.org/registry/
+**
+** Khronos $Revision$ on $Date$
+*/
+
+#include &lt;GLES3/gl3platform.h&gt;
+
+#ifndef GL_APIENTRYP
+#define GL_APIENTRYP GL_APIENTRY*
+#endif
+
+/* Generated on date 20150809 */
+
+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]|3\.[012]
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef GL_ES_VERSION_2_0
+#define GL_ES_VERSION_2_0 1
+#include &lt;KHR/khrplatform.h&gt;
+typedef khronos_int8_t GLbyte;
+typedef khronos_float_t GLclampf;
+typedef khronos_int32_t GLfixed;
+typedef short GLshort;
+typedef unsigned short GLushort;
+typedef void GLvoid;
+typedef struct __GLsync *GLsync;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef unsigned int GLenum;
+typedef unsigned int GLuint;
+typedef char GLchar;
+typedef khronos_float_t GLfloat;
+typedef khronos_ssize_t GLsizeiptr;
+typedef khronos_intptr_t GLintptr;
+typedef unsigned int GLbitfield;
+typedef int GLint;
+typedef unsigned char GLboolean;
+typedef int GLsizei;
+typedef khronos_uint8_t GLubyte;
+#define GL_DEPTH_BUFFER_BIT               0x00000100
+#define GL_STENCIL_BUFFER_BIT             0x00000400
+#define GL_COLOR_BUFFER_BIT               0x00004000
+#define GL_FALSE                          0
+#define GL_TRUE                           1
+#define GL_POINTS                         0x0000
+#define GL_LINES                          0x0001
+#define GL_LINE_LOOP                      0x0002
+#define GL_LINE_STRIP                     0x0003
+#define GL_TRIANGLES                      0x0004
+#define GL_TRIANGLE_STRIP                 0x0005
+#define GL_TRIANGLE_FAN                   0x0006
+#define GL_ZERO                           0
+#define GL_ONE                            1
+#define GL_SRC_COLOR                      0x0300
+#define GL_ONE_MINUS_SRC_COLOR            0x0301
+#define GL_SRC_ALPHA                      0x0302
+#define GL_ONE_MINUS_SRC_ALPHA            0x0303
+#define GL_DST_ALPHA                      0x0304
+#define GL_ONE_MINUS_DST_ALPHA            0x0305
+#define GL_DST_COLOR                      0x0306
+#define GL_ONE_MINUS_DST_COLOR            0x0307
+#define GL_SRC_ALPHA_SATURATE             0x0308
+#define GL_FUNC_ADD                       0x8006
+#define GL_BLEND_EQUATION                 0x8009
+#define GL_BLEND_EQUATION_RGB             0x8009
+#define GL_BLEND_EQUATION_ALPHA           0x883D
+#define GL_FUNC_SUBTRACT                  0x800A
+#define GL_FUNC_REVERSE_SUBTRACT          0x800B
+#define GL_BLEND_DST_RGB                  0x80C8
+#define GL_BLEND_SRC_RGB                  0x80C9
+#define GL_BLEND_DST_ALPHA                0x80CA
+#define GL_BLEND_SRC_ALPHA                0x80CB
+#define GL_CONSTANT_COLOR                 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR       0x8002
+#define GL_CONSTANT_ALPHA                 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA       0x8004
+#define GL_BLEND_COLOR                    0x8005
+#define GL_ARRAY_BUFFER                   0x8892
+#define GL_ELEMENT_ARRAY_BUFFER           0x8893
+#define GL_ARRAY_BUFFER_BINDING           0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895
+#define GL_STREAM_DRAW                    0x88E0
+#define GL_STATIC_DRAW                    0x88E4
+#define GL_DYNAMIC_DRAW                   0x88E8
+#define GL_BUFFER_SIZE                    0x8764
+#define GL_BUFFER_USAGE                   0x8765
+#define GL_CURRENT_VERTEX_ATTRIB          0x8626
+#define GL_FRONT                          0x0404
+#define GL_BACK                           0x0405
+#define GL_FRONT_AND_BACK                 0x0408
+#define GL_TEXTURE_2D                     0x0DE1
+#define GL_CULL_FACE                      0x0B44
+#define GL_BLEND                          0x0BE2
+#define GL_DITHER                         0x0BD0
+#define GL_STENCIL_TEST                   0x0B90
+#define GL_DEPTH_TEST                     0x0B71
+#define GL_SCISSOR_TEST                   0x0C11
+#define GL_POLYGON_OFFSET_FILL            0x8037
+#define GL_SAMPLE_ALPHA_TO_COVERAGE       0x809E
+#define GL_SAMPLE_COVERAGE                0x80A0
+#define GL_NO_ERROR                       0
+#define GL_INVALID_ENUM                   0x0500
+#define GL_INVALID_VALUE                  0x0501
+#define GL_INVALID_OPERATION              0x0502
+#define GL_OUT_OF_MEMORY                  0x0505
+#define GL_CW                             0x0900
+#define GL_CCW                            0x0901
+#define GL_LINE_WIDTH                     0x0B21
+#define GL_ALIASED_POINT_SIZE_RANGE       0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE       0x846E
+#define GL_CULL_FACE_MODE                 0x0B45
+#define GL_FRONT_FACE                     0x0B46
+#define GL_DEPTH_RANGE                    0x0B70
+#define GL_DEPTH_WRITEMASK                0x0B72
+#define GL_DEPTH_CLEAR_VALUE              0x0B73
+#define GL_DEPTH_FUNC                     0x0B74
+#define GL_STENCIL_CLEAR_VALUE            0x0B91
+#define GL_STENCIL_FUNC                   0x0B92
+#define GL_STENCIL_FAIL                   0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL        0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS        0x0B96
+#define GL_STENCIL_REF                    0x0B97
+#define GL_STENCIL_VALUE_MASK             0x0B93
+#define GL_STENCIL_WRITEMASK              0x0B98
+#define GL_STENCIL_BACK_FUNC              0x8800
+#define GL_STENCIL_BACK_FAIL              0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL   0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS   0x8803
+#define GL_STENCIL_BACK_REF               0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK        0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK         0x8CA5
+#define GL_VIEWPORT                       0x0BA2
+#define GL_SCISSOR_BOX                    0x0C10
+#define GL_COLOR_CLEAR_VALUE              0x0C22
+#define GL_COLOR_WRITEMASK                0x0C23
+#define GL_UNPACK_ALIGNMENT               0x0CF5
+#define GL_PACK_ALIGNMENT                 0x0D05
+#define GL_MAX_TEXTURE_SIZE               0x0D33
+#define GL_MAX_VIEWPORT_DIMS              0x0D3A
+#define GL_SUBPIXEL_BITS                  0x0D50
+#define GL_RED_BITS                       0x0D52
+#define GL_GREEN_BITS                     0x0D53
+#define GL_BLUE_BITS                      0x0D54
+#define GL_ALPHA_BITS                     0x0D55
+#define GL_DEPTH_BITS                     0x0D56
+#define GL_STENCIL_BITS                   0x0D57
+#define GL_POLYGON_OFFSET_UNITS           0x2A00
+#define GL_POLYGON_OFFSET_FACTOR          0x8038
+#define GL_TEXTURE_BINDING_2D             0x8069
+#define GL_SAMPLE_BUFFERS                 0x80A8
+#define GL_SAMPLES                        0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE          0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT         0x80AB
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS     0x86A3
+#define GL_DONT_CARE                      0x1100
+#define GL_FASTEST                        0x1101
+#define GL_NICEST                         0x1102
+#define GL_GENERATE_MIPMAP_HINT           0x8192
+#define GL_BYTE                           0x1400
+#define GL_UNSIGNED_BYTE                  0x1401
+#define GL_SHORT                          0x1402
+#define GL_UNSIGNED_SHORT                 0x1403
+#define GL_INT                            0x1404
+#define GL_UNSIGNED_INT                   0x1405
+#define GL_FLOAT                          0x1406
+#define GL_FIXED                          0x140C
+#define GL_DEPTH_COMPONENT                0x1902
+#define GL_ALPHA                          0x1906
+#define GL_RGB                            0x1907
+#define GL_RGBA                           0x1908
+#define GL_LUMINANCE                      0x1909
+#define GL_LUMINANCE_ALPHA                0x190A
+#define GL_UNSIGNED_SHORT_4_4_4_4         0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1         0x8034
+#define GL_UNSIGNED_SHORT_5_6_5           0x8363
+#define GL_FRAGMENT_SHADER                0x8B30
+#define GL_VERTEX_SHADER                  0x8B31
+#define GL_MAX_VERTEX_ATTRIBS             0x8869
+#define GL_MAX_VERTEX_UNIFORM_VECTORS     0x8DFB
+#define GL_MAX_VARYING_VECTORS            0x8DFC
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_TEXTURE_IMAGE_UNITS        0x8872
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS   0x8DFD
+#define GL_SHADER_TYPE                    0x8B4F
+#define GL_DELETE_STATUS                  0x8B80
+#define GL_LINK_STATUS                    0x8B82
+#define GL_VALIDATE_STATUS                0x8B83
+#define GL_ATTACHED_SHADERS               0x8B85
+#define GL_ACTIVE_UNIFORMS                0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH      0x8B87
+#define GL_ACTIVE_ATTRIBUTES              0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH    0x8B8A
+#define GL_SHADING_LANGUAGE_VERSION       0x8B8C
+#define GL_CURRENT_PROGRAM                0x8B8D
+#define GL_NEVER                          0x0200
+#define GL_LESS                           0x0201
+#define GL_EQUAL                          0x0202
+#define GL_LEQUAL                         0x0203
+#define GL_GREATER                        0x0204
+#define GL_NOTEQUAL                       0x0205
+#define GL_GEQUAL                         0x0206
+#define GL_ALWAYS                         0x0207
+#define GL_KEEP                           0x1E00
+#define GL_REPLACE                        0x1E01
+#define GL_INCR                           0x1E02
+#define GL_DECR                           0x1E03
+#define GL_INVERT                         0x150A
+#define GL_INCR_WRAP                      0x8507
+#define GL_DECR_WRAP                      0x8508
+#define GL_VENDOR                         0x1F00
+#define GL_RENDERER                       0x1F01
+#define GL_VERSION                        0x1F02
+#define GL_EXTENSIONS                     0x1F03
+#define GL_NEAREST                        0x2600
+#define GL_LINEAR                         0x2601
+#define GL_NEAREST_MIPMAP_NEAREST         0x2700
+#define GL_LINEAR_MIPMAP_NEAREST          0x2701
+#define GL_NEAREST_MIPMAP_LINEAR          0x2702
+#define GL_LINEAR_MIPMAP_LINEAR           0x2703
+#define GL_TEXTURE_MAG_FILTER             0x2800
+#define GL_TEXTURE_MIN_FILTER             0x2801
+#define GL_TEXTURE_WRAP_S                 0x2802
+#define GL_TEXTURE_WRAP_T                 0x2803
+#define GL_TEXTURE                        0x1702
+#define GL_TEXTURE_CUBE_MAP               0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP       0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X    0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X    0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y    0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y    0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z    0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z    0x851A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE      0x851C
+#define GL_TEXTURE0                       0x84C0
+#define GL_TEXTURE1                       0x84C1
+#define GL_TEXTURE2                       0x84C2
+#define GL_TEXTURE3                       0x84C3
+#define GL_TEXTURE4                       0x84C4
+#define GL_TEXTURE5                       0x84C5
+#define GL_TEXTURE6                       0x84C6
+#define GL_TEXTURE7                       0x84C7
+#define GL_TEXTURE8                       0x84C8
+#define GL_TEXTURE9                       0x84C9
+#define GL_TEXTURE10                      0x84CA
+#define GL_TEXTURE11                      0x84CB
+#define GL_TEXTURE12                      0x84CC
+#define GL_TEXTURE13                      0x84CD
+#define GL_TEXTURE14                      0x84CE
+#define GL_TEXTURE15                      0x84CF
+#define GL_TEXTURE16                      0x84D0
+#define GL_TEXTURE17                      0x84D1
+#define GL_TEXTURE18                      0x84D2
+#define GL_TEXTURE19                      0x84D3
+#define GL_TEXTURE20                      0x84D4
+#define GL_TEXTURE21                      0x84D5
+#define GL_TEXTURE22                      0x84D6
+#define GL_TEXTURE23                      0x84D7
+#define GL_TEXTURE24                      0x84D8
+#define GL_TEXTURE25                      0x84D9
+#define GL_TEXTURE26                      0x84DA
+#define GL_TEXTURE27                      0x84DB
+#define GL_TEXTURE28                      0x84DC
+#define GL_TEXTURE29                      0x84DD
+#define GL_TEXTURE30                      0x84DE
+#define GL_TEXTURE31                      0x84DF
+#define GL_ACTIVE_TEXTURE                 0x84E0
+#define GL_REPEAT                         0x2901
+#define GL_CLAMP_TO_EDGE                  0x812F
+#define GL_MIRRORED_REPEAT                0x8370
+#define GL_FLOAT_VEC2                     0x8B50
+#define GL_FLOAT_VEC3                     0x8B51
+#define GL_FLOAT_VEC4                     0x8B52
+#define GL_INT_VEC2                       0x8B53
+#define GL_INT_VEC3                       0x8B54
+#define GL_INT_VEC4                       0x8B55
+#define GL_BOOL                           0x8B56
+#define GL_BOOL_VEC2                      0x8B57
+#define GL_BOOL_VEC3                      0x8B58
+#define GL_BOOL_VEC4                      0x8B59
+#define GL_FLOAT_MAT2                     0x8B5A
+#define GL_FLOAT_MAT3                     0x8B5B
+#define GL_FLOAT_MAT4                     0x8B5C
+#define GL_SAMPLER_2D                     0x8B5E
+#define GL_SAMPLER_CUBE                   0x8B60
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED    0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE       0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE     0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE       0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER    0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_COMPILE_STATUS                 0x8B81
+#define GL_INFO_LOG_LENGTH                0x8B84
+#define GL_SHADER_SOURCE_LENGTH           0x8B88
+#define GL_SHADER_COMPILER                0x8DFA
+#define GL_SHADER_BINARY_FORMATS          0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS      0x8DF9
+#define GL_LOW_FLOAT                      0x8DF0
+#define GL_MEDIUM_FLOAT                   0x8DF1
+#define GL_HIGH_FLOAT                     0x8DF2
+#define GL_LOW_INT                        0x8DF3
+#define GL_MEDIUM_INT                     0x8DF4
+#define GL_HIGH_INT                       0x8DF5
+#define GL_FRAMEBUFFER                    0x8D40
+#define GL_RENDERBUFFER                   0x8D41
+#define GL_RGBA4                          0x8056
+#define GL_RGB5_A1                        0x8057
+#define GL_RGB565                         0x8D62
+#define GL_DEPTH_COMPONENT16              0x81A5
+#define GL_STENCIL_INDEX8                 0x8D48
+#define GL_RENDERBUFFER_WIDTH             0x8D42
+#define GL_RENDERBUFFER_HEIGHT            0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT   0x8D44
+#define GL_RENDERBUFFER_RED_SIZE          0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE        0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE         0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE        0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE        0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE      0x8D55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_COLOR_ATTACHMENT0              0x8CE0
+#define GL_DEPTH_ATTACHMENT               0x8D00
+#define GL_STENCIL_ATTACHMENT             0x8D20
+#define GL_NONE                           0
+#define GL_FRAMEBUFFER_COMPLETE           0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_UNSUPPORTED        0x8CDD
+#define GL_FRAMEBUFFER_BINDING            0x8CA6
+#define GL_RENDERBUFFER_BINDING           0x8CA7
+#define GL_MAX_RENDERBUFFER_SIZE          0x84E8
+#define GL_INVALID_FRAMEBUFFER_OPERATION  0x0506
+typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
+typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);
+typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);
+typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode);
+typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader);
+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture);
+typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width);
+typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units);
+typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);
+typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
+GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d);
+GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
+GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
+GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFinish (void);
+GL_APICALL void GL_APIENTRY glFlush (void);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL GLenum GL_APIENTRY glGetError (void);
+GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name);
+GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_ES_VERSION_2_0 */
+
+#ifndef GL_ES_VERSION_3_0
+#define GL_ES_VERSION_3_0 1
+typedef unsigned short GLhalf;
+#define GL_READ_BUFFER                    0x0C02
+#define GL_UNPACK_ROW_LENGTH              0x0CF2
+#define GL_UNPACK_SKIP_ROWS               0x0CF3
+#define GL_UNPACK_SKIP_PIXELS             0x0CF4
+#define GL_PACK_ROW_LENGTH                0x0D02
+#define GL_PACK_SKIP_ROWS                 0x0D03
+#define GL_PACK_SKIP_PIXELS               0x0D04
+#define GL_COLOR                          0x1800
+#define GL_DEPTH                          0x1801
+#define GL_STENCIL                        0x1802
+#define GL_RED                            0x1903
+#define GL_RGB8                           0x8051
+#define GL_RGBA8                          0x8058
+#define GL_RGB10_A2                       0x8059
+#define GL_TEXTURE_BINDING_3D             0x806A
+#define GL_UNPACK_SKIP_IMAGES             0x806D
+#define GL_UNPACK_IMAGE_HEIGHT            0x806E
+#define GL_TEXTURE_3D                     0x806F
+#define GL_TEXTURE_WRAP_R                 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE            0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV    0x8368
+#define GL_MAX_ELEMENTS_VERTICES          0x80E8
+#define GL_MAX_ELEMENTS_INDICES           0x80E9
+#define GL_TEXTURE_MIN_LOD                0x813A
+#define GL_TEXTURE_MAX_LOD                0x813B
+#define GL_TEXTURE_BASE_LEVEL             0x813C
+#define GL_TEXTURE_MAX_LEVEL              0x813D
+#define GL_MIN                            0x8007
+#define GL_MAX                            0x8008
+#define GL_DEPTH_COMPONENT24              0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS           0x84FD
+#define GL_TEXTURE_COMPARE_MODE           0x884C
+#define GL_TEXTURE_COMPARE_FUNC           0x884D
+#define GL_CURRENT_QUERY                  0x8865
+#define GL_QUERY_RESULT                   0x8866
+#define GL_QUERY_RESULT_AVAILABLE         0x8867
+#define GL_BUFFER_MAPPED                  0x88BC
+#define GL_BUFFER_MAP_POINTER             0x88BD
+#define GL_STREAM_READ                    0x88E1
+#define GL_STREAM_COPY                    0x88E2
+#define GL_STATIC_READ                    0x88E5
+#define GL_STATIC_COPY                    0x88E6
+#define GL_DYNAMIC_READ                   0x88E9
+#define GL_DYNAMIC_COPY                   0x88EA
+#define GL_MAX_DRAW_BUFFERS               0x8824
+#define GL_DRAW_BUFFER0                   0x8825
+#define GL_DRAW_BUFFER1                   0x8826
+#define GL_DRAW_BUFFER2                   0x8827
+#define GL_DRAW_BUFFER3                   0x8828
+#define GL_DRAW_BUFFER4                   0x8829
+#define GL_DRAW_BUFFER5                   0x882A
+#define GL_DRAW_BUFFER6                   0x882B
+#define GL_DRAW_BUFFER7                   0x882C
+#define GL_DRAW_BUFFER8                   0x882D
+#define GL_DRAW_BUFFER9                   0x882E
+#define GL_DRAW_BUFFER10                  0x882F
+#define GL_DRAW_BUFFER11                  0x8830
+#define GL_DRAW_BUFFER12                  0x8831
+#define GL_DRAW_BUFFER13                  0x8832
+#define GL_DRAW_BUFFER14                  0x8833
+#define GL_DRAW_BUFFER15                  0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS  0x8B4A
+#define GL_SAMPLER_3D                     0x8B5F
+#define GL_SAMPLER_2D_SHADOW              0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_PIXEL_PACK_BUFFER              0x88EB
+#define GL_PIXEL_UNPACK_BUFFER            0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING      0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING    0x88EF
+#define GL_FLOAT_MAT2x3                   0x8B65
+#define GL_FLOAT_MAT2x4                   0x8B66
+#define GL_FLOAT_MAT3x2                   0x8B67
+#define GL_FLOAT_MAT3x4                   0x8B68
+#define GL_FLOAT_MAT4x2                   0x8B69
+#define GL_FLOAT_MAT4x3                   0x8B6A
+#define GL_SRGB                           0x8C40
+#define GL_SRGB8                          0x8C41
+#define GL_SRGB8_ALPHA8                   0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE         0x884E
+#define GL_MAJOR_VERSION                  0x821B
+#define GL_MINOR_VERSION                  0x821C
+#define GL_NUM_EXTENSIONS                 0x821D
+#define GL_RGBA32F                        0x8814
+#define GL_RGB32F                         0x8815
+#define GL_RGBA16F                        0x881A
+#define GL_RGB16F                         0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER    0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS       0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET       0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET       0x8905
+#define GL_MAX_VARYING_COMPONENTS         0x8B4B
+#define GL_TEXTURE_2D_ARRAY               0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY       0x8C1D
+#define GL_R11F_G11F_B10F                 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV   0x8C3B
+#define GL_RGB9_E5                        0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV       0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS    0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD             0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS            0x8C8C
+#define GL_SEPARATE_ATTRIBS               0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER      0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI                       0x8D70
+#define GL_RGB32UI                        0x8D71
+#define GL_RGBA16UI                       0x8D76
+#define GL_RGB16UI                        0x8D77
+#define GL_RGBA8UI                        0x8D7C
+#define GL_RGB8UI                         0x8D7D
+#define GL_RGBA32I                        0x8D82
+#define GL_RGB32I                         0x8D83
+#define GL_RGBA16I                        0x8D88
+#define GL_RGB16I                         0x8D89
+#define GL_RGBA8I                         0x8D8E
+#define GL_RGB8I                          0x8D8F
+#define GL_RED_INTEGER                    0x8D94
+#define GL_RGB_INTEGER                    0x8D98
+#define GL_RGBA_INTEGER                   0x8D99
+#define GL_SAMPLER_2D_ARRAY               0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW        0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW            0x8DC5
+#define GL_UNSIGNED_INT_VEC2              0x8DC6
+#define GL_UNSIGNED_INT_VEC3              0x8DC7
+#define GL_UNSIGNED_INT_VEC4              0x8DC8
+#define GL_INT_SAMPLER_2D                 0x8DCA
+#define GL_INT_SAMPLER_3D                 0x8DCB
+#define GL_INT_SAMPLER_CUBE               0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY           0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D        0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D        0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE      0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY  0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS            0x911F
+#define GL_BUFFER_MAP_LENGTH              0x9120
+#define GL_BUFFER_MAP_OFFSET              0x9121
+#define GL_DEPTH_COMPONENT32F             0x8CAC
+#define GL_DEPTH32F_STENCIL8              0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT            0x8218
+#define GL_FRAMEBUFFER_UNDEFINED          0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT       0x821A
+#define GL_DEPTH_STENCIL                  0x84F9
+#define GL_UNSIGNED_INT_24_8              0x84FA
+#define GL_DEPTH24_STENCIL8               0x88F0
+#define GL_UNSIGNED_NORMALIZED            0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING       0x8CA6
+#define GL_READ_FRAMEBUFFER               0x8CA8
+#define GL_DRAW_FRAMEBUFFER               0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING       0x8CAA
+#define GL_RENDERBUFFER_SAMPLES           0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS          0x8CDF
+#define GL_COLOR_ATTACHMENT1              0x8CE1
+#define GL_COLOR_ATTACHMENT2              0x8CE2
+#define GL_COLOR_ATTACHMENT3              0x8CE3
+#define GL_COLOR_ATTACHMENT4              0x8CE4
+#define GL_COLOR_ATTACHMENT5              0x8CE5
+#define GL_COLOR_ATTACHMENT6              0x8CE6
+#define GL_COLOR_ATTACHMENT7              0x8CE7
+#define GL_COLOR_ATTACHMENT8              0x8CE8
+#define GL_COLOR_ATTACHMENT9              0x8CE9
+#define GL_COLOR_ATTACHMENT10             0x8CEA
+#define GL_COLOR_ATTACHMENT11             0x8CEB
+#define GL_COLOR_ATTACHMENT12             0x8CEC
+#define GL_COLOR_ATTACHMENT13             0x8CED
+#define GL_COLOR_ATTACHMENT14             0x8CEE
+#define GL_COLOR_ATTACHMENT15             0x8CEF
+#define GL_COLOR_ATTACHMENT16             0x8CF0
+#define GL_COLOR_ATTACHMENT17             0x8CF1
+#define GL_COLOR_ATTACHMENT18             0x8CF2
+#define GL_COLOR_ATTACHMENT19             0x8CF3
+#define GL_COLOR_ATTACHMENT20             0x8CF4
+#define GL_COLOR_ATTACHMENT21             0x8CF5
+#define GL_COLOR_ATTACHMENT22             0x8CF6
+#define GL_COLOR_ATTACHMENT23             0x8CF7
+#define GL_COLOR_ATTACHMENT24             0x8CF8
+#define GL_COLOR_ATTACHMENT25             0x8CF9
+#define GL_COLOR_ATTACHMENT26             0x8CFA
+#define GL_COLOR_ATTACHMENT27             0x8CFB
+#define GL_COLOR_ATTACHMENT28             0x8CFC
+#define GL_COLOR_ATTACHMENT29             0x8CFD
+#define GL_COLOR_ATTACHMENT30             0x8CFE
+#define GL_COLOR_ATTACHMENT31             0x8CFF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES                    0x8D57
+#define GL_HALF_FLOAT                     0x140B
+#define GL_MAP_READ_BIT                   0x0001
+#define GL_MAP_WRITE_BIT                  0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT       0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT      0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT         0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT         0x0020
+#define GL_RG                             0x8227
+#define GL_RG_INTEGER                     0x8228
+#define GL_R8                             0x8229
+#define GL_RG8                            0x822B
+#define GL_R16F                           0x822D
+#define GL_R32F                           0x822E
+#define GL_RG16F                          0x822F
+#define GL_RG32F                          0x8230
+#define GL_R8I                            0x8231
+#define GL_R8UI                           0x8232
+#define GL_R16I                           0x8233
+#define GL_R16UI                          0x8234
+#define GL_R32I                           0x8235
+#define GL_R32UI                          0x8236
+#define GL_RG8I                           0x8237
+#define GL_RG8UI                          0x8238
+#define GL_RG16I                          0x8239
+#define GL_RG16UI                         0x823A
+#define GL_RG32I                          0x823B
+#define GL_RG32UI                         0x823C
+#define GL_VERTEX_ARRAY_BINDING           0x85B5
+#define GL_R8_SNORM                       0x8F94
+#define GL_RG8_SNORM                      0x8F95
+#define GL_RGB8_SNORM                     0x8F96
+#define GL_RGBA8_SNORM                    0x8F97
+#define GL_SIGNED_NORMALIZED              0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX  0x8D69
+#define GL_COPY_READ_BUFFER               0x8F36
+#define GL_COPY_WRITE_BUFFER              0x8F37
+#define GL_COPY_READ_BUFFER_BINDING       0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING      0x8F37
+#define GL_UNIFORM_BUFFER                 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING         0x8A28
+#define GL_UNIFORM_BUFFER_START           0x8A29
+#define GL_UNIFORM_BUFFER_SIZE            0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS      0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS    0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS    0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS    0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE         0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS          0x8A36
+#define GL_UNIFORM_TYPE                   0x8A37
+#define GL_UNIFORM_SIZE                   0x8A38
+#define GL_UNIFORM_NAME_LENGTH            0x8A39
+#define GL_UNIFORM_BLOCK_INDEX            0x8A3A
+#define GL_UNIFORM_OFFSET                 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE           0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE          0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR           0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING          0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE        0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH      0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS  0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX                  0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS   0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS  0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT        0x9111
+#define GL_OBJECT_TYPE                    0x9112
+#define GL_SYNC_CONDITION                 0x9113
+#define GL_SYNC_STATUS                    0x9114
+#define GL_SYNC_FLAGS                     0x9115
+#define GL_SYNC_FENCE                     0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE     0x9117
+#define GL_UNSIGNALED                     0x9118
+#define GL_SIGNALED                       0x9119
+#define GL_ALREADY_SIGNALED               0x911A
+#define GL_TIMEOUT_EXPIRED                0x911B
+#define GL_CONDITION_SATISFIED            0x911C
+#define GL_WAIT_FAILED                    0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT        0x00000001
+#define GL_TIMEOUT_IGNORED                0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR    0x88FE
+#define GL_ANY_SAMPLES_PASSED             0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_SAMPLER_BINDING                0x8919
+#define GL_RGB10_A2UI                     0x906F
+#define GL_TEXTURE_SWIZZLE_R              0x8E42
+#define GL_TEXTURE_SWIZZLE_G              0x8E43
+#define GL_TEXTURE_SWIZZLE_B              0x8E44
+#define GL_TEXTURE_SWIZZLE_A              0x8E45
+#define GL_GREEN                          0x1904
+#define GL_BLUE                           0x1905
+#define GL_INT_2_10_10_10_REV             0x8D9F
+#define GL_TRANSFORM_FEEDBACK             0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED      0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE      0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING     0x8E25
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH          0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS     0x87FE
+#define GL_PROGRAM_BINARY_FORMATS         0x87FF
+#define GL_COMPRESSED_R11_EAC             0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC      0x9271
+#define GL_COMPRESSED_RG11_EAC            0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC     0x9273
+#define GL_COMPRESSED_RGB8_ETC2           0x9274
+#define GL_COMPRESSED_SRGB8_ETC2          0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC      0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT       0x912F
+#define GL_MAX_ELEMENT_INDEX              0x8D6B
+#define GL_NUM_SAMPLE_COUNTS              0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS       0x82DF
+typedef void (GL_APIENTRYP PFNGLREADBUFFERPROC) (GLenum src);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLENDQUERYPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params);
+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params);
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
+typedef void (GL_APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);
+typedef void (GL_APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+typedef void (GL_APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
+typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+typedef GLuint (GL_APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCPROC) (GLsync sync);
+typedef void (GL_APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);
+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers);
+typedef void (GL_APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers);
+typedef GLboolean (GL_APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
+typedef void (GL_APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src);
+GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQuery (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQuery (GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target);
+GL_APICALL void GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params);
+GL_APICALL void GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GL_APICALL void *GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
+GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);
+GL_APICALL void GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
+GL_APICALL void GL_APIENTRY glEndTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+GL_APICALL void GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);
+GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);
+GL_APICALL void GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);
+GL_APICALL GLint GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUniform1ui (GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);
+GL_APICALL void GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+GL_APICALL const GLubyte *GL_APIENTRY glGetStringi (GLenum name, GLuint index);
+GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+GL_APICALL void GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+GL_APICALL void GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GL_APICALL GLboolean GL_APIENTRY glIsSync (GLsync sync);
+GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync);
+GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glGetInteger64v (GLenum pname, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GL_APICALL void GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);
+GL_APICALL void GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);
+GL_APICALL GLboolean GL_APIENTRY glIsSampler (GLuint sampler);
+GL_APICALL void GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler);
+GL_APICALL void GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
+GL_APICALL void GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);
+GL_APICALL void GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedback (GLuint id);
+GL_APICALL void GL_APIENTRY glPauseTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glResumeTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GL_APICALL void GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+GL_APICALL void GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#endif
+#endif /* GL_ES_VERSION_3_0 */
+
+#ifndef GL_ES_VERSION_3_1
+#define GL_ES_VERSION_3_1 1
+#define GL_COMPUTE_SHADER                 0x91B9
+#define GL_MAX_COMPUTE_UNIFORM_BLOCKS     0x91BB
+#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC
+#define GL_MAX_COMPUTE_IMAGE_UNIFORMS     0x91BD
+#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262
+#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263
+#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264
+#define GL_MAX_COMPUTE_ATOMIC_COUNTERS    0x8265
+#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266
+#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB
+#define GL_MAX_COMPUTE_WORK_GROUP_COUNT   0x91BE
+#define GL_MAX_COMPUTE_WORK_GROUP_SIZE    0x91BF
+#define GL_COMPUTE_WORK_GROUP_SIZE        0x8267
+#define GL_DISPATCH_INDIRECT_BUFFER       0x90EE
+#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF
+#define GL_COMPUTE_SHADER_BIT             0x00000020
+#define GL_DRAW_INDIRECT_BUFFER           0x8F3F
+#define GL_DRAW_INDIRECT_BUFFER_BINDING   0x8F43
+#define GL_MAX_UNIFORM_LOCATIONS          0x826E
+#define GL_FRAMEBUFFER_DEFAULT_WIDTH      0x9310
+#define GL_FRAMEBUFFER_DEFAULT_HEIGHT     0x9311
+#define GL_FRAMEBUFFER_DEFAULT_SAMPLES    0x9313
+#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314
+#define GL_MAX_FRAMEBUFFER_WIDTH          0x9315
+#define GL_MAX_FRAMEBUFFER_HEIGHT         0x9316
+#define GL_MAX_FRAMEBUFFER_SAMPLES        0x9318
+#define GL_UNIFORM                        0x92E1
+#define GL_UNIFORM_BLOCK                  0x92E2
+#define GL_PROGRAM_INPUT                  0x92E3
+#define GL_PROGRAM_OUTPUT                 0x92E4
+#define GL_BUFFER_VARIABLE                0x92E5
+#define GL_SHADER_STORAGE_BLOCK           0x92E6
+#define GL_ATOMIC_COUNTER_BUFFER          0x92C0
+#define GL_TRANSFORM_FEEDBACK_VARYING     0x92F4
+#define GL_ACTIVE_RESOURCES               0x92F5
+#define GL_MAX_NAME_LENGTH                0x92F6
+#define GL_MAX_NUM_ACTIVE_VARIABLES       0x92F7
+#define GL_NAME_LENGTH                    0x92F9
+#define GL_TYPE                           0x92FA
+#define GL_ARRAY_SIZE                     0x92FB
+#define GL_OFFSET                         0x92FC
+#define GL_BLOCK_INDEX                    0x92FD
+#define GL_ARRAY_STRIDE                   0x92FE
+#define GL_MATRIX_STRIDE                  0x92FF
+#define GL_IS_ROW_MAJOR                   0x9300
+#define GL_ATOMIC_COUNTER_BUFFER_INDEX    0x9301
+#define GL_BUFFER_BINDING                 0x9302
+#define GL_BUFFER_DATA_SIZE               0x9303
+#define GL_NUM_ACTIVE_VARIABLES           0x9304
+#define GL_ACTIVE_VARIABLES               0x9305
+#define GL_REFERENCED_BY_VERTEX_SHADER    0x9306
+#define GL_REFERENCED_BY_FRAGMENT_SHADER  0x930A
+#define GL_REFERENCED_BY_COMPUTE_SHADER   0x930B
+#define GL_TOP_LEVEL_ARRAY_SIZE           0x930C
+#define GL_TOP_LEVEL_ARRAY_STRIDE         0x930D
+#define GL_LOCATION                       0x930E
+#define GL_VERTEX_SHADER_BIT              0x00000001
+#define GL_FRAGMENT_SHADER_BIT            0x00000002
+#define GL_ALL_SHADER_BITS                0xFFFFFFFF
+#define GL_PROGRAM_SEPARABLE              0x8258
+#define GL_ACTIVE_PROGRAM                 0x8259
+#define GL_PROGRAM_PIPELINE_BINDING       0x825A
+#define GL_ATOMIC_COUNTER_BUFFER_BINDING  0x92C1
+#define GL_ATOMIC_COUNTER_BUFFER_START    0x92C2
+#define GL_ATOMIC_COUNTER_BUFFER_SIZE     0x92C3
+#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0
+#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1
+#define GL_MAX_VERTEX_ATOMIC_COUNTERS     0x92D2
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS   0x92D6
+#define GL_MAX_COMBINED_ATOMIC_COUNTERS   0x92D7
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC
+#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS  0x92D9
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER    0x92DB
+#define GL_MAX_IMAGE_UNITS                0x8F38
+#define GL_MAX_VERTEX_IMAGE_UNIFORMS      0x90CA
+#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS    0x90CE
+#define GL_MAX_COMBINED_IMAGE_UNIFORMS    0x90CF
+#define GL_IMAGE_BINDING_NAME             0x8F3A
+#define GL_IMAGE_BINDING_LEVEL            0x8F3B
+#define GL_IMAGE_BINDING_LAYERED          0x8F3C
+#define GL_IMAGE_BINDING_LAYER            0x8F3D
+#define GL_IMAGE_BINDING_ACCESS           0x8F3E
+#define GL_IMAGE_BINDING_FORMAT           0x906E
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT      0x00000002
+#define GL_UNIFORM_BARRIER_BIT            0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT      0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
+#define GL_COMMAND_BARRIER_BIT            0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT       0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT     0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT      0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT        0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT     0x00001000
+#define GL_ALL_BARRIER_BITS               0xFFFFFFFF
+#define GL_IMAGE_2D                       0x904D
+#define GL_IMAGE_3D                       0x904E
+#define GL_IMAGE_CUBE                     0x9050
+#define GL_IMAGE_2D_ARRAY                 0x9053
+#define GL_INT_IMAGE_2D                   0x9058
+#define GL_INT_IMAGE_3D                   0x9059
+#define GL_INT_IMAGE_CUBE                 0x905B
+#define GL_INT_IMAGE_2D_ARRAY             0x905E
+#define GL_UNSIGNED_INT_IMAGE_2D          0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D          0x9064
+#define GL_UNSIGNED_INT_IMAGE_CUBE        0x9066
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY    0x9069
+#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9
+#define GL_READ_ONLY                      0x88B8
+#define GL_WRITE_ONLY                     0x88B9
+#define GL_READ_WRITE                     0x88BA
+#define GL_SHADER_STORAGE_BUFFER          0x90D2
+#define GL_SHADER_STORAGE_BUFFER_BINDING  0x90D3
+#define GL_SHADER_STORAGE_BUFFER_START    0x90D4
+#define GL_SHADER_STORAGE_BUFFER_SIZE     0x90D5
+#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6
+#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA
+#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB
+#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC
+#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD
+#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE  0x90DE
+#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF
+#define GL_SHADER_STORAGE_BARRIER_BIT     0x00002000
+#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39
+#define GL_DEPTH_STENCIL_TEXTURE_MODE     0x90EA
+#define GL_STENCIL_INDEX                  0x1901
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_SAMPLE_POSITION                0x8E50
+#define GL_SAMPLE_MASK                    0x8E51
+#define GL_SAMPLE_MASK_VALUE              0x8E52
+#define GL_TEXTURE_2D_MULTISAMPLE         0x9100
+#define GL_MAX_SAMPLE_MASK_WORDS          0x8E59
+#define GL_MAX_COLOR_TEXTURE_SAMPLES      0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES      0x910F
+#define GL_MAX_INTEGER_SAMPLES            0x9110
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_SAMPLES                0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_TEXTURE_WIDTH                  0x1000
+#define GL_TEXTURE_HEIGHT                 0x1001
+#define GL_TEXTURE_DEPTH                  0x8071
+#define GL_TEXTURE_INTERNAL_FORMAT        0x1003
+#define GL_TEXTURE_RED_SIZE               0x805C
+#define GL_TEXTURE_GREEN_SIZE             0x805D
+#define GL_TEXTURE_BLUE_SIZE              0x805E
+#define GL_TEXTURE_ALPHA_SIZE             0x805F
+#define GL_TEXTURE_DEPTH_SIZE             0x884A
+#define GL_TEXTURE_STENCIL_SIZE           0x88F1
+#define GL_TEXTURE_SHARED_SIZE            0x8C3F
+#define GL_TEXTURE_RED_TYPE               0x8C10
+#define GL_TEXTURE_GREEN_TYPE             0x8C11
+#define GL_TEXTURE_BLUE_TYPE              0x8C12
+#define GL_TEXTURE_ALPHA_TYPE             0x8C13
+#define GL_TEXTURE_DEPTH_TYPE             0x8C16
+#define GL_TEXTURE_COMPRESSED             0x86A1
+#define GL_SAMPLER_2D_MULTISAMPLE         0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE     0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_VERTEX_ATTRIB_BINDING          0x82D4
+#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET  0x82D5
+#define GL_VERTEX_BINDING_DIVISOR         0x82D6
+#define GL_VERTEX_BINDING_OFFSET          0x82D7
+#define GL_VERTEX_BINDING_STRIDE          0x82D8
+#define GL_VERTEX_BINDING_BUFFER          0x8F4F
+#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9
+#define GL_MAX_VERTEX_ATTRIB_BINDINGS     0x82DA
+#define GL_MAX_VERTEX_ATTRIB_STRIDE       0x82E5
+typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+typedef GLuint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings);
+typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines);
+typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers);
+typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val);
+typedef void (GL_APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex);
+typedef void (GL_APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+GL_APICALL void GL_APIENTRY glDispatchComputeIndirect (GLintptr indirect);
+GL_APICALL void GL_APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect);
+GL_APICALL void GL_APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect);
+GL_APICALL void GL_APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program);
+GL_APICALL void GL_APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program);
+GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings);
+GL_APICALL void GL_APIENTRY glBindProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines);
+GL_APICALL void GL_APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines);
+GL_APICALL GLboolean GL_APIENTRY glIsProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glValidateProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+GL_APICALL void GL_APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data);
+GL_APICALL void GL_APIENTRY glMemoryBarrier (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glMemoryBarrierByRegion (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GL_APICALL void GL_APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val);
+GL_APICALL void GL_APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask);
+GL_APICALL void GL_APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+GL_APICALL void GL_APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+GL_APICALL void GL_APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GL_APICALL void GL_APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex);
+GL_APICALL void GL_APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor);
+#endif
+#endif /* GL_ES_VERSION_3_1 */
+
+#ifndef GL_ES_VERSION_3_2
+#define GL_ES_VERSION_3_2 1
+typedef void (GL_APIENTRY  *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+#define GL_MULTISAMPLE_LINE_WIDTH_RANGE   0x9381
+#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY 0x9382
+#define GL_MULTIPLY                       0x9294
+#define GL_SCREEN                         0x9295
+#define GL_OVERLAY                        0x9296
+#define GL_DARKEN                         0x9297
+#define GL_LIGHTEN                        0x9298
+#define GL_COLORDODGE                     0x9299
+#define GL_COLORBURN                      0x929A
+#define GL_HARDLIGHT                      0x929B
+#define GL_SOFTLIGHT                      0x929C
+#define GL_DIFFERENCE                     0x929E
+#define GL_EXCLUSION                      0x92A0
+#define GL_HSL_HUE                        0x92AD
+#define GL_HSL_SATURATION                 0x92AE
+#define GL_HSL_COLOR                      0x92AF
+#define GL_HSL_LUMINOSITY                 0x92B0
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS       0x8242
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
+#define GL_DEBUG_CALLBACK_FUNCTION        0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM      0x8245
+#define GL_DEBUG_SOURCE_API               0x8246
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM     0x8247
+#define GL_DEBUG_SOURCE_SHADER_COMPILER   0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY       0x8249
+#define GL_DEBUG_SOURCE_APPLICATION       0x824A
+#define GL_DEBUG_SOURCE_OTHER             0x824B
+#define GL_DEBUG_TYPE_ERROR               0x824C
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR  0x824E
+#define GL_DEBUG_TYPE_PORTABILITY         0x824F
+#define GL_DEBUG_TYPE_PERFORMANCE         0x8250
+#define GL_DEBUG_TYPE_OTHER               0x8251
+#define GL_DEBUG_TYPE_MARKER              0x8268
+#define GL_DEBUG_TYPE_PUSH_GROUP          0x8269
+#define GL_DEBUG_TYPE_POP_GROUP           0x826A
+#define GL_DEBUG_SEVERITY_NOTIFICATION    0x826B
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH    0x826C
+#define GL_DEBUG_GROUP_STACK_DEPTH        0x826D
+#define GL_BUFFER                         0x82E0
+#define GL_SHADER                         0x82E1
+#define GL_PROGRAM                        0x82E2
+#define GL_VERTEX_ARRAY                   0x8074
+#define GL_QUERY                          0x82E3
+#define GL_PROGRAM_PIPELINE               0x82E4
+#define GL_SAMPLER                        0x82E6
+#define GL_MAX_LABEL_LENGTH               0x82E8
+#define GL_MAX_DEBUG_MESSAGE_LENGTH       0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES      0x9144
+#define GL_DEBUG_LOGGED_MESSAGES          0x9145
+#define GL_DEBUG_SEVERITY_HIGH            0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM          0x9147
+#define GL_DEBUG_SEVERITY_LOW             0x9148
+#define GL_DEBUG_OUTPUT                   0x92E0
+#define GL_CONTEXT_FLAG_DEBUG_BIT         0x00000002
+#define GL_STACK_OVERFLOW                 0x0503
+#define GL_STACK_UNDERFLOW                0x0504
+#define GL_GEOMETRY_SHADER                0x8DD9
+#define GL_GEOMETRY_SHADER_BIT            0x00000004
+#define GL_GEOMETRY_VERTICES_OUT          0x8916
+#define GL_GEOMETRY_INPUT_TYPE            0x8917
+#define GL_GEOMETRY_OUTPUT_TYPE           0x8918
+#define GL_GEOMETRY_SHADER_INVOCATIONS    0x887F
+#define GL_LAYER_PROVOKING_VERTEX         0x825E
+#define GL_LINES_ADJACENCY                0x000A
+#define GL_LINE_STRIP_ADJACENCY           0x000B
+#define GL_TRIANGLES_ADJACENCY            0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY       0x000D
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS    0x8A2C
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS  0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES   0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS   0x92D5
+#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS    0x90CD
+#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7
+#define GL_FIRST_VERTEX_CONVENTION        0x8E4D
+#define GL_LAST_VERTEX_CONVENTION         0x8E4E
+#define GL_UNDEFINED_VERTEX               0x8260
+#define GL_PRIMITIVES_GENERATED           0x8C87
+#define GL_FRAMEBUFFER_DEFAULT_LAYERS     0x9312
+#define GL_MAX_FRAMEBUFFER_LAYERS         0x9317
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7
+#define GL_REFERENCED_BY_GEOMETRY_SHADER  0x9309
+#define GL_PRIMITIVE_BOUNDING_BOX         0x92BE
+#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004
+#define GL_CONTEXT_FLAGS                  0x821E
+#define GL_LOSE_CONTEXT_ON_RESET          0x8252
+#define GL_GUILTY_CONTEXT_RESET           0x8253
+#define GL_INNOCENT_CONTEXT_RESET         0x8254
+#define GL_UNKNOWN_CONTEXT_RESET          0x8255
+#define GL_RESET_NOTIFICATION_STRATEGY    0x8256
+#define GL_NO_RESET_NOTIFICATION          0x8261
+#define GL_CONTEXT_LOST                   0x0507
+#define GL_SAMPLE_SHADING                 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE       0x8C37
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D
+#define GL_PATCHES                        0x000E
+#define GL_PATCH_VERTICES                 0x8E72
+#define GL_TESS_CONTROL_OUTPUT_VERTICES   0x8E75
+#define GL_TESS_GEN_MODE                  0x8E76
+#define GL_TESS_GEN_SPACING               0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER          0x8E78
+#define GL_TESS_GEN_POINT_MODE            0x8E79
+#define GL_ISOLINES                       0x8E7A
+#define GL_QUADS                          0x0007
+#define GL_FRACTIONAL_ODD                 0x8E7B
+#define GL_FRACTIONAL_EVEN                0x8E7C
+#define GL_MAX_PATCH_VERTICES             0x8E7D
+#define GL_MAX_TESS_GEN_LEVEL             0x8E7E
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83
+#define GL_MAX_TESS_PATCH_COMPONENTS      0x8E84
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4
+#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB
+#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC
+#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8
+#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9
+#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221
+#define GL_IS_PER_PATCH                   0x92E7
+#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307
+#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308
+#define GL_TESS_CONTROL_SHADER            0x8E88
+#define GL_TESS_EVALUATION_SHADER         0x8E87
+#define GL_TESS_CONTROL_SHADER_BIT        0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT     0x00000010
+#define GL_TEXTURE_BORDER_COLOR           0x1004
+#define GL_CLAMP_TO_BORDER                0x812D
+#define GL_TEXTURE_BUFFER                 0x8C2A
+#define GL_TEXTURE_BUFFER_BINDING         0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE        0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER         0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D
+#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F
+#define GL_SAMPLER_BUFFER                 0x8DC2
+#define GL_INT_SAMPLER_BUFFER             0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER    0x8DD8
+#define GL_IMAGE_BUFFER                   0x9051
+#define GL_INT_IMAGE_BUFFER               0x905C
+#define GL_UNSIGNED_INT_IMAGE_BUFFER      0x9067
+#define GL_TEXTURE_BUFFER_OFFSET          0x919D
+#define GL_TEXTURE_BUFFER_SIZE            0x919E
+#define GL_COMPRESSED_RGBA_ASTC_4x4       0x93B0
+#define GL_COMPRESSED_RGBA_ASTC_5x4       0x93B1
+#define GL_COMPRESSED_RGBA_ASTC_5x5       0x93B2
+#define GL_COMPRESSED_RGBA_ASTC_6x5       0x93B3
+#define GL_COMPRESSED_RGBA_ASTC_6x6       0x93B4
+#define GL_COMPRESSED_RGBA_ASTC_8x5       0x93B5
+#define GL_COMPRESSED_RGBA_ASTC_8x6       0x93B6
+#define GL_COMPRESSED_RGBA_ASTC_8x8       0x93B7
+#define GL_COMPRESSED_RGBA_ASTC_10x5      0x93B8
+#define GL_COMPRESSED_RGBA_ASTC_10x6      0x93B9
+#define GL_COMPRESSED_RGBA_ASTC_10x8      0x93BA
+#define GL_COMPRESSED_RGBA_ASTC_10x10     0x93BB
+#define GL_COMPRESSED_RGBA_ASTC_12x10     0x93BC
+#define GL_COMPRESSED_RGBA_ASTC_12x12     0x93BD
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4 0x93D0
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4 0x93D1
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5 0x93D2
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5 0x93D3
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6 0x93D4
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5 0x93D5
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6 0x93D6
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8 0x93D7
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5 0x93D8
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6 0x93D9
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8 0x93DA
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10 0x93DB
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10 0x93DC
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12 0x93DD
+#define GL_TEXTURE_CUBE_MAP_ARRAY         0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A
+#define GL_SAMPLER_CUBE_MAP_ARRAY         0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW  0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY     0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F
+#define GL_IMAGE_CUBE_MAP_ARRAY           0x9054
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY       0x905F
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY   0x9102
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY   0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
+typedef void (GL_APIENTRYP PFNGLBLENDBARRIERPROC) (void);
+typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam);
+typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void);
+typedef void (GL_APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, void **params);
+typedef void (GL_APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void);
+typedef void (GL_APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value);
+typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBlendBarrier (void);
+GL_APICALL void GL_APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
+GL_APICALL void GL_APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+GL_APICALL void GL_APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+GL_APICALL void GL_APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam);
+GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+GL_APICALL void GL_APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+GL_APICALL void GL_APIENTRY glPopDebugGroup (void);
+GL_APICALL void GL_APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+GL_APICALL void GL_APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+GL_APICALL void GL_APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label);
+GL_APICALL void GL_APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+GL_APICALL void GL_APIENTRY glGetPointerv (GLenum pname, void **params);
+GL_APICALL void GL_APIENTRY glEnablei (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glDisablei (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glBlendEquationi (GLuint buf, GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+GL_APICALL void GL_APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabledi (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+GL_APICALL void GL_APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glPrimitiveBoundingBox (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatus (void);
+GL_APICALL void GL_APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+GL_APICALL void GL_APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+GL_APICALL void GL_APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+GL_APICALL void GL_APIENTRY glMinSampleShading (GLfloat value);
+GL_APICALL void GL_APIENTRY glPatchParameteri (GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+#endif
+#endif /* GL_ES_VERSION_3_2 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeGLES3gl3platformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/GLES3/gl3platform.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/GLES3/gl3platform.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/GLES3/gl3platform.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> #ifndef __gl3platform_h_
</span><span class="cx"> #define __gl3platform_h_
</span><span class="cx"> 
</span><del>-/* $Revision: 18437 $ on $Date:: 2012-07-08 23:31:39 -0700 #$ */
</del><ins>+/* $Revision: 23328 $ on $Date:: 2013-10-02 02:28:28 -0700 #$ */
</ins><span class="cx"> 
</span><span class="cx"> /*
</span><span class="cx">  * This document is licensed under the SGI Free Software B License Version
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeGLSLANGShaderLangh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx"> 
</span><span class="cx"> // Version number for shader translation API.
</span><span class="cx"> // It is incremented every time the API changes.
</span><del>-#define ANGLE_SH_VERSION 135
</del><ins>+#define ANGLE_SH_VERSION 145
</ins><span class="cx"> 
</span><span class="cx"> typedef enum {
</span><span class="cx">   SH_GLES2_SPEC = 0x8B40,
</span><span class="lines">@@ -80,23 +80,35 @@
</span><span class="cx">   SH_CSS_SHADERS_SPEC = 0x8B42
</span><span class="cx"> } ShShaderSpec;
</span><span class="cx"> 
</span><del>-typedef enum {
-  SH_ESSL_OUTPUT               = 0x8B45,
-  // SH_GLSL_OUTPUT is deprecated. This is to not break the build.
-  SH_GLSL_OUTPUT               = 0x8B46,
-  SH_GLSL_COMPATIBILITY_OUTPUT = 0x8B46,
-  // SH_GLSL_CORE_OUTPUT is deprecated.
-  SH_GLSL_CORE_OUTPUT          = 0x8B47,
-  //Note: GL introduced core profiles in 1.5. However, for compatiblity with Chromium, we treat SH_GLSL_CORE_OUTPUT as GLSL_130_OUTPUT.
-  //TODO: Remove SH_GLSL_CORE_OUTPUT
-  SH_GLSL_130_OUTPUT           = 0x8B47,
-  SH_GLSL_410_CORE_OUTPUT      = 0x8B84,
-  SH_GLSL_420_CORE_OUTPUT      = 0x8B85,
</del><ins>+typedef enum
+{
+    // ESSL output only supported in some configurations.
+    SH_ESSL_OUTPUT = 0x8B45,
</ins><span class="cx"> 
</span><del>-  // HLSL output only supported in some configurations.
-  SH_HLSL_OUTPUT   = 0x8B48,
-  SH_HLSL9_OUTPUT  = 0x8B48,
-  SH_HLSL11_OUTPUT = 0x8B49
</del><ins>+    // GLSL output only supported in some configurations.
+    SH_GLSL_COMPATIBILITY_OUTPUT = 0x8B46,
+    // Note: GL introduced core profiles in 1.5.
+    SH_GLSL_130_OUTPUT      = 0x8B47,
+    SH_GLSL_140_OUTPUT      = 0x8B80,
+    SH_GLSL_150_CORE_OUTPUT = 0x8B81,
+    SH_GLSL_330_CORE_OUTPUT = 0x8B82,
+    SH_GLSL_400_CORE_OUTPUT = 0x8B83,
+    SH_GLSL_410_CORE_OUTPUT = 0x8B84,
+    SH_GLSL_420_CORE_OUTPUT = 0x8B85,
+    SH_GLSL_430_CORE_OUTPUT = 0x8B86,
+    SH_GLSL_440_CORE_OUTPUT = 0x8B87,
+    SH_GLSL_450_CORE_OUTPUT = 0x8B88,
+
+    // HLSL output only supported in some configurations.
+    // Deprecated:
+    SH_HLSL_OUTPUT   = 0x8B48,
+    SH_HLSL9_OUTPUT  = 0x8B48,
+    SH_HLSL11_OUTPUT = 0x8B49,
+
+    // Prefer using these to specify HLSL output type:
+    SH_HLSL_3_0_OUTPUT       = 0x8B48,  // D3D 9
+    SH_HLSL_4_1_OUTPUT       = 0x8B49,  // D3D 11
+    SH_HLSL_4_0_FL9_3_OUTPUT = 0x8B4A   // D3D 11 feature level 9_3
</ins><span class="cx"> } ShShaderOutput;
</span><span class="cx"> 
</span><span class="cx"> // Compile options.
</span><span class="lines">@@ -188,6 +200,14 @@
</span><span class="cx">   // compilation process. Pruning coupled with SH_LIMIT_CALL_STACK_DEPTH
</span><span class="cx">   // helps avoid bad shaders causing stack overflows.
</span><span class="cx">   SH_DONT_PRUNE_UNUSED_FUNCTIONS = 0x100000,
</span><ins>+
+  // This flag works around a bug in NVIDIA 331 series drivers related
+  // to pow(x, y) where y is a constant vector.
+  SH_REMOVE_POW_WITH_CONSTANT_EXPONENT = 0x200000,
+
+  // This flag works around bugs in Mac drivers related to do-while by
+  // transforming them into an other construct.
+  SH_REWRITE_DO_WHILE_LOOPS = 0x400000,
</ins><span class="cx"> } ShCompileOptions;
</span><span class="cx"> 
</span><span class="cx"> // Defines alternate strategies for implementing array index clamping.
</span><span class="lines">@@ -236,6 +256,7 @@
</span><span class="cx">     int OES_standard_derivatives;
</span><span class="cx">     int OES_EGL_image_external;
</span><span class="cx">     int ARB_texture_rectangle;
</span><ins>+    int EXT_blend_func_extended;
</ins><span class="cx">     int EXT_draw_buffers;
</span><span class="cx">     int EXT_frag_depth;
</span><span class="cx">     int EXT_shader_texture_lod;
</span><span class="lines">@@ -250,7 +271,9 @@
</span><span class="cx">     // function. This applies to Tegra K1 devices.
</span><span class="cx">     int NV_draw_buffers;
</span><span class="cx"> 
</span><del>-    // Set to 1 if highp precision is supported in the fragment language.
</del><ins>+    // Set to 1 if highp precision is supported in the ESSL 1.00 version of the
+    // fragment language. Does not affect versions of the language where highp
+    // support is mandatory.
</ins><span class="cx">     // Default is 0.
</span><span class="cx">     int FragmentPrecisionHigh;
</span><span class="cx"> 
</span><span class="lines">@@ -260,6 +283,13 @@
</span><span class="cx">     int MinProgramTexelOffset;
</span><span class="cx">     int MaxProgramTexelOffset;
</span><span class="cx"> 
</span><ins>+    // Extension constants.
+
+    // Value of GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT for OpenGL ES output context.
+    // Value of GL_MAX_DUAL_SOURCE_DRAW_BUFFERS for OpenGL output context.
+    // GLES SL version 100 gl_MaxDualSourceDrawBuffersEXT value for EXT_blend_func_extended.
+    int MaxDualSourceDrawBuffers;
+
</ins><span class="cx">     // Name Hashing.
</span><span class="cx">     // Set a 64 bit hash function to enable user-defined name hashing.
</span><span class="cx">     // Default is NULL.
</span><span class="lines">@@ -269,11 +299,15 @@
</span><span class="cx">     // Default is SH_CLAMP_WITH_CLAMP_INTRINSIC.
</span><span class="cx">     ShArrayIndexClampingStrategy ArrayIndexClampingStrategy;
</span><span class="cx"> 
</span><del>-    // The maximum complexity an expression can be.
</del><ins>+    // The maximum complexity an expression can be when SH_LIMIT_EXPRESSION_COMPLEXITY is turned on.
</ins><span class="cx">     int MaxExpressionComplexity;
</span><span class="cx"> 
</span><span class="cx">     // The maximum depth a call stack can be.
</span><span class="cx">     int MaxCallStackDepth;
</span><ins>+
+    // The maximum number of parameters a function can have when SH_LIMIT_EXPRESSION_COMPLEXITY is
+    // turned on.
+    int MaxFunctionParameters;
</ins><span class="cx"> } ShBuiltInResources;
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -309,9 +343,9 @@
</span><span class="cx"> // type: Specifies the type of shader - GL_FRAGMENT_SHADER or GL_VERTEX_SHADER.
</span><span class="cx"> // spec: Specifies the language spec the compiler must conform to -
</span><span class="cx"> //       SH_GLES2_SPEC or SH_WEBGL_SPEC.
</span><del>-// output: Specifies the output code type - SH_ESSL_OUTPUT, SH_GLSL_OUTPUT,
-//         SH_HLSL9_OUTPUT or SH_HLSL11_OUTPUT. Note: HLSL output is only
-//         supported in some configurations.
</del><ins>+// output: Specifies the output code type - for example SH_ESSL_OUTPUT, SH_GLSL_COMPATIBILITY_OUTPUT,
+//         SH_HLSL_3_0_OUTPUT or SH_HLSL_4_1_OUTPUT. Note: Each output type may only
+//         be supported in some configurations.
</ins><span class="cx"> // resources: Specifies the built-in resources.
</span><span class="cx"> COMPILER_EXPORT ShHandle ShConstructCompiler(
</span><span class="cx">     sh::GLenum type,
</span><span class="lines">@@ -350,6 +384,9 @@
</span><span class="cx">     size_t numStrings,
</span><span class="cx">     int compileOptions);
</span><span class="cx"> 
</span><ins>+// Clears the results from the previous compilation.
+COMPILER_EXPORT void ShClearResults(const ShHandle handle);
+
</ins><span class="cx"> // Return the version of the shader language.
</span><span class="cx"> COMPILER_EXPORT int ShGetShaderVersion(const ShHandle handle);
</span><span class="cx"> 
</span><span class="lines">@@ -384,7 +421,7 @@
</span><span class="cx"> COMPILER_EXPORT const std::vector&lt;sh::Uniform&gt; *ShGetUniforms(const ShHandle handle);
</span><span class="cx"> COMPILER_EXPORT const std::vector&lt;sh::Varying&gt; *ShGetVaryings(const ShHandle handle);
</span><span class="cx"> COMPILER_EXPORT const std::vector&lt;sh::Attribute&gt; *ShGetAttributes(const ShHandle handle);
</span><del>-COMPILER_EXPORT const std::vector&lt;sh::Attribute&gt; *ShGetOutputVariables(const ShHandle handle);
</del><ins>+COMPILER_EXPORT const std::vector&lt;sh::OutputVariable&gt; *ShGetOutputVariables(const ShHandle handle);
</ins><span class="cx"> COMPILER_EXPORT const std::vector&lt;sh::InterfaceBlock&gt; *ShGetInterfaceBlocks(const ShHandle handle);
</span><span class="cx"> 
</span><span class="cx"> typedef struct
</span><span class="lines">@@ -417,16 +454,10 @@
</span><span class="cx">                                                  const std::string &amp;interfaceBlockName,
</span><span class="cx">                                                  unsigned int *indexOut);
</span><span class="cx"> 
</span><del>-// Gives the compiler-assigned register for uniforms in the default
-// interface block.
-// The method writes the value to the output variable &quot;indexOut&quot;.
-// Returns true if it found a valid default uniform, false otherwise.
-// Parameters:
-// handle: Specifies the compiler
-// interfaceBlockName: Specifies the uniform
-// indexOut: output variable that stores the assigned register
-COMPILER_EXPORT bool ShGetUniformRegister(const ShHandle handle,
-                                          const std::string &amp;uniformName,
-                                          unsigned int *indexOut);
</del><ins>+// Gives a map from uniform names to compiler-assigned registers in the default
+// interface block. Note that the map contains also registers of samplers that
+// have been extracted from structs.
+COMPILER_EXPORT const std::map&lt;std::string, unsigned int&gt; *ShGetUniformRegisterMap(
+    const ShHandle handle);
</ins><span class="cx"> 
</span><span class="cx"> #endif // GLSLANG_SHADERLANG_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeGLSLANGShaderVarsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderVars.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -110,19 +110,39 @@
</span><span class="cx">     bool isSameUniformAtLinkTime(const Uniform &amp;other) const;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-struct COMPILER_EXPORT Attribute : public ShaderVariable
</del><ins>+// An interface variable is a variable which passes data between the GL data structures and the
+// shader execution: either vertex shader inputs or fragment shader outputs. These variables can
+// have integer locations to pass back to the GL API.
+struct COMPILER_EXPORT InterfaceVariable : public ShaderVariable
</ins><span class="cx"> {
</span><ins>+    InterfaceVariable();
+    ~InterfaceVariable();
+    InterfaceVariable(const InterfaceVariable &amp;other);
+    InterfaceVariable &amp;operator=(const InterfaceVariable &amp;other);
+    bool operator==(const InterfaceVariable &amp;other) const;
+    bool operator!=(const InterfaceVariable &amp;other) const { return !operator==(other); }
+
+    int location;
+};
+
+struct COMPILER_EXPORT Attribute : public InterfaceVariable
+{
</ins><span class="cx">     Attribute();
</span><span class="cx">     ~Attribute();
</span><span class="cx">     Attribute(const Attribute &amp;other);
</span><span class="cx">     Attribute &amp;operator=(const Attribute &amp;other);
</span><span class="cx">     bool operator==(const Attribute &amp;other) const;
</span><del>-    bool operator!=(const Attribute &amp;other) const
-    {
-        return !operator==(other);
-    }
</del><ins>+    bool operator!=(const Attribute &amp;other) const { return !operator==(other); }
+};
</ins><span class="cx"> 
</span><del>-    int location;
</del><ins>+struct COMPILER_EXPORT OutputVariable : public InterfaceVariable
+{
+    OutputVariable();
+    ~OutputVariable();
+    OutputVariable(const OutputVariable &amp;other);
+    OutputVariable &amp;operator=(const OutputVariable &amp;other);
+    bool operator==(const OutputVariable &amp;other) const;
+    bool operator!=(const OutputVariable &amp;other) const { return !operator==(other); }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct COMPILER_EXPORT InterfaceBlockField : public ShaderVariable
</span><span class="lines">@@ -161,7 +181,12 @@
</span><span class="cx"> 
</span><span class="cx">     // Decide whether two varyings are the same at shader link time,
</span><span class="cx">     // assuming one from vertex shader and the other from fragment shader.
</span><del>-    // See GLSL ES Spec 3.00.3, sec 4.3.9.
</del><ins>+    // Invariance needs to match only in ESSL1. Relevant spec sections:
+    // GLSL ES 3.00.4, sections 4.6.1 and 4.3.9.
+    // GLSL ES 1.00.17, section 4.6.4.
+    bool isSameVaryingAtLinkTime(const Varying &amp;other, int shaderVersion) const;
+
+    // Deprecated version of isSameVaryingAtLinkTime, which assumes ESSL1.
</ins><span class="cx">     bool isSameVaryingAtLinkTime(const Varying &amp;other) const;
</span><span class="cx"> 
</span><span class="cx">     InterpolationType interpolation;
</span><span class="lines">@@ -175,6 +200,9 @@
</span><span class="cx">     InterfaceBlock(const InterfaceBlock &amp;other);
</span><span class="cx">     InterfaceBlock &amp;operator=(const InterfaceBlock &amp;other);
</span><span class="cx"> 
</span><ins>+    // Fields from blocks with non-empty instance names are prefixed with the block name.
+    std::string fieldPrefix() const;
+
</ins><span class="cx">     std::string name;
</span><span class="cx">     std::string mappedName;
</span><span class="cx">     std::string instanceName;
</span><span class="lines">@@ -185,6 +213,6 @@
</span><span class="cx">     std::vector&lt;InterfaceBlockField&gt; fields;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace sh
</ins><span class="cx"> 
</span><span class="cx"> #endif // GLSLANG_SHADERVARS_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeangle_glh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/angle_gl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/angle_gl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/angle_gl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,7 +13,8 @@
</span><span class="cx"> #include &quot;GLES2/gl2.h&quot;
</span><span class="cx"> #include &quot;GLES2/gl2ext.h&quot;
</span><span class="cx"> #include &quot;GLES3/gl3.h&quot;
</span><del>-#include &quot;GLES3/gl3ext.h&quot;
</del><ins>+#include &quot;GLES3/gl31.h&quot;
+#include &quot;GLES3/gl32.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> // The following enum is used in ANGLE, but is from desktop GL
</span><span class="cx"> #ifndef GL_SAMPLER_2D_RECT_ARB
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeangle_windowsstoreh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/angle_windowsstore.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/angle_windowsstore.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/angle_windowsstore.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -28,10 +28,24 @@
</span><span class="cx"> // Description: Set this property to specify a preferred size in pixels of the render surface.
</span><span class="cx"> //              The render surface size width and height must be greater than 0.
</span><span class="cx"> //              If this property is set, then the render surface size is fixed.
</span><ins>+//              The render surface will then be scaled to the window dimensions.
</ins><span class="cx"> //              If this property is missing, a default behavior will be provided.
</span><span class="cx"> //              The default behavior uses the window size if a CoreWindow is specified or
</span><span class="cx"> //              the size of the SwapChainPanel control if one is specified.
</span><span class="cx"> //
</span><span class="cx"> const wchar_t EGLRenderSurfaceSizeProperty[] = L&quot;EGLRenderSurfaceSizeProperty&quot;;
</span><span class="cx"> 
</span><ins>+//
+// Property: EGLRenderResolutionScaleProperty
+// Type: Single
+// Description: Use this to specify a preferred scale for the render surface compared to the window.
+//              For example, if the window is 800x480, and:
+//                - scale is set to 0.5f then the surface will be 400x240
+//                - scale is set to 1.2f then the surface will be 960x576
+//              If the window resizes or rotates then the surface will resize accordingly.
+//              EGLRenderResolutionScaleProperty and EGLRenderSurfaceSizeProperty cannot both be set.
+//              The scale factor should be &gt; 0.0f.
+//
+const wchar_t EGLRenderResolutionScaleProperty[] = L&quot;EGLRenderResolutionScaleProperty&quot;;
+
</ins><span class="cx"> #endif // ANGLE_WINDOWSSTORE_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEincludeplatformPlatformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/include/platform/Platform.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/include/platform/Platform.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/include/platform/Platform.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,8 +11,25 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;stdint.h&gt;
</span><span class="cx"> 
</span><del>-#include &quot;../export.h&quot;
</del><ins>+#if defined(_WIN32)
+#   if !defined(LIBANGLE_IMPLEMENTATION)
+#       define ANGLE_PLATFORM_EXPORT __declspec(dllimport)
+#   endif
+#elif defined(__GNUC__)
+#   if defined(LIBANGLE_IMPLEMENTATION)
+#       define ANGLE_PLATFORM_EXPORT __attribute__((visibility (&quot;default&quot;)))
+#   endif
+#endif
+#if !defined(ANGLE_PLATFORM_EXPORT)
+#   define ANGLE_PLATFORM_EXPORT
+#endif
</ins><span class="cx"> 
</span><ins>+#if defined(_WIN32)
+#   define ANGLE_APIENTRY __stdcall
+#else
+#   define ANGLE_APIENTRY
+#endif
+
</ins><span class="cx"> namespace angle
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -31,6 +48,17 @@
</span><span class="cx">     // it is recommended that the fixed point be no further in the past than the epoch.
</span><span class="cx">     virtual double monotonicallyIncreasingTime() { return 0; }
</span><span class="cx"> 
</span><ins>+    // Logging ------------------------------------------------------------
+
+    // Log an error message within the platform implementation.
+    virtual void logError(const char *errorMessage) {}
+
+    // Log a warning message within the platform implementation.
+    virtual void logWarning(const char *warningMessage) {}
+
+    // Log an info message within the platform implementation.
+    virtual void logInfo(const char *infoMessage) {}
+
</ins><span class="cx">     // Tracing --------
</span><span class="cx"> 
</span><span class="cx">     // Get a pointer to the enabled state of the given trace category. The
</span><span class="lines">@@ -114,6 +142,8 @@
</span><span class="cx">     virtual void histogramEnumeration(const char *name, int sample, int boundaryValue) { }
</span><span class="cx">     // Unlike enumeration histograms, sparse histograms only allocate memory for non-empty buckets.
</span><span class="cx">     virtual void histogramSparse(const char *name, int sample) { }
</span><ins>+    // Boolean histograms track two-state variables.
+    virtual void histogramBoolean(const char *name, bool sample) { }
</ins><span class="cx"> 
</span><span class="cx">   protected:
</span><span class="cx">     virtual ~Platform() { }
</span><span class="lines">@@ -121,13 +151,18 @@
</span><span class="cx"> 
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-typedef void(*ANGLEPlatformInitializeFunc)(angle::Platform*);
-ANGLE_EXPORT void ANGLEPlatformInitialize(angle::Platform*);
</del><ins>+extern &quot;C&quot;
+{
</ins><span class="cx"> 
</span><del>-typedef void (*ANGLEPlatformShutdownFunc)();
-ANGLE_EXPORT void ANGLEPlatformShutdown();
</del><ins>+typedef void (ANGLE_APIENTRY *ANGLEPlatformInitializeFunc)(angle::Platform*);
+ANGLE_PLATFORM_EXPORT void ANGLE_APIENTRY ANGLEPlatformInitialize(angle::Platform*);
</ins><span class="cx"> 
</span><del>-typedef angle::Platform *(*ANGLEPlatformCurrentFunc)();
-ANGLE_EXPORT angle::Platform *ANGLEPlatformCurrent();
</del><ins>+typedef void (ANGLE_APIENTRY *ANGLEPlatformShutdownFunc)();
+ANGLE_PLATFORM_EXPORT void ANGLE_APIENTRY ANGLEPlatformShutdown();
</ins><span class="cx"> 
</span><ins>+typedef angle::Platform *(ANGLE_APIENTRY *ANGLEPlatformCurrentFunc)();
+ANGLE_PLATFORM_EXPORT angle::Platform *ANGLE_APIENTRY ANGLEPlatformCurrent();
+
+}
+
</ins><span class="cx"> #endif // ANGLE_PLATFORM_H
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrcanglegyp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/angle.gyp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/angle.gyp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/angle.gyp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,7 +16,11 @@
</span><span class="cx">         'angle_enable_d3d9%': 0,
</span><span class="cx">         'angle_enable_d3d11%': 0,
</span><span class="cx">         'angle_enable_gl%': 0,
</span><ins>+        'angle_enable_essl%': 1, # Enable this for all configs by default
+        'angle_enable_glsl%': 1, # Enable this for all configs by default
</ins><span class="cx">         'angle_enable_hlsl%': 0,
</span><ins>+        'angle_link_glx%': 0,
+        'angle_gl_library_type%': 'shared_library',
</ins><span class="cx">         'conditions':
</span><span class="cx">         [
</span><span class="cx">             ['OS==&quot;win&quot;',
</span><span class="lines">@@ -26,6 +30,18 @@
</span><span class="cx">                 'angle_enable_d3d11%': 1,
</span><span class="cx">                 'angle_enable_hlsl%': 1,
</span><span class="cx">             }],
</span><ins>+            ['OS==&quot;linux&quot; and use_x11==1 and chromeos==0',
+            {
+                'angle_enable_gl%': 1,
+            }],
+            ['OS==&quot;mac&quot;',
+            {
+                'angle_enable_gl%': 1,
+            }],
+            ['use_ozone==1',
+            {
+                'angle_enable_gl%': 1,
+            }],
</ins><span class="cx">         ],
</span><span class="cx">     },
</span><span class="cx">     'includes':
</span><span class="lines">@@ -50,6 +66,10 @@
</span><span class="cx">                 '.',
</span><span class="cx">                 '../include',
</span><span class="cx">             ],
</span><ins>+            'dependencies':
+            [
+                'commit_id',
+            ],
</ins><span class="cx">             'direct_dependent_settings':
</span><span class="cx">             {
</span><span class="cx">                 'include_dirs':
</span><span class="lines">@@ -57,17 +77,38 @@
</span><span class="cx">                     '&lt;(angle_path)/src',
</span><span class="cx">                     '&lt;(angle_path)/include',
</span><span class="cx">                 ],
</span><ins>+                'conditions':
+                [
+                    ['OS==&quot;win&quot;',
+                    {
+                        'configurations':
+                        {
+                            'Debug_Base':
+                            {
+                                'defines':
+                                [
+                                    'ANGLE_ENABLE_DEBUG_ANNOTATIONS'
+                                ],
+                            },
+                        },
+                    }],
+                ],
</ins><span class="cx">             },
</span><span class="cx">             'conditions':
</span><span class="cx">             [
</span><del>-                ['angle_build_winrt==1',
</del><ins>+                ['OS==&quot;win&quot;',
</ins><span class="cx">                 {
</span><del>-                    'msvs_enable_winrt' : '1',
</del><ins>+                    'configurations':
+                    {
+                        'Debug_Base':
+                        {
+                            'defines':
+                            [
+                                'ANGLE_ENABLE_DEBUG_ANNOTATIONS'
+                            ],
+                        },
+                    },
</ins><span class="cx">                 }],
</span><del>-                ['angle_build_winphone==1',
-                {
-                    'msvs_enable_winphone' : '1',
-                }],
</del><span class="cx">             ],
</span><span class="cx">         },
</span><span class="cx"> 
</span><span class="lines">@@ -87,13 +128,8 @@
</span><span class="cx">             [
</span><span class="cx">                 ['angle_build_winrt==1',
</span><span class="cx">                 {
</span><del>-                    'msvs_enable_winrt' : '1',
</del><span class="cx">                     'type' : 'shared_library',
</span><span class="cx">                 }],
</span><del>-                ['angle_build_winphone==1',
-                {
-                    'msvs_enable_winphone' : '1',
-                }],
</del><span class="cx">             ],
</span><span class="cx">         },
</span><span class="cx">     ],
</span><span class="lines">@@ -135,13 +171,8 @@
</span><span class="cx">                     [
</span><span class="cx">                         ['angle_build_winrt==1',
</span><span class="cx">                         {
</span><del>-                            'msvs_enable_winrt' : '1',
</del><span class="cx">                             'type' : 'shared_library',
</span><span class="cx">                         }],
</span><del>-                        ['angle_build_winphone==1',
-                        {
-                            'msvs_enable_winphone' : '1',
-                        }],
</del><span class="cx">                     ],
</span><span class="cx">                 }
</span><span class="cx">             ]
</span><span class="lines">@@ -172,13 +203,8 @@
</span><span class="cx">                     [
</span><span class="cx">                         ['angle_build_winrt==1',
</span><span class="cx">                         {
</span><del>-                            'msvs_enable_winrt' : '1',
</del><span class="cx">                             'type' : 'shared_library',
</span><span class="cx">                         }],
</span><del>-                        ['angle_build_winphone==1',
-                        {
-                            'msvs_enable_winphone' : '1',
-                        }],
</del><span class="cx">                     ],
</span><span class="cx">                 }
</span><span class="cx">             ]
</span><span class="lines">@@ -216,13 +242,8 @@
</span><span class="cx">                         }],
</span><span class="cx">                         ['angle_build_winrt==1',
</span><span class="cx">                         {
</span><del>-                            'msvs_enable_winrt' : '1',
</del><span class="cx">                             'type' : 'shared_library',
</span><span class="cx">                         }],
</span><del>-                        ['angle_build_winphone==1',
-                        {
-                            'msvs_enable_winphone' : '1',
-                        }],
</del><span class="cx">                     ]
</span><span class="cx">                 },
</span><span class="cx">             ], # targets
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonBitSetIteratorh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/common/BitSetIterator.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/BitSetIterator.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/common/BitSetIterator.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,156 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// BitSetIterator:
+//   A helper class to quickly bitscan bitsets for set bits.
+//
+
+#ifndef COMMON_BITSETITERATOR_H_
+#define COMMON_BITSETITERATOR_H_
+
+#include &lt;stdint.h&gt;
+
+#include &lt;bitset&gt;
+
+#include &quot;common/angleutils.h&quot;
+#include &quot;common/debug.h&quot;
+#include &quot;common/mathutil.h&quot;
+#include &quot;common/platform.h&quot;
+
+namespace angle
+{
+template &lt;size_t N&gt;
+class BitSetIterator final
+{
+  public:
+    BitSetIterator(const std::bitset&lt;N&gt; &amp;bitset);
+    BitSetIterator(const BitSetIterator &amp;other);
+    BitSetIterator &amp;operator=(const BitSetIterator &amp;other);
+
+    class Iterator final
+    {
+      public:
+        Iterator(const std::bitset&lt;N&gt; &amp;bits);
+        Iterator &amp;operator++();
+
+        bool operator==(const Iterator &amp;other) const;
+        bool operator!=(const Iterator &amp;other) const;
+        unsigned long operator*() const { return mCurrentBit; }
+
+      private:
+        unsigned long getNextBit();
+
+        static const size_t BitsPerWord = sizeof(unsigned long) * 8;
+        std::bitset&lt;N&gt; mBits;
+        unsigned long mCurrentBit;
+        unsigned long mOffset;
+    };
+
+    Iterator begin() const { return Iterator(mBits); }
+    Iterator end() const { return Iterator(std::bitset&lt;N&gt;(0)); }
+
+  private:
+    const std::bitset&lt;N&gt; mBits;
+};
+
+template &lt;size_t N&gt;
+BitSetIterator&lt;N&gt;::BitSetIterator(const std::bitset&lt;N&gt; &amp;bitset)
+    : mBits(bitset)
+{
+}
+
+template &lt;size_t N&gt;
+BitSetIterator&lt;N&gt;::BitSetIterator(const BitSetIterator &amp;other)
+    : mBits(other.mBits)
+{
+}
+
+template &lt;size_t N&gt;
+BitSetIterator&lt;N&gt; &amp;BitSetIterator&lt;N&gt;::operator=(const BitSetIterator &amp;other)
+{
+    mBits = other.mBits;
+    return *this;
+}
+
+template &lt;size_t N&gt;
+BitSetIterator&lt;N&gt;::Iterator::Iterator(const std::bitset&lt;N&gt; &amp;bits)
+    : mBits(bits), mCurrentBit(0), mOffset(0)
+{
+    if (bits.any())
+    {
+        mCurrentBit = getNextBit();
+    }
+    else
+    {
+        mOffset = static_cast&lt;unsigned long&gt;(rx::roundUp(N, BitsPerWord));
+    }
+}
+
+template &lt;size_t N&gt;
+typename BitSetIterator&lt;N&gt;::Iterator &amp;BitSetIterator&lt;N&gt;::Iterator::operator++()
+{
+    ASSERT(mBits.any());
+    mBits.set(mCurrentBit - mOffset, 0);
+    mCurrentBit = getNextBit();
+    return *this;
+}
+
+inline unsigned long ScanForward(unsigned long bits)
+{
+    ASSERT(bits != 0);
+#if defined(ANGLE_PLATFORM_WINDOWS)
+    unsigned long firstBitIndex = 0ul;
+    unsigned char ret = _BitScanForward(&amp;firstBitIndex, bits);
+    ASSERT(ret != 0);
+    UNUSED_ASSERTION_VARIABLE(ret);
+    return firstBitIndex;
+#elif defined(ANGLE_PLATFORM_POSIX)
+    return static_cast&lt;unsigned long&gt;(__builtin_ctzl(bits));
+#else
+#error Please implement bit-scan-forward for your platform!
+#endif
+}
+
+template &lt;size_t N&gt;
+bool BitSetIterator&lt;N&gt;::Iterator::operator==(const Iterator &amp;other) const
+{
+    return mOffset == other.mOffset &amp;&amp; mBits == other.mBits;
+}
+
+template &lt;size_t N&gt;
+bool BitSetIterator&lt;N&gt;::Iterator::operator!=(const Iterator &amp;other) const
+{
+    return !(*this == other);
+}
+
+template &lt;size_t N&gt;
+unsigned long BitSetIterator&lt;N&gt;::Iterator::getNextBit()
+{
+    static std::bitset&lt;N&gt; wordMask(std::numeric_limits&lt;unsigned long&gt;::max());
+
+    while (mOffset &lt; N)
+    {
+        unsigned long wordBits = (mBits &amp; wordMask).to_ulong();
+        if (wordBits != 0ul)
+        {
+            return ScanForward(wordBits) + mOffset;
+        }
+
+        mBits &gt;&gt;= BitsPerWord;
+        mOffset += BitsPerWord;
+    }
+    return 0;
+}
+
+// Helper to avoid needing to specify the template parameter size
+template &lt;size_t N&gt;
+BitSetIterator&lt;N&gt; IterateBitSet(const std::bitset&lt;N&gt; &amp;bitset)
+{
+    return BitSetIterator&lt;N&gt;(bitset);
+}
+
+}  // angle
+
+#endif  // COMMON_BITSETITERATOR_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonBitSetIterator_unittestcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/common/BitSetIterator_unittest.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/BitSetIterator_unittest.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/common/BitSetIterator_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,91 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// BitSetIteratorTest:
+//   Test the IterableBitSet class.
+//
+
+#include &lt;gtest/gtest.h&gt;
+
+#include &quot;common/BitSetIterator.h&quot;
+
+using namespace angle;
+
+namespace
+{
+class BitSetIteratorTest : public testing::Test
+{
+  protected:
+    std::bitset&lt;40&gt; mStateBits;
+};
+
+// Simple iterator test.
+TEST_F(BitSetIteratorTest, Iterator)
+{
+    std::set&lt;unsigned long&gt; originalValues;
+    originalValues.insert(2);
+    originalValues.insert(6);
+    originalValues.insert(8);
+    originalValues.insert(35);
+
+    for (unsigned long value : originalValues)
+    {
+        mStateBits.set(value);
+    }
+
+    std::set&lt;unsigned long&gt; readValues;
+    for (unsigned long bit : IterateBitSet(mStateBits))
+    {
+        EXPECT_EQ(1u, originalValues.count(bit));
+        EXPECT_EQ(0u, readValues.count(bit));
+        readValues.insert(bit);
+    }
+
+    EXPECT_EQ(originalValues.size(), readValues.size());
+}
+
+// Test an empty iterator.
+TEST_F(BitSetIteratorTest, EmptySet)
+{
+    // We don't use the FAIL gtest macro here since it returns immediately,
+    // causing an unreachable code warning in MSVS
+    bool sawBit = false;
+    for (unsigned long bit : IterateBitSet(mStateBits))
+    {
+        sawBit = true;
+        UNUSED_VARIABLE(bit);
+    }
+    EXPECT_FALSE(sawBit);
+}
+
+// Test iterating a result of combining two bitsets.
+TEST_F(BitSetIteratorTest, NonLValueBitset)
+{
+    std::bitset&lt;40&gt; otherBits;
+
+    mStateBits.set(1);
+    mStateBits.set(2);
+    mStateBits.set(3);
+    mStateBits.set(4);
+
+    otherBits.set(0);
+    otherBits.set(1);
+    otherBits.set(3);
+    otherBits.set(5);
+
+    std::set&lt;unsigned long&gt; seenBits;
+
+    for (unsigned long bit : IterateBitSet(mStateBits &amp; otherBits))
+    {
+        EXPECT_EQ(0u, seenBits.count(bit));
+        seenBits.insert(bit);
+        EXPECT_TRUE(mStateBits[bit]);
+        EXPECT_TRUE(otherBits[bit]);
+    }
+
+    EXPECT_EQ((mStateBits &amp; otherBits).count(), seenBits.size());
+}
+
+}  // anonymous namespace
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonFloat16ToFloat32cpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,2205 @@
</span><ins>+//
+// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// This file is automatically generated.
+
+#include &quot;common/mathutil.h&quot;
+
+namespace gl
+{
+
+const static unsigned g_mantissa[2048] = {
+    0x00000000,
+    0x33800000,
+    0x34000000,
+    0x34400000,
+    0x34800000,
+    0x34a00000,
+    0x34c00000,
+    0x34e00000,
+    0x35000000,
+    0x35100000,
+    0x35200000,
+    0x35300000,
+    0x35400000,
+    0x35500000,
+    0x35600000,
+    0x35700000,
+    0x35800000,
+    0x35880000,
+    0x35900000,
+    0x35980000,
+    0x35a00000,
+    0x35a80000,
+    0x35b00000,
+    0x35b80000,
+    0x35c00000,
+    0x35c80000,
+    0x35d00000,
+    0x35d80000,
+    0x35e00000,
+    0x35e80000,
+    0x35f00000,
+    0x35f80000,
+    0x36000000,
+    0x36040000,
+    0x36080000,
+    0x360c0000,
+    0x36100000,
+    0x36140000,
+    0x36180000,
+    0x361c0000,
+    0x36200000,
+    0x36240000,
+    0x36280000,
+    0x362c0000,
+    0x36300000,
+    0x36340000,
+    0x36380000,
+    0x363c0000,
+    0x36400000,
+    0x36440000,
+    0x36480000,
+    0x364c0000,
+    0x36500000,
+    0x36540000,
+    0x36580000,
+    0x365c0000,
+    0x36600000,
+    0x36640000,
+    0x36680000,
+    0x366c0000,
+    0x36700000,
+    0x36740000,
+    0x36780000,
+    0x367c0000,
+    0x36800000,
+    0x36820000,
+    0x36840000,
+    0x36860000,
+    0x36880000,
+    0x368a0000,
+    0x368c0000,
+    0x368e0000,
+    0x36900000,
+    0x36920000,
+    0x36940000,
+    0x36960000,
+    0x36980000,
+    0x369a0000,
+    0x369c0000,
+    0x369e0000,
+    0x36a00000,
+    0x36a20000,
+    0x36a40000,
+    0x36a60000,
+    0x36a80000,
+    0x36aa0000,
+    0x36ac0000,
+    0x36ae0000,
+    0x36b00000,
+    0x36b20000,
+    0x36b40000,
+    0x36b60000,
+    0x36b80000,
+    0x36ba0000,
+    0x36bc0000,
+    0x36be0000,
+    0x36c00000,
+    0x36c20000,
+    0x36c40000,
+    0x36c60000,
+    0x36c80000,
+    0x36ca0000,
+    0x36cc0000,
+    0x36ce0000,
+    0x36d00000,
+    0x36d20000,
+    0x36d40000,
+    0x36d60000,
+    0x36d80000,
+    0x36da0000,
+    0x36dc0000,
+    0x36de0000,
+    0x36e00000,
+    0x36e20000,
+    0x36e40000,
+    0x36e60000,
+    0x36e80000,
+    0x36ea0000,
+    0x36ec0000,
+    0x36ee0000,
+    0x36f00000,
+    0x36f20000,
+    0x36f40000,
+    0x36f60000,
+    0x36f80000,
+    0x36fa0000,
+    0x36fc0000,
+    0x36fe0000,
+    0x37000000,
+    0x37010000,
+    0x37020000,
+    0x37030000,
+    0x37040000,
+    0x37050000,
+    0x37060000,
+    0x37070000,
+    0x37080000,
+    0x37090000,
+    0x370a0000,
+    0x370b0000,
+    0x370c0000,
+    0x370d0000,
+    0x370e0000,
+    0x370f0000,
+    0x37100000,
+    0x37110000,
+    0x37120000,
+    0x37130000,
+    0x37140000,
+    0x37150000,
+    0x37160000,
+    0x37170000,
+    0x37180000,
+    0x37190000,
+    0x371a0000,
+    0x371b0000,
+    0x371c0000,
+    0x371d0000,
+    0x371e0000,
+    0x371f0000,
+    0x37200000,
+    0x37210000,
+    0x37220000,
+    0x37230000,
+    0x37240000,
+    0x37250000,
+    0x37260000,
+    0x37270000,
+    0x37280000,
+    0x37290000,
+    0x372a0000,
+    0x372b0000,
+    0x372c0000,
+    0x372d0000,
+    0x372e0000,
+    0x372f0000,
+    0x37300000,
+    0x37310000,
+    0x37320000,
+    0x37330000,
+    0x37340000,
+    0x37350000,
+    0x37360000,
+    0x37370000,
+    0x37380000,
+    0x37390000,
+    0x373a0000,
+    0x373b0000,
+    0x373c0000,
+    0x373d0000,
+    0x373e0000,
+    0x373f0000,
+    0x37400000,
+    0x37410000,
+    0x37420000,
+    0x37430000,
+    0x37440000,
+    0x37450000,
+    0x37460000,
+    0x37470000,
+    0x37480000,
+    0x37490000,
+    0x374a0000,
+    0x374b0000,
+    0x374c0000,
+    0x374d0000,
+    0x374e0000,
+    0x374f0000,
+    0x37500000,
+    0x37510000,
+    0x37520000,
+    0x37530000,
+    0x37540000,
+    0x37550000,
+    0x37560000,
+    0x37570000,
+    0x37580000,
+    0x37590000,
+    0x375a0000,
+    0x375b0000,
+    0x375c0000,
+    0x375d0000,
+    0x375e0000,
+    0x375f0000,
+    0x37600000,
+    0x37610000,
+    0x37620000,
+    0x37630000,
+    0x37640000,
+    0x37650000,
+    0x37660000,
+    0x37670000,
+    0x37680000,
+    0x37690000,
+    0x376a0000,
+    0x376b0000,
+    0x376c0000,
+    0x376d0000,
+    0x376e0000,
+    0x376f0000,
+    0x37700000,
+    0x37710000,
+    0x37720000,
+    0x37730000,
+    0x37740000,
+    0x37750000,
+    0x37760000,
+    0x37770000,
+    0x37780000,
+    0x37790000,
+    0x377a0000,
+    0x377b0000,
+    0x377c0000,
+    0x377d0000,
+    0x377e0000,
+    0x377f0000,
+    0x37800000,
+    0x37808000,
+    0x37810000,
+    0x37818000,
+    0x37820000,
+    0x37828000,
+    0x37830000,
+    0x37838000,
+    0x37840000,
+    0x37848000,
+    0x37850000,
+    0x37858000,
+    0x37860000,
+    0x37868000,
+    0x37870000,
+    0x37878000,
+    0x37880000,
+    0x37888000,
+    0x37890000,
+    0x37898000,
+    0x378a0000,
+    0x378a8000,
+    0x378b0000,
+    0x378b8000,
+    0x378c0000,
+    0x378c8000,
+    0x378d0000,
+    0x378d8000,
+    0x378e0000,
+    0x378e8000,
+    0x378f0000,
+    0x378f8000,
+    0x37900000,
+    0x37908000,
+    0x37910000,
+    0x37918000,
+    0x37920000,
+    0x37928000,
+    0x37930000,
+    0x37938000,
+    0x37940000,
+    0x37948000,
+    0x37950000,
+    0x37958000,
+    0x37960000,
+    0x37968000,
+    0x37970000,
+    0x37978000,
+    0x37980000,
+    0x37988000,
+    0x37990000,
+    0x37998000,
+    0x379a0000,
+    0x379a8000,
+    0x379b0000,
+    0x379b8000,
+    0x379c0000,
+    0x379c8000,
+    0x379d0000,
+    0x379d8000,
+    0x379e0000,
+    0x379e8000,
+    0x379f0000,
+    0x379f8000,
+    0x37a00000,
+    0x37a08000,
+    0x37a10000,
+    0x37a18000,
+    0x37a20000,
+    0x37a28000,
+    0x37a30000,
+    0x37a38000,
+    0x37a40000,
+    0x37a48000,
+    0x37a50000,
+    0x37a58000,
+    0x37a60000,
+    0x37a68000,
+    0x37a70000,
+    0x37a78000,
+    0x37a80000,
+    0x37a88000,
+    0x37a90000,
+    0x37a98000,
+    0x37aa0000,
+    0x37aa8000,
+    0x37ab0000,
+    0x37ab8000,
+    0x37ac0000,
+    0x37ac8000,
+    0x37ad0000,
+    0x37ad8000,
+    0x37ae0000,
+    0x37ae8000,
+    0x37af0000,
+    0x37af8000,
+    0x37b00000,
+    0x37b08000,
+    0x37b10000,
+    0x37b18000,
+    0x37b20000,
+    0x37b28000,
+    0x37b30000,
+    0x37b38000,
+    0x37b40000,
+    0x37b48000,
+    0x37b50000,
+    0x37b58000,
+    0x37b60000,
+    0x37b68000,
+    0x37b70000,
+    0x37b78000,
+    0x37b80000,
+    0x37b88000,
+    0x37b90000,
+    0x37b98000,
+    0x37ba0000,
+    0x37ba8000,
+    0x37bb0000,
+    0x37bb8000,
+    0x37bc0000,
+    0x37bc8000,
+    0x37bd0000,
+    0x37bd8000,
+    0x37be0000,
+    0x37be8000,
+    0x37bf0000,
+    0x37bf8000,
+    0x37c00000,
+    0x37c08000,
+    0x37c10000,
+    0x37c18000,
+    0x37c20000,
+    0x37c28000,
+    0x37c30000,
+    0x37c38000,
+    0x37c40000,
+    0x37c48000,
+    0x37c50000,
+    0x37c58000,
+    0x37c60000,
+    0x37c68000,
+    0x37c70000,
+    0x37c78000,
+    0x37c80000,
+    0x37c88000,
+    0x37c90000,
+    0x37c98000,
+    0x37ca0000,
+    0x37ca8000,
+    0x37cb0000,
+    0x37cb8000,
+    0x37cc0000,
+    0x37cc8000,
+    0x37cd0000,
+    0x37cd8000,
+    0x37ce0000,
+    0x37ce8000,
+    0x37cf0000,
+    0x37cf8000,
+    0x37d00000,
+    0x37d08000,
+    0x37d10000,
+    0x37d18000,
+    0x37d20000,
+    0x37d28000,
+    0x37d30000,
+    0x37d38000,
+    0x37d40000,
+    0x37d48000,
+    0x37d50000,
+    0x37d58000,
+    0x37d60000,
+    0x37d68000,
+    0x37d70000,
+    0x37d78000,
+    0x37d80000,
+    0x37d88000,
+    0x37d90000,
+    0x37d98000,
+    0x37da0000,
+    0x37da8000,
+    0x37db0000,
+    0x37db8000,
+    0x37dc0000,
+    0x37dc8000,
+    0x37dd0000,
+    0x37dd8000,
+    0x37de0000,
+    0x37de8000,
+    0x37df0000,
+    0x37df8000,
+    0x37e00000,
+    0x37e08000,
+    0x37e10000,
+    0x37e18000,
+    0x37e20000,
+    0x37e28000,
+    0x37e30000,
+    0x37e38000,
+    0x37e40000,
+    0x37e48000,
+    0x37e50000,
+    0x37e58000,
+    0x37e60000,
+    0x37e68000,
+    0x37e70000,
+    0x37e78000,
+    0x37e80000,
+    0x37e88000,
+    0x37e90000,
+    0x37e98000,
+    0x37ea0000,
+    0x37ea8000,
+    0x37eb0000,
+    0x37eb8000,
+    0x37ec0000,
+    0x37ec8000,
+    0x37ed0000,
+    0x37ed8000,
+    0x37ee0000,
+    0x37ee8000,
+    0x37ef0000,
+    0x37ef8000,
+    0x37f00000,
+    0x37f08000,
+    0x37f10000,
+    0x37f18000,
+    0x37f20000,
+    0x37f28000,
+    0x37f30000,
+    0x37f38000,
+    0x37f40000,
+    0x37f48000,
+    0x37f50000,
+    0x37f58000,
+    0x37f60000,
+    0x37f68000,
+    0x37f70000,
+    0x37f78000,
+    0x37f80000,
+    0x37f88000,
+    0x37f90000,
+    0x37f98000,
+    0x37fa0000,
+    0x37fa8000,
+    0x37fb0000,
+    0x37fb8000,
+    0x37fc0000,
+    0x37fc8000,
+    0x37fd0000,
+    0x37fd8000,
+    0x37fe0000,
+    0x37fe8000,
+    0x37ff0000,
+    0x37ff8000,
+    0x38000000,
+    0x38004000,
+    0x38008000,
+    0x3800c000,
+    0x38010000,
+    0x38014000,
+    0x38018000,
+    0x3801c000,
+    0x38020000,
+    0x38024000,
+    0x38028000,
+    0x3802c000,
+    0x38030000,
+    0x38034000,
+    0x38038000,
+    0x3803c000,
+    0x38040000,
+    0x38044000,
+    0x38048000,
+    0x3804c000,
+    0x38050000,
+    0x38054000,
+    0x38058000,
+    0x3805c000,
+    0x38060000,
+    0x38064000,
+    0x38068000,
+    0x3806c000,
+    0x38070000,
+    0x38074000,
+    0x38078000,
+    0x3807c000,
+    0x38080000,
+    0x38084000,
+    0x38088000,
+    0x3808c000,
+    0x38090000,
+    0x38094000,
+    0x38098000,
+    0x3809c000,
+    0x380a0000,
+    0x380a4000,
+    0x380a8000,
+    0x380ac000,
+    0x380b0000,
+    0x380b4000,
+    0x380b8000,
+    0x380bc000,
+    0x380c0000,
+    0x380c4000,
+    0x380c8000,
+    0x380cc000,
+    0x380d0000,
+    0x380d4000,
+    0x380d8000,
+    0x380dc000,
+    0x380e0000,
+    0x380e4000,
+    0x380e8000,
+    0x380ec000,
+    0x380f0000,
+    0x380f4000,
+    0x380f8000,
+    0x380fc000,
+    0x38100000,
+    0x38104000,
+    0x38108000,
+    0x3810c000,
+    0x38110000,
+    0x38114000,
+    0x38118000,
+    0x3811c000,
+    0x38120000,
+    0x38124000,
+    0x38128000,
+    0x3812c000,
+    0x38130000,
+    0x38134000,
+    0x38138000,
+    0x3813c000,
+    0x38140000,
+    0x38144000,
+    0x38148000,
+    0x3814c000,
+    0x38150000,
+    0x38154000,
+    0x38158000,
+    0x3815c000,
+    0x38160000,
+    0x38164000,
+    0x38168000,
+    0x3816c000,
+    0x38170000,
+    0x38174000,
+    0x38178000,
+    0x3817c000,
+    0x38180000,
+    0x38184000,
+    0x38188000,
+    0x3818c000,
+    0x38190000,
+    0x38194000,
+    0x38198000,
+    0x3819c000,
+    0x381a0000,
+    0x381a4000,
+    0x381a8000,
+    0x381ac000,
+    0x381b0000,
+    0x381b4000,
+    0x381b8000,
+    0x381bc000,
+    0x381c0000,
+    0x381c4000,
+    0x381c8000,
+    0x381cc000,
+    0x381d0000,
+    0x381d4000,
+    0x381d8000,
+    0x381dc000,
+    0x381e0000,
+    0x381e4000,
+    0x381e8000,
+    0x381ec000,
+    0x381f0000,
+    0x381f4000,
+    0x381f8000,
+    0x381fc000,
+    0x38200000,
+    0x38204000,
+    0x38208000,
+    0x3820c000,
+    0x38210000,
+    0x38214000,
+    0x38218000,
+    0x3821c000,
+    0x38220000,
+    0x38224000,
+    0x38228000,
+    0x3822c000,
+    0x38230000,
+    0x38234000,
+    0x38238000,
+    0x3823c000,
+    0x38240000,
+    0x38244000,
+    0x38248000,
+    0x3824c000,
+    0x38250000,
+    0x38254000,
+    0x38258000,
+    0x3825c000,
+    0x38260000,
+    0x38264000,
+    0x38268000,
+    0x3826c000,
+    0x38270000,
+    0x38274000,
+    0x38278000,
+    0x3827c000,
+    0x38280000,
+    0x38284000,
+    0x38288000,
+    0x3828c000,
+    0x38290000,
+    0x38294000,
+    0x38298000,
+    0x3829c000,
+    0x382a0000,
+    0x382a4000,
+    0x382a8000,
+    0x382ac000,
+    0x382b0000,
+    0x382b4000,
+    0x382b8000,
+    0x382bc000,
+    0x382c0000,
+    0x382c4000,
+    0x382c8000,
+    0x382cc000,
+    0x382d0000,
+    0x382d4000,
+    0x382d8000,
+    0x382dc000,
+    0x382e0000,
+    0x382e4000,
+    0x382e8000,
+    0x382ec000,
+    0x382f0000,
+    0x382f4000,
+    0x382f8000,
+    0x382fc000,
+    0x38300000,
+    0x38304000,
+    0x38308000,
+    0x3830c000,
+    0x38310000,
+    0x38314000,
+    0x38318000,
+    0x3831c000,
+    0x38320000,
+    0x38324000,
+    0x38328000,
+    0x3832c000,
+    0x38330000,
+    0x38334000,
+    0x38338000,
+    0x3833c000,
+    0x38340000,
+    0x38344000,
+    0x38348000,
+    0x3834c000,
+    0x38350000,
+    0x38354000,
+    0x38358000,
+    0x3835c000,
+    0x38360000,
+    0x38364000,
+    0x38368000,
+    0x3836c000,
+    0x38370000,
+    0x38374000,
+    0x38378000,
+    0x3837c000,
+    0x38380000,
+    0x38384000,
+    0x38388000,
+    0x3838c000,
+    0x38390000,
+    0x38394000,
+    0x38398000,
+    0x3839c000,
+    0x383a0000,
+    0x383a4000,
+    0x383a8000,
+    0x383ac000,
+    0x383b0000,
+    0x383b4000,
+    0x383b8000,
+    0x383bc000,
+    0x383c0000,
+    0x383c4000,
+    0x383c8000,
+    0x383cc000,
+    0x383d0000,
+    0x383d4000,
+    0x383d8000,
+    0x383dc000,
+    0x383e0000,
+    0x383e4000,
+    0x383e8000,
+    0x383ec000,
+    0x383f0000,
+    0x383f4000,
+    0x383f8000,
+    0x383fc000,
+    0x38400000,
+    0x38404000,
+    0x38408000,
+    0x3840c000,
+    0x38410000,
+    0x38414000,
+    0x38418000,
+    0x3841c000,
+    0x38420000,
+    0x38424000,
+    0x38428000,
+    0x3842c000,
+    0x38430000,
+    0x38434000,
+    0x38438000,
+    0x3843c000,
+    0x38440000,
+    0x38444000,
+    0x38448000,
+    0x3844c000,
+    0x38450000,
+    0x38454000,
+    0x38458000,
+    0x3845c000,
+    0x38460000,
+    0x38464000,
+    0x38468000,
+    0x3846c000,
+    0x38470000,
+    0x38474000,
+    0x38478000,
+    0x3847c000,
+    0x38480000,
+    0x38484000,
+    0x38488000,
+    0x3848c000,
+    0x38490000,
+    0x38494000,
+    0x38498000,
+    0x3849c000,
+    0x384a0000,
+    0x384a4000,
+    0x384a8000,
+    0x384ac000,
+    0x384b0000,
+    0x384b4000,
+    0x384b8000,
+    0x384bc000,
+    0x384c0000,
+    0x384c4000,
+    0x384c8000,
+    0x384cc000,
+    0x384d0000,
+    0x384d4000,
+    0x384d8000,
+    0x384dc000,
+    0x384e0000,
+    0x384e4000,
+    0x384e8000,
+    0x384ec000,
+    0x384f0000,
+    0x384f4000,
+    0x384f8000,
+    0x384fc000,
+    0x38500000,
+    0x38504000,
+    0x38508000,
+    0x3850c000,
+    0x38510000,
+    0x38514000,
+    0x38518000,
+    0x3851c000,
+    0x38520000,
+    0x38524000,
+    0x38528000,
+    0x3852c000,
+    0x38530000,
+    0x38534000,
+    0x38538000,
+    0x3853c000,
+    0x38540000,
+    0x38544000,
+    0x38548000,
+    0x3854c000,
+    0x38550000,
+    0x38554000,
+    0x38558000,
+    0x3855c000,
+    0x38560000,
+    0x38564000,
+    0x38568000,
+    0x3856c000,
+    0x38570000,
+    0x38574000,
+    0x38578000,
+    0x3857c000,
+    0x38580000,
+    0x38584000,
+    0x38588000,
+    0x3858c000,
+    0x38590000,
+    0x38594000,
+    0x38598000,
+    0x3859c000,
+    0x385a0000,
+    0x385a4000,
+    0x385a8000,
+    0x385ac000,
+    0x385b0000,
+    0x385b4000,
+    0x385b8000,
+    0x385bc000,
+    0x385c0000,
+    0x385c4000,
+    0x385c8000,
+    0x385cc000,
+    0x385d0000,
+    0x385d4000,
+    0x385d8000,
+    0x385dc000,
+    0x385e0000,
+    0x385e4000,
+    0x385e8000,
+    0x385ec000,
+    0x385f0000,
+    0x385f4000,
+    0x385f8000,
+    0x385fc000,
+    0x38600000,
+    0x38604000,
+    0x38608000,
+    0x3860c000,
+    0x38610000,
+    0x38614000,
+    0x38618000,
+    0x3861c000,
+    0x38620000,
+    0x38624000,
+    0x38628000,
+    0x3862c000,
+    0x38630000,
+    0x38634000,
+    0x38638000,
+    0x3863c000,
+    0x38640000,
+    0x38644000,
+    0x38648000,
+    0x3864c000,
+    0x38650000,
+    0x38654000,
+    0x38658000,
+    0x3865c000,
+    0x38660000,
+    0x38664000,
+    0x38668000,
+    0x3866c000,
+    0x38670000,
+    0x38674000,
+    0x38678000,
+    0x3867c000,
+    0x38680000,
+    0x38684000,
+    0x38688000,
+    0x3868c000,
+    0x38690000,
+    0x38694000,
+    0x38698000,
+    0x3869c000,
+    0x386a0000,
+    0x386a4000,
+    0x386a8000,
+    0x386ac000,
+    0x386b0000,
+    0x386b4000,
+    0x386b8000,
+    0x386bc000,
+    0x386c0000,
+    0x386c4000,
+    0x386c8000,
+    0x386cc000,
+    0x386d0000,
+    0x386d4000,
+    0x386d8000,
+    0x386dc000,
+    0x386e0000,
+    0x386e4000,
+    0x386e8000,
+    0x386ec000,
+    0x386f0000,
+    0x386f4000,
+    0x386f8000,
+    0x386fc000,
+    0x38700000,
+    0x38704000,
+    0x38708000,
+    0x3870c000,
+    0x38710000,
+    0x38714000,
+    0x38718000,
+    0x3871c000,
+    0x38720000,
+    0x38724000,
+    0x38728000,
+    0x3872c000,
+    0x38730000,
+    0x38734000,
+    0x38738000,
+    0x3873c000,
+    0x38740000,
+    0x38744000,
+    0x38748000,
+    0x3874c000,
+    0x38750000,
+    0x38754000,
+    0x38758000,
+    0x3875c000,
+    0x38760000,
+    0x38764000,
+    0x38768000,
+    0x3876c000,
+    0x38770000,
+    0x38774000,
+    0x38778000,
+    0x3877c000,
+    0x38780000,
+    0x38784000,
+    0x38788000,
+    0x3878c000,
+    0x38790000,
+    0x38794000,
+    0x38798000,
+    0x3879c000,
+    0x387a0000,
+    0x387a4000,
+    0x387a8000,
+    0x387ac000,
+    0x387b0000,
+    0x387b4000,
+    0x387b8000,
+    0x387bc000,
+    0x387c0000,
+    0x387c4000,
+    0x387c8000,
+    0x387cc000,
+    0x387d0000,
+    0x387d4000,
+    0x387d8000,
+    0x387dc000,
+    0x387e0000,
+    0x387e4000,
+    0x387e8000,
+    0x387ec000,
+    0x387f0000,
+    0x387f4000,
+    0x387f8000,
+    0x387fc000,
+    0x38000000,
+    0x38002000,
+    0x38004000,
+    0x38006000,
+    0x38008000,
+    0x3800a000,
+    0x3800c000,
+    0x3800e000,
+    0x38010000,
+    0x38012000,
+    0x38014000,
+    0x38016000,
+    0x38018000,
+    0x3801a000,
+    0x3801c000,
+    0x3801e000,
+    0x38020000,
+    0x38022000,
+    0x38024000,
+    0x38026000,
+    0x38028000,
+    0x3802a000,
+    0x3802c000,
+    0x3802e000,
+    0x38030000,
+    0x38032000,
+    0x38034000,
+    0x38036000,
+    0x38038000,
+    0x3803a000,
+    0x3803c000,
+    0x3803e000,
+    0x38040000,
+    0x38042000,
+    0x38044000,
+    0x38046000,
+    0x38048000,
+    0x3804a000,
+    0x3804c000,
+    0x3804e000,
+    0x38050000,
+    0x38052000,
+    0x38054000,
+    0x38056000,
+    0x38058000,
+    0x3805a000,
+    0x3805c000,
+    0x3805e000,
+    0x38060000,
+    0x38062000,
+    0x38064000,
+    0x38066000,
+    0x38068000,
+    0x3806a000,
+    0x3806c000,
+    0x3806e000,
+    0x38070000,
+    0x38072000,
+    0x38074000,
+    0x38076000,
+    0x38078000,
+    0x3807a000,
+    0x3807c000,
+    0x3807e000,
+    0x38080000,
+    0x38082000,
+    0x38084000,
+    0x38086000,
+    0x38088000,
+    0x3808a000,
+    0x3808c000,
+    0x3808e000,
+    0x38090000,
+    0x38092000,
+    0x38094000,
+    0x38096000,
+    0x38098000,
+    0x3809a000,
+    0x3809c000,
+    0x3809e000,
+    0x380a0000,
+    0x380a2000,
+    0x380a4000,
+    0x380a6000,
+    0x380a8000,
+    0x380aa000,
+    0x380ac000,
+    0x380ae000,
+    0x380b0000,
+    0x380b2000,
+    0x380b4000,
+    0x380b6000,
+    0x380b8000,
+    0x380ba000,
+    0x380bc000,
+    0x380be000,
+    0x380c0000,
+    0x380c2000,
+    0x380c4000,
+    0x380c6000,
+    0x380c8000,
+    0x380ca000,
+    0x380cc000,
+    0x380ce000,
+    0x380d0000,
+    0x380d2000,
+    0x380d4000,
+    0x380d6000,
+    0x380d8000,
+    0x380da000,
+    0x380dc000,
+    0x380de000,
+    0x380e0000,
+    0x380e2000,
+    0x380e4000,
+    0x380e6000,
+    0x380e8000,
+    0x380ea000,
+    0x380ec000,
+    0x380ee000,
+    0x380f0000,
+    0x380f2000,
+    0x380f4000,
+    0x380f6000,
+    0x380f8000,
+    0x380fa000,
+    0x380fc000,
+    0x380fe000,
+    0x38100000,
+    0x38102000,
+    0x38104000,
+    0x38106000,
+    0x38108000,
+    0x3810a000,
+    0x3810c000,
+    0x3810e000,
+    0x38110000,
+    0x38112000,
+    0x38114000,
+    0x38116000,
+    0x38118000,
+    0x3811a000,
+    0x3811c000,
+    0x3811e000,
+    0x38120000,
+    0x38122000,
+    0x38124000,
+    0x38126000,
+    0x38128000,
+    0x3812a000,
+    0x3812c000,
+    0x3812e000,
+    0x38130000,
+    0x38132000,
+    0x38134000,
+    0x38136000,
+    0x38138000,
+    0x3813a000,
+    0x3813c000,
+    0x3813e000,
+    0x38140000,
+    0x38142000,
+    0x38144000,
+    0x38146000,
+    0x38148000,
+    0x3814a000,
+    0x3814c000,
+    0x3814e000,
+    0x38150000,
+    0x38152000,
+    0x38154000,
+    0x38156000,
+    0x38158000,
+    0x3815a000,
+    0x3815c000,
+    0x3815e000,
+    0x38160000,
+    0x38162000,
+    0x38164000,
+    0x38166000,
+    0x38168000,
+    0x3816a000,
+    0x3816c000,
+    0x3816e000,
+    0x38170000,
+    0x38172000,
+    0x38174000,
+    0x38176000,
+    0x38178000,
+    0x3817a000,
+    0x3817c000,
+    0x3817e000,
+    0x38180000,
+    0x38182000,
+    0x38184000,
+    0x38186000,
+    0x38188000,
+    0x3818a000,
+    0x3818c000,
+    0x3818e000,
+    0x38190000,
+    0x38192000,
+    0x38194000,
+    0x38196000,
+    0x38198000,
+    0x3819a000,
+    0x3819c000,
+    0x3819e000,
+    0x381a0000,
+    0x381a2000,
+    0x381a4000,
+    0x381a6000,
+    0x381a8000,
+    0x381aa000,
+    0x381ac000,
+    0x381ae000,
+    0x381b0000,
+    0x381b2000,
+    0x381b4000,
+    0x381b6000,
+    0x381b8000,
+    0x381ba000,
+    0x381bc000,
+    0x381be000,
+    0x381c0000,
+    0x381c2000,
+    0x381c4000,
+    0x381c6000,
+    0x381c8000,
+    0x381ca000,
+    0x381cc000,
+    0x381ce000,
+    0x381d0000,
+    0x381d2000,
+    0x381d4000,
+    0x381d6000,
+    0x381d8000,
+    0x381da000,
+    0x381dc000,
+    0x381de000,
+    0x381e0000,
+    0x381e2000,
+    0x381e4000,
+    0x381e6000,
+    0x381e8000,
+    0x381ea000,
+    0x381ec000,
+    0x381ee000,
+    0x381f0000,
+    0x381f2000,
+    0x381f4000,
+    0x381f6000,
+    0x381f8000,
+    0x381fa000,
+    0x381fc000,
+    0x381fe000,
+    0x38200000,
+    0x38202000,
+    0x38204000,
+    0x38206000,
+    0x38208000,
+    0x3820a000,
+    0x3820c000,
+    0x3820e000,
+    0x38210000,
+    0x38212000,
+    0x38214000,
+    0x38216000,
+    0x38218000,
+    0x3821a000,
+    0x3821c000,
+    0x3821e000,
+    0x38220000,
+    0x38222000,
+    0x38224000,
+    0x38226000,
+    0x38228000,
+    0x3822a000,
+    0x3822c000,
+    0x3822e000,
+    0x38230000,
+    0x38232000,
+    0x38234000,
+    0x38236000,
+    0x38238000,
+    0x3823a000,
+    0x3823c000,
+    0x3823e000,
+    0x38240000,
+    0x38242000,
+    0x38244000,
+    0x38246000,
+    0x38248000,
+    0x3824a000,
+    0x3824c000,
+    0x3824e000,
+    0x38250000,
+    0x38252000,
+    0x38254000,
+    0x38256000,
+    0x38258000,
+    0x3825a000,
+    0x3825c000,
+    0x3825e000,
+    0x38260000,
+    0x38262000,
+    0x38264000,
+    0x38266000,
+    0x38268000,
+    0x3826a000,
+    0x3826c000,
+    0x3826e000,
+    0x38270000,
+    0x38272000,
+    0x38274000,
+    0x38276000,
+    0x38278000,
+    0x3827a000,
+    0x3827c000,
+    0x3827e000,
+    0x38280000,
+    0x38282000,
+    0x38284000,
+    0x38286000,
+    0x38288000,
+    0x3828a000,
+    0x3828c000,
+    0x3828e000,
+    0x38290000,
+    0x38292000,
+    0x38294000,
+    0x38296000,
+    0x38298000,
+    0x3829a000,
+    0x3829c000,
+    0x3829e000,
+    0x382a0000,
+    0x382a2000,
+    0x382a4000,
+    0x382a6000,
+    0x382a8000,
+    0x382aa000,
+    0x382ac000,
+    0x382ae000,
+    0x382b0000,
+    0x382b2000,
+    0x382b4000,
+    0x382b6000,
+    0x382b8000,
+    0x382ba000,
+    0x382bc000,
+    0x382be000,
+    0x382c0000,
+    0x382c2000,
+    0x382c4000,
+    0x382c6000,
+    0x382c8000,
+    0x382ca000,
+    0x382cc000,
+    0x382ce000,
+    0x382d0000,
+    0x382d2000,
+    0x382d4000,
+    0x382d6000,
+    0x382d8000,
+    0x382da000,
+    0x382dc000,
+    0x382de000,
+    0x382e0000,
+    0x382e2000,
+    0x382e4000,
+    0x382e6000,
+    0x382e8000,
+    0x382ea000,
+    0x382ec000,
+    0x382ee000,
+    0x382f0000,
+    0x382f2000,
+    0x382f4000,
+    0x382f6000,
+    0x382f8000,
+    0x382fa000,
+    0x382fc000,
+    0x382fe000,
+    0x38300000,
+    0x38302000,
+    0x38304000,
+    0x38306000,
+    0x38308000,
+    0x3830a000,
+    0x3830c000,
+    0x3830e000,
+    0x38310000,
+    0x38312000,
+    0x38314000,
+    0x38316000,
+    0x38318000,
+    0x3831a000,
+    0x3831c000,
+    0x3831e000,
+    0x38320000,
+    0x38322000,
+    0x38324000,
+    0x38326000,
+    0x38328000,
+    0x3832a000,
+    0x3832c000,
+    0x3832e000,
+    0x38330000,
+    0x38332000,
+    0x38334000,
+    0x38336000,
+    0x38338000,
+    0x3833a000,
+    0x3833c000,
+    0x3833e000,
+    0x38340000,
+    0x38342000,
+    0x38344000,
+    0x38346000,
+    0x38348000,
+    0x3834a000,
+    0x3834c000,
+    0x3834e000,
+    0x38350000,
+    0x38352000,
+    0x38354000,
+    0x38356000,
+    0x38358000,
+    0x3835a000,
+    0x3835c000,
+    0x3835e000,
+    0x38360000,
+    0x38362000,
+    0x38364000,
+    0x38366000,
+    0x38368000,
+    0x3836a000,
+    0x3836c000,
+    0x3836e000,
+    0x38370000,
+    0x38372000,
+    0x38374000,
+    0x38376000,
+    0x38378000,
+    0x3837a000,
+    0x3837c000,
+    0x3837e000,
+    0x38380000,
+    0x38382000,
+    0x38384000,
+    0x38386000,
+    0x38388000,
+    0x3838a000,
+    0x3838c000,
+    0x3838e000,
+    0x38390000,
+    0x38392000,
+    0x38394000,
+    0x38396000,
+    0x38398000,
+    0x3839a000,
+    0x3839c000,
+    0x3839e000,
+    0x383a0000,
+    0x383a2000,
+    0x383a4000,
+    0x383a6000,
+    0x383a8000,
+    0x383aa000,
+    0x383ac000,
+    0x383ae000,
+    0x383b0000,
+    0x383b2000,
+    0x383b4000,
+    0x383b6000,
+    0x383b8000,
+    0x383ba000,
+    0x383bc000,
+    0x383be000,
+    0x383c0000,
+    0x383c2000,
+    0x383c4000,
+    0x383c6000,
+    0x383c8000,
+    0x383ca000,
+    0x383cc000,
+    0x383ce000,
+    0x383d0000,
+    0x383d2000,
+    0x383d4000,
+    0x383d6000,
+    0x383d8000,
+    0x383da000,
+    0x383dc000,
+    0x383de000,
+    0x383e0000,
+    0x383e2000,
+    0x383e4000,
+    0x383e6000,
+    0x383e8000,
+    0x383ea000,
+    0x383ec000,
+    0x383ee000,
+    0x383f0000,
+    0x383f2000,
+    0x383f4000,
+    0x383f6000,
+    0x383f8000,
+    0x383fa000,
+    0x383fc000,
+    0x383fe000,
+    0x38400000,
+    0x38402000,
+    0x38404000,
+    0x38406000,
+    0x38408000,
+    0x3840a000,
+    0x3840c000,
+    0x3840e000,
+    0x38410000,
+    0x38412000,
+    0x38414000,
+    0x38416000,
+    0x38418000,
+    0x3841a000,
+    0x3841c000,
+    0x3841e000,
+    0x38420000,
+    0x38422000,
+    0x38424000,
+    0x38426000,
+    0x38428000,
+    0x3842a000,
+    0x3842c000,
+    0x3842e000,
+    0x38430000,
+    0x38432000,
+    0x38434000,
+    0x38436000,
+    0x38438000,
+    0x3843a000,
+    0x3843c000,
+    0x3843e000,
+    0x38440000,
+    0x38442000,
+    0x38444000,
+    0x38446000,
+    0x38448000,
+    0x3844a000,
+    0x3844c000,
+    0x3844e000,
+    0x38450000,
+    0x38452000,
+    0x38454000,
+    0x38456000,
+    0x38458000,
+    0x3845a000,
+    0x3845c000,
+    0x3845e000,
+    0x38460000,
+    0x38462000,
+    0x38464000,
+    0x38466000,
+    0x38468000,
+    0x3846a000,
+    0x3846c000,
+    0x3846e000,
+    0x38470000,
+    0x38472000,
+    0x38474000,
+    0x38476000,
+    0x38478000,
+    0x3847a000,
+    0x3847c000,
+    0x3847e000,
+    0x38480000,
+    0x38482000,
+    0x38484000,
+    0x38486000,
+    0x38488000,
+    0x3848a000,
+    0x3848c000,
+    0x3848e000,
+    0x38490000,
+    0x38492000,
+    0x38494000,
+    0x38496000,
+    0x38498000,
+    0x3849a000,
+    0x3849c000,
+    0x3849e000,
+    0x384a0000,
+    0x384a2000,
+    0x384a4000,
+    0x384a6000,
+    0x384a8000,
+    0x384aa000,
+    0x384ac000,
+    0x384ae000,
+    0x384b0000,
+    0x384b2000,
+    0x384b4000,
+    0x384b6000,
+    0x384b8000,
+    0x384ba000,
+    0x384bc000,
+    0x384be000,
+    0x384c0000,
+    0x384c2000,
+    0x384c4000,
+    0x384c6000,
+    0x384c8000,
+    0x384ca000,
+    0x384cc000,
+    0x384ce000,
+    0x384d0000,
+    0x384d2000,
+    0x384d4000,
+    0x384d6000,
+    0x384d8000,
+    0x384da000,
+    0x384dc000,
+    0x384de000,
+    0x384e0000,
+    0x384e2000,
+    0x384e4000,
+    0x384e6000,
+    0x384e8000,
+    0x384ea000,
+    0x384ec000,
+    0x384ee000,
+    0x384f0000,
+    0x384f2000,
+    0x384f4000,
+    0x384f6000,
+    0x384f8000,
+    0x384fa000,
+    0x384fc000,
+    0x384fe000,
+    0x38500000,
+    0x38502000,
+    0x38504000,
+    0x38506000,
+    0x38508000,
+    0x3850a000,
+    0x3850c000,
+    0x3850e000,
+    0x38510000,
+    0x38512000,
+    0x38514000,
+    0x38516000,
+    0x38518000,
+    0x3851a000,
+    0x3851c000,
+    0x3851e000,
+    0x38520000,
+    0x38522000,
+    0x38524000,
+    0x38526000,
+    0x38528000,
+    0x3852a000,
+    0x3852c000,
+    0x3852e000,
+    0x38530000,
+    0x38532000,
+    0x38534000,
+    0x38536000,
+    0x38538000,
+    0x3853a000,
+    0x3853c000,
+    0x3853e000,
+    0x38540000,
+    0x38542000,
+    0x38544000,
+    0x38546000,
+    0x38548000,
+    0x3854a000,
+    0x3854c000,
+    0x3854e000,
+    0x38550000,
+    0x38552000,
+    0x38554000,
+    0x38556000,
+    0x38558000,
+    0x3855a000,
+    0x3855c000,
+    0x3855e000,
+    0x38560000,
+    0x38562000,
+    0x38564000,
+    0x38566000,
+    0x38568000,
+    0x3856a000,
+    0x3856c000,
+    0x3856e000,
+    0x38570000,
+    0x38572000,
+    0x38574000,
+    0x38576000,
+    0x38578000,
+    0x3857a000,
+    0x3857c000,
+    0x3857e000,
+    0x38580000,
+    0x38582000,
+    0x38584000,
+    0x38586000,
+    0x38588000,
+    0x3858a000,
+    0x3858c000,
+    0x3858e000,
+    0x38590000,
+    0x38592000,
+    0x38594000,
+    0x38596000,
+    0x38598000,
+    0x3859a000,
+    0x3859c000,
+    0x3859e000,
+    0x385a0000,
+    0x385a2000,
+    0x385a4000,
+    0x385a6000,
+    0x385a8000,
+    0x385aa000,
+    0x385ac000,
+    0x385ae000,
+    0x385b0000,
+    0x385b2000,
+    0x385b4000,
+    0x385b6000,
+    0x385b8000,
+    0x385ba000,
+    0x385bc000,
+    0x385be000,
+    0x385c0000,
+    0x385c2000,
+    0x385c4000,
+    0x385c6000,
+    0x385c8000,
+    0x385ca000,
+    0x385cc000,
+    0x385ce000,
+    0x385d0000,
+    0x385d2000,
+    0x385d4000,
+    0x385d6000,
+    0x385d8000,
+    0x385da000,
+    0x385dc000,
+    0x385de000,
+    0x385e0000,
+    0x385e2000,
+    0x385e4000,
+    0x385e6000,
+    0x385e8000,
+    0x385ea000,
+    0x385ec000,
+    0x385ee000,
+    0x385f0000,
+    0x385f2000,
+    0x385f4000,
+    0x385f6000,
+    0x385f8000,
+    0x385fa000,
+    0x385fc000,
+    0x385fe000,
+    0x38600000,
+    0x38602000,
+    0x38604000,
+    0x38606000,
+    0x38608000,
+    0x3860a000,
+    0x3860c000,
+    0x3860e000,
+    0x38610000,
+    0x38612000,
+    0x38614000,
+    0x38616000,
+    0x38618000,
+    0x3861a000,
+    0x3861c000,
+    0x3861e000,
+    0x38620000,
+    0x38622000,
+    0x38624000,
+    0x38626000,
+    0x38628000,
+    0x3862a000,
+    0x3862c000,
+    0x3862e000,
+    0x38630000,
+    0x38632000,
+    0x38634000,
+    0x38636000,
+    0x38638000,
+    0x3863a000,
+    0x3863c000,
+    0x3863e000,
+    0x38640000,
+    0x38642000,
+    0x38644000,
+    0x38646000,
+    0x38648000,
+    0x3864a000,
+    0x3864c000,
+    0x3864e000,
+    0x38650000,
+    0x38652000,
+    0x38654000,
+    0x38656000,
+    0x38658000,
+    0x3865a000,
+    0x3865c000,
+    0x3865e000,
+    0x38660000,
+    0x38662000,
+    0x38664000,
+    0x38666000,
+    0x38668000,
+    0x3866a000,
+    0x3866c000,
+    0x3866e000,
+    0x38670000,
+    0x38672000,
+    0x38674000,
+    0x38676000,
+    0x38678000,
+    0x3867a000,
+    0x3867c000,
+    0x3867e000,
+    0x38680000,
+    0x38682000,
+    0x38684000,
+    0x38686000,
+    0x38688000,
+    0x3868a000,
+    0x3868c000,
+    0x3868e000,
+    0x38690000,
+    0x38692000,
+    0x38694000,
+    0x38696000,
+    0x38698000,
+    0x3869a000,
+    0x3869c000,
+    0x3869e000,
+    0x386a0000,
+    0x386a2000,
+    0x386a4000,
+    0x386a6000,
+    0x386a8000,
+    0x386aa000,
+    0x386ac000,
+    0x386ae000,
+    0x386b0000,
+    0x386b2000,
+    0x386b4000,
+    0x386b6000,
+    0x386b8000,
+    0x386ba000,
+    0x386bc000,
+    0x386be000,
+    0x386c0000,
+    0x386c2000,
+    0x386c4000,
+    0x386c6000,
+    0x386c8000,
+    0x386ca000,
+    0x386cc000,
+    0x386ce000,
+    0x386d0000,
+    0x386d2000,
+    0x386d4000,
+    0x386d6000,
+    0x386d8000,
+    0x386da000,
+    0x386dc000,
+    0x386de000,
+    0x386e0000,
+    0x386e2000,
+    0x386e4000,
+    0x386e6000,
+    0x386e8000,
+    0x386ea000,
+    0x386ec000,
+    0x386ee000,
+    0x386f0000,
+    0x386f2000,
+    0x386f4000,
+    0x386f6000,
+    0x386f8000,
+    0x386fa000,
+    0x386fc000,
+    0x386fe000,
+    0x38700000,
+    0x38702000,
+    0x38704000,
+    0x38706000,
+    0x38708000,
+    0x3870a000,
+    0x3870c000,
+    0x3870e000,
+    0x38710000,
+    0x38712000,
+    0x38714000,
+    0x38716000,
+    0x38718000,
+    0x3871a000,
+    0x3871c000,
+    0x3871e000,
+    0x38720000,
+    0x38722000,
+    0x38724000,
+    0x38726000,
+    0x38728000,
+    0x3872a000,
+    0x3872c000,
+    0x3872e000,
+    0x38730000,
+    0x38732000,
+    0x38734000,
+    0x38736000,
+    0x38738000,
+    0x3873a000,
+    0x3873c000,
+    0x3873e000,
+    0x38740000,
+    0x38742000,
+    0x38744000,
+    0x38746000,
+    0x38748000,
+    0x3874a000,
+    0x3874c000,
+    0x3874e000,
+    0x38750000,
+    0x38752000,
+    0x38754000,
+    0x38756000,
+    0x38758000,
+    0x3875a000,
+    0x3875c000,
+    0x3875e000,
+    0x38760000,
+    0x38762000,
+    0x38764000,
+    0x38766000,
+    0x38768000,
+    0x3876a000,
+    0x3876c000,
+    0x3876e000,
+    0x38770000,
+    0x38772000,
+    0x38774000,
+    0x38776000,
+    0x38778000,
+    0x3877a000,
+    0x3877c000,
+    0x3877e000,
+    0x38780000,
+    0x38782000,
+    0x38784000,
+    0x38786000,
+    0x38788000,
+    0x3878a000,
+    0x3878c000,
+    0x3878e000,
+    0x38790000,
+    0x38792000,
+    0x38794000,
+    0x38796000,
+    0x38798000,
+    0x3879a000,
+    0x3879c000,
+    0x3879e000,
+    0x387a0000,
+    0x387a2000,
+    0x387a4000,
+    0x387a6000,
+    0x387a8000,
+    0x387aa000,
+    0x387ac000,
+    0x387ae000,
+    0x387b0000,
+    0x387b2000,
+    0x387b4000,
+    0x387b6000,
+    0x387b8000,
+    0x387ba000,
+    0x387bc000,
+    0x387be000,
+    0x387c0000,
+    0x387c2000,
+    0x387c4000,
+    0x387c6000,
+    0x387c8000,
+    0x387ca000,
+    0x387cc000,
+    0x387ce000,
+    0x387d0000,
+    0x387d2000,
+    0x387d4000,
+    0x387d6000,
+    0x387d8000,
+    0x387da000,
+    0x387dc000,
+    0x387de000,
+    0x387e0000,
+    0x387e2000,
+    0x387e4000,
+    0x387e6000,
+    0x387e8000,
+    0x387ea000,
+    0x387ec000,
+    0x387ee000,
+    0x387f0000,
+    0x387f2000,
+    0x387f4000,
+    0x387f6000,
+    0x387f8000,
+    0x387fa000,
+    0x387fc000,
+    0x387fe000,
+};
+
+const static unsigned g_exponent[64] = {
+    0x00000000,
+    0x00800000,
+    0x01000000,
+    0x01800000,
+    0x02000000,
+    0x02800000,
+    0x03000000,
+    0x03800000,
+    0x04000000,
+    0x04800000,
+    0x05000000,
+    0x05800000,
+    0x06000000,
+    0x06800000,
+    0x07000000,
+    0x07800000,
+    0x08000000,
+    0x08800000,
+    0x09000000,
+    0x09800000,
+    0x0a000000,
+    0x0a800000,
+    0x0b000000,
+    0x0b800000,
+    0x0c000000,
+    0x0c800000,
+    0x0d000000,
+    0x0d800000,
+    0x0e000000,
+    0x0e800000,
+    0x0f000000,
+    0x47800000,
+    0x80000000,
+    0x80800000,
+    0x81000000,
+    0x81800000,
+    0x82000000,
+    0x82800000,
+    0x83000000,
+    0x83800000,
+    0x84000000,
+    0x84800000,
+    0x85000000,
+    0x85800000,
+    0x86000000,
+    0x86800000,
+    0x87000000,
+    0x87800000,
+    0x88000000,
+    0x88800000,
+    0x89000000,
+    0x89800000,
+    0x8a000000,
+    0x8a800000,
+    0x8b000000,
+    0x8b800000,
+    0x8c000000,
+    0x8c800000,
+    0x8d000000,
+    0x8d800000,
+    0x8e000000,
+    0x8e800000,
+    0x8f000000,
+    0xc7800000,
+};
+
+const static unsigned g_offset[64] = {
+    0x00000000,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000000,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+    0x00000400,
+};
+
+float float16ToFloat32(unsigned short h)
+{
+    unsigned i32 = g_mantissa[g_offset[h &gt;&gt; 10] + (h &amp; 0x3ff)] + g_exponent[h &gt;&gt; 10];
+    return bitCast&lt;float&gt;(i32);
+}
+}
+
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonFloat16ToFloat32py"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.py (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.py                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/common/Float16ToFloat32.py        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,80 @@
</span><ins>+# Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+
+# This script generates a function that converts 16-bit precision floating
+# point numbers to 32-bit.
+# It is based on ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf.
+
+#include &quot;common/mathutil.h&quot;
+
+def convertMantissa(i):
+    if i == 0:
+        return 0
+    elif i &lt; 1024:
+        m = i &lt;&lt; 13
+        e = 0
+        while not (m &amp; 0x00800000):
+            e -= 0x00800000
+            m = m &lt;&lt; 1
+        m &amp;= ~0x00800000
+        e += 0x38800000
+        return m | e
+    else:
+        return 0x38000000 + ((i - 1024) &lt;&lt; 13)
+
+def convertExponent(i):
+    if i == 0:
+        return 0
+    elif i in range(1, 31):
+        return i &lt;&lt; 23
+    elif i == 31:
+        return 0x47800000
+    elif i == 32:
+        return 0x80000000
+    elif i in range(33, 63):
+        return 0x80000000 + ((i - 32) &lt;&lt; 23)
+    else:
+        return 0xC7800000
+
+def convertOffset(i):
+    if i == 0 or i == 32:
+        return 0
+    else:
+        return 1024
+
+print &quot;&quot;&quot;//
+// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// This file is automatically generated.
+
+namespace gl
+{
+&quot;&quot;&quot;
+
+print &quot;const static unsigned g_mantissa[2048] = {&quot;
+for i in range(0, 2048):
+    print &quot;    %#010x,&quot; % convertMantissa(i)
+print &quot;};\n&quot;
+
+print &quot;const static unsigned g_exponent[64] = {&quot;
+for i in range(0, 64):
+    print &quot;    %#010x,&quot; % convertExponent(i)
+print &quot;};\n&quot;
+
+print &quot;const static unsigned g_offset[64] = {&quot;
+for i in range(0, 64):
+    print &quot;    %#010x,&quot; % convertOffset(i)
+print &quot;};\n&quot;
+
+print &quot;&quot;&quot;float float16ToFloat32(unsigned short h)
+{
+    unsigned i32 = g_mantissa[g_offset[h &gt;&gt; 10] + (h &amp; 0x3ff)] + g_exponent[h &gt;&gt; 10];
+    return bitCast&lt;float&gt;(i32);
+}
+}
+&quot;&quot;&quot;
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonOptionalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/Optional.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/Optional.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/Optional.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -42,16 +42,20 @@
</span><span class="cx">         return *this;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void reset()
</del><ins>+    Optional &amp;operator=(T &amp;&amp;value)
</ins><span class="cx">     {
</span><del>-        mValid = false;
</del><ins>+        mValue = std::move(value);
+        mValid = true;
+        return *this;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static Optional None()
</del><ins>+    void reset()
</ins><span class="cx">     {
</span><del>-        return Optional();
</del><ins>+        mValid = false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    static Optional Invalid() { return Optional(); }
+
</ins><span class="cx">     bool valid() const { return mValid; }
</span><span class="cx">     const T &amp;value() const { return mValue; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonOptional_unittestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/Optional_unittest.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/Optional_unittest.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/Optional_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx"> {
</span><span class="cx">     Optional&lt;int&gt; testInvalid;
</span><span class="cx">     ASSERT_FALSE(testInvalid.valid());
</span><del>-    ASSERT_EQ(Optional&lt;int&gt;::None(), testInvalid);
</del><ins>+    ASSERT_EQ(Optional&lt;int&gt;::Invalid(), testInvalid);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TEST(OptionalTest, BasicValid)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx">     Optional&lt;int&gt; testValid(3);
</span><span class="cx">     ASSERT_TRUE(testValid.valid());
</span><span class="cx">     ASSERT_EQ(3, testValid.value());
</span><del>-    ASSERT_NE(Optional&lt;int&gt;::None(), testValid);
</del><ins>+    ASSERT_NE(Optional&lt;int&gt;::Invalid(), testValid);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TEST(OptionalTest, Copies)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonangleutilscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/angleutils.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/angleutils.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/angleutils.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,8 +8,15 @@
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;stdio.h&gt;
</span><ins>+
+#include &lt;limits&gt;
</ins><span class="cx"> #include &lt;vector&gt;
</span><span class="cx"> 
</span><ins>+namespace angle
+{
+const uintptr_t DirtyPointer = std::numeric_limits&lt;uintptr_t&gt;::max();
+}
+
</ins><span class="cx"> size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector&lt;char&gt;&amp; outBuffer)
</span><span class="cx"> {
</span><span class="cx">     // Attempt to just print to the current buffer
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonangleutilsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/angleutils.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/angleutils.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/angleutils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx">     void operator=(const NonCopyable&amp;) = delete;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+extern const uintptr_t DirtyPointer;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename T, size_t N&gt;
</span><span class="lines">@@ -70,9 +71,9 @@
</span><span class="cx"> template &lt;typename T&gt;
</span><span class="cx"> void SafeDeleteContainer(T&amp; resource)
</span><span class="cx"> {
</span><del>-    for (typename T::iterator i = resource.begin(); i != resource.end(); i++)
</del><ins>+    for (auto &amp;element : resource)
</ins><span class="cx">     {
</span><del>-        SafeDelete(*i);
</del><ins>+        SafeDelete(element);
</ins><span class="cx">     }
</span><span class="cx">     resource.clear();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommondebugcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/debug.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/debug.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/debug.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -44,16 +44,16 @@
</span><span class="cx">           case DebugTraceOutputTypeNone:
</span><span class="cx">             break;
</span><span class="cx">           case DebugTraceOutputTypeBeginEvent:
</span><del>-            g_debugAnnotator-&gt;beginEvent(formattedWideMessage);
</del><ins>+            g_debugAnnotator-&gt;beginEvent(formattedWideMessage.c_str());
</ins><span class="cx">             break;
</span><span class="cx">           case DebugTraceOutputTypeSetMarker:
</span><del>-            g_debugAnnotator-&gt;setMarker(formattedWideMessage);
</del><ins>+            g_debugAnnotator-&gt;setMarker(formattedWideMessage.c_str());
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     std::string formattedMessage;
</span><del>-    UNUSED_TRACE_VARIABLE(formattedMessage);
</del><ins>+    UNUSED_VARIABLE(formattedMessage);
</ins><span class="cx"> 
</span><span class="cx"> #if !defined(NDEBUG) &amp;&amp; defined(_MSC_VER)
</span><span class="cx">     if (messageType == MESSAGE_ERR)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommondebugh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/debug.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/debug.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/debug.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #if !defined(TRACE_OUTPUT_FILE)
</span><del>-#define TRACE_OUTPUT_FILE &quot;debug.txt&quot;
</del><ins>+#define TRACE_OUTPUT_FILE &quot;angle_debug.txt&quot;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="lines">@@ -47,9 +47,9 @@
</span><span class="cx">   public:
</span><span class="cx">     DebugAnnotator() { };
</span><span class="cx">     virtual ~DebugAnnotator() { };
</span><del>-    virtual void beginEvent(const std::wstring &amp;eventName) = 0;
</del><ins>+    virtual void beginEvent(const wchar_t *eventName) = 0;
</ins><span class="cx">     virtual void endEvent() = 0;
</span><del>-    virtual void setMarker(const std::wstring &amp;markerName) = 0;
</del><ins>+    virtual void setMarker(const wchar_t *markerName) = 0;
</ins><span class="cx">     virtual bool getStatus() = 0;
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -63,6 +63,8 @@
</span><span class="cx"> #define ANGLE_TRACE_ENABLED
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#define ANGLE_EMPTY_STATEMENT for (;;) break
+
</ins><span class="cx"> // A macro to output a trace of a function call and its arguments to the debugging log
</span><span class="cx"> #if defined(ANGLE_TRACE_ENABLED)
</span><span class="cx"> #define TRACE(message, ...) gl::trace(true, gl::MESSAGE_TRACE, &quot;trace: %s(%d): &quot; message &quot;\n&quot;, __FUNCTION__, __LINE__, ##__VA_ARGS__)
</span><span class="lines">@@ -89,7 +91,7 @@
</span><span class="cx"> #if defined(_MSC_VER)
</span><span class="cx"> #define EVENT(message, ...) gl::ScopedPerfEventHelper scopedPerfEventHelper ## __LINE__(&quot;%s&quot; message &quot;\n&quot;, __FUNCTION__, __VA_ARGS__);
</span><span class="cx"> #else
</span><del>-#define EVENT(message, ...) gl::ScopedPerfEventHelper scopedPerfEventHelper(message &quot;\n&quot;, ##__VA_ARGS__);
</del><ins>+#define EVENT(message, ...) gl::ScopedPerfEventHelper scopedPerfEventHelper(&quot;%s&quot; message &quot;\n&quot;, __FUNCTION__, ##__VA_ARGS__);
</ins><span class="cx"> #endif // _MSC_VER
</span><span class="cx"> #else
</span><span class="cx"> #define EVENT(message, ...) (void(0))
</span><span class="lines">@@ -101,22 +103,18 @@
</span><span class="cx"> 
</span><span class="cx"> // A macro asserting a condition and outputting failures to the debug log
</span><span class="cx"> #if !defined(NDEBUG)
</span><del>-#define ASSERT(expression) do { \
</del><ins>+#define ASSERT(expression) { \
</ins><span class="cx">     if(!(expression)) \
</span><del>-        ERR(&quot;\t! Assert failed in %s(%d): &quot;#expression&quot;\n&quot;, __FUNCTION__, __LINE__); \
</del><ins>+        ERR(&quot;\t! Assert failed in %s(%d): %s\n&quot;, __FUNCTION__, __LINE__, #expression); \
</ins><span class="cx">         assert(expression); \
</span><del>-    } while(0)
</del><ins>+    } ANGLE_EMPTY_STATEMENT
</ins><span class="cx"> #define UNUSED_ASSERTION_VARIABLE(variable)
</span><span class="cx"> #else
</span><span class="cx"> #define ASSERT(expression) (void(0))
</span><span class="cx"> #define UNUSED_ASSERTION_VARIABLE(variable) ((void)variable)
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#ifndef ANGLE_ENABLE_DEBUG_TRACE
-#define UNUSED_TRACE_VARIABLE(variable) ((void)variable)
-#else
-#define UNUSED_TRACE_VARIABLE(variable)
-#endif
</del><ins>+#define UNUSED_VARIABLE(variable) ((void)variable)
</ins><span class="cx"> 
</span><span class="cx"> // A macro to indicate unimplemented functionality
</span><span class="cx"> 
</span><span class="lines">@@ -131,20 +129,20 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if !defined(NDEBUG)
</span><del>-#define UNIMPLEMENTED() do { \
</del><ins>+#define UNIMPLEMENTED() { \
</ins><span class="cx">     FIXME(&quot;\t! Unimplemented: %s(%d)\n&quot;, __FUNCTION__, __LINE__); \
</span><span class="cx">     assert(NOASSERT_UNIMPLEMENTED); \
</span><del>-    } while(0)
</del><ins>+    } ANGLE_EMPTY_STATEMENT
</ins><span class="cx"> #else
</span><span class="cx">     #define UNIMPLEMENTED() FIXME(&quot;\t! Unimplemented: %s(%d)\n&quot;, __FUNCTION__, __LINE__)
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> // A macro for code which is not expected to be reached under valid assumptions
</span><span class="cx"> #if !defined(NDEBUG)
</span><del>-#define UNREACHABLE() do { \
</del><ins>+#define UNREACHABLE() { \
</ins><span class="cx">     ERR(&quot;\t! Unreachable reached: %s(%d)\n&quot;, __FUNCTION__, __LINE__); \
</span><span class="cx">     assert(false); \
</span><del>-    } while(0)
</del><ins>+    } ANGLE_EMPTY_STATEMENT
</ins><span class="cx"> #else
</span><span class="cx">     #define UNREACHABLE() ERR(&quot;\t! Unreachable reached: %s(%d)\n&quot;, __FUNCTION__, __LINE__)
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonmathutilcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/mathutil.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/mathutil.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/mathutil.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx">     output.B = static_cast&lt;unsigned int&gt;(floor((blue_c / (pow(2.0f, exp_s - g_sharedexp_bias - g_sharedexp_mantissabits))) + 0.5f));
</span><span class="cx">     output.E = exp_s;
</span><span class="cx"> 
</span><del>-    return *reinterpret_cast&lt;unsigned int*&gt;(&amp;output);
</del><ins>+    return bitCast&lt;unsigned int&gt;(output);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void convert999E5toRGBFloats(unsigned int input, float *red, float *green, float *blue)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonmathutilh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/mathutil.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/mathutil.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/mathutil.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,7 +14,9 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;limits&gt;
</span><span class="cx"> #include &lt;algorithm&gt;
</span><ins>+#include &lt;math.h&gt;
</ins><span class="cx"> #include &lt;string.h&gt;
</span><ins>+#include &lt;stdint.h&gt;
</ins><span class="cx"> #include &lt;stdlib.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="lines">@@ -67,14 +69,29 @@
</span><span class="cx"> template &lt;typename DestT, typename SrcT&gt;
</span><span class="cx"> inline DestT clampCast(SrcT value)
</span><span class="cx"> {
</span><del>-    // This assumes SrcT can properly represent DestT::min/max
-    // Unfortunately we can't use META_ASSERT without C++11 constexpr support
-    ASSERT(static_cast&lt;DestT&gt;(static_cast&lt;SrcT&gt;(std::numeric_limits&lt;DestT&gt;::min())) == std::numeric_limits&lt;DestT&gt;::min());
-    ASSERT(static_cast&lt;DestT&gt;(static_cast&lt;SrcT&gt;(std::numeric_limits&lt;DestT&gt;::max())) == std::numeric_limits&lt;DestT&gt;::max());
</del><ins>+    static const DestT destLo = std::numeric_limits&lt;DestT&gt;::min();
+    static const DestT destHi = std::numeric_limits&lt;DestT&gt;::max();
+    static const SrcT srcLo = static_cast&lt;SrcT&gt;(destLo);
+    static const SrcT srcHi = static_cast&lt;SrcT&gt;(destHi);
</ins><span class="cx"> 
</span><del>-    SrcT lo = static_cast&lt;SrcT&gt;(std::numeric_limits&lt;DestT&gt;::min());
-    SrcT hi = static_cast&lt;SrcT&gt;(std::numeric_limits&lt;DestT&gt;::max());
-    return static_cast&lt;DestT&gt;(value &gt; lo ? (value &gt; hi ? hi : value) : lo);
</del><ins>+    // When value is outside of or equal to the limits for DestT we use the DestT limit directly.
+    // This avoids undefined behaviors due to loss of precision when converting from floats to
+    // integers:
+    //    destHi for ints is 2147483647 but the closest float number is around 2147483648, so when
+    //  doing a conversion from float to int we run into an UB because the float is outside of the
+    //  range representable by the int.
+    if (value &lt;= srcLo)
+    {
+        return destLo;
+    }
+    else if (value &gt;= srcHi)
+    {
+        return destHi;
+    }
+    else
+    {
+        return static_cast&lt;DestT&gt;(value);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T, typename MIN, typename MAX&gt;
</span><span class="lines">@@ -149,7 +166,7 @@
</span><span class="cx"> 
</span><span class="cx"> inline unsigned short float32ToFloat16(float fp32)
</span><span class="cx"> {
</span><del>-    unsigned int fp32i = (unsigned int&amp;)fp32;
</del><ins>+    unsigned int fp32i = bitCast&lt;unsigned int&gt;(fp32);
</ins><span class="cx">     unsigned int sign = (fp32i &amp; 0x80000000) &gt;&gt; 16;
</span><span class="cx">     unsigned int abs = fp32i &amp; 0x7FFFFFFF;
</span><span class="cx"> 
</span><span class="lines">@@ -476,9 +493,10 @@
</span><span class="cx">     return ((a ^ b) &gt;&gt; 1) + (a &amp; b);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline signed int average(signed int a, signed int b)
</del><ins>+inline int average(int a, int b)
</ins><span class="cx"> {
</span><del>-    return (signed int)((long long)a + (long long)b) / 2;
</del><ins>+    long long average = (static_cast&lt;long long&gt;(a) + static_cast&lt;long long&gt;(b)) / 2ll;
+    return static_cast&lt;int&gt;(average);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline float average(float a, float b)
</span><span class="lines">@@ -501,12 +519,6 @@
</span><span class="cx">     return float32ToFloat10((float10ToFloat32(static_cast&lt;unsigned short&gt;(a)) + float10ToFloat32(static_cast&lt;unsigned short&gt;(b))) * 0.5f);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
-
-namespace rx
-{
-
-// Represents intervals of the type [a, b)
</del><span class="cx"> template &lt;typename T&gt;
</span><span class="cx"> struct Range
</span><span class="cx"> {
</span><span class="lines">@@ -529,11 +541,146 @@
</span><span class="cx">             return start &lt; other.end;
</span><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    void extend(T value)
+    {
+        start = value &gt; start ? value : start;
+        end = value &lt; end ? value : end;
+    }
+
+    bool empty() const
+    {
+        return end &lt;= start;
+    }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> typedef Range&lt;int&gt; RangeI;
</span><span class="cx"> typedef Range&lt;unsigned int&gt; RangeUI;
</span><span class="cx"> 
</span><ins>+struct IndexRange
+{
+    IndexRange() : IndexRange(0, 0, 0) {}
+    IndexRange(size_t start_, size_t end_, size_t vertexIndexCount_)
+        : start(start_), end(end_), vertexIndexCount(vertexIndexCount_)
+    {
+        ASSERT(start &lt;= end);
+    }
+
+    // Number of vertices in the range.
+    size_t vertexCount() const { return (end - start) + 1; }
+
+    // Inclusive range of indices that are not primitive restart
+    size_t start;
+    size_t end;
+
+    // Number of non-primitive restart indices
+    size_t vertexIndexCount;
+};
+
+// First, both normalized floating-point values are converted into 16-bit integer values.
+// Then, the results are packed into the returned 32-bit unsigned integer.
+// The first float value will be written to the least significant bits of the output;
+// the last float value will be written to the most significant bits.
+// The conversion of each value to fixed point is done as follows :
+// packSnorm2x16 : round(clamp(c, -1, +1) * 32767.0)
+inline uint32_t packSnorm2x16(float f1, float f2)
+{
+    int16_t leastSignificantBits = static_cast&lt;int16_t&gt;(roundf(clamp(f1, -1.0f, 1.0f) * 32767.0f));
+    int16_t mostSignificantBits = static_cast&lt;int16_t&gt;(roundf(clamp(f2, -1.0f, 1.0f) * 32767.0f));
+    return static_cast&lt;uint32_t&gt;(mostSignificantBits) &lt;&lt; 16 |
+           (static_cast&lt;uint32_t&gt;(leastSignificantBits) &amp; 0xFFFF);
+}
+
+// First, unpacks a single 32-bit unsigned integer u into a pair of 16-bit unsigned integers. Then, each
+// component is converted to a normalized floating-point value to generate the returned two float values.
+// The first float value will be extracted from the least significant bits of the input;
+// the last float value will be extracted from the most-significant bits.
+// The conversion for unpacked fixed-point value to floating point is done as follows:
+// unpackSnorm2x16 : clamp(f / 32767.0, -1, +1)
+inline void unpackSnorm2x16(uint32_t u, float *f1, float *f2)
+{
+    int16_t leastSignificantBits = static_cast&lt;int16_t&gt;(u &amp; 0xFFFF);
+    int16_t mostSignificantBits = static_cast&lt;int16_t&gt;(u &gt;&gt; 16);
+    *f1 = clamp(static_cast&lt;float&gt;(leastSignificantBits) / 32767.0f, -1.0f, 1.0f);
+    *f2 = clamp(static_cast&lt;float&gt;(mostSignificantBits) / 32767.0f, -1.0f, 1.0f);
+}
+
+// First, both normalized floating-point values are converted into 16-bit integer values.
+// Then, the results are packed into the returned 32-bit unsigned integer.
+// The first float value will be written to the least significant bits of the output;
+// the last float value will be written to the most significant bits.
+// The conversion of each value to fixed point is done as follows:
+// packUnorm2x16 : round(clamp(c, 0, +1) * 65535.0)
+inline uint32_t packUnorm2x16(float f1, float f2)
+{
+    uint16_t leastSignificantBits = static_cast&lt;uint16_t&gt;(roundf(clamp(f1, 0.0f, 1.0f) * 65535.0f));
+    uint16_t mostSignificantBits = static_cast&lt;uint16_t&gt;(roundf(clamp(f2, 0.0f, 1.0f) * 65535.0f));
+    return static_cast&lt;uint32_t&gt;(mostSignificantBits) &lt;&lt; 16 | static_cast&lt;uint32_t&gt;(leastSignificantBits);
+}
+
+// First, unpacks a single 32-bit unsigned integer u into a pair of 16-bit unsigned integers. Then, each
+// component is converted to a normalized floating-point value to generate the returned two float values.
+// The first float value will be extracted from the least significant bits of the input;
+// the last float value will be extracted from the most-significant bits.
+// The conversion for unpacked fixed-point value to floating point is done as follows:
+// unpackUnorm2x16 : f / 65535.0
+inline void unpackUnorm2x16(uint32_t u, float *f1, float *f2)
+{
+    uint16_t leastSignificantBits = static_cast&lt;uint16_t&gt;(u &amp; 0xFFFF);
+    uint16_t mostSignificantBits = static_cast&lt;uint16_t&gt;(u &gt;&gt; 16);
+    *f1 = static_cast&lt;float&gt;(leastSignificantBits) / 65535.0f;
+    *f2 = static_cast&lt;float&gt;(mostSignificantBits) / 65535.0f;
+}
+
+// Returns an unsigned integer obtained by converting the two floating-point values to the 16-bit
+// floating-point representation found in the OpenGL ES Specification, and then packing these
+// two 16-bit integers into a 32-bit unsigned integer.
+// f1: The 16 least-significant bits of the result;
+// f2: The 16 most-significant bits.
+inline uint32_t packHalf2x16(float f1, float f2)
+{
+    uint16_t leastSignificantBits = static_cast&lt;uint16_t&gt;(float32ToFloat16(f1));
+    uint16_t mostSignificantBits = static_cast&lt;uint16_t&gt;(float32ToFloat16(f2));
+    return static_cast&lt;uint32_t&gt;(mostSignificantBits) &lt;&lt; 16 | static_cast&lt;uint32_t&gt;(leastSignificantBits);
+}
+
+// Returns two floating-point values obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values,
+// interpreting those values as 16-bit floating-point numbers according to the OpenGL ES Specification,
+// and converting them to 32-bit floating-point values.
+// The first float value is obtained from the 16 least-significant bits of u;
+// the second component is obtained from the 16 most-significant bits of u.
+inline void unpackHalf2x16(uint32_t u, float *f1, float *f2)
+{
+    uint16_t leastSignificantBits = static_cast&lt;uint16_t&gt;(u &amp; 0xFFFF);
+    uint16_t mostSignificantBits = static_cast&lt;uint16_t&gt;(u &gt;&gt; 16);
+
+    *f1 = float16ToFloat32(leastSignificantBits);
+    *f2 = float16ToFloat32(mostSignificantBits);
+}
+
+// Returns whether the argument is Not a Number.
+// IEEE 754 single precision NaN representation: Exponent(8 bits) - 255, Mantissa(23 bits) - non-zero.
+inline bool isNaN(float f)
+{
+    // Exponent mask: ((1u &lt;&lt; 8) - 1u) &lt;&lt; 23 = 0x7f800000u
+    // Mantissa mask: ((1u &lt;&lt; 23) - 1u) = 0x7fffffu
+    return ((bitCast&lt;uint32_t&gt;(f) &amp; 0x7f800000u) == 0x7f800000u) &amp;&amp; (bitCast&lt;uint32_t&gt;(f) &amp; 0x7fffffu);
+}
+
+// Returns whether the argument is infinity.
+// IEEE 754 single precision infinity representation: Exponent(8 bits) - 255, Mantissa(23 bits) - zero.
+inline bool isInf(float f)
+{
+    // Exponent mask: ((1u &lt;&lt; 8) - 1u) &lt;&lt; 23 = 0x7f800000u
+    // Mantissa mask: ((1u &lt;&lt; 23) - 1u) = 0x7fffffu
+    return ((bitCast&lt;uint32_t&gt;(f) &amp; 0x7f800000u) == 0x7f800000u) &amp;&amp; !(bitCast&lt;uint32_t&gt;(f) &amp; 0x7fffffu);
+}
+
+}
+
+namespace rx
+{
+
</ins><span class="cx"> template &lt;typename T&gt;
</span><span class="cx"> T roundUp(const T value, const T alignment)
</span><span class="cx"> {
</span><span class="lines">@@ -569,6 +716,7 @@
</span><span class="cx"> #if defined(_MSC_VER)
</span><span class="cx"> 
</span><span class="cx"> #define ANGLE_ROTL(x,y) _rotl(x,y)
</span><ins>+#define ANGLE_ROTR16(x,y) _rotr16(x,y)
</ins><span class="cx"> 
</span><span class="cx"> #else
</span><span class="cx"> 
</span><span class="lines">@@ -577,7 +725,13 @@
</span><span class="cx">     return (x &lt;&lt; r) | (x &gt;&gt; (32 - r));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline uint16_t RotR16(uint16_t x, int8_t r)
+{
+    return (x &gt;&gt; r) | (x &lt;&lt; (16 - r));
+}
+
</ins><span class="cx"> #define ANGLE_ROTL(x,y) RotL(x,y)
</span><ins>+#define ANGLE_ROTR16(x,y) RotR16(x,y)
</ins><span class="cx"> 
</span><span class="cx"> #endif // namespace rx
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonmathutil_unittestcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/common/mathutil_unittest.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/mathutil_unittest.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/common/mathutil_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,172 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// mathutil_unittest:
+//   Unit tests for the utils defined in mathutil.h
+//
+
+#include &quot;mathutil.h&quot;
+
+#include &lt;gtest/gtest.h&gt;
+
+using namespace gl;
+
+namespace
+{
+
+// Test the correctness of packSnorm2x16 and unpackSnorm2x16 functions.
+// For floats f1 and f2, unpackSnorm2x16(packSnorm2x16(f1, f2)) should be same as f1 and f2.
+TEST(MathUtilTest, packAndUnpackSnorm2x16)
+{
+    const float input[8][2] =
+    {
+        { 0.0f, 0.0f },
+        { 1.0f, 1.0f },
+        { -1.0f, 1.0f },
+        { -1.0f, -1.0f },
+        { 0.875f, 0.75f },
+        { 0.00392f, -0.99215f },
+        { -0.000675f, 0.004954f },
+        { -0.6937f, -0.02146f }
+    };
+    const float floatFaultTolerance = 0.0001f;
+    float outputVal1, outputVal2;
+
+    for (size_t i = 0; i &lt; 8; i++)
+    {
+        unpackSnorm2x16(packSnorm2x16(input[i][0], input[i][1]), &amp;outputVal1, &amp;outputVal2);
+        EXPECT_NEAR(input[i][0], outputVal1, floatFaultTolerance);
+        EXPECT_NEAR(input[i][1], outputVal2, floatFaultTolerance);
+    }
+}
+
+// Test the correctness of packSnorm2x16 and unpackSnorm2x16 functions with infinity values,
+// result should be clamped to [-1, 1].
+TEST(MathUtilTest, packAndUnpackSnorm2x16Infinity)
+{
+    const float floatFaultTolerance = 0.0001f;
+    float outputVal1, outputVal2;
+
+    unpackSnorm2x16(packSnorm2x16(std::numeric_limits&lt;float&gt;::infinity(),
+                                  std::numeric_limits&lt;float&gt;::infinity()), &amp;outputVal1, &amp;outputVal2);
+    EXPECT_NEAR(1.0f, outputVal1, floatFaultTolerance);
+    EXPECT_NEAR(1.0f, outputVal2, floatFaultTolerance);
+
+    unpackSnorm2x16(packSnorm2x16(std::numeric_limits&lt;float&gt;::infinity(),
+                                  -std::numeric_limits&lt;float&gt;::infinity()), &amp;outputVal1, &amp;outputVal2);
+    EXPECT_NEAR(1.0f, outputVal1, floatFaultTolerance);
+    EXPECT_NEAR(-1.0f, outputVal2, floatFaultTolerance);
+
+    unpackSnorm2x16(packSnorm2x16(-std::numeric_limits&lt;float&gt;::infinity(),
+                                  -std::numeric_limits&lt;float&gt;::infinity()), &amp;outputVal1, &amp;outputVal2);
+    EXPECT_NEAR(-1.0f, outputVal1, floatFaultTolerance);
+    EXPECT_NEAR(-1.0f, outputVal2, floatFaultTolerance);
+}
+
+// Test the correctness of packUnorm2x16 and unpackUnorm2x16 functions.
+// For floats f1 and f2, unpackUnorm2x16(packUnorm2x16(f1, f2)) should be same as f1 and f2.
+TEST(MathUtilTest, packAndUnpackUnorm2x16)
+{
+    const float input[8][2] =
+    {
+        { 0.0f, 0.0f },
+        { 1.0f, 1.0f },
+        { -1.0f, 1.0f },
+        { -1.0f, -1.0f },
+        { 0.875f, 0.75f },
+        { 0.00392f, -0.99215f },
+        { -0.000675f, 0.004954f },
+        { -0.6937f, -0.02146f }
+    };
+    const float floatFaultTolerance = 0.0001f;
+    float outputVal1, outputVal2;
+
+    for (size_t i = 0; i &lt; 8; i++)
+    {
+        unpackUnorm2x16(packUnorm2x16(input[i][0], input[i][1]), &amp;outputVal1, &amp;outputVal2);
+        float expected = input[i][0] &lt; 0.0f ? 0.0f : input[i][0];
+        EXPECT_NEAR(expected, outputVal1, floatFaultTolerance);
+        expected = input[i][1] &lt; 0.0f ? 0.0f : input[i][1];
+        EXPECT_NEAR(expected, outputVal2, floatFaultTolerance);
+    }
+}
+
+// Test the correctness of packUnorm2x16 and unpackUnorm2x16 functions with infinity values,
+// result should be clamped to [0, 1].
+TEST(MathUtilTest, packAndUnpackUnorm2x16Infinity)
+{
+    const float floatFaultTolerance = 0.0001f;
+    float outputVal1, outputVal2;
+
+    unpackUnorm2x16(packUnorm2x16(std::numeric_limits&lt;float&gt;::infinity(),
+                                  std::numeric_limits&lt;float&gt;::infinity()), &amp;outputVal1, &amp;outputVal2);
+    EXPECT_NEAR(1.0f, outputVal1, floatFaultTolerance);
+    EXPECT_NEAR(1.0f, outputVal2, floatFaultTolerance);
+
+    unpackUnorm2x16(packUnorm2x16(std::numeric_limits&lt;float&gt;::infinity(),
+                                  -std::numeric_limits&lt;float&gt;::infinity()), &amp;outputVal1, &amp;outputVal2);
+    EXPECT_NEAR(1.0f, outputVal1, floatFaultTolerance);
+    EXPECT_NEAR(0.0f, outputVal2, floatFaultTolerance);
+
+    unpackUnorm2x16(packUnorm2x16(-std::numeric_limits&lt;float&gt;::infinity(),
+                                  -std::numeric_limits&lt;float&gt;::infinity()), &amp;outputVal1, &amp;outputVal2);
+    EXPECT_NEAR(0.0f, outputVal1, floatFaultTolerance);
+    EXPECT_NEAR(0.0f, outputVal2, floatFaultTolerance);
+}
+
+// Test the correctness of packHalf2x16 and unpackHalf2x16 functions.
+// For floats f1 and f2, unpackHalf2x16(packHalf2x16(f1, f2)) should be same as f1 and f2.
+TEST(MathUtilTest, packAndUnpackHalf2x16)
+{
+    const float input[8][2] =
+    {
+        { 0.0f, 0.0f },
+        { 1.0f, 1.0f },
+        { -1.0f, 1.0f },
+        { -1.0f, -1.0f },
+        { 0.875f, 0.75f },
+        { 0.00392f, -0.99215f },
+        { -0.000675f, 0.004954f },
+        { -0.6937f, -0.02146f },
+    };
+    const float floatFaultTolerance = 0.0005f;
+    float outputVal1, outputVal2;
+
+    for (size_t i = 0; i &lt; 8; i++)
+    {
+        unpackHalf2x16(packHalf2x16(input[i][0], input[i][1]), &amp;outputVal1, &amp;outputVal2);
+        EXPECT_NEAR(input[i][0], outputVal1, floatFaultTolerance);
+        EXPECT_NEAR(input[i][1], outputVal2, floatFaultTolerance);
+    }
+}
+
+// Test the correctness of gl::isNaN function.
+TEST(MathUtilTest, isNaN)
+{
+    EXPECT_TRUE(isNaN(bitCast&lt;float&gt;(0xffu &lt;&lt; 23 | 1u)));
+    EXPECT_TRUE(isNaN(bitCast&lt;float&gt;(1u &lt;&lt; 31 | 0xffu &lt;&lt; 23 | 1u)));
+    EXPECT_TRUE(isNaN(bitCast&lt;float&gt;(1u &lt;&lt; 31 | 0xffu &lt;&lt; 23 | 0x400000u)));
+    EXPECT_TRUE(isNaN(bitCast&lt;float&gt;(1u &lt;&lt; 31 | 0xffu &lt;&lt; 23 | 0x7fffffu)));
+    EXPECT_FALSE(isNaN(0.0f));
+    EXPECT_FALSE(isNaN(bitCast&lt;float&gt;(1u &lt;&lt; 31 | 0xffu &lt;&lt; 23)));
+    EXPECT_FALSE(isNaN(bitCast&lt;float&gt;(0xffu &lt;&lt; 23)));
+}
+
+// Test the correctness of gl::isInf function.
+TEST(MathUtilTest, isInf)
+{
+    EXPECT_TRUE(isInf(bitCast&lt;float&gt;(0xffu &lt;&lt; 23)));
+    EXPECT_TRUE(isInf(bitCast&lt;float&gt;(1u &lt;&lt; 31 | 0xffu &lt;&lt; 23)));
+    EXPECT_FALSE(isInf(0.0f));
+    EXPECT_FALSE(isInf(bitCast&lt;float&gt;(0xffu &lt;&lt; 23 | 1u)));
+    EXPECT_FALSE(isInf(bitCast&lt;float&gt;(1u &lt;&lt; 31 | 0xffu &lt;&lt; 23 | 1u)));
+    EXPECT_FALSE(isInf(bitCast&lt;float&gt;(1u &lt;&lt; 31 | 0xffu &lt;&lt; 23 | 0x400000u)));
+    EXPECT_FALSE(isInf(bitCast&lt;float&gt;(1u &lt;&lt; 31 | 0xffu &lt;&lt; 23 | 0x7fffffu)));
+    EXPECT_FALSE(isInf(bitCast&lt;float&gt;(0xfeu &lt;&lt; 23 | 0x7fffffu)));
+    EXPECT_FALSE(isInf(bitCast&lt;float&gt;(1u &lt;&lt; 31 | 0xfeu &lt;&lt; 23 | 0x7fffffu)));
+}
+
+}
+
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonmatrix_utilsh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/common/matrix_utils.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/matrix_utils.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/common/matrix_utils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,349 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Matrix:
+//   Utility class implementing various matrix operations.
+//   Supports matrices with minimum 2 and maximum 4 number of rows/columns.
+//
+// TODO: Check if we can merge Matrix.h in sample_util with this and replace it with this implementation.
+// TODO: Rename this file to Matrix.h once we remove Matrix.h in sample_util.
+
+#ifndef COMMON_MATRIX_UTILS_H_
+#define COMMON_MATRIX_UTILS_H_
+
+#include &lt;vector&gt;
+
+#include &quot;common/debug.h&quot;
+
+namespace angle
+{
+
+template&lt;typename T&gt;
+class Matrix
+{
+  public:
+    Matrix(const std::vector&lt;T&gt; &amp;elements, const unsigned int &amp;numRows, const unsigned int &amp;numCols)
+        : mElements(elements),
+          mRows(numRows),
+          mCols(numCols)
+    {
+        ASSERT(rows() &gt;= 1 &amp;&amp; rows() &lt;= 4);
+        ASSERT(columns() &gt;= 1 &amp;&amp; columns() &lt;= 4);
+    }
+
+    Matrix(const std::vector&lt;T&gt; &amp;elements, const unsigned int &amp;size)
+        : mElements(elements),
+          mRows(size),
+          mCols(size)
+    {
+        ASSERT(rows() &gt;= 1 &amp;&amp; rows() &lt;= 4);
+        ASSERT(columns() &gt;= 1 &amp;&amp; columns() &lt;= 4);
+    }
+
+    Matrix(const T *elements, const unsigned int &amp;size)
+        : mRows(size),
+          mCols(size)
+    {
+        ASSERT(rows() &gt;= 1 &amp;&amp; rows() &lt;= 4);
+        ASSERT(columns() &gt;= 1 &amp;&amp; columns() &lt;= 4);
+        for (size_t i = 0; i &lt; size * size; i++)
+            mElements.push_back(elements[i]);
+    }
+
+    const T &amp;operator()(const unsigned int &amp;rowIndex, const unsigned int &amp;columnIndex) const
+    {
+        return mElements[rowIndex * columns() + columnIndex];
+    }
+
+    T &amp;operator()(const unsigned int &amp;rowIndex, const unsigned int &amp;columnIndex)
+    {
+        return mElements[rowIndex * columns() + columnIndex];
+    }
+
+    const T &amp;at(const unsigned int &amp;rowIndex, const unsigned int &amp;columnIndex) const
+    {
+        return operator()(rowIndex, columnIndex);
+    }
+
+    Matrix&lt;T&gt; operator*(const Matrix&lt;T&gt; &amp;m)
+    {
+        ASSERT(columns() == m.rows());
+
+        unsigned int resultRows = rows();
+        unsigned int resultCols = m.columns();
+        Matrix&lt;T&gt; result(std::vector&lt;T&gt;(resultRows * resultCols), resultRows, resultCols);
+        for (unsigned int i = 0; i &lt; resultRows; i++)
+        {
+            for (unsigned int j = 0; j &lt; resultCols; j++)
+            {
+                T tmp = 0.0f;
+                for (unsigned int k = 0; k &lt; columns(); k++)
+                    tmp += at(i, k) * m(k, j);
+                result(i, j) = tmp;
+            }
+        }
+
+        return result;
+    }
+
+    unsigned int size() const
+    {
+        ASSERT(rows() == columns());
+        return rows();
+    }
+
+    unsigned int rows() const { return mRows; }
+
+    unsigned int columns() const { return mCols; }
+
+    std::vector&lt;T&gt; elements() const { return mElements; }
+
+    Matrix&lt;T&gt; compMult(const Matrix&lt;T&gt; &amp;mat1) const
+    {
+        Matrix result(std::vector&lt;T&gt;(mElements.size()), size());
+        for (unsigned int i = 0; i &lt; columns(); i++)
+            for (unsigned int j = 0; j &lt; rows(); j++)
+                result(i, j) = at(i, j) * mat1(i, j);
+
+        return result;
+    }
+
+    Matrix&lt;T&gt; outerProduct(const Matrix&lt;T&gt; &amp;mat1) const
+    {
+        unsigned int cols = mat1.columns();
+        Matrix result(std::vector&lt;T&gt;(rows() * cols), rows(), cols);
+        for (unsigned int i = 0; i &lt; rows(); i++)
+            for (unsigned int j = 0; j &lt; cols; j++)
+                result(i, j) = at(i, 0) * mat1(0, j);
+
+        return result;
+    }
+
+    Matrix&lt;T&gt; transpose() const
+    {
+        Matrix result(std::vector&lt;T&gt;(mElements.size()), columns(), rows());
+        for (unsigned int i = 0; i &lt; columns(); i++)
+            for (unsigned int j = 0; j &lt; rows(); j++)
+                result(i, j) = at(j, i);
+
+        return result;
+    }
+
+    T determinant() const
+    {
+        ASSERT(rows() == columns());
+
+        switch (size())
+        {
+          case 2:
+            return at(0, 0) * at(1, 1) - at(0, 1) * at(1, 0);
+
+          case 3:
+            return at(0, 0) * at(1, 1) * at(2, 2) +
+                at(0, 1) * at(1, 2) * at(2, 0) +
+                at(0, 2) * at(1, 0) * at(2, 1) -
+                at(0, 2) * at(1, 1) * at(2, 0) -
+                at(0, 1) * at(1, 0) * at(2, 2) -
+                at(0, 0) * at(1, 2) * at(2, 1);
+
+          case 4:
+            {
+                const float minorMatrices[4][3 * 3] =
+                {
+                    {
+                        at(1, 1), at(2, 1), at(3, 1),
+                        at(1, 2), at(2, 2), at(3, 2),
+                        at(1, 3), at(2, 3), at(3, 3),
+                    },
+                    {
+                        at(1, 0), at(2, 0), at(3, 0),
+                        at(1, 2), at(2, 2), at(3, 2),
+                        at(1, 3), at(2, 3), at(3, 3),
+                    },
+                    {
+                        at(1, 0), at(2, 0), at(3, 0),
+                        at(1, 1), at(2, 1), at(3, 1),
+                        at(1, 3), at(2, 3), at(3, 3),
+                    },
+                    {
+                        at(1, 0), at(2, 0), at(3, 0),
+                        at(1, 1), at(2, 1), at(3, 1),
+                        at(1, 2), at(2, 2), at(3, 2),
+                    }
+              };
+              return at(0, 0) * Matrix&lt;T&gt;(minorMatrices[0], 3).determinant() -
+                  at(0, 1) * Matrix&lt;T&gt;(minorMatrices[1], 3).determinant() +
+                  at(0, 2) * Matrix&lt;T&gt;(minorMatrices[2], 3).determinant() -
+                  at(0, 3) * Matrix&lt;T&gt;(minorMatrices[3], 3).determinant();
+            }
+
+          default:
+            UNREACHABLE();
+            break;
+        }
+
+        return T();
+    }
+
+    Matrix&lt;T&gt; inverse() const
+    {
+        ASSERT(rows() == columns());
+
+        Matrix&lt;T&gt; cof(std::vector&lt;T&gt;(mElements.size()), rows(), columns());
+        switch (size())
+        {
+          case 2:
+            cof(0, 0) = at(1, 1);
+            cof(0, 1) = -at(1, 0);
+            cof(1, 0) = -at(0, 1);
+            cof(1, 1) = at(0, 0);
+            break;
+
+          case 3:
+            cof(0, 0) = at(1, 1) * at(2, 2) -
+                at(2, 1) * at(1, 2);
+            cof(0, 1) = -(at(1, 0) * at(2, 2) -
+                at(2, 0) * at(1, 2));
+            cof(0, 2) = at(1, 0) * at(2, 1) -
+                at(2, 0) * at(1, 1);
+            cof(1, 0) = -(at(0, 1) * at(2, 2) -
+                at(2, 1) * at(0, 2));
+            cof(1, 1) = at(0, 0) * at(2, 2) -
+                at(2, 0) * at(0, 2);
+            cof(1, 2) = -(at(0, 0) * at(2, 1) -
+                at(2, 0) * at(0, 1));
+            cof(2, 0) = at(0, 1) * at(1, 2) -
+                at(1, 1) * at(0, 2);
+            cof(2, 1) = -(at(0, 0) * at(1, 2) -
+                at(1, 0) * at(0, 2));
+            cof(2, 2) = at(0, 0) * at(1, 1) -
+                at(1, 0) * at(0, 1);
+            break;
+
+          case 4:
+            cof(0, 0) = at(1, 1) * at(2, 2) * at(3, 3) +
+                at(2, 1) * at(3, 2) * at(1, 3) +
+                at(3, 1) * at(1, 2) * at(2, 3) -
+                at(1, 1) * at(3, 2) * at(2, 3) -
+                at(2, 1) * at(1, 2) * at(3, 3) -
+                at(3, 1) * at(2, 2) * at(1, 3);
+            cof(0, 1) = -(at(1, 0) * at(2, 2) * at(3, 3) +
+                at(2, 0) * at(3, 2) * at(1, 3) +
+                at(3, 0) * at(1, 2) * at(2, 3) -
+                at(1, 0) * at(3, 2) * at(2, 3) -
+                at(2, 0) * at(1, 2) * at(3, 3) -
+                at(3, 0) * at(2, 2) * at(1, 3));
+            cof(0, 2) = at(1, 0) * at(2, 1) * at(3, 3) +
+                at(2, 0) * at(3, 1) * at(1, 3) +
+                at(3, 0) * at(1, 1) * at(2, 3) -
+                at(1, 0) * at(3, 1) * at(2, 3) -
+                at(2, 0) * at(1, 1) * at(3, 3) -
+                at(3, 0) * at(2, 1) * at(1, 3);
+            cof(0, 3) = -(at(1, 0) * at(2, 1) * at(3, 2) +
+                at(2, 0) * at(3, 1) * at(1, 2) +
+                at(3, 0) * at(1, 1) * at(2, 2) -
+                at(1, 0) * at(3, 1) * at(2, 2) -
+                at(2, 0) * at(1, 1) * at(3, 2) -
+                at(3, 0) * at(2, 1) * at(1, 2));
+            cof(1, 0) = -(at(0, 1) * at(2, 2) * at(3, 3) +
+                at(2, 1) * at(3, 2) * at(0, 3) +
+                at(3, 1) * at(0, 2) * at(2, 3) -
+                at(0, 1) * at(3, 2) * at(2, 3) -
+                at(2, 1) * at(0, 2) * at(3, 3) -
+                at(3, 1) * at(2, 2) * at(0, 3));
+            cof(1, 1) = at(0, 0) * at(2, 2) * at(3, 3) +
+                at(2, 0) * at(3, 2) * at(0, 3) +
+                at(3, 0) * at(0, 2) * at(2, 3) -
+                at(0, 0) * at(3, 2) * at(2, 3) -
+                at(2, 0) * at(0, 2) * at(3, 3) -
+                at(3, 0) * at(2, 2) * at(0, 3);
+            cof(1, 2) = -(at(0, 0) * at(2, 1) * at(3, 3) +
+                at(2, 0) * at(3, 1) * at(0, 3) +
+                at(3, 0) * at(0, 1) * at(2, 3) -
+                at(0, 0) * at(3, 1) * at(2, 3) -
+                at(2, 0) * at(0, 1) * at(3, 3) -
+                at(3, 0) * at(2, 1) * at(0, 3));
+            cof(1, 3) = at(0, 0) * at(2, 1) * at(3, 2) +
+                at(2, 0) * at(3, 1) * at(0, 2) +
+                at(3, 0) * at(0, 1) * at(2, 2) -
+                at(0, 0) * at(3, 1) * at(2, 2) -
+                at(2, 0) * at(0, 1) * at(3, 2) -
+                at(3, 0) * at(2, 1) * at(0, 2);
+            cof(2, 0) = at(0, 1) * at(1, 2) * at(3, 3) +
+                at(1, 1) * at(3, 2) * at(0, 3) +
+                at(3, 1) * at(0, 2) * at(1, 3) -
+                at(0, 1) * at(3, 2) * at(1, 3) -
+                at(1, 1) * at(0, 2) * at(3, 3) -
+                at(3, 1) * at(1, 2) * at(0, 3);
+            cof(2, 1) = -(at(0, 0) * at(1, 2) * at(3, 3) +
+                at(1, 0) * at(3, 2) * at(0, 3) +
+                at(3, 0) * at(0, 2) * at(1, 3) -
+                at(0, 0) * at(3, 2) * at(1, 3) -
+                at(1, 0) * at(0, 2) * at(3, 3) -
+                at(3, 0) * at(1, 2) * at(0, 3));
+            cof(2, 2) = at(0, 0) * at(1, 1) * at(3, 3) +
+                at(1, 0) * at(3, 1) * at(0, 3) +
+                at(3, 0) * at(0, 1) * at(1, 3) -
+                at(0, 0) * at(3, 1) * at(1, 3) -
+                at(1, 0) * at(0, 1) * at(3, 3) -
+                at(3, 0) * at(1, 1) * at(0, 3);
+            cof(2, 3) = -(at(0, 0) * at(1, 1) * at(3, 2) +
+                at(1, 0) * at(3, 1) * at(0, 2) +
+                at(3, 0) * at(0, 1) * at(1, 2) -
+                at(0, 0) * at(3, 1) * at(1, 2) -
+                at(1, 0) * at(0, 1) * at(3, 2) -
+                at(3, 0) * at(1, 1) * at(0, 2));
+            cof(3, 0) = -(at(0, 1) * at(1, 2) * at(2, 3) +
+                at(1, 1) * at(2, 2) * at(0, 3) +
+                at(2, 1) * at(0, 2) * at(1, 3) -
+                at(0, 1) * at(2, 2) * at(1, 3) -
+                at(1, 1) * at(0, 2) * at(2, 3) -
+                at(2, 1) * at(1, 2) * at(0, 3));
+            cof(3, 1) = at(0, 0) * at(1, 2) * at(2, 3) +
+                at(1, 0) * at(2, 2) * at(0, 3) +
+                at(2, 0) * at(0, 2) * at(1, 3) -
+                at(0, 0) * at(2, 2) * at(1, 3) -
+                at(1, 0) * at(0, 2) * at(2, 3) -
+                at(2, 0) * at(1, 2) * at(0, 3);
+            cof(3, 2) = -(at(0, 0) * at(1, 1) * at(2, 3) +
+                at(1, 0) * at(2, 1) * at(0, 3) +
+                at(2, 0) * at(0, 1) * at(1, 3) -
+                at(0, 0) * at(2, 1) * at(1, 3) -
+                at(1, 0) * at(0, 1) * at(2, 3) -
+                at(2, 0) * at(1, 1) * at(0, 3));
+            cof(3, 3) = at(0, 0) * at(1, 1) * at(2, 2) +
+                at(1, 0) * at(2, 1) * at(0, 2) +
+                at(2, 0) * at(0, 1) * at(1, 2) -
+                at(0, 0) * at(2, 1) * at(1, 2) -
+                at(1, 0) * at(0, 1) * at(2, 2) -
+                at(2, 0) * at(1, 1) * at(0, 2);
+            break;
+
+          default:
+            UNREACHABLE();
+            break;
+        }
+
+        // The inverse of A is the transpose of the cofactor matrix times the reciprocal of the determinant of A.
+        Matrix&lt;T&gt; adjugateMatrix(cof.transpose());
+        T det = determinant();
+        Matrix&lt;T&gt; result(std::vector&lt;T&gt;(mElements.size()), rows(), columns());
+        for (unsigned int i = 0; i &lt; rows(); i++)
+            for (unsigned int j = 0; j &lt; columns(); j++)
+                result(i, j) = det ? adjugateMatrix(i, j) / det : T();
+
+        return result;
+    }
+
+  private:
+    std::vector&lt;T&gt; mElements;
+    unsigned int mRows;
+    unsigned int mCols;
+};
+
+} // namespace angle
+
+#endif   // COMMON_MATRIX_UTILS_H_
+
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonmatrix_utils_unittestcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/common/matrix_utils_unittest.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/matrix_utils_unittest.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/common/matrix_utils_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,184 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// matrix_utils_unittests:
+//   Unit tests for the matrix utils.
+//
+
+#include &quot;matrix_utils.h&quot;
+
+#include &lt;gtest/gtest.h&gt;
+
+using namespace angle;
+
+namespace
+{
+
+const unsigned int minDimensions = 2;
+const unsigned int maxDimensions = 4;
+
+TEST(MatrixUtilsTest, MatrixConstructorTest)
+{
+    for (unsigned int i = minDimensions; i &lt;= maxDimensions; i++)
+    {
+        for (unsigned int j = minDimensions; j &lt;= maxDimensions; j++)
+        {
+            unsigned int numElements = i * j;
+            Matrix&lt;float&gt; m(std::vector&lt;float&gt;(numElements, 1.0f), i, j);
+            EXPECT_EQ(m.rows(), i);
+            EXPECT_EQ(m.columns(), j);
+            EXPECT_EQ(m.elements(), std::vector&lt;float&gt;(numElements, 1.0f));
+        }
+    }
+
+    for (unsigned int i = minDimensions; i &lt;= maxDimensions; i++)
+    {
+        unsigned int numElements = i * i;
+        Matrix&lt;float&gt; m(std::vector&lt;float&gt;(numElements, 1.0f), i);
+        EXPECT_EQ(m.size(), i);
+        EXPECT_EQ(m.columns(), m.columns());
+        EXPECT_EQ(m.elements(), std::vector&lt;float&gt;(numElements, 1.0f));
+    }
+}
+
+TEST(MatrixUtilsTest, MatrixCompMultTest)
+{
+    for (unsigned int i = minDimensions; i &lt;= maxDimensions; i++)
+    {
+        unsigned int numElements = i * i;
+        Matrix&lt;float&gt; m1(std::vector&lt;float&gt;(numElements, 2.0f), i);
+        Matrix&lt;float&gt; actualResult = m1.compMult(m1);
+        std::vector&lt;float&gt; actualResultElements = actualResult.elements();
+        std::vector&lt;float&gt; expectedResultElements(numElements, 4.0f);
+        EXPECT_EQ(expectedResultElements, actualResultElements);
+    }
+}
+
+TEST(MatrixUtilsTest, MatrixOuterProductTest)
+{
+    for (unsigned int i = minDimensions; i &lt;= maxDimensions; i++)
+    {
+        for (unsigned int j = minDimensions; j &lt;= maxDimensions; j++)
+        {
+            unsigned int numElements = i * j;
+            Matrix&lt;float&gt; m1(std::vector&lt;float&gt;(numElements, 2.0f), i, 1);
+            Matrix&lt;float&gt; m2(std::vector&lt;float&gt;(numElements, 2.0f), 1, j);
+            Matrix&lt;float&gt; actualResult = m1.outerProduct(m2);
+            EXPECT_EQ(actualResult.rows(), i);
+            EXPECT_EQ(actualResult.columns(), j);
+            std::vector&lt;float&gt; actualResultElements = actualResult.elements();
+            std::vector&lt;float&gt; expectedResultElements(numElements, 4.0f);
+            EXPECT_EQ(expectedResultElements, actualResultElements);
+        }
+    }
+}
+
+TEST(MatrixUtilsTest, MatrixTransposeTest)
+{
+    for (unsigned int i = minDimensions; i &lt;= maxDimensions; i++)
+    {
+        for (unsigned int j = minDimensions; j &lt;= maxDimensions; j++)
+        {
+            unsigned int numElements = i * j;
+            Matrix&lt;float&gt; m1(std::vector&lt;float&gt;(numElements, 2.0f), i, j);
+            Matrix&lt;float&gt; expectedResult = Matrix&lt;float&gt;(std::vector&lt;float&gt;(numElements, 2.0f), j, i);
+            Matrix&lt;float&gt; actualResult = m1.transpose();
+            EXPECT_EQ(expectedResult.elements(), actualResult.elements());
+            EXPECT_EQ(actualResult.rows(), expectedResult.rows());
+            EXPECT_EQ(actualResult.columns(), expectedResult.columns());
+            // transpose(transpose(A)) = A
+            Matrix&lt;float&gt; m2 = actualResult.transpose();
+            EXPECT_EQ(m1.elements(), m2.elements());
+        }
+    }
+}
+
+TEST(MatrixUtilsTest, MatrixDeterminantTest)
+{
+    for (unsigned int i = minDimensions; i &lt;= maxDimensions; i++)
+    {
+        unsigned int numElements = i * i;
+        Matrix&lt;float&gt; m(std::vector&lt;float&gt;(numElements, 2.0f), i);
+        EXPECT_EQ(m.determinant(), 0.0f);
+    }
+}
+
+TEST(MatrixUtilsTest, 2x2MatrixInverseTest)
+{
+    float inputElements[] =
+    {
+        2.0f, 5.0f,
+        3.0f, 7.0f
+    };
+    unsigned int numElements = 4;
+    std::vector&lt;float&gt; input(inputElements, inputElements + numElements);
+    Matrix&lt;float&gt; inputMatrix(input, 2);
+    float identityElements[] =
+    {
+        1.0f, 0.0f,
+        0.0f, 1.0f
+    };
+    std::vector&lt;float&gt; identityMatrix(identityElements, identityElements + numElements);
+    // A * inverse(A) = I, where I is identity matrix.
+    Matrix&lt;float&gt; result = inputMatrix * inputMatrix.inverse();
+    EXPECT_EQ(identityMatrix, result.elements());
+}
+
+TEST(MatrixUtilsTest, 3x3MatrixInverseTest)
+{
+    float inputElements[] =
+    {
+        11.0f, 23.0f, 37.0f,
+        13.0f, 29.0f, 41.0f,
+        19.0f, 31.0f, 43.0f
+    };
+    unsigned int numElements = 9;
+    std::vector&lt;float&gt; input(inputElements, inputElements + numElements);
+    Matrix&lt;float&gt; inputMatrix(input, 3);
+    float identityElements[] =
+    {
+        1.0f, 0.0f, 0.0f,
+        0.0f, 1.0f, 0.0f,
+        0.0f, 0.0f, 1.0f
+    };
+    std::vector&lt;float&gt; identityMatrix(identityElements, identityElements + numElements);
+    // A * inverse(A) = I, where I is identity matrix.
+    Matrix&lt;float&gt; result = inputMatrix * inputMatrix.inverse();
+    std::vector&lt;float&gt; resultElements = result.elements();
+    const float floatFaultTolarance = 0.000001f;
+    for (size_t i = 0; i &lt; numElements; i++)
+        EXPECT_NEAR(resultElements[i], identityMatrix[i], floatFaultTolarance);
+}
+
+TEST(MatrixUtilsTest, 4x4MatrixInverseTest)
+{
+    float inputElements[] =
+    {
+        29.0f, 43.0f, 61.0f, 79.0f,
+        31.0f, 47.0f, 67.0f, 83.0f,
+        37.0f, 53.0f, 71.0f, 89.0f,
+        41.0f, 59.0f, 73.0f, 97.0f
+    };
+    unsigned int numElements = 16;
+    std::vector&lt;float&gt; input(inputElements, inputElements + numElements);
+    Matrix&lt;float&gt; inputMatrix(input, 4);
+    float identityElements[] =
+    {
+        1.0f, 0.0f, 0.0f, 0.0f,
+        0.0f, 1.0f, 0.0f, 0.0f,
+        0.0f, 0.0f, 1.0f, 0.0f,
+        0.0f, 0.0f, 0.0f, 1.0f,
+    };
+    std::vector&lt;float&gt; identityMatrix(identityElements, identityElements + numElements);
+    // A * inverse(A) = I, where I is identity matrix.
+    Matrix&lt;float&gt; result = inputMatrix * inputMatrix.inverse();
+    std::vector&lt;float&gt; resultElements = result.elements();
+    const float floatFaultTolarance = 0.00001f;
+    for (unsigned int i = 0; i &lt; numElements; i++)
+        EXPECT_NEAR(resultElements[i], identityMatrix[i], floatFaultTolarance);
+}
+
+}
+
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonstring_utilscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/common/string_utils.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/string_utils.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/common/string_utils.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,136 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// string_utils:
+//   String helper functions.
+//
+
+#include &quot;string_utils.h&quot;
+
+#include &lt;fstream&gt;
+#include &lt;sstream&gt;
+
+namespace angle
+{
+
+const char kWhitespaceASCII[] = &quot; \f\n\r\t\v&quot;;
+
+std::vector&lt;std::string&gt; SplitString(const std::string &amp;input,
+                                     const std::string &amp;delimiters,
+                                     WhitespaceHandling whitespace,
+                                     SplitResult resultType)
+{
+    std::vector&lt;std::string&gt; result;
+    if (input.empty())
+    {
+        return result;
+    }
+
+    std::string::size_type start = 0;
+    while (start != std::string::npos)
+    {
+        auto end = input.find_first_of(delimiters, start);
+
+        std::string piece;
+        if (end == std::string::npos)
+        {
+            piece = input.substr(start);
+            start = std::string::npos;
+        }
+        else
+        {
+            piece = input.substr(start, end - start);
+            start = end + 1;
+        }
+
+        if (whitespace == TRIM_WHITESPACE)
+        {
+            piece = TrimString(piece, kWhitespaceASCII);
+        }
+
+        if (resultType == SPLIT_WANT_ALL || !piece.empty())
+        {
+            result.push_back(piece);
+        }
+    }
+
+    return result;
+}
+
+void SplitStringAlongWhitespace(const std::string &amp;input,
+                                std::vector&lt;std::string&gt; *tokensOut)
+{
+
+    std::istringstream stream(input);
+    std::string line;
+
+    while (std::getline(stream, line))
+    {
+        size_t prev = 0, pos;
+        while ((pos = line.find_first_of(kWhitespaceASCII, prev)) != std::string::npos)
+        {
+            if (pos &gt; prev)
+                tokensOut-&gt;push_back(line.substr(prev, pos - prev));
+            prev = pos + 1;
+        }
+        if (prev &lt; line.length())
+            tokensOut-&gt;push_back(line.substr(prev, std::string::npos));
+    }
+}
+
+std::string TrimString(const std::string &amp;input, const std::string &amp;trimChars)
+{
+    auto begin = input.find_first_not_of(trimChars);
+    if (begin == std::string::npos)
+    {
+        return &quot;&quot;;
+    }
+
+    std::string::size_type end = input.find_last_not_of(trimChars);
+    if (end == std::string::npos)
+    {
+        return input.substr(begin);
+    }
+
+    return input.substr(begin, end - begin + 1);
+}
+
+bool HexStringToUInt(const std::string &amp;input, unsigned int *uintOut)
+{
+    unsigned int offset = 0;
+
+    if (input.size() &gt;= 2 &amp;&amp; input[0] == '0' &amp;&amp; input[1] == 'x')
+    {
+        offset = 2u;
+    }
+
+    // Simple validity check
+    if (input.find_first_not_of(&quot;0123456789ABCDEFabcdef&quot;, offset) != std::string::npos)
+    {
+        return false;
+    }
+
+    std::stringstream inStream(input);
+    inStream &gt;&gt; std::hex &gt;&gt; *uintOut;
+    return !inStream.fail();
+}
+
+bool ReadFileToString(const std::string &amp;path, std::string *stringOut)
+{
+    std::ifstream inFile(path.c_str());
+    if (inFile.fail())
+    {
+        return false;
+    }
+
+    inFile.seekg(0, std::ios::end);
+    stringOut-&gt;reserve(static_cast&lt;std::string::size_type&gt;(inFile.tellg()));
+    inFile.seekg(0, std::ios::beg);
+
+    stringOut-&gt;assign(std::istreambuf_iterator&lt;char&gt;(inFile), std::istreambuf_iterator&lt;char&gt;());
+    return !inFile.fail();
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonstring_utilsh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/common/string_utils.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/string_utils.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/common/string_utils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// string_utils:
+//   String helper functions.
+//
+
+#ifndef LIBANGLE_STRING_UTILS_H_
+#define LIBANGLE_STRING_UTILS_H_
+
+#include &lt;string&gt;
+#include &lt;vector&gt;
+
+namespace angle
+{
+
+extern const char kWhitespaceASCII[];
+
+enum WhitespaceHandling
+{
+    KEEP_WHITESPACE,
+    TRIM_WHITESPACE,
+};
+
+enum SplitResult
+{
+    SPLIT_WANT_ALL,
+    SPLIT_WANT_NONEMPTY,
+};
+
+std::vector&lt;std::string&gt; SplitString(const std::string &amp;input,
+                                     const std::string &amp;delimiters,
+                                     WhitespaceHandling whitespace,
+                                     SplitResult resultType);
+
+void SplitStringAlongWhitespace(const std::string &amp;input,
+                                std::vector&lt;std::string&gt; *tokensOut);
+
+std::string TrimString(const std::string &amp;input, const std::string &amp;trimChars);
+
+bool HexStringToUInt(const std::string &amp;input, unsigned int *uintOut);
+
+bool ReadFileToString(const std::string &amp;path, std::string *stringOut);
+
+}
+
+#endif // LIBANGLE_STRING_UTILS_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonstring_utils_unittestcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/common/string_utils_unittest.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/string_utils_unittest.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/common/string_utils_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,141 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// string_utils_unittests:
+//   Unit tests for the string utils.
+//
+
+#include &quot;string_utils.h&quot;
+
+#include &lt;gtest/gtest.h&gt;
+
+using namespace angle;
+
+namespace
+{
+
+// Basic SplitString tests
+TEST(StringUtilsTest, SplitString_Basics)
+{
+    std::vector&lt;std::string&gt; r;
+
+    r = SplitString(std::string(), &quot;,:;&quot;, KEEP_WHITESPACE, SPLIT_WANT_ALL);
+    EXPECT_TRUE(r.empty());
+
+    // Empty separator list
+    r = SplitString(&quot;hello, world&quot;, &quot;&quot;, KEEP_WHITESPACE, SPLIT_WANT_ALL);
+    ASSERT_EQ(1u, r.size());
+    EXPECT_EQ(&quot;hello, world&quot;, r[0]);
+
+    // Should split on any of the separators.
+    r = SplitString(&quot;::,,;;&quot;, &quot;,:;&quot;, KEEP_WHITESPACE, SPLIT_WANT_ALL);
+    ASSERT_EQ(7u, r.size());
+    for (auto str : r)
+        ASSERT_TRUE(str.empty());
+
+    r = SplitString(&quot;red, green; blue:&quot;, &quot;,:;&quot;, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
+    ASSERT_EQ(3u, r.size());
+    EXPECT_EQ(&quot;red&quot;, r[0]);
+    EXPECT_EQ(&quot;green&quot;, r[1]);
+    EXPECT_EQ(&quot;blue&quot;, r[2]);
+
+    // Want to split a string along whitespace sequences.
+    r = SplitString(&quot;  red green   \tblue\n&quot;, &quot; \t\n&quot;, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
+    ASSERT_EQ(3u, r.size());
+    EXPECT_EQ(&quot;red&quot;, r[0]);
+    EXPECT_EQ(&quot;green&quot;, r[1]);
+    EXPECT_EQ(&quot;blue&quot;, r[2]);
+
+    // Weird case of splitting on spaces but not trimming.
+    r = SplitString(&quot; red &quot;, &quot; &quot;, TRIM_WHITESPACE, SPLIT_WANT_ALL);
+    ASSERT_EQ(3u, r.size());
+    EXPECT_EQ(&quot;&quot;, r[0]);  // Before the first space.
+    EXPECT_EQ(&quot;red&quot;, r[1]);
+    EXPECT_EQ(&quot;&quot;, r[2]);  // After the last space.
+}
+
+// Check different whitespace and result types for SplitString
+TEST(StringUtilsTest, SplitString_WhitespaceAndResultType)
+{
+    std::vector&lt;std::string&gt; r;
+
+    // Empty input handling.
+    r = SplitString(std::string(), &quot;,&quot;, KEEP_WHITESPACE, SPLIT_WANT_ALL);
+    EXPECT_TRUE(r.empty());
+    r = SplitString(std::string(), &quot;,&quot;, KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY);
+    EXPECT_TRUE(r.empty());
+
+    // Input string is space and we're trimming.
+    r = SplitString(&quot; &quot;, &quot;,&quot;, TRIM_WHITESPACE, SPLIT_WANT_ALL);
+    ASSERT_EQ(1u, r.size());
+    EXPECT_EQ(&quot;&quot;, r[0]);
+    r = SplitString(&quot; &quot;, &quot;,&quot;, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
+    EXPECT_TRUE(r.empty());
+
+    // Test all 4 combinations of flags on &quot;, ,&quot;.
+    r = SplitString(&quot;, ,&quot;, &quot;,&quot;, KEEP_WHITESPACE, SPLIT_WANT_ALL);
+    ASSERT_EQ(3u, r.size());
+    EXPECT_EQ(&quot;&quot;, r[0]);
+    EXPECT_EQ(&quot; &quot;, r[1]);
+    EXPECT_EQ(&quot;&quot;, r[2]);
+    r = SplitString(&quot;, ,&quot;, &quot;,&quot;, KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY);
+    ASSERT_EQ(1u, r.size());
+    ASSERT_EQ(&quot; &quot;, r[0]);
+    r = SplitString(&quot;, ,&quot;, &quot;,&quot;, TRIM_WHITESPACE, SPLIT_WANT_ALL);
+    ASSERT_EQ(3u, r.size());
+    EXPECT_EQ(&quot;&quot;, r[0]);
+    EXPECT_EQ(&quot;&quot;, r[1]);
+    EXPECT_EQ(&quot;&quot;, r[2]);
+    r = SplitString(&quot;, ,&quot;, &quot;,&quot;, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
+    ASSERT_TRUE(r.empty());
+}
+
+// Tests for TrimString
+TEST(StringUtilsTest, TrimString)
+{
+    // Basic tests
+    EXPECT_EQ(&quot;a&quot;, TrimString(&quot;a&quot;, kWhitespaceASCII));
+    EXPECT_EQ(&quot;a&quot;, TrimString(&quot; a&quot;, kWhitespaceASCII));
+    EXPECT_EQ(&quot;a&quot;, TrimString(&quot;a &quot;, kWhitespaceASCII));
+    EXPECT_EQ(&quot;a&quot;, TrimString(&quot; a &quot;, kWhitespaceASCII));
+
+    // Tests with empty strings
+    EXPECT_EQ(&quot;&quot;, TrimString(&quot;&quot;, kWhitespaceASCII));
+    EXPECT_EQ(&quot;&quot;, TrimString(&quot; \n\r\t&quot;, kWhitespaceASCII));
+    EXPECT_EQ(&quot; foo &quot;, TrimString(&quot; foo &quot;, &quot;&quot;));
+
+    // Tests it doesn't removes characters in the middle
+    EXPECT_EQ(&quot;foo bar&quot;, TrimString(&quot; foo bar &quot;, kWhitespaceASCII));
+
+    // Test with non-whitespace trimChars
+    EXPECT_EQ(&quot; &quot;, TrimString(&quot;foo bar&quot;, &quot;abcdefghijklmnopqrstuvwxyz&quot;));
+}
+
+// Basic functionality tests for HexStringToUInt
+TEST(StringUtilsTest, HexStringToUIntBasic)
+{
+    unsigned int uintValue;
+
+    std::string emptyString;
+    ASSERT_FALSE(HexStringToUInt(emptyString, &amp;uintValue));
+
+    std::string testStringA(&quot;0xBADF00D&quot;);
+    ASSERT_TRUE(HexStringToUInt(testStringA, &amp;uintValue));
+    EXPECT_EQ(0xBADF00Du, uintValue);
+
+    std::string testStringB(&quot;0xBADFOOD&quot;);
+    EXPECT_FALSE(HexStringToUInt(testStringB, &amp;uintValue));
+
+    std::string testStringC(&quot;BADF00D&quot;);
+    EXPECT_TRUE(HexStringToUInt(testStringC, &amp;uintValue));
+    EXPECT_EQ(0xBADF00Du, uintValue);
+
+    std::string testStringD(&quot;0x BADF00D&quot;);
+    EXPECT_FALSE(HexStringToUInt(testStringD, &amp;uintValue));
+}
+
+// Note: ReadFileToString is harder to test
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonutilitiescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/utilities.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/utilities.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/utilities.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -19,6 +19,78 @@
</span><span class="cx"> #  include &lt;windows.graphics.display.h&gt;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+namespace
+{
+
+template &lt;class IndexType&gt;
+gl::IndexRange ComputeTypedIndexRange(const IndexType *indices,
+                                      size_t count,
+                                      bool primitiveRestartEnabled,
+                                      GLuint primitiveRestartIndex)
+{
+    ASSERT(count &gt; 0);
+
+    IndexType minIndex                = 0;
+    IndexType maxIndex                = 0;
+    size_t nonPrimitiveRestartIndices = 0;
+
+    if (primitiveRestartEnabled)
+    {
+        // Find the first non-primitive restart index to initialize the min and max values
+        size_t i = 0;
+        for (; i &lt; count; i++)
+        {
+            if (indices[i] != primitiveRestartIndex)
+            {
+                minIndex = indices[i];
+                maxIndex = indices[i];
+                nonPrimitiveRestartIndices++;
+                break;
+            }
+        }
+
+        // Loop over the rest of the indices
+        for (; i &lt; count; i++)
+        {
+            if (indices[i] != primitiveRestartIndex)
+            {
+                if (minIndex &gt; indices[i])
+                {
+                    minIndex = indices[i];
+                }
+                if (maxIndex &lt; indices[i])
+                {
+                    maxIndex = indices[i];
+                }
+                nonPrimitiveRestartIndices++;
+            }
+        }
+    }
+    else
+    {
+        minIndex                   = indices[0];
+        maxIndex                   = indices[0];
+        nonPrimitiveRestartIndices = count;
+
+        for (size_t i = 1; i &lt; count; i++)
+        {
+            if (minIndex &gt; indices[i])
+            {
+                minIndex = indices[i];
+            }
+            if (maxIndex &lt; indices[i])
+            {
+                maxIndex = indices[i];
+            }
+        }
+    }
+
+    return gl::IndexRange(static_cast&lt;size_t&gt;(minIndex), static_cast&lt;size_t&gt;(maxIndex),
+                          nonPrimitiveRestartIndices);
+}
+
+}  // anonymous namespace
+
</ins><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -279,6 +351,39 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLenum SamplerTypeToTextureType(GLenum samplerType)
+{
+    switch (samplerType)
+    {
+      case GL_SAMPLER_2D:
+      case GL_INT_SAMPLER_2D:
+      case GL_UNSIGNED_INT_SAMPLER_2D:
+      case GL_SAMPLER_2D_SHADOW:
+        return GL_TEXTURE_2D;
+
+      case GL_SAMPLER_CUBE:
+      case GL_INT_SAMPLER_CUBE:
+      case GL_UNSIGNED_INT_SAMPLER_CUBE:
+      case GL_SAMPLER_CUBE_SHADOW:
+        return GL_TEXTURE_CUBE_MAP;
+
+      case GL_SAMPLER_2D_ARRAY:
+      case GL_INT_SAMPLER_2D_ARRAY:
+      case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
+      case GL_SAMPLER_2D_ARRAY_SHADOW:
+        return GL_TEXTURE_2D_ARRAY;
+
+      case GL_SAMPLER_3D:
+      case GL_INT_SAMPLER_3D:
+      case GL_UNSIGNED_INT_SAMPLER_3D:
+        return GL_TEXTURE_3D;
+
+      default:
+        UNREACHABLE();
+        return 0;
+    }
+}
+
</ins><span class="cx"> bool IsMatrixType(GLenum type)
</span><span class="cx"> {
</span><span class="cx">     return VariableRowCount(type) &gt; 1;
</span><span class="lines">@@ -366,6 +471,47 @@
</span><span class="cx">     return FirstCubeMapTextureTarget + static_cast&lt;GLenum&gt;(index);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+IndexRange ComputeIndexRange(GLenum indexType,
+                             const GLvoid *indices,
+                             size_t count,
+                             bool primitiveRestartEnabled)
+{
+    switch (indexType)
+    {
+        case GL_UNSIGNED_BYTE:
+            return ComputeTypedIndexRange(static_cast&lt;const GLubyte *&gt;(indices), count,
+                                          primitiveRestartEnabled,
+                                          GetPrimitiveRestartIndex(indexType));
+        case GL_UNSIGNED_SHORT:
+            return ComputeTypedIndexRange(static_cast&lt;const GLushort *&gt;(indices), count,
+                                          primitiveRestartEnabled,
+                                          GetPrimitiveRestartIndex(indexType));
+        case GL_UNSIGNED_INT:
+            return ComputeTypedIndexRange(static_cast&lt;const GLuint *&gt;(indices), count,
+                                          primitiveRestartEnabled,
+                                          GetPrimitiveRestartIndex(indexType));
+        default:
+            UNREACHABLE();
+            return IndexRange();
+    }
+}
+
+GLuint GetPrimitiveRestartIndex(GLenum indexType)
+{
+    switch (indexType)
+    {
+        case GL_UNSIGNED_BYTE:
+            return 0xFF;
+        case GL_UNSIGNED_SHORT:
+            return 0xFFFF;
+        case GL_UNSIGNED_INT:
+            return 0xFFFFFFFF;
+        default:
+            UNREACHABLE();
+            return 0;
+    }
+}
+
</ins><span class="cx"> bool IsTriangleMode(GLenum drawMode)
</span><span class="cx"> {
</span><span class="cx">     switch (drawMode)
</span><span class="lines">@@ -493,8 +639,117 @@
</span><span class="cx">     return name.substr(0, open);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+unsigned int ParseAndStripArrayIndex(std::string *name)
+{
+    unsigned int subscript = GL_INVALID_INDEX;
+
+    // Strip any trailing array operator and retrieve the subscript
+    size_t open  = name-&gt;find_last_of('[');
+    size_t close = name-&gt;find_last_of(']');
+    if (open != std::string::npos &amp;&amp; close == name-&gt;length() - 1)
+    {
+        subscript = atoi(name-&gt;c_str() + open + 1);
+        name-&gt;erase(open);
+    }
+
+    return subscript;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}  // namespace gl
+
+namespace egl
+{
+static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 1,
+              &quot;Unexpected EGL cube map enum value.&quot;);
+static_assert(EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 2,
+              &quot;Unexpected EGL cube map enum value.&quot;);
+static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 3,
+              &quot;Unexpected EGL cube map enum value.&quot;);
+static_assert(EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 4,
+              &quot;Unexpected EGL cube map enum value.&quot;);
+static_assert(EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR - EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR == 5,
+              &quot;Unexpected EGL cube map enum value.&quot;);
+
+bool IsCubeMapTextureTarget(EGLenum target)
+{
+    return (target &gt;= FirstCubeMapTextureTarget &amp;&amp; target &lt;= LastCubeMapTextureTarget);
+}
+
+size_t CubeMapTextureTargetToLayerIndex(EGLenum target)
+{
+    ASSERT(IsCubeMapTextureTarget(target));
+    return target - static_cast&lt;size_t&gt;(FirstCubeMapTextureTarget);
+}
+
+EGLenum LayerIndexToCubeMapTextureTarget(size_t index)
+{
+    ASSERT(index &lt;= (LastCubeMapTextureTarget - FirstCubeMapTextureTarget));
+    return FirstCubeMapTextureTarget + static_cast&lt;GLenum&gt;(index);
+}
+
+bool IsTextureTarget(EGLenum target)
+{
+    switch (target)
+    {
+        case EGL_GL_TEXTURE_2D_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
+        case EGL_GL_TEXTURE_3D_KHR:
+            return true;
+
+        default:
+            return false;
+    }
+}
+
+bool IsRenderbufferTarget(EGLenum target)
+{
+    return target == EGL_GL_RENDERBUFFER_KHR;
+}
+}
+
+namespace egl_gl
+{
+GLenum EGLCubeMapTargetToGLCubeMapTarget(EGLenum eglTarget)
+{
+    ASSERT(egl::IsCubeMapTextureTarget(eglTarget));
+    return gl::LayerIndexToCubeMapTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget));
+}
+
+GLenum EGLImageTargetToGLTextureTarget(EGLenum eglTarget)
+{
+    switch (eglTarget)
+    {
+        case EGL_GL_TEXTURE_2D_KHR:
+            return GL_TEXTURE_2D;
+
+        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
+            return EGLCubeMapTargetToGLCubeMapTarget(eglTarget);
+
+        case EGL_GL_TEXTURE_3D_KHR:
+            return GL_TEXTURE_3D;
+
+        default:
+            UNREACHABLE();
+            return GL_NONE;
+    }
+}
+
+GLuint EGLClientBufferToGLObjectHandle(EGLClientBuffer buffer)
+{
+    return static_cast&lt;GLuint&gt;(reinterpret_cast&lt;uintptr_t&gt;(buffer));
+}
+}
+
</ins><span class="cx"> #if !defined(ANGLE_ENABLE_WINDOWS_STORE)
</span><span class="cx"> std::string getTempPath()
</span><span class="cx"> {
</span><span class="lines">@@ -542,32 +797,7 @@
</span><span class="cx"> // to run, the function returns immediately, and the thread continues execution.
</span><span class="cx"> void ScheduleYield()
</span><span class="cx"> {
</span><del>-#if defined(ANGLE_ENABLE_WINDOWS_STORE)
-    // This implementation of Sleep exists because it is not available prior to Update 4.
-    static HANDLE singletonEvent = nullptr;
-    HANDLE sleepEvent = singletonEvent;
-    if (!sleepEvent)
-    {
-        sleepEvent = CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);
-
-        if (!sleepEvent)
-            return;
-
-        HANDLE previousEvent = InterlockedCompareExchangePointerRelease(&amp;singletonEvent, sleepEvent, nullptr);
-
-        if (previousEvent)
-        {
-            // Back out if multiple threads try to demand create at the same time.
-            CloseHandle(sleepEvent);
-            sleepEvent = previousEvent;
-        }
-    }
-
-    // Emulate sleep by waiting with timeout on an event that is never signalled.
-    WaitForSingleObjectEx(sleepEvent, 0, false);
-#else
</del><span class="cx">     Sleep(0);
</span><del>-#endif
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonutilitiesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/utilities.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/utilities.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/utilities.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,10 +9,15 @@
</span><span class="cx"> #ifndef COMMON_UTILITIES_H_
</span><span class="cx"> #define COMMON_UTILITIES_H_
</span><span class="cx"> 
</span><ins>+#include &lt;EGL/egl.h&gt;
+#include &lt;EGL/eglext.h&gt;
+
</ins><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> #include &lt;string&gt;
</span><span class="cx"> #include &lt;math.h&gt;
</span><span class="cx"> 
</span><ins>+#include &quot;common/mathutil.h&quot;
+
</ins><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -25,6 +30,7 @@
</span><span class="cx"> int VariableRowCount(GLenum type);
</span><span class="cx"> int VariableColumnCount(GLenum type);
</span><span class="cx"> bool IsSamplerType(GLenum type);
</span><ins>+GLenum SamplerTypeToTextureType(GLenum samplerType);
</ins><span class="cx"> bool IsMatrixType(GLenum type);
</span><span class="cx"> GLenum TransposeMatrixType(GLenum type);
</span><span class="cx"> int VariableRegisterCount(GLenum type);
</span><span class="lines">@@ -44,6 +50,16 @@
</span><span class="cx"> // set to GL_INVALID_INDEX if the provided name is not an array or the array index is invalid.
</span><span class="cx"> std::string ParseUniformName(const std::string &amp;name, size_t *outSubscript);
</span><span class="cx"> 
</span><ins>+// Find the range of index values in the provided indices pointer.  Primitive restart indices are
+// only counted in the range if primitive restart is disabled.
+IndexRange ComputeIndexRange(GLenum indexType,
+                             const GLvoid *indices,
+                             size_t count,
+                             bool primitiveRestartEnabled);
+
+// Get the primitive restart index value for the given index type.
+GLuint GetPrimitiveRestartIndex(GLenum indexType);
+
</ins><span class="cx"> bool IsTriangleMode(GLenum drawMode);
</span><span class="cx"> 
</span><span class="cx"> // [OpenGL ES 3.0.2] Section 2.3.1 page 14
</span><span class="lines">@@ -52,8 +68,28 @@
</span><span class="cx"> template &lt;typename outT&gt; outT iround(GLfloat value) { return static_cast&lt;outT&gt;(value &gt; 0.0f ? floor(value + 0.5f) : ceil(value - 0.5f)); }
</span><span class="cx"> template &lt;typename outT&gt; outT uiround(GLfloat value) { return static_cast&lt;outT&gt;(value + 0.5f); }
</span><span class="cx"> 
</span><ins>+unsigned int ParseAndStripArrayIndex(std::string *name);
+
+}  // namespace gl
+
+namespace egl
+{
+static const EGLenum FirstCubeMapTextureTarget = EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR;
+static const EGLenum LastCubeMapTextureTarget = EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR;
+bool IsCubeMapTextureTarget(EGLenum target);
+size_t CubeMapTextureTargetToLayerIndex(EGLenum target);
+EGLenum LayerIndexToCubeMapTextureTarget(size_t index);
+bool IsTextureTarget(EGLenum target);
+bool IsRenderbufferTarget(EGLenum target);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+namespace egl_gl
+{
+GLenum EGLCubeMapTargetToGLCubeMapTarget(EGLenum eglTarget);
+GLenum EGLImageTargetToGLTextureTarget(EGLenum eglTarget);
+GLuint EGLClientBufferToGLObjectHandle(EGLClientBuffer buffer);
+}
+
</ins><span class="cx"> #if !defined(ANGLE_ENABLE_WINDOWS_STORE)
</span><span class="cx"> std::string getTempPath();
</span><span class="cx"> void writeFile(const char* path, const void* data, size_t size);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccommonversionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/common/version.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/common/version.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/common/version.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,12 +12,17 @@
</span><span class="cx"> #define ANGLE_MAJOR_VERSION 2
</span><span class="cx"> #define ANGLE_MINOR_VERSION 1
</span><span class="cx"> 
</span><ins>+#ifndef ANGLE_REVISION
+#define ANGLE_REVISION 0
+#endif
+
</ins><span class="cx"> #define ANGLE_STRINGIFY(x)       #x
</span><span class="cx"> #define ANGLE_MACRO_STRINGIFY(x) ANGLE_STRINGIFY(x)
</span><span class="cx"> 
</span><span class="cx"> #define ANGLE_VERSION_STRING                       \
</span><span class="cx">     ANGLE_MACRO_STRINGIFY(ANGLE_MAJOR_VERSION) &quot;.&quot; \
</span><span class="cx">     ANGLE_MACRO_STRINGIFY(ANGLE_MINOR_VERSION) &quot;.&quot; \
</span><ins>+    ANGLE_MACRO_STRINGIFY(ANGLE_REVISION) &quot;.&quot; \
</ins><span class="cx">     ANGLE_COMMIT_HASH
</span><span class="cx"> 
</span><span class="cx"> #endif // COMMON_VERSION_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorDiagnosticsBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -105,16 +105,16 @@
</span><span class="cx">       case PP_VERSION_NOT_FIRST_STATEMENT:
</span><span class="cx">         return &quot;#version directive must occur before anything else, &quot;
</span><span class="cx">                &quot;except for comments and white space&quot;;
</span><ins>+      case PP_VERSION_NOT_FIRST_LINE_ESSL3:
+        return &quot;#version directive must occur on the first line of the shader&quot;;
</ins><span class="cx">       case PP_INVALID_LINE_NUMBER:
</span><span class="cx">         return &quot;invalid line number&quot;;
</span><span class="cx">       case PP_INVALID_FILE_NUMBER:
</span><span class="cx">         return &quot;invalid file number&quot;;
</span><span class="cx">       case PP_INVALID_LINE_DIRECTIVE:
</span><span class="cx">         return &quot;invalid line directive&quot;;
</span><del>-      case PP_INVALID_PRAGMA:
-        return &quot;invalid pragma&quot;;
-      case PP_INVALID_PRAGMA_VALUE:
-        return &quot;invalid pragma value, must be 'on' or 'off'&quot;;
</del><ins>+      case PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3:
+        return &quot;extension directive must occur before any non-preprocessor tokens in ESSL3&quot;;
</ins><span class="cx">       // Errors end.
</span><span class="cx">       // Warnings begin.
</span><span class="cx">       case PP_EOF_IN_DIRECTIVE:
</span><span class="lines">@@ -123,6 +123,10 @@
</span><span class="cx">         return &quot;unexpected token after conditional expression&quot;;
</span><span class="cx">       case PP_UNRECOGNIZED_PRAGMA:
</span><span class="cx">         return &quot;unrecognized pragma&quot;;
</span><ins>+      case PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1:
+        return &quot;extension directive should occur before any non-preprocessor tokens&quot;;
+      case PP_WARNING_MACRO_NAME_RESERVED:
+        return &quot;macro name with a double underscore is reserved - unintented behavior is possible&quot;;
</ins><span class="cx">       // Warnings end.
</span><span class="cx">       default:
</span><span class="cx">         assert(false);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorDiagnosticsBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DiagnosticsBase.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -60,16 +60,18 @@
</span><span class="cx">         PP_INVALID_VERSION_NUMBER,
</span><span class="cx">         PP_INVALID_VERSION_DIRECTIVE,
</span><span class="cx">         PP_VERSION_NOT_FIRST_STATEMENT,
</span><ins>+        PP_VERSION_NOT_FIRST_LINE_ESSL3,
</ins><span class="cx">         PP_INVALID_LINE_NUMBER,
</span><span class="cx">         PP_INVALID_FILE_NUMBER,
</span><span class="cx">         PP_INVALID_LINE_DIRECTIVE,
</span><del>-        PP_INVALID_PRAGMA,
-        PP_INVALID_PRAGMA_VALUE,
</del><ins>+        PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3,
</ins><span class="cx">         PP_ERROR_END,
</span><span class="cx"> 
</span><span class="cx">         PP_WARNING_BEGIN,
</span><span class="cx">         PP_EOF_IN_DIRECTIVE,
</span><span class="cx">         PP_UNRECOGNIZED_PRAGMA,
</span><ins>+        PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1,
+        PP_WARNING_MACRO_NAME_RESERVED,
</ins><span class="cx">         PP_WARNING_END
</span><span class="cx">     };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorDirectiveParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -119,14 +119,12 @@
</span><span class="cx"> bool isMacroNameReserved(const std::string &amp;name)
</span><span class="cx"> {
</span><span class="cx">     // Names prefixed with &quot;GL_&quot; are reserved.
</span><del>-    if (name.substr(0, 3) == &quot;GL_&quot;)
-        return true;
</del><ins>+    return (name.substr(0, 3) == &quot;GL_&quot;);
+}
</ins><span class="cx"> 
</span><del>-    // Names containing two consecutive underscores are reserved.
-    if (name.find(&quot;__&quot;) != std::string::npos)
-        return true;
-
-    return false;
</del><ins>+bool hasDoubleUnderscores(const std::string &amp;name)
+{
+    return (name.find(&quot;__&quot;) != std::string::npos);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool isMacroPredefined(const std::string &amp;name,
</span><span class="lines">@@ -141,80 +139,17 @@
</span><span class="cx"> namespace pp
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-class DefinedParser : public Lexer
-{
-  public:
-    DefinedParser(Lexer *lexer,
-                  const MacroSet *macroSet,
-                  Diagnostics *diagnostics)
-        : mLexer(lexer),
-          mMacroSet(macroSet),
-          mDiagnostics(diagnostics)
-    {
-    }
-
-  protected:
-    virtual void lex(Token *token)
-    {
-        const char kDefined[] = &quot;defined&quot;;
-
-        mLexer-&gt;lex(token);
-        if (token-&gt;type != Token::IDENTIFIER)
-            return;
-        if (token-&gt;text != kDefined)
-            return;
-
-        bool paren = false;
-        mLexer-&gt;lex(token);
-        if (token-&gt;type == '(')
-        {
-            paren = true;
-            mLexer-&gt;lex(token);
-        }
-
-        if (token-&gt;type != Token::IDENTIFIER)
-        {
-            mDiagnostics-&gt;report(Diagnostics::PP_UNEXPECTED_TOKEN,
-                                 token-&gt;location, token-&gt;text);
-            skipUntilEOD(mLexer, token);
-            return;
-        }
-        MacroSet::const_iterator iter = mMacroSet-&gt;find(token-&gt;text);
-        std::string expression = iter != mMacroSet-&gt;end() ? &quot;1&quot; : &quot;0&quot;;
-
-        if (paren)
-        {
-            mLexer-&gt;lex(token);
-            if (token-&gt;type != ')')
-            {
-                mDiagnostics-&gt;report(Diagnostics::PP_UNEXPECTED_TOKEN,
-                                     token-&gt;location, token-&gt;text);
-                skipUntilEOD(mLexer, token);
-                return;
-            }
-        }
-
-        // We have a valid defined operator.
-        // Convert the current token into a CONST_INT token.
-        token-&gt;type = Token::CONST_INT;
-        token-&gt;text = expression;
-    }
-
-  private:
-    Lexer *mLexer;
-    const MacroSet *mMacroSet;
-    Diagnostics *mDiagnostics;
-};
-
</del><span class="cx"> DirectiveParser::DirectiveParser(Tokenizer *tokenizer,
</span><span class="cx">                                  MacroSet *macroSet,
</span><span class="cx">                                  Diagnostics *diagnostics,
</span><span class="cx">                                  DirectiveHandler *directiveHandler)
</span><span class="cx">     : mPastFirstStatement(false),
</span><ins>+      mSeenNonPreprocessorToken(false),
</ins><span class="cx">       mTokenizer(tokenizer),
</span><span class="cx">       mMacroSet(macroSet),
</span><span class="cx">       mDiagnostics(diagnostics),
</span><del>-      mDirectiveHandler(directiveHandler)
</del><ins>+      mDirectiveHandler(directiveHandler),
+      mShaderVersion(100)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -229,6 +164,10 @@
</span><span class="cx">             parseDirective(token);
</span><span class="cx">             mPastFirstStatement = true;
</span><span class="cx">         }
</span><ins>+        else if (!isEOD(token))
+        {
+            mSeenNonPreprocessorToken = true;
+        }
</ins><span class="cx"> 
</span><span class="cx">         if (token-&gt;type == Token::LAST)
</span><span class="cx">         {
</span><span class="lines">@@ -350,6 +289,16 @@
</span><span class="cx">                              token-&gt;location, token-&gt;text);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><ins>+    // Using double underscores is allowed, but may result in unintended
+    // behavior, so a warning is issued. At the time of writing this was
+    // specified in ESSL 3.10, but the intent judging from Khronos
+    // discussions and dEQP tests was that double underscores should be
+    // allowed in earlier ESSL versions too.
+    if (hasDoubleUnderscores(token-&gt;text))
+    {
+        mDiagnostics-&gt;report(Diagnostics::PP_WARNING_MACRO_NAME_RESERVED, token-&gt;location,
+                             token-&gt;text);
+    }
</ins><span class="cx"> 
</span><span class="cx">     Macro macro;
</span><span class="cx">     macro.type = Macro::kTypeObj;
</span><span class="lines">@@ -625,8 +574,7 @@
</span><span class="cx">             break;
</span><span class="cx">           case PRAGMA_VALUE:
</span><span class="cx">             value = token-&gt;text;
</span><del>-            // Pragma value validation is handled in DirectiveHandler::handlePragma
-            // because the proper pragma value is dependent on the pragma name.
</del><ins>+            valid = valid &amp;&amp; (token-&gt;type == Token::IDENTIFIER);
</ins><span class="cx">             break;
</span><span class="cx">           case RIGHT_PAREN:
</span><span class="cx">             valid = valid &amp;&amp; (token-&gt;type == ')');
</span><span class="lines">@@ -643,7 +591,7 @@
</span><span class="cx">                       (state == RIGHT_PAREN + 1));  // With value.
</span><span class="cx">     if (!valid)
</span><span class="cx">     {
</span><del>-        mDiagnostics-&gt;report(Diagnostics::PP_INVALID_PRAGMA,
</del><ins>+        mDiagnostics-&gt;report(Diagnostics::PP_UNRECOGNIZED_PRAGMA,
</ins><span class="cx">                              token-&gt;location, name);
</span><span class="cx">     }
</span><span class="cx">     else if (state &gt; PRAGMA_NAME)  // Do not notify for empty pragma.
</span><span class="lines">@@ -715,6 +663,20 @@
</span><span class="cx">                              token-&gt;location, token-&gt;text);
</span><span class="cx">         valid = false;
</span><span class="cx">     }
</span><ins>+    if (valid &amp;&amp; mSeenNonPreprocessorToken)
+    {
+        if (mShaderVersion &gt;= 300)
+        {
+            mDiagnostics-&gt;report(Diagnostics::PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3,
+                                 token-&gt;location, token-&gt;text);
+            valid = false;
+        }
+        else
+        {
+            mDiagnostics-&gt;report(Diagnostics::PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1,
+                                 token-&gt;location, token-&gt;text);
+        }
+    }
</ins><span class="cx">     if (valid)
</span><span class="cx">         mDirectiveHandler-&gt;handleExtension(token-&gt;location, name, behavior);
</span><span class="cx"> }
</span><span class="lines">@@ -791,9 +753,18 @@
</span><span class="cx">         valid = false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (valid &amp;&amp; version &gt;= 300 &amp;&amp; token-&gt;location.line &gt; 1)
+    {
+        mDiagnostics-&gt;report(Diagnostics::PP_VERSION_NOT_FIRST_LINE_ESSL3,
+                             token-&gt;location, token-&gt;text);
+        valid = false;
+    }
+
</ins><span class="cx">     if (valid)
</span><span class="cx">     {
</span><span class="cx">         mDirectiveHandler-&gt;handleVersion(token-&gt;location, version);
</span><ins>+        mShaderVersion = version;
+        PredefineMacro(mMacroSet, &quot;__VERSION__&quot;, version);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -801,72 +772,60 @@
</span><span class="cx"> {
</span><span class="cx">     assert(getDirective(token) == DIRECTIVE_LINE);
</span><span class="cx"> 
</span><del>-    enum State
-    {
-        LINE_NUMBER,
-        FILE_NUMBER
-    };
-
</del><span class="cx">     bool valid = true;
</span><ins>+    bool parsedFileNumber = false;
</ins><span class="cx">     int line = 0, file = 0;
</span><del>-    int state = LINE_NUMBER;
</del><span class="cx"> 
</span><del>-    MacroExpander macroExpander(mTokenizer, mMacroSet, mDiagnostics);
</del><ins>+    MacroExpander macroExpander(mTokenizer, mMacroSet, mDiagnostics, false);
+
+    // Lex the first token after &quot;#line&quot; so we can check it for EOD.
</ins><span class="cx">     macroExpander.lex(token);
</span><del>-    while ((token-&gt;type != '\n') &amp;&amp; (token-&gt;type != Token::LAST))
</del><ins>+
+    if (isEOD(token))
</ins><span class="cx">     {
</span><del>-        switch (state++)
</del><ins>+        mDiagnostics-&gt;report(Diagnostics::PP_INVALID_LINE_DIRECTIVE, token-&gt;location, token-&gt;text);
+        valid = false;
+    }
+    else
+    {
+        ExpressionParser expressionParser(&amp;macroExpander, mDiagnostics);
+        ExpressionParser::ErrorSettings errorSettings;
+
+        // See GLES3 section 12.42
+        errorSettings.integerLiteralsMustFit32BitSignedRange = true;
+
+        errorSettings.unexpectedIdentifier = Diagnostics::PP_INVALID_LINE_NUMBER;
+        // The first token was lexed earlier to check if it was EOD. Include
+        // the token in parsing for a second time by setting the
+        // parsePresetToken flag to true.
+        expressionParser.parse(token, &amp;line, true, errorSettings, &amp;valid);
+        if (!isEOD(token) &amp;&amp; valid)
</ins><span class="cx">         {
</span><del>-          case LINE_NUMBER:
-            if (valid &amp;&amp; (token-&gt;type != Token::CONST_INT))
-            {
-                mDiagnostics-&gt;report(Diagnostics::PP_INVALID_LINE_NUMBER,
-                                     token-&gt;location, token-&gt;text);
-                valid = false;
-            }
-            if (valid &amp;&amp; !token-&gt;iValue(&amp;line))
-            {
-                mDiagnostics-&gt;report(Diagnostics::PP_INTEGER_OVERFLOW,
-                                     token-&gt;location, token-&gt;text);
-                valid = false;
-            }
-            break;
-          case FILE_NUMBER:
-            if (valid &amp;&amp; (token-&gt;type != Token::CONST_INT))
-            {
-                mDiagnostics-&gt;report(Diagnostics::PP_INVALID_FILE_NUMBER,
-                                     token-&gt;location, token-&gt;text);
-                valid = false;
-            }
-            if (valid &amp;&amp; !token-&gt;iValue(&amp;file))
-            {
-                mDiagnostics-&gt;report(Diagnostics::PP_INTEGER_OVERFLOW,
-                                     token-&gt;location, token-&gt;text);
-                valid = false;
-            }
-            break;
-          default:
</del><ins>+            errorSettings.unexpectedIdentifier = Diagnostics::PP_INVALID_FILE_NUMBER;
+            // After parsing the line expression expressionParser has also
+            // advanced to the first token of the file expression - this is the
+            // token that makes the parser reduce the &quot;input&quot; rule for the line
+            // expression and stop. So we're using parsePresetToken = true here
+            // as well.
+            expressionParser.parse(token, &amp;file, true, errorSettings, &amp;valid);
+            parsedFileNumber = true;
+        }
+        if (!isEOD(token))
+        {
</ins><span class="cx">             if (valid)
</span><span class="cx">             {
</span><span class="cx">                 mDiagnostics-&gt;report(Diagnostics::PP_UNEXPECTED_TOKEN,
</span><span class="cx">                                      token-&gt;location, token-&gt;text);
</span><span class="cx">                 valid = false;
</span><span class="cx">             }
</span><del>-            break;
</del><ins>+            skipUntilEOD(mTokenizer, token);
</ins><span class="cx">         }
</span><del>-        macroExpander.lex(token);
</del><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (valid &amp;&amp; (state != FILE_NUMBER) &amp;&amp; (state != FILE_NUMBER + 1))
-    {
-        mDiagnostics-&gt;report(Diagnostics::PP_INVALID_LINE_DIRECTIVE,
-                             token-&gt;location, token-&gt;text);
-        valid = false;
-    }
</del><span class="cx">     if (valid)
</span><span class="cx">     {
</span><span class="cx">         mTokenizer-&gt;setLineNumber(line);
</span><del>-        if (state == FILE_NUMBER + 1)
</del><ins>+        if (parsedFileNumber)
</ins><span class="cx">             mTokenizer-&gt;setFileNumber(file);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -926,14 +885,17 @@
</span><span class="cx">     assert((getDirective(token) == DIRECTIVE_IF) ||
</span><span class="cx">            (getDirective(token) == DIRECTIVE_ELIF));
</span><span class="cx"> 
</span><del>-    DefinedParser definedParser(mTokenizer, mMacroSet, mDiagnostics);
-    MacroExpander macroExpander(&amp;definedParser, mMacroSet, mDiagnostics);
</del><ins>+    MacroExpander macroExpander(mTokenizer, mMacroSet, mDiagnostics, true);
</ins><span class="cx">     ExpressionParser expressionParser(&amp;macroExpander, mDiagnostics);
</span><span class="cx"> 
</span><span class="cx">     int expression = 0;
</span><del>-    macroExpander.lex(token);
-    expressionParser.parse(token, &amp;expression);
</del><ins>+    ExpressionParser::ErrorSettings errorSettings;
+    errorSettings.integerLiteralsMustFit32BitSignedRange = false;
+    errorSettings.unexpectedIdentifier                   = Diagnostics::PP_CONDITIONAL_UNEXPECTED_TOKEN;
</ins><span class="cx"> 
</span><ins>+    bool valid = true;
+    expressionParser.parse(token, &amp;expression, false, errorSettings, &amp;valid);
+
</ins><span class="cx">     // Check if there are tokens after #if expression.
</span><span class="cx">     if (!isEOD(token))
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorDirectiveParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/DirectiveParser.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx">                     Diagnostics *diagnostics,
</span><span class="cx">                     DirectiveHandler *directiveHandler);
</span><span class="cx"> 
</span><del>-    virtual void lex(Token *token);
</del><ins>+    void lex(Token *token) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     PP_DISALLOW_COPY_AND_ASSIGN(DirectiveParser);
</span><span class="lines">@@ -70,11 +70,14 @@
</span><span class="cx">         }
</span><span class="cx">     };
</span><span class="cx">     bool mPastFirstStatement;
</span><ins>+    bool mSeenNonPreprocessorToken; // Tracks if a non-preprocessor token has been seen yet.  Some macros, such as
+                                    // #extension must be declared before all shader code.
</ins><span class="cx">     std::vector&lt;ConditionalBlock&gt; mConditionalStack;
</span><span class="cx">     Tokenizer *mTokenizer;
</span><span class="cx">     MacroSet *mMacroSet;
</span><span class="cx">     Diagnostics *mDiagnostics;
</span><span class="cx">     DirectiveHandler *mDirectiveHandler;
</span><ins>+    int mShaderVersion;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }  // namespace pp
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorExpressionParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /* A Bison parser, made by GNU Bison 3.0.4.  */
</span><span class="cx"> 
</span><del>-/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ 
</del><ins>+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */
</ins><span class="cx"> 
</span><span class="cx"> /* Bison implementation for Yacc-like parsers in C
</span><span class="cx"> 
</span><span class="lines">@@ -112,6 +112,7 @@
</span><span class="cx"> #include &lt;stdint.h&gt;
</span><span class="cx"> typedef intmax_t YYSTYPE;
</span><span class="cx"> #endif  // _MSC_VER
</span><ins>+
</ins><span class="cx"> #define YYENABLE_NLS 0
</span><span class="cx"> #define YYLTYPE_IS_TRIVIAL 1
</span><span class="cx"> #define YYSTYPE_IS_TRIVIAL 1
</span><span class="lines">@@ -124,6 +125,17 @@
</span><span class="cx">     pp::Lexer* lexer;
</span><span class="cx">     pp::Token* token;
</span><span class="cx">     int* result;
</span><ins>+    bool parsePresetToken;
+
+    pp::ExpressionParser::ErrorSettings errorSettings;
+    bool *valid;
+
+    void startIgnoreErrors() { ++ignoreErrors; }
+    void endIgnoreErrors() { --ignoreErrors; }
+
+    bool isIgnoringErrors() { return ignoreErrors &gt; 0; }
+
+    int ignoreErrors;
</ins><span class="cx"> };
</span><span class="cx"> }  // namespace
</span><span class="cx"> 
</span><span class="lines">@@ -164,15 +176,16 @@
</span><span class="cx">   enum yytokentype
</span><span class="cx">   {
</span><span class="cx">     TOK_CONST_INT = 258,
</span><del>-    TOK_OP_OR = 259,
-    TOK_OP_AND = 260,
-    TOK_OP_EQ = 261,
-    TOK_OP_NE = 262,
-    TOK_OP_LE = 263,
-    TOK_OP_GE = 264,
-    TOK_OP_LEFT = 265,
-    TOK_OP_RIGHT = 266,
-    TOK_UNARY = 267
</del><ins>+    TOK_IDENTIFIER = 259,
+    TOK_OP_OR = 260,
+    TOK_OP_AND = 261,
+    TOK_OP_EQ = 262,
+    TOK_OP_NE = 263,
+    TOK_OP_LE = 264,
+    TOK_OP_GE = 265,
+    TOK_OP_LEFT = 266,
+    TOK_OP_RIGHT = 267,
+    TOK_UNARY = 268
</ins><span class="cx">   };
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -431,23 +444,23 @@
</span><span class="cx"> #endif /* !YYCOPY_NEEDED */
</span><span class="cx"> 
</span><span class="cx"> /* YYFINAL -- State number of the termination state.  */
</span><del>-#define YYFINAL  14
</del><ins>+#define YYFINAL  15
</ins><span class="cx"> /* YYLAST -- Last index in YYTABLE.  */
</span><del>-#define YYLAST   175
</del><ins>+#define YYLAST   176
</ins><span class="cx"> 
</span><span class="cx"> /* YYNTOKENS -- Number of terminals.  */
</span><del>-#define YYNTOKENS  27
</del><ins>+#define YYNTOKENS  28
</ins><span class="cx"> /* YYNNTS -- Number of nonterminals.  */
</span><del>-#define YYNNTS  3
</del><ins>+#define YYNNTS  5
</ins><span class="cx"> /* YYNRULES -- Number of rules.  */
</span><del>-#define YYNRULES  26
</del><ins>+#define YYNRULES  29
</ins><span class="cx"> /* YYNSTATES -- Number of states.  */
</span><del>-#define YYNSTATES  52
</del><ins>+#define YYNSTATES  55
</ins><span class="cx"> 
</span><span class="cx"> /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
</span><span class="cx">    by yylex, with out-of-bounds checking.  */
</span><span class="cx"> #define YYUNDEFTOK  2
</span><del>-#define YYMAXUTOK   267
</del><ins>+#define YYMAXUTOK   268
</ins><span class="cx"> 
</span><span class="cx"> #define YYTRANSLATE(YYX)                                                \
</span><span class="cx">   ((unsigned int) (YYX) &lt;= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
</span><span class="lines">@@ -459,16 +472,16 @@
</span><span class="cx">        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><del>-       2,     2,     2,    23,     2,     2,     2,    21,     8,     2,
-      25,    26,    19,    17,     2,    18,     2,    20,     2,     2,
</del><ins>+       2,     2,     2,    24,     2,     2,     2,    22,     9,     2,
+      26,    27,    20,    18,     2,    19,     2,    21,     2,     2,
</ins><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><del>-      11,     2,    12,     2,     2,     2,     2,     2,     2,     2,
</del><ins>+      12,     2,    13,     2,     2,     2,     2,     2,     2,     2,
</ins><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><del>-       2,     2,     2,     2,     7,     2,     2,     2,     2,     2,
</del><ins>+       2,     2,     2,     2,     8,     2,     2,     2,     2,     2,
</ins><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><del>-       2,     2,     2,     2,     6,     2,    24,     2,     2,     2,
</del><ins>+       2,     2,     2,     2,     7,     2,    25,     2,     2,     2,
</ins><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><span class="lines">@@ -482,16 +495,16 @@
</span><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><span class="cx">        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
</span><span class="cx">        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
</span><del>-       5,     9,    10,    13,    14,    15,    16,    22
</del><ins>+       5,     6,    10,    11,    14,    15,    16,    17,    23
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #if YYDEBUG
</span><span class="cx">   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
</span><del>-static const yytype_uint8 yyrline[] =
</del><ins>+static const yytype_uint16 yyrline[] =
</ins><span class="cx"> {
</span><del>-       0,    97,    97,   104,   105,   108,   111,   114,   117,   120,
-     123,   126,   129,   132,   135,   138,   141,   144,   147,   150,
-     163,   176,   179,   182,   185,   188,   191
</del><ins>+       0,   110,   110,   117,   118,   129,   129,   150,   150,   171,
+     174,   177,   180,   183,   186,   189,   192,   195,   198,   201,
+     204,   207,   210,   230,   250,   253,   256,   259,   262,   265
</ins><span class="cx"> };
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -500,11 +513,11 @@
</span><span class="cx">    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
</span><span class="cx"> static const char *const yytname[] =
</span><span class="cx"> {
</span><del>-  &quot;$end&quot;, &quot;error&quot;, &quot;$undefined&quot;, &quot;TOK_CONST_INT&quot;, &quot;TOK_OP_OR&quot;,
-  &quot;TOK_OP_AND&quot;, &quot;'|'&quot;, &quot;'^'&quot;, &quot;'&amp;'&quot;, &quot;TOK_OP_EQ&quot;, &quot;TOK_OP_NE&quot;, &quot;'&lt;'&quot;,
-  &quot;'&gt;'&quot;, &quot;TOK_OP_LE&quot;, &quot;TOK_OP_GE&quot;, &quot;TOK_OP_LEFT&quot;, &quot;TOK_OP_RIGHT&quot;, &quot;'+'&quot;,
-  &quot;'-'&quot;, &quot;'*'&quot;, &quot;'/'&quot;, &quot;'%'&quot;, &quot;TOK_UNARY&quot;, &quot;'!'&quot;, &quot;'~'&quot;, &quot;'('&quot;, &quot;')'&quot;,
-  &quot;$accept&quot;, &quot;input&quot;, &quot;expression&quot;, YY_NULLPTR
</del><ins>+  &quot;$end&quot;, &quot;error&quot;, &quot;$undefined&quot;, &quot;TOK_CONST_INT&quot;, &quot;TOK_IDENTIFIER&quot;,
+  &quot;TOK_OP_OR&quot;, &quot;TOK_OP_AND&quot;, &quot;'|'&quot;, &quot;'^'&quot;, &quot;'&amp;'&quot;, &quot;TOK_OP_EQ&quot;, &quot;TOK_OP_NE&quot;,
+  &quot;'&lt;'&quot;, &quot;'&gt;'&quot;, &quot;TOK_OP_LE&quot;, &quot;TOK_OP_GE&quot;, &quot;TOK_OP_LEFT&quot;, &quot;TOK_OP_RIGHT&quot;,
+  &quot;'+'&quot;, &quot;'-'&quot;, &quot;'*'&quot;, &quot;'/'&quot;, &quot;'%'&quot;, &quot;TOK_UNARY&quot;, &quot;'!'&quot;, &quot;'~'&quot;, &quot;'('&quot;,
+  &quot;')'&quot;, &quot;$accept&quot;, &quot;input&quot;, &quot;expression&quot;, &quot;$@1&quot;, &quot;$@2&quot;, YY_NULLPTR
</ins><span class="cx"> };
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -513,16 +526,16 @@
</span><span class="cx">    (internal) symbol number NUM (which must be that of a token).  */
</span><span class="cx"> static const yytype_uint16 yytoknum[] =
</span><span class="cx"> {
</span><del>-       0,   256,   257,   258,   259,   260,   124,    94,    38,   261,
-     262,    60,    62,   263,   264,   265,   266,    43,    45,    42,
-      47,    37,   267,    33,   126,    40,    41
</del><ins>+       0,   256,   257,   258,   259,   260,   261,   124,    94,    38,
+     262,   263,    60,    62,   264,   265,   266,   267,    43,    45,
+      42,    47,    37,   268,    33,   126,    40,    41
</ins><span class="cx"> };
</span><span class="cx"> # endif
</span><span class="cx"> 
</span><del>-#define YYPACT_NINF -11
</del><ins>+#define YYPACT_NINF -12
</ins><span class="cx"> 
</span><span class="cx"> #define yypact_value_is_default(Yystate) \
</span><del>-  (!!((Yystate) == (-11)))
</del><ins>+  (!!((Yystate) == (-12)))
</ins><span class="cx"> 
</span><span class="cx"> #define YYTABLE_NINF -1
</span><span class="cx"> 
</span><span class="lines">@@ -533,12 +546,12 @@
</span><span class="cx">      STATE-NUM.  */
</span><span class="cx"> static const yytype_int16 yypact[] =
</span><span class="cx"> {
</span><del>-      46,   -11,    46,    46,    46,    46,    46,    12,    68,   -11,
-     -11,   -11,   -11,    27,   -11,    46,    46,    46,    46,    46,
-      46,    46,    46,    46,    46,    46,    46,    46,    46,    46,
-      46,    46,    46,   -11,    85,   101,   116,   130,   143,   154,
-     154,   -10,   -10,   -10,   -10,    37,    37,    31,    31,   -11,
-     -11,   -11
</del><ins>+      31,   -12,   -12,    31,    31,    31,    31,    31,    51,    76,
+     -12,   -12,   -12,   -12,    53,   -12,   -12,   -12,    31,    31,
+      31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+      31,    31,    31,    31,   -12,    31,    31,   124,   138,    26,
+     149,   149,   -11,   -11,   -11,   -11,   154,   154,    -8,    -8,
+     -12,   -12,   -12,    93,   109
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
</span><span class="lines">@@ -546,24 +559,24 @@
</span><span class="cx">      means the default is an error.  */
</span><span class="cx"> static const yytype_uint8 yydefact[] =
</span><span class="cx"> {
</span><del>-       0,     3,     0,     0,     0,     0,     0,     0,     2,    25,
-      24,    22,    23,     0,     1,     0,     0,     0,     0,     0,
</del><ins>+       0,     3,     4,     0,     0,     0,     0,     0,     0,     2,
+      28,    27,    25,    26,     0,     1,     5,     7,     0,     0,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-       0,     0,     0,    26,     4,     5,     6,     7,     8,    10,
-       9,    14,    13,    12,    11,    16,    15,    18,    17,    21,
-      20,    19
</del><ins>+       0,     0,     0,     0,    29,     0,     0,     9,    10,    11,
+      13,    12,    17,    16,    15,    14,    19,    18,    21,    20,
+      24,    23,    22,     6,     8
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYPGOTO[NTERM-NUM].  */
</span><span class="cx"> static const yytype_int8 yypgoto[] =
</span><span class="cx"> {
</span><del>-     -11,   -11,    -2
</del><ins>+     -12,   -12,    -3,   -12,   -12
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYDEFGOTO[NTERM-NUM].  */
</span><span class="cx"> static const yytype_int8 yydefgoto[] =
</span><span class="cx"> {
</span><del>-      -1,     7,     8
</del><ins>+      -1,     8,     9,    35,    36
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
</span><span class="lines">@@ -571,74 +584,74 @@
</span><span class="cx">      number is the opposite.  If YYTABLE_NINF, syntax error.  */
</span><span class="cx"> static const yytype_uint8 yytable[] =
</span><span class="cx"> {
</span><del>-       9,    10,    11,    12,    13,    26,    27,    28,    29,    30,
-      31,    32,    14,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,     1,
-      30,    31,    32,    33,    28,    29,    30,    31,    32,     0,
-       0,     0,     0,     2,     3,     0,     0,     0,     0,     4,
-       5,     6,    15,    16,    17,    18,    19,    20,    21,    22,
</del><ins>+      10,    11,    12,    13,    14,    27,    28,    29,    30,    31,
+      32,    33,    31,    32,    33,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,     0,    53,    54,     1,     2,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,     3,
+       4,    15,     0,     0,     0,     5,     6,     7,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,     0,     0,     0,     0,
+      34,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    20,    21,    22,
</ins><span class="cx">       23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
</span><del>-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32
</del><ins>+      33,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    29,    30,    31,    32,    33
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> static const yytype_int8 yycheck[] =
</span><span class="cx"> {
</span><del>-       2,     3,     4,     5,     6,    15,    16,    17,    18,    19,
-      20,    21,     0,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,     3,
-      19,    20,    21,    26,    17,    18,    19,    20,    21,    -1,
-      -1,    -1,    -1,    17,    18,    -1,    -1,    -1,    -1,    23,
-      24,    25,     4,     5,     6,     7,     8,     9,    10,    11,
</del><ins>+       3,     4,     5,     6,     7,    16,    17,    18,    19,    20,
+      21,    22,    20,    21,    22,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    -1,    35,    36,     3,     4,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    18,
+      19,     0,    -1,    -1,    -1,    24,    25,    26,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    -1,    -1,    -1,    -1,
+      27,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,     9,    10,    11,
</ins><span class="cx">       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
</span><del>-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21
</del><ins>+      22,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    18,    19,    20,    21,    22
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
</span><span class="cx">      symbol of state STATE-NUM.  */
</span><span class="cx"> static const yytype_uint8 yystos[] =
</span><span class="cx"> {
</span><del>-       0,     3,    17,    18,    23,    24,    25,    28,    29,    29,
-      29,    29,    29,    29,     0,     4,     5,     6,     7,     8,
</del><ins>+       0,     3,     4,    18,    19,    24,    25,    26,    29,    30,
+      30,    30,    30,    30,    30,     0,     5,     6,     7,     8,
</ins><span class="cx">        9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
</span><del>-      19,    20,    21,    26,    29,    29,    29,    29,    29,    29,
-      29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
-      29,    29
</del><ins>+      19,    20,    21,    22,    27,    31,    32,    30,    30,    30,
+      30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
+      30,    30,    30,    30,    30
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
</span><span class="cx"> static const yytype_uint8 yyr1[] =
</span><span class="cx"> {
</span><del>-       0,    27,    28,    29,    29,    29,    29,    29,    29,    29,
-      29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
-      29,    29,    29,    29,    29,    29,    29
</del><ins>+       0,    28,    29,    30,    30,    31,    30,    32,    30,    30,
+      30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
+      30,    30,    30,    30,    30,    30,    30,    30,    30,    30
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
</span><span class="cx"> static const yytype_uint8 yyr2[] =
</span><span class="cx"> {
</span><del>-       0,     2,     1,     1,     3,     3,     3,     3,     3,     3,
</del><ins>+       0,     2,     1,     1,     1,     0,     4,     0,     4,     3,
</ins><span class="cx">        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
</span><del>-       3,     3,     2,     2,     2,     2,     3
</del><ins>+       3,     3,     3,     3,     3,     2,     2,     2,     2,     3
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1332,7 +1345,15 @@
</span><span class="cx">   case 4:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) || (yyvsp[0]);
</del><ins>+        if (!context-&gt;isIgnoringErrors())
+        {
+            // This rule should be applied right after the token is lexed, so we can
+            // refer to context-&gt;token in the error message.
+            context-&gt;diagnostics-&gt;report(context-&gt;errorSettings.unexpectedIdentifier,
+                                         context-&gt;token-&gt;location, context-&gt;token-&gt;text);
+            *(context-&gt;valid) = false;
+        }
+        (yyval) = (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1340,7 +1361,15 @@
</span><span class="cx">   case 5:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) &amp;&amp; (yyvsp[0]);
</del><ins>+        if ((yyvsp[-1]) != 0)
+        {
+            // Ignore errors in the short-circuited part of the expression.
+            // ESSL3.00 section 3.4:
+            // If an operand is not evaluated, the presence of undefined identifiers
+            // in the operand will not cause an error.
+            // Unevaluated division by zero should not cause an error either.
+            context-&gt;startIgnoreErrors();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1348,7 +1377,15 @@
</span><span class="cx">   case 6:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) | (yyvsp[0]);
</del><ins>+        if ((yyvsp[-3]) != 0)
+        {
+            context-&gt;endIgnoreErrors();
+            (yyval) = static_cast&lt;YYSTYPE&gt;(1);
+        }
+        else
+        {
+            (yyval) = (yyvsp[-3]) || (yyvsp[0]);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1356,7 +1393,15 @@
</span><span class="cx">   case 7:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) ^ (yyvsp[0]);
</del><ins>+        if ((yyvsp[-1]) == 0)
+        {
+            // Ignore errors in the short-circuited part of the expression.
+            // ESSL3.00 section 3.4:
+            // If an operand is not evaluated, the presence of undefined identifiers
+            // in the operand will not cause an error.
+            // Unevaluated division by zero should not cause an error either.
+            context-&gt;startIgnoreErrors();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1364,7 +1409,15 @@
</span><span class="cx">   case 8:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) &amp; (yyvsp[0]);
</del><ins>+        if ((yyvsp[-3]) == 0)
+        {
+            context-&gt;endIgnoreErrors();
+            (yyval) = static_cast&lt;YYSTYPE&gt;(0);
+        }
+        else
+        {
+            (yyval) = (yyvsp[-3]) &amp;&amp; (yyvsp[0]);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1372,7 +1425,7 @@
</span><span class="cx">   case 9:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) != (yyvsp[0]);
</del><ins>+        (yyval) = (yyvsp[-2]) | (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1380,7 +1433,7 @@
</span><span class="cx">   case 10:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) == (yyvsp[0]);
</del><ins>+        (yyval) = (yyvsp[-2]) ^ (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1388,7 +1441,7 @@
</span><span class="cx">   case 11:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) &gt;= (yyvsp[0]);
</del><ins>+        (yyval) = (yyvsp[-2]) &amp; (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1396,7 +1449,7 @@
</span><span class="cx">   case 12:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) &lt;= (yyvsp[0]);
</del><ins>+        (yyval) = (yyvsp[-2]) != (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1404,7 +1457,7 @@
</span><span class="cx">   case 13:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) &gt; (yyvsp[0]);
</del><ins>+        (yyval) = (yyvsp[-2]) == (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1412,7 +1465,7 @@
</span><span class="cx">   case 14:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) &lt; (yyvsp[0]);
</del><ins>+        (yyval) = (yyvsp[-2]) &gt;= (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1420,7 +1473,7 @@
</span><span class="cx">   case 15:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) &gt;&gt; (yyvsp[0]);
</del><ins>+        (yyval) = (yyvsp[-2]) &lt;= (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1428,7 +1481,7 @@
</span><span class="cx">   case 16:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) &lt;&lt; (yyvsp[0]);
</del><ins>+        (yyval) = (yyvsp[-2]) &gt; (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1436,7 +1489,7 @@
</span><span class="cx">   case 17:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) - (yyvsp[0]);
</del><ins>+        (yyval) = (yyvsp[-2]) &lt; (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1444,7 +1497,7 @@
</span><span class="cx">   case 18:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval) = (yyvsp[-2]) + (yyvsp[0]);
</del><ins>+        (yyval) = (yyvsp[-2]) &gt;&gt; (yyvsp[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -1452,40 +1505,78 @@
</span><span class="cx">   case 19:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        if ((yyvsp[0]) == 0) {
-            std::ostringstream stream;
-            stream &lt;&lt; (yyvsp[-2]) &lt;&lt; &quot; % &quot; &lt;&lt; (yyvsp[0]);
-            std::string text = stream.str();
-            context-&gt;diagnostics-&gt;report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
-                                         context-&gt;token-&gt;location,
-                                         text.c_str());
-            YYABORT;
-        } else {
</del><ins>+        (yyval) = (yyvsp[-2]) &lt;&lt; (yyvsp[0]);
+    }
+
+    break;
+
+  case 20:
+
+    {
+        (yyval) = (yyvsp[-2]) - (yyvsp[0]);
+    }
+
+    break;
+
+  case 21:
+
+    {
+        (yyval) = (yyvsp[-2]) + (yyvsp[0]);
+    }
+
+    break;
+
+  case 22:
+
+    {
+        if ((yyvsp[0]) == 0)
+        {
+            if (!context-&gt;isIgnoringErrors())
+            {
+                std::ostringstream stream;
+                stream &lt;&lt; (yyvsp[-2]) &lt;&lt; &quot; % &quot; &lt;&lt; (yyvsp[0]);
+                std::string text = stream.str();
+                context-&gt;diagnostics-&gt;report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
+                                             context-&gt;token-&gt;location,
+                                             text.c_str());
+                *(context-&gt;valid) = false;
+            }
+            (yyval) = static_cast&lt;YYSTYPE&gt;(0);
+        }
+        else
+        {
</ins><span class="cx">             (yyval) = (yyvsp[-2]) % (yyvsp[0]);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 20:
</del><ins>+  case 23:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><del>-        if ((yyvsp[0]) == 0) {
-            std::ostringstream stream;
-            stream &lt;&lt; (yyvsp[-2]) &lt;&lt; &quot; / &quot; &lt;&lt; (yyvsp[0]);
-            std::string text = stream.str();
-            context-&gt;diagnostics-&gt;report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
-                                         context-&gt;token-&gt;location,
-                                         text.c_str());
-            YYABORT;
-        } else {
</del><ins>+        if ((yyvsp[0]) == 0)
+        {
+            if (!context-&gt;isIgnoringErrors())
+            {
+                std::ostringstream stream;
+                stream &lt;&lt; (yyvsp[-2]) &lt;&lt; &quot; / &quot; &lt;&lt; (yyvsp[0]);
+                std::string text = stream.str();
+                context-&gt;diagnostics-&gt;report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
+                                            context-&gt;token-&gt;location,
+                                            text.c_str());
+                *(context-&gt;valid) = false;
+            }
+            (yyval) = static_cast&lt;YYSTYPE&gt;(0);
+        }
+        else
+        {
</ins><span class="cx">             (yyval) = (yyvsp[-2]) / (yyvsp[0]);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 21:
</del><ins>+  case 24:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval) = (yyvsp[-2]) * (yyvsp[0]);
</span><span class="lines">@@ -1493,7 +1584,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 22:
</del><ins>+  case 25:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval) = ! (yyvsp[0]);
</span><span class="lines">@@ -1501,7 +1592,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 23:
</del><ins>+  case 26:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval) = ~ (yyvsp[0]);
</span><span class="lines">@@ -1509,7 +1600,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 24:
</del><ins>+  case 27:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval) = - (yyvsp[0]);
</span><span class="lines">@@ -1517,7 +1608,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 25:
</del><ins>+  case 28:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval) = + (yyvsp[0]);
</span><span class="lines">@@ -1525,7 +1616,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 26:
</del><ins>+  case 29:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval) = (yyvsp[-1]);
</span><span class="lines">@@ -1767,22 +1858,35 @@
</span><span class="cx"> 
</span><span class="cx"> int yylex(YYSTYPE *lvalp, Context *context)
</span><span class="cx"> {
</span><ins>+    pp::Token *token = context-&gt;token;
+    if (!context-&gt;parsePresetToken)
+    {
+        context-&gt;lexer-&gt;lex(token);
+    }
+    context-&gt;parsePresetToken = false;
+
</ins><span class="cx">     int type = 0;
</span><span class="cx"> 
</span><del>-    pp::Token *token = context-&gt;token;
</del><span class="cx">     switch (token-&gt;type)
</span><span class="cx">     {
</span><span class="cx">       case pp::Token::CONST_INT: {
</span><span class="cx">         unsigned int val = 0;
</span><del>-        if (!token-&gt;uValue(&amp;val))
</del><ins>+        int testVal = 0;
+        if (!token-&gt;uValue(&amp;val) || (!token-&gt;iValue(&amp;testVal) &amp;&amp;
+                                     context-&gt;errorSettings.integerLiteralsMustFit32BitSignedRange))
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;diagnostics-&gt;report(pp::Diagnostics::PP_INTEGER_OVERFLOW,
</span><span class="cx">                                          token-&gt;location, token-&gt;text);
</span><ins>+            *(context-&gt;valid) = false;
</ins><span class="cx">         }
</span><span class="cx">         *lvalp = static_cast&lt;YYSTYPE&gt;(val);
</span><span class="cx">         type = TOK_CONST_INT;
</span><span class="cx">         break;
</span><span class="cx">       }
</span><ins>+      case pp::Token::IDENTIFIER:
+        *lvalp = static_cast&lt;YYSTYPE&gt;(-1);
+        type = TOK_IDENTIFIER;
+        break;
</ins><span class="cx">       case pp::Token::OP_OR:
</span><span class="cx">         type = TOK_OP_OR;
</span><span class="cx">         break;
</span><span class="lines">@@ -1828,10 +1932,6 @@
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Advance to the next token if the current one is valid.
-    if (type != 0)
-        context-&gt;lexer-&gt;lex(token);
-
</del><span class="cx">     return type;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1850,13 +1950,21 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ExpressionParser::parse(Token *token, int *result)
</del><ins>+bool ExpressionParser::parse(Token *token,
+                             int *result,
+                             bool parsePresetToken,
+                             const ErrorSettings &amp;errorSettings,
+                             bool *valid)
</ins><span class="cx"> {
</span><span class="cx">     Context context;
</span><span class="cx">     context.diagnostics = mDiagnostics;
</span><span class="cx">     context.lexer = mLexer;
</span><span class="cx">     context.token = token;
</span><span class="cx">     context.result = result;
</span><ins>+    context.ignoreErrors = 0;
+    context.parsePresetToken = parsePresetToken;
+    context.errorSettings    = errorSettings;
+    context.valid            = valid;
</ins><span class="cx">     int ret = yyparse(&amp;context);
</span><span class="cx">     switch (ret)
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorExpressionParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,21 +7,31 @@
</span><span class="cx"> #ifndef COMPILER_PREPROCESSOR_EXPRESSIONPARSER_H_
</span><span class="cx"> #define COMPILER_PREPROCESSOR_EXPRESSIONPARSER_H_
</span><span class="cx"> 
</span><ins>+#include &quot;DiagnosticsBase.h&quot;
</ins><span class="cx"> #include &quot;pp_utils.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace pp
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-class Diagnostics;
</del><span class="cx"> class Lexer;
</span><span class="cx"> struct Token;
</span><span class="cx"> 
</span><span class="cx"> class ExpressionParser
</span><span class="cx"> {
</span><span class="cx">   public:
</span><ins>+    struct ErrorSettings
+    {
+        Diagnostics::ID unexpectedIdentifier;
+        bool integerLiteralsMustFit32BitSignedRange;
+    };
+
</ins><span class="cx">     ExpressionParser(Lexer *lexer, Diagnostics *diagnostics);
</span><span class="cx"> 
</span><del>-    bool parse(Token *token, int *result);
</del><ins>+    bool parse(Token *token,
+               int *result,
+               bool parsePresetToken,
+               const ErrorSettings &amp;errorSettings,
+               bool *valid);
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     PP_DISALLOW_COPY_AND_ASSIGN(ExpressionParser);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorExpressionParsery"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.y (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.y        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/ExpressionParser.y        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -52,6 +52,7 @@
</span><span class="cx"> #include &lt;stdint.h&gt;
</span><span class="cx"> typedef intmax_t YYSTYPE;
</span><span class="cx"> #endif  // _MSC_VER
</span><ins>+
</ins><span class="cx"> #define YYENABLE_NLS 0
</span><span class="cx"> #define YYLTYPE_IS_TRIVIAL 1
</span><span class="cx"> #define YYSTYPE_IS_TRIVIAL 1
</span><span class="lines">@@ -64,6 +65,17 @@
</span><span class="cx">     pp::Lexer* lexer;
</span><span class="cx">     pp::Token* token;
</span><span class="cx">     int* result;
</span><ins>+    bool parsePresetToken;
+
+    pp::ExpressionParser::ErrorSettings errorSettings;
+    bool *valid;
+
+    void startIgnoreErrors() { ++ignoreErrors; }
+    void endIgnoreErrors() { --ignoreErrors; }
+
+    bool isIgnoringErrors() { return ignoreErrors &gt; 0; }
+
+    int ignoreErrors;
</ins><span class="cx"> };
</span><span class="cx"> }  // namespace
</span><span class="cx"> %}
</span><span class="lines">@@ -79,6 +91,7 @@
</span><span class="cx"> %}
</span><span class="cx"> 
</span><span class="cx"> %token TOK_CONST_INT
</span><ins>+%token TOK_IDENTIFIER
</ins><span class="cx"> %left TOK_OP_OR
</span><span class="cx"> %left TOK_OP_AND
</span><span class="cx"> %left '|'
</span><span class="lines">@@ -102,12 +115,59 @@
</span><span class="cx"> 
</span><span class="cx"> expression
</span><span class="cx">     : TOK_CONST_INT
</span><del>-    | expression TOK_OP_OR expression {
-        $$ = $1 || $3;
</del><ins>+    | TOK_IDENTIFIER {
+        if (!context-&gt;isIgnoringErrors())
+        {
+            // This rule should be applied right after the token is lexed, so we can
+            // refer to context-&gt;token in the error message.
+            context-&gt;diagnostics-&gt;report(context-&gt;errorSettings.unexpectedIdentifier,
+                                         context-&gt;token-&gt;location, context-&gt;token-&gt;text);
+            *(context-&gt;valid) = false;
+        }
+        $$ = $1;
</ins><span class="cx">     }
</span><del>-    | expression TOK_OP_AND expression {
-        $$ = $1 &amp;&amp; $3;
</del><ins>+    | expression TOK_OP_OR {
+        if ($1 != 0)
+        {
+            // Ignore errors in the short-circuited part of the expression.
+            // ESSL3.00 section 3.4:
+            // If an operand is not evaluated, the presence of undefined identifiers
+            // in the operand will not cause an error.
+            // Unevaluated division by zero should not cause an error either.
+            context-&gt;startIgnoreErrors();
+        }
+    } expression {
+        if ($1 != 0)
+        {
+            context-&gt;endIgnoreErrors();
+            $$ = static_cast&lt;YYSTYPE&gt;(1);
+        }
+        else
+        {
+            $$ = $1 || $4;
+        }
</ins><span class="cx">     }
</span><ins>+    | expression TOK_OP_AND {
+        if ($1 == 0)
+        {
+            // Ignore errors in the short-circuited part of the expression.
+            // ESSL3.00 section 3.4:
+            // If an operand is not evaluated, the presence of undefined identifiers
+            // in the operand will not cause an error.
+            // Unevaluated division by zero should not cause an error either.
+            context-&gt;startIgnoreErrors();
+        }
+    } expression {
+        if ($1 == 0)
+        {
+            context-&gt;endIgnoreErrors();
+            $$ = static_cast&lt;YYSTYPE&gt;(0);
+        }
+        else
+        {
+            $$ = $1 &amp;&amp; $4;
+        }
+    }
</ins><span class="cx">     | expression '|' expression {
</span><span class="cx">         $$ = $1 | $3;
</span><span class="cx">     }
</span><span class="lines">@@ -148,28 +208,42 @@
</span><span class="cx">         $$ = $1 + $3;
</span><span class="cx">     }
</span><span class="cx">     | expression '%' expression {
</span><del>-        if ($3 == 0) {
-            std::ostringstream stream;
-            stream &lt;&lt; $1 &lt;&lt; &quot; % &quot; &lt;&lt; $3;
-            std::string text = stream.str();
-            context-&gt;diagnostics-&gt;report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
-                                         context-&gt;token-&gt;location,
-                                         text.c_str());
-            YYABORT;
-        } else {
</del><ins>+        if ($3 == 0)
+        {
+            if (!context-&gt;isIgnoringErrors())
+            {
+                std::ostringstream stream;
+                stream &lt;&lt; $1 &lt;&lt; &quot; % &quot; &lt;&lt; $3;
+                std::string text = stream.str();
+                context-&gt;diagnostics-&gt;report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
+                                             context-&gt;token-&gt;location,
+                                             text.c_str());
+                *(context-&gt;valid) = false;
+            }
+            $$ = static_cast&lt;YYSTYPE&gt;(0);
+        }
+        else
+        {
</ins><span class="cx">             $$ = $1 % $3;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     | expression '/' expression {
</span><del>-        if ($3 == 0) {
-            std::ostringstream stream;
-            stream &lt;&lt; $1 &lt;&lt; &quot; / &quot; &lt;&lt; $3;
-            std::string text = stream.str();
-            context-&gt;diagnostics-&gt;report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
-                                         context-&gt;token-&gt;location,
-                                         text.c_str());
-            YYABORT;
-        } else {
</del><ins>+        if ($3 == 0)
+        {
+            if (!context-&gt;isIgnoringErrors())
+            {
+                std::ostringstream stream;
+                stream &lt;&lt; $1 &lt;&lt; &quot; / &quot; &lt;&lt; $3;
+                std::string text = stream.str();
+                context-&gt;diagnostics-&gt;report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
+                                            context-&gt;token-&gt;location,
+                                            text.c_str());
+                *(context-&gt;valid) = false;
+            }
+            $$ = static_cast&lt;YYSTYPE&gt;(0);
+        }
+        else
+        {
</ins><span class="cx">             $$ = $1 / $3;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -197,22 +271,35 @@
</span><span class="cx"> 
</span><span class="cx"> int yylex(YYSTYPE *lvalp, Context *context)
</span><span class="cx"> {
</span><ins>+    pp::Token *token = context-&gt;token;
+    if (!context-&gt;parsePresetToken)
+    {
+        context-&gt;lexer-&gt;lex(token);
+    }
+    context-&gt;parsePresetToken = false;
+
</ins><span class="cx">     int type = 0;
</span><span class="cx"> 
</span><del>-    pp::Token *token = context-&gt;token;
</del><span class="cx">     switch (token-&gt;type)
</span><span class="cx">     {
</span><span class="cx">       case pp::Token::CONST_INT: {
</span><span class="cx">         unsigned int val = 0;
</span><del>-        if (!token-&gt;uValue(&amp;val))
</del><ins>+        int testVal = 0;
+        if (!token-&gt;uValue(&amp;val) || (!token-&gt;iValue(&amp;testVal) &amp;&amp;
+                                     context-&gt;errorSettings.integerLiteralsMustFit32BitSignedRange))
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;diagnostics-&gt;report(pp::Diagnostics::PP_INTEGER_OVERFLOW,
</span><span class="cx">                                          token-&gt;location, token-&gt;text);
</span><ins>+            *(context-&gt;valid) = false;
</ins><span class="cx">         }
</span><span class="cx">         *lvalp = static_cast&lt;YYSTYPE&gt;(val);
</span><span class="cx">         type = TOK_CONST_INT;
</span><span class="cx">         break;
</span><span class="cx">       }
</span><ins>+      case pp::Token::IDENTIFIER:
+        *lvalp = static_cast&lt;YYSTYPE&gt;(-1);
+        type = TOK_IDENTIFIER;
+        break;
</ins><span class="cx">       case pp::Token::OP_OR:
</span><span class="cx">         type = TOK_OP_OR;
</span><span class="cx">         break;
</span><span class="lines">@@ -258,10 +345,6 @@
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Advance to the next token if the current one is valid.
-    if (type != 0)
-        context-&gt;lexer-&gt;lex(token);
-
</del><span class="cx">     return type;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -280,13 +363,21 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ExpressionParser::parse(Token *token, int *result)
</del><ins>+bool ExpressionParser::parse(Token *token,
+                             int *result,
+                             bool parsePresetToken,
+                             const ErrorSettings &amp;errorSettings,
+                             bool *valid)
</ins><span class="cx"> {
</span><span class="cx">     Context context;
</span><span class="cx">     context.diagnostics = mDiagnostics;
</span><span class="cx">     context.lexer = mLexer;
</span><span class="cx">     context.token = token;
</span><span class="cx">     context.result = result;
</span><ins>+    context.ignoreErrors = 0;
+    context.parsePresetToken = parsePresetToken;
+    context.errorSettings    = errorSettings;
+    context.valid            = valid;
</ins><span class="cx">     int ret = yyparse(&amp;context);
</span><span class="cx">     switch (ret)
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorInputcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -29,13 +29,75 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-size_t Input::read(char *buf, size_t maxSize)
</del><ins>+const char *Input::skipChar()
</ins><span class="cx"> {
</span><ins>+    // This function should only be called when there is a character to skip.
+    assert(mReadLoc.cIndex &lt; mLength[mReadLoc.sIndex]);
+    ++mReadLoc.cIndex;
+    if (mReadLoc.cIndex == mLength[mReadLoc.sIndex])
+    {
+        ++mReadLoc.sIndex;
+        mReadLoc.cIndex = 0;
+    }
+    if (mReadLoc.sIndex &gt;= mCount)
+    {
+        return nullptr;
+    }
+    return mString[mReadLoc.sIndex] + mReadLoc.cIndex;
+}
+
+size_t Input::read(char *buf, size_t maxSize, int *lineNo)
+{
</ins><span class="cx">     size_t nRead = 0;
</span><del>-    while ((nRead &lt; maxSize) &amp;&amp; (mReadLoc.sIndex &lt; mCount))
</del><ins>+    // The previous call to read might have stopped copying the string when encountering a line
+    // continuation. Check for this possibility first.
+    if (mReadLoc.sIndex &lt; mCount &amp;&amp; maxSize &gt; 0)
</ins><span class="cx">     {
</span><ins>+        const char *c = mString[mReadLoc.sIndex] + mReadLoc.cIndex;
+        if ((*c) == '\\')
+        {
+            c = skipChar();
+            if (c != nullptr &amp;&amp; (*c) == '\n')
+            {
+                // Line continuation of backslash + newline.
+                skipChar();
+                ++(*lineNo);
+            }
+            else if (c != nullptr &amp;&amp; (*c) == '\r')
+            {
+                // Line continuation. Could be backslash + '\r\n' or just backslash + '\r'.
+                c = skipChar();
+                if (c != nullptr &amp;&amp; (*c) == '\n')
+                {
+                    skipChar();
+                }
+                ++(*lineNo);
+            }
+            else
+            {
+                // Not line continuation, so write the skipped backslash to buf.
+                *buf = '\\';
+                ++nRead;
+            }
+        }
+    }
+
+    size_t maxRead = maxSize;
+    while ((nRead &lt; maxRead) &amp;&amp; (mReadLoc.sIndex &lt; mCount))
+    {
</ins><span class="cx">         size_t size = mLength[mReadLoc.sIndex] - mReadLoc.cIndex;
</span><span class="cx">         size = std::min(size, maxSize);
</span><ins>+        for (size_t i = 0; i &lt; size; ++i)
+        {
+            // Stop if a possible line continuation is encountered.
+            // It will be processed on the next call on input, which skips it
+            // and increments line number if necessary.
+            if (*(mString[mReadLoc.sIndex] + mReadLoc.cIndex + i) == '\\')
+            {
+                size = i;
+                maxRead = nRead + size;  // Stop reading right before the backslash.
+            }
+        }
</ins><span class="cx">         std::memcpy(buf + nRead, mString[mReadLoc.sIndex] + mReadLoc.cIndex, size);
</span><span class="cx">         nRead += size;
</span><span class="cx">         mReadLoc.cIndex += size;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorInputh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Input.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx">         return mLength[index];
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    size_t read(char *buf, size_t maxSize);
</del><ins>+    size_t read(char *buf, size_t maxSize, int *lineNo);
</ins><span class="cx"> 
</span><span class="cx">     struct Location
</span><span class="cx">     {
</span><span class="lines">@@ -49,6 +49,10 @@
</span><span class="cx">     const Location &amp;readLoc() const { return mReadLoc; }
</span><span class="cx"> 
</span><span class="cx">   private:
</span><ins>+    // Skip a character and return the next character after the one that was skipped.
+    // Return nullptr if data runs out.
+    const char *skipChar();
+
</ins><span class="cx">     // Input.
</span><span class="cx">     size_t mCount;
</span><span class="cx">     const char * const *mString;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorMacrocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,6 +6,8 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Macro.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;sstream&gt;
+
</ins><span class="cx"> #include &quot;Token.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace pp
</span><span class="lines">@@ -19,5 +21,23 @@
</span><span class="cx">            (replacements == other.replacements);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void PredefineMacro(MacroSet *macroSet, const char *name, int value)
+{
+    std::ostringstream stream;
+    stream &lt;&lt; value;
+
+    Token token;
+    token.type = Token::CONST_INT;
+    token.text = stream.str();
+
+    Macro macro;
+    macro.predefined = true;
+    macro.type       = Macro::kTypeObj;
+    macro.name = name;
+    macro.replacements.push_back(token);
+
+    (*macroSet)[name] = macro;
+}
+
</ins><span class="cx"> }  // namespace pp
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorMacroh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Macro.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -45,6 +45,8 @@
</span><span class="cx"> 
</span><span class="cx"> typedef std::map&lt;std::string, Macro&gt; MacroSet;
</span><span class="cx"> 
</span><ins>+void PredefineMacro(MacroSet *macroSet, const char *name, int value);
+
</ins><span class="cx"> }  // namespace pp
</span><span class="cx"> 
</span><span class="cx"> #endif  // COMPILER_PREPROCESSOR_MACRO_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorMacroExpandercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx">         mIter = mTokens.begin();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual void lex(Token *token)
</del><ins>+    void lex(Token *token) override
</ins><span class="cx">     {
</span><span class="cx">         if (mIter == mTokens.end())
</span><span class="cx">         {
</span><span class="lines">@@ -48,10 +48,9 @@
</span><span class="cx"> 
</span><span class="cx"> MacroExpander::MacroExpander(Lexer *lexer,
</span><span class="cx">                              MacroSet *macroSet,
</span><del>-                             Diagnostics *diagnostics)
-    : mLexer(lexer),
-      mMacroSet(macroSet),
-      mDiagnostics(diagnostics)
</del><ins>+                             Diagnostics *diagnostics,
+                             bool parseDefined)
+    : mLexer(lexer), mMacroSet(macroSet), mDiagnostics(diagnostics), mParseDefined(parseDefined)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -67,11 +66,54 @@
</span><span class="cx"> {
</span><span class="cx">     while (true)
</span><span class="cx">     {
</span><ins>+        const char kDefined[] = &quot;defined&quot;;
+
</ins><span class="cx">         getToken(token);
</span><span class="cx"> 
</span><span class="cx">         if (token-&gt;type != Token::IDENTIFIER)
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+        // Defined operator is parsed here since it may be generated by macro expansion.
+        // Defined operator produced by macro expansion has undefined behavior according to C++
+        // spec, which the GLSL spec references (see C++14 draft spec section 16.1.4), but this
+        // behavior is needed for passing dEQP tests, which enforce stricter compatibility between
+        // implementations.
+        if (mParseDefined &amp;&amp; token-&gt;text == kDefined)
+        {
+            bool paren = false;
+            getToken(token);
+            if (token-&gt;type == '(')
+            {
+                paren = true;
+                getToken(token);
+            }
+            if (token-&gt;type != Token::IDENTIFIER)
+            {
+                mDiagnostics-&gt;report(Diagnostics::PP_UNEXPECTED_TOKEN, token-&gt;location,
+                                     token-&gt;text);
+                break;
+            }
+            auto iter              = mMacroSet-&gt;find(token-&gt;text);
+            std::string expression = iter != mMacroSet-&gt;end() ? &quot;1&quot; : &quot;0&quot;;
+
+            if (paren)
+            {
+                getToken(token);
+                if (token-&gt;type != ')')
+                {
+                    mDiagnostics-&gt;report(Diagnostics::PP_UNEXPECTED_TOKEN, token-&gt;location,
+                                         token-&gt;text);
+                    break;
+                }
+            }
+
+            // We have a valid defined operator.
+            // Convert the current token into a CONST_INT token.
+            token-&gt;type = Token::CONST_INT;
+            token-&gt;text = expression;
+            break;
+        }
+
</ins><span class="cx">         if (token-&gt;expansionDisabled())
</span><span class="cx">             break;
</span><span class="cx"> 
</span><span class="lines">@@ -187,6 +229,12 @@
</span><span class="cx">                                 std::vector&lt;Token&gt; *replacements)
</span><span class="cx"> {
</span><span class="cx">     replacements-&gt;clear();
</span><ins>+
+    // In the case of an object-like macro, the replacement list gets its location
+    // from the identifier, but in the case of a function-like macro, the replacement
+    // list gets its location from the closing parenthesis of the macro invocation.
+    // This is tested by dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.*
+    SourceLocation replacementLocation = identifier.location;
</ins><span class="cx">     if (macro.type == Macro::kTypeObj)
</span><span class="cx">     {
</span><span class="cx">         replacements-&gt;assign(macro.replacements.begin(),
</span><span class="lines">@@ -218,7 +266,7 @@
</span><span class="cx">         assert(macro.type == Macro::kTypeFunc);
</span><span class="cx">         std::vector&lt;MacroArg&gt; args;
</span><span class="cx">         args.reserve(macro.parameters.size());
</span><del>-        if (!collectMacroArgs(macro, identifier, &amp;args))
</del><ins>+        if (!collectMacroArgs(macro, identifier, &amp;args, &amp;replacementLocation))
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="cx">         replaceMacroParams(macro, args, replacements);
</span><span class="lines">@@ -234,14 +282,15 @@
</span><span class="cx">             repl.setAtStartOfLine(identifier.atStartOfLine());
</span><span class="cx">             repl.setHasLeadingSpace(identifier.hasLeadingSpace());
</span><span class="cx">         }
</span><del>-        repl.location = identifier.location;
</del><ins>+        repl.location = replacementLocation;
</ins><span class="cx">     }
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool MacroExpander::collectMacroArgs(const Macro &amp;macro,
</span><span class="cx">                                      const Token &amp;identifier,
</span><del>-                                     std::vector&lt;MacroArg&gt; *args)
</del><ins>+                                     std::vector&lt;MacroArg&gt; *args,
+                                     SourceLocation *closingParenthesisLocation)
</ins><span class="cx"> {
</span><span class="cx">     Token token;
</span><span class="cx">     getToken(&amp;token);
</span><span class="lines">@@ -271,6 +320,7 @@
</span><span class="cx">           case ')':
</span><span class="cx">             --openParens;
</span><span class="cx">             isArg = openParens != 0;
</span><ins>+            *closingParenthesisLocation = token.location;
</ins><span class="cx">             break;
</span><span class="cx">           case ',':
</span><span class="cx">             // The individual arguments are separated by comma tokens, but
</span><span class="lines">@@ -317,7 +367,7 @@
</span><span class="cx">     {
</span><span class="cx">         MacroArg &amp;arg = args-&gt;at(i);
</span><span class="cx">         TokenLexer lexer(&amp;arg);
</span><del>-        MacroExpander expander(&amp;lexer, mMacroSet, mDiagnostics);
</del><ins>+        MacroExpander expander(&amp;lexer, mMacroSet, mDiagnostics, mParseDefined);
</ins><span class="cx"> 
</span><span class="cx">         arg.clear();
</span><span class="cx">         expander.lex(&amp;token);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorMacroExpanderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/MacroExpander.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -19,14 +19,15 @@
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> class Diagnostics;
</span><ins>+struct SourceLocation;
</ins><span class="cx"> 
</span><span class="cx"> class MacroExpander : public Lexer
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    MacroExpander(Lexer *lexer, MacroSet *macroSet, Diagnostics *diagnostics);
-    virtual ~MacroExpander();
</del><ins>+    MacroExpander(Lexer *lexer, MacroSet *macroSet, Diagnostics *diagnostics, bool parseDefined);
+    ~MacroExpander() override;
</ins><span class="cx"> 
</span><del>-    virtual void lex(Token *token);
</del><ins>+    void lex(Token *token) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     PP_DISALLOW_COPY_AND_ASSIGN(MacroExpander);
</span><span class="lines">@@ -45,7 +46,8 @@
</span><span class="cx">     typedef std::vector&lt;Token&gt; MacroArg;
</span><span class="cx">     bool collectMacroArgs(const Macro &amp;macro,
</span><span class="cx">                           const Token &amp;identifier,
</span><del>-                          std::vector&lt;MacroArg&gt; *args);
</del><ins>+                          std::vector&lt;MacroArg&gt; *args,
+                          SourceLocation *closingParenthesisLocation);
</ins><span class="cx">     void replaceMacroParams(const Macro &amp;macro,
</span><span class="cx">                             const std::vector&lt;MacroArg&gt; &amp;args,
</span><span class="cx">                             std::vector&lt;Token&gt; *replacements);
</span><span class="lines">@@ -79,8 +81,9 @@
</span><span class="cx">     Lexer *mLexer;
</span><span class="cx">     MacroSet *mMacroSet;
</span><span class="cx">     Diagnostics *mDiagnostics;
</span><ins>+    bool mParseDefined;
</ins><span class="cx"> 
</span><del>-    std::unique_ptr&lt;Token&gt; mReserveToken;
</del><ins>+    std::auto_ptr&lt;Token&gt; mReserveToken;
</ins><span class="cx">     std::vector&lt;MacroContext *&gt; mContextStack;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorPreprocessorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Preprocessor.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,7 +7,6 @@
</span><span class="cx"> #include &quot;Preprocessor.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;cassert&gt;
</span><del>-#include &lt;sstream&gt;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;DiagnosticsBase.h&quot;
</span><span class="cx"> #include &quot;DirectiveParser.h&quot;
</span><span class="lines">@@ -27,12 +26,11 @@
</span><span class="cx">     DirectiveParser directiveParser;
</span><span class="cx">     MacroExpander macroExpander;
</span><span class="cx"> 
</span><del>-    PreprocessorImpl(Diagnostics *diag,
-                     DirectiveHandler *directiveHandler)
</del><ins>+    PreprocessorImpl(Diagnostics *diag, DirectiveHandler *directiveHandler)
</ins><span class="cx">         : diagnostics(diag),
</span><span class="cx">           tokenizer(diag),
</span><span class="cx">           directiveParser(&amp;tokenizer, &amp;macroSet, diag, directiveHandler),
</span><del>-          macroExpander(&amp;directiveParser, &amp;macroSet, diag)
</del><ins>+          macroExpander(&amp;directiveParser, &amp;macroSet, diag, false)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="lines">@@ -52,12 +50,12 @@
</span><span class="cx">                         const char * const string[],
</span><span class="cx">                         const int length[])
</span><span class="cx"> {
</span><del>-    static const int kGLSLVersion = 100;
</del><ins>+    static const int kDefaultGLSLVersion = 100;
</ins><span class="cx"> 
</span><span class="cx">     // Add standard pre-defined macros.
</span><span class="cx">     predefineMacro(&quot;__LINE__&quot;, 0);
</span><span class="cx">     predefineMacro(&quot;__FILE__&quot;, 0);
</span><del>-    predefineMacro(&quot;__VERSION__&quot;, kGLSLVersion);
</del><ins>+    predefineMacro(&quot;__VERSION__&quot;, kDefaultGLSLVersion);
</ins><span class="cx">     predefineMacro(&quot;GL_ES&quot;, 1);
</span><span class="cx"> 
</span><span class="cx">     return mImpl-&gt;tokenizer.init(count, string, length);
</span><span class="lines">@@ -65,20 +63,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Preprocessor::predefineMacro(const char *name, int value)
</span><span class="cx"> {
</span><del>-    std::ostringstream stream;
-    stream &lt;&lt; value;
-
-    Token token;
-    token.type = Token::CONST_INT;
-    token.text = stream.str();
-
-    Macro macro;
-    macro.predefined = true;
-    macro.type = Macro::kTypeObj;
-    macro.name = name;
-    macro.replacements.push_back(token);
-
-    mImpl-&gt;macroSet[name] = macro;
</del><ins>+    PredefineMacro(&amp;mImpl-&gt;macroSet, name, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Preprocessor::lex(Token *token)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorTokenizercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,11 +6,6 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> // This file is auto-generated by generate_parser.sh. DO NOT EDIT!
</span><del>-// This file was edited anyways to ignore clang warnings.
-#if defined(__clang__)
-#pragma clang diagnostic push
-#pragma GCC diagnostic ignored &quot;-Wunneeded-internal-declaration&quot;
-#endif
</del><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -599,7 +594,7 @@
</span><span class="cx">     } while(0);
</span><span class="cx"> 
</span><span class="cx"> #define YY_INPUT(buf, result, maxSize) \
</span><del>-    result = yyextra-&gt;input.read(buf, maxSize);
</del><ins>+    result = yyextra-&gt;input.read(buf, maxSize, &amp;yylineno);
</ins><span class="cx"> 
</span><span class="cx"> #define INITIAL 0
</span><span class="cx"> #define COMMENT 1
</span><span class="lines">@@ -717,7 +712,7 @@
</span><span class="cx"> static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#ifndef YY_NO_INPUT
</del><ins>+#if 0 //#ifndef YY_NO_INPUT
</ins><span class="cx"> 
</span><span class="cx"> #ifdef __cplusplus
</span><span class="cx"> static int yyinput (yyscan_t yyscanner );
</span><span class="lines">@@ -1531,7 +1526,7 @@
</span><span class="cx">         return yy_is_jam ? 0 : yy_current_state;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#ifndef YY_NO_INPUT
</del><ins>+#if 0 //#ifndef YY_NO_INPUT
</ins><span class="cx"> #ifdef __cplusplus
</span><span class="cx">     static int yyinput (yyscan_t yyscanner)
</span><span class="cx"> #else
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorTokenizerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx">     void setLineNumber(int line);
</span><span class="cx">     void setMaxTokenSize(size_t maxTokenSize);
</span><span class="cx"> 
</span><del>-    virtual void lex(Token *token);
</del><ins>+    void lex(Token *token) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     PP_DISALLOW_COPY_AND_ASSIGN(Tokenizer);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessorTokenizerl"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.l (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.l        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/Tokenizer.l        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -77,7 +77,7 @@
</span><span class="cx">     } while(0);
</span><span class="cx"> 
</span><span class="cx"> #define YY_INPUT(buf, result, maxSize) \
</span><del>-    result = yyextra-&gt;input.read(buf, maxSize);
</del><ins>+    result = yyextra-&gt;input.read(buf, maxSize, &amp;yylineno);
</ins><span class="cx"> 
</span><span class="cx"> %}
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilerpreprocessornumeric_lexh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/numeric_lex.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/numeric_lex.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/preprocessor/numeric_lex.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -48,6 +48,15 @@
</span><span class="cx"> template&lt;typename FloatType&gt;
</span><span class="cx"> bool numeric_lex_float(const std::string &amp;str, FloatType *value)
</span><span class="cx"> {
</span><ins>+// On 64-bit Intel Android, istringstream is broken.  Until this is fixed in
+// a newer NDK, don't use it.  Android doesn't have locale support, so this
+// doesn't have to force the C locale.
+// TODO(thakis): Remove this once this bug has been fixed in the NDK and
+// that NDK has been rolled into chromium.
+#if defined(ANGLE_PLATFORM_ANDROID) &amp;&amp; __x86_64__
+    *value = strtod(str.c_str(), nullptr);
+    return errno != ERANGE;
+#else
</ins><span class="cx">     std::istringstream stream(str);
</span><span class="cx">     // Force &quot;C&quot; locale so that decimal character is always '.', and
</span><span class="cx">     // not dependent on the current locale.
</span><span class="lines">@@ -55,6 +64,7 @@
</span><span class="cx"> 
</span><span class="cx">     stream &gt;&gt; (*value);
</span><span class="cx">     return !stream.fail();
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace pp.
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorASTMetadataHLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -105,6 +105,7 @@
</span><span class="cx">                 {
</span><span class="cx">                     size_t calleeIndex = mDag.findIndex(node);
</span><span class="cx">                     ASSERT(calleeIndex != CallDAG::InvalidIndex &amp;&amp; calleeIndex &lt; mIndex);
</span><ins>+                    UNUSED_ASSERTION_VARIABLE(mIndex);
</ins><span class="cx"> 
</span><span class="cx">                     if ((*mMetadataList)[calleeIndex].mUsesGradient) {
</span><span class="cx">                         onGradient();
</span><span class="lines">@@ -138,13 +139,16 @@
</span><span class="cx">     std::vector&lt;TIntermNode*&gt; mParents;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-// Traverses the AST of a function definition, assuming it has already been used to
-// traverse the callees of that function; computes the discontinuous loops and the if
-// statements that contain a discontinuous loop in their call graph.
-class PullComputeDiscontinuousLoops : public TIntermTraverser
</del><ins>+// Traverses the AST of a function definition to compute the the discontinuous loops
+// and the if statements containing gradient loops. It assumes that the gradient loops
+// (loops that contain a gradient) have already been computed and that it has already
+// traversed the current function's callees.
+class PullComputeDiscontinuousAndGradientLoops : public TIntermTraverser
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    PullComputeDiscontinuousLoops(MetadataList *metadataList, size_t index, const CallDAG &amp;dag)
</del><ins>+    PullComputeDiscontinuousAndGradientLoops(MetadataList *metadataList,
+                                             size_t index,
+                                             const CallDAG &amp;dag)
</ins><span class="cx">         : TIntermTraverser(true, false, true),
</span><span class="cx">           mMetadataList(metadataList),
</span><span class="cx">           mMetadata(&amp;(*metadataList)[index]),
</span><span class="lines">@@ -160,15 +164,15 @@
</span><span class="cx">         ASSERT(mIfs.empty());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Called when a discontinuous loop or a call to a function with a discontinuous loop
-    // in its call graph is found.
-    void onDiscontinuousLoop()
</del><ins>+    // Called when traversing a gradient loop or a call to a function with a
+    // gradient loop in its call graph.
+    void onGradientLoop()
</ins><span class="cx">     {
</span><del>-        mMetadata-&gt;mHasDiscontinuousLoopInCallGraph = true;
</del><ins>+        mMetadata-&gt;mHasGradientLoopInCallGraph = true;
</ins><span class="cx">         // Mark the latest if as using a discontinuous loop.
</span><span class="cx">         if (!mIfs.empty())
</span><span class="cx">         {
</span><del>-            mMetadata-&gt;mIfsContainingDiscontinuousLoop.insert(mIfs.back());
</del><ins>+            mMetadata-&gt;mIfsContainingGradientLoop.insert(mIfs.back());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -177,6 +181,11 @@
</span><span class="cx">         if (visit == PreVisit)
</span><span class="cx">         {
</span><span class="cx">             mLoopsAndSwitches.push_back(loop);
</span><ins>+
+            if (mMetadata-&gt;hasGradientInCallGraph(loop))
+            {
+                onGradientLoop();
+            }
</ins><span class="cx">         }
</span><span class="cx">         else if (visit == PostVisit)
</span><span class="cx">         {
</span><span class="lines">@@ -198,9 +207,9 @@
</span><span class="cx">             ASSERT(mIfs.back() == node);
</span><span class="cx">             mIfs.pop_back();
</span><span class="cx">             // An if using a discontinuous loop means its parents ifs are also discontinuous.
</span><del>-            if (mMetadata-&gt;mIfsContainingDiscontinuousLoop.count(node) &gt; 0 &amp;&amp; !mIfs.empty())
</del><ins>+            if (mMetadata-&gt;mIfsContainingGradientLoop.count(node) &gt; 0 &amp;&amp; !mIfs.empty())
</ins><span class="cx">             {
</span><del>-                mMetadata-&gt;mIfsContainingDiscontinuousLoop.insert(mIfs.back());
</del><ins>+                mMetadata-&gt;mIfsContainingGradientLoop.insert(mIfs.back());
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -220,7 +229,6 @@
</span><span class="cx">                     if (loop != nullptr)
</span><span class="cx">                     {
</span><span class="cx">                         mMetadata-&gt;mDiscontinuousLoops.insert(loop);
</span><del>-                        onDiscontinuousLoop();
</del><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="lines">@@ -236,7 +244,6 @@
</span><span class="cx">                     }
</span><span class="cx">                     ASSERT(loop != nullptr);
</span><span class="cx">                     mMetadata-&gt;mDiscontinuousLoops.insert(loop);
</span><del>-                    onDiscontinuousLoop();
</del><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">               case EOpKill:
</span><span class="lines">@@ -244,15 +251,14 @@
</span><span class="cx">                 // A return or discard jumps out of all the enclosing loops
</span><span class="cx">                 if (!mLoopsAndSwitches.empty())
</span><span class="cx">                 {
</span><del>-                    for (TIntermNode* node : mLoopsAndSwitches)
</del><ins>+                    for (TIntermNode *intermNode : mLoopsAndSwitches)
</ins><span class="cx">                     {
</span><del>-                        TIntermLoop *loop = node-&gt;getAsLoopNode();
</del><ins>+                        TIntermLoop *loop = intermNode-&gt;getAsLoopNode();
</ins><span class="cx">                         if (loop)
</span><span class="cx">                         {
</span><span class="cx">                             mMetadata-&gt;mDiscontinuousLoops.insert(loop);
</span><span class="cx">                         }
</span><span class="cx">                     }
</span><del>-                    onDiscontinuousLoop();
</del><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">               default:
</span><span class="lines">@@ -271,10 +277,11 @@
</span><span class="cx">             {
</span><span class="cx">                 size_t calleeIndex = mDag.findIndex(node);
</span><span class="cx">                 ASSERT(calleeIndex != CallDAG::InvalidIndex &amp;&amp; calleeIndex &lt; mIndex);
</span><ins>+                UNUSED_ASSERTION_VARIABLE(mIndex);
</ins><span class="cx"> 
</span><del>-                if ((*mMetadataList)[calleeIndex].mHasDiscontinuousLoopInCallGraph)
</del><ins>+                if ((*mMetadataList)[calleeIndex].mHasGradientLoopInCallGraph)
</ins><span class="cx">                 {
</span><del>-                    onDiscontinuousLoop();
</del><ins>+                    onGradientLoop();
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -351,6 +358,7 @@
</span><span class="cx">             {
</span><span class="cx">                 size_t calleeIndex = mDag.findIndex(node);
</span><span class="cx">                 ASSERT(calleeIndex != CallDAG::InvalidIndex &amp;&amp; calleeIndex &lt; mIndex);
</span><ins>+                UNUSED_ASSERTION_VARIABLE(mIndex);
</ins><span class="cx"> 
</span><span class="cx">                 (*mMetadataList)[calleeIndex].mCalledInDiscontinuousLoop = true;
</span><span class="cx">             }
</span><span class="lines">@@ -372,19 +380,14 @@
</span><span class="cx"> 
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ASTMetadataHLSL::hasGradientInCallGraph(TIntermSelection *node)
-{
-    return mControlFlowsContainingGradient.count(node) &gt; 0;
-}
-
</del><span class="cx"> bool ASTMetadataHLSL::hasGradientInCallGraph(TIntermLoop *node)
</span><span class="cx"> {
</span><span class="cx">     return mControlFlowsContainingGradient.count(node) &gt; 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ASTMetadataHLSL::hasDiscontinuousLoop(TIntermSelection *node)
</del><ins>+bool ASTMetadataHLSL::hasGradientLoop(TIntermSelection *node)
</ins><span class="cx"> {
</span><del>-    return mIfsContainingDiscontinuousLoop.count(node) &gt; 0;
</del><ins>+    return mIfsContainingGradientLoop.count(node) &gt; 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> MetadataList CreateASTMetadataHLSL(TIntermNode *root, const CallDAG &amp;callDag)
</span><span class="lines">@@ -421,10 +424,10 @@
</span><span class="cx">     // of callgraph analysis as for the gradient.
</span><span class="cx"> 
</span><span class="cx">     // First compute which loops are discontinuous (no specific order) and pull
</span><del>-    // the ifs and functions using a discontinuous loop.
</del><ins>+    // the ifs and functions using a gradient loop.
</ins><span class="cx">     for (size_t i = 0; i &lt; callDag.size(); i++)
</span><span class="cx">     {
</span><del>-        PullComputeDiscontinuousLoops pull(&amp;metadataList, i, callDag);
</del><ins>+        PullComputeDiscontinuousAndGradientLoops pull(&amp;metadataList, i, callDag);
</ins><span class="cx">         pull.traverse(callDag.getRecordFromIndex(i).node);
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorASTMetadataHLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ASTMetadataHLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -22,16 +22,15 @@
</span><span class="cx">     ASTMetadataHLSL()
</span><span class="cx">         : mUsesGradient(false),
</span><span class="cx">           mCalledInDiscontinuousLoop(false),
</span><del>-          mHasDiscontinuousLoopInCallGraph(false),
</del><ins>+          mHasGradientLoopInCallGraph(false),
</ins><span class="cx">           mNeedsLod0(false)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Here &quot;something uses a gradient&quot; means here that it either contains a
</span><span class="cx">     // gradient operation, or a call to a function that uses a gradient.
</span><del>-    bool hasGradientInCallGraph(TIntermSelection *node);
</del><span class="cx">     bool hasGradientInCallGraph(TIntermLoop *node);
</span><del>-    bool hasDiscontinuousLoop(TIntermSelection *node);
</del><ins>+    bool hasGradientLoop(TIntermSelection *node);
</ins><span class="cx"> 
</span><span class="cx">     // Does the function use a gradient.
</span><span class="cx">     bool mUsesGradient;
</span><span class="lines">@@ -43,9 +42,9 @@
</span><span class="cx">     // Remember information about the discontinuous loops and which functions
</span><span class="cx">     // are called in such loops.
</span><span class="cx">     bool mCalledInDiscontinuousLoop;
</span><del>-    bool mHasDiscontinuousLoopInCallGraph;
</del><ins>+    bool mHasGradientLoopInCallGraph;
</ins><span class="cx">     std::set&lt;TIntermLoop*&gt; mDiscontinuousLoops;
</span><del>-    std::set&lt;TIntermSelection*&gt; mIfsContainingDiscontinuousLoop;
</del><ins>+    std::set&lt;TIntermSelection *&gt; mIfsContainingGradientLoop;
</ins><span class="cx"> 
</span><span class="cx">     // Will we need to generate a Lod0 version of the function.
</span><span class="cx">     bool mNeedsLod0;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorArrayReturnValueToOutParametercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -36,10 +36,28 @@
</span><span class="cx">     return CreateReturnValueSymbol(outType);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TIntermAggregate *CreateReplacementCall(TIntermAggregate *originalCall, TIntermTyped *returnValueTarget)
+{
+    TIntermAggregate *replacementCall = new TIntermAggregate(EOpFunctionCall);
+    replacementCall-&gt;setType(TType(EbtVoid));
+    replacementCall-&gt;setUserDefined();
+    replacementCall-&gt;setNameObj(originalCall-&gt;getNameObj());
+    replacementCall-&gt;setFunctionId(originalCall-&gt;getFunctionId());
+    replacementCall-&gt;setLine(originalCall-&gt;getLine());
+    TIntermSequence *replacementParameters = replacementCall-&gt;getSequence();
+    TIntermSequence *originalParameters = originalCall-&gt;getSequence();
+    for (auto &amp;param : *originalParameters)
+    {
+        replacementParameters-&gt;push_back(param);
+    }
+    replacementParameters-&gt;push_back(returnValueTarget);
+    return replacementCall;
+}
+
</ins><span class="cx"> class ArrayReturnValueToOutParameterTraverser : private TIntermTraverser
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    static void apply(TIntermNode *root);
</del><ins>+    static void apply(TIntermNode *root, unsigned int *temporaryIndex);
</ins><span class="cx">   private:
</span><span class="cx">     ArrayReturnValueToOutParameterTraverser();
</span><span class="cx"> 
</span><span class="lines">@@ -50,9 +68,10 @@
</span><span class="cx">     bool mInFunctionWithArrayReturnValue;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-void ArrayReturnValueToOutParameterTraverser::apply(TIntermNode *root)
</del><ins>+void ArrayReturnValueToOutParameterTraverser::apply(TIntermNode *root, unsigned int *temporaryIndex)
</ins><span class="cx"> {
</span><span class="cx">     ArrayReturnValueToOutParameterTraverser arrayReturnValueToOutParam;
</span><ins>+    arrayReturnValueToOutParam.useTemporaryIndex(temporaryIndex);
</ins><span class="cx">     root-&gt;traverse(&amp;arrayReturnValueToOutParam);
</span><span class="cx">     arrayReturnValueToOutParam.updateTree();
</span><span class="cx"> }
</span><span class="lines">@@ -98,7 +117,7 @@
</span><span class="cx">                 CopyAggregateChildren(node, replacement);
</span><span class="cx">                 replacement-&gt;getSequence()-&gt;push_back(CreateReturnValueOutSymbol(node-&gt;getType()));
</span><span class="cx">                 replacement-&gt;setUserDefined();
</span><del>-                replacement-&gt;setName(node-&gt;getName());
</del><ins>+                replacement-&gt;setNameObj(node-&gt;getNameObj());
</ins><span class="cx">                 replacement-&gt;setFunctionId(node-&gt;getFunctionId());
</span><span class="cx">                 replacement-&gt;setLine(node-&gt;getLine());
</span><span class="cx">                 replacement-&gt;setType(TType(EbtVoid));
</span><span class="lines">@@ -107,18 +126,32 @@
</span><span class="cx">             }
</span><span class="cx">             else if (node-&gt;getOp() == EOpFunctionCall)
</span><span class="cx">             {
</span><del>-                // TODO (oetuaho@nvidia.com): Call sites where the returned array is not assigned are not handled yet.
</del><ins>+                // Handle call sites where the returned array is not assigned.
</ins><span class="cx">                 // Examples where f() is a function returning an array:
</span><del>-                // f();
-                // another_function(f());
-                // another_array == f();
-                UNIMPLEMENTED();
</del><ins>+                // 1. f();
+                // 2. another_array == f();
+                // 3. another_function(f());
+                // 4. return f();
+                // Cases 2 to 4 are already converted to simpler cases by SeparateExpressionsReturningArrays, so we
+                // only need to worry about the case where a function call returning an array forms an expression by
+                // itself.
+                TIntermAggregate *parentAgg = getParentNode()-&gt;getAsAggregate();
+                if (parentAgg != nullptr &amp;&amp; parentAgg-&gt;getOp() == EOpSequence)
+                {
+                    nextTemporaryIndex();
+                    TIntermSequence replacements;
+                    replacements.push_back(createTempDeclaration(node-&gt;getType()));
+                    TIntermSymbol *returnSymbol = createTempSymbol(node-&gt;getType());
+                    replacements.push_back(CreateReplacementCall(node, returnSymbol));
+                    mMultiReplacements.push_back(NodeReplaceWithMultipleEntry(parentAgg, node, replacements));
+                }
+                return false;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     else if (visit == PostVisit)
</span><span class="cx">     {
</span><del>-        if (node-&gt;getOp() == EOpFunction &amp;&amp; node-&gt;isArray())
</del><ins>+        if (node-&gt;getOp() == EOpFunction)
</ins><span class="cx">         {
</span><span class="cx">             mInFunctionWithArrayReturnValue = false;
</span><span class="cx">         }
</span><span class="lines">@@ -158,19 +191,7 @@
</span><span class="cx">         TIntermAggregate *rightAgg = node-&gt;getRight()-&gt;getAsAggregate();
</span><span class="cx">         if (rightAgg != nullptr &amp;&amp; rightAgg-&gt;getOp() == EOpFunctionCall &amp;&amp; rightAgg-&gt;isUserDefined())
</span><span class="cx">         {
</span><del>-            TIntermAggregate *replacementCall = new TIntermAggregate(EOpFunctionCall);
-            replacementCall-&gt;setType(TType(EbtVoid));
-            replacementCall-&gt;setUserDefined();
-            replacementCall-&gt;setName(rightAgg-&gt;getName());
-            replacementCall-&gt;setFunctionId(rightAgg-&gt;getFunctionId());
-            replacementCall-&gt;setLine(rightAgg-&gt;getLine());
-            TIntermSequence *replacementParameters = replacementCall-&gt;getSequence();
-            TIntermSequence *originalParameters = rightAgg-&gt;getSequence();
-            for (auto &amp;param : *originalParameters)
-            {
-                replacementParameters-&gt;push_back(param);
-            }
-            replacementParameters-&gt;push_back(node-&gt;getLeft());
</del><ins>+            TIntermAggregate *replacementCall = CreateReplacementCall(rightAgg, node-&gt;getLeft());
</ins><span class="cx">             mReplacements.push_back(NodeUpdateEntry(getParentNode(), node, replacementCall, false));
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -179,7 +200,7 @@
</span><span class="cx"> 
</span><span class="cx"> } // namespace
</span><span class="cx"> 
</span><del>-void ArrayReturnValueToOutParameter(TIntermNode *root)
</del><ins>+void ArrayReturnValueToOutParameter(TIntermNode *root, unsigned int *temporaryIndex)
</ins><span class="cx"> {
</span><del>-    ArrayReturnValueToOutParameterTraverser::apply(root);
</del><ins>+    ArrayReturnValueToOutParameterTraverser::apply(root, temporaryIndex);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorArrayReturnValueToOutParameterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ArrayReturnValueToOutParameter.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,6 +11,6 @@
</span><span class="cx"> 
</span><span class="cx"> class TIntermNode;
</span><span class="cx"> 
</span><del>-void ArrayReturnValueToOutParameter(TIntermNode *root);
</del><ins>+void ArrayReturnValueToOutParameter(TIntermNode *root, unsigned int *temporaryIndex);
</ins><span class="cx"> 
</span><span class="cx"> #endif  // COMPILER_TRANSLATOR_ARRAYRETURNVALUETOOUTPARAMETER_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorBaseTypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BaseTypes.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BaseTypes.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BaseTypes.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,7 +18,10 @@
</span><span class="cx">     EbpUndefined,
</span><span class="cx">     EbpLow,
</span><span class="cx">     EbpMedium,
</span><del>-    EbpHigh
</del><ins>+    EbpHigh,
+
+    // end of list
+    EbpLast
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> inline const char* getPrecisionString(TPrecision p)
</span><span class="lines">@@ -77,6 +80,9 @@
</span><span class="cx">     EbtStruct,
</span><span class="cx">     EbtInterfaceBlock,
</span><span class="cx">     EbtAddress,            // should be deprecated??
</span><ins>+
+    // end of list
+    EbtLast
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> const char* getBasicString(TBasicType t);
</span><span class="lines">@@ -284,20 +290,18 @@
</span><span class="cx"> //
</span><span class="cx"> enum TQualifier
</span><span class="cx"> {
</span><del>-    EvqTemporary,     // For temporaries (within a function), read/write
-    EvqGlobal,        // For globals read/write
-    EvqConst,         // User defined constants and non-output parameters in functions
-    EvqAttribute,     // Readonly
-    EvqVaryingIn,     // readonly, fragment shaders only
-    EvqVaryingOut,    // vertex shaders only  read/write
-    EvqInvariantVaryingIn,     // readonly, fragment shaders only
-    EvqInvariantVaryingOut,    // vertex shaders only  read/write
-    EvqUniform,       // Readonly, vertex and fragment
</del><ins>+    EvqTemporary,   // For temporaries (within a function), read/write
+    EvqGlobal,      // For globals read/write
+    EvqConst,       // User defined constants and non-output parameters in functions
+    EvqAttribute,   // Readonly
+    EvqVaryingIn,   // readonly, fragment shaders only
+    EvqVaryingOut,  // vertex shaders only  read/write
+    EvqUniform,     // Readonly, vertex and fragment
</ins><span class="cx"> 
</span><del>-    EvqVertexIn,      // Vertex shader input
-    EvqFragmentOut,   // Fragment shader output
-    EvqVertexOut,     // Vertex shader output
-    EvqFragmentIn,    // Fragment shader input
</del><ins>+    EvqVertexIn,     // Vertex shader input
+    EvqFragmentOut,  // Fragment shader output
+    EvqVertexOut,    // Vertex shader output
+    EvqFragmentIn,   // Fragment shader input
</ins><span class="cx"> 
</span><span class="cx">     // parameters
</span><span class="cx">     EvqIn,
</span><span class="lines">@@ -307,6 +311,7 @@
</span><span class="cx"> 
</span><span class="cx">     // built-ins read by vertex shader
</span><span class="cx">     EvqInstanceID,
</span><ins>+    EvqVertexID,
</ins><span class="cx"> 
</span><span class="cx">     // built-ins written by vertex shader
</span><span class="cx">     EvqPosition,
</span><span class="lines">@@ -320,21 +325,26 @@
</span><span class="cx">     // built-ins written by fragment shader
</span><span class="cx">     EvqFragColor,
</span><span class="cx">     EvqFragData,
</span><del>-    EvqFragDepth,
</del><span class="cx"> 
</span><ins>+    EvqFragDepth,     // gl_FragDepth for ESSL300.
+    EvqFragDepthEXT,  // gl_FragDepthEXT for ESSL100, EXT_frag_depth.
+
+    EvqSecondaryFragColorEXT,  // EXT_blend_func_extended
+    EvqSecondaryFragDataEXT,   // EXT_blend_func_extended
+
</ins><span class="cx">     // built-ins written by the shader_framebuffer_fetch extension(s)
</span><span class="cx">     EvqLastFragColor,
</span><span class="cx">     EvqLastFragData,
</span><span class="cx"> 
</span><span class="cx">     // GLSL ES 3.0 vertex output and fragment input
</span><del>-    EvqSmooth,        // Incomplete qualifier, smooth is the default
-    EvqFlat,          // Incomplete qualifier
</del><ins>+    EvqSmooth,  // Incomplete qualifier, smooth is the default
+    EvqFlat,    // Incomplete qualifier
</ins><span class="cx">     EvqSmoothOut = EvqSmooth,
</span><del>-    EvqFlatOut = EvqFlat,
-    EvqCentroidOut,   // Implies smooth
</del><ins>+    EvqFlatOut   = EvqFlat,
+    EvqCentroidOut,  // Implies smooth
</ins><span class="cx">     EvqSmoothIn,
</span><span class="cx">     EvqFlatIn,
</span><del>-    EvqCentroidIn,    // Implies smooth
</del><ins>+    EvqCentroidIn,  // Implies smooth
</ins><span class="cx"> 
</span><span class="cx">     // end of list
</span><span class="cx">     EvqLast
</span><span class="lines">@@ -383,43 +393,48 @@
</span><span class="cx"> //
</span><span class="cx"> inline const char* getQualifierString(TQualifier q)
</span><span class="cx"> {
</span><ins>+    // clang-format off
</ins><span class="cx">     switch(q)
</span><span class="cx">     {
</span><del>-    case EvqTemporary:      return &quot;Temporary&quot;;      break;
-    case EvqGlobal:         return &quot;Global&quot;;         break;
-    case EvqConst:          return &quot;const&quot;;          break;
-    case EvqConstReadOnly:  return &quot;const&quot;;          break;
-    case EvqAttribute:      return &quot;attribute&quot;;      break;
-    case EvqVaryingIn:      return &quot;varying&quot;;        break;
-    case EvqVaryingOut:     return &quot;varying&quot;;        break;
-    case EvqInvariantVaryingIn: return &quot;invariant varying&quot;;        break;
-    case EvqInvariantVaryingOut:return &quot;invariant varying&quot;;        break;
-    case EvqUniform:        return &quot;uniform&quot;;        break;
-    case EvqVertexIn:       return &quot;in&quot;;             break;
-    case EvqFragmentOut:    return &quot;out&quot;;            break;
-    case EvqVertexOut:      return &quot;out&quot;;            break;
-    case EvqFragmentIn:     return &quot;in&quot;;             break;
-    case EvqIn:             return &quot;in&quot;;             break;
-    case EvqOut:            return &quot;out&quot;;            break;
-    case EvqInOut:          return &quot;inout&quot;;          break;
-    case EvqInstanceID:     return &quot;InstanceID&quot;;     break;
-    case EvqPosition:       return &quot;Position&quot;;       break;
-    case EvqPointSize:      return &quot;PointSize&quot;;      break;
-    case EvqFragCoord:      return &quot;FragCoord&quot;;      break;
-    case EvqFrontFacing:    return &quot;FrontFacing&quot;;    break;
-    case EvqFragColor:      return &quot;FragColor&quot;;      break;
-    case EvqFragData:       return &quot;FragData&quot;;       break;
-    case EvqFragDepth:      return &quot;FragDepth&quot;;      break;
-    case EvqSmoothOut:      return &quot;smooth out&quot;;     break;
-    case EvqCentroidOut:    return &quot;centroid out&quot;;   break;
-    case EvqFlatOut:        return &quot;flat out&quot;;       break;
-    case EvqSmoothIn:       return &quot;smooth in&quot;;      break;
-    case EvqCentroidIn:     return &quot;centroid in&quot;;    break;
-    case EvqFlatIn:         return &quot;flat in&quot;;        break;
-    case EvqLastFragColor:  return &quot;LastFragColor&quot;;  break;
-    case EvqLastFragData:   return &quot;LastFragData&quot;;   break;
-    default: UNREACHABLE(); return &quot;unknown qualifier&quot;;
</del><ins>+    case EvqTemporary:              return &quot;Temporary&quot;;
+    case EvqGlobal:                 return &quot;Global&quot;;
+    case EvqConst:                  return &quot;const&quot;;
+    case EvqAttribute:              return &quot;attribute&quot;;
+    case EvqVaryingIn:              return &quot;varying&quot;;
+    case EvqVaryingOut:             return &quot;varying&quot;;
+    case EvqUniform:                return &quot;uniform&quot;;
+    case EvqVertexIn:               return &quot;in&quot;;
+    case EvqFragmentOut:            return &quot;out&quot;;
+    case EvqVertexOut:              return &quot;out&quot;;
+    case EvqFragmentIn:             return &quot;in&quot;;
+    case EvqIn:                     return &quot;in&quot;;
+    case EvqOut:                    return &quot;out&quot;;
+    case EvqInOut:                  return &quot;inout&quot;;
+    case EvqConstReadOnly:          return &quot;const&quot;;
+    case EvqInstanceID:             return &quot;InstanceID&quot;;
+    case EvqVertexID:               return &quot;VertexID&quot;;
+    case EvqPosition:               return &quot;Position&quot;;
+    case EvqPointSize:              return &quot;PointSize&quot;;
+    case EvqFragCoord:              return &quot;FragCoord&quot;;
+    case EvqFrontFacing:            return &quot;FrontFacing&quot;;
+    case EvqPointCoord:             return &quot;PointCoord&quot;;
+    case EvqFragColor:              return &quot;FragColor&quot;;
+    case EvqFragData:               return &quot;FragData&quot;;
+    case EvqFragDepthEXT:           return &quot;FragDepth&quot;;
+    case EvqFragDepth:              return &quot;FragDepth&quot;;
+    case EvqSecondaryFragColorEXT:  return &quot;SecondaryFragColorEXT&quot;;
+    case EvqSecondaryFragDataEXT:   return &quot;SecondaryFragDataEXT&quot;;
+    case EvqLastFragColor:          return &quot;LastFragColor&quot;;
+    case EvqLastFragData:           return &quot;LastFragData&quot;;
+    case EvqSmoothOut:              return &quot;smooth out&quot;;
+    case EvqCentroidOut:            return &quot;centroid out&quot;;
+    case EvqFlatOut:                return &quot;flat out&quot;;
+    case EvqSmoothIn:               return &quot;smooth in&quot;;
+    case EvqFlatIn:                 return &quot;flat in&quot;;
+    case EvqCentroidIn:             return &quot;centroid in&quot;;
+    default: UNREACHABLE();         return &quot;unknown qualifier&quot;;
</ins><span class="cx">     }
</span><ins>+    // clang-format on
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline const char* getMatrixPackingString(TLayoutMatrixPacking mpq)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorBuiltInFunctionEmulatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,28 +11,31 @@
</span><span class="cx"> class BuiltInFunctionEmulator::BuiltInFunctionEmulationMarker : public TIntermTraverser
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    BuiltInFunctionEmulationMarker(BuiltInFunctionEmulator&amp; emulator)
-        : mEmulator(emulator)
</del><ins>+    BuiltInFunctionEmulationMarker(BuiltInFunctionEmulator &amp;emulator)
+        : TIntermTraverser(true, false, false),
+          mEmulator(emulator)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual bool visitUnary(Visit visit, TIntermUnary* node)
</del><ins>+    bool visitUnary(Visit visit, TIntermUnary *node) override
</ins><span class="cx">     {
</span><del>-        if (visit == PreVisit) {
-            bool needToEmulate = mEmulator.SetFunctionCalled(
-                node-&gt;getOp(), node-&gt;getOperand()-&gt;getType());
</del><ins>+        if (visit == PreVisit)
+        {
+            bool needToEmulate = mEmulator.SetFunctionCalled(node-&gt;getOp(), node-&gt;getOperand()-&gt;getType());
</ins><span class="cx">             if (needToEmulate)
</span><span class="cx">                 node-&gt;setUseEmulatedFunction();
</span><span class="cx">         }
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual bool visitAggregate(Visit visit, TIntermAggregate* node)
</del><ins>+    bool visitAggregate(Visit visit, TIntermAggregate *node) override
</ins><span class="cx">     {
</span><del>-        if (visit == PreVisit) {
</del><ins>+        if (visit == PreVisit)
+        {
</ins><span class="cx">             // Here we handle all the built-in functions instead of the ones we
</span><span class="cx">             // currently identified as problematic.
</span><del>-            switch (node-&gt;getOp()) {
</del><ins>+            switch (node-&gt;getOp())
+            {
</ins><span class="cx">                 case EOpLessThan:
</span><span class="cx">                 case EOpGreaterThan:
</span><span class="cx">                 case EOpLessThanEqual:
</span><span class="lines">@@ -59,14 +62,14 @@
</span><span class="cx">                     break;
</span><span class="cx">                 default:
</span><span class="cx">                     return true;
</span><del>-            };
-            const TIntermSequence&amp; sequence = *(node-&gt;getSequence());
</del><ins>+            }
+            const TIntermSequence &amp;sequence = *(node-&gt;getSequence());
</ins><span class="cx">             bool needToEmulate = false;
</span><span class="cx">             // Right now we only handle built-in functions with two or three parameters.
</span><span class="cx">             if (sequence.size() == 2)
</span><span class="cx">             {
</span><del>-                TIntermTyped* param1 = sequence[0]-&gt;getAsTyped();
-                TIntermTyped* param2 = sequence[1]-&gt;getAsTyped();
</del><ins>+                TIntermTyped *param1 = sequence[0]-&gt;getAsTyped();
+                TIntermTyped *param2 = sequence[1]-&gt;getAsTyped();
</ins><span class="cx">                 if (!param1 || !param2)
</span><span class="cx">                     return true;
</span><span class="cx">                 needToEmulate = mEmulator.SetFunctionCalled(
</span><span class="lines">@@ -74,9 +77,9 @@
</span><span class="cx">             }
</span><span class="cx">             else if (sequence.size() == 3)
</span><span class="cx">             {
</span><del>-                TIntermTyped* param1 = sequence[0]-&gt;getAsTyped();
-                TIntermTyped* param2 = sequence[1]-&gt;getAsTyped();
-                TIntermTyped* param3 = sequence[2]-&gt;getAsTyped();
</del><ins>+                TIntermTyped *param1 = sequence[0]-&gt;getAsTyped();
+                TIntermTyped *param2 = sequence[1]-&gt;getAsTyped();
+                TIntermTyped *param3 = sequence[2]-&gt;getAsTyped();
</ins><span class="cx">                 if (!param1 || !param2 || !param3)
</span><span class="cx">                     return true;
</span><span class="cx">                 needToEmulate = mEmulator.SetFunctionCalled(
</span><span class="lines">@@ -94,34 +97,28 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    BuiltInFunctionEmulator&amp; mEmulator;
</del><ins>+    BuiltInFunctionEmulator &amp;mEmulator;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> BuiltInFunctionEmulator::BuiltInFunctionEmulator()
</span><span class="cx"> {}
</span><span class="cx"> 
</span><del>-void BuiltInFunctionEmulator::addEmulatedFunction(
-    TOperator op, const TType&amp; param,
-    const char* emulatedFunctionDefinition)
</del><ins>+void BuiltInFunctionEmulator::addEmulatedFunction(TOperator op, const TType *param,
+                                                  const char *emulatedFunctionDefinition)
</ins><span class="cx"> {
</span><del>-    mEmulatedFunctions[FunctionId(op, param)] =
-        std::string(emulatedFunctionDefinition);
</del><ins>+    mEmulatedFunctions[FunctionId(op, param)] = std::string(emulatedFunctionDefinition);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void BuiltInFunctionEmulator::addEmulatedFunction(
-    TOperator op, const TType&amp; param1, const TType&amp; param2,
-    const char* emulatedFunctionDefinition)
</del><ins>+void BuiltInFunctionEmulator::addEmulatedFunction(TOperator op, const TType *param1, const TType *param2,
+                                                  const char *emulatedFunctionDefinition)
</ins><span class="cx"> {
</span><del>-    mEmulatedFunctions[FunctionId(op, param1, param2)] =
-        std::string(emulatedFunctionDefinition);
</del><ins>+    mEmulatedFunctions[FunctionId(op, param1, param2)] = std::string(emulatedFunctionDefinition);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void BuiltInFunctionEmulator::addEmulatedFunction(
-    TOperator op, const TType&amp; param1, const TType&amp; param2, const TType&amp; param3,
-    const char* emulatedFunctionDefinition)
</del><ins>+void BuiltInFunctionEmulator::addEmulatedFunction(TOperator op, const TType *param1, const TType *param2,
+                                                  const TType *param3, const char *emulatedFunctionDefinition)
</ins><span class="cx"> {
</span><del>-    mEmulatedFunctions[FunctionId(op, param1, param2, param3)] =
-        std::string(emulatedFunctionDefinition);
</del><ins>+    mEmulatedFunctions[FunctionId(op, param1, param2, param3)] = std::string(emulatedFunctionDefinition);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool BuiltInFunctionEmulator::IsOutputEmpty() const
</span><span class="lines">@@ -129,48 +126,48 @@
</span><span class="cx">     return (mFunctions.size() == 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void BuiltInFunctionEmulator::OutputEmulatedFunctions(
-    TInfoSinkBase&amp; out) const
</del><ins>+void BuiltInFunctionEmulator::OutputEmulatedFunctions(TInfoSinkBase &amp;out) const
</ins><span class="cx"> {
</span><del>-    for (size_t i = 0; i &lt; mFunctions.size(); ++i) {
</del><ins>+    for (size_t i = 0; i &lt; mFunctions.size(); ++i)
+    {
</ins><span class="cx">         out &lt;&lt; mEmulatedFunctions.find(mFunctions[i])-&gt;second &lt;&lt; &quot;\n\n&quot;;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool BuiltInFunctionEmulator::SetFunctionCalled(
-    TOperator op, const TType&amp; param)
</del><ins>+bool BuiltInFunctionEmulator::SetFunctionCalled(TOperator op, const TType &amp;param)
</ins><span class="cx"> {
</span><del>-    return SetFunctionCalled(FunctionId(op, param));
</del><ins>+    return SetFunctionCalled(FunctionId(op, &amp;param));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool BuiltInFunctionEmulator::SetFunctionCalled(
-    TOperator op, const TType&amp; param1, const TType&amp; param2)
</del><ins>+bool BuiltInFunctionEmulator::SetFunctionCalled(TOperator op, const TType &amp;param1, const TType &amp;param2)
</ins><span class="cx"> {
</span><del>-    return SetFunctionCalled(FunctionId(op, param1, param2));
</del><ins>+    return SetFunctionCalled(FunctionId(op, &amp;param1, &amp;param2));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool BuiltInFunctionEmulator::SetFunctionCalled(
-    TOperator op, const TType&amp; param1, const TType&amp; param2, const TType&amp; param3)
</del><ins>+bool BuiltInFunctionEmulator::SetFunctionCalled(TOperator op,
+                                                const TType &amp;param1, const TType &amp;param2, const TType &amp;param3)
</ins><span class="cx"> {
</span><del>-    return SetFunctionCalled(FunctionId(op, param1, param2, param3));
</del><ins>+    return SetFunctionCalled(FunctionId(op, &amp;param1, &amp;param2, &amp;param3));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool BuiltInFunctionEmulator::SetFunctionCalled(
-    const FunctionId&amp; functionId) {
</del><ins>+bool BuiltInFunctionEmulator::SetFunctionCalled(const FunctionId &amp;functionId)
+{
</ins><span class="cx">     if (mEmulatedFunctions.find(functionId) != mEmulatedFunctions.end())
</span><span class="cx">     {
</span><del>-        for (size_t i = 0; i &lt; mFunctions.size(); ++i) {
</del><ins>+        for (size_t i = 0; i &lt; mFunctions.size(); ++i)
+        {
</ins><span class="cx">             if (mFunctions[i] == functionId)
</span><span class="cx">                 return true;
</span><span class="cx">         }
</span><del>-        mFunctions.push_back(functionId);
</del><ins>+        // Copy the functionId if it needs to be stored, to make sure that the TType pointers inside
+        // remain valid and constant.
+        mFunctions.push_back(functionId.getCopy());
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void BuiltInFunctionEmulator::MarkBuiltInFunctionsForEmulation(
-    TIntermNode* root)
</del><ins>+void BuiltInFunctionEmulator::MarkBuiltInFunctionsForEmulation(TIntermNode *root)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(root);
</span><span class="cx"> 
</span><span class="lines">@@ -188,32 +185,30 @@
</span><span class="cx"> 
</span><span class="cx"> //static
</span><span class="cx"> TString BuiltInFunctionEmulator::GetEmulatedFunctionName(
</span><del>-    const TString&amp; name)
</del><ins>+    const TString &amp;name)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(name[name.length() - 1] == '(');
</span><span class="cx">     return &quot;webgl_&quot; + name.substr(0, name.length() - 1) + &quot;_emu(&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-BuiltInFunctionEmulator::FunctionId::FunctionId
-    (TOperator op, const TType&amp; param)
</del><ins>+BuiltInFunctionEmulator::FunctionId::FunctionId(TOperator op, const TType *param)
</ins><span class="cx">     : mOp(op),
</span><span class="cx">       mParam1(param),
</span><del>-      mParam2(EbtVoid),
-      mParam3(EbtVoid)
</del><ins>+      mParam2(new TType(EbtVoid)),
+      mParam3(new TType(EbtVoid))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-BuiltInFunctionEmulator::FunctionId::FunctionId
-    (TOperator op, const TType&amp; param1, const TType&amp; param2)
</del><ins>+BuiltInFunctionEmulator::FunctionId::FunctionId(TOperator op, const TType *param1, const TType *param2)
</ins><span class="cx">     : mOp(op),
</span><span class="cx">       mParam1(param1),
</span><span class="cx">       mParam2(param2),
</span><del>-      mParam3(EbtVoid)
</del><ins>+      mParam3(new TType(EbtVoid))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-BuiltInFunctionEmulator::FunctionId::FunctionId
-    (TOperator op, const TType&amp; param1, const TType&amp; param2, const TType&amp; param3)
</del><ins>+BuiltInFunctionEmulator::FunctionId::FunctionId(TOperator op,
+                                                const TType *param1, const TType *param2, const TType *param3)
</ins><span class="cx">     : mOp(op),
</span><span class="cx">       mParam1(param1),
</span><span class="cx">       mParam2(param2),
</span><span class="lines">@@ -221,25 +216,28 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool BuiltInFunctionEmulator::FunctionId::operator==
-    (const BuiltInFunctionEmulator::FunctionId&amp; other) const
</del><ins>+bool BuiltInFunctionEmulator::FunctionId::operator==(const BuiltInFunctionEmulator::FunctionId &amp;other) const
</ins><span class="cx"> {
</span><span class="cx">     return (mOp == other.mOp &amp;&amp;
</span><del>-        mParam1 == other.mParam1 &amp;&amp;
-        mParam2 == other.mParam2 &amp;&amp;
-        mParam3 == other.mParam3);
</del><ins>+            *mParam1 == *other.mParam1 &amp;&amp;
+            *mParam2 == *other.mParam2 &amp;&amp;
+            *mParam3 == *other.mParam3);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool BuiltInFunctionEmulator::FunctionId::operator&lt;
-    (const BuiltInFunctionEmulator::FunctionId&amp; other) const
</del><ins>+bool BuiltInFunctionEmulator::FunctionId::operator&lt;(const BuiltInFunctionEmulator::FunctionId &amp;other) const
</ins><span class="cx"> {
</span><span class="cx">     if (mOp != other.mOp)
</span><span class="cx">         return mOp &lt; other.mOp;
</span><del>-    if (mParam1 != other.mParam1)
-        return mParam1 &lt; other.mParam1;
-    if (mParam2 != other.mParam2)
-        return mParam2 &lt; other.mParam2;
-    if (mParam3 != other.mParam3)
-       return mParam3 &lt; other.mParam3;
</del><ins>+    if (*mParam1 != *other.mParam1)
+        return *mParam1 &lt; *other.mParam1;
+    if (*mParam2 != *other.mParam2)
+        return *mParam2 &lt; *other.mParam2;
+    if (*mParam3 != *other.mParam3)
+       return *mParam3 &lt; *other.mParam3;
</ins><span class="cx">     return false; // all fields are equal
</span><span class="cx"> }
</span><ins>+
+BuiltInFunctionEmulator::FunctionId BuiltInFunctionEmulator::FunctionId::getCopy() const
+{
+    return FunctionId(mOp, new TType(*mParam1), new TType(*mParam2), new TType(*mParam3));
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorBuiltInFunctionEmulatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,23 +21,25 @@
</span><span class="cx">   public:
</span><span class="cx">     BuiltInFunctionEmulator();
</span><span class="cx"> 
</span><del>-    void MarkBuiltInFunctionsForEmulation(TIntermNode* root);
</del><ins>+    void MarkBuiltInFunctionsForEmulation(TIntermNode *root);
</ins><span class="cx"> 
</span><span class="cx">     void Cleanup();
</span><span class="cx"> 
</span><span class="cx">     // &quot;name(&quot; becomes &quot;webgl_name_emu(&quot;.
</span><del>-    static TString GetEmulatedFunctionName(const TString&amp; name);
</del><ins>+    static TString GetEmulatedFunctionName(const TString &amp;name);
</ins><span class="cx"> 
</span><span class="cx">     bool IsOutputEmpty() const;
</span><span class="cx"> 
</span><span class="cx">     // Output function emulation definition. This should be before any other
</span><span class="cx">     // shader source.
</span><del>-    void OutputEmulatedFunctions(TInfoSinkBase&amp; out) const;
</del><ins>+    void OutputEmulatedFunctions(TInfoSinkBase &amp;out) const;
</ins><span class="cx"> 
</span><span class="cx">     // Add functions that need to be emulated.
</span><del>-    void addEmulatedFunction(TOperator op, const TType&amp; param, const char* emulatedFunctionDefinition);
-    void addEmulatedFunction(TOperator op, const TType&amp; param1, const TType&amp; param2, const char* emulatedFunctionDefinition);
-    void addEmulatedFunction(TOperator op, const TType&amp; param1, const TType&amp; param2, const TType&amp; param3, const char* emulatedFunctionDefinition);
</del><ins>+    void addEmulatedFunction(TOperator op, const TType *param, const char *emulatedFunctionDefinition);
+    void addEmulatedFunction(TOperator op, const TType *param1, const TType *param2,
+                             const char *emulatedFunctionDefinition);
+    void addEmulatedFunction(TOperator op, const TType *param1, const TType *param2, const TType *param3,
+                             const char *emulatedFunctionDefinition);
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     class BuiltInFunctionEmulationMarker;
</span><span class="lines">@@ -46,28 +48,32 @@
</span><span class="cx">     // emulated. If the function is not in mEmulatedFunctions, this becomes a
</span><span class="cx">     // no-op. Returns true if the function call needs to be replaced with an
</span><span class="cx">     // emulated one.
</span><del>-    bool SetFunctionCalled(TOperator op, const TType&amp; param);
-    bool SetFunctionCalled(
-        TOperator op, const TType&amp; param1, const TType&amp; param2);
-    bool SetFunctionCalled(
-        TOperator op, const TType&amp; param1, const TType&amp; param2, const TType&amp; param3);
</del><ins>+    bool SetFunctionCalled(TOperator op, const TType &amp;param);
+    bool SetFunctionCalled(TOperator op, const TType &amp;param1, const TType &amp;param2);
+    bool SetFunctionCalled(TOperator op, const TType &amp;param1, const TType &amp;param2, const TType &amp;param3);
</ins><span class="cx"> 
</span><span class="cx">     class FunctionId {
</span><span class="cx">       public:
</span><del>-        FunctionId(TOperator op, const TType&amp; param);
-        FunctionId(TOperator op, const TType&amp; param1, const TType&amp; param2);
-        FunctionId(TOperator op, const TType&amp; param1, const TType&amp; param2, const TType&amp; param3);
</del><ins>+        FunctionId(TOperator op, const TType *param);
+        FunctionId(TOperator op, const TType *param1, const TType *param2);
+        FunctionId(TOperator op, const TType *param1, const TType *param2, const TType *param3);
</ins><span class="cx"> 
</span><del>-        bool operator==(const FunctionId&amp; other) const;
-        bool operator&lt;(const FunctionId&amp; other) const;
</del><ins>+        bool operator==(const FunctionId &amp;other) const;
+        bool operator&lt;(const FunctionId &amp;other) const;
+
+        FunctionId getCopy() const;
</ins><span class="cx">       private:
</span><span class="cx">         TOperator mOp;
</span><del>-        TType mParam1;
-        TType mParam2;
-        TType mParam3;
</del><ins>+
+        // The memory that these TType objects use is freed by PoolAllocator. The BuiltInFunctionEmulator's lifetime
+        // can extend until after the memory pool is freed, but that's not an issue since this class never destructs
+        // these objects.
+        const TType *mParam1;
+        const TType *mParam2;
+        const TType *mParam3;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><del>-    bool SetFunctionCalled(const FunctionId&amp; functionId);
</del><ins>+    bool SetFunctionCalled(const FunctionId &amp;functionId);
</ins><span class="cx"> 
</span><span class="cx">     // Map from function id to emulated function definition
</span><span class="cx">     std::map&lt;FunctionId, std::string&gt; mEmulatedFunctions;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorBuiltInFunctionEmulatorGLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,9 +7,11 @@
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/BuiltInFunctionEmulator.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/BuiltInFunctionEmulatorGLSL.h&quot;
</span><ins>+#include &quot;compiler/translator/Cache.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><ins>+#include &quot;compiler/translator/VersionGLSL.h&quot;
</ins><span class="cx"> 
</span><del>-void InitBuiltInFunctionEmulatorForGLSL(BuiltInFunctionEmulator *emu, sh::GLenum shaderType)
</del><ins>+void InitBuiltInFunctionEmulatorForGLSLWorkarounds(BuiltInFunctionEmulator *emu, sh::GLenum shaderType)
</ins><span class="cx"> {
</span><span class="cx">     // we use macros here instead of function definitions to work around more GLSL
</span><span class="cx">     // compiler bugs, in particular on NVIDIA hardware on Mac OSX. Macros are
</span><span class="lines">@@ -17,10 +19,10 @@
</span><span class="cx">     // evaluated. This is unlikely to show up in real shaders, but is something to
</span><span class="cx">     // consider.
</span><span class="cx"> 
</span><del>-    TType float1(EbtFloat);
-    TType float2(EbtFloat, 2);
-    TType float3(EbtFloat, 3);
-    TType float4(EbtFloat, 4);
</del><ins>+    const TType *float1 = TCache::getType(EbtFloat);
+    const TType *float2 = TCache::getType(EbtFloat, 2);
+    const TType *float3 = TCache::getType(EbtFloat, 3);
+    const TType *float4 = TCache::getType(EbtFloat, 4);
</ins><span class="cx"> 
</span><span class="cx">     if (shaderType == GL_FRAGMENT_SHADER)
</span><span class="cx">     {
</span><span class="lines">@@ -35,3 +37,153 @@
</span><span class="cx">     emu-&gt;addEmulatedFunction(EOpNormalize, float1, &quot;#define webgl_normalize_emu(x) ((x) == 0.0 ? 0.0 : ((x) &gt; 0.0 ? 1.0 : -1.0))&quot;);
</span><span class="cx">     emu-&gt;addEmulatedFunction(EOpReflect, float1, float1, &quot;#define webgl_reflect_emu(I, N) ((I) - 2.0 * (N) * (I) * (N))&quot;);
</span><span class="cx"> }
</span><ins>+
+// Emulate built-in functions missing from GLSL 1.30 and higher
+void InitBuiltInFunctionEmulatorForGLSLMissingFunctions(BuiltInFunctionEmulator *emu, sh::GLenum shaderType,
+                                                        int targetGLSLVersion)
+{
+    // Emulate packSnorm2x16, packHalf2x16, unpackSnorm2x16, and unpackHalf2x16 (GLSL 4.20)
+    // by using floatBitsToInt, floatBitsToUint, intBitsToFloat, and uintBitsToFloat (GLSL 3.30).
+    if (targetGLSLVersion &gt;= GLSL_VERSION_330 &amp;&amp; targetGLSLVersion &lt; GLSL_VERSION_420)
+    {
+        const TType *float2 = TCache::getType(EbtFloat, 2);
+        const TType *uint1 = TCache::getType(EbtUInt);
+
+        // clang-format off
+        emu-&gt;addEmulatedFunction(EOpPackSnorm2x16, float2,
+            &quot;uint webgl_packSnorm2x16_emu(vec2 v)\n&quot;
+            &quot;{\n&quot;
+            &quot;    #if defined(GL_ARB_shading_language_packing)\n&quot;
+            &quot;        return packSnorm2x16(v);\n&quot;
+            &quot;    #else\n&quot;
+            &quot;        int x = int(round(clamp(v.x, -1.0, 1.0) * 32767.0));\n&quot;
+            &quot;        int y = int(round(clamp(v.y, -1.0, 1.0) * 32767.0));\n&quot;
+            &quot;        return uint((y &lt;&lt; 16) | (x &amp; 0xFFFF));\n&quot;
+            &quot;    #endif\n&quot;
+            &quot;}\n&quot;);
+        emu-&gt;addEmulatedFunction(EOpUnpackSnorm2x16, uint1,
+            &quot;#if !defined(GL_ARB_shading_language_packing)\n&quot;
+            &quot;    float webgl_fromSnorm(uint x)\n&quot;
+            &quot;    {\n&quot;
+            &quot;        int xi = (int(x) &amp; 0x7FFF) - (int(x) &amp; 0x8000);\n&quot;
+            &quot;        return clamp(float(xi) / 32767.0, -1.0, 1.0);\n&quot;
+            &quot;    }\n&quot;
+            &quot;#endif\n&quot;
+            &quot;\n&quot;
+            &quot;vec2 webgl_unpackSnorm2x16_emu(uint u)\n&quot;
+            &quot;{\n&quot;
+            &quot;    #if defined(GL_ARB_shading_language_packing)\n&quot;
+            &quot;        return unpackSnorm2x16(u);\n&quot;
+            &quot;    #else\n&quot;
+            &quot;        uint y = (u &gt;&gt; 16);\n&quot;
+            &quot;        uint x = u;\n&quot;
+            &quot;        return vec2(webgl_fromSnorm(x), webgl_fromSnorm(y));\n&quot;
+            &quot;    #endif\n&quot;
+            &quot;}\n&quot;);
+        // Functions uint webgl_f32tof16(float val) and float webgl_f16tof32(uint val) are
+        // based on the OpenGL redbook Appendix Session &quot;Floating-Point Formats Used in OpenGL&quot;.
+        emu-&gt;addEmulatedFunction(EOpPackHalf2x16, float2,
+            &quot;#if !defined(GL_ARB_shading_language_packing)\n&quot;
+            &quot;    uint webgl_f32tof16(float val)\n&quot;
+            &quot;    {\n&quot;
+            &quot;        uint f32 = floatBitsToUint(val);\n&quot;
+            &quot;        uint f16 = 0u;\n&quot;
+            &quot;        uint sign = (f32 &gt;&gt; 16) &amp; 0x8000u;\n&quot;
+            &quot;        int exponent = int((f32 &gt;&gt; 23) &amp; 0xFFu) - 127;\n&quot;
+            &quot;        uint mantissa = f32 &amp; 0x007FFFFFu;\n&quot;
+            &quot;        if (exponent == 128)\n&quot;
+            &quot;        {\n&quot;
+            &quot;            // Infinity or NaN\n&quot;
+            &quot;            // NaN bits that are masked out by 0x3FF get discarded.\n&quot;
+            &quot;            // This can turn some NaNs to infinity, but this is allowed by the spec.\n&quot;
+            &quot;            f16 = sign | (0x1Fu &lt;&lt; 10);\n&quot;
+            &quot;            f16 |= (mantissa &amp; 0x3FFu);\n&quot;
+            &quot;        }\n&quot;
+            &quot;        else if (exponent &gt; 15)\n&quot;
+            &quot;        {\n&quot;
+            &quot;            // Overflow - flush to Infinity\n&quot;
+            &quot;            f16 = sign | (0x1Fu &lt;&lt; 10);\n&quot;
+            &quot;        }\n&quot;
+            &quot;        else if (exponent &gt; -15)\n&quot;
+            &quot;        {\n&quot;
+            &quot;            // Representable value\n&quot;
+            &quot;            exponent += 15;\n&quot;
+            &quot;            mantissa &gt;&gt;= 13;\n&quot;
+            &quot;            f16 = sign | uint(exponent &lt;&lt; 10) | mantissa;\n&quot;
+            &quot;        }\n&quot;
+            &quot;        else\n&quot;
+            &quot;        {\n&quot;
+            &quot;            f16 = sign;\n&quot;
+            &quot;        }\n&quot;
+            &quot;        return f16;\n&quot;
+            &quot;    }\n&quot;
+            &quot;#endif\n&quot;
+            &quot;\n&quot;
+            &quot;uint webgl_packHalf2x16_emu(vec2 v)\n&quot;
+            &quot;{\n&quot;
+            &quot;    #if defined(GL_ARB_shading_language_packing)\n&quot;
+            &quot;        return packHalf2x16(v);\n&quot;
+            &quot;    #else\n&quot;
+            &quot;        uint x = webgl_f32tof16(v.x);\n&quot;
+            &quot;        uint y = webgl_f32tof16(v.y);\n&quot;
+            &quot;        return (y &lt;&lt; 16) | x;\n&quot;
+            &quot;    #endif\n&quot;
+            &quot;}\n&quot;);
+        emu-&gt;addEmulatedFunction(EOpUnpackHalf2x16, uint1,
+            &quot;#if !defined(GL_ARB_shading_language_packing)\n&quot;
+            &quot;    float webgl_f16tof32(uint val)\n&quot;
+            &quot;    {\n&quot;
+            &quot;        uint sign = (val &amp; 0x8000u) &lt;&lt; 16;\n&quot;
+            &quot;        int exponent = int((val &amp; 0x7C00u) &gt;&gt; 10);\n&quot;
+            &quot;        uint mantissa = val &amp; 0x03FFu;\n&quot;
+            &quot;        float f32 = 0.0;\n&quot;
+            &quot;        if(exponent == 0)\n&quot;
+            &quot;        {\n&quot;
+            &quot;            if (mantissa != 0u)\n&quot;
+            &quot;            {\n&quot;
+            &quot;                const float scale = 1.0 / (1 &lt;&lt; 24);\n&quot;
+            &quot;                f32 = scale * mantissa;\n&quot;
+            &quot;            }\n&quot;
+            &quot;        }\n&quot;
+            &quot;        else if (exponent == 31)\n&quot;
+            &quot;        {\n&quot;
+            &quot;            return uintBitsToFloat(sign | 0x7F800000u | mantissa);\n&quot;
+            &quot;        }\n&quot;
+            &quot;        else\n&quot;
+            &quot;        {\n&quot;
+            &quot;            exponent -= 15;\n&quot;
+            &quot;            float scale;\n&quot;
+            &quot;            if(exponent &lt; 0)\n&quot;
+            &quot;            {\n&quot;
+            &quot;                scale = 1.0 / (1 &lt;&lt; -exponent);\n&quot;
+            &quot;            }\n&quot;
+            &quot;            else\n&quot;
+            &quot;            {\n&quot;
+            &quot;                scale = 1 &lt;&lt; exponent;\n&quot;
+            &quot;            }\n&quot;
+            &quot;            float decimal = 1.0 + float(mantissa) / float(1 &lt;&lt; 10);\n&quot;
+            &quot;            f32 = scale * decimal;\n&quot;
+            &quot;        }\n&quot;
+            &quot;\n&quot;
+            &quot;        if (sign != 0u)\n&quot;
+            &quot;        {\n&quot;
+            &quot;            f32 = -f32;\n&quot;
+            &quot;        }\n&quot;
+            &quot;\n&quot;
+            &quot;        return f32;\n&quot;
+            &quot;    }\n&quot;
+            &quot;#endif\n&quot;
+            &quot;\n&quot;
+            &quot;vec2 webgl_unpackHalf2x16_emu(uint u)\n&quot;
+            &quot;{\n&quot;
+            &quot;    #if defined(GL_ARB_shading_language_packing)\n&quot;
+            &quot;        return unpackHalf2x16(u);\n&quot;
+            &quot;    #else\n&quot;
+            &quot;        uint y = (u &gt;&gt; 16);\n&quot;
+            &quot;        uint x = u &amp; 0xFFFFu;\n&quot;
+            &quot;        return vec2(webgl_f16tof32(x), webgl_f16tof32(y));\n&quot;
+            &quot;    #endif\n&quot;
+            &quot;}\n&quot;);
+        // clang-format on
+    }
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorBuiltInFunctionEmulatorGLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,6 +14,12 @@
</span><span class="cx"> //
</span><span class="cx"> // This is only a workaround for OpenGL driver bugs, and isn't needed in general.
</span><span class="cx"> //
</span><del>-void InitBuiltInFunctionEmulatorForGLSL(BuiltInFunctionEmulator *emu, sh::GLenum shaderType);
</del><ins>+void InitBuiltInFunctionEmulatorForGLSLWorkarounds(BuiltInFunctionEmulator *emu, sh::GLenum shaderType);
</ins><span class="cx"> 
</span><ins>+//
+// This function is emulating built-in functions missing from GLSL 1.30 and higher.
+//
+void InitBuiltInFunctionEmulatorForGLSLMissingFunctions(BuiltInFunctionEmulator *emu, sh::GLenum shaderType,
+                                                        int targetGLSLVersion);
+
</ins><span class="cx"> #endif  // COMPILER_TRANSLATOR_BUILTINFUNCTIONEMULATORGLSL_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorBuiltInFunctionEmulatorHLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,10 +11,10 @@
</span><span class="cx"> 
</span><span class="cx"> void InitBuiltInFunctionEmulatorForHLSL(BuiltInFunctionEmulator *emu)
</span><span class="cx"> {
</span><del>-    TType float1(EbtFloat);
-    TType float2(EbtFloat, 2);
-    TType float3(EbtFloat, 3);
-    TType float4(EbtFloat, 4);
</del><ins>+    TType *float1 = new TType(EbtFloat);
+    TType *float2 = new TType(EbtFloat, 2);
+    TType *float3 = new TType(EbtFloat, 3);
+    TType *float4 = new TType(EbtFloat, 4);
</ins><span class="cx"> 
</span><span class="cx">     emu-&gt;addEmulatedFunction(EOpMod, float1, float1,
</span><span class="cx">         &quot;float webgl_mod_emu(float x, float y)\n&quot;
</span><span class="lines">@@ -250,7 +250,7 @@
</span><span class="cx">         &quot;    return (y &lt;&lt; 16) | x;\n&quot;
</span><span class="cx">         &quot;}\n&quot;);
</span><span class="cx"> 
</span><del>-    TType uint1(EbtUInt);
</del><ins>+    TType *uint1 = new TType(EbtUInt);
</ins><span class="cx"> 
</span><span class="cx">     emu-&gt;addEmulatedFunction(EOpUnpackSnorm2x16, uint1,
</span><span class="cx">         &quot;float webgl_fromSnorm(in uint x) {\n&quot;
</span><span class="lines">@@ -327,9 +327,9 @@
</span><span class="cx">         &quot;    return mul(float4x1(r), float1x3(c));\n&quot;
</span><span class="cx">         &quot;}\n&quot;);
</span><span class="cx"> 
</span><del>-    TType mat2(EbtFloat, 2, 2);
-    TType mat3(EbtFloat, 3, 3);
-    TType mat4(EbtFloat, 4, 4);
</del><ins>+    TType *mat2 = new TType(EbtFloat, 2, 2);
+    TType *mat3 = new TType(EbtFloat, 3, 3);
+    TType *mat4 = new TType(EbtFloat, 4, 4);
</ins><span class="cx"> 
</span><span class="cx">     // Remember here that the parameter matrix is actually the transpose
</span><span class="cx">     // of the matrix that we're trying to invert, and the resulting matrix
</span><span class="lines">@@ -407,4 +407,35 @@
</span><span class="cx">                             &quot; cof02, cof12, cof22, cof32, cof03, cof13, cof23, cof33 };\n&quot;
</span><span class="cx">         &quot;    return cof / determinant(transpose(m));\n&quot;
</span><span class="cx">         &quot;}\n&quot;);
</span><ins>+
+    TType *bool1 = new TType(EbtBool);
+    TType *bool2 = new TType(EbtBool, 2);
+    TType *bool3 = new TType(EbtBool, 3);
+    TType *bool4 = new TType(EbtBool, 4);
+
+    // Emulate ESSL3 variant of mix that takes last argument as boolean vector.
+    // genType mix (genType x, genType y, genBType a): Selects which vector each returned component comes from.
+    // For a component of 'a' that is false, the corresponding component of 'x' is returned.For a component of 'a' that is true,
+    // the corresponding component of 'y' is returned.
+    emu-&gt;addEmulatedFunction(EOpMix, float1, float1, bool1,
+        &quot;float webgl_mix_emu(float x, float y, bool a)\n&quot;
+        &quot;{\n&quot;
+        &quot;    return a ? y : x;\n&quot;
+        &quot;}\n&quot;);
+    emu-&gt;addEmulatedFunction(EOpMix, float2, float2, bool2,
+        &quot;float2 webgl_mix_emu(float2 x, float2 y, bool2 a)\n&quot;
+        &quot;{\n&quot;
+        &quot;    return a ? y : x;\n&quot;
+        &quot;}\n&quot;);
+    emu-&gt;addEmulatedFunction(EOpMix, float3, float3, bool3,
+        &quot;float3 webgl_mix_emu(float3 x, float3 y, bool3 a)\n&quot;
+        &quot;{\n&quot;
+        &quot;    return a ? y : x;\n&quot;
+        &quot;}\n&quot;);
+    emu-&gt;addEmulatedFunction(EOpMix, float4, float4, bool4,
+        &quot;float4 webgl_mix_emu(float4 x, float4 y, bool4 a)\n&quot;
+        &quot;{\n&quot;
+        &quot;    return a ? y : x;\n&quot;
+        &quot;}\n&quot;);
+
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorCachecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,100 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Cache.cpp: Implements a cache for various commonly created objects.
+
+#include &lt;limits&gt;
+
+#include &quot;common/angleutils.h&quot;
+#include &quot;common/debug.h&quot;
+#include &quot;compiler/translator/Cache.h&quot;
+
+namespace
+{
+
+class TScopedAllocator : angle::NonCopyable
+{
+  public:
+    TScopedAllocator(TPoolAllocator *allocator)
+        : mPreviousAllocator(GetGlobalPoolAllocator())
+    {
+        SetGlobalPoolAllocator(allocator);
+    }
+    ~TScopedAllocator()
+    {
+        SetGlobalPoolAllocator(mPreviousAllocator);
+    }
+
+  private:
+    TPoolAllocator *mPreviousAllocator;
+};
+
+}  // namespace
+
+TCache::TypeKey::TypeKey(TBasicType basicType,
+                         TPrecision precision,
+                         TQualifier qualifier,
+                         unsigned char primarySize,
+                         unsigned char secondarySize)
+{
+    static_assert(sizeof(components) &lt;= sizeof(value),
+                  &quot;TypeKey::value is too small&quot;);
+
+    const size_t MaxEnumValue = std::numeric_limits&lt;EnumComponentType&gt;::max();
+    UNUSED_ASSERTION_VARIABLE(MaxEnumValue);
+
+    // TODO: change to static_assert() once we deprecate MSVC 2013 support
+    ASSERT(MaxEnumValue &gt;= EbtLast &amp;&amp;
+           MaxEnumValue &gt;= EbpLast &amp;&amp;
+           MaxEnumValue &gt;= EvqLast &amp;&amp;
+           &quot;TypeKey::EnumComponentType is too small&quot;);
+
+    value = 0;
+    components.basicType = static_cast&lt;EnumComponentType&gt;(basicType);
+    components.precision = static_cast&lt;EnumComponentType&gt;(precision);
+    components.qualifier = static_cast&lt;EnumComponentType&gt;(qualifier);
+    components.primarySize = primarySize;
+    components.secondarySize = secondarySize;
+}
+
+TCache *TCache::sCache = nullptr;
+
+void TCache::initialize()
+{
+    if (sCache == nullptr)
+    {
+        sCache = new TCache();
+    }
+}
+
+void TCache::destroy()
+{
+    SafeDelete(sCache);
+}
+
+const TType *TCache::getType(TBasicType basicType,
+                             TPrecision precision,
+                             TQualifier qualifier,
+                             unsigned char primarySize,
+                             unsigned char secondarySize)
+{
+    TypeKey key(basicType, precision, qualifier,
+                primarySize, secondarySize);
+    auto it = sCache-&gt;mTypes.find(key);
+    if (it != sCache-&gt;mTypes.end())
+    {
+        return it-&gt;second;
+    }
+
+    TScopedAllocator scopedAllocator(&amp;sCache-&gt;mAllocator);
+
+    TType *type = new TType(basicType, precision, qualifier,
+                            primarySize, secondarySize);
+    type-&gt;realize();
+    sCache-&gt;mTypes.insert(std::make_pair(key, type));
+
+    return type;
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorCacheh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Cache.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,90 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Cache.h: Implements a cache for various commonly created objects.
+
+#ifndef COMPILER_TRANSLATOR_CACHE_H_
+#define COMPILER_TRANSLATOR_CACHE_H_
+
+#include &lt;stdint.h&gt;
+#include &lt;string.h&gt;
+#include &lt;map&gt;
+
+#include &quot;compiler/translator/Types.h&quot;
+#include &quot;compiler/translator/PoolAlloc.h&quot;
+
+class TCache
+{
+  public:
+
+    static void initialize();
+    static void destroy();
+
+    static const TType *getType(TBasicType basicType,
+                                TPrecision precision)
+    {
+        return getType(basicType, precision, EvqTemporary,
+                       1, 1);
+    }
+    static const TType *getType(TBasicType basicType,
+                                unsigned char primarySize = 1,
+                                unsigned char secondarySize = 1)
+    {
+        return getType(basicType, EbpUndefined, EvqGlobal,
+                       primarySize, secondarySize);
+    }
+    static const TType *getType(TBasicType basicType,
+                                TQualifier qualifier,
+                                unsigned char primarySize = 1,
+                                unsigned char secondarySize = 1)
+    {
+        return getType(basicType, EbpUndefined, qualifier,
+                       primarySize, secondarySize);
+    }
+    static const TType *getType(TBasicType basicType,
+                                TPrecision precision,
+                                TQualifier qualifier,
+                                unsigned char primarySize,
+                                unsigned char secondarySize);
+
+  private:
+    TCache()
+    {
+    }
+
+    union TypeKey
+    {
+        TypeKey(TBasicType basicType,
+                TPrecision precision,
+                TQualifier qualifier,
+                unsigned char primarySize,
+                unsigned char secondarySize);
+
+        typedef uint8_t EnumComponentType;
+        struct
+        {
+            EnumComponentType basicType;
+            EnumComponentType precision;
+            EnumComponentType qualifier;
+            unsigned char primarySize;
+            unsigned char secondarySize;
+        } components;
+        uint64_t value;
+
+        bool operator &lt; (const TypeKey &amp;other) const
+        {
+            return value &lt; other.value;
+        }
+    };
+    typedef std::map&lt;TypeKey, const TType*&gt; TypeMap;
+
+    TypeMap mTypes;
+    TPoolAllocator mAllocator;
+
+    static TCache *sCache;
+};
+
+#endif  // COMPILER_TRANSLATOR_CACHE_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorCallDAGcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/CallDAG.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,9 +18,9 @@
</span><span class="cx">   public:
</span><span class="cx">     CallDAGCreator(TInfoSinkBase *info)
</span><span class="cx">         : TIntermTraverser(true, false, true),
</span><ins>+          mCreationInfo(info),
</ins><span class="cx">           mCurrentFunction(nullptr),
</span><del>-          mCurrentIndex(0),
-          mCreationInfo(info)
</del><ins>+          mCurrentIndex(0)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx">                 InitResult result = assignIndicesInternal(&amp;it.second);
</span><span class="cx">                 if (result != INITDAG_SUCCESS)
</span><span class="cx">                 {
</span><ins>+                    *mCreationInfo &lt;&lt; &quot;\n&quot;;
</ins><span class="cx">                     return result;
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="lines">@@ -107,7 +108,8 @@
</span><span class="cx">             if (visit == PreVisit)
</span><span class="cx">             {
</span><span class="cx">                 // Function declaration, create an empty record.
</span><del>-                mFunctions[node-&gt;getName()];
</del><ins>+                auto&amp; record = mFunctions[node-&gt;getName()];
+                record.name = node-&gt;getName();
</ins><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx">           case EOpFunction:
</span><span class="lines">@@ -169,7 +171,8 @@
</span><span class="cx"> 
</span><span class="cx">         if (!function-&gt;node)
</span><span class="cx">         {
</span><del>-            *mCreationInfo &lt;&lt; &quot;Undefined function: &quot; &lt;&lt; function-&gt;name;
</del><ins>+            *mCreationInfo &lt;&lt; &quot;Undefined function '&quot; &lt;&lt; function-&gt;name
+                           &lt;&lt; &quot;)' used in the following call chain:&quot;;
</ins><span class="cx">             return INITDAG_UNDEFINED;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -182,7 +185,7 @@
</span><span class="cx">         {
</span><span class="cx">             if (mCreationInfo)
</span><span class="cx">             {
</span><del>-                *mCreationInfo &lt;&lt; &quot;Recursive function call in the following call chain: &quot; &lt;&lt; function-&gt;name;
</del><ins>+                *mCreationInfo &lt;&lt; &quot;Recursive function call in the following call chain:&quot; &lt;&lt; function-&gt;name;
</ins><span class="cx">             }
</span><span class="cx">             return INITDAG_RECURSION;
</span><span class="cx">         }
</span><span class="lines">@@ -191,20 +194,16 @@
</span><span class="cx">         for (auto &amp;callee : function-&gt;callees)
</span><span class="cx">         {
</span><span class="cx">             InitResult result = assignIndicesInternal(callee);
</span><del>-            if (result == INITDAG_RECURSION)
</del><ins>+            if (result != INITDAG_SUCCESS)
</ins><span class="cx">             {
</span><del>-                // We know that there is a recursive function call chain in the AST,
</del><ins>+                // We know that there is an issue with the call chain in the AST,
</ins><span class="cx">                 // print the link of the chain we were processing.
</span><span class="cx">                 if (mCreationInfo)
</span><span class="cx">                 {
</span><del>-                    *mCreationInfo &lt;&lt; &quot; &lt;- &quot; &lt;&lt; function-&gt;name;
</del><ins>+                    *mCreationInfo &lt;&lt; &quot; &lt;- &quot; &lt;&lt; function-&gt;name &lt;&lt; &quot;)&quot;;
</ins><span class="cx">                 }
</span><del>-                return INITDAG_RECURSION;
</del><ins>+                return result;
</ins><span class="cx">             }
</span><del>-            else if (result == INITDAG_UNDEFINED)
-            {
-                return INITDAG_UNDEFINED;
-            }
</del><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         function-&gt;index = mCurrentIndex++;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorCodeGencpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/CodeGen.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/CodeGen.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/CodeGen.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -4,8 +4,16 @@
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><span class="cx"> 
</span><ins>+#include &quot;compiler/translator/Compiler.h&quot;
+
+#ifdef ANGLE_ENABLE_ESSL
</ins><span class="cx"> #include &quot;compiler/translator/TranslatorESSL.h&quot;
</span><ins>+#endif
+
+#ifdef ANGLE_ENABLE_GLSL
</ins><span class="cx"> #include &quot;compiler/translator/TranslatorGLSL.h&quot;
</span><ins>+#endif
+
</ins><span class="cx"> #ifdef ANGLE_ENABLE_HLSL
</span><span class="cx"> #include &quot;compiler/translator/TranslatorHLSL.h&quot;
</span><span class="cx"> #endif // ANGLE_ENABLE_HLSL
</span><span class="lines">@@ -20,24 +28,44 @@
</span><span class="cx"> {
</span><span class="cx">     switch (output) {
</span><span class="cx">       case SH_ESSL_OUTPUT:
</span><ins>+#ifdef ANGLE_ENABLE_ESSL
</ins><span class="cx">         return new TranslatorESSL(type, spec);
</span><ins>+#else
+        // This compiler is not supported in this
+        // configuration. Return NULL per the ShConstructCompiler API.
+        return nullptr;
+#endif // ANGLE_ENABLE_ESSL
</ins><span class="cx">       case SH_GLSL_130_OUTPUT:
</span><ins>+      case SH_GLSL_140_OUTPUT:
+      case SH_GLSL_150_CORE_OUTPUT:
+      case SH_GLSL_330_CORE_OUTPUT:
+      case SH_GLSL_400_CORE_OUTPUT:
</ins><span class="cx">       case SH_GLSL_410_CORE_OUTPUT:
</span><span class="cx">       case SH_GLSL_420_CORE_OUTPUT:
</span><ins>+      case SH_GLSL_430_CORE_OUTPUT:
+      case SH_GLSL_440_CORE_OUTPUT:
+      case SH_GLSL_450_CORE_OUTPUT:
</ins><span class="cx">       case SH_GLSL_COMPATIBILITY_OUTPUT:
</span><ins>+#ifdef ANGLE_ENABLE_GLSL
</ins><span class="cx">         return new TranslatorGLSL(type, spec, output);
</span><del>-      case SH_HLSL9_OUTPUT:
-      case SH_HLSL11_OUTPUT:
</del><ins>+#else
+        // This compiler is not supported in this
+        // configuration. Return NULL per the ShConstructCompiler API.
+        return nullptr;
+#endif // ANGLE_ENABLE_GLSL
+      case SH_HLSL_3_0_OUTPUT:
+      case SH_HLSL_4_1_OUTPUT:
+      case SH_HLSL_4_0_FL9_3_OUTPUT:
</ins><span class="cx"> #ifdef ANGLE_ENABLE_HLSL
</span><span class="cx">         return new TranslatorHLSL(type, spec, output);
</span><span class="cx"> #else
</span><span class="cx">         // This compiler is not supported in this
</span><span class="cx">         // configuration. Return NULL per the ShConstructCompiler API.
</span><del>-        return NULL;
</del><ins>+        return nullptr;
</ins><span class="cx"> #endif // ANGLE_ENABLE_HLSL
</span><span class="cx">       default:
</span><span class="cx">         // Unknown format. Return NULL per the ShConstructCompiler API.
</span><del>-        return NULL;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorCommonh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Common.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Common.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Common.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -60,18 +60,21 @@
</span><span class="cx"> //
</span><span class="cx"> // Pool allocator versions of vectors, lists, and maps
</span><span class="cx"> //
</span><del>-template &lt;class T&gt; class TVector : public std::vector&lt;T, pool_allocator&lt;T&gt; &gt; {
-public:
-    typedef typename std::vector&lt;T, pool_allocator&lt;T&gt; &gt;::size_type size_type;
-    TVector() : std::vector&lt;T, pool_allocator&lt;T&gt; &gt;() {}
-    TVector(const pool_allocator&lt;T&gt;&amp; a) : std::vector&lt;T, pool_allocator&lt;T&gt; &gt;(a) {}
-    TVector(size_type i): std::vector&lt;T, pool_allocator&lt;T&gt; &gt;(i) {}
</del><ins>+template &lt;class T&gt;
+class TVector : public std::vector&lt;T, pool_allocator&lt;T&gt;&gt;
+{
+  public:
+    typedef typename std::vector&lt;T, pool_allocator&lt;T&gt;&gt;::size_type size_type;
+    TVector() : std::vector&lt;T, pool_allocator&lt;T&gt;&gt;() {}
+    TVector(const pool_allocator&lt;T&gt; &amp;a) : std::vector&lt;T, pool_allocator&lt;T&gt;&gt;(a) {}
+    TVector(size_type i) : std::vector&lt;T, pool_allocator&lt;T&gt;&gt;(i) {}
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-template &lt;class K, class D, class CMP = std::less&lt;K&gt; &gt; 
-class TMap : public std::map&lt;K, D, CMP, pool_allocator&lt;std::pair&lt;const K, D&gt; &gt; &gt; {
-public:
-    typedef pool_allocator&lt;std::pair&lt;const K, D&gt; &gt; tAllocator;
</del><ins>+template &lt;class K, class D, class CMP = std::less&lt;K&gt;&gt;
+class TMap : public std::map&lt;K, D, CMP, pool_allocator&lt;std::pair&lt;const K, D&gt;&gt;&gt;
+{
+  public:
+    typedef pool_allocator&lt;std::pair&lt;const K, D&gt;&gt; tAllocator;
</ins><span class="cx"> 
</span><span class="cx">     TMap() : std::map&lt;K, D, CMP, tAllocator&gt;() {}
</span><span class="cx">     // use correct two-stage name lookup supported in gcc 3.4 and above
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorCompilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -4,8 +4,10 @@
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><span class="cx"> 
</span><ins>+#include &quot;compiler/translator/Cache.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/Compiler.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/CallDAG.h&quot;
</span><ins>+#include &quot;compiler/translator/DeferGlobalInitializers.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/ForLoopUnroll.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/Initialize.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/InitializeParseContext.h&quot;
</span><span class="lines">@@ -13,10 +15,13 @@
</span><span class="cx"> #include &quot;compiler/translator/ParseContext.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/PruneEmptyDeclarations.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/RegenerateStructNames.h&quot;
</span><ins>+#include &quot;compiler/translator/RemovePow.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/RenameFunction.h&quot;
</span><ins>+#include &quot;compiler/translator/RewriteDoWhile.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/ScalarizeVecAndMatConstructorArgs.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/UnfoldShortCircuitAST.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/ValidateLimitations.h&quot;
</span><ins>+#include &quot;compiler/translator/ValidateMaxParameters.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/ValidateOutputs.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/VariablePacker.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/depgraph/DependencyGraph.h&quot;
</span><span class="lines">@@ -37,8 +42,15 @@
</span><span class="cx"> bool IsGLSL130OrNewer(ShShaderOutput output)
</span><span class="cx"> {
</span><span class="cx">     return (output == SH_GLSL_130_OUTPUT ||
</span><ins>+            output == SH_GLSL_140_OUTPUT ||
+            output == SH_GLSL_150_CORE_OUTPUT ||
+            output == SH_GLSL_330_CORE_OUTPUT ||
+            output == SH_GLSL_400_CORE_OUTPUT ||
</ins><span class="cx">             output == SH_GLSL_410_CORE_OUTPUT ||
</span><del>-            output == SH_GLSL_420_CORE_OUTPUT);
</del><ins>+            output == SH_GLSL_420_CORE_OUTPUT ||
+            output == SH_GLSL_430_CORE_OUTPUT ||
+            output == SH_GLSL_440_CORE_OUTPUT ||
+            output == SH_GLSL_450_CORE_OUTPUT);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> size_t GetGlobalMaxTokenSize(ShShaderSpec spec)
</span><span class="lines">@@ -131,10 +143,12 @@
</span><span class="cx">       maxUniformVectors(0),
</span><span class="cx">       maxExpressionComplexity(0),
</span><span class="cx">       maxCallStackDepth(0),
</span><ins>+      maxFunctionParameters(0),
</ins><span class="cx">       fragmentPrecisionHigh(false),
</span><span class="cx">       clampingStrategy(SH_CLAMP_WITH_CLAMP_INTRINSIC),
</span><span class="cx">       builtInFunctionEmulator(),
</span><del>-      mSourcePath(NULL)
</del><ins>+      mSourcePath(NULL),
+      mTemporaryIndex(0)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -142,6 +156,15 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool TCompiler::shouldRunLoopAndIndexingValidation(int compileOptions) const
+{
+    // If compiling an ESSL 1.00 shader for WebGL, or if its been requested through the API,
+    // validate loop and indexing as well (to verify that the shader only uses minimal functionality
+    // of ESSL 1.00 as in Appendix A of the spec).
+    return (IsWebGLBasedSpec(shaderSpec) &amp;&amp; shaderVersion == 100) ||
+           (compileOptions &amp; SH_VALIDATE_LOOP_INDEXING);
+}
+
</ins><span class="cx"> bool TCompiler::Init(const ShBuiltInResources&amp; resources)
</span><span class="cx"> {
</span><span class="cx">     shaderVersion = 100;
</span><span class="lines">@@ -149,7 +172,8 @@
</span><span class="cx">         resources.MaxVertexUniformVectors :
</span><span class="cx">         resources.MaxFragmentUniformVectors;
</span><span class="cx">     maxExpressionComplexity = resources.MaxExpressionComplexity;
</span><del>-    maxCallStackDepth = resources.MaxCallStackDepth;
</del><ins>+    maxCallStackDepth       = resources.MaxCallStackDepth;
+    maxFunctionParameters   = resources.MaxFunctionParameters;
</ins><span class="cx"> 
</span><span class="cx">     SetGlobalPoolAllocator(&amp;allocator);
</span><span class="cx"> 
</span><span class="lines">@@ -173,8 +197,9 @@
</span><span class="cx">     return compileTreeImpl(shaderStrings, numStrings, compileOptions);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermNode *TCompiler::compileTreeImpl(const char* const shaderStrings[],
-    size_t numStrings, int compileOptions)
</del><ins>+TIntermNode *TCompiler::compileTreeImpl(const char *const shaderStrings[],
+                                        size_t numStrings,
+                                        const int compileOptions)
</ins><span class="cx"> {
</span><span class="cx">     clearResults();
</span><span class="cx"> 
</span><span class="lines">@@ -184,10 +209,6 @@
</span><span class="cx">     // Reset the extension behavior for each compilation unit.
</span><span class="cx">     ResetExtensionBehavior(extensionBehavior);
</span><span class="cx"> 
</span><del>-    // If compiling for WebGL, validate loop and indexing as well.
-    if (IsWebGLBasedSpec(shaderSpec))
-        compileOptions |= SH_VALIDATE_LOOP_INDEXING;
-
</del><span class="cx">     // First string is path of source file if flag is set. The actual source follows.
</span><span class="cx">     size_t firstSource = 0;
</span><span class="cx">     if (compileOptions &amp; SH_SOURCE_PATH)
</span><span class="lines">@@ -196,13 +217,11 @@
</span><span class="cx">         ++firstSource;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool debugShaderPrecision = getResources().WEBGL_debug_shader_precision == 1;
</del><span class="cx">     TIntermediate intermediate(infoSink);
</span><del>-    TParseContext parseContext(symbolTable, extensionBehavior, intermediate,
-                               shaderType, shaderSpec, compileOptions, true,
-                               infoSink, debugShaderPrecision);
</del><ins>+    TParseContext parseContext(symbolTable, extensionBehavior, intermediate, shaderType, shaderSpec,
+                               compileOptions, true, infoSink, getResources());
</ins><span class="cx"> 
</span><del>-    parseContext.fragmentPrecisionHigh = fragmentPrecisionHigh;
</del><ins>+    parseContext.setFragmentPrecisionHighOnESSL1(fragmentPrecisionHigh);
</ins><span class="cx">     SetGlobalParseContext(&amp;parseContext);
</span><span class="cx"> 
</span><span class="cx">     // We preserve symbols at the built-in level from compile-to-compile.
</span><span class="lines">@@ -211,8 +230,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Parse shader.
</span><span class="cx">     bool success =
</span><del>-        (PaParseStrings(numStrings - firstSource, &amp;shaderStrings[firstSource], NULL, &amp;parseContext) == 0) &amp;&amp;
-        (parseContext.treeRoot != NULL);
</del><ins>+        (PaParseStrings(numStrings - firstSource, &amp;shaderStrings[firstSource], nullptr, &amp;parseContext) == 0) &amp;&amp;
+        (parseContext.getTreeRoot() != nullptr);
</ins><span class="cx"> 
</span><span class="cx">     shaderVersion = parseContext.getShaderVersion();
</span><span class="cx">     if (success &amp;&amp; MapSpecToShaderVersion(shaderSpec) &lt; shaderVersion)
</span><span class="lines">@@ -222,7 +241,7 @@
</span><span class="cx">         success = false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TIntermNode *root = NULL;
</del><ins>+    TIntermNode *root = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     if (success)
</span><span class="cx">     {
</span><span class="lines">@@ -232,9 +251,12 @@
</span><span class="cx">             symbolTable.setGlobalInvariant();
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        root = parseContext.treeRoot;
-        success = intermediate.postProcess(root);
</del><ins>+        root = parseContext.getTreeRoot();
+        root = intermediate.postProcess(root);
</ins><span class="cx"> 
</span><ins>+        // Highp might have been auto-enabled based on shader version
+        fragmentPrecisionHigh = parseContext.getFragmentPrecisionHigh();
+
</ins><span class="cx">         // Disallow expressions deemed too complex.
</span><span class="cx">         if (success &amp;&amp; (compileOptions &amp; SH_LIMIT_EXPRESSION_COMPLEXITY))
</span><span class="cx">             success = limitExpressionComplexity(root);
</span><span class="lines">@@ -264,7 +286,7 @@
</span><span class="cx">         if (success &amp;&amp; shaderVersion == 300 &amp;&amp; shaderType == GL_FRAGMENT_SHADER)
</span><span class="cx">             success = validateOutputs(root);
</span><span class="cx"> 
</span><del>-        if (success &amp;&amp; (compileOptions &amp; SH_VALIDATE_LOOP_INDEXING))
</del><ins>+        if (success &amp;&amp; shouldRunLoopAndIndexingValidation(compileOptions))
</ins><span class="cx">             success = validateLimitations(root);
</span><span class="cx"> 
</span><span class="cx">         if (success &amp;&amp; (compileOptions &amp; SH_TIMING_RESTRICTIONS))
</span><span class="lines">@@ -276,12 +298,14 @@
</span><span class="cx">         // Unroll for-loop markup needs to happen after validateLimitations pass.
</span><span class="cx">         if (success &amp;&amp; (compileOptions &amp; SH_UNROLL_FOR_LOOP_WITH_INTEGER_INDEX))
</span><span class="cx">         {
</span><del>-            ForLoopUnrollMarker marker(ForLoopUnrollMarker::kIntegerIndex);
</del><ins>+            ForLoopUnrollMarker marker(ForLoopUnrollMarker::kIntegerIndex,
+                                       shouldRunLoopAndIndexingValidation(compileOptions));
</ins><span class="cx">             root-&gt;traverse(&amp;marker);
</span><span class="cx">         }
</span><span class="cx">         if (success &amp;&amp; (compileOptions &amp; SH_UNROLL_FOR_LOOP_WITH_SAMPLER_ARRAY_INDEX))
</span><span class="cx">         {
</span><del>-            ForLoopUnrollMarker marker(ForLoopUnrollMarker::kSamplerArrayIndex);
</del><ins>+            ForLoopUnrollMarker marker(ForLoopUnrollMarker::kSamplerArrayIndex,
+                                       shouldRunLoopAndIndexingValidation(compileOptions));
</ins><span class="cx">             root-&gt;traverse(&amp;marker);
</span><span class="cx">             if (marker.samplerArrayIndexIsFloatLoopIndex())
</span><span class="cx">             {
</span><span class="lines">@@ -302,9 +326,16 @@
</span><span class="cx">         if (success &amp;&amp; (compileOptions &amp; SH_CLAMP_INDIRECT_ARRAY_BOUNDS))
</span><span class="cx">             arrayBoundsClamper.MarkIndirectArrayBoundsForClamping(root);
</span><span class="cx"> 
</span><del>-        if (success &amp;&amp; shaderType == GL_VERTEX_SHADER &amp;&amp; (compileOptions &amp; SH_INIT_GL_POSITION))
</del><ins>+        // gl_Position is always written in compatibility output mode
+        if (success &amp;&amp; shaderType == GL_VERTEX_SHADER &amp;&amp;
+            ((compileOptions &amp; SH_INIT_GL_POSITION) ||
+             (outputType == SH_GLSL_COMPATIBILITY_OUTPUT)))
</ins><span class="cx">             initializeGLPosition(root);
</span><span class="cx"> 
</span><ins>+        // This pass might emit short circuits so keep it before the short circuit unfolding
+        if (success &amp;&amp; (compileOptions &amp; SH_REWRITE_DO_WHILE_LOOPS))
+            RewriteDoWhile(root, getTemporaryIndex());
+
</ins><span class="cx">         if (success &amp;&amp; (compileOptions &amp; SH_UNFOLD_SHORT_CIRCUIT))
</span><span class="cx">         {
</span><span class="cx">             UnfoldShortCircuitAST unfoldShortCircuit;
</span><span class="lines">@@ -312,8 +343,13 @@
</span><span class="cx">             unfoldShortCircuit.updateTree();
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (success &amp;&amp; (compileOptions &amp; SH_VARIABLES))
</del><ins>+        if (success &amp;&amp; (compileOptions &amp; SH_REMOVE_POW_WITH_CONSTANT_EXPONENT))
</ins><span class="cx">         {
</span><ins>+            RemovePow(root);
+        }
+
+        if (success &amp;&amp; shouldCollectVariables(compileOptions))
+        {
</ins><span class="cx">             collectVariables(root);
</span><span class="cx">             if (compileOptions &amp; SH_ENFORCE_PACKING_RESTRICTIONS)
</span><span class="cx">             {
</span><span class="lines">@@ -341,6 +377,11 @@
</span><span class="cx">             RegenerateStructNames gen(symbolTable, shaderVersion);
</span><span class="cx">             root-&gt;traverse(&amp;gen);
</span><span class="cx">         }
</span><ins>+
+        if (success)
+        {
+            DeferGlobalInitializers(root);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     SetGlobalParseContext(NULL);
</span><span class="lines">@@ -396,11 +437,6 @@
</span><span class="cx">     floatingPoint.secondarySize = 1;
</span><span class="cx">     floatingPoint.array = false;
</span><span class="cx"> 
</span><del>-    TPublicType sampler;
-    sampler.primarySize = 1;
-    sampler.secondarySize = 1;
-    sampler.array = false;
-
</del><span class="cx">     switch(shaderType)
</span><span class="cx">     {
</span><span class="cx">       case GL_FRAGMENT_SHADER:
</span><span class="lines">@@ -413,14 +449,15 @@
</span><span class="cx">       default:
</span><span class="cx">         assert(false &amp;&amp; &quot;Language not supported&quot;);
</span><span class="cx">     }
</span><del>-    // We set defaults for all the sampler types, even those that are
</del><ins>+    // Set defaults for sampler types that have default precision, even those that are
</ins><span class="cx">     // only available if an extension exists.
</span><del>-    for (int samplerType = EbtGuardSamplerBegin + 1;
-         samplerType &lt; EbtGuardSamplerEnd; ++samplerType)
-    {
-        sampler.type = static_cast&lt;TBasicType&gt;(samplerType);
-        symbolTable.setDefaultPrecision(sampler, EbpLow);
-    }
</del><ins>+    // New sampler types in ESSL3 don't have default precision. ESSL1 types do.
+    initSamplerDefaultPrecision(EbtSampler2D);
+    initSamplerDefaultPrecision(EbtSamplerCube);
+    // SamplerExternalOES is specified in the extension to have default precision.
+    initSamplerDefaultPrecision(EbtSamplerExternalOES);
+    // It isn't specified whether Sampler2DRect has default precision.
+    initSamplerDefaultPrecision(EbtSampler2DRect);
</ins><span class="cx"> 
</span><span class="cx">     InsertBuiltInFunctions(shaderType, shaderSpec, resources, symbolTable);
</span><span class="cx"> 
</span><span class="lines">@@ -429,6 +466,17 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TCompiler::initSamplerDefaultPrecision(TBasicType samplerType)
+{
+    ASSERT(samplerType &gt; EbtGuardSamplerBegin &amp;&amp; samplerType &lt; EbtGuardSamplerEnd);
+    TPublicType sampler;
+    sampler.primarySize   = 1;
+    sampler.secondarySize = 1;
+    sampler.array         = false;
+    sampler.type          = samplerType;
+    symbolTable.setDefaultPrecision(sampler, EbpLow);
+}
+
</ins><span class="cx"> void TCompiler::setResourceString()
</span><span class="cx"> {
</span><span class="cx">     std::ostringstream strstream;
</span><span class="lines">@@ -447,6 +495,8 @@
</span><span class="cx">               &lt;&lt; &quot;:FragmentPrecisionHigh:&quot; &lt;&lt; compileResources.FragmentPrecisionHigh
</span><span class="cx">               &lt;&lt; &quot;:MaxExpressionComplexity:&quot; &lt;&lt; compileResources.MaxExpressionComplexity
</span><span class="cx">               &lt;&lt; &quot;:MaxCallStackDepth:&quot; &lt;&lt; compileResources.MaxCallStackDepth
</span><ins>+              &lt;&lt; &quot;:MaxFunctionParameters:&quot; &lt;&lt; compileResources.MaxFunctionParameters
+              &lt;&lt; &quot;:EXT_blend_func_extended:&quot; &lt;&lt; compileResources.EXT_blend_func_extended
</ins><span class="cx">               &lt;&lt; &quot;:EXT_frag_depth:&quot; &lt;&lt; compileResources.EXT_frag_depth
</span><span class="cx">               &lt;&lt; &quot;:EXT_shader_texture_lod:&quot; &lt;&lt; compileResources.EXT_shader_texture_lod
</span><span class="cx">               &lt;&lt; &quot;:EXT_shader_framebuffer_fetch:&quot; &lt;&lt; compileResources.EXT_shader_framebuffer_fetch
</span><span class="lines">@@ -456,6 +506,7 @@
</span><span class="cx">               &lt;&lt; &quot;:MaxFragmentInputVectors:&quot; &lt;&lt; compileResources.MaxFragmentInputVectors
</span><span class="cx">               &lt;&lt; &quot;:MinProgramTexelOffset:&quot; &lt;&lt; compileResources.MinProgramTexelOffset
</span><span class="cx">               &lt;&lt; &quot;:MaxProgramTexelOffset:&quot; &lt;&lt; compileResources.MaxProgramTexelOffset
</span><ins>+              &lt;&lt; &quot;:MaxDualSourceDrawBuffers:&quot; &lt;&lt; compileResources.MaxDualSourceDrawBuffers
</ins><span class="cx">               &lt;&lt; &quot;:NV_draw_buffers:&quot; &lt;&lt; compileResources.NV_draw_buffers
</span><span class="cx">               &lt;&lt; &quot;:WEBGL_debug_shader_precision:&quot; &lt;&lt; compileResources.WEBGL_debug_shader_precision;
</span><span class="cx"> 
</span><span class="lines">@@ -481,6 +532,7 @@
</span><span class="cx">     nameMap.clear();
</span><span class="cx"> 
</span><span class="cx">     mSourcePath = NULL;
</span><ins>+    mTemporaryIndex = 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool TCompiler::initCallDag(TIntermNode *root)
</span><span class="lines">@@ -528,15 +580,15 @@
</span><span class="cx">             infoSink.info &lt;&lt; &quot;Call stack too deep (larger than &quot; &lt;&lt; maxCallStackDepth
</span><span class="cx">                           &lt;&lt; &quot;) with the following call chain: &quot; &lt;&lt; record.name;
</span><span class="cx"> 
</span><del>-            signed long long currentFunction = i;
</del><ins>+            int currentFunction = static_cast&lt;int&gt;(i);
</ins><span class="cx">             int currentDepth = depth;
</span><span class="cx"> 
</span><span class="cx">             while (currentFunction != -1)
</span><span class="cx">             {
</span><del>-                infoSink.info &lt;&lt; &quot; -&gt; &quot; &lt;&lt; mCallDag.getRecordFromIndex(static_cast&lt;size_t&gt;(currentFunction)).name;
</del><ins>+                infoSink.info &lt;&lt; &quot; -&gt; &quot; &lt;&lt; mCallDag.getRecordFromIndex(currentFunction).name;
</ins><span class="cx"> 
</span><span class="cx">                 int nextFunction = -1;
</span><del>-                for (auto&amp; calleeIndex : mCallDag.getRecordFromIndex(static_cast&lt;size_t&gt;(currentFunction)).callees)
</del><ins>+                for (auto&amp; calleeIndex : mCallDag.getRecordFromIndex(currentFunction).callees)
</ins><span class="cx">                 {
</span><span class="cx">                     if (depths[calleeIndex] == currentDepth - 1)
</span><span class="cx">                     {
</span><span class="lines">@@ -558,7 +610,7 @@
</span><span class="cx"> bool TCompiler::tagUsedFunctions()
</span><span class="cx"> {
</span><span class="cx">     // Search from main, starting from the end of the DAG as it usually is the root.
</span><del>-    for (size_t i = mCallDag.size(); i--;)
</del><ins>+    for (size_t i = mCallDag.size(); i-- &gt; 0;)
</ins><span class="cx">     {
</span><span class="cx">         if (mCallDag.getRecordFromIndex(i).name == &quot;main(&quot;)
</span><span class="cx">         {
</span><span class="lines">@@ -568,7 +620,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     infoSink.info.prefix(EPrefixError);
</span><del>-    infoSink.info &lt;&lt; &quot;Missing main()&quot;;
</del><ins>+    infoSink.info &lt;&lt; &quot;Missing main()\n&quot;;
</ins><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -635,16 +687,20 @@
</span><span class="cx"> 
</span><span class="cx">     UnusedPredicate isUnused(&amp;mCallDag, &amp;functionMetadata);
</span><span class="cx">     TIntermSequence *sequence = rootNode-&gt;getSequence();
</span><del>-    sequence-&gt;erase(std::remove_if(sequence-&gt;begin(), sequence-&gt;end(), isUnused), sequence-&gt;end());
</del><span class="cx"> 
</span><ins>+    if (!sequence-&gt;empty())
+    {
+        sequence-&gt;erase(std::remove_if(sequence-&gt;begin(), sequence-&gt;end(), isUnused), sequence-&gt;end());
+    }
+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool TCompiler::validateOutputs(TIntermNode* root)
</span><span class="cx"> {
</span><del>-    ValidateOutputs validateOutputs(infoSink.info, compileResources.MaxDrawBuffers);
</del><ins>+    ValidateOutputs validateOutputs(getExtensionBehavior(), compileResources.MaxDrawBuffers);
</ins><span class="cx">     root-&gt;traverse(&amp;validateOutputs);
</span><del>-    return (validateOutputs.numErrors() == 0);
</del><ins>+    return (validateOutputs.validateAndCountErrors(infoSink.info) == 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TCompiler::rewriteCSSShader(TIntermNode* root)
</span><span class="lines">@@ -655,7 +711,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool TCompiler::validateLimitations(TIntermNode* root)
</span><span class="cx"> {
</span><del>-    ValidateLimitations validate(shaderType, infoSink.info);
</del><ins>+    ValidateLimitations validate(shaderType, &amp;infoSink.info);
</ins><span class="cx">     root-&gt;traverse(&amp;validate);
</span><span class="cx">     return validate.numErrors() == 0;
</span><span class="cx"> }
</span><span class="lines">@@ -701,15 +757,10 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TDependencyGraph graph(root);
-
-    for (TFunctionCallVector::const_iterator iter = graph.beginUserDefinedFunctionCalls();
-         iter != graph.endUserDefinedFunctionCalls();
-         ++iter)
</del><ins>+    if (!ValidateMaxParameters::validate(root, maxFunctionParameters))
</ins><span class="cx">     {
</span><del>-        TGraphFunctionCall* samplerSymbol = *iter;
-        TDependencyGraphTraverser graphTraverser;
-        samplerSymbol-&gt;traverse(&amp;graphTraverser);
</del><ins>+        infoSink.info &lt;&lt; &quot;Function has too many parameters.&quot;;
+        return false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorCompilerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Compiler.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -67,8 +67,8 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     TCompiler(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output);
</span><del>-    virtual ~TCompiler();
-    virtual TCompiler* getAsCompiler() { return this; }
</del><ins>+    ~TCompiler() override;
+    TCompiler *getAsCompiler() override { return this; }
</ins><span class="cx"> 
</span><span class="cx">     bool Init(const ShBuiltInResources&amp; resources);
</span><span class="cx"> 
</span><span class="lines">@@ -85,8 +85,11 @@
</span><span class="cx">     int getShaderVersion() const { return shaderVersion; }
</span><span class="cx">     TInfoSink&amp; getInfoSink() { return infoSink; }
</span><span class="cx"> 
</span><ins>+    // Clears the results from the previous compilation.
+    void clearResults();
+
</ins><span class="cx">     const std::vector&lt;sh::Attribute&gt; &amp;getAttributes() const { return attributes; }
</span><del>-    const std::vector&lt;sh::Attribute&gt; &amp;getOutputVariables() const { return outputVariables; }
</del><ins>+    const std::vector&lt;sh::OutputVariable&gt; &amp;getOutputVariables() const { return outputVariables; }
</ins><span class="cx">     const std::vector&lt;sh::Uniform&gt; &amp;getUniforms() const { return uniforms; }
</span><span class="cx">     const std::vector&lt;sh::Varying&gt; &amp;getVaryings() const { return varyings; }
</span><span class="cx">     const std::vector&lt;sh::InterfaceBlock&gt; &amp;getInterfaceBlocks() const { return interfaceBlocks; }
</span><span class="lines">@@ -98,6 +101,8 @@
</span><span class="cx">     ShShaderOutput getOutputType() const { return outputType; }
</span><span class="cx">     const std::string &amp;getBuiltInResourcesString() const { return builtInResourcesString; }
</span><span class="cx"> 
</span><ins>+    bool shouldRunLoopAndIndexingValidation(int compileOptions) const;
+
</ins><span class="cx">     // Get the resources set by InitBuiltInSymbolTable
</span><span class="cx">     const ShBuiltInResources&amp; getResources() const;
</span><span class="cx"> 
</span><span class="lines">@@ -107,8 +112,6 @@
</span><span class="cx">     bool InitBuiltInSymbolTable(const ShBuiltInResources&amp; resources);
</span><span class="cx">     // Compute the string representation of the built-in resources
</span><span class="cx">     void setResourceString();
</span><del>-    // Clears the results from the previous compilation.
-    void clearResults();
</del><span class="cx">     // Return false if the call depth is exceeded.
</span><span class="cx">     bool checkCallDepth();
</span><span class="cx">     // Returns true if a program has no conflicting or missing fragment outputs
</span><span class="lines">@@ -151,18 +154,24 @@
</span><span class="cx">     const char *getSourcePath() const;
</span><span class="cx">     const TPragma&amp; getPragma() const { return mPragma; }
</span><span class="cx">     void writePragma();
</span><ins>+    unsigned int *getTemporaryIndex() { return &amp;mTemporaryIndex; }
</ins><span class="cx"> 
</span><span class="cx">     const ArrayBoundsClamper&amp; getArrayBoundsClamper() const;
</span><span class="cx">     ShArrayIndexClampingStrategy getArrayIndexClampingStrategy() const;
</span><span class="cx">     const BuiltInFunctionEmulator&amp; getBuiltInFunctionEmulator() const;
</span><span class="cx"> 
</span><span class="cx">     std::vector&lt;sh::Attribute&gt; attributes;
</span><del>-    std::vector&lt;sh::Attribute&gt; outputVariables;
</del><ins>+    std::vector&lt;sh::OutputVariable&gt; outputVariables;
</ins><span class="cx">     std::vector&lt;sh::Uniform&gt; uniforms;
</span><span class="cx">     std::vector&lt;sh::ShaderVariable&gt; expandedUniforms;
</span><span class="cx">     std::vector&lt;sh::Varying&gt; varyings;
</span><span class="cx">     std::vector&lt;sh::InterfaceBlock&gt; interfaceBlocks;
</span><span class="cx"> 
</span><ins>+    virtual bool shouldCollectVariables(int compileOptions)
+    {
+        return (compileOptions &amp; SH_VARIABLES) != 0;
+    }
+
</ins><span class="cx">   private:
</span><span class="cx">     // Creates the function call DAG for further analysis, returning false if there is a recursion
</span><span class="cx">     bool initCallDag(TIntermNode *root);
</span><span class="lines">@@ -170,12 +179,15 @@
</span><span class="cx">     bool tagUsedFunctions();
</span><span class="cx">     void internalTagUsedFunction(size_t index);
</span><span class="cx"> 
</span><ins>+    void initSamplerDefaultPrecision(TBasicType samplerType);
+
</ins><span class="cx">     // Removes unused function declarations and prototypes from the AST
</span><span class="cx">     class UnusedPredicate;
</span><span class="cx">     bool pruneUnusedFunctions(TIntermNode *root);
</span><span class="cx"> 
</span><del>-    TIntermNode *compileTreeImpl(const char* const shaderStrings[],
-        size_t numStrings, int compileOptions);
</del><ins>+    TIntermNode *compileTreeImpl(const char *const shaderStrings[],
+                                 size_t numStrings,
+                                 const int compileOptions);
</ins><span class="cx"> 
</span><span class="cx">     sh::GLenum shaderType;
</span><span class="cx">     ShShaderSpec shaderSpec;
</span><span class="lines">@@ -196,6 +208,7 @@
</span><span class="cx">     int maxUniformVectors;
</span><span class="cx">     int maxExpressionComplexity;
</span><span class="cx">     int maxCallStackDepth;
</span><ins>+    int maxFunctionParameters;
</ins><span class="cx"> 
</span><span class="cx">     ShBuiltInResources compileResources;
</span><span class="cx">     std::string builtInResourcesString;
</span><span class="lines">@@ -221,6 +234,8 @@
</span><span class="cx">     NameMap nameMap;
</span><span class="cx"> 
</span><span class="cx">     TPragma mPragma;
</span><ins>+
+    unsigned int mTemporaryIndex;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorDeferGlobalInitializerscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,166 @@
</span><ins>+//
+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// DeferGlobalInitializers is an AST traverser that moves global initializers into a function, and
+// adds a function call to that function in the beginning of main().
+// This enables initialization of globals with uniforms or non-constant globals, as allowed by
+// the WebGL spec. Some initializers referencing non-constants may need to be unfolded into if
+// statements in HLSL - this kind of steps should be done after DeferGlobalInitializers is run.
+//
+
+#include &quot;compiler/translator/DeferGlobalInitializers.h&quot;
+
+#include &quot;compiler/translator/IntermNode.h&quot;
+#include &quot;compiler/translator/SymbolTable.h&quot;
+
+namespace
+{
+
+void SetInternalFunctionName(TIntermAggregate *functionNode, const char *name)
+{
+    TString nameStr(name);
+    nameStr = TFunction::mangleName(nameStr);
+    TName nameObj(nameStr);
+    nameObj.setInternal(true);
+    functionNode-&gt;setNameObj(nameObj);
+}
+
+TIntermAggregate *CreateFunctionPrototypeNode(const char *name)
+{
+    TIntermAggregate *functionNode = new TIntermAggregate(EOpPrototype);
+
+    SetInternalFunctionName(functionNode, name);
+    TType returnType(EbtVoid);
+    functionNode-&gt;setType(returnType);
+    return functionNode;
+}
+
+TIntermAggregate *CreateFunctionDefinitionNode(const char *name, TIntermAggregate *functionBody)
+{
+    TIntermAggregate *functionNode = new TIntermAggregate(EOpFunction);
+    TIntermAggregate *paramsNode = new TIntermAggregate(EOpParameters);
+    functionNode-&gt;getSequence()-&gt;push_back(paramsNode);
+    functionNode-&gt;getSequence()-&gt;push_back(functionBody);
+
+    SetInternalFunctionName(functionNode, name);
+    TType returnType(EbtVoid);
+    functionNode-&gt;setType(returnType);
+    return functionNode;
+}
+
+TIntermAggregate *CreateFunctionCallNode(const char *name)
+{
+    TIntermAggregate *functionNode = new TIntermAggregate(EOpFunctionCall);
+
+    SetInternalFunctionName(functionNode, name);
+    TType returnType(EbtVoid);
+    functionNode-&gt;setType(returnType);
+    return functionNode;
+}
+
+class DeferGlobalInitializersTraverser : public TIntermTraverser
+{
+  public:
+    DeferGlobalInitializersTraverser();
+
+    bool visitBinary(Visit visit, TIntermBinary *node) override;
+
+    void insertInitFunction(TIntermNode *root);
+
+  private:
+    TIntermSequence mDeferredInitializers;
+};
+
+DeferGlobalInitializersTraverser::DeferGlobalInitializersTraverser()
+    : TIntermTraverser(true, false, false)
+{
+}
+
+bool DeferGlobalInitializersTraverser::visitBinary(Visit visit, TIntermBinary *node)
+{
+    if (node-&gt;getOp() == EOpInitialize)
+    {
+        TIntermSymbol *symbolNode = node-&gt;getLeft()-&gt;getAsSymbolNode();
+        ASSERT(symbolNode);
+        TIntermTyped *expression = node-&gt;getRight();
+
+        if (symbolNode-&gt;getQualifier() == EvqGlobal &amp;&amp;
+            (expression-&gt;getQualifier() != EvqConst || expression-&gt;getAsConstantUnion() == nullptr))
+        {
+            // For variables which are not constant, defer their real initialization until
+            // after we initialize uniforms.
+            // Deferral is done also in any cases where the variable has not been constant folded,
+            // since otherwise there's a chance that HLSL output will generate extra statements
+            // from the initializer expression.
+            TIntermBinary *deferredInit = new TIntermBinary(EOpAssign);
+            deferredInit-&gt;setLeft(node-&gt;getLeft()-&gt;deepCopy());
+            deferredInit-&gt;setRight(node-&gt;getRight());
+            deferredInit-&gt;setType(node-&gt;getType());
+            mDeferredInitializers.push_back(deferredInit);
+
+            // Remove the initializer from the global scope and just declare the global instead.
+            mReplacements.push_back(NodeUpdateEntry(getParentNode(), node, node-&gt;getLeft(), false));
+        }
+    }
+    return false;
+}
+
+void DeferGlobalInitializersTraverser::insertInitFunction(TIntermNode *root)
+{
+    if (mDeferredInitializers.empty())
+    {
+        return;
+    }
+    TIntermAggregate *rootAgg = root-&gt;getAsAggregate();
+    ASSERT(rootAgg != nullptr &amp;&amp; rootAgg-&gt;getOp() == EOpSequence);
+
+    const char *functionName = &quot;initializeDeferredGlobals&quot;;
+
+    // Add function prototype to the beginning of the shader
+    TIntermAggregate *functionPrototypeNode = CreateFunctionPrototypeNode(functionName);
+    rootAgg-&gt;getSequence()-&gt;insert(rootAgg-&gt;getSequence()-&gt;begin(), functionPrototypeNode);
+
+    // Add function definition to the end of the shader
+    TIntermAggregate *functionBodyNode = new TIntermAggregate(EOpSequence);
+    TIntermSequence *functionBody = functionBodyNode-&gt;getSequence();
+    for (const auto &amp;deferredInit : mDeferredInitializers)
+    {
+        functionBody-&gt;push_back(deferredInit);
+    }
+    TIntermAggregate *functionDefinition =
+        CreateFunctionDefinitionNode(functionName, functionBodyNode);
+    rootAgg-&gt;getSequence()-&gt;push_back(functionDefinition);
+
+    // Insert call into main function
+    for (TIntermNode *node : *rootAgg-&gt;getSequence())
+    {
+        TIntermAggregate *nodeAgg = node-&gt;getAsAggregate();
+        if (nodeAgg != nullptr &amp;&amp; nodeAgg-&gt;getOp() == EOpFunction &amp;&amp;
+            TFunction::unmangleName(nodeAgg-&gt;getName()) == &quot;main&quot;)
+        {
+            TIntermAggregate *functionCallNode = CreateFunctionCallNode(functionName);
+
+            TIntermNode *mainBody         = nodeAgg-&gt;getSequence()-&gt;back();
+            TIntermAggregate *mainBodyAgg = mainBody-&gt;getAsAggregate();
+            ASSERT(mainBodyAgg != nullptr &amp;&amp; mainBodyAgg-&gt;getOp() == EOpSequence);
+            mainBodyAgg-&gt;getSequence()-&gt;insert(mainBodyAgg-&gt;getSequence()-&gt;begin(),
+                                               functionCallNode);
+        }
+    }
+}
+
+}  // namespace
+
+void DeferGlobalInitializers(TIntermNode *root)
+{
+    DeferGlobalInitializersTraverser traverser;
+    root-&gt;traverse(&amp;traverser);
+
+    // Replace the initializers of the global variables.
+    traverser.updateTree();
+
+    // Add the function with initialization and the call to that.
+    traverser.insertInitFunction(root);
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorDeferGlobalInitializersh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DeferGlobalInitializers.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+//
+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// DeferGlobalInitializers is an AST traverser that moves global initializers into a function, and
+// adds a function call to that function in the beginning of main().
+// This enables initialization of globals with uniforms or non-constant globals, as allowed by
+// the WebGL spec. Some initializers referencing non-constants may need to be unfolded into if
+// statements in HLSL - this kind of steps should be done after DeferGlobalInitializers is run.
+//
+
+#ifndef COMPILER_TRANSLATOR_DEFERGLOBALINITIALIZERS_H_
+#define COMPILER_TRANSLATOR_DEFERGLOBALINITIALIZERS_H_
+
+class TIntermNode;
+
+void DeferGlobalInitializers(TIntermNode *root);
+
+#endif  // COMPILER_TRANSLATOR_DEFERGLOBALINITIALIZERS_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorDiagnosticsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Diagnostics.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     TDiagnostics(TInfoSink&amp; infoSink);
</span><del>-    virtual ~TDiagnostics();
</del><ins>+    ~TDiagnostics() override;
</ins><span class="cx"> 
</span><span class="cx">     TInfoSink&amp; infoSink() { return mInfoSink; }
</span><span class="cx"> 
</span><span class="lines">@@ -30,9 +30,7 @@
</span><span class="cx">                    const std::string&amp; extra);
</span><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    virtual void print(ID id,
-                       const pp::SourceLocation&amp; loc,
-                       const std::string&amp; text);
</del><ins>+    void print(ID id, const pp::SourceLocation &amp;loc, const std::string &amp;text) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     TInfoSink&amp; mInfoSink;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorDirectiveHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,6 +8,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;sstream&gt;
</span><span class="cx"> 
</span><ins>+#include &quot;angle_gl.h&quot;
</ins><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/Diagnostics.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -25,13 +26,15 @@
</span><span class="cx">     return EBhUndefined;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TDirectiveHandler::TDirectiveHandler(TExtensionBehavior&amp; extBehavior,
-                                     TDiagnostics&amp; diagnostics,
-                                     int&amp; shaderVersion,
</del><ins>+TDirectiveHandler::TDirectiveHandler(TExtensionBehavior &amp;extBehavior,
+                                     TDiagnostics &amp;diagnostics,
+                                     int &amp;shaderVersion,
+                                     sh::GLenum shaderType,
</ins><span class="cx">                                      bool debugShaderPrecisionSupported)
</span><span class="cx">     : mExtensionBehavior(extBehavior),
</span><span class="cx">       mDiagnostics(diagnostics),
</span><span class="cx">       mShaderVersion(shaderVersion),
</span><ins>+      mShaderType(shaderType),
</ins><span class="cx">       mDebugShaderPrecisionSupported(debugShaderPrecisionSupported)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -57,7 +60,16 @@
</span><span class="cx">         const char kAll[] = &quot;all&quot;;
</span><span class="cx"> 
</span><span class="cx">         if (name == kInvariant &amp;&amp; value == kAll)
</span><ins>+        {
+            if (mShaderVersion == 300 &amp;&amp; mShaderType == GL_FRAGMENT_SHADER)
+            {
+                // ESSL 3.00.4 section 4.6.1
+                mDiagnostics.writeInfo(
+                    pp::Diagnostics::PP_ERROR, loc,
+                    &quot;#pragma STDGL invariant(all) can not be used in fragment shader&quot;, name, value);
+            }
</ins><span class="cx">             mPragma.stdgl.invariantAll = true;
</span><ins>+        }
</ins><span class="cx">         // The STDGL pragma is used to reserve pragmas for use by future
</span><span class="cx">         // revisions of GLSL.  Do not generate an error on unexpected
</span><span class="cx">         // name and value.
</span><span class="lines">@@ -98,8 +110,9 @@
</span><span class="cx"> 
</span><span class="cx">         if (invalidValue)
</span><span class="cx">         {
</span><del>-            mDiagnostics.report(pp::Diagnostics::PP_INVALID_PRAGMA_VALUE, loc, value);
-            return;
</del><ins>+            mDiagnostics.writeInfo(pp::Diagnostics::PP_ERROR, loc,
+                                   &quot;invalid pragma value&quot;, value,
+                                   &quot;'on' or 'off' expected&quot;);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorDirectiveHandlerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,41 +11,42 @@
</span><span class="cx"> #include &quot;compiler/translator/ExtensionBehavior.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/Pragma.h&quot;
</span><span class="cx"> #include &quot;compiler/preprocessor/DirectiveHandlerBase.h&quot;
</span><ins>+#include &quot;GLSLANG/ShaderLang.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> class TDiagnostics;
</span><span class="cx"> 
</span><span class="cx"> class TDirectiveHandler : public pp::DirectiveHandler, angle::NonCopyable
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    TDirectiveHandler(TExtensionBehavior&amp; extBehavior,
-                      TDiagnostics&amp; diagnostics,
-                      int&amp; shaderVersion,
</del><ins>+    TDirectiveHandler(TExtensionBehavior &amp;extBehavior,
+                      TDiagnostics &amp;diagnostics,
+                      int &amp;shaderVersion,
+                      sh::GLenum shaderType,
</ins><span class="cx">                       bool debugShaderPrecisionSupported);
</span><del>-    virtual ~TDirectiveHandler();
</del><ins>+    ~TDirectiveHandler() override;
</ins><span class="cx"> 
</span><span class="cx">     const TPragma&amp; pragma() const { return mPragma; }
</span><span class="cx">     const TExtensionBehavior&amp; extensionBehavior() const { return mExtensionBehavior; }
</span><span class="cx"> 
</span><del>-    virtual void handleError(const pp::SourceLocation&amp; loc,
-                             const std::string&amp; msg);
</del><ins>+    void handleError(const pp::SourceLocation &amp;loc, const std::string &amp;msg) override;
</ins><span class="cx"> 
</span><del>-    virtual void handlePragma(const pp::SourceLocation&amp; loc,
-                              const std::string&amp; name,
-                              const std::string&amp; value,
-                              bool stdgl);
</del><ins>+    void handlePragma(const pp::SourceLocation &amp;loc,
+                      const std::string &amp;name,
+                      const std::string &amp;value,
+                      bool stdgl) override;
</ins><span class="cx"> 
</span><del>-    virtual void handleExtension(const pp::SourceLocation&amp; loc,
-                                 const std::string&amp; name,
-                                 const std::string&amp; behavior);
</del><ins>+    void handleExtension(const pp::SourceLocation &amp;loc,
+                         const std::string &amp;name,
+                         const std::string &amp;behavior) override;
</ins><span class="cx"> 
</span><del>-    virtual void handleVersion(const pp::SourceLocation&amp; loc,
-                               int version);
</del><ins>+    void handleVersion(const pp::SourceLocation &amp;loc, int version) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     TPragma mPragma;
</span><span class="cx">     TExtensionBehavior&amp; mExtensionBehavior;
</span><span class="cx">     TDiagnostics&amp; mDiagnostics;
</span><span class="cx">     int&amp; mShaderVersion;
</span><ins>+    sh::GLenum mShaderType;
</ins><span class="cx">     bool mDebugShaderPrecisionSupported;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorEmulatePrecisioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -179,11 +179,50 @@
</span><span class="cx">       case 1:
</span><span class="cx">         return &quot;float&quot;;
</span><span class="cx">       case 2:
</span><del>-        return type.getSecondarySize() &gt; 1 ? &quot;mat2&quot; : &quot;vec2&quot;;
</del><ins>+        switch(type.getSecondarySize())
+        {
+          case 1:
+            return &quot;vec2&quot;;
+          case 2:
+            return &quot;mat2&quot;;
+          case 3:
+            return &quot;mat2x3&quot;;
+          case 4:
+            return &quot;mat2x4&quot;;
+          default:
+            UNREACHABLE();
+            return NULL;
+        }
</ins><span class="cx">       case 3:
</span><del>-        return type.getSecondarySize() &gt; 1 ? &quot;mat3&quot; : &quot;vec3&quot;;
</del><ins>+        switch(type.getSecondarySize())
+        {
+          case 1:
+            return &quot;vec3&quot;;
+          case 2:
+            return &quot;mat3x2&quot;;
+          case 3:
+            return &quot;mat3&quot;;
+          case 4:
+            return &quot;mat3x4&quot;;
+          default:
+            UNREACHABLE();
+            return NULL;
+        }
</ins><span class="cx">       case 4:
</span><del>-        return type.getSecondarySize() &gt; 1 ? &quot;mat4&quot; : &quot;vec4&quot;;
</del><ins>+        switch(type.getSecondarySize())
+        {
+          case 1:
+            return &quot;vec4&quot;;
+          case 2:
+            return &quot;mat4x2&quot;;
+          case 3:
+            return &quot;mat4x3&quot;;
+          case 4:
+            return &quot;mat4&quot;;
+          default:
+            UNREACHABLE();
+            return NULL;
+        }
</ins><span class="cx">       default:
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">         return NULL;
</span><span class="lines">@@ -199,8 +238,10 @@
</span><span class="cx"> TIntermAggregate *createInternalFunctionCallNode(TString name, TIntermNode *child)
</span><span class="cx"> {
</span><span class="cx">     TIntermAggregate *callNode = new TIntermAggregate();
</span><del>-    callNode-&gt;setOp(EOpInternalFunctionCall);
-    callNode-&gt;setName(name);
</del><ins>+    callNode-&gt;setOp(EOpFunctionCall);
+    TName nameObj(TFunction::mangleName(name));
+    nameObj.setInternal(true);
+    callNode-&gt;setNameObj(nameObj);
</ins><span class="cx">     callNode-&gt;getSequence()-&gt;push_back(child);
</span><span class="cx">     return callNode;
</span><span class="cx"> }
</span><span class="lines">@@ -252,17 +293,14 @@
</span><span class="cx"> 
</span><span class="cx"> }  // namespace anonymous
</span><span class="cx"> 
</span><del>-EmulatePrecision::EmulatePrecision()
-    : TIntermTraverser(true, true, true),
-      mDeclaringVariables(false),
-      mInLValue(false),
-      mInFunctionCallOutParameter(false)
</del><ins>+EmulatePrecision::EmulatePrecision(const TSymbolTable &amp;symbolTable, int shaderVersion)
+    : TLValueTrackingTraverser(true, true, true, symbolTable, shaderVersion),
+      mDeclaringVariables(false)
</ins><span class="cx"> {}
</span><span class="cx"> 
</span><span class="cx"> void EmulatePrecision::visitSymbol(TIntermSymbol *node)
</span><span class="cx"> {
</span><del>-    if (canRoundFloat(node-&gt;getType()) &amp;&amp;
-        !mDeclaringVariables &amp;&amp; !mInLValue &amp;&amp; !mInFunctionCallOutParameter)
</del><ins>+    if (canRoundFloat(node-&gt;getType()) &amp;&amp; !mDeclaringVariables &amp;&amp; !isLValueRequiredHere())
</ins><span class="cx">     {
</span><span class="cx">         TIntermNode *parent = getParentNode();
</span><span class="cx">         TIntermNode *replacement = createRoundingFunctionCallNode(node);
</span><span class="lines">@@ -275,14 +313,6 @@
</span><span class="cx"> {
</span><span class="cx">     bool visitChildren = true;
</span><span class="cx"> 
</span><del>-    if (node-&gt;isAssignment())
-    {
-        if (visit == PreVisit)
-            mInLValue = true;
-        else if (visit == InVisit)
-            mInLValue = false;
-    }
-
</del><span class="cx">     TOperator op = node-&gt;getOp();
</span><span class="cx"> 
</span><span class="cx">     // RHS of initialize is not being declared.
</span><span class="lines">@@ -376,22 +406,9 @@
</span><span class="cx">     {
</span><span class="cx">       case EOpSequence:
</span><span class="cx">       case EOpConstructStruct:
</span><del>-        // No special handling
-        break;
</del><span class="cx">       case EOpFunction:
</span><del>-        if (visit == PreVisit)
-        {
-            const TIntermSequence &amp;sequence = *(node-&gt;getSequence());
-            TIntermSequence::const_iterator seqIter = sequence.begin();
-            TIntermAggregate *params = (*seqIter)-&gt;getAsAggregate();
-            ASSERT(params != NULL);
-            ASSERT(params-&gt;getOp() == EOpParameters);
-            mFunctionMap[node-&gt;getName()] = params-&gt;getSequence();
-        }
</del><span class="cx">         break;
</span><span class="cx">       case EOpPrototype:
</span><del>-        if (visit == PreVisit)
-            mFunctionMap[node-&gt;getName()] = node-&gt;getSequence();
</del><span class="cx">         visitChildren = false;
</span><span class="cx">         break;
</span><span class="cx">       case EOpParameters:
</span><span class="lines">@@ -418,51 +435,18 @@
</span><span class="cx">       case EOpFunctionCall:
</span><span class="cx">       {
</span><span class="cx">         // Function call.
</span><del>-        bool inFunctionMap = (mFunctionMap.find(node-&gt;getName()) != mFunctionMap.end());
</del><span class="cx">         if (visit == PreVisit)
</span><span class="cx">         {
</span><span class="cx">             // User-defined function return values are not rounded, this relies on that
</span><span class="cx">             // calculations producing the value were rounded.
</span><span class="cx">             TIntermNode *parent = getParentNode();
</span><del>-            if (canRoundFloat(node-&gt;getType()) &amp;&amp; !inFunctionMap &amp;&amp; parentUsesResult(parent, node))
</del><ins>+            if (canRoundFloat(node-&gt;getType()) &amp;&amp; !isInFunctionMap(node) &amp;&amp;
+                parentUsesResult(parent, node))
</ins><span class="cx">             {
</span><span class="cx">                 TIntermNode *replacement = createRoundingFunctionCallNode(node);
</span><span class="cx">                 mReplacements.push_back(NodeUpdateEntry(parent, node, replacement, true));
</span><span class="cx">             }
</span><del>-
-            if (inFunctionMap)
-            {
-                mSeqIterStack.push_back(mFunctionMap[node-&gt;getName()]-&gt;begin());
-                if (mSeqIterStack.back() != mFunctionMap[node-&gt;getName()]-&gt;end())
-                {
-                    TQualifier qualifier = (*mSeqIterStack.back())-&gt;getAsTyped()-&gt;getQualifier();
-                    mInFunctionCallOutParameter = (qualifier == EvqOut || qualifier == EvqInOut);
-                }
-            }
-            else
-            {
-                // The function is not user-defined - it is likely built-in texture function.
-                // Assume that those do not have out parameters.
-                mInFunctionCallOutParameter = false;
-            }
</del><span class="cx">         }
</span><del>-        else if (visit == InVisit)
-        {
-            if (inFunctionMap)
-            {
-                ++mSeqIterStack.back();
-                TQualifier qualifier = (*mSeqIterStack.back())-&gt;getAsTyped()-&gt;getQualifier();
-                mInFunctionCallOutParameter = (qualifier == EvqOut || qualifier == EvqInOut);
-            }
-        }
-        else
-        {
-            if (inFunctionMap)
-            {
-                mSeqIterStack.pop_back();
-                mInFunctionCallOutParameter = false;
-            }
-        }
</del><span class="cx">         break;
</span><span class="cx">       }
</span><span class="cx">       default:
</span><span class="lines">@@ -484,15 +468,10 @@
</span><span class="cx">       case EOpNegative:
</span><span class="cx">       case EOpVectorLogicalNot:
</span><span class="cx">       case EOpLogicalNot:
</span><del>-        break;
</del><span class="cx">       case EOpPostIncrement:
</span><span class="cx">       case EOpPostDecrement:
</span><span class="cx">       case EOpPreIncrement:
</span><span class="cx">       case EOpPreDecrement:
</span><del>-        if (visit == PreVisit)
-            mInLValue = true;
-        else if (visit == PostVisit)
-            mInLValue = false;
</del><span class="cx">         break;
</span><span class="cx">       default:
</span><span class="cx">         if (canRoundFloat(node-&gt;getType()) &amp;&amp; visit == PreVisit)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorEmulatePrecisionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/EmulatePrecision.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,15 +18,15 @@
</span><span class="cx"> // need to write a huge number of variations of the emulated compound assignment
</span><span class="cx"> // to every translated shader with emulation enabled.
</span><span class="cx"> 
</span><del>-class EmulatePrecision : public TIntermTraverser
</del><ins>+class EmulatePrecision : public TLValueTrackingTraverser
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    EmulatePrecision();
</del><ins>+    EmulatePrecision(const TSymbolTable &amp;symbolTable, int shaderVersion);
</ins><span class="cx"> 
</span><del>-    virtual void visitSymbol(TIntermSymbol *node);
-    virtual bool visitBinary(Visit visit, TIntermBinary *node);
-    virtual bool visitUnary(Visit visit, TIntermUnary *node);
-    virtual bool visitAggregate(Visit visit, TIntermAggregate *node);
</del><ins>+    void visitSymbol(TIntermSymbol *node) override;
+    bool visitBinary(Visit visit, TIntermBinary *node) override;
+    bool visitUnary(Visit visit, TIntermUnary *node) override;
+    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
</ins><span class="cx"> 
</span><span class="cx">     void writeEmulationHelpers(TInfoSinkBase&amp; sink, ShShaderOutput outputLanguage);
</span><span class="cx"> 
</span><span class="lines">@@ -56,20 +56,7 @@
</span><span class="cx">     EmulationSet mEmulateCompoundMul;
</span><span class="cx">     EmulationSet mEmulateCompoundDiv;
</span><span class="cx"> 
</span><del>-    // Stack of function call parameter iterators
-    std::vector&lt;TIntermSequence::const_iterator&gt; mSeqIterStack;
-
</del><span class="cx">     bool mDeclaringVariables;
</span><del>-    bool mInLValue;
-    bool mInFunctionCallOutParameter;
-
-    struct TStringComparator
-    {
-        bool operator() (const TString&amp; a, const TString&amp; b) const { return a.compare(b) &lt; 0; }
-    };
-
-    // Map from function names to their parameter sequences
-    std::map&lt;TString, TIntermSequence*, TStringComparator&gt; mFunctionMap;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #endif  // COMPILER_TRANSLATOR_EMULATE_PRECISION_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorExtensionBehaviorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -34,4 +34,10 @@
</span><span class="cx"> // Mapping between extension name and behavior.
</span><span class="cx"> typedef std::map&lt;std::string, TBehavior&gt; TExtensionBehavior;
</span><span class="cx"> 
</span><ins>+inline bool IsExtensionEnabled(const TExtensionBehavior &amp;extBehavior, const char *extension)
+{
+    auto iter = extBehavior.find(extension);
+    return iter != extBehavior.end() &amp;&amp; (iter-&gt;second == EBhEnable || iter-&gt;second == EBhRequire);
+}
+
</ins><span class="cx"> #endif // COMPILER_TRANSLATOR_EXTENSIONBEHAVIOR_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorExtensionGLSLcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,100 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// ExtensionGLSL.cpp: Implements the TExtensionGLSL class that tracks GLSL extension requirements
+// of shaders.
+
+#include &quot;compiler/translator/ExtensionGLSL.h&quot;
+
+#include &quot;compiler/translator/VersionGLSL.h&quot;
+
+TExtensionGLSL::TExtensionGLSL(ShShaderOutput output)
+    : TIntermTraverser(true, false, false), mTargetVersion(ShaderOutputTypeToGLSLVersion(output))
+{
+}
+
+const std::set&lt;std::string&gt; &amp;TExtensionGLSL::getEnabledExtensions() const
+{
+    return mEnabledExtensions;
+}
+
+const std::set&lt;std::string&gt; &amp;TExtensionGLSL::getRequiredExtensions() const
+{
+    return mRequiredExtensions;
+}
+
+bool TExtensionGLSL::visitUnary(Visit, TIntermUnary *node)
+{
+    checkOperator(node);
+
+    return true;
+}
+
+bool TExtensionGLSL::visitAggregate(Visit, TIntermAggregate *node)
+{
+    checkOperator(node);
+
+    return true;
+}
+
+void TExtensionGLSL::checkOperator(TIntermOperator *node)
+{
+    if (mTargetVersion &lt; GLSL_VERSION_130)
+    {
+        return;
+    }
+
+    switch (node-&gt;getOp())
+    {
+        case EOpAbs:
+            break;
+
+        case EOpSign:
+            break;
+
+        case EOpMix:
+            break;
+
+        case EOpFloatBitsToInt:
+        case EOpFloatBitsToUint:
+        case EOpIntBitsToFloat:
+        case EOpUintBitsToFloat:
+            if (mTargetVersion &lt; GLSL_VERSION_330)
+            {
+                // Bit conversion functions cannot be emulated.
+                mRequiredExtensions.insert(&quot;GL_ARB_shader_bit_encoding&quot;);
+            }
+            break;
+
+        case EOpPackSnorm2x16:
+        case EOpPackHalf2x16:
+        case EOpUnpackSnorm2x16:
+        case EOpUnpackHalf2x16:
+            if (mTargetVersion &lt; GLSL_VERSION_420)
+            {
+                mEnabledExtensions.insert(&quot;GL_ARB_shading_language_packing&quot;);
+
+                if (mTargetVersion &lt; GLSL_VERSION_330)
+                {
+                    // floatBitsToUint and uintBitsToFloat are needed to emulate
+                    // packHalf2x16 and unpackHalf2x16 respectively and cannot be
+                    // emulated themselves.
+                    mRequiredExtensions.insert(&quot;GL_ARB_shader_bit_encoding&quot;);
+                }
+            }
+            break;
+
+        case EOpPackUnorm2x16:
+        case EOpUnpackUnorm2x16:
+            if (mTargetVersion &lt; GLSL_VERSION_410)
+            {
+                mEnabledExtensions.insert(&quot;GL_ARB_shading_language_packing&quot;);
+            }
+            break;
+
+        default:
+            break;
+    }
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorExtensionGLSLh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionGLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,39 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// ExtensionGLSL.h: Defines the TExtensionGLSL class that tracks GLSL extension requirements of
+// shaders.
+
+#ifndef COMPILER_TRANSLATOR_EXTENSIONGLSL_H_
+#define COMPILER_TRANSLATOR_EXTENSIONGLSL_H_
+
+#include &lt;set&gt;
+#include &lt;string&gt;
+
+#include &quot;compiler/translator/IntermNode.h&quot;
+
+// Traverses the intermediate tree to determine which GLSL extensions are required
+// to support the shader.
+class TExtensionGLSL : public TIntermTraverser
+{
+  public:
+    TExtensionGLSL(ShShaderOutput output);
+
+    const std::set&lt;std::string&gt; &amp;getEnabledExtensions() const;
+    const std::set&lt;std::string&gt; &amp;getRequiredExtensions() const;
+
+    bool visitUnary(Visit visit, TIntermUnary *node) override;
+    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
+
+  private:
+    void checkOperator(TIntermOperator *node);
+
+    int mTargetVersion;
+
+    std::set&lt;std::string&gt; mEnabledExtensions;
+    std::set&lt;std::string&gt; mRequiredExtensions;
+};
+
+#endif  // COMPILER_TRANSLATOR_EXTENSIONGLSL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorFlagStd140Structsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/FlagStd140Structs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,11 +18,17 @@
</span><span class="cx"> class FlagStd140Structs : public TIntermTraverser
</span><span class="cx"> {
</span><span class="cx">   public:
</span><ins>+
+    FlagStd140Structs()
+        : TIntermTraverser(true, false, false)
+    {
+    }
+
</ins><span class="cx">     const std::vector&lt;TIntermTyped *&gt; getFlaggedNodes() const { return mFlaggedNodes; }
</span><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    virtual bool visitBinary(Visit visit, TIntermBinary *binaryNode);
-    virtual void visitSymbol(TIntermSymbol *symbol);
</del><ins>+    bool visitBinary(Visit visit, TIntermBinary *binaryNode) override;
+    void visitSymbol(TIntermSymbol *symbol) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     bool isInStd140InterfaceBlock(TIntermTyped *node) const;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorForLoopUnrollcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ForLoopUnroll.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ForLoopUnroll.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ForLoopUnroll.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,6 +6,9 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/ForLoopUnroll.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;compiler/translator/ValidateLimitations.h&quot;
+#include &quot;angle_gl.h&quot;
+
</ins><span class="cx"> bool ForLoopUnrollMarker::visitBinary(Visit, TIntermBinary *node)
</span><span class="cx"> {
</span><span class="cx">     if (mUnrollCondition != kSamplerArrayIndex)
</span><span class="lines">@@ -38,11 +41,16 @@
</span><span class="cx"> 
</span><span class="cx"> bool ForLoopUnrollMarker::visitLoop(Visit, TIntermLoop *node)
</span><span class="cx"> {
</span><del>-    if (mUnrollCondition == kIntegerIndex)
</del><ins>+    bool canBeUnrolled = mHasRunLoopValidation;
+    if (!mHasRunLoopValidation)
</ins><span class="cx">     {
</span><ins>+        canBeUnrolled = ValidateLimitations::IsLimitedForLoop(node);
+    }
+    if (mUnrollCondition == kIntegerIndex &amp;&amp; canBeUnrolled)
+    {
</ins><span class="cx">         // Check if loop index type is integer.
</span><del>-        // This is called after ValidateLimitations pass, so all the calls
-        // should be valid. See ValidateLimitations::validateForLoopInit().
</del><ins>+        // This is called after ValidateLimitations pass, so the loop has the limited form specified
+        // in ESSL 1.00 appendix A.
</ins><span class="cx">         TIntermSequence *declSeq = node-&gt;getInit()-&gt;getAsAggregate()-&gt;getSequence();
</span><span class="cx">         TIntermSymbol *symbol = (*declSeq)[0]-&gt;getAsBinaryNode()-&gt;getLeft()-&gt;getAsSymbolNode();
</span><span class="cx">         if (symbol-&gt;getBasicType() == EbtInt)
</span><span class="lines">@@ -50,11 +58,18 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     TIntermNode *body = node-&gt;getBody();
</span><del>-    if (body != NULL)
</del><ins>+    if (body != nullptr)
</ins><span class="cx">     {
</span><del>-        mLoopStack.push(node);
-        body-&gt;traverse(this);
-        mLoopStack.pop();
</del><ins>+        if (canBeUnrolled)
+        {
+            mLoopStack.push(node);
+            body-&gt;traverse(this);
+            mLoopStack.pop();
+        }
+        else
+        {
+            body-&gt;traverse(this);
+        }
</ins><span class="cx">     }
</span><span class="cx">     // The loop is fully processed - no need to visit children.
</span><span class="cx">     return false;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorForLoopUnrollh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ForLoopUnroll.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ForLoopUnroll.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ForLoopUnroll.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -24,16 +24,18 @@
</span><span class="cx">         kSamplerArrayIndex
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    ForLoopUnrollMarker(UnrollCondition condition)
-        : mUnrollCondition(condition),
</del><ins>+    ForLoopUnrollMarker(UnrollCondition condition, bool hasRunLoopValidation)
+        : TIntermTraverser(true, false, false),
+          mUnrollCondition(condition),
</ins><span class="cx">           mSamplerArrayIndexIsFloatLoopIndex(false),
</span><del>-          mVisitSamplerArrayIndexNodeInsideLoop(false)
</del><ins>+          mVisitSamplerArrayIndexNodeInsideLoop(false),
+          mHasRunLoopValidation(hasRunLoopValidation)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual bool visitBinary(Visit, TIntermBinary *node);
-    virtual bool visitLoop(Visit, TIntermLoop *node);
-    virtual void visitSymbol(TIntermSymbol *node);
</del><ins>+    bool visitBinary(Visit, TIntermBinary *node) override;
+    bool visitLoop(Visit, TIntermLoop *node) override;
+    void visitSymbol(TIntermSymbol *node) override;
</ins><span class="cx"> 
</span><span class="cx">     bool samplerArrayIndexIsFloatLoopIndex() const
</span><span class="cx">     {
</span><span class="lines">@@ -45,6 +47,7 @@
</span><span class="cx">     TLoopStack mLoopStack;
</span><span class="cx">     bool mSamplerArrayIndexIsFloatLoopIndex;
</span><span class="cx">     bool mVisitSamplerArrayIndexNodeInsideLoop;
</span><ins>+    bool mHasRunLoopValidation;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #endif // COMPILER_TRANSLATOR_FORLOOPUNROLL_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorInfoSinkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx">             sink.append(&quot;NOTE: &quot;);
</span><span class="cx">             break;
</span><span class="cx">         default:
</span><del>-            sink.append(&quot;UNKNOWN ERROR: &quot;);
</del><ins>+            sink.append(&quot;UNKOWN ERROR: &quot;);
</ins><span class="cx">             break;
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorInitializecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,25 +11,26 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/Initialize.h&quot;
</span><ins>+#include &quot;compiler/translator/Cache.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/IntermNode.h&quot;
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInResources &amp;resources, TSymbolTable &amp;symbolTable)
</span><span class="cx"> {
</span><del>-    TType *float1 = new TType(EbtFloat);
-    TType *float2 = new TType(EbtFloat, 2);
-    TType *float3 = new TType(EbtFloat, 3);
-    TType *float4 = new TType(EbtFloat, 4);
-    TType *int1 = new TType(EbtInt);
-    TType *int2 = new TType(EbtInt, 2);
-    TType *int3 = new TType(EbtInt, 3);
-    TType *uint1 = new TType(EbtUInt);
-    TType *bool1 = new TType(EbtBool);
-    TType *genType = new TType(EbtGenType);
-    TType *genIType = new TType(EbtGenIType);
-    TType *genUType = new TType(EbtGenUType);
-    TType *genBType = new TType(EbtGenBType);
</del><ins>+    const TType *float1 = TCache::getType(EbtFloat);
+    const TType *float2 = TCache::getType(EbtFloat, 2);
+    const TType *float3 = TCache::getType(EbtFloat, 3);
+    const TType *float4 = TCache::getType(EbtFloat, 4);
+    const TType *int1 = TCache::getType(EbtInt);
+    const TType *int2 = TCache::getType(EbtInt, 2);
+    const TType *int3 = TCache::getType(EbtInt, 3);
+    const TType *uint1 = TCache::getType(EbtUInt);
+    const TType *bool1 = TCache::getType(EbtBool);
+    const TType *genType = TCache::getType(EbtGenType);
+    const TType *genIType = TCache::getType(EbtGenIType);
+    const TType *genUType = TCache::getType(EbtGenUType);
+    const TType *genBType = TCache::getType(EbtGenBType);
</ins><span class="cx"> 
</span><span class="cx">     //
</span><span class="cx">     // Angle and Trigonometric Functions.
</span><span class="lines">@@ -96,19 +97,16 @@
</span><span class="cx">     symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpClamp, genUType, &quot;clamp&quot;, genUType, genUType, genUType);
</span><span class="cx">     symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMix, genType, &quot;mix&quot;, genType, genType, float1);
</span><span class="cx">     symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpMix, genType, &quot;mix&quot;, genType, genType, genType);
</span><ins>+    symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpMix, genType, &quot;mix&quot;, genType, genType, genBType);
</ins><span class="cx">     symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpStep, genType, &quot;step&quot;, genType, genType);
</span><span class="cx">     symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpStep, genType, &quot;step&quot;, float1, genType);
</span><span class="cx">     symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSmoothStep, genType, &quot;smoothstep&quot;, genType, genType, genType);
</span><span class="cx">     symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpSmoothStep, genType, &quot;smoothstep&quot;, float1, float1, genType);
</span><span class="cx"> 
</span><del>-    TType *outFloat1 = new TType(EbtFloat);
-    TType *outFloat2 = new TType(EbtFloat, 2);
-    TType *outFloat3 = new TType(EbtFloat, 3);
-    TType *outFloat4 = new TType(EbtFloat, 4);
-    outFloat1-&gt;setQualifier(EvqOut);
-    outFloat2-&gt;setQualifier(EvqOut);
-    outFloat3-&gt;setQualifier(EvqOut);
-    outFloat4-&gt;setQualifier(EvqOut);
</del><ins>+    const TType *outFloat1 = TCache::getType(EbtFloat, EvqOut);
+    const TType *outFloat2 = TCache::getType(EbtFloat, EvqOut, 2);
+    const TType *outFloat3 = TCache::getType(EbtFloat, EvqOut, 3);
+    const TType *outFloat4 = TCache::getType(EbtFloat, EvqOut, 4);
</ins><span class="cx"> 
</span><span class="cx">     symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpModf, float1, &quot;modf&quot;, float1, outFloat1);
</span><span class="cx">     symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpModf, float2, &quot;modf&quot;, float2, outFloat2);
</span><span class="lines">@@ -141,15 +139,15 @@
</span><span class="cx">     symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpReflect, genType, &quot;reflect&quot;, genType, genType);
</span><span class="cx">     symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpRefract, genType, &quot;refract&quot;, genType, genType, float1);
</span><span class="cx"> 
</span><del>-    TType *mat2 = new TType(EbtFloat, 2, 2);
-    TType *mat3 = new TType(EbtFloat, 3, 3);
-    TType *mat4 = new TType(EbtFloat, 4, 4);
-    TType *mat2x3 = new TType(EbtFloat, 2, 3);
-    TType *mat3x2 = new TType(EbtFloat, 3, 2);
-    TType *mat2x4 = new TType(EbtFloat, 2, 4);
-    TType *mat4x2 = new TType(EbtFloat, 4, 2);
-    TType *mat3x4 = new TType(EbtFloat, 3, 4);
-    TType *mat4x3 = new TType(EbtFloat, 4, 3);
</del><ins>+    const TType *mat2 = TCache::getType(EbtFloat, 2, 2);
+    const TType *mat3 = TCache::getType(EbtFloat, 3, 3);
+    const TType *mat4 = TCache::getType(EbtFloat, 4, 4);
+    const TType *mat2x3 = TCache::getType(EbtFloat, 2, 3);
+    const TType *mat3x2 = TCache::getType(EbtFloat, 3, 2);
+    const TType *mat2x4 = TCache::getType(EbtFloat, 2, 4);
+    const TType *mat4x2 = TCache::getType(EbtFloat, 4, 2);
+    const TType *mat3x4 = TCache::getType(EbtFloat, 3, 4);
+    const TType *mat4x3 = TCache::getType(EbtFloat, 4, 3);
</ins><span class="cx"> 
</span><span class="cx">     //
</span><span class="cx">     // Matrix Functions.
</span><span class="lines">@@ -192,10 +190,10 @@
</span><span class="cx">     symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpInverse, mat3, &quot;inverse&quot;, mat3);
</span><span class="cx">     symbolTable.insertBuiltIn(ESSL3_BUILTINS, EOpInverse, mat4, &quot;inverse&quot;, mat4);
</span><span class="cx"> 
</span><del>-    TType *vec = new TType(EbtVec);
-    TType *ivec = new TType(EbtIVec);
-    TType *uvec = new TType(EbtUVec);
-    TType *bvec = new TType(EbtBVec);
</del><ins>+    const TType *vec = TCache::getType(EbtVec);
+    const TType *ivec = TCache::getType(EbtIVec);
+    const TType *uvec = TCache::getType(EbtUVec);
+    const TType *bvec = TCache::getType(EbtBVec);
</ins><span class="cx"> 
</span><span class="cx">     //
</span><span class="cx">     // Vector relational functions.
</span><span class="lines">@@ -224,8 +222,8 @@
</span><span class="cx">     symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAll, bool1, &quot;all&quot;, bvec);
</span><span class="cx">     symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpVectorLogicalNot, bvec, &quot;not&quot;, bvec);
</span><span class="cx"> 
</span><del>-    TType *sampler2D = new TType(EbtSampler2D);
-    TType *samplerCube = new TType(EbtSamplerCube);
</del><ins>+    const TType *sampler2D = TCache::getType(EbtSampler2D);
+    const TType *samplerCube = TCache::getType(EbtSamplerCube);
</ins><span class="cx"> 
</span><span class="cx">     //
</span><span class="cx">     // Texture Functions for GLSL ES 1.0
</span><span class="lines">@@ -237,7 +235,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (resources.OES_EGL_image_external)
</span><span class="cx">     {
</span><del>-        TType *samplerExternalOES = new TType(EbtSamplerExternalOES);
</del><ins>+        const TType *samplerExternalOES = TCache::getType(EbtSamplerExternalOES);
</ins><span class="cx"> 
</span><span class="cx">         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, &quot;texture2D&quot;, samplerExternalOES, float2);
</span><span class="cx">         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, &quot;texture2DProj&quot;, samplerExternalOES, float3);
</span><span class="lines">@@ -246,7 +244,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (resources.ARB_texture_rectangle)
</span><span class="cx">     {
</span><del>-        TType *sampler2DRect = new TType(EbtSampler2DRect);
</del><ins>+        const TType *sampler2DRect = TCache::getType(EbtSampler2DRect);
</ins><span class="cx"> 
</span><span class="cx">         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, &quot;texture2DRect&quot;, sampler2DRect, float2);
</span><span class="cx">         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, &quot;texture2DRectProj&quot;, sampler2DRect, float3);
</span><span class="lines">@@ -295,12 +293,12 @@
</span><span class="cx">         symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, &quot;textureCubeLod&quot;, samplerCube, float3, float1);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TType *gvec4 = new TType(EbtGVec4);
</del><ins>+    const TType *gvec4 = TCache::getType(EbtGVec4);
</ins><span class="cx"> 
</span><del>-    TType *gsampler2D = new TType(EbtGSampler2D);
-    TType *gsamplerCube = new TType(EbtGSamplerCube);
-    TType *gsampler3D = new TType(EbtGSampler3D);
-    TType *gsampler2DArray = new TType(EbtGSampler2DArray);
</del><ins>+    const TType *gsampler2D = TCache::getType(EbtGSampler2D);
+    const TType *gsamplerCube = TCache::getType(EbtGSamplerCube);
+    const TType *gsampler3D = TCache::getType(EbtGSampler3D);
+    const TType *gsampler2DArray = TCache::getType(EbtGSampler2DArray);
</ins><span class="cx"> 
</span><span class="cx">     //
</span><span class="cx">     // Texture Functions for GLSL ES 3.0
</span><span class="lines">@@ -328,9 +326,9 @@
</span><span class="cx">         symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, &quot;textureProj&quot;, gsampler3D, float4, float1);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TType *sampler2DShadow = new TType(EbtSampler2DShadow);
-    TType *samplerCubeShadow = new TType(EbtSamplerCubeShadow);
-    TType *sampler2DArrayShadow = new TType(EbtSampler2DArrayShadow);
</del><ins>+    const TType *sampler2DShadow = TCache::getType(EbtSampler2DShadow);
+    const TType *samplerCubeShadow = TCache::getType(EbtSamplerCubeShadow);
+    const TType *sampler2DArrayShadow = TCache::getType(EbtSampler2DArrayShadow);
</ins><span class="cx"> 
</span><span class="cx">     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, &quot;texture&quot;, sampler2DShadow, float3);
</span><span class="cx">     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, &quot;texture&quot;, samplerCubeShadow, float4);
</span><span class="lines">@@ -466,6 +464,12 @@
</span><span class="cx">     if (spec != SH_CSS_SHADERS_SPEC)
</span><span class="cx">     {
</span><span class="cx">         symbolTable.insertConstInt(COMMON_BUILTINS, &quot;gl_MaxDrawBuffers&quot;, resources.MaxDrawBuffers);
</span><ins>+        if (resources.EXT_blend_func_extended)
+        {
+            symbolTable.insertConstIntExt(COMMON_BUILTINS, &quot;GL_EXT_blend_func_extended&quot;,
+                                          &quot;gl_MaxDualSourceDrawBuffersEXT&quot;,
+                                          resources.MaxDualSourceDrawBuffers);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     symbolTable.insertConstInt(ESSL3_BUILTINS, &quot;gl_MaxVertexOutputVectors&quot;, resources.MaxVertexOutputVectors);
</span><span class="lines">@@ -504,12 +508,33 @@
</span><span class="cx">             fragData.setArraySize(resources.MaxDrawBuffers);
</span><span class="cx">             symbolTable.insert(ESSL1_BUILTINS, new TVariable(NewPoolTString(&quot;gl_FragData&quot;), fragData));
</span><span class="cx"> 
</span><ins>+            if (resources.EXT_blend_func_extended)
+            {
+                symbolTable.insert(
+                    ESSL1_BUILTINS, &quot;GL_EXT_blend_func_extended&quot;,
+                    new TVariable(NewPoolTString(&quot;gl_SecondaryFragColorEXT&quot;),
+                                  TType(EbtFloat, EbpMedium, EvqSecondaryFragColorEXT, 4)));
+                TType secondaryFragData(EbtFloat, EbpMedium, EvqSecondaryFragDataEXT, 4, 1, true);
+                secondaryFragData.setArraySize(resources.MaxDualSourceDrawBuffers);
+                symbolTable.insert(
+                    ESSL1_BUILTINS, &quot;GL_EXT_blend_func_extended&quot;,
+                    new TVariable(NewPoolTString(&quot;gl_SecondaryFragDataEXT&quot;), secondaryFragData));
+            }
+
</ins><span class="cx">             if (resources.EXT_frag_depth)
</span><span class="cx">             {
</span><del>-                symbolTable.insert(ESSL1_BUILTINS, &quot;GL_EXT_frag_depth&quot;, new TVariable(NewPoolTString(&quot;gl_FragDepthEXT&quot;),
-                    TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium, EvqFragDepth, 1)));
</del><ins>+                symbolTable.insert(
+                    ESSL1_BUILTINS, &quot;GL_EXT_frag_depth&quot;,
+                    new TVariable(
+                        NewPoolTString(&quot;gl_FragDepthEXT&quot;),
+                        TType(EbtFloat, resources.FragmentPrecisionHigh ? EbpHigh : EbpMedium,
+                              EvqFragDepthEXT, 1)));
</ins><span class="cx">             }
</span><span class="cx"> 
</span><ins>+            symbolTable.insert(ESSL3_BUILTINS,
+                               new TVariable(NewPoolTString(&quot;gl_FragDepth&quot;),
+                                             TType(EbtFloat, EbpHigh, EvqFragDepth, 1)));
+
</ins><span class="cx">             if (resources.EXT_shader_framebuffer_fetch || resources.NV_shader_framebuffer_fetch)
</span><span class="cx">             {
</span><span class="cx">                 TType lastFragData(EbtFloat, EbpMedium, EvqLastFragData, 4, 1, true);
</span><span class="lines">@@ -553,6 +578,8 @@
</span><span class="cx">             TType(EbtFloat, EbpMedium, EvqPointSize, 1)));
</span><span class="cx">         symbolTable.insert(ESSL3_BUILTINS, new TVariable(NewPoolTString(&quot;gl_InstanceID&quot;),
</span><span class="cx">             TType(EbtInt, EbpHigh, EvqInstanceID, 1)));
</span><ins>+        symbolTable.insert(ESSL3_BUILTINS, new TVariable(NewPoolTString(&quot;gl_VertexID&quot;),
+                                                         TType(EbtInt, EbpHigh, EvqVertexID, 1)));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">       default:
</span><span class="lines">@@ -569,6 +596,8 @@
</span><span class="cx">         extBehavior[&quot;GL_OES_EGL_image_external&quot;] = EBhUndefined;
</span><span class="cx">     if (resources.ARB_texture_rectangle)
</span><span class="cx">         extBehavior[&quot;GL_ARB_texture_rectangle&quot;] = EBhUndefined;
</span><ins>+    if (resources.EXT_blend_func_extended)
+        extBehavior[&quot;GL_EXT_blend_func_extended&quot;] = EBhUndefined;
</ins><span class="cx">     if (resources.EXT_draw_buffers)
</span><span class="cx">         extBehavior[&quot;GL_EXT_draw_buffers&quot;] = EBhUndefined;
</span><span class="cx">     if (resources.EXT_frag_depth)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorInitializeDllcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeDll.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeDll.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeDll.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -4,6 +4,7 @@
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><span class="cx"> 
</span><ins>+#include &quot;compiler/translator/Cache.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/InitializeDll.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/InitializeGlobals.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/InitializeParseContext.h&quot;
</span><span class="lines">@@ -24,6 +25,8 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    TCache::initialize();
+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -31,4 +34,5 @@
</span><span class="cx"> {
</span><span class="cx">     FreeParseContextIndex();
</span><span class="cx">     FreePoolIndex();
</span><ins>+    TCache::destroy();
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorInitializeParseContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeParseContext.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeParseContext.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeParseContext.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,7 +10,7 @@
</span><span class="cx"> bool InitializeParseContextIndex();
</span><span class="cx"> void FreeParseContextIndex();
</span><span class="cx"> 
</span><del>-struct TParseContext;
</del><ins>+class TParseContext;
</ins><span class="cx"> extern void SetGlobalParseContext(TParseContext* context);
</span><span class="cx"> extern TParseContext* GetGlobalParseContext();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorInitializeVariablesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeVariables.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeVariables.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/InitializeVariables.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -26,19 +26,20 @@
</span><span class="cx">     typedef TVector&lt;InitVariableInfo&gt; InitVariableInfoList;
</span><span class="cx"> 
</span><span class="cx">     InitializeVariables(const InitVariableInfoList &amp;vars)
</span><del>-        : mCodeInserted(false),
-          mVariables(vars)
</del><ins>+        : TIntermTraverser(true, false, false),
+          mVariables(vars),
+          mCodeInserted(false)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    virtual bool visitBinary(Visit, TIntermBinary *node) { return false; }
-    virtual bool visitUnary(Visit, TIntermUnary *node) { return false; }
-    virtual bool visitSelection(Visit, TIntermSelection *node) { return false; }
-    virtual bool visitLoop(Visit, TIntermLoop *node) { return false; }
-    virtual bool visitBranch(Visit, TIntermBranch *node) { return false; }
</del><ins>+    bool visitBinary(Visit, TIntermBinary *node) override { return false; }
+    bool visitUnary(Visit, TIntermUnary *node) override { return false; }
+    bool visitSelection(Visit, TIntermSelection *node) override { return false; }
+    bool visitLoop(Visit, TIntermLoop *node) override { return false; }
+    bool visitBranch(Visit, TIntermBranch *node) override { return false; }
</ins><span class="cx"> 
</span><del>-    virtual bool visitAggregate(Visit visit, TIntermAggregate* node);
</del><ins>+    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     void insertInitCode(TIntermSequence *sequence);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorIntermNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,7 +13,10 @@
</span><span class="cx"> #include &lt;math.h&gt;
</span><span class="cx"> #include &lt;stdlib.h&gt;
</span><span class="cx"> #include &lt;algorithm&gt;
</span><ins>+#include &lt;vector&gt;
</ins><span class="cx"> 
</span><ins>+#include &quot;common/mathutil.h&quot;
+#include &quot;common/matrix_utils.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/HashNames.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/IntermNode.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><span class="lines">@@ -63,73 +66,109 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool CompareStructure(const TType&amp; leftNodeType,
-                      const TConstantUnion *rightUnionArray,
-                      const TConstantUnion *leftUnionArray);
</del><ins>+TConstantUnion *Vectorize(const TConstantUnion &amp;constant, size_t size)
+{
+    TConstantUnion *constUnion = new TConstantUnion[size];
+    for (unsigned int i = 0; i &lt; size; ++i)
+        constUnion[i] = constant;
</ins><span class="cx"> 
</span><del>-bool CompareStruct(const TType &amp;leftNodeType,
-                   const TConstantUnion *rightUnionArray,
-                   const TConstantUnion *leftUnionArray)
</del><ins>+    return constUnion;
+}
+
+void UndefinedConstantFoldingError(const TSourceLoc &amp;loc, TOperator op, TBasicType basicType,
+                                   TInfoSink &amp;infoSink, TConstantUnion *result)
</ins><span class="cx"> {
</span><del>-    const TFieldList &amp;fields = leftNodeType.getStruct()-&gt;fields();
</del><ins>+    std::stringstream constantFoldingErrorStream;
+    constantFoldingErrorStream &lt;&lt; &quot;'&quot; &lt;&lt; GetOperatorString(op)
+                               &lt;&lt; &quot;' operation result is undefined for the values passed in&quot;;
+    infoSink.info.message(EPrefixWarning, loc, constantFoldingErrorStream.str().c_str());
</ins><span class="cx"> 
</span><del>-    size_t structSize = fields.size();
-    size_t index = 0;
-
-    for (size_t j = 0; j &lt; structSize; j++)
</del><ins>+    switch (basicType)
</ins><span class="cx">     {
</span><del>-        size_t size = fields[j]-&gt;type()-&gt;getObjectSize();
-        for (size_t i = 0; i &lt; size; i++)
-        {
-            if (fields[j]-&gt;type()-&gt;getBasicType() == EbtStruct)
-            {
-                if (!CompareStructure(*fields[j]-&gt;type(),
-                                      &amp;rightUnionArray[index],
-                                      &amp;leftUnionArray[index]))
-                {
-                    return false;
-                }
-            }
-            else
-            {
-                if (leftUnionArray[index] != rightUnionArray[index])
-                    return false;
-                index++;
-            }
-        }
</del><ins>+      case EbtFloat :
+        result-&gt;setFConst(0.0f);
+        break;
+      case EbtInt:
+        result-&gt;setIConst(0);
+        break;
+      case EbtUInt:
+        result-&gt;setUConst(0u);
+        break;
+      case EbtBool:
+        result-&gt;setBConst(false);
+        break;
+      default:
+        break;
</ins><span class="cx">     }
</span><del>-    return true;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool CompareStructure(const TType &amp;leftNodeType,
-                      const TConstantUnion *rightUnionArray,
-                      const TConstantUnion *leftUnionArray)
</del><ins>+float VectorLength(const TConstantUnion *paramArray, size_t paramArraySize)
</ins><span class="cx"> {
</span><del>-    if (leftNodeType.isArray())
</del><ins>+    float result = 0.0f;
+    for (size_t i = 0; i &lt; paramArraySize; i++)
</ins><span class="cx">     {
</span><del>-        TType typeWithoutArrayness = leftNodeType;
-        typeWithoutArrayness.clearArrayness();
</del><ins>+        float f = paramArray[i].getFConst();
+        result += f * f;
+    }
+    return sqrtf(result);
+}
</ins><span class="cx"> 
</span><del>-        size_t arraySize = leftNodeType.getArraySize();
</del><ins>+float VectorDotProduct(const TConstantUnion *paramArray1,
+                       const TConstantUnion *paramArray2,
+                       size_t paramArraySize)
+{
+    float result = 0.0f;
+    for (size_t i = 0; i &lt; paramArraySize; i++)
+        result += paramArray1[i].getFConst() * paramArray2[i].getFConst();
+    return result;
+}
</ins><span class="cx"> 
</span><del>-        for (size_t i = 0; i &lt; arraySize; ++i)
-        {
-            size_t offset = typeWithoutArrayness.getObjectSize() * i;
-            if (!CompareStruct(typeWithoutArrayness,
-                               &amp;rightUnionArray[offset],
-                               &amp;leftUnionArray[offset]))
-            {
-                return false;
-            }
-        }
-    }
-    else
</del><ins>+TIntermTyped *CreateFoldedNode(TConstantUnion *constArray,
+                               const TIntermTyped *originalNode,
+                               TQualifier qualifier)
+{
+    if (constArray == nullptr)
</ins><span class="cx">     {
</span><del>-        return CompareStruct(leftNodeType, rightUnionArray, leftUnionArray);
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><del>-    return true;
</del><ins>+    TIntermTyped *folded = new TIntermConstantUnion(constArray, originalNode-&gt;getType());
+    folded-&gt;getTypePointer()-&gt;setQualifier(qualifier);
+    folded-&gt;setLine(originalNode-&gt;getLine());
+    return folded;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+angle::Matrix&lt;float&gt; GetMatrix(const TConstantUnion *paramArray,
+                               const unsigned int &amp;rows,
+                               const unsigned int &amp;cols)
+{
+    std::vector&lt;float&gt; elements;
+    for (size_t i = 0; i &lt; rows * cols; i++)
+        elements.push_back(paramArray[i].getFConst());
+    // Transpose is used since the Matrix constructor expects arguments in row-major order,
+    // whereas the paramArray is in column-major order.
+    return angle::Matrix&lt;float&gt;(elements, rows, cols).transpose();
+}
+
+angle::Matrix&lt;float&gt; GetMatrix(const TConstantUnion *paramArray, const unsigned int &amp;size)
+{
+    std::vector&lt;float&gt; elements;
+    for (size_t i = 0; i &lt; size * size; i++)
+        elements.push_back(paramArray[i].getFConst());
+    // Transpose is used since the Matrix constructor expects arguments in row-major order,
+    // whereas the paramArray is in column-major order.
+    return angle::Matrix&lt;float&gt;(elements, size).transpose();
+}
+
+void SetUnionArrayFromMatrix(const angle::Matrix&lt;float&gt; &amp;m, TConstantUnion *resultArray)
+{
+    // Transpose is used since the input Matrix is in row-major order,
+    // whereas the actual result should be in column-major order.
+    angle::Matrix&lt;float&gt; result = m.transpose();
+    std::vector&lt;float&gt; resultElements = result.elements();
+    for (size_t i = 0; i &lt; resultElements.size(); i++)
+        resultArray[i].setFConst(resultElements[i]);
+}
+
</ins><span class="cx"> }  // namespace anonymous
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -159,7 +198,7 @@
</span><span class="cx">     REPLACE_IF_IS(mInit, TIntermNode, original, replacement);
</span><span class="cx">     REPLACE_IF_IS(mCond, TIntermTyped, original, replacement);
</span><span class="cx">     REPLACE_IF_IS(mExpr, TIntermTyped, original, replacement);
</span><del>-    REPLACE_IF_IS(mBody, TIntermNode, original, replacement);
</del><ins>+    REPLACE_IF_IS(mBody, TIntermAggregate, original, replacement);
</ins><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -209,8 +248,33 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool TIntermAggregate::insertChildNodes(TIntermSequence::size_type position, TIntermSequence insertions)
+{
+    if (position &gt; mSequence.size())
+    {
+        return false;
+    }
+    auto it = mSequence.begin() + position;
+    mSequence.insert(it, insertions.begin(), insertions.end());
+    return true;
+}
+
+bool TIntermAggregate::areChildrenConstQualified()
+{
+    for (TIntermNode *&amp;child : mSequence)
+    {
+        TIntermTyped *typed = child-&gt;getAsTyped();
+        if (typed &amp;&amp; typed-&gt;getQualifier() != EvqConst)
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
</ins><span class="cx"> void TIntermAggregate::setPrecisionFromChildren()
</span><span class="cx"> {
</span><ins>+    mGotPrecisionFromChildren = true;
</ins><span class="cx">     if (getBasicType() == EbtBool)
</span><span class="cx">     {
</span><span class="cx">         mType.setPrecision(EbpUndefined);
</span><span class="lines">@@ -249,7 +313,7 @@
</span><span class="cx">     }
</span><span class="cx">     // ESSL 3.0 spec section 8: textureSize always gets highp precision.
</span><span class="cx">     // All other functions that take a sampler are assumed to be texture functions.
</span><del>-    if (mName.find(&quot;textureSize&quot;) == 0)
</del><ins>+    if (mName.getString().find(&quot;textureSize&quot;) == 0)
</ins><span class="cx">         mType.setPrecision(EbpHigh);
</span><span class="cx">     else
</span><span class="cx">         mType.setPrecision(precision);
</span><span class="lines">@@ -279,6 +343,70 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TIntermTyped::TIntermTyped(const TIntermTyped &amp;node) : TIntermNode(), mType(node.mType)
+{
+    // Copy constructor is disallowed for TIntermNode in order to disallow it for subclasses that
+    // don't explicitly allow it, so normal TIntermNode constructor is used to construct the copy.
+    // We need to manually copy any fields of TIntermNode besides handling fields in TIntermTyped.
+    mLine = node.mLine;
+}
+
+TIntermConstantUnion::TIntermConstantUnion(const TIntermConstantUnion &amp;node) : TIntermTyped(node)
+{
+    mUnionArrayPointer = node.mUnionArrayPointer;
+}
+
+TIntermAggregate::TIntermAggregate(const TIntermAggregate &amp;node)
+    : TIntermOperator(node),
+      mName(node.mName),
+      mUserDefined(node.mUserDefined),
+      mFunctionId(node.mFunctionId),
+      mUseEmulatedFunction(node.mUseEmulatedFunction),
+      mGotPrecisionFromChildren(node.mGotPrecisionFromChildren)
+{
+    for (TIntermNode *child : node.mSequence)
+    {
+        TIntermTyped *typedChild = child-&gt;getAsTyped();
+        ASSERT(typedChild != nullptr);
+        TIntermTyped *childCopy = typedChild-&gt;deepCopy();
+        mSequence.push_back(childCopy);
+    }
+}
+
+TIntermBinary::TIntermBinary(const TIntermBinary &amp;node)
+    : TIntermOperator(node), mAddIndexClamp(node.mAddIndexClamp)
+{
+    TIntermTyped *leftCopy  = node.mLeft-&gt;deepCopy();
+    TIntermTyped *rightCopy = node.mRight-&gt;deepCopy();
+    ASSERT(leftCopy != nullptr &amp;&amp; rightCopy != nullptr);
+    mLeft  = leftCopy;
+    mRight = rightCopy;
+}
+
+TIntermUnary::TIntermUnary(const TIntermUnary &amp;node)
+    : TIntermOperator(node), mUseEmulatedFunction(node.mUseEmulatedFunction)
+{
+    TIntermTyped *operandCopy = node.mOperand-&gt;deepCopy();
+    ASSERT(operandCopy != nullptr);
+    mOperand = operandCopy;
+}
+
+TIntermSelection::TIntermSelection(const TIntermSelection &amp;node) : TIntermTyped(node)
+{
+    // Only supported for ternary nodes, not if statements.
+    TIntermTyped *trueTyped  = node.mTrueBlock-&gt;getAsTyped();
+    TIntermTyped *falseTyped = node.mFalseBlock-&gt;getAsTyped();
+    ASSERT(trueTyped != nullptr);
+    ASSERT(falseTyped != nullptr);
+    TIntermTyped *conditionCopy = node.mCondition-&gt;deepCopy();
+    TIntermTyped *trueCopy      = trueTyped-&gt;deepCopy();
+    TIntermTyped *falseCopy = falseTyped-&gt;deepCopy();
+    ASSERT(conditionCopy != nullptr &amp;&amp; trueCopy != nullptr &amp;&amp; falseCopy != nullptr);
+    mCondition  = conditionCopy;
+    mTrueBlock  = trueCopy;
+    mFalseBlock = falseCopy;
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // Say whether or not an operation node changes the value of a variable.
</span><span class="cx"> //
</span><span class="lines">@@ -311,6 +439,22 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool TIntermOperator::isMultiplication() const
+{
+    switch (mOp)
+    {
+      case EOpMul:
+      case EOpMatrixTimesMatrix:
+      case EOpMatrixTimesVector:
+      case EOpMatrixTimesScalar:
+      case EOpVectorTimesMatrix:
+      case EOpVectorTimesScalar:
+        return true;
+      default:
+        return false;
+    }
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // returns true if the operator is for one of the constructors
</span><span class="cx"> //
</span><span class="lines">@@ -322,7 +466,13 @@
</span><span class="cx">       case EOpConstructVec3:
</span><span class="cx">       case EOpConstructVec4:
</span><span class="cx">       case EOpConstructMat2:
</span><ins>+      case EOpConstructMat2x3:
+      case EOpConstructMat2x4:
+      case EOpConstructMat3x2:
</ins><span class="cx">       case EOpConstructMat3:
</span><ins>+      case EOpConstructMat3x4:
+      case EOpConstructMat4x2:
+      case EOpConstructMat4x3:
</ins><span class="cx">       case EOpConstructMat4:
</span><span class="cx">       case EOpConstructFloat:
</span><span class="cx">       case EOpConstructIVec2:
</span><span class="lines">@@ -384,7 +534,10 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mType.setQualifier(EvqTemporary);
</del><ins>+    if (mOperand-&gt;getQualifier() == EvqConst)
+        mType.setQualifier(EvqConst);
+    else
+        mType.setQualifier(EvqTemporary);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -409,10 +562,12 @@
</span><span class="cx">         mLeft-&gt;getPrecision(), mRight-&gt;getPrecision());
</span><span class="cx">     getTypePointer()-&gt;setPrecision(higherPrecision);
</span><span class="cx"> 
</span><ins>+    TQualifier resultQualifier = EvqConst;
</ins><span class="cx">     // Binary operations results in temporary variables unless both
</span><span class="cx">     // operands are const.
</span><span class="cx">     if (mLeft-&gt;getQualifier() != EvqConst || mRight-&gt;getQualifier() != EvqConst)
</span><span class="cx">     {
</span><ins>+        resultQualifier = EvqTemporary;
</ins><span class="cx">         getTypePointer()-&gt;setQualifier(EvqTemporary);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -467,14 +622,15 @@
</span><span class="cx">             if (mLeft-&gt;isVector())
</span><span class="cx">             {
</span><span class="cx">                 mOp = EOpVectorTimesMatrix;
</span><del>-                setType(TType(basicType, higherPrecision, EvqTemporary,
</del><ins>+                setType(TType(basicType, higherPrecision, resultQualifier,
</ins><span class="cx">                               static_cast&lt;unsigned char&gt;(mRight-&gt;getCols()), 1));
</span><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><span class="cx">                 mOp = EOpMatrixTimesScalar;
</span><del>-                setType(TType(basicType, higherPrecision, EvqTemporary,
-                              static_cast&lt;unsigned char&gt;(mRight-&gt;getCols()), static_cast&lt;unsigned char&gt;(mRight-&gt;getRows())));
</del><ins>+                setType(TType(basicType, higherPrecision, resultQualifier,
+                              static_cast&lt;unsigned char&gt;(mRight-&gt;getCols()),
+                              static_cast&lt;unsigned char&gt;(mRight-&gt;getRows())));
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         else if (mLeft-&gt;isMatrix() &amp;&amp; !mRight-&gt;isMatrix())
</span><span class="lines">@@ -482,7 +638,7 @@
</span><span class="cx">             if (mRight-&gt;isVector())
</span><span class="cx">             {
</span><span class="cx">                 mOp = EOpMatrixTimesVector;
</span><del>-                setType(TType(basicType, higherPrecision, EvqTemporary,
</del><ins>+                setType(TType(basicType, higherPrecision, resultQualifier,
</ins><span class="cx">                               static_cast&lt;unsigned char&gt;(mLeft-&gt;getRows()), 1));
</span><span class="cx">             }
</span><span class="cx">             else
</span><span class="lines">@@ -493,8 +649,9 @@
</span><span class="cx">         else if (mLeft-&gt;isMatrix() &amp;&amp; mRight-&gt;isMatrix())
</span><span class="cx">         {
</span><span class="cx">             mOp = EOpMatrixTimesMatrix;
</span><del>-            setType(TType(basicType, higherPrecision, EvqTemporary,
-                          static_cast&lt;unsigned char&gt;(mRight-&gt;getCols()), static_cast&lt;unsigned char&gt;(mLeft-&gt;getRows())));
</del><ins>+            setType(TType(basicType, higherPrecision, resultQualifier,
+                          static_cast&lt;unsigned char&gt;(mRight-&gt;getCols()),
+                          static_cast&lt;unsigned char&gt;(mLeft-&gt;getRows())));
</ins><span class="cx">         }
</span><span class="cx">         else if (!mLeft-&gt;isMatrix() &amp;&amp; !mRight-&gt;isMatrix())
</span><span class="cx">         {
</span><span class="lines">@@ -505,7 +662,7 @@
</span><span class="cx">             else if (mLeft-&gt;isVector() || mRight-&gt;isVector())
</span><span class="cx">             {
</span><span class="cx">                 mOp = EOpVectorTimesScalar;
</span><del>-                setType(TType(basicType, higherPrecision, EvqTemporary,
</del><ins>+                setType(TType(basicType, higherPrecision, resultQualifier,
</ins><span class="cx">                               static_cast&lt;unsigned char&gt;(nominalSize), 1));
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -548,8 +705,9 @@
</span><span class="cx">         else if (mLeft-&gt;isMatrix() &amp;&amp; mRight-&gt;isMatrix())
</span><span class="cx">         {
</span><span class="cx">             mOp = EOpMatrixTimesMatrixAssign;
</span><del>-            setType(TType(basicType, higherPrecision, EvqTemporary,
-                          static_cast&lt;unsigned char&gt;(mRight-&gt;getCols()), static_cast&lt;unsigned char&gt;(mLeft-&gt;getRows())));
</del><ins>+            setType(TType(basicType, higherPrecision, resultQualifier,
+                          static_cast&lt;unsigned char&gt;(mRight-&gt;getCols()),
+                          static_cast&lt;unsigned char&gt;(mLeft-&gt;getRows())));
</ins><span class="cx">         }
</span><span class="cx">         else if (!mLeft-&gt;isMatrix() &amp;&amp; !mRight-&gt;isMatrix())
</span><span class="cx">         {
</span><span class="lines">@@ -562,7 +720,7 @@
</span><span class="cx">                 if (!mLeft-&gt;isVector())
</span><span class="cx">                     return false;
</span><span class="cx">                 mOp = EOpVectorTimesScalarAssign;
</span><del>-                setType(TType(basicType, higherPrecision, EvqTemporary,
</del><ins>+                setType(TType(basicType, higherPrecision, resultQualifier,
</ins><span class="cx">                               static_cast&lt;unsigned char&gt;(mLeft-&gt;getNominalSize()), 1));
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -632,8 +790,9 @@
</span><span class="cx">         {
</span><span class="cx">             const int secondarySize = std::max(
</span><span class="cx">                 mLeft-&gt;getSecondarySize(), mRight-&gt;getSecondarySize());
</span><del>-            setType(TType(basicType, higherPrecision, EvqTemporary,
-                          static_cast&lt;unsigned char&gt;(nominalSize), static_cast&lt;unsigned char&gt;(secondarySize)));
</del><ins>+            setType(TType(basicType, higherPrecision, resultQualifier,
+                          static_cast&lt;unsigned char&gt;(nominalSize),
+                          static_cast&lt;unsigned char&gt;(secondarySize)));
</ins><span class="cx">             if (mLeft-&gt;isArray())
</span><span class="cx">             {
</span><span class="cx">                 ASSERT(mLeft-&gt;getArraySize() == mRight-&gt;getArraySize());
</span><span class="lines">@@ -659,819 +818,1778 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TIntermTyped *TIntermBinary::fold(TInfoSink &amp;infoSink)
+{
+    TIntermConstantUnion *leftConstant = mLeft-&gt;getAsConstantUnion();
+    TIntermConstantUnion *rightConstant = mRight-&gt;getAsConstantUnion();
+    if (leftConstant == nullptr || rightConstant == nullptr)
+    {
+        return nullptr;
+    }
+    TConstantUnion *constArray = leftConstant-&gt;foldBinary(mOp, rightConstant, infoSink);
+
+    // Nodes may be constant folded without being qualified as constant.
+    TQualifier resultQualifier = EvqConst;
+    if (mLeft-&gt;getQualifier() != EvqConst || mRight-&gt;getQualifier() != EvqConst)
+    {
+        resultQualifier = EvqTemporary;
+    }
+    return CreateFoldedNode(constArray, this, resultQualifier);
+}
+
+TIntermTyped *TIntermUnary::fold(TInfoSink &amp;infoSink)
+{
+    TIntermConstantUnion *operandConstant = mOperand-&gt;getAsConstantUnion();
+    if (operandConstant == nullptr)
+    {
+        return nullptr;
+    }
+
+    TConstantUnion *constArray = nullptr;
+    switch (mOp)
+    {
+      case EOpAny:
+      case EOpAll:
+      case EOpLength:
+      case EOpTranspose:
+      case EOpDeterminant:
+      case EOpInverse:
+      case EOpPackSnorm2x16:
+      case EOpUnpackSnorm2x16:
+      case EOpPackUnorm2x16:
+      case EOpUnpackUnorm2x16:
+      case EOpPackHalf2x16:
+      case EOpUnpackHalf2x16:
+        constArray = operandConstant-&gt;foldUnaryWithDifferentReturnType(mOp, infoSink);
+        break;
+      default:
+        constArray = operandConstant-&gt;foldUnaryWithSameReturnType(mOp, infoSink);
+        break;
+    }
+
+    // Nodes may be constant folded without being qualified as constant.
+    TQualifier resultQualifier = mOperand-&gt;getQualifier() == EvqConst ? EvqConst : EvqTemporary;
+    return CreateFoldedNode(constArray, this, resultQualifier);
+}
+
+TIntermTyped *TIntermAggregate::fold(TInfoSink &amp;infoSink)
+{
+    // Make sure that all params are constant before actual constant folding.
+    for (auto *param : *getSequence())
+    {
+        if (param-&gt;getAsConstantUnion() == nullptr)
+        {
+            return nullptr;
+        }
+    }
+    TConstantUnion *constArray = nullptr;
+    if (isConstructor())
+        constArray = TIntermConstantUnion::FoldAggregateConstructor(this, infoSink);
+    else
+        constArray = TIntermConstantUnion::FoldAggregateBuiltIn(this, infoSink);
+
+    // Nodes may be constant folded without being qualified as constant.
+    TQualifier resultQualifier = areChildrenConstQualified() ? EvqConst : EvqTemporary;
+    return CreateFoldedNode(constArray, this, resultQualifier);
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // The fold functions see if an operation on a constant can be done in place,
</span><span class="cx"> // without generating run-time code.
</span><span class="cx"> //
</span><del>-// Returns the node to keep using, which may or may not be the node passed in.
</del><ins>+// Returns the constant value to keep using or nullptr.
</ins><span class="cx"> //
</span><del>-TIntermTyped *TIntermConstantUnion::fold(
-    TOperator op, TIntermConstantUnion *rightNode, TInfoSink &amp;infoSink)
</del><ins>+TConstantUnion *TIntermConstantUnion::foldBinary(TOperator op, TIntermConstantUnion *rightNode, TInfoSink &amp;infoSink)
</ins><span class="cx"> {
</span><del>-    TConstantUnion *unionArray = getUnionArrayPointer();
</del><ins>+    const TConstantUnion *leftArray  = getUnionArrayPointer();
+    const TConstantUnion *rightArray = rightNode-&gt;getUnionArrayPointer();
</ins><span class="cx"> 
</span><del>-    if (!unionArray)
</del><ins>+    if (!leftArray)
</ins><span class="cx">         return nullptr;
</span><ins>+    if (!rightArray)
+        return nullptr;
</ins><span class="cx"> 
</span><span class="cx">     size_t objectSize = getType().getObjectSize();
</span><span class="cx"> 
</span><del>-    if (rightNode)
</del><ins>+    // for a case like float f = vec4(2, 3, 4, 5) + 1.2;
+    if (rightNode-&gt;getType().getObjectSize() == 1 &amp;&amp; objectSize &gt; 1)
</ins><span class="cx">     {
</span><del>-        // binary operations
-        TConstantUnion *rightUnionArray = rightNode-&gt;getUnionArrayPointer();
-        TType returnType = getType();
</del><ins>+        rightArray = Vectorize(*rightNode-&gt;getUnionArrayPointer(), objectSize);
+    }
+    else if (rightNode-&gt;getType().getObjectSize() &gt; 1 &amp;&amp; objectSize == 1)
+    {
+        // for a case like float f = 1.2 + vec4(2, 3, 4, 5);
+        leftArray = Vectorize(*getUnionArrayPointer(), rightNode-&gt;getType().getObjectSize());
+        objectSize = rightNode-&gt;getType().getObjectSize();
+    }
</ins><span class="cx"> 
</span><del>-        if (!rightUnionArray)
-            return nullptr;
</del><ins>+    TConstantUnion *resultArray = nullptr;
</ins><span class="cx"> 
</span><del>-        // for a case like float f = vec4(2, 3, 4, 5) + 1.2;
-        if (rightNode-&gt;getType().getObjectSize() == 1 &amp;&amp; objectSize &gt; 1)
</del><ins>+    switch(op)
+    {
+      case EOpAdd:
+        resultArray = new TConstantUnion[objectSize];
+        for (size_t i = 0; i &lt; objectSize; i++)
+            resultArray[i] = leftArray[i] + rightArray[i];
+        break;
+      case EOpSub:
+        resultArray = new TConstantUnion[objectSize];
+        for (size_t i = 0; i &lt; objectSize; i++)
+            resultArray[i] = leftArray[i] - rightArray[i];
+        break;
+
+      case EOpMul:
+      case EOpVectorTimesScalar:
+      case EOpMatrixTimesScalar:
+        resultArray = new TConstantUnion[objectSize];
+        for (size_t i = 0; i &lt; objectSize; i++)
+            resultArray[i] = leftArray[i] * rightArray[i];
+        break;
+
+      case EOpMatrixTimesMatrix:
</ins><span class="cx">         {
</span><del>-            rightUnionArray = new TConstantUnion[objectSize];
-            for (size_t i = 0; i &lt; objectSize; ++i)
</del><ins>+            if (getType().getBasicType() != EbtFloat ||
+                rightNode-&gt;getBasicType() != EbtFloat)
</ins><span class="cx">             {
</span><del>-                rightUnionArray[i] = *rightNode-&gt;getUnionArrayPointer();
</del><ins>+                infoSink.info.message(
+                    EPrefixInternalError, getLine(),
+                    &quot;Constant Folding cannot be done for matrix multiply&quot;);
+                return nullptr;
</ins><span class="cx">             }
</span><del>-            returnType = getType();
-        }
-        else if (rightNode-&gt;getType().getObjectSize() &gt; 1 &amp;&amp; objectSize == 1)
-        {
-            // for a case like float f = 1.2 + vec4(2, 3, 4, 5);
-            unionArray = new TConstantUnion[rightNode-&gt;getType().getObjectSize()];
-            for (size_t i = 0; i &lt; rightNode-&gt;getType().getObjectSize(); ++i)
-            {
-                unionArray[i] = *getUnionArrayPointer();
-            }
-            returnType = rightNode-&gt;getType();
-            objectSize = rightNode-&gt;getType().getObjectSize();
-        }
</del><span class="cx"> 
</span><del>-        TConstantUnion *tempConstArray = nullptr;
-        TIntermConstantUnion *tempNode;
</del><ins>+            const int leftCols = getCols();
+            const int leftRows = getRows();
+            const int rightCols = rightNode-&gt;getType().getCols();
+            const int rightRows = rightNode-&gt;getType().getRows();
+            const int resultCols = rightCols;
+            const int resultRows = leftRows;
</ins><span class="cx"> 
</span><del>-        bool boolNodeFlag = false;
-        switch(op)
-        {
-          case EOpAdd:
-            tempConstArray = new TConstantUnion[objectSize];
-            for (size_t i = 0; i &lt; objectSize; i++)
-                tempConstArray[i] = unionArray[i] + rightUnionArray[i];
-            break;
-          case EOpSub:
-            tempConstArray = new TConstantUnion[objectSize];
-            for (size_t i = 0; i &lt; objectSize; i++)
-                tempConstArray[i] = unionArray[i] - rightUnionArray[i];
-            break;
-
-          case EOpMul:
-          case EOpVectorTimesScalar:
-          case EOpMatrixTimesScalar:
-            tempConstArray = new TConstantUnion[objectSize];
-            for (size_t i = 0; i &lt; objectSize; i++)
-                tempConstArray[i] = unionArray[i] * rightUnionArray[i];
-            break;
-
-          case EOpMatrixTimesMatrix:
</del><ins>+            resultArray = new TConstantUnion[resultCols * resultRows];
+            for (int row = 0; row &lt; resultRows; row++)
</ins><span class="cx">             {
</span><del>-                if (getType().getBasicType() != EbtFloat ||
-                    rightNode-&gt;getBasicType() != EbtFloat)
</del><ins>+                for (int column = 0; column &lt; resultCols; column++)
</ins><span class="cx">                 {
</span><del>-                    infoSink.info.message(
-                        EPrefixInternalError, getLine(),
-                        &quot;Constant Folding cannot be done for matrix multiply&quot;);
-                    return nullptr;
-                }
-
-                const int leftCols = getCols();
-                const int leftRows = getRows();
-                const int rightCols = rightNode-&gt;getType().getCols();
-                const int rightRows = rightNode-&gt;getType().getRows();
-                const int resultCols = rightCols;
-                const int resultRows = leftRows;
-
-                tempConstArray = new TConstantUnion[resultCols * resultRows];
-                for (int row = 0; row &lt; resultRows; row++)
-                {
-                    for (int column = 0; column &lt; resultCols; column++)
</del><ins>+                    resultArray[resultRows * column + row].setFConst(0.0f);
+                    for (int i = 0; i &lt; leftCols; i++)
</ins><span class="cx">                     {
</span><del>-                        tempConstArray[resultRows * column + row].setFConst(0.0f);
-                        for (int i = 0; i &lt; leftCols; i++)
-                        {
-                            tempConstArray[resultRows * column + row].setFConst(
-                                tempConstArray[resultRows * column + row].getFConst() +
-                                unionArray[i * leftRows + row].getFConst() *
-                                rightUnionArray[column * rightRows + i].getFConst());
-                        }
</del><ins>+                        resultArray[resultRows * column + row].setFConst(
+                            resultArray[resultRows * column + row].getFConst() +
+                            leftArray[i * leftRows + row].getFConst() *
+                            rightArray[column * rightRows + i].getFConst());
</ins><span class="cx">                     }
</span><span class="cx">                 }
</span><del>-
-                // update return type for matrix product
-                returnType.setPrimarySize(static_cast&lt;unsigned char&gt;(resultCols));
-                returnType.setSecondarySize(static_cast&lt;unsigned char&gt;(resultRows));
</del><span class="cx">             }
</span><del>-            break;
</del><ins>+        }
+        break;
</ins><span class="cx"> 
</span><del>-          case EOpDiv:
-          case EOpIMod:
</del><ins>+      case EOpDiv:
+      case EOpIMod:
+        {
+            resultArray = new TConstantUnion[objectSize];
+            for (size_t i = 0; i &lt; objectSize; i++)
</ins><span class="cx">             {
</span><del>-                tempConstArray = new TConstantUnion[objectSize];
-                for (size_t i = 0; i &lt; objectSize; i++)
</del><ins>+                switch (getType().getBasicType())
</ins><span class="cx">                 {
</span><del>-                    switch (getType().getBasicType())
</del><ins>+                  case EbtFloat:
+                    if (rightArray[i] == 0.0f)
</ins><span class="cx">                     {
</span><del>-                      case EbtFloat:
-                        if (rightUnionArray[i] == 0.0f)
-                        {
-                            infoSink.info.message(
-                                EPrefixWarning, getLine(),
-                                &quot;Divide by zero error during constant folding&quot;);
-                            tempConstArray[i].setFConst(
-                                unionArray[i].getFConst() &lt; 0 ? -FLT_MAX : FLT_MAX);
-                        }
-                        else
-                        {
-                            ASSERT(op == EOpDiv);
-                            tempConstArray[i].setFConst(
-                                unionArray[i].getFConst() /
-                                rightUnionArray[i].getFConst());
-                        }
-                        break;
</del><ins>+                        infoSink.info.message(EPrefixWarning, getLine(),
+                                              &quot;Divide by zero error during constant folding&quot;);
+                        resultArray[i].setFConst(leftArray[i].getFConst() &lt; 0 ? -FLT_MAX : FLT_MAX);
+                    }
+                    else
+                    {
+                        ASSERT(op == EOpDiv);
+                        resultArray[i].setFConst(leftArray[i].getFConst() / rightArray[i].getFConst());
+                    }
+                    break;
</ins><span class="cx"> 
</span><del>-                      case EbtInt:
-                        if (rightUnionArray[i] == 0)
</del><ins>+                  case EbtInt:
+                    if (rightArray[i] == 0)
+                    {
+                        infoSink.info.message(EPrefixWarning, getLine(),
+                                              &quot;Divide by zero error during constant folding&quot;);
+                        resultArray[i].setIConst(INT_MAX);
+                    }
+                    else
+                    {
+                        if (op == EOpDiv)
</ins><span class="cx">                         {
</span><del>-                            infoSink.info.message(
-                                EPrefixWarning, getLine(),
-                                &quot;Divide by zero error during constant folding&quot;);
-                            tempConstArray[i].setIConst(INT_MAX);
</del><ins>+                            resultArray[i].setIConst(leftArray[i].getIConst() / rightArray[i].getIConst());
</ins><span class="cx">                         }
</span><span class="cx">                         else
</span><span class="cx">                         {
</span><del>-                            if (op == EOpDiv)
-                            {
-                                tempConstArray[i].setIConst(
-                                    unionArray[i].getIConst() /
-                                    rightUnionArray[i].getIConst());
-                            }
-                            else
-                            {
-                                ASSERT(op == EOpIMod);
-                                tempConstArray[i].setIConst(
-                                    unionArray[i].getIConst() %
-                                    rightUnionArray[i].getIConst());
-                            }
</del><ins>+                            ASSERT(op == EOpIMod);
+                            resultArray[i].setIConst(leftArray[i].getIConst() % rightArray[i].getIConst());
</ins><span class="cx">                         }
</span><del>-                        break;
</del><ins>+                    }
+                    break;
</ins><span class="cx"> 
</span><del>-                      case EbtUInt:
-                        if (rightUnionArray[i] == 0)
</del><ins>+                  case EbtUInt:
+                    if (rightArray[i] == 0)
+                    {
+                        infoSink.info.message(EPrefixWarning, getLine(),
+                                              &quot;Divide by zero error during constant folding&quot;);
+                        resultArray[i].setUConst(UINT_MAX);
+                    }
+                    else
+                    {
+                        if (op == EOpDiv)
</ins><span class="cx">                         {
</span><del>-                            infoSink.info.message(
-                                EPrefixWarning, getLine(),
-                                &quot;Divide by zero error during constant folding&quot;);
-                            tempConstArray[i].setUConst(UINT_MAX);
</del><ins>+                            resultArray[i].setUConst(leftArray[i].getUConst() / rightArray[i].getUConst());
</ins><span class="cx">                         }
</span><span class="cx">                         else
</span><span class="cx">                         {
</span><del>-                            if (op == EOpDiv)
-                            {
-                                tempConstArray[i].setUConst(
-                                    unionArray[i].getUConst() /
-                                    rightUnionArray[i].getUConst());
-                            }
-                            else
-                            {
-                                ASSERT(op == EOpIMod);
-                                tempConstArray[i].setUConst(
-                                    unionArray[i].getUConst() %
-                                    rightUnionArray[i].getUConst());
-                            }
</del><ins>+                            ASSERT(op == EOpIMod);
+                            resultArray[i].setUConst(leftArray[i].getUConst() % rightArray[i].getUConst());
</ins><span class="cx">                         }
</span><del>-                        break;
</del><ins>+                    }
+                    break;
</ins><span class="cx"> 
</span><del>-                      default:
-                        infoSink.info.message(
-                            EPrefixInternalError, getLine(),
-                            &quot;Constant folding cannot be done for \&quot;/\&quot;&quot;);
-                        return nullptr;
-                    }
</del><ins>+                  default:
+                    infoSink.info.message(EPrefixInternalError, getLine(),
+                                          &quot;Constant folding cannot be done for \&quot;/\&quot;&quot;);
+                    return nullptr;
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><del>-            break;
</del><ins>+        }
+        break;
</ins><span class="cx"> 
</span><del>-          case EOpMatrixTimesVector:
</del><ins>+      case EOpMatrixTimesVector:
+        {
+            if (rightNode-&gt;getBasicType() != EbtFloat)
</ins><span class="cx">             {
</span><del>-                if (rightNode-&gt;getBasicType() != EbtFloat)
</del><ins>+                infoSink.info.message(EPrefixInternalError, getLine(),
+                                      &quot;Constant Folding cannot be done for matrix times vector&quot;);
+                return nullptr;
+            }
+
+            const int matrixCols = getCols();
+            const int matrixRows = getRows();
+
+            resultArray = new TConstantUnion[matrixRows];
+
+            for (int matrixRow = 0; matrixRow &lt; matrixRows; matrixRow++)
+            {
+                resultArray[matrixRow].setFConst(0.0f);
+                for (int col = 0; col &lt; matrixCols; col++)
</ins><span class="cx">                 {
</span><del>-                    infoSink.info.message(
-                        EPrefixInternalError, getLine(),
-                        &quot;Constant Folding cannot be done for matrix times vector&quot;);
-                    return nullptr;
</del><ins>+                    resultArray[matrixRow].setFConst(resultArray[matrixRow].getFConst() +
+                                                     leftArray[col * matrixRows + matrixRow].getFConst() *
+                                                     rightArray[col].getFConst());
</ins><span class="cx">                 }
</span><ins>+            }
+        }
+        break;
</ins><span class="cx"> 
</span><del>-                const int matrixCols = getCols();
-                const int matrixRows = getRows();
</del><ins>+      case EOpVectorTimesMatrix:
+        {
+            if (getType().getBasicType() != EbtFloat)
+            {
+                infoSink.info.message(EPrefixInternalError, getLine(),
+                                      &quot;Constant Folding cannot be done for vector times matrix&quot;);
+                return nullptr;
+            }
</ins><span class="cx"> 
</span><del>-                tempConstArray = new TConstantUnion[matrixRows];
</del><ins>+            const int matrixCols = rightNode-&gt;getType().getCols();
+            const int matrixRows = rightNode-&gt;getType().getRows();
</ins><span class="cx"> 
</span><ins>+            resultArray = new TConstantUnion[matrixCols];
+
+            for (int matrixCol = 0; matrixCol &lt; matrixCols; matrixCol++)
+            {
+                resultArray[matrixCol].setFConst(0.0f);
</ins><span class="cx">                 for (int matrixRow = 0; matrixRow &lt; matrixRows; matrixRow++)
</span><span class="cx">                 {
</span><del>-                    tempConstArray[matrixRow].setFConst(0.0f);
-                    for (int col = 0; col &lt; matrixCols; col++)
-                    {
-                        tempConstArray[matrixRow].setFConst(
-                            tempConstArray[matrixRow].getFConst() +
-                            unionArray[col * matrixRows + matrixRow].getFConst() *
-                            rightUnionArray[col].getFConst());
-                    }
</del><ins>+                    resultArray[matrixCol].setFConst(resultArray[matrixCol].getFConst() +
+                                                     leftArray[matrixRow].getFConst() *
+                                                     rightArray[matrixCol * matrixRows + matrixRow].getFConst());
</ins><span class="cx">                 }
</span><ins>+            }
+        }
+        break;
</ins><span class="cx"> 
</span><del>-                returnType = rightNode-&gt;getType();
-                returnType.setPrimarySize(static_cast&lt;unsigned char&gt;(matrixRows));
</del><ins>+      case EOpLogicalAnd:
+        {
+            resultArray = new TConstantUnion[objectSize];
+            for (size_t i = 0; i &lt; objectSize; i++)
+            {
+                resultArray[i] = leftArray[i] &amp;&amp; rightArray[i];
+            }
+        }
+        break;
</ins><span class="cx"> 
</span><del>-                tempNode = new TIntermConstantUnion(tempConstArray, returnType);
-                tempNode-&gt;setLine(getLine());
-
-                return tempNode;
</del><ins>+      case EOpLogicalOr:
+        {
+            resultArray = new TConstantUnion[objectSize];
+            for (size_t i = 0; i &lt; objectSize; i++)
+            {
+                resultArray[i] = leftArray[i] || rightArray[i];
</ins><span class="cx">             }
</span><ins>+        }
+        break;
</ins><span class="cx"> 
</span><del>-          case EOpVectorTimesMatrix:
</del><ins>+      case EOpLogicalXor:
+        {
+            resultArray = new TConstantUnion[objectSize];
+            for (size_t i = 0; i &lt; objectSize; i++)
</ins><span class="cx">             {
</span><del>-                if (getType().getBasicType() != EbtFloat)
</del><ins>+                switch (getType().getBasicType())
</ins><span class="cx">                 {
</span><del>-                    infoSink.info.message(
-                        EPrefixInternalError, getLine(),
-                        &quot;Constant Folding cannot be done for vector times matrix&quot;);
-                    return nullptr;
</del><ins>+                  case EbtBool:
+                    resultArray[i].setBConst(leftArray[i] != rightArray[i]);
+                    break;
+                  default:
+                    UNREACHABLE();
+                    break;
</ins><span class="cx">                 }
</span><ins>+            }
+        }
+        break;
</ins><span class="cx"> 
</span><del>-                const int matrixCols = rightNode-&gt;getType().getCols();
-                const int matrixRows = rightNode-&gt;getType().getRows();
</del><ins>+      case EOpBitwiseAnd:
+        resultArray = new TConstantUnion[objectSize];
+        for (size_t i = 0; i &lt; objectSize; i++)
+            resultArray[i] = leftArray[i] &amp; rightArray[i];
+        break;
+      case EOpBitwiseXor:
+        resultArray = new TConstantUnion[objectSize];
+        for (size_t i = 0; i &lt; objectSize; i++)
+            resultArray[i] = leftArray[i] ^ rightArray[i];
+        break;
+      case EOpBitwiseOr:
+        resultArray = new TConstantUnion[objectSize];
+        for (size_t i = 0; i &lt; objectSize; i++)
+            resultArray[i] = leftArray[i] | rightArray[i];
+        break;
+      case EOpBitShiftLeft:
+        resultArray = new TConstantUnion[objectSize];
+        for (size_t i = 0; i &lt; objectSize; i++)
+            resultArray[i] = leftArray[i] &lt;&lt; rightArray[i];
+        break;
+      case EOpBitShiftRight:
+        resultArray = new TConstantUnion[objectSize];
+        for (size_t i = 0; i &lt; objectSize; i++)
+            resultArray[i] = leftArray[i] &gt;&gt; rightArray[i];
+        break;
</ins><span class="cx"> 
</span><del>-                tempConstArray = new TConstantUnion[matrixCols];
</del><ins>+      case EOpLessThan:
+        ASSERT(objectSize == 1);
+        resultArray = new TConstantUnion[1];
+        resultArray-&gt;setBConst(*leftArray &lt; *rightArray);
+        break;
</ins><span class="cx"> 
</span><del>-                for (int matrixCol = 0; matrixCol &lt; matrixCols; matrixCol++)
-                {
-                    tempConstArray[matrixCol].setFConst(0.0f);
-                    for (int matrixRow = 0; matrixRow &lt; matrixRows; matrixRow++)
-                    {
-                        tempConstArray[matrixCol].setFConst(
-                            tempConstArray[matrixCol].getFConst() +
-                            unionArray[matrixRow].getFConst() *
-                            rightUnionArray[matrixCol * matrixRows + matrixRow].getFConst());
-                    }
-                }
</del><ins>+      case EOpGreaterThan:
+        ASSERT(objectSize == 1);
+        resultArray = new TConstantUnion[1];
+        resultArray-&gt;setBConst(*leftArray &gt; *rightArray);
+        break;
</ins><span class="cx"> 
</span><del>-                returnType.setPrimarySize(static_cast&lt;unsigned char&gt;(matrixCols));
-            }
-            break;
</del><ins>+      case EOpLessThanEqual:
+        ASSERT(objectSize == 1);
+        resultArray = new TConstantUnion[1];
+        resultArray-&gt;setBConst(!(*leftArray &gt; *rightArray));
+        break;
</ins><span class="cx"> 
</span><del>-          case EOpLogicalAnd:
-            // this code is written for possible future use,
-            // will not get executed currently
</del><ins>+      case EOpGreaterThanEqual:
+        ASSERT(objectSize == 1);
+        resultArray = new TConstantUnion[1];
+        resultArray-&gt;setBConst(!(*leftArray &lt; *rightArray));
+        break;
+
+      case EOpEqual:
+      case EOpNotEqual:
+        {
+            resultArray = new TConstantUnion[1];
+            bool equal = true;
+            for (size_t i = 0; i &lt; objectSize; i++)
</ins><span class="cx">             {
</span><del>-                tempConstArray = new TConstantUnion[objectSize];
-                for (size_t i = 0; i &lt; objectSize; i++)
</del><ins>+                if (leftArray[i] != rightArray[i])
</ins><span class="cx">                 {
</span><del>-                    tempConstArray[i] = unionArray[i] &amp;&amp; rightUnionArray[i];
</del><ins>+                    equal = false;
+                    break;  // break out of for loop
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><del>-            break;
</del><ins>+            if (op == EOpEqual)
+            {
+                resultArray-&gt;setBConst(equal);
+            }
+            else
+            {
+                resultArray-&gt;setBConst(!equal);
+            }
+        }
+        break;
</ins><span class="cx"> 
</span><del>-          case EOpLogicalOr:
-            // this code is written for possible future use,
-            // will not get executed currently
</del><ins>+      default:
+        infoSink.info.message(
+            EPrefixInternalError, getLine(),
+            &quot;Invalid operator for constant folding&quot;);
+        return nullptr;
+    }
+    return resultArray;
+}
+
+//
+// The fold functions see if an operation on a constant can be done in place,
+// without generating run-time code.
+//
+// Returns the constant value to keep using or nullptr.
+//
+TConstantUnion *TIntermConstantUnion::foldUnaryWithDifferentReturnType(TOperator op, TInfoSink &amp;infoSink)
+{
+    //
+    // Do operations where the return type has a different number of components compared to the operand type.
+    //
+
+    const TConstantUnion *operandArray = getUnionArrayPointer();
+    if (!operandArray)
+        return nullptr;
+
+    size_t objectSize = getType().getObjectSize();
+    TConstantUnion *resultArray = nullptr;
+    switch (op)
+    {
+      case EOpAny:
+        if (getType().getBasicType() == EbtBool)
+        {
+            resultArray = new TConstantUnion();
+            resultArray-&gt;setBConst(false);
+            for (size_t i = 0; i &lt; objectSize; i++)
</ins><span class="cx">             {
</span><del>-                tempConstArray = new TConstantUnion[objectSize];
-                for (size_t i = 0; i &lt; objectSize; i++)
</del><ins>+                if (operandArray[i].getBConst())
</ins><span class="cx">                 {
</span><del>-                    tempConstArray[i] = unionArray[i] || rightUnionArray[i];
</del><ins>+                    resultArray-&gt;setBConst(true);
+                    break;
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">             break;
</span><ins>+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
</ins><span class="cx"> 
</span><del>-          case EOpLogicalXor:
</del><ins>+      case EOpAll:
+        if (getType().getBasicType() == EbtBool)
+        {
+            resultArray = new TConstantUnion();
+            resultArray-&gt;setBConst(true);
+            for (size_t i = 0; i &lt; objectSize; i++)
</ins><span class="cx">             {
</span><del>-                tempConstArray = new TConstantUnion[objectSize];
-                for (size_t i = 0; i &lt; objectSize; i++)
</del><ins>+                if (!operandArray[i].getBConst())
</ins><span class="cx">                 {
</span><del>-                    switch (getType().getBasicType())
-                    {
-                      case EbtBool:
-                        tempConstArray[i].setBConst(
-                            unionArray[i] == rightUnionArray[i] ? false : true);
-                        break;
-                      default:
-                        UNREACHABLE();
-                        break;
-                    }
</del><ins>+                    resultArray-&gt;setBConst(false);
+                    break;
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">             break;
</span><ins>+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
</ins><span class="cx"> 
</span><del>-          case EOpBitwiseAnd:
-            tempConstArray = new TConstantUnion[objectSize];
-            for (size_t i = 0; i &lt; objectSize; i++)
-                tempConstArray[i] = unionArray[i] &amp; rightUnionArray[i];
</del><ins>+      case EOpLength:
+        if (getType().getBasicType() == EbtFloat)
+        {
+            resultArray = new TConstantUnion();
+            resultArray-&gt;setFConst(VectorLength(operandArray, objectSize));
</ins><span class="cx">             break;
</span><del>-          case EOpBitwiseXor:
-            tempConstArray = new TConstantUnion[objectSize];
-            for (size_t i = 0; i &lt; objectSize; i++)
-                tempConstArray[i] = unionArray[i] ^ rightUnionArray[i];
</del><ins>+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
+
+      case EOpTranspose:
+        if (getType().getBasicType() == EbtFloat)
+        {
+            resultArray = new TConstantUnion[objectSize];
+            angle::Matrix&lt;float&gt; result =
+                GetMatrix(operandArray, getType().getNominalSize(), getType().getSecondarySize()).transpose();
+            SetUnionArrayFromMatrix(result, resultArray);
</ins><span class="cx">             break;
</span><del>-          case EOpBitwiseOr:
-            tempConstArray = new TConstantUnion[objectSize];
-            for (size_t i = 0; i &lt; objectSize; i++)
-                tempConstArray[i] = unionArray[i] | rightUnionArray[i];
</del><ins>+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
+
+      case EOpDeterminant:
+        if (getType().getBasicType() == EbtFloat)
+        {
+            unsigned int size = getType().getNominalSize();
+            ASSERT(size &gt;= 2 &amp;&amp; size &lt;= 4);
+            resultArray = new TConstantUnion();
+            resultArray-&gt;setFConst(GetMatrix(operandArray, size).determinant());
</ins><span class="cx">             break;
</span><del>-          case EOpBitShiftLeft:
-            tempConstArray = new TConstantUnion[objectSize];
-            for (size_t i = 0; i &lt; objectSize; i++)
-                tempConstArray[i] = unionArray[i] &lt;&lt; rightUnionArray[i];
</del><ins>+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
+
+      case EOpInverse:
+        if (getType().getBasicType() == EbtFloat)
+        {
+            unsigned int size = getType().getNominalSize();
+            ASSERT(size &gt;= 2 &amp;&amp; size &lt;= 4);
+            resultArray = new TConstantUnion[objectSize];
+            angle::Matrix&lt;float&gt; result = GetMatrix(operandArray, size).inverse();
+            SetUnionArrayFromMatrix(result, resultArray);
</ins><span class="cx">             break;
</span><del>-          case EOpBitShiftRight:
-            tempConstArray = new TConstantUnion[objectSize];
-            for (size_t i = 0; i &lt; objectSize; i++)
-                tempConstArray[i] = unionArray[i] &gt;&gt; rightUnionArray[i];
</del><ins>+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
+
+      case EOpPackSnorm2x16:
+        if (getType().getBasicType() == EbtFloat)
+        {
+            ASSERT(getType().getNominalSize() == 2);
+            resultArray = new TConstantUnion();
+            resultArray-&gt;setUConst(gl::packSnorm2x16(operandArray[0].getFConst(), operandArray[1].getFConst()));
</ins><span class="cx">             break;
</span><ins>+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
</ins><span class="cx"> 
</span><del>-          case EOpLessThan:
-            ASSERT(objectSize == 1);
-            tempConstArray = new TConstantUnion[1];
-            tempConstArray-&gt;setBConst(*unionArray &lt; *rightUnionArray);
-            returnType = TType(EbtBool, EbpUndefined, EvqConst);
</del><ins>+      case EOpUnpackSnorm2x16:
+        if (getType().getBasicType() == EbtUInt)
+        {
+            resultArray = new TConstantUnion[2];
+            float f1, f2;
+            gl::unpackSnorm2x16(operandArray[0].getUConst(), &amp;f1, &amp;f2);
+            resultArray[0].setFConst(f1);
+            resultArray[1].setFConst(f2);
</ins><span class="cx">             break;
</span><ins>+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
</ins><span class="cx"> 
</span><del>-          case EOpGreaterThan:
-            ASSERT(objectSize == 1);
-            tempConstArray = new TConstantUnion[1];
-            tempConstArray-&gt;setBConst(*unionArray &gt; *rightUnionArray);
-            returnType = TType(EbtBool, EbpUndefined, EvqConst);
</del><ins>+      case EOpPackUnorm2x16:
+        if (getType().getBasicType() == EbtFloat)
+        {
+            ASSERT(getType().getNominalSize() == 2);
+            resultArray = new TConstantUnion();
+            resultArray-&gt;setUConst(gl::packUnorm2x16(operandArray[0].getFConst(), operandArray[1].getFConst()));
</ins><span class="cx">             break;
</span><ins>+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
</ins><span class="cx"> 
</span><del>-          case EOpLessThanEqual:
</del><ins>+      case EOpUnpackUnorm2x16:
+        if (getType().getBasicType() == EbtUInt)
+        {
+            resultArray = new TConstantUnion[2];
+            float f1, f2;
+            gl::unpackUnorm2x16(operandArray[0].getUConst(), &amp;f1, &amp;f2);
+            resultArray[0].setFConst(f1);
+            resultArray[1].setFConst(f2);
+            break;
+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
+
+      case EOpPackHalf2x16:
+        if (getType().getBasicType() == EbtFloat)
+        {
+            ASSERT(getType().getNominalSize() == 2);
+            resultArray = new TConstantUnion();
+            resultArray-&gt;setUConst(gl::packHalf2x16(operandArray[0].getFConst(), operandArray[1].getFConst()));
+            break;
+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
+
+      case EOpUnpackHalf2x16:
+        if (getType().getBasicType() == EbtUInt)
+        {
+            resultArray = new TConstantUnion[2];
+            float f1, f2;
+            gl::unpackHalf2x16(operandArray[0].getUConst(), &amp;f1, &amp;f2);
+            resultArray[0].setFConst(f1);
+            resultArray[1].setFConst(f2);
+            break;
+        }
+        else
+        {
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+        }
+        break;
+
+      default:
+        break;
+    }
+
+    return resultArray;
+}
+
+TConstantUnion *TIntermConstantUnion::foldUnaryWithSameReturnType(TOperator op, TInfoSink &amp;infoSink)
+{
+    //
+    // Do unary operations where the return type is the same as operand type.
+    //
+
+    const TConstantUnion *operandArray = getUnionArrayPointer();
+    if (!operandArray)
+        return nullptr;
+
+    size_t objectSize = getType().getObjectSize();
+
+    TConstantUnion *resultArray = new TConstantUnion[objectSize];
+    for (size_t i = 0; i &lt; objectSize; i++)
+    {
+        switch(op)
+        {
+          case EOpNegative:
+            switch (getType().getBasicType())
</ins><span class="cx">             {
</span><del>-                ASSERT(objectSize == 1);
-                TConstantUnion constant;
-                constant.setBConst(*unionArray &gt; *rightUnionArray);
-                tempConstArray = new TConstantUnion[1];
-                tempConstArray-&gt;setBConst(!constant.getBConst());
-                returnType = TType(EbtBool, EbpUndefined, EvqConst);
</del><ins>+              case EbtFloat:
+                resultArray[i].setFConst(-operandArray[i].getFConst());
</ins><span class="cx">                 break;
</span><ins>+              case EbtInt:
+                resultArray[i].setIConst(-operandArray[i].getIConst());
+                break;
+              case EbtUInt:
+                resultArray[i].setUConst(static_cast&lt;unsigned int&gt;(
+                    -static_cast&lt;int&gt;(operandArray[i].getUConst())));
+                break;
+              default:
+                infoSink.info.message(
+                    EPrefixInternalError, getLine(),
+                    &quot;Unary operation not folded into constant&quot;);
+                return nullptr;
</ins><span class="cx">             }
</span><ins>+            break;
</ins><span class="cx"> 
</span><del>-          case EOpGreaterThanEqual:
</del><ins>+          case EOpPositive:
+            switch (getType().getBasicType())
</ins><span class="cx">             {
</span><del>-                ASSERT(objectSize == 1);
-                TConstantUnion constant;
-                constant.setBConst(*unionArray &lt; *rightUnionArray);
-                tempConstArray = new TConstantUnion[1];
-                tempConstArray-&gt;setBConst(!constant.getBConst());
-                returnType = TType(EbtBool, EbpUndefined, EvqConst);
</del><ins>+              case EbtFloat:
+                resultArray[i].setFConst(operandArray[i].getFConst());
</ins><span class="cx">                 break;
</span><ins>+              case EbtInt:
+                resultArray[i].setIConst(operandArray[i].getIConst());
+                break;
+              case EbtUInt:
+                resultArray[i].setUConst(static_cast&lt;unsigned int&gt;(
+                    static_cast&lt;int&gt;(operandArray[i].getUConst())));
+                break;
+              default:
+                infoSink.info.message(
+                    EPrefixInternalError, getLine(),
+                    &quot;Unary operation not folded into constant&quot;);
+                return nullptr;
</ins><span class="cx">             }
</span><ins>+            break;
</ins><span class="cx"> 
</span><del>-          case EOpEqual:
-            if (getType().getBasicType() == EbtStruct)
</del><ins>+          case EOpLogicalNot:
+            // this code is written for possible future use,
+            // will not get executed currently
+            switch (getType().getBasicType())
</ins><span class="cx">             {
</span><del>-                if (!CompareStructure(rightNode-&gt;getType(),
-                                      rightNode-&gt;getUnionArrayPointer(),
-                                      unionArray))
-                {
-                    boolNodeFlag = true;
-                }
</del><ins>+              case EbtBool:
+                resultArray[i].setBConst(!operandArray[i].getBConst());
+                break;
+              default:
+                infoSink.info.message(
+                    EPrefixInternalError, getLine(),
+                    &quot;Unary operation not folded into constant&quot;);
+                return nullptr;
</ins><span class="cx">             }
</span><del>-            else
</del><ins>+            break;
+
+          case EOpBitwiseNot:
+            switch (getType().getBasicType())
</ins><span class="cx">             {
</span><del>-                for (size_t i = 0; i &lt; objectSize; i++)
-                {
-                    if (unionArray[i] != rightUnionArray[i])
-                    {
-                        boolNodeFlag = true;
-                        break;  // break out of for loop
-                    }
-                }
</del><ins>+              case EbtInt:
+                resultArray[i].setIConst(~operandArray[i].getIConst());
+                break;
+              case EbtUInt:
+                resultArray[i].setUConst(~operandArray[i].getUConst());
+                break;
+              default:
+                infoSink.info.message(
+                    EPrefixInternalError, getLine(),
+                    &quot;Unary operation not folded into constant&quot;);
+                return nullptr;
</ins><span class="cx">             }
</span><ins>+            break;
</ins><span class="cx"> 
</span><del>-            tempConstArray = new TConstantUnion[1];
-            if (!boolNodeFlag)
</del><ins>+          case EOpRadians:
+            if (getType().getBasicType() == EbtFloat)
</ins><span class="cx">             {
</span><del>-                tempConstArray-&gt;setBConst(true);
</del><ins>+                resultArray[i].setFConst(kDegreesToRadiansMultiplier * operandArray[i].getFConst());
+                break;
</ins><span class="cx">             }
</span><del>-            else
</del><ins>+            infoSink.info.message(
+                EPrefixInternalError, getLine(),
+                &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
+
+          case EOpDegrees:
+            if (getType().getBasicType() == EbtFloat)
</ins><span class="cx">             {
</span><del>-                tempConstArray-&gt;setBConst(false);
</del><ins>+                resultArray[i].setFConst(kRadiansToDegreesMultiplier * operandArray[i].getFConst());
+                break;
</ins><span class="cx">             }
</span><ins>+            infoSink.info.message(
+                EPrefixInternalError, getLine(),
+                &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-            tempNode = new TIntermConstantUnion(
-                tempConstArray, TType(EbtBool, EbpUndefined, EvqConst));
-            tempNode-&gt;setLine(getLine());
</del><ins>+          case EOpSin:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;sinf, infoSink, &amp;resultArray[i]))
+               return nullptr;
+            break;
</ins><span class="cx"> 
</span><del>-            return tempNode;
</del><ins>+          case EOpCos:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;cosf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
</ins><span class="cx"> 
</span><del>-          case EOpNotEqual:
-            if (getType().getBasicType() == EbtStruct)
-            {
-                if (CompareStructure(rightNode-&gt;getType(),
-                                     rightNode-&gt;getUnionArrayPointer(),
-                                     unionArray))
-                {
-                    boolNodeFlag = true;
-                }
-            }
-            else
-            {
-                for (size_t i = 0; i &lt; objectSize; i++)
-                {
-                    if (unionArray[i] == rightUnionArray[i])
-                    {
-                        boolNodeFlag = true;
-                        break;  // break out of for loop
-                    }
-                }
-            }
</del><ins>+          case EOpTan:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;tanf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
</ins><span class="cx"> 
</span><del>-            tempConstArray = new TConstantUnion[1];
-            if (!boolNodeFlag)
-            {
-                tempConstArray-&gt;setBConst(true);
-            }
-            else
-            {
-                tempConstArray-&gt;setBConst(false);
-            }
</del><ins>+          case EOpAsin:
+            // For asin(x), results are undefined if |x| &gt; 1, we are choosing to set result to 0.
+            if (getType().getBasicType() == EbtFloat &amp;&amp; fabsf(operandArray[i].getFConst()) &gt; 1.0f)
+                UndefinedConstantFoldingError(getLine(), op, getType().getBasicType(), infoSink, &amp;resultArray[i]);
+            else if (!foldFloatTypeUnary(operandArray[i], &amp;asinf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
</ins><span class="cx"> 
</span><del>-            tempNode = new TIntermConstantUnion(
-                tempConstArray, TType(EbtBool, EbpUndefined, EvqConst));
-            tempNode-&gt;setLine(getLine());
</del><ins>+          case EOpAcos:
+            // For acos(x), results are undefined if |x| &gt; 1, we are choosing to set result to 0.
+            if (getType().getBasicType() == EbtFloat &amp;&amp; fabsf(operandArray[i].getFConst()) &gt; 1.0f)
+                UndefinedConstantFoldingError(getLine(), op, getType().getBasicType(), infoSink, &amp;resultArray[i]);
+            else if (!foldFloatTypeUnary(operandArray[i], &amp;acosf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
</ins><span class="cx"> 
</span><del>-            return tempNode;
</del><ins>+          case EOpAtan:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;atanf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
</ins><span class="cx"> 
</span><del>-          default:
-            infoSink.info.message(
-                EPrefixInternalError, getLine(),
-                &quot;Invalid operator for constant folding&quot;);
-            return nullptr;
-        }
-        tempNode = new TIntermConstantUnion(tempConstArray, returnType);
-        tempNode-&gt;setLine(getLine());
</del><ins>+          case EOpSinh:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;sinhf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
</ins><span class="cx"> 
</span><del>-        return tempNode;
-    }
-    else
-    {
-        //
-        // Do unary operations
-        //
-        TIntermConstantUnion *newNode = 0;
-        TConstantUnion* tempConstArray = new TConstantUnion[objectSize];
-        for (size_t i = 0; i &lt; objectSize; i++)
-        {
-            switch(op)
</del><ins>+          case EOpCosh:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;coshf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
+
+          case EOpTanh:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;tanhf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
+
+          case EOpAsinh:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;asinhf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
+
+          case EOpAcosh:
+            // For acosh(x), results are undefined if x &lt; 1, we are choosing to set result to 0.
+            if (getType().getBasicType() == EbtFloat &amp;&amp; operandArray[i].getFConst() &lt; 1.0f)
+                UndefinedConstantFoldingError(getLine(), op, getType().getBasicType(), infoSink, &amp;resultArray[i]);
+            else if (!foldFloatTypeUnary(operandArray[i], &amp;acoshf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
+
+          case EOpAtanh:
+            // For atanh(x), results are undefined if |x| &gt;= 1, we are choosing to set result to 0.
+            if (getType().getBasicType() == EbtFloat &amp;&amp; fabsf(operandArray[i].getFConst()) &gt;= 1.0f)
+                UndefinedConstantFoldingError(getLine(), op, getType().getBasicType(), infoSink, &amp;resultArray[i]);
+            else if (!foldFloatTypeUnary(operandArray[i], &amp;atanhf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
+
+          case EOpAbs:
+            switch (getType().getBasicType())
</ins><span class="cx">             {
</span><del>-              case EOpNegative:
-                switch (getType().getBasicType())
-                {
-                  case EbtFloat:
-                    tempConstArray[i].setFConst(-unionArray[i].getFConst());
-                    break;
-                  case EbtInt:
-                    tempConstArray[i].setIConst(-unionArray[i].getIConst());
-                    break;
-                  case EbtUInt:
-                    tempConstArray[i].setUConst(static_cast&lt;unsigned int&gt;(
-                        -static_cast&lt;int&gt;(unionArray[i].getUConst())));
-                    break;
-                  default:
-                    infoSink.info.message(
-                        EPrefixInternalError, getLine(),
-                        &quot;Unary operation not folded into constant&quot;);
-                    return nullptr;
-                }
</del><ins>+              case EbtFloat:
+                resultArray[i].setFConst(fabsf(operandArray[i].getFConst()));
</ins><span class="cx">                 break;
</span><del>-
-              case EOpPositive:
-                switch (getType().getBasicType())
-                {
-                  case EbtFloat:
-                    tempConstArray[i].setFConst(unionArray[i].getFConst());
-                    break;
-                  case EbtInt:
-                    tempConstArray[i].setIConst(unionArray[i].getIConst());
-                    break;
-                  case EbtUInt:
-                    tempConstArray[i].setUConst(static_cast&lt;unsigned int&gt;(
-                        static_cast&lt;int&gt;(unionArray[i].getUConst())));
-                    break;
-                  default:
-                    infoSink.info.message(
-                        EPrefixInternalError, getLine(),
-                        &quot;Unary operation not folded into constant&quot;);
-                    return nullptr;
-                }
</del><ins>+              case EbtInt:
+                resultArray[i].setIConst(abs(operandArray[i].getIConst()));
</ins><span class="cx">                 break;
</span><ins>+              default:
+                infoSink.info.message(
+                    EPrefixInternalError, getLine(),
+                    &quot;Unary operation not folded into constant&quot;);
+                return nullptr;
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpLogicalNot:
-                // this code is written for possible future use,
-                // will not get executed currently
-                switch (getType().getBasicType())
</del><ins>+          case EOpSign:
+            switch (getType().getBasicType())
+            {
+              case EbtFloat:
</ins><span class="cx">                 {
</span><del>-                  case EbtBool:
-                    tempConstArray[i].setBConst(!unionArray[i].getBConst());
-                    break;
-                  default:
-                    infoSink.info.message(
-                        EPrefixInternalError, getLine(),
-                        &quot;Unary operation not folded into constant&quot;);
-                    return nullptr;
</del><ins>+                    float fConst = operandArray[i].getFConst();
+                    float fResult = 0.0f;
+                    if (fConst &gt; 0.0f)
+                        fResult = 1.0f;
+                    else if (fConst &lt; 0.0f)
+                        fResult = -1.0f;
+                    resultArray[i].setFConst(fResult);
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><del>-
-              case EOpBitwiseNot:
-                switch (getType().getBasicType())
</del><ins>+              case EbtInt:
</ins><span class="cx">                 {
</span><del>-                  case EbtInt:
-                    tempConstArray[i].setIConst(~unionArray[i].getIConst());
-                    break;
-                  case EbtUInt:
-                    tempConstArray[i].setUConst(~unionArray[i].getUConst());
-                    break;
-                  default:
-                    infoSink.info.message(
-                        EPrefixInternalError, getLine(),
-                        &quot;Unary operation not folded into constant&quot;);
-                    return nullptr;
</del><ins>+                    int iConst = operandArray[i].getIConst();
+                    int iResult = 0;
+                    if (iConst &gt; 0)
+                        iResult = 1;
+                    else if (iConst &lt; 0)
+                        iResult = -1;
+                    resultArray[i].setIConst(iResult);
</ins><span class="cx">                 }
</span><span class="cx">                 break;
</span><del>-
-              case EOpRadians:
-                if (getType().getBasicType() == EbtFloat)
-                {
-                    tempConstArray[i].setFConst(kDegreesToRadiansMultiplier * unionArray[i].getFConst());
-                    break;
-                }
</del><ins>+              default:
</ins><span class="cx">                 infoSink.info.message(
</span><span class="cx">                     EPrefixInternalError, getLine(),
</span><span class="cx">                     &quot;Unary operation not folded into constant&quot;);
</span><span class="cx">                 return nullptr;
</span><ins>+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpDegrees:
-                if (getType().getBasicType() == EbtFloat)
-                {
-                    tempConstArray[i].setFConst(kRadiansToDegreesMultiplier * unionArray[i].getFConst());
-                    break;
-                }
-                infoSink.info.message(
-                    EPrefixInternalError, getLine(),
-                    &quot;Unary operation not folded into constant&quot;);
</del><ins>+          case EOpFloor:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;floorf, infoSink, &amp;resultArray[i]))
</ins><span class="cx">                 return nullptr;
</span><ins>+            break;
</ins><span class="cx"> 
</span><del>-              case EOpSin:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;sinf, infoSink, &amp;tempConstArray[i]))
-                   return nullptr;
-                break;
</del><ins>+          case EOpTrunc:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;truncf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpCos:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;cosf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpRound:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;roundf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
+
+          case EOpRoundEven:
+            if (getType().getBasicType() == EbtFloat)
+            {
+                float x = operandArray[i].getFConst();
+                float result;
+                float fractPart = modff(x, &amp;result);
+                if (fabsf(fractPart) == 0.5f)
+                    result = 2.0f * roundf(x / 2.0f);
+                else
+                    result = roundf(x);
+                resultArray[i].setFConst(result);
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(
+                EPrefixInternalError, getLine(),
+                &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpTan:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;tanf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpCeil:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;ceilf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
+
+          case EOpFract:
+            if (getType().getBasicType() == EbtFloat)
+            {
+                float x = operandArray[i].getFConst();
+                resultArray[i].setFConst(x - floorf(x));
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(
+                EPrefixInternalError, getLine(),
+                &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpAsin:
-                // For asin(x), results are undefined if |x| &gt; 1, we are choosing to set result to 0.
-                if (getType().getBasicType() == EbtFloat &amp;&amp; fabsf(unionArray[i].getFConst()) &gt; 1.0f)
-                    tempConstArray[i].setFConst(0.0f);
-                else if (!foldFloatTypeUnary(unionArray[i], &amp;asinf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpIsNan:
+            if (getType().getBasicType() == EbtFloat)
+            {
+                resultArray[i].setBConst(gl::isNaN(operandArray[0].getFConst()));
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpAcos:
-                // For acos(x), results are undefined if |x| &gt; 1, we are choosing to set result to 0.
-                if (getType().getBasicType() == EbtFloat &amp;&amp; fabsf(unionArray[i].getFConst()) &gt; 1.0f)
-                    tempConstArray[i].setFConst(0.0f);
-                else if (!foldFloatTypeUnary(unionArray[i], &amp;acosf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpIsInf:
+            if (getType().getBasicType() == EbtFloat)
+            {
+                resultArray[i].setBConst(gl::isInf(operandArray[0].getFConst()));
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpAtan:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;atanf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpFloatBitsToInt:
+            if (getType().getBasicType() == EbtFloat)
+            {
+                resultArray[i].setIConst(gl::bitCast&lt;int32_t&gt;(operandArray[0].getFConst()));
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpSinh:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;sinhf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpFloatBitsToUint:
+            if (getType().getBasicType() == EbtFloat)
+            {
+                resultArray[i].setUConst(gl::bitCast&lt;uint32_t&gt;(operandArray[0].getFConst()));
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpCosh:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;coshf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpIntBitsToFloat:
+            if (getType().getBasicType() == EbtInt)
+            {
+                resultArray[i].setFConst(gl::bitCast&lt;float&gt;(operandArray[0].getIConst()));
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpTanh:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;tanhf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpUintBitsToFloat:
+            if (getType().getBasicType() == EbtUInt)
+            {
+                resultArray[i].setFConst(gl::bitCast&lt;float&gt;(operandArray[0].getUConst()));
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpAsinh:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;asinhf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpExp:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;expf, infoSink, &amp;resultArray[i]))
+              return nullptr;
+            break;
+
+          case EOpLog:
+            // For log(x), results are undefined if x &lt;= 0, we are choosing to set result to 0.
+            if (getType().getBasicType() == EbtFloat &amp;&amp; operandArray[i].getFConst() &lt;= 0.0f)
+                UndefinedConstantFoldingError(getLine(), op, getType().getBasicType(), infoSink, &amp;resultArray[i]);
+            else if (!foldFloatTypeUnary(operandArray[i], &amp;logf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
+
+          case EOpExp2:
+            if (!foldFloatTypeUnary(operandArray[i], &amp;exp2f, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
+
+          case EOpLog2:
+            // For log2(x), results are undefined if x &lt;= 0, we are choosing to set result to 0.
+            // And log2f is not available on some plarforms like old android, so just using log(x)/log(2) here.
+            if (getType().getBasicType() == EbtFloat &amp;&amp; operandArray[i].getFConst() &lt;= 0.0f)
+                UndefinedConstantFoldingError(getLine(), op, getType().getBasicType(), infoSink, &amp;resultArray[i]);
+            else if (!foldFloatTypeUnary(operandArray[i], &amp;logf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            else
+                resultArray[i].setFConst(resultArray[i].getFConst() / logf(2.0f));
+            break;
+
+          case EOpSqrt:
+            // For sqrt(x), results are undefined if x &lt; 0, we are choosing to set result to 0.
+            if (getType().getBasicType() == EbtFloat &amp;&amp; operandArray[i].getFConst() &lt; 0.0f)
+                UndefinedConstantFoldingError(getLine(), op, getType().getBasicType(), infoSink, &amp;resultArray[i]);
+            else if (!foldFloatTypeUnary(operandArray[i], &amp;sqrtf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            break;
+
+          case EOpInverseSqrt:
+            // There is no stdlib built-in function equavalent for GLES built-in inversesqrt(),
+            // so getting the square root first using builtin function sqrt() and then taking its inverse.
+            // Also, for inversesqrt(x), results are undefined if x &lt;= 0, we are choosing to set result to 0.
+            if (getType().getBasicType() == EbtFloat &amp;&amp; operandArray[i].getFConst() &lt;= 0.0f)
+                UndefinedConstantFoldingError(getLine(), op, getType().getBasicType(), infoSink, &amp;resultArray[i]);
+            else if (!foldFloatTypeUnary(operandArray[i], &amp;sqrtf, infoSink, &amp;resultArray[i]))
+                return nullptr;
+            else
+                resultArray[i].setFConst(1.0f / resultArray[i].getFConst());
+            break;
+
+          case EOpVectorLogicalNot:
+            if (getType().getBasicType() == EbtBool)
+            {
+                resultArray[i].setBConst(!operandArray[i].getBConst());
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(
+                EPrefixInternalError, getLine(),
+                &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpAcosh:
-                // For acosh(x), results are undefined if x &lt; 1, we are choosing to set result to 0.
-                if (getType().getBasicType() == EbtFloat &amp;&amp; unionArray[i].getFConst() &lt; 1.0f)
-                    tempConstArray[i].setFConst(0.0f);
-                else if (!foldFloatTypeUnary(unionArray[i], &amp;acoshf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpNormalize:
+            if (getType().getBasicType() == EbtFloat)
+            {
+                float x = operandArray[i].getFConst();
+                float length = VectorLength(operandArray, objectSize);
+                if (length)
+                    resultArray[i].setFConst(x / length);
+                else
+                    UndefinedConstantFoldingError(getLine(), op, getType().getBasicType(), infoSink,
+                                                  &amp;resultArray[i]);
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpAtanh:
-                // For atanh(x), results are undefined if |x| &gt;= 1, we are choosing to set result to 0.
-                if (getType().getBasicType() == EbtFloat &amp;&amp; fabsf(unionArray[i].getFConst()) &gt;= 1.0f)
-                    tempConstArray[i].setFConst(0.0f);
-                else if (!foldFloatTypeUnary(unionArray[i], &amp;atanhf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
</del><ins>+          case EOpDFdx:
+          case EOpDFdy:
+          case EOpFwidth:
+            if (getType().getBasicType() == EbtFloat)
+            {
+                // Derivatives of constant arguments should be 0.
+                resultArray[i].setFConst(0.0f);
</ins><span class="cx">                 break;
</span><ins>+            }
+            infoSink.info.message(EPrefixInternalError, getLine(), &quot;Unary operation not folded into constant&quot;);
+            return nullptr;
</ins><span class="cx"> 
</span><del>-              case EOpAbs:
-                switch (getType().getBasicType())
</del><ins>+          default:
+            return nullptr;
+        }
+    }
+
+    return resultArray;
+}
+
+bool TIntermConstantUnion::foldFloatTypeUnary(const TConstantUnion &amp;parameter, FloatTypeUnaryFunc builtinFunc,
+                                              TInfoSink &amp;infoSink, TConstantUnion *result) const
+{
+    ASSERT(builtinFunc);
+
+    if (getType().getBasicType() == EbtFloat)
+    {
+        result-&gt;setFConst(builtinFunc(parameter.getFConst()));
+        return true;
+    }
+
+    infoSink.info.message(
+        EPrefixInternalError, getLine(),
+        &quot;Unary operation not folded into constant&quot;);
+    return false;
+}
+
+// static
+TConstantUnion *TIntermConstantUnion::FoldAggregateConstructor(TIntermAggregate *aggregate,
+                                                               TInfoSink &amp;infoSink)
+{
+    ASSERT(aggregate-&gt;getSequence()-&gt;size() &gt; 0u);
+    size_t resultSize           = aggregate-&gt;getType().getObjectSize();
+    TConstantUnion *resultArray = new TConstantUnion[resultSize];
+    TBasicType basicType        = aggregate-&gt;getBasicType();
+
+    size_t resultIndex = 0u;
+
+    if (aggregate-&gt;getSequence()-&gt;size() == 1u)
+    {
+        TIntermNode *argument                    = aggregate-&gt;getSequence()-&gt;front();
+        TIntermConstantUnion *argumentConstant   = argument-&gt;getAsConstantUnion();
+        const TConstantUnion *argumentUnionArray = argumentConstant-&gt;getUnionArrayPointer();
+        // Check the special case of constructing a matrix diagonal from a single scalar,
+        // or a vector from a single scalar.
+        if (argumentConstant-&gt;getType().getObjectSize() == 1u)
+        {
+            if (aggregate-&gt;isMatrix())
+            {
+                int resultCols = aggregate-&gt;getType().getCols();
+                int resultRows = aggregate-&gt;getType().getRows();
+                for (int col = 0; col &lt; resultCols; ++col)
</ins><span class="cx">                 {
</span><del>-                  case EbtFloat:
-                    tempConstArray[i].setFConst(fabsf(unionArray[i].getFConst()));
-                    break;
-                  case EbtInt:
-                    tempConstArray[i].setIConst(abs(unionArray[i].getIConst()));
-                    break;
-                  default:
-                    infoSink.info.message(
-                        EPrefixInternalError, getLine(),
-                        &quot;Unary operation not folded into constant&quot;);
-                    return nullptr;
</del><ins>+                    for (int row = 0; row &lt; resultRows; ++row)
+                    {
+                        if (col == row)
+                        {
+                            resultArray[resultIndex].cast(basicType, argumentUnionArray[0]);
+                        }
+                        else
+                        {
+                            resultArray[resultIndex].setFConst(0.0f);
+                        }
+                        ++resultIndex;
+                    }
</ins><span class="cx">                 }
</span><ins>+            }
+            else
+            {
+                while (resultIndex &lt; resultSize)
+                {
+                    resultArray[resultIndex].cast(basicType, argumentUnionArray[0]);
+                    ++resultIndex;
+                }
+            }
+            ASSERT(resultIndex == resultSize);
+            return resultArray;
+        }
+        else if (aggregate-&gt;isMatrix() &amp;&amp; argumentConstant-&gt;isMatrix())
+        {
+            // The special case of constructing a matrix from a matrix.
+            int argumentCols = argumentConstant-&gt;getType().getCols();
+            int argumentRows = argumentConstant-&gt;getType().getRows();
+            int resultCols   = aggregate-&gt;getType().getCols();
+            int resultRows = aggregate-&gt;getType().getRows();
+            for (int col = 0; col &lt; resultCols; ++col)
+            {
+                for (int row = 0; row &lt; resultRows; ++row)
+                {
+                    if (col &lt; argumentCols &amp;&amp; row &lt; argumentRows)
+                    {
+                        resultArray[resultIndex].cast(basicType,
+                                                      argumentUnionArray[col * argumentRows + row]);
+                    }
+                    else if (col == row)
+                    {
+                        resultArray[resultIndex].setFConst(1.0f);
+                    }
+                    else
+                    {
+                        resultArray[resultIndex].setFConst(0.0f);
+                    }
+                    ++resultIndex;
+                }
+            }
+            ASSERT(resultIndex == resultSize);
+            return resultArray;
+        }
+    }
+
+    for (TIntermNode *&amp;argument : *aggregate-&gt;getSequence())
+    {
+        TIntermConstantUnion *argumentConstant   = argument-&gt;getAsConstantUnion();
+        size_t argumentSize                      = argumentConstant-&gt;getType().getObjectSize();
+        const TConstantUnion *argumentUnionArray = argumentConstant-&gt;getUnionArrayPointer();
+        for (size_t i = 0u; i &lt; argumentSize; ++i)
+        {
+            if (resultIndex &gt;= resultSize)
</ins><span class="cx">                 break;
</span><ins>+            resultArray[resultIndex].cast(basicType, argumentUnionArray[i]);
+            ++resultIndex;
+        }
+    }
+    ASSERT(resultIndex == resultSize);
+    return resultArray;
+}
</ins><span class="cx"> 
</span><del>-              case EOpSign:
-                switch (getType().getBasicType())
</del><ins>+// static
+TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *aggregate, TInfoSink &amp;infoSink)
+{
+    TOperator op = aggregate-&gt;getOp();
+    TIntermSequence *sequence = aggregate-&gt;getSequence();
+    unsigned int paramsCount = static_cast&lt;unsigned int&gt;(sequence-&gt;size());
+    std::vector&lt;const TConstantUnion *&gt; unionArrays(paramsCount);
+    std::vector&lt;size_t&gt; objectSizes(paramsCount);
+    size_t maxObjectSize = 0;
+    TBasicType basicType = EbtVoid;
+    TSourceLoc loc;
+    for (unsigned int i = 0; i &lt; paramsCount; i++)
+    {
+        TIntermConstantUnion *paramConstant = (*sequence)[i]-&gt;getAsConstantUnion();
+        ASSERT(paramConstant != nullptr); // Should be checked already.
+
+        if (i == 0)
+        {
+            basicType = paramConstant-&gt;getType().getBasicType();
+            loc = paramConstant-&gt;getLine();
+        }
+        unionArrays[i] = paramConstant-&gt;getUnionArrayPointer();
+        objectSizes[i] = paramConstant-&gt;getType().getObjectSize();
+        if (objectSizes[i] &gt; maxObjectSize)
+            maxObjectSize = objectSizes[i];
+    }
+
+    if (!(*sequence)[0]-&gt;getAsTyped()-&gt;isMatrix())
+    {
+        for (unsigned int i = 0; i &lt; paramsCount; i++)
+            if (objectSizes[i] != maxObjectSize)
+                unionArrays[i] = Vectorize(*unionArrays[i], maxObjectSize);
+    }
+
+    TConstantUnion *resultArray = nullptr;
+    if (paramsCount == 2)
+    {
+        //
+        // Binary built-in
+        //
+        switch (op)
+        {
+          case EOpAtan:
+            {
+                if (basicType == EbtFloat)
</ins><span class="cx">                 {
</span><del>-                  case EbtFloat:
</del><ins>+                    resultArray = new TConstantUnion[maxObjectSize];
+                    for (size_t i = 0; i &lt; maxObjectSize; i++)
</ins><span class="cx">                     {
</span><del>-                        float fConst = unionArray[i].getFConst();
-                        float fResult = 0.0f;
-                        if (fConst &gt; 0.0f)
-                            fResult = 1.0f;
-                        else if (fConst &lt; 0.0f)
-                            fResult = -1.0f;
-                        tempConstArray[i].setFConst(fResult);
</del><ins>+                        float y = unionArrays[0][i].getFConst();
+                        float x = unionArrays[1][i].getFConst();
+                        // Results are undefined if x and y are both 0.
+                        if (x == 0.0f &amp;&amp; y == 0.0f)
+                            UndefinedConstantFoldingError(loc, op, basicType, infoSink, &amp;resultArray[i]);
+                        else
+                            resultArray[i].setFConst(atan2f(y, x));
</ins><span class="cx">                     }
</span><del>-                    break;
-                  case EbtInt:
</del><ins>+                }
+                else
+                    UNREACHABLE();
+            }
+            break;
+
+          case EOpPow:
+            {
+                if (basicType == EbtFloat)
+                {
+                    resultArray = new TConstantUnion[maxObjectSize];
+                    for (size_t i = 0; i &lt; maxObjectSize; i++)
</ins><span class="cx">                     {
</span><del>-                        int iConst = unionArray[i].getIConst();
-                        int iResult = 0;
-                        if (iConst &gt; 0)
-                            iResult = 1;
-                        else if (iConst &lt; 0)
-                            iResult = -1;
-                        tempConstArray[i].setIConst(iResult);
</del><ins>+                        float x = unionArrays[0][i].getFConst();
+                        float y = unionArrays[1][i].getFConst();
+                        // Results are undefined if x &lt; 0.
+                        // Results are undefined if x = 0 and y &lt;= 0.
+                        if (x &lt; 0.0f)
+                            UndefinedConstantFoldingError(loc, op, basicType, infoSink, &amp;resultArray[i]);
+                        else if (x == 0.0f &amp;&amp; y &lt;= 0.0f)
+                            UndefinedConstantFoldingError(loc, op, basicType, infoSink, &amp;resultArray[i]);
+                        else
+                            resultArray[i].setFConst(powf(x, y));
</ins><span class="cx">                     }
</span><del>-                    break;
-                  default:
-                    infoSink.info.message(
-                        EPrefixInternalError, getLine(),
-                        &quot;Unary operation not folded into constant&quot;);
-                    return nullptr;
</del><span class="cx">                 }
</span><del>-                break;
</del><ins>+                else
+                    UNREACHABLE();
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpFloor:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;floorf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
-                break;
</del><ins>+          case EOpMod:
+            {
+                if (basicType == EbtFloat)
+                {
+                    resultArray = new TConstantUnion[maxObjectSize];
+                    for (size_t i = 0; i &lt; maxObjectSize; i++)
+                    {
+                        float x = unionArrays[0][i].getFConst();
+                        float y = unionArrays[1][i].getFConst();
+                        resultArray[i].setFConst(x - y * floorf(x / y));
+                    }
+                }
+                else
+                    UNREACHABLE();
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpTrunc:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;truncf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
-                break;
</del><ins>+          case EOpMin:
+            {
+                resultArray = new TConstantUnion[maxObjectSize];
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    switch (basicType)
+                    {
+                      case EbtFloat:
+                        resultArray[i].setFConst(std::min(unionArrays[0][i].getFConst(), unionArrays[1][i].getFConst()));
+                        break;
+                      case EbtInt:
+                        resultArray[i].setIConst(std::min(unionArrays[0][i].getIConst(), unionArrays[1][i].getIConst()));
+                        break;
+                      case EbtUInt:
+                        resultArray[i].setUConst(std::min(unionArrays[0][i].getUConst(), unionArrays[1][i].getUConst()));
+                        break;
+                      default:
+                        UNREACHABLE();
+                        break;
+                    }
+                }
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpRound:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;roundf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
-                break;
</del><ins>+          case EOpMax:
+            {
+                resultArray = new TConstantUnion[maxObjectSize];
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    switch (basicType)
+                    {
+                      case EbtFloat:
+                        resultArray[i].setFConst(std::max(unionArrays[0][i].getFConst(), unionArrays[1][i].getFConst()));
+                        break;
+                      case EbtInt:
+                        resultArray[i].setIConst(std::max(unionArrays[0][i].getIConst(), unionArrays[1][i].getIConst()));
+                        break;
+                      case EbtUInt:
+                        resultArray[i].setUConst(std::max(unionArrays[0][i].getUConst(), unionArrays[1][i].getUConst()));
+                        break;
+                      default:
+                        UNREACHABLE();
+                        break;
+                    }
+                }
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpRoundEven:
-                if (getType().getBasicType() == EbtFloat)
</del><ins>+          case EOpStep:
+            {
+                if (basicType == EbtFloat)
</ins><span class="cx">                 {
</span><del>-                    float x = unionArray[i].getFConst();
-                    float result;
-                    float fractPart = modff(x, &amp;result);
-                    if (fabsf(fractPart) == 0.5f)
-                        result = 2.0f * roundf(x / 2.0f);
-                    else
-                        result = roundf(x);
-                    tempConstArray[i].setFConst(result);
-                    break;
</del><ins>+                    resultArray = new TConstantUnion[maxObjectSize];
+                    for (size_t i = 0; i &lt; maxObjectSize; i++)
+                        resultArray[i].setFConst(unionArrays[1][i].getFConst() &lt; unionArrays[0][i].getFConst() ? 0.0f : 1.0f);
</ins><span class="cx">                 }
</span><del>-                infoSink.info.message(
-                    EPrefixInternalError, getLine(),
-                    &quot;Unary operation not folded into constant&quot;);
-                return nullptr;
</del><ins>+                else
+                    UNREACHABLE();
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpCeil:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;ceilf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
-                break;
</del><ins>+          case EOpLessThan:
+            {
+                resultArray = new TConstantUnion[maxObjectSize];
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    switch (basicType)
+                    {
+                      case EbtFloat:
+                        resultArray[i].setBConst(unionArrays[0][i].getFConst() &lt; unionArrays[1][i].getFConst());
+                        break;
+                      case EbtInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getIConst() &lt; unionArrays[1][i].getIConst());
+                        break;
+                      case EbtUInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getUConst() &lt; unionArrays[1][i].getUConst());
+                        break;
+                      default:
+                        UNREACHABLE();
+                        break;
+                    }
+                }
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpFract:
-                if (getType().getBasicType() == EbtFloat)
</del><ins>+          case EOpLessThanEqual:
+            {
+                resultArray = new TConstantUnion[maxObjectSize];
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
</ins><span class="cx">                 {
</span><del>-                    float x = unionArray[i].getFConst();
-                    tempConstArray[i].setFConst(x - floorf(x));
-                    break;
</del><ins>+                    switch (basicType)
+                    {
+                      case EbtFloat:
+                        resultArray[i].setBConst(unionArrays[0][i].getFConst() &lt;= unionArrays[1][i].getFConst());
+                        break;
+                      case EbtInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getIConst() &lt;= unionArrays[1][i].getIConst());
+                        break;
+                      case EbtUInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getUConst() &lt;= unionArrays[1][i].getUConst());
+                        break;
+                      default:
+                        UNREACHABLE();
+                        break;
+                    }
</ins><span class="cx">                 }
</span><del>-                infoSink.info.message(
-                    EPrefixInternalError, getLine(),
-                    &quot;Unary operation not folded into constant&quot;);
-                return nullptr;
</del><ins>+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpExp:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;expf, infoSink, &amp;tempConstArray[i]))
-                  return nullptr;
-                break;
</del><ins>+          case EOpGreaterThan:
+            {
+                resultArray = new TConstantUnion[maxObjectSize];
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    switch (basicType)
+                    {
+                      case EbtFloat:
+                        resultArray[i].setBConst(unionArrays[0][i].getFConst() &gt; unionArrays[1][i].getFConst());
+                        break;
+                      case EbtInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getIConst() &gt; unionArrays[1][i].getIConst());
+                        break;
+                      case EbtUInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getUConst() &gt; unionArrays[1][i].getUConst());
+                        break;
+                      default:
+                        UNREACHABLE();
+                        break;
+                    }
+                }
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpLog:
-                // For log(x), results are undefined if x &lt;= 0, we are choosing to set result to 0.
-                if (getType().getBasicType() == EbtFloat &amp;&amp; unionArray[i].getFConst() &lt;= 0.0f)
-                    tempConstArray[i].setFConst(0.0f);
-                else if (!foldFloatTypeUnary(unionArray[i], &amp;logf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
-                break;
</del><ins>+          case EOpGreaterThanEqual:
+            {
+                resultArray = new TConstantUnion[maxObjectSize];
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    switch (basicType)
+                    {
+                      case EbtFloat:
+                        resultArray[i].setBConst(unionArrays[0][i].getFConst() &gt;= unionArrays[1][i].getFConst());
+                        break;
+                      case EbtInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getIConst() &gt;= unionArrays[1][i].getIConst());
+                        break;
+                      case EbtUInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getUConst() &gt;= unionArrays[1][i].getUConst());
+                        break;
+                      default:
+                        UNREACHABLE();
+                        break;
+                    }
+                }
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpExp2:
-                if (!foldFloatTypeUnary(unionArray[i], &amp;exp2f, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
-                break;
</del><ins>+          case EOpVectorEqual:
+            {
+                resultArray = new TConstantUnion[maxObjectSize];
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    switch (basicType)
+                    {
+                      case EbtFloat:
+                        resultArray[i].setBConst(unionArrays[0][i].getFConst() == unionArrays[1][i].getFConst());
+                        break;
+                      case EbtInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getIConst() == unionArrays[1][i].getIConst());
+                        break;
+                      case EbtUInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getUConst() == unionArrays[1][i].getUConst());
+                        break;
+                      case EbtBool:
+                        resultArray[i].setBConst(unionArrays[0][i].getBConst() == unionArrays[1][i].getBConst());
+                        break;
+                      default:
+                        UNREACHABLE();
+                        break;
+                    }
+                }
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpLog2:
-                // For log2(x), results are undefined if x &lt;= 0, we are choosing to set result to 0.
-                // And log2f is not available on some plarforms like old android, so just using log(x)/log(2) here.
-                if (getType().getBasicType() == EbtFloat &amp;&amp; unionArray[i].getFConst() &lt;= 0.0f)
-                    tempConstArray[i].setFConst(0.0f);
-                else if (!foldFloatTypeUnary(unionArray[i], &amp;logf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
-                else
-                    tempConstArray[i].setFConst(tempConstArray[i].getFConst() / logf(2.0f));
-                break;
</del><ins>+          case EOpVectorNotEqual:
+            {
+                resultArray = new TConstantUnion[maxObjectSize];
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    switch (basicType)
+                    {
+                      case EbtFloat:
+                        resultArray[i].setBConst(unionArrays[0][i].getFConst() != unionArrays[1][i].getFConst());
+                        break;
+                      case EbtInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getIConst() != unionArrays[1][i].getIConst());
+                        break;
+                      case EbtUInt:
+                        resultArray[i].setBConst(unionArrays[0][i].getUConst() != unionArrays[1][i].getUConst());
+                        break;
+                      case EbtBool:
+                        resultArray[i].setBConst(unionArrays[0][i].getBConst() != unionArrays[1][i].getBConst());
+                        break;
+                      default:
+                        UNREACHABLE();
+                        break;
+                    }
+                }
+            }
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpSqrt:
-                // For sqrt(x), results are undefined if x &lt; 0, we are choosing to set result to 0.
-                if (getType().getBasicType() == EbtFloat &amp;&amp; unionArray[i].getFConst() &lt; 0.0f)
-                    tempConstArray[i].setFConst(0.0f);
-                else if (!foldFloatTypeUnary(unionArray[i], &amp;sqrtf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
-                break;
</del><ins>+          case EOpDistance:
+            if (basicType == EbtFloat)
+            {
+                TConstantUnion *distanceArray = new TConstantUnion[maxObjectSize];
+                resultArray = new TConstantUnion();
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    float x = unionArrays[0][i].getFConst();
+                    float y = unionArrays[1][i].getFConst();
+                    distanceArray[i].setFConst(x - y);
+                }
+                resultArray-&gt;setFConst(VectorLength(distanceArray, maxObjectSize));
+            }
+            else
+                UNREACHABLE();
+            break;
</ins><span class="cx"> 
</span><del>-              case EOpInverseSqrt:
-                // There is no stdlib built-in function equavalent for GLES built-in inversesqrt(),
-                // so getting the square root first using builtin function sqrt() and then taking its inverse.
-                // Also, for inversesqrt(x), results are undefined if x &lt;= 0, we are choosing to set result to 0.
-                if (getType().getBasicType() == EbtFloat &amp;&amp; unionArray[i].getFConst() &lt;= 0.0f)
-                    tempConstArray[i].setFConst(0.0f);
-                else if (!foldFloatTypeUnary(unionArray[i], &amp;sqrtf, infoSink, &amp;tempConstArray[i]))
-                    return nullptr;
-                else
-                    tempConstArray[i].setFConst(1.0f / tempConstArray[i].getFConst());
-                break;
</del><ins>+          case EOpDot:
</ins><span class="cx"> 
</span><del>-              default:
-                return nullptr;
</del><ins>+            if (basicType == EbtFloat)
+            {
+                resultArray = new TConstantUnion();
+                resultArray-&gt;setFConst(VectorDotProduct(unionArrays[0], unionArrays[1], maxObjectSize));
</ins><span class="cx">             }
</span><ins>+            else
+                UNREACHABLE();
+            break;
+
+          case EOpCross:
+            if (basicType == EbtFloat &amp;&amp; maxObjectSize == 3)
+            {
+                resultArray = new TConstantUnion[maxObjectSize];
+                float x0 = unionArrays[0][0].getFConst();
+                float x1 = unionArrays[0][1].getFConst();
+                float x2 = unionArrays[0][2].getFConst();
+                float y0 = unionArrays[1][0].getFConst();
+                float y1 = unionArrays[1][1].getFConst();
+                float y2 = unionArrays[1][2].getFConst();
+                resultArray[0].setFConst(x1 * y2 - y1 * x2);
+                resultArray[1].setFConst(x2 * y0 - y2 * x0);
+                resultArray[2].setFConst(x0 * y1 - y0 * x1);
+            }
+            else
+                UNREACHABLE();
+            break;
+
+          case EOpReflect:
+            if (basicType == EbtFloat)
+            {
+                // genType reflect (genType I, genType N) :
+                //     For the incident vector I and surface orientation N, returns the reflection direction:
+                //     I - 2 * dot(N, I) * N.
+                resultArray = new TConstantUnion[maxObjectSize];
+                float dotProduct = VectorDotProduct(unionArrays[1], unionArrays[0], maxObjectSize);
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    float result = unionArrays[0][i].getFConst() -
+                                   2.0f * dotProduct * unionArrays[1][i].getFConst();
+                    resultArray[i].setFConst(result);
+                }
+            }
+            else
+                UNREACHABLE();
+            break;
+
+          case EOpMul:
+            if (basicType == EbtFloat &amp;&amp; (*sequence)[0]-&gt;getAsTyped()-&gt;isMatrix() &amp;&amp;
+                (*sequence)[1]-&gt;getAsTyped()-&gt;isMatrix())
+            {
+                // Perform component-wise matrix multiplication.
+                resultArray = new TConstantUnion[maxObjectSize];
+                int size = (*sequence)[0]-&gt;getAsTyped()-&gt;getNominalSize();
+                angle::Matrix&lt;float&gt; result =
+                    GetMatrix(unionArrays[0], size).compMult(GetMatrix(unionArrays[1], size));
+                SetUnionArrayFromMatrix(result, resultArray);
+            }
+            else
+                UNREACHABLE();
+            break;
+
+          case EOpOuterProduct:
+            if (basicType == EbtFloat)
+            {
+                size_t numRows = (*sequence)[0]-&gt;getAsTyped()-&gt;getType().getObjectSize();
+                size_t numCols = (*sequence)[1]-&gt;getAsTyped()-&gt;getType().getObjectSize();
+                resultArray = new TConstantUnion[numRows * numCols];
+                angle::Matrix&lt;float&gt; result =
+                    GetMatrix(unionArrays[0], 1, static_cast&lt;int&gt;(numCols))
+                        .outerProduct(GetMatrix(unionArrays[1], static_cast&lt;int&gt;(numRows), 1));
+                SetUnionArrayFromMatrix(result, resultArray);
+            }
+            else
+                UNREACHABLE();
+            break;
+
+          default:
+            UNREACHABLE();
+            // TODO: Add constant folding support for other built-in operations that take 2 parameters and not handled above.
+            return nullptr;
</ins><span class="cx">         }
</span><del>-        newNode = new TIntermConstantUnion(tempConstArray, getType());
-        newNode-&gt;setLine(getLine());
-        return newNode;
</del><span class="cx">     }
</span><del>-}
</del><ins>+    else if (paramsCount == 3)
+    {
+        //
+        // Ternary built-in
+        //
+        switch (op)
+        {
+          case EOpClamp:
+            {
+                resultArray = new TConstantUnion[maxObjectSize];
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    switch (basicType)
+                    {
+                      case EbtFloat:
+                        {
+                            float x = unionArrays[0][i].getFConst();
+                            float min = unionArrays[1][i].getFConst();
+                            float max = unionArrays[2][i].getFConst();
+                            // Results are undefined if min &gt; max.
+                            if (min &gt; max)
+                                UndefinedConstantFoldingError(loc, op, basicType, infoSink, &amp;resultArray[i]);
+                            else
+                                resultArray[i].setFConst(gl::clamp(x, min, max));
+                        }
+                        break;
+                      case EbtInt:
+                        {
+                            int x = unionArrays[0][i].getIConst();
+                            int min = unionArrays[1][i].getIConst();
+                            int max = unionArrays[2][i].getIConst();
+                            // Results are undefined if min &gt; max.
+                            if (min &gt; max)
+                                UndefinedConstantFoldingError(loc, op, basicType, infoSink, &amp;resultArray[i]);
+                            else
+                                resultArray[i].setIConst(gl::clamp(x, min, max));
+                        }
+                        break;
+                      case EbtUInt:
+                        {
+                            unsigned int x = unionArrays[0][i].getUConst();
+                            unsigned int min = unionArrays[1][i].getUConst();
+                            unsigned int max = unionArrays[2][i].getUConst();
+                            // Results are undefined if min &gt; max.
+                            if (min &gt; max)
+                                UndefinedConstantFoldingError(loc, op, basicType, infoSink, &amp;resultArray[i]);
+                            else
+                                resultArray[i].setUConst(gl::clamp(x, min, max));
+                        }
+                        break;
+                      default:
+                        UNREACHABLE();
+                        break;
+                    }
+                }
+            }
+            break;
</ins><span class="cx"> 
</span><del>-bool TIntermConstantUnion::foldFloatTypeUnary(const TConstantUnion &amp;parameter, FloatTypeUnaryFunc builtinFunc,
-                                              TInfoSink &amp;infoSink, TConstantUnion *result) const
-{
-    ASSERT(builtinFunc);
</del><ins>+          case EOpMix:
+            {
+                if (basicType == EbtFloat)
+                {
+                    resultArray = new TConstantUnion[maxObjectSize];
+                    for (size_t i = 0; i &lt; maxObjectSize; i++)
+                    {
+                        float x = unionArrays[0][i].getFConst();
+                        float y = unionArrays[1][i].getFConst();
+                        TBasicType type = (*sequence)[2]-&gt;getAsTyped()-&gt;getType().getBasicType();
+                        if (type == EbtFloat)
+                        {
+                            // Returns the linear blend of x and y, i.e., x * (1 - a) + y * a.
+                            float a = unionArrays[2][i].getFConst();
+                            resultArray[i].setFConst(x * (1.0f - a) + y * a);
+                        }
+                        else // 3rd parameter is EbtBool
+                        {
+                            ASSERT(type == EbtBool);
+                            // Selects which vector each returned component comes from.
+                            // For a component of a that is false, the corresponding component of x is returned.
+                            // For a component of a that is true, the corresponding component of y is returned.
+                            bool a = unionArrays[2][i].getBConst();
+                            resultArray[i].setFConst(a ? y : x);
+                        }
+                    }
+                }
+                else
+                    UNREACHABLE();
+            }
+            break;
</ins><span class="cx"> 
</span><del>-    if (getType().getBasicType() == EbtFloat)
-    {
-        result-&gt;setFConst(builtinFunc(parameter.getFConst()));
-        return true;
</del><ins>+          case EOpSmoothStep:
+            {
+                if (basicType == EbtFloat)
+                {
+                    resultArray = new TConstantUnion[maxObjectSize];
+                    for (size_t i = 0; i &lt; maxObjectSize; i++)
+                    {
+                        float edge0 = unionArrays[0][i].getFConst();
+                        float edge1 = unionArrays[1][i].getFConst();
+                        float x = unionArrays[2][i].getFConst();
+                        // Results are undefined if edge0 &gt;= edge1.
+                        if (edge0 &gt;= edge1)
+                        {
+                            UndefinedConstantFoldingError(loc, op, basicType, infoSink, &amp;resultArray[i]);
+                        }
+                        else
+                        {
+                            // Returns 0.0 if x &lt;= edge0 and 1.0 if x &gt;= edge1 and performs smooth
+                            // Hermite interpolation between 0 and 1 when edge0 &lt; x &lt; edge1.
+                            float t = gl::clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f);
+                            resultArray[i].setFConst(t * t * (3.0f - 2.0f * t));
+                        }
+                    }
+                }
+                else
+                    UNREACHABLE();
+            }
+            break;
+
+          case EOpFaceForward:
+            if (basicType == EbtFloat)
+            {
+                // genType faceforward(genType N, genType I, genType Nref) :
+                //     If dot(Nref, I) &lt; 0 return N, otherwise return -N.
+                resultArray = new TConstantUnion[maxObjectSize];
+                float dotProduct = VectorDotProduct(unionArrays[2], unionArrays[1], maxObjectSize);
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    if (dotProduct &lt; 0)
+                        resultArray[i].setFConst(unionArrays[0][i].getFConst());
+                    else
+                        resultArray[i].setFConst(-unionArrays[0][i].getFConst());
+                }
+            }
+            else
+                UNREACHABLE();
+            break;
+
+          case EOpRefract:
+            if (basicType == EbtFloat)
+            {
+                // genType refract(genType I, genType N, float eta) :
+                //     For the incident vector I and surface normal N, and the ratio of indices of refraction eta,
+                //     return the refraction vector. The result is computed by
+                //         k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I))
+                //         if (k &lt; 0.0)
+                //             return genType(0.0)
+                //         else
+                //             return eta * I - (eta * dot(N, I) + sqrt(k)) * N
+                resultArray = new TConstantUnion[maxObjectSize];
+                float dotProduct = VectorDotProduct(unionArrays[1], unionArrays[0], maxObjectSize);
+                for (size_t i = 0; i &lt; maxObjectSize; i++)
+                {
+                    float eta = unionArrays[2][i].getFConst();
+                    float k = 1.0f - eta * eta * (1.0f - dotProduct * dotProduct);
+                    if (k &lt; 0.0f)
+                        resultArray[i].setFConst(0.0f);
+                    else
+                        resultArray[i].setFConst(eta * unionArrays[0][i].getFConst() -
+                                                    (eta * dotProduct + sqrtf(k)) * unionArrays[1][i].getFConst());
+                }
+            }
+            else
+                UNREACHABLE();
+            break;
+
+          default:
+            UNREACHABLE();
+            // TODO: Add constant folding support for other built-in operations that take 3 parameters and not handled above.
+            return nullptr;
+        }
</ins><span class="cx">     }
</span><del>-
-    infoSink.info.message(
-        EPrefixInternalError, getLine(),
-        &quot;Unary operation not folded into constant&quot;);
-    return false;
</del><ins>+    return resultArray;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // static
</span><span class="lines">@@ -1488,6 +2606,25 @@
</span><span class="cx"> 
</span><span class="cx"> void TIntermTraverser::updateTree()
</span><span class="cx"> {
</span><ins>+    for (size_t ii = 0; ii &lt; mInsertions.size(); ++ii)
+    {
+        const NodeInsertMultipleEntry &amp;insertion = mInsertions[ii];
+        ASSERT(insertion.parent);
+        if (!insertion.insertionsAfter.empty())
+        {
+            bool inserted = insertion.parent-&gt;insertChildNodes(insertion.position + 1,
+                                                               insertion.insertionsAfter);
+            ASSERT(inserted);
+            UNUSED_ASSERTION_VARIABLE(inserted);
+        }
+        if (!insertion.insertionsBefore.empty())
+        {
+            bool inserted =
+                insertion.parent-&gt;insertChildNodes(insertion.position, insertion.insertionsBefore);
+            ASSERT(inserted);
+            UNUSED_ASSERTION_VARIABLE(inserted);
+        }
+    }
</ins><span class="cx">     for (size_t ii = 0; ii &lt; mReplacements.size(); ++ii)
</span><span class="cx">     {
</span><span class="cx">         const NodeUpdateEntry &amp;replacement = mReplacements[ii];
</span><span class="lines">@@ -1520,4 +2657,8 @@
</span><span class="cx">         ASSERT(replaced);
</span><span class="cx">         UNUSED_ASSERTION_VARIABLE(replaced);
</span><span class="cx">     }
</span><ins>+
+    mInsertions.clear();
+    mReplacements.clear();
+    mMultiReplacements.clear();
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorIntermNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -41,11 +41,35 @@
</span><span class="cx"> class TInfoSink;
</span><span class="cx"> class TInfoSinkBase;
</span><span class="cx"> class TIntermRaw;
</span><ins>+class TIntermBranch;
</ins><span class="cx"> 
</span><ins>+class TSymbolTable;
+
+// Encapsulate an identifier string and track whether it is coming from the original shader code
+// (not internal) or from ANGLE (internal). Usually internal names shouldn't be decorated or hashed.
+class TName
+{
+  public:
+    POOL_ALLOCATOR_NEW_DELETE();
+    explicit TName(const TString &amp;name) : mName(name), mIsInternal(false) {}
+    TName() : mName(), mIsInternal(false) {}
+    TName(const TName &amp;) = default;
+    TName &amp;operator=(const TName &amp;) = default;
+
+    const TString &amp;getString() const { return mName; }
+    void setString(const TString &amp;string) { mName = string; }
+    bool isInternal() const { return mIsInternal; }
+    void setInternal(bool isInternal) { mIsInternal = isInternal; }
+
+  private:
+    TString mName;
+    bool mIsInternal;
+};
+
</ins><span class="cx"> //
</span><span class="cx"> // Base class for the tree nodes
</span><span class="cx"> //
</span><del>-class TIntermNode
</del><ins>+class TIntermNode : angle::NonCopyable
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     POOL_ALLOCATOR_NEW_DELETE();
</span><span class="lines">@@ -73,6 +97,7 @@
</span><span class="cx">     virtual TIntermSymbol *getAsSymbolNode() { return 0; }
</span><span class="cx">     virtual TIntermLoop *getAsLoopNode() { return 0; }
</span><span class="cx">     virtual TIntermRaw *getAsRawNode() { return 0; }
</span><ins>+    virtual TIntermBranch *getAsBranchNode() { return 0; }
</ins><span class="cx"> 
</span><span class="cx">     // Replace a child node. Return true if |original| is a child
</span><span class="cx">     // node and it is replaced; otherwise, return false.
</span><span class="lines">@@ -99,8 +124,11 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     TIntermTyped(const TType &amp;t) : mType(t)  { }
</span><del>-    virtual TIntermTyped *getAsTyped() { return this; }
</del><span class="cx"> 
</span><ins>+    virtual TIntermTyped *deepCopy() const = 0;
+
+    TIntermTyped *getAsTyped() override { return this; }
+
</ins><span class="cx">     virtual bool hasSideEffects() const = 0;
</span><span class="cx"> 
</span><span class="cx">     void setType(const TType &amp;t) { mType = t; }
</span><span class="lines">@@ -123,13 +151,14 @@
</span><span class="cx">     bool isScalar() const { return mType.isScalar(); }
</span><span class="cx">     bool isScalarInt() const { return mType.isScalarInt(); }
</span><span class="cx">     const char *getBasicString() const { return mType.getBasicString(); }
</span><del>-    const char *getQualifierString() const { return mType.getQualifierString(); }
</del><span class="cx">     TString getCompleteString() const { return mType.getCompleteString(); }
</span><span class="cx"> 
</span><span class="cx">     int getArraySize() const { return mType.getArraySize(); }
</span><span class="cx"> 
</span><span class="cx">   protected:
</span><span class="cx">     TType mType;
</span><ins>+
+    TIntermTyped(const TIntermTyped &amp;node);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -146,25 +175,23 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     TIntermLoop(TLoopType type,
</span><del>-                TIntermNode *init, TIntermTyped *cond, TIntermTyped *expr,
-                TIntermNode *body)
-        : mType(type),
-          mInit(init),
-          mCond(cond),
-          mExpr(expr),
-          mBody(body),
-          mUnrollFlag(false) { }
</del><ins>+                TIntermNode *init,
+                TIntermTyped *cond,
+                TIntermTyped *expr,
+                TIntermAggregate *body)
+        : mType(type), mInit(init), mCond(cond), mExpr(expr), mBody(body), mUnrollFlag(false)
+    {
+    }
</ins><span class="cx"> 
</span><del>-    virtual TIntermLoop *getAsLoopNode() { return this; }
-    virtual void traverse(TIntermTraverser *);
-    virtual bool replaceChildNode(
-        TIntermNode *original, TIntermNode *replacement);
</del><ins>+    TIntermLoop *getAsLoopNode() override { return this; }
+    void traverse(TIntermTraverser *it) override;
+    bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override;
</ins><span class="cx"> 
</span><span class="cx">     TLoopType getType() const { return mType; }
</span><span class="cx">     TIntermNode *getInit() { return mInit; }
</span><span class="cx">     TIntermTyped *getCondition() { return mCond; }
</span><span class="cx">     TIntermTyped *getExpression() { return mExpr; }
</span><del>-    TIntermNode *getBody() { return mBody; }
</del><ins>+    TIntermAggregate *getBody() { return mBody; }
</ins><span class="cx"> 
</span><span class="cx">     void setUnrollFlag(bool flag) { mUnrollFlag = flag; }
</span><span class="cx">     bool getUnrollFlag() const { return mUnrollFlag; }
</span><span class="lines">@@ -174,7 +201,7 @@
</span><span class="cx">     TIntermNode *mInit;  // for-loop initialization
</span><span class="cx">     TIntermTyped *mCond; // loop exit condition
</span><span class="cx">     TIntermTyped *mExpr; // for-loop expression
</span><del>-    TIntermNode *mBody;  // loop body
</del><ins>+    TIntermAggregate *mBody;  // loop body
</ins><span class="cx"> 
</span><span class="cx">     bool mUnrollFlag; // Whether the loop should be unrolled or not.
</span><span class="cx"> };
</span><span class="lines">@@ -189,9 +216,9 @@
</span><span class="cx">         : mFlowOp(op),
</span><span class="cx">           mExpression(e) { }
</span><span class="cx"> 
</span><del>-    virtual void traverse(TIntermTraverser *);
-    virtual bool replaceChildNode(
-        TIntermNode *original, TIntermNode *replacement);
</del><ins>+    void traverse(TIntermTraverser *it) override;
+    TIntermBranch *getAsBranchNode() override { return this; }
+    bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override;
</ins><span class="cx"> 
</span><span class="cx">     TOperator getFlowOp() { return mFlowOp; }
</span><span class="cx">     TIntermTyped* getExpression() { return mExpression; }
</span><span class="lines">@@ -211,31 +238,32 @@
</span><span class="cx">     // If sym comes from per process globalpoolallocator, then it causes increased memory usage
</span><span class="cx">     // per compile it is essential to use &quot;symbol = sym&quot; to assign to symbol
</span><span class="cx">     TIntermSymbol(int id, const TString &amp;symbol, const TType &amp;type)
</span><del>-        : TIntermTyped(type),
-          mId(id),
-          mInternal(false)
</del><ins>+        : TIntermTyped(type), mId(id), mSymbol(symbol)
</ins><span class="cx">     {
</span><del>-        mSymbol = symbol;
</del><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual bool hasSideEffects() const { return false; }
</del><ins>+    TIntermTyped *deepCopy() const override { return new TIntermSymbol(*this); }
</ins><span class="cx"> 
</span><ins>+    bool hasSideEffects() const override { return false; }
+
</ins><span class="cx">     int getId() const { return mId; }
</span><del>-    const TString &amp;getSymbol() const { return mSymbol; }
</del><ins>+    const TString &amp;getSymbol() const { return mSymbol.getString(); }
+    const TName &amp;getName() const { return mSymbol; }
</ins><span class="cx"> 
</span><span class="cx">     void setId(int newId) { mId = newId; }
</span><span class="cx"> 
</span><del>-    bool isInternal() const { return mInternal; }
-    void setInternal(bool isInternal) { mInternal = isInternal; }
</del><ins>+    void setInternal(bool internal) { mSymbol.setInternal(internal); }
</ins><span class="cx"> 
</span><del>-    virtual void traverse(TIntermTraverser *);
-    virtual TIntermSymbol *getAsSymbolNode() { return this; }
-    virtual bool replaceChildNode(TIntermNode *, TIntermNode *) { return false; }
</del><ins>+    void traverse(TIntermTraverser *it) override;
+    TIntermSymbol *getAsSymbolNode() override { return this; }
+    bool replaceChildNode(TIntermNode *, TIntermNode *) override { return false; }
</ins><span class="cx"> 
</span><span class="cx">   protected:
</span><span class="cx">     int mId;
</span><del>-    bool mInternal;
-    TString mSymbol;
</del><ins>+    TName mSymbol;
+
+  private:
+    TIntermSymbol(const TIntermSymbol &amp;) = default;  // Note: not deleted, just private!
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // A Raw node stores raw code, that the translator will insert verbatim
</span><span class="lines">@@ -247,31 +275,46 @@
</span><span class="cx">     TIntermRaw(const TType &amp;type, const TString &amp;rawText)
</span><span class="cx">         : TIntermTyped(type),
</span><span class="cx">           mRawText(rawText) { }
</span><ins>+    TIntermRaw(const TIntermRaw &amp;) = delete;
</ins><span class="cx"> 
</span><del>-    virtual bool hasSideEffects() const { return false; }
</del><ins>+    TIntermTyped *deepCopy() const override
+    {
+        UNREACHABLE();
+        return nullptr;
+    }
</ins><span class="cx"> 
</span><ins>+    bool hasSideEffects() const override { return false; }
+
</ins><span class="cx">     TString getRawText() const { return mRawText; }
</span><span class="cx"> 
</span><del>-    virtual void traverse(TIntermTraverser *);
</del><ins>+    void traverse(TIntermTraverser *it) override;
</ins><span class="cx"> 
</span><del>-    virtual TIntermRaw *getAsRawNode() { return this; }
-    virtual bool replaceChildNode(TIntermNode *, TIntermNode *) { return false; }
</del><ins>+    TIntermRaw *getAsRawNode() override { return this; }
+    bool replaceChildNode(TIntermNode *, TIntermNode *) override { return false; }
</ins><span class="cx"> 
</span><span class="cx">   protected:
</span><span class="cx">     TString mRawText;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+// Constant folded node.
+// Note that nodes may be constant folded and not be constant expressions with the EvqConst
+// qualifier. This happens for example when the following expression is processed:
+// &quot;true ? 1.0 : non_constant&quot;
+// Other nodes than TIntermConstantUnion may also be constant expressions.
+//
</ins><span class="cx"> class TIntermConstantUnion : public TIntermTyped
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    TIntermConstantUnion(TConstantUnion *unionPointer, const TType &amp;type)
-        : TIntermTyped(type),
-          mUnionArrayPointer(unionPointer) { }
</del><ins>+    TIntermConstantUnion(const TConstantUnion *unionPointer, const TType &amp;type)
+        : TIntermTyped(type), mUnionArrayPointer(unionPointer)
+    {
+    }
</ins><span class="cx"> 
</span><del>-    virtual bool hasSideEffects() const { return false; }
</del><ins>+    TIntermTyped *deepCopy() const override { return new TIntermConstantUnion(*this); }
</ins><span class="cx"> 
</span><ins>+    bool hasSideEffects() const override { return false; }
+
</ins><span class="cx">     const TConstantUnion *getUnionArrayPointer() const { return mUnionArrayPointer; }
</span><del>-    TConstantUnion *getUnionArrayPointer() { return mUnionArrayPointer; }
</del><span class="cx"> 
</span><span class="cx">     int getIConst(size_t index) const
</span><span class="cx">     {
</span><span class="lines">@@ -290,24 +333,33 @@
</span><span class="cx">         return mUnionArrayPointer ? mUnionArrayPointer[index].getBConst() : false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void replaceConstantUnion(TConstantUnion *safeConstantUnion)
</del><ins>+    void replaceConstantUnion(const TConstantUnion *safeConstantUnion)
</ins><span class="cx">     {
</span><span class="cx">         // Previous union pointer freed on pool deallocation.
</span><span class="cx">         mUnionArrayPointer = safeConstantUnion;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual TIntermConstantUnion *getAsConstantUnion()  { return this; }
-    virtual void traverse(TIntermTraverser *);
-    virtual bool replaceChildNode(TIntermNode *, TIntermNode *) { return false; }
</del><ins>+    TIntermConstantUnion *getAsConstantUnion() override { return this; }
+    void traverse(TIntermTraverser *it) override;
+    bool replaceChildNode(TIntermNode *, TIntermNode *) override { return false; }
</ins><span class="cx"> 
</span><del>-    TIntermTyped *fold(TOperator op, TIntermConstantUnion *rightNode, TInfoSink &amp;infoSink);
</del><ins>+    TConstantUnion *foldBinary(TOperator op, TIntermConstantUnion *rightNode, TInfoSink &amp;infoSink);
+    TConstantUnion *foldUnaryWithDifferentReturnType(TOperator op, TInfoSink &amp;infoSink);
+    TConstantUnion *foldUnaryWithSameReturnType(TOperator op, TInfoSink &amp;infoSink);
</ins><span class="cx"> 
</span><ins>+    static TConstantUnion *FoldAggregateConstructor(TIntermAggregate *aggregate,
+                                                    TInfoSink &amp;infoSink);
+    static TConstantUnion *FoldAggregateBuiltIn(TIntermAggregate *aggregate, TInfoSink &amp;infoSink);
+
</ins><span class="cx">   protected:
</span><del>-    TConstantUnion *mUnionArrayPointer;
</del><ins>+    // Same data may be shared between multiple constant unions, so it can't be modified.
+    const TConstantUnion *mUnionArrayPointer;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     typedef float(*FloatTypeUnaryFunc) (float);
</span><span class="cx">     bool foldFloatTypeUnary(const TConstantUnion &amp;parameter, FloatTypeUnaryFunc builtinFunc, TInfoSink &amp;infoSink, TConstantUnion *result) const;
</span><ins>+
+    TIntermConstantUnion(const TIntermConstantUnion &amp;node);  // Note: not deleted, just private!
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -320,9 +372,10 @@
</span><span class="cx">     void setOp(TOperator op) { mOp = op; }
</span><span class="cx"> 
</span><span class="cx">     bool isAssignment() const;
</span><ins>+    bool isMultiplication() const;
</ins><span class="cx">     bool isConstructor() const;
</span><span class="cx"> 
</span><del>-    virtual bool hasSideEffects() const { return isAssignment(); }
</del><ins>+    bool hasSideEffects() const override { return isAssignment(); }
</ins><span class="cx"> 
</span><span class="cx">   protected:
</span><span class="cx">     TIntermOperator(TOperator op)
</span><span class="lines">@@ -332,6 +385,8 @@
</span><span class="cx">         : TIntermTyped(type),
</span><span class="cx">           mOp(op) {}
</span><span class="cx"> 
</span><ins>+    TIntermOperator(const TIntermOperator &amp;) = default;
+
</ins><span class="cx">     TOperator mOp;
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -345,12 +400,13 @@
</span><span class="cx">         : TIntermOperator(op),
</span><span class="cx">           mAddIndexClamp(false) {}
</span><span class="cx"> 
</span><del>-    virtual TIntermBinary *getAsBinaryNode() { return this; }
-    virtual void traverse(TIntermTraverser *);
-    virtual bool replaceChildNode(
-        TIntermNode *original, TIntermNode *replacement);
</del><ins>+    TIntermTyped *deepCopy() const override { return new TIntermBinary(*this); }
</ins><span class="cx"> 
</span><del>-    virtual bool hasSideEffects() const
</del><ins>+    TIntermBinary *getAsBinaryNode() override { return this; };
+    void traverse(TIntermTraverser *it) override;
+    bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override;
+
+    bool hasSideEffects() const override
</ins><span class="cx">     {
</span><span class="cx">         return isAssignment() || mLeft-&gt;hasSideEffects() || mRight-&gt;hasSideEffects();
</span><span class="cx">     }
</span><span class="lines">@@ -360,6 +416,7 @@
</span><span class="cx">     TIntermTyped *getLeft() const { return mLeft; }
</span><span class="cx">     TIntermTyped *getRight() const { return mRight; }
</span><span class="cx">     bool promote(TInfoSink &amp;);
</span><ins>+    TIntermTyped *fold(TInfoSink &amp;infoSink);
</ins><span class="cx"> 
</span><span class="cx">     void setAddIndexClamp() { mAddIndexClamp = true; }
</span><span class="cx">     bool getAddIndexClamp() { return mAddIndexClamp; }
</span><span class="lines">@@ -370,6 +427,9 @@
</span><span class="cx"> 
</span><span class="cx">     // If set to true, wrap any EOpIndexIndirect with a clamp to bounds.
</span><span class="cx">     bool mAddIndexClamp;
</span><ins>+
+  private:
+    TIntermBinary(const TIntermBinary &amp;node);  // Note: not deleted, just private!
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -387,19 +447,18 @@
</span><span class="cx">           mOperand(NULL),
</span><span class="cx">           mUseEmulatedFunction(false) {}
</span><span class="cx"> 
</span><del>-    virtual void traverse(TIntermTraverser *);
-    virtual TIntermUnary *getAsUnaryNode() { return this; }
-    virtual bool replaceChildNode(
-        TIntermNode *original, TIntermNode *replacement);
</del><ins>+    TIntermTyped *deepCopy() const override { return new TIntermUnary(*this); }
</ins><span class="cx"> 
</span><del>-    virtual bool hasSideEffects() const
-    {
-        return isAssignment() || mOperand-&gt;hasSideEffects();
-    }
</del><ins>+    void traverse(TIntermTraverser *it) override;
+    TIntermUnary *getAsUnaryNode() override { return this; }
+    bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override;
</ins><span class="cx"> 
</span><ins>+    bool hasSideEffects() const override { return isAssignment() || mOperand-&gt;hasSideEffects(); }
+
</ins><span class="cx">     void setOperand(TIntermTyped *operand) { mOperand = operand; }
</span><span class="cx">     TIntermTyped *getOperand() { return mOperand; }
</span><span class="cx">     void promote(const TType *funcReturnType);
</span><ins>+    TIntermTyped *fold(TInfoSink &amp;infoSink);
</ins><span class="cx"> 
</span><span class="cx">     void setUseEmulatedFunction() { mUseEmulatedFunction = true; }
</span><span class="cx">     bool getUseEmulatedFunction() { return mUseEmulatedFunction; }
</span><span class="lines">@@ -410,6 +469,9 @@
</span><span class="cx">     // If set to true, replace the built-in function call with an emulated one
</span><span class="cx">     // to work around driver bugs.
</span><span class="cx">     bool mUseEmulatedFunction;
</span><ins>+
+  private:
+    TIntermUnary(const TIntermUnary &amp;node);  // note: not deleted, just private!
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> typedef TVector&lt;TIntermNode *&gt; TIntermSequence;
</span><span class="lines">@@ -424,56 +486,68 @@
</span><span class="cx">     TIntermAggregate()
</span><span class="cx">         : TIntermOperator(EOpNull),
</span><span class="cx">           mUserDefined(false),
</span><del>-          mUseEmulatedFunction(false) { }
</del><ins>+          mUseEmulatedFunction(false),
+          mGotPrecisionFromChildren(false)
+    {
+    }
</ins><span class="cx">     TIntermAggregate(TOperator op)
</span><span class="cx">         : TIntermOperator(op),
</span><del>-          mUseEmulatedFunction(false) { }
</del><ins>+          mUseEmulatedFunction(false),
+          mGotPrecisionFromChildren(false)
+    {
+    }
</ins><span class="cx">     ~TIntermAggregate() { }
</span><span class="cx"> 
</span><del>-    virtual TIntermAggregate *getAsAggregate() { return this; }
-    virtual void traverse(TIntermTraverser *);
-    virtual bool replaceChildNode(
-        TIntermNode *original, TIntermNode *replacement);
</del><ins>+    // Note: only supported for nodes that can be a part of an expression.
+    TIntermTyped *deepCopy() const override { return new TIntermAggregate(*this); }
+
+    TIntermAggregate *getAsAggregate() override { return this; }
+    void traverse(TIntermTraverser *it) override;
+    bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override;
</ins><span class="cx">     bool replaceChildNodeWithMultiple(TIntermNode *original, TIntermSequence replacements);
</span><ins>+    bool insertChildNodes(TIntermSequence::size_type position, TIntermSequence insertions);
</ins><span class="cx">     // Conservatively assume function calls and other aggregate operators have side-effects
</span><del>-    virtual bool hasSideEffects() const { return true; }
</del><ins>+    bool hasSideEffects() const override { return true; }
+    TIntermTyped *fold(TInfoSink &amp;infoSink);
</ins><span class="cx"> 
</span><span class="cx">     TIntermSequence *getSequence() { return &amp;mSequence; }
</span><span class="cx"> 
</span><del>-    void setName(const TString &amp;name) { mName = name; }
-    const TString &amp;getName() const { return mName; }
</del><ins>+    void setNameObj(const TName &amp;name) { mName = name; }
+    const TName &amp;getNameObj() const { return mName; }
</ins><span class="cx"> 
</span><ins>+    void setName(const TString &amp;name) { mName.setString(name); }
+    const TString &amp;getName() const { return mName.getString(); }
+
</ins><span class="cx">     void setUserDefined() { mUserDefined = true; }
</span><span class="cx">     bool isUserDefined() const { return mUserDefined; }
</span><span class="cx"> 
</span><del>-    void setOptimize(bool optimize) { mOptimize = optimize; }
-    bool getOptimize() const { return mOptimize; }
-    void setDebug(bool debug) { mDebug = debug; }
-    bool getDebug() const { return mDebug; }
-
</del><span class="cx">     void setFunctionId(int functionId) { mFunctionId = functionId; }
</span><span class="cx">     int getFunctionId() const { return mFunctionId; }
</span><span class="cx"> 
</span><span class="cx">     void setUseEmulatedFunction() { mUseEmulatedFunction = true; }
</span><span class="cx">     bool getUseEmulatedFunction() { return mUseEmulatedFunction; }
</span><span class="cx"> 
</span><ins>+    bool areChildrenConstQualified();
</ins><span class="cx">     void setPrecisionFromChildren();
</span><span class="cx">     void setBuiltInFunctionPrecision();
</span><span class="cx"> 
</span><ins>+    // Returns true if changing parameter precision may affect the return value.
+    bool gotPrecisionFromChildren() const { return mGotPrecisionFromChildren; }
+
</ins><span class="cx">   protected:
</span><del>-    TIntermAggregate(const TIntermAggregate &amp;); // disallow copy constructor
-    TIntermAggregate &amp;operator=(const TIntermAggregate &amp;); // disallow assignment operator
</del><span class="cx">     TIntermSequence mSequence;
</span><del>-    TString mName;
</del><ins>+    TName mName;
</ins><span class="cx">     bool mUserDefined; // used for user defined function names
</span><span class="cx">     int mFunctionId;
</span><span class="cx"> 
</span><del>-    bool mOptimize;
-    bool mDebug;
-
</del><span class="cx">     // If set to true, replace the built-in function call with an emulated one
</span><span class="cx">     // to work around driver bugs.
</span><span class="cx">     bool mUseEmulatedFunction;
</span><ins>+
+    bool mGotPrecisionFromChildren;
+
+  private:
+    TIntermAggregate(const TIntermAggregate &amp;node);  // note: not deleted, just private!
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -494,23 +568,28 @@
</span><span class="cx">           mTrueBlock(trueB),
</span><span class="cx">           mFalseBlock(falseB) {}
</span><span class="cx"> 
</span><del>-    virtual void traverse(TIntermTraverser *);
-    virtual bool replaceChildNode(
-        TIntermNode *original, TIntermNode *replacement);
</del><ins>+    // Note: only supported for ternary operator nodes.
+    TIntermTyped *deepCopy() const override { return new TIntermSelection(*this); }
</ins><span class="cx"> 
</span><ins>+    void traverse(TIntermTraverser *it) override;
+    bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override;
+
</ins><span class="cx">     // Conservatively assume selections have side-effects
</span><del>-    virtual bool hasSideEffects() const { return true; }
</del><ins>+    bool hasSideEffects() const override { return true; }
</ins><span class="cx"> 
</span><span class="cx">     bool usesTernaryOperator() const { return getBasicType() != EbtVoid; }
</span><span class="cx">     TIntermNode *getCondition() const { return mCondition; }
</span><span class="cx">     TIntermNode *getTrueBlock() const { return mTrueBlock; }
</span><span class="cx">     TIntermNode *getFalseBlock() const { return mFalseBlock; }
</span><del>-    TIntermSelection *getAsSelectionNode() { return this; }
</del><ins>+    TIntermSelection *getAsSelectionNode() override { return this; }
</ins><span class="cx"> 
</span><del>-protected:
</del><ins>+  protected:
</ins><span class="cx">     TIntermTyped *mCondition;
</span><span class="cx">     TIntermNode *mTrueBlock;
</span><span class="cx">     TIntermNode *mFalseBlock;
</span><ins>+
+  private:
+    TIntermSelection(const TIntermSelection &amp;node);  // Note: not deleted, just private!
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -532,6 +611,7 @@
</span><span class="cx"> 
</span><span class="cx">     TIntermSwitch *getAsSwitchNode() override { return this; }
</span><span class="cx"> 
</span><ins>+    TIntermTyped *getInit() { return mInit; }
</ins><span class="cx">     TIntermAggregate *getStatementList() { return mStatementList; }
</span><span class="cx">     void setStatementList(TIntermAggregate *statementList) { mStatementList = statementList; }
</span><span class="cx"> 
</span><span class="lines">@@ -573,10 +653,13 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><del>-// For traversing the tree.  User should derive from this,
-// put their traversal specific data in it, and then pass
-// it to a Traverse method.
</del><ins>+// For traversing the tree.  User should derive from this class overriding the visit functions,
+// and then pass an object of the subclass to a traverse method of a node.
</ins><span class="cx"> //
</span><ins>+// The traverse*() functions may also be overridden do other bookkeeping on the tree to provide
+// contextual information to the visit functions, such as whether the node is the target of an
+// assignment.
+//
</ins><span class="cx"> // When using this, just fill in the methods for nodes you want visited.
</span><span class="cx"> // Return false from a pre-visit to skip visiting that node's subtree.
</span><span class="cx"> //
</span><span class="lines">@@ -584,31 +667,59 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     POOL_ALLOCATOR_NEW_DELETE();
</span><del>-    // TODO(zmo): remove default values.
-    TIntermTraverser(bool preVisit = true, bool inVisit = false, bool postVisit = false,
-                     bool rightToLeft = false)
</del><ins>+    TIntermTraverser(bool preVisit, bool inVisit, bool postVisit)
</ins><span class="cx">         : preVisit(preVisit),
</span><span class="cx">           inVisit(inVisit),
</span><span class="cx">           postVisit(postVisit),
</span><del>-          rightToLeft(rightToLeft),
</del><span class="cx">           mDepth(0),
</span><del>-          mMaxDepth(0) {}
</del><ins>+          mMaxDepth(0),
+          mTemporaryIndex(nullptr)
+    {
+    }
</ins><span class="cx">     virtual ~TIntermTraverser() {}
</span><span class="cx"> 
</span><del>-    virtual void visitSymbol(TIntermSymbol *) {}
-    virtual void visitRaw(TIntermRaw *) {}
-    virtual void visitConstantUnion(TIntermConstantUnion *) {}
-    virtual bool visitBinary(Visit, TIntermBinary *) { return true; }
-    virtual bool visitUnary(Visit, TIntermUnary *) { return true; }
-    virtual bool visitSelection(Visit, TIntermSelection *) { return true; }
-    virtual bool visitSwitch(Visit, TIntermSwitch *) { return true; }
-    virtual bool visitCase(Visit, TIntermCase *) { return true; }
-    virtual bool visitAggregate(Visit, TIntermAggregate *) { return true; }
-    virtual bool visitLoop(Visit, TIntermLoop *) { return true; }
-    virtual bool visitBranch(Visit, TIntermBranch *) { return true; }
</del><ins>+    virtual void visitSymbol(TIntermSymbol *node) {}
+    virtual void visitRaw(TIntermRaw *node) {}
+    virtual void visitConstantUnion(TIntermConstantUnion *node) {}
+    virtual bool visitBinary(Visit visit, TIntermBinary *node) { return true; }
+    virtual bool visitUnary(Visit visit, TIntermUnary *node) { return true; }
+    virtual bool visitSelection(Visit visit, TIntermSelection *node) { return true; }
+    virtual bool visitSwitch(Visit visit, TIntermSwitch *node) { return true; }
+    virtual bool visitCase(Visit visit, TIntermCase *node) { return true; }
+    virtual bool visitAggregate(Visit visit, TIntermAggregate *node) { return true; }
+    virtual bool visitLoop(Visit visit, TIntermLoop *node) { return true; }
+    virtual bool visitBranch(Visit visit, TIntermBranch *node) { return true; }
</ins><span class="cx"> 
</span><ins>+    // The traverse functions contain logic for iterating over the children of the node
+    // and calling the visit functions in the appropriate places. They also track some
+    // context that may be used by the visit functions.
+    virtual void traverseSymbol(TIntermSymbol *node);
+    virtual void traverseRaw(TIntermRaw *node);
+    virtual void traverseConstantUnion(TIntermConstantUnion *node);
+    virtual void traverseBinary(TIntermBinary *node);
+    virtual void traverseUnary(TIntermUnary *node);
+    virtual void traverseSelection(TIntermSelection *node);
+    virtual void traverseSwitch(TIntermSwitch *node);
+    virtual void traverseCase(TIntermCase *node);
+    virtual void traverseAggregate(TIntermAggregate *node);
+    virtual void traverseLoop(TIntermLoop *node);
+    virtual void traverseBranch(TIntermBranch *node);
+
</ins><span class="cx">     int getMaxDepth() const { return mMaxDepth; }
</span><span class="cx"> 
</span><ins>+    // Return the original name if hash function pointer is NULL;
+    // otherwise return the hashed name.
+    static TString hash(const TString &amp;name, ShHashFunction64 hashFunction);
+
+    // If traversers need to replace nodes, they can add the replacements in
+    // mReplacements/mMultiReplacements during traversal and the user of the traverser should call
+    // this function after traversal to perform them.
+    void updateTree();
+
+    // Start creating temporary symbols from the given temporary symbol index + 1.
+    void useTemporaryIndex(unsigned int *temporaryIndex);
+
+  protected:
</ins><span class="cx">     void incrementDepth(TIntermNode *current)
</span><span class="cx">     {
</span><span class="cx">         mDepth++;
</span><span class="lines">@@ -627,21 +738,29 @@
</span><span class="cx">         return mPath.size() == 0 ? NULL : mPath.back();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Return the original name if hash function pointer is NULL;
-    // otherwise return the hashed name.
-    static TString hash(const TString&amp; name, ShHashFunction64 hashFunction);
</del><ins>+    // Return the nth ancestor of the node being traversed. getAncestorNode(0) == getParentNode()
+    TIntermNode *getAncestorNode(unsigned int n)
+    {
+        if (mPath.size() &gt; n)
+        {
+            return mPath[mPath.size() - n - 1u];
+        }
+        return nullptr;
+    }
</ins><span class="cx"> 
</span><ins>+    void pushParentBlock(TIntermAggregate *node);
+    void incrementParentBlockPos();
+    void popParentBlock();
+
+    bool parentNodeIsBlock()
+    {
+        return !mParentBlockStack.empty() &amp;&amp; getParentNode() == mParentBlockStack.back().node;
+    }
+
</ins><span class="cx">     const bool preVisit;
</span><span class="cx">     const bool inVisit;
</span><span class="cx">     const bool postVisit;
</span><del>-    const bool rightToLeft;
</del><span class="cx"> 
</span><del>-    // If traversers need to replace nodes, they can add the replacements in
-    // mReplacements/mMultiReplacements during traversal and the user of the traverser should call
-    // this function after traversal to perform them.
-    void updateTree();
-
-  protected:
</del><span class="cx">     int mDepth;
</span><span class="cx">     int mMaxDepth;
</span><span class="cx"> 
</span><span class="lines">@@ -681,13 +800,153 @@
</span><span class="cx">         TIntermSequence replacements;
</span><span class="cx">     };
</span><span class="cx"> 
</span><ins>+    // To insert multiple nodes on the parent aggregate node
+    struct NodeInsertMultipleEntry
+    {
+        NodeInsertMultipleEntry(TIntermAggregate *_parent,
+                                TIntermSequence::size_type _position,
+                                TIntermSequence _insertionsBefore,
+                                TIntermSequence _insertionsAfter)
+            : parent(_parent),
+              position(_position),
+              insertionsBefore(_insertionsBefore),
+              insertionsAfter(_insertionsAfter)
+        {
+        }
+
+        TIntermAggregate *parent;
+        TIntermSequence::size_type position;
+        TIntermSequence insertionsBefore;
+        TIntermSequence insertionsAfter;
+    };
+
</ins><span class="cx">     // During traversing, save all the changes that need to happen into
</span><span class="cx">     // mReplacements/mMultiReplacements, then do them by calling updateTree().
</span><span class="cx">     // Multi replacements are processed after single replacements.
</span><span class="cx">     std::vector&lt;NodeUpdateEntry&gt; mReplacements;
</span><span class="cx">     std::vector&lt;NodeReplaceWithMultipleEntry&gt; mMultiReplacements;
</span><ins>+    std::vector&lt;NodeInsertMultipleEntry&gt; mInsertions;
+
+    // Helper to insert statements in the parent block (sequence) of the node currently being traversed.
+    // The statements will be inserted before the node being traversed once updateTree is called.
+    // Should only be called during PreVisit or PostVisit from sequence nodes.
+    // Note that inserting more than one set of nodes to the same parent node on a single updateTree call is not
+    // supported.
+    void insertStatementsInParentBlock(const TIntermSequence &amp;insertions);
+
+    // Same as above, but supports simultaneous insertion of statements before and after the node
+    // currently being traversed.
+    void insertStatementsInParentBlock(const TIntermSequence &amp;insertionsBefore,
+                                       const TIntermSequence &amp;insertionsAfter);
+
+    // Helper to create a temporary symbol node with the given qualifier.
+    TIntermSymbol *createTempSymbol(const TType &amp;type, TQualifier qualifier);
+    // Helper to create a temporary symbol node.
+    TIntermSymbol *createTempSymbol(const TType &amp;type);
+    // Create a node that declares but doesn't initialize a temporary symbol.
+    TIntermAggregate *createTempDeclaration(const TType &amp;type);
+    // Create a node that initializes the current temporary symbol with initializer having the given qualifier.
+    TIntermAggregate *createTempInitDeclaration(TIntermTyped *initializer, TQualifier qualifier);
+    // Create a node that initializes the current temporary symbol with initializer.
+    TIntermAggregate *createTempInitDeclaration(TIntermTyped *initializer);
+    // Create a node that assigns rightNode to the current temporary symbol.
+    TIntermBinary *createTempAssignment(TIntermTyped *rightNode);
+    // Increment temporary symbol index.
+    void nextTemporaryIndex();
+
+  private:
+    struct ParentBlock
+    {
+        ParentBlock(TIntermAggregate *nodeIn, TIntermSequence::size_type posIn)
+            : node(nodeIn),
+              pos(posIn)
+        {
+        }
+
+        TIntermAggregate *node;
+        TIntermSequence::size_type pos;
+    };
+    // All the code blocks from the root to the current node's parent during traversal.
+    std::vector&lt;ParentBlock&gt; mParentBlockStack;
+
+    unsigned int *mTemporaryIndex;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+// Traverser parent class that tracks where a node is a destination of a write operation and so is
+// required to be an l-value.
+class TLValueTrackingTraverser : public TIntermTraverser
+{
+  public:
+    TLValueTrackingTraverser(bool preVisit,
+                             bool inVisit,
+                             bool postVisit,
+                             const TSymbolTable &amp;symbolTable,
+                             int shaderVersion)
+        : TIntermTraverser(preVisit, inVisit, postVisit),
+          mOperatorRequiresLValue(false),
+          mInFunctionCallOutParameter(false),
+          mSymbolTable(symbolTable),
+          mShaderVersion(shaderVersion)
+    {
+    }
+    virtual ~TLValueTrackingTraverser() {}
+
+    void traverseBinary(TIntermBinary *node) override;
+    void traverseUnary(TIntermUnary *node) override;
+    void traverseAggregate(TIntermAggregate *node) override;
+
+  protected:
+    bool isLValueRequiredHere() const
+    {
+        return mOperatorRequiresLValue || mInFunctionCallOutParameter;
+    }
+
+    // Return true if the prototype or definition of the function being called has been encountered
+    // during traversal.
+    bool isInFunctionMap(const TIntermAggregate *callNode) const;
+
+  private:
+    // Track whether an l-value is required in the node that is currently being traversed by the
+    // surrounding operator.
+    // Use isLValueRequiredHere to check all conditions which require an l-value.
+    void setOperatorRequiresLValue(bool lValueRequired)
+    {
+        mOperatorRequiresLValue = lValueRequired;
+    }
+    bool operatorRequiresLValue() const { return mOperatorRequiresLValue; }
+
+    // Add a function encountered during traversal to the function map.
+    void addToFunctionMap(const TName &amp;name, TIntermSequence *paramSequence);
+
+    // Return the parameters sequence from the function definition or prototype.
+    TIntermSequence *getFunctionParameters(const TIntermAggregate *callNode);
+
+    // Track whether an l-value is required inside a function call.
+    void setInFunctionCallOutParameter(bool inOutParameter);
+    bool isInFunctionCallOutParameter() const;
+
+    bool mOperatorRequiresLValue;
+    bool mInFunctionCallOutParameter;
+
+    struct TNameComparator
+    {
+        bool operator()(const TName &amp;a, const TName &amp;b) const
+        {
+            int compareResult = a.getString().compare(b.getString());
+            if (compareResult != 0)
+                return compareResult &lt; 0;
+            // Internal functions may have same names as non-internal functions.
+            return !a.isInternal() &amp;&amp; b.isInternal();
+        }
+    };
+
+    // Map from mangled function names to their parameter sequences
+    TMap&lt;TName, TIntermSequence *, TNameComparator&gt; mFunctionMap;
+
+    const TSymbolTable &amp;mSymbolTable;
+    const int mShaderVersion;
+};
+
</ins><span class="cx"> //
</span><span class="cx"> // For traversing the tree, and computing max depth.
</span><span class="cx"> // Takes a maximum depth limit to prevent stack overflow.
</span><span class="lines">@@ -697,15 +956,15 @@
</span><span class="cx">   public:
</span><span class="cx">     POOL_ALLOCATOR_NEW_DELETE();
</span><span class="cx">     TMaxDepthTraverser(int depthLimit)
</span><del>-        : TIntermTraverser(true, true, false, false),
</del><ins>+        : TIntermTraverser(true, true, false),
</ins><span class="cx">           mDepthLimit(depthLimit) { }
</span><span class="cx"> 
</span><del>-    virtual bool visitBinary(Visit, TIntermBinary *) { return depthCheck(); }
-    virtual bool visitUnary(Visit, TIntermUnary *) { return depthCheck(); }
-    virtual bool visitSelection(Visit, TIntermSelection *) { return depthCheck(); }
-    virtual bool visitAggregate(Visit, TIntermAggregate *) { return depthCheck(); }
-    virtual bool visitLoop(Visit, TIntermLoop *) { return depthCheck(); }
-    virtual bool visitBranch(Visit, TIntermBranch *) { return depthCheck(); }
</del><ins>+    bool visitBinary(Visit, TIntermBinary *) override { return depthCheck(); }
+    bool visitUnary(Visit, TIntermUnary *) override { return depthCheck(); }
+    bool visitSelection(Visit, TIntermSelection *) override { return depthCheck(); }
+    bool visitAggregate(Visit, TIntermAggregate *) override { return depthCheck(); }
+    bool visitLoop(Visit, TIntermLoop *) override { return depthCheck(); }
+    bool visitBranch(Visit, TIntermBranch *) override { return depthCheck(); }
</ins><span class="cx"> 
</span><span class="cx">   protected:
</span><span class="cx">     bool depthCheck() const { return mMaxDepth &lt; mDepthLimit; }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorIntermTraversecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermTraverse.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermTraverse.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/IntermTraverse.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -5,7 +5,188 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/IntermNode.h&quot;
</span><ins>+#include &quot;compiler/translator/InfoSink.h&quot;
+#include &quot;compiler/translator/SymbolTable.h&quot;
</ins><span class="cx"> 
</span><ins>+void TIntermSymbol::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseSymbol(this);
+}
+
+void TIntermRaw::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseRaw(this);
+}
+
+void TIntermConstantUnion::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseConstantUnion(this);
+}
+
+void TIntermBinary::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseBinary(this);
+}
+
+void TIntermUnary::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseUnary(this);
+}
+
+void TIntermSelection::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseSelection(this);
+}
+
+void TIntermSwitch::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseSwitch(this);
+}
+
+void TIntermCase::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseCase(this);
+}
+
+void TIntermAggregate::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseAggregate(this);
+}
+
+void TIntermLoop::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseLoop(this);
+}
+
+void TIntermBranch::traverse(TIntermTraverser *it)
+{
+    it-&gt;traverseBranch(this);
+}
+
+void TIntermTraverser::pushParentBlock(TIntermAggregate *node)
+{
+    mParentBlockStack.push_back(ParentBlock(node, 0));
+}
+
+void TIntermTraverser::incrementParentBlockPos()
+{
+    ++mParentBlockStack.back().pos;
+}
+
+void TIntermTraverser::popParentBlock()
+{
+    ASSERT(!mParentBlockStack.empty());
+    mParentBlockStack.pop_back();
+}
+
+void TIntermTraverser::insertStatementsInParentBlock(const TIntermSequence &amp;insertions)
+{
+    TIntermSequence emptyInsertionsAfter;
+    insertStatementsInParentBlock(insertions, emptyInsertionsAfter);
+}
+
+void TIntermTraverser::insertStatementsInParentBlock(const TIntermSequence &amp;insertionsBefore,
+                                                     const TIntermSequence &amp;insertionsAfter)
+{
+    ASSERT(!mParentBlockStack.empty());
+    NodeInsertMultipleEntry insert(mParentBlockStack.back().node, mParentBlockStack.back().pos,
+                                   insertionsBefore, insertionsAfter);
+    mInsertions.push_back(insert);
+}
+
+TIntermSymbol *TIntermTraverser::createTempSymbol(const TType &amp;type, TQualifier qualifier)
+{
+    // Each traversal uses at most one temporary variable, so the index stays the same within a single traversal.
+    TInfoSinkBase symbolNameOut;
+    ASSERT(mTemporaryIndex != nullptr);
+    symbolNameOut &lt;&lt; &quot;s&quot; &lt;&lt; (*mTemporaryIndex);
+    TString symbolName = symbolNameOut.c_str();
+
+    TIntermSymbol *node = new TIntermSymbol(0, symbolName, type);
+    node-&gt;setInternal(true);
+    node-&gt;getTypePointer()-&gt;setQualifier(qualifier);
+    return node;
+}
+
+TIntermSymbol *TIntermTraverser::createTempSymbol(const TType &amp;type)
+{
+    return createTempSymbol(type, EvqTemporary);
+}
+
+TIntermAggregate *TIntermTraverser::createTempDeclaration(const TType &amp;type)
+{
+    TIntermAggregate *tempDeclaration = new TIntermAggregate(EOpDeclaration);
+    tempDeclaration-&gt;getSequence()-&gt;push_back(createTempSymbol(type));
+    return tempDeclaration;
+}
+
+TIntermAggregate *TIntermTraverser::createTempInitDeclaration(TIntermTyped *initializer, TQualifier qualifier)
+{
+    ASSERT(initializer != nullptr);
+    TIntermSymbol *tempSymbol = createTempSymbol(initializer-&gt;getType(), qualifier);
+    TIntermAggregate *tempDeclaration = new TIntermAggregate(EOpDeclaration);
+    TIntermBinary *tempInit = new TIntermBinary(EOpInitialize);
+    tempInit-&gt;setLeft(tempSymbol);
+    tempInit-&gt;setRight(initializer);
+    tempInit-&gt;setType(tempSymbol-&gt;getType());
+    tempDeclaration-&gt;getSequence()-&gt;push_back(tempInit);
+    return tempDeclaration;
+}
+
+TIntermAggregate *TIntermTraverser::createTempInitDeclaration(TIntermTyped *initializer)
+{
+    return createTempInitDeclaration(initializer, EvqTemporary);
+}
+
+TIntermBinary *TIntermTraverser::createTempAssignment(TIntermTyped *rightNode)
+{
+    ASSERT(rightNode != nullptr);
+    TIntermSymbol *tempSymbol = createTempSymbol(rightNode-&gt;getType());
+    TIntermBinary *assignment = new TIntermBinary(EOpAssign);
+    assignment-&gt;setLeft(tempSymbol);
+    assignment-&gt;setRight(rightNode);
+    assignment-&gt;setType(tempSymbol-&gt;getType());
+    return assignment;
+}
+
+void TIntermTraverser::useTemporaryIndex(unsigned int *temporaryIndex)
+{
+    mTemporaryIndex = temporaryIndex;
+}
+
+void TIntermTraverser::nextTemporaryIndex()
+{
+    ASSERT(mTemporaryIndex != nullptr);
+    ++(*mTemporaryIndex);
+}
+
+void TLValueTrackingTraverser::addToFunctionMap(const TName &amp;name, TIntermSequence *paramSequence)
+{
+    mFunctionMap[name] = paramSequence;
+}
+
+bool TLValueTrackingTraverser::isInFunctionMap(const TIntermAggregate *callNode) const
+{
+    ASSERT(callNode-&gt;getOp() == EOpFunctionCall);
+    return (mFunctionMap.find(callNode-&gt;getNameObj()) != mFunctionMap.end());
+}
+
+TIntermSequence *TLValueTrackingTraverser::getFunctionParameters(const TIntermAggregate *callNode)
+{
+    ASSERT(isInFunctionMap(callNode));
+    return mFunctionMap[callNode-&gt;getNameObj()];
+}
+
+void TLValueTrackingTraverser::setInFunctionCallOutParameter(bool inOutParameter)
+{
+    mInFunctionCallOutParameter = inOutParameter;
+}
+
+bool TLValueTrackingTraverser::isInFunctionCallOutParameter() const
+{
+    return mInFunctionCallOutParameter;
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // Traverse the intermediate representation tree, and
</span><span class="cx"> // call a node type specific function for each node.
</span><span class="lines">@@ -16,308 +197,473 @@
</span><span class="cx"> // if preVisit is turned on and the type specific function
</span><span class="cx"> // returns false.
</span><span class="cx"> //
</span><del>-// preVisit, postVisit, and rightToLeft control what order
-// nodes are visited in.
-//
</del><span class="cx"> 
</span><span class="cx"> //
</span><span class="cx"> // Traversal functions for terminals are straighforward....
</span><span class="cx"> //
</span><del>-void TIntermSymbol::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseSymbol(TIntermSymbol *node)
</ins><span class="cx"> {
</span><del>-    it-&gt;visitSymbol(this);
</del><ins>+    visitSymbol(node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TIntermConstantUnion::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseConstantUnion(TIntermConstantUnion *node)
</ins><span class="cx"> {
</span><del>-    it-&gt;visitConstantUnion(this);
</del><ins>+    visitConstantUnion(node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="cx"> // Traverse a binary node.
</span><span class="cx"> //
</span><del>-void TIntermBinary::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseBinary(TIntermBinary *node)
</ins><span class="cx"> {
</span><span class="cx">     bool visit = true;
</span><span class="cx"> 
</span><span class="cx">     //
</span><span class="cx">     // visit the node before children if pre-visiting.
</span><span class="cx">     //
</span><del>-    if (it-&gt;preVisit)
-        visit = it-&gt;visitBinary(PreVisit, this);
</del><ins>+    if (preVisit)
+        visit = visitBinary(PreVisit, node);
</ins><span class="cx"> 
</span><span class="cx">     //
</span><span class="cx">     // Visit the children, in the right order.
</span><span class="cx">     //
</span><span class="cx">     if (visit)
</span><span class="cx">     {
</span><del>-        it-&gt;incrementDepth(this);
</del><ins>+        incrementDepth(node);
</ins><span class="cx"> 
</span><del>-        if (it-&gt;rightToLeft)
-        {
-            if (mRight)
-                mRight-&gt;traverse(it);
</del><ins>+        if (node-&gt;getLeft())
+            node-&gt;getLeft()-&gt;traverse(this);
</ins><span class="cx"> 
</span><del>-            if (it-&gt;inVisit)
-                visit = it-&gt;visitBinary(InVisit, this);
</del><ins>+        if (inVisit)
+            visit = visitBinary(InVisit, node);
</ins><span class="cx"> 
</span><del>-            if (visit &amp;&amp; mLeft)
-                mLeft-&gt;traverse(it);
</del><ins>+        if (visit &amp;&amp; node-&gt;getRight())
+            node-&gt;getRight()-&gt;traverse(this);
+
+        decrementDepth();
+    }
+
+    //
+    // Visit the node after the children, if requested and the traversal
+    // hasn't been cancelled yet.
+    //
+    if (visit &amp;&amp; postVisit)
+        visitBinary(PostVisit, node);
+}
+
+void TLValueTrackingTraverser::traverseBinary(TIntermBinary *node)
+{
+    bool visit = true;
+
+    //
+    // visit the node before children if pre-visiting.
+    //
+    if (preVisit)
+        visit = visitBinary(PreVisit, node);
+
+    //
+    // Visit the children, in the right order.
+    //
+    if (visit)
+    {
+        incrementDepth(node);
+
+        // Some binary operations like indexing can be inside an expression which must be an
+        // l-value.
+        bool parentOperatorRequiresLValue     = operatorRequiresLValue();
+        bool parentInFunctionCallOutParameter = isInFunctionCallOutParameter();
+        if (node-&gt;isAssignment())
+        {
+            ASSERT(!isLValueRequiredHere());
+            setOperatorRequiresLValue(true);
</ins><span class="cx">         }
</span><del>-        else
-        {
-            if (mLeft)
-                mLeft-&gt;traverse(it);
</del><span class="cx"> 
</span><del>-            if (it-&gt;inVisit)
-                visit = it-&gt;visitBinary(InVisit, this);
</del><ins>+        if (node-&gt;getLeft())
+            node-&gt;getLeft()-&gt;traverse(this);
</ins><span class="cx"> 
</span><del>-            if (visit &amp;&amp; mRight)
-                mRight-&gt;traverse(it);
</del><ins>+        if (inVisit)
+            visit = visitBinary(InVisit, node);
+
+        if (node-&gt;isAssignment())
+            setOperatorRequiresLValue(false);
+
+        // Index is not required to be an l-value even when the surrounding expression is required
+        // to be an l-value.
+        TOperator op = node-&gt;getOp();
+        if (op == EOpIndexDirect || op == EOpIndexDirectInterfaceBlock ||
+            op == EOpIndexDirectStruct || op == EOpIndexIndirect)
+        {
+            setOperatorRequiresLValue(false);
+            setInFunctionCallOutParameter(false);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        it-&gt;decrementDepth();
</del><ins>+        if (visit &amp;&amp; node-&gt;getRight())
+            node-&gt;getRight()-&gt;traverse(this);
+
+        setOperatorRequiresLValue(parentOperatorRequiresLValue);
+        setInFunctionCallOutParameter(parentInFunctionCallOutParameter);
+
+        decrementDepth();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     //
</span><span class="cx">     // Visit the node after the children, if requested and the traversal
</span><span class="cx">     // hasn't been cancelled yet.
</span><span class="cx">     //
</span><del>-    if (visit &amp;&amp; it-&gt;postVisit)
-        it-&gt;visitBinary(PostVisit, this);
</del><ins>+    if (visit &amp;&amp; postVisit)
+        visitBinary(PostVisit, node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="cx"> // Traverse a unary node.  Same comments in binary node apply here.
</span><span class="cx"> //
</span><del>-void TIntermUnary::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseUnary(TIntermUnary *node)
</ins><span class="cx"> {
</span><span class="cx">     bool visit = true;
</span><span class="cx"> 
</span><del>-    if (it-&gt;preVisit)
-        visit = it-&gt;visitUnary(PreVisit, this);
</del><ins>+    if (preVisit)
+        visit = visitUnary(PreVisit, node);
</ins><span class="cx"> 
</span><del>-    if (visit) {
-        it-&gt;incrementDepth(this);
-        mOperand-&gt;traverse(it);
-        it-&gt;decrementDepth();
</del><ins>+    if (visit)
+    {
+        incrementDepth(node);
+
+        node-&gt;getOperand()-&gt;traverse(this);
+
+        decrementDepth();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (visit &amp;&amp; it-&gt;postVisit)
-        it-&gt;visitUnary(PostVisit, this);
</del><ins>+    if (visit &amp;&amp; postVisit)
+        visitUnary(PostVisit, node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TLValueTrackingTraverser::traverseUnary(TIntermUnary *node)
+{
+    bool visit = true;
+
+    if (preVisit)
+        visit = visitUnary(PreVisit, node);
+
+    if (visit)
+    {
+        incrementDepth(node);
+
+        ASSERT(!operatorRequiresLValue());
+        switch (node-&gt;getOp())
+        {
+            case EOpPostIncrement:
+            case EOpPostDecrement:
+            case EOpPreIncrement:
+            case EOpPreDecrement:
+                setOperatorRequiresLValue(true);
+                break;
+            default:
+                break;
+        }
+
+        node-&gt;getOperand()-&gt;traverse(this);
+
+        setOperatorRequiresLValue(false);
+
+        decrementDepth();
+    }
+
+    if (visit &amp;&amp; postVisit)
+        visitUnary(PostVisit, node);
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // Traverse an aggregate node.  Same comments in binary node apply here.
</span><span class="cx"> //
</span><del>-void TIntermAggregate::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseAggregate(TIntermAggregate *node)
</ins><span class="cx"> {
</span><span class="cx">     bool visit = true;
</span><span class="cx"> 
</span><del>-    if (it-&gt;preVisit)
-        visit = it-&gt;visitAggregate(PreVisit, this);
</del><ins>+    TIntermSequence *sequence = node-&gt;getSequence();
</ins><span class="cx"> 
</span><ins>+    if (preVisit)
+        visit = visitAggregate(PreVisit, node);
+
</ins><span class="cx">     if (visit)
</span><span class="cx">     {
</span><del>-        it-&gt;incrementDepth(this);
</del><ins>+        incrementDepth(node);
</ins><span class="cx"> 
</span><del>-        if (it-&gt;rightToLeft)
</del><ins>+        if (node-&gt;getOp() == EOpSequence)
+            pushParentBlock(node);
+
+        for (auto *child : *sequence)
</ins><span class="cx">         {
</span><del>-            for (TIntermSequence::reverse_iterator sit = mSequence.rbegin();
-                 sit != mSequence.rend(); sit++)
</del><ins>+            child-&gt;traverse(this);
+            if (visit &amp;&amp; inVisit)
</ins><span class="cx">             {
</span><del>-                (*sit)-&gt;traverse(it);
</del><ins>+                if (child != sequence-&gt;back())
+                    visit = visitAggregate(InVisit, node);
+            }
</ins><span class="cx"> 
</span><del>-                if (visit &amp;&amp; it-&gt;inVisit)
</del><ins>+            if (node-&gt;getOp() == EOpSequence)
+                incrementParentBlockPos();
+        }
+
+        if (node-&gt;getOp() == EOpSequence)
+            popParentBlock();
+
+        decrementDepth();
+    }
+
+    if (visit &amp;&amp; postVisit)
+        visitAggregate(PostVisit, node);
+}
+
+void TLValueTrackingTraverser::traverseAggregate(TIntermAggregate *node)
+{
+    bool visit = true;
+
+    TIntermSequence *sequence = node-&gt;getSequence();
+    switch (node-&gt;getOp())
+    {
+        case EOpFunction:
+        {
+            TIntermAggregate *params = sequence-&gt;front()-&gt;getAsAggregate();
+            ASSERT(params != nullptr);
+            ASSERT(params-&gt;getOp() == EOpParameters);
+            addToFunctionMap(node-&gt;getNameObj(), params-&gt;getSequence());
+            break;
+        }
+        case EOpPrototype:
+            addToFunctionMap(node-&gt;getNameObj(), sequence);
+            break;
+        default:
+            break;
+    }
+
+    if (preVisit)
+        visit = visitAggregate(PreVisit, node);
+
+    if (visit)
+    {
+        bool inFunctionMap = false;
+        if (node-&gt;getOp() == EOpFunctionCall)
+        {
+            inFunctionMap = isInFunctionMap(node);
+            if (!inFunctionMap)
+            {
+                // The function is not user-defined - it is likely built-in texture function.
+                // Assume that those do not have out parameters.
+                setInFunctionCallOutParameter(false);
+            }
+        }
+
+        incrementDepth(node);
+
+        if (inFunctionMap)
+        {
+            TIntermSequence *params             = getFunctionParameters(node);
+            TIntermSequence::iterator paramIter = params-&gt;begin();
+            for (auto *child : *sequence)
+            {
+                ASSERT(paramIter != params-&gt;end());
+                TQualifier qualifier = (*paramIter)-&gt;getAsTyped()-&gt;getQualifier();
+                setInFunctionCallOutParameter(qualifier == EvqOut || qualifier == EvqInOut);
+
+                child-&gt;traverse(this);
+                if (visit &amp;&amp; inVisit)
</ins><span class="cx">                 {
</span><del>-                    if (*sit != mSequence.front())
-                        visit = it-&gt;visitAggregate(InVisit, this);
</del><ins>+                    if (child != sequence-&gt;back())
+                        visit = visitAggregate(InVisit, node);
</ins><span class="cx">                 }
</span><ins>+
+                ++paramIter;
</ins><span class="cx">             }
</span><ins>+
+            setInFunctionCallOutParameter(false);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            for (TIntermSequence::iterator sit = mSequence.begin();
-                 sit != mSequence.end(); sit++)
</del><ins>+            if (node-&gt;getOp() == EOpSequence)
+                pushParentBlock(node);
+
+            // Find the built-in function corresponding to this op so that we can determine the
+            // in/out qualifiers of its parameters.
+            TFunction *builtInFunc = nullptr;
+            TString opString = GetOperatorString(node-&gt;getOp());
+            if (!node-&gt;isConstructor() &amp;&amp; !opString.empty())
</ins><span class="cx">             {
</span><del>-                (*sit)-&gt;traverse(it);
</del><ins>+                // The return type doesn't affect the mangled name of the function, which is used
+                // to look it up from the symbol table.
+                TType dummyReturnType;
+                TFunction call(&amp;opString, &amp;dummyReturnType, node-&gt;getOp());
+                for (auto *child : *sequence)
+                {
+                    TType *paramType = child-&gt;getAsTyped()-&gt;getTypePointer();
+                    TConstParameter p(paramType);
+                    call.addParameter(p);
+                }
</ins><span class="cx"> 
</span><del>-                if (visit &amp;&amp; it-&gt;inVisit)
</del><ins>+                TSymbol *sym = mSymbolTable.findBuiltIn(call.getMangledName(), mShaderVersion);
+                if (sym != nullptr &amp;&amp; sym-&gt;isFunction())
</ins><span class="cx">                 {
</span><del>-                    if (*sit != mSequence.back())
-                        visit = it-&gt;visitAggregate(InVisit, this);
</del><ins>+                    builtInFunc = static_cast&lt;TFunction *&gt;(sym);
+                    ASSERT(builtInFunc-&gt;getParamCount() == sequence-&gt;size());
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><ins>+
+            size_t paramIndex = 0;
+
+            for (auto *child : *sequence)
+            {
+                TQualifier qualifier = EvqIn;
+                if (builtInFunc != nullptr)
+                    qualifier = builtInFunc-&gt;getParam(paramIndex).type-&gt;getQualifier();
+                setInFunctionCallOutParameter(qualifier == EvqOut || qualifier == EvqInOut);
+                child-&gt;traverse(this);
+
+                if (visit &amp;&amp; inVisit)
+                {
+                    if (child != sequence-&gt;back())
+                        visit = visitAggregate(InVisit, node);
+                }
+
+                if (node-&gt;getOp() == EOpSequence)
+                    incrementParentBlockPos();
+
+                ++paramIndex;
+            }
+
+            setInFunctionCallOutParameter(false);
+
+            if (node-&gt;getOp() == EOpSequence)
+                popParentBlock();
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        it-&gt;decrementDepth();
</del><ins>+        decrementDepth();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (visit &amp;&amp; it-&gt;postVisit)
-        it-&gt;visitAggregate(PostVisit, this);
</del><ins>+    if (visit &amp;&amp; postVisit)
+        visitAggregate(PostVisit, node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="cx"> // Traverse a selection node.  Same comments in binary node apply here.
</span><span class="cx"> //
</span><del>-void TIntermSelection::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseSelection(TIntermSelection *node)
</ins><span class="cx"> {
</span><span class="cx">     bool visit = true;
</span><span class="cx"> 
</span><del>-    if (it-&gt;preVisit)
-        visit = it-&gt;visitSelection(PreVisit, this);
</del><ins>+    if (preVisit)
+        visit = visitSelection(PreVisit, node);
</ins><span class="cx"> 
</span><span class="cx">     if (visit)
</span><span class="cx">     {
</span><del>-        it-&gt;incrementDepth(this);
-        if (it-&gt;rightToLeft)
-        {
-            if (mFalseBlock)
-                mFalseBlock-&gt;traverse(it);
-            if (mTrueBlock)
-                mTrueBlock-&gt;traverse(it);
-            mCondition-&gt;traverse(it);
-        }
-        else
-        {
-            mCondition-&gt;traverse(it);
-            if (mTrueBlock)
-                mTrueBlock-&gt;traverse(it);
-            if (mFalseBlock)
-                mFalseBlock-&gt;traverse(it);
-        }
-        it-&gt;decrementDepth();
</del><ins>+        incrementDepth(node);
+        node-&gt;getCondition()-&gt;traverse(this);
+        if (node-&gt;getTrueBlock())
+            node-&gt;getTrueBlock()-&gt;traverse(this);
+        if (node-&gt;getFalseBlock())
+            node-&gt;getFalseBlock()-&gt;traverse(this);
+        decrementDepth();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (visit &amp;&amp; it-&gt;postVisit)
-        it-&gt;visitSelection(PostVisit, this);
</del><ins>+    if (visit &amp;&amp; postVisit)
+        visitSelection(PostVisit, node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="cx"> // Traverse a switch node.  Same comments in binary node apply here.
</span><span class="cx"> //
</span><del>-void TIntermSwitch::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseSwitch(TIntermSwitch *node)
</ins><span class="cx"> {
</span><span class="cx">     bool visit = true;
</span><span class="cx"> 
</span><del>-    if (it-&gt;preVisit)
-        visit = it-&gt;visitSwitch(PreVisit, this);
</del><ins>+    if (preVisit)
+        visit = visitSwitch(PreVisit, node);
</ins><span class="cx"> 
</span><span class="cx">     if (visit)
</span><span class="cx">     {
</span><del>-        it-&gt;incrementDepth(this);
-        if (it-&gt;rightToLeft)
-        {
-            if (mStatementList)
-                mStatementList-&gt;traverse(it);
-            if (it-&gt;inVisit)
-                visit = it-&gt;visitSwitch(InVisit, this);
-            if (visit)
-                mInit-&gt;traverse(it);
-        }
-        else
-        {
-            mInit-&gt;traverse(it);
-            if (it-&gt;inVisit)
-                visit = it-&gt;visitSwitch(InVisit, this);
-            if (visit &amp;&amp; mStatementList)
-                mStatementList-&gt;traverse(it);
-        }
-        it-&gt;decrementDepth();
</del><ins>+        incrementDepth(node);
+        node-&gt;getInit()-&gt;traverse(this);
+        if (inVisit)
+            visit = visitSwitch(InVisit, node);
+        if (visit &amp;&amp; node-&gt;getStatementList())
+            node-&gt;getStatementList()-&gt;traverse(this);
+        decrementDepth();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (visit &amp;&amp; it-&gt;postVisit)
-        it-&gt;visitSwitch(PostVisit, this);
</del><ins>+    if (visit &amp;&amp; postVisit)
+        visitSwitch(PostVisit, node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><del>-// Traverse a switch node.  Same comments in binary node apply here.
</del><ins>+// Traverse a case node.  Same comments in binary node apply here.
</ins><span class="cx"> //
</span><del>-void TIntermCase::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseCase(TIntermCase *node)
</ins><span class="cx"> {
</span><span class="cx">     bool visit = true;
</span><span class="cx"> 
</span><del>-    if (it-&gt;preVisit)
-        visit = it-&gt;visitCase(PreVisit, this);
</del><ins>+    if (preVisit)
+        visit = visitCase(PreVisit, node);
</ins><span class="cx"> 
</span><del>-    if (visit &amp;&amp; mCondition)
-        mCondition-&gt;traverse(it);
</del><ins>+    if (visit &amp;&amp; node-&gt;getCondition())
+        node-&gt;getCondition()-&gt;traverse(this);
</ins><span class="cx"> 
</span><del>-    if (visit &amp;&amp; it-&gt;postVisit)
-        it-&gt;visitCase(PostVisit, this);
</del><ins>+    if (visit &amp;&amp; postVisit)
+        visitCase(PostVisit, node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="cx"> // Traverse a loop node.  Same comments in binary node apply here.
</span><span class="cx"> //
</span><del>-void TIntermLoop::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseLoop(TIntermLoop *node)
</ins><span class="cx"> {
</span><span class="cx">     bool visit = true;
</span><span class="cx"> 
</span><del>-    if (it-&gt;preVisit)
-        visit = it-&gt;visitLoop(PreVisit, this);
</del><ins>+    if (preVisit)
+        visit = visitLoop(PreVisit, node);
</ins><span class="cx"> 
</span><span class="cx">     if (visit)
</span><span class="cx">     {
</span><del>-        it-&gt;incrementDepth(this);
</del><ins>+        incrementDepth(node);
</ins><span class="cx"> 
</span><del>-        if (it-&gt;rightToLeft)
-        {
-            if (mExpr)
-                mExpr-&gt;traverse(it);
</del><ins>+        if (node-&gt;getInit())
+            node-&gt;getInit()-&gt;traverse(this);
</ins><span class="cx"> 
</span><del>-            if (mBody)
-                mBody-&gt;traverse(it);
</del><ins>+        if (node-&gt;getCondition())
+            node-&gt;getCondition()-&gt;traverse(this);
</ins><span class="cx"> 
</span><del>-            if (mCond)
-                mCond-&gt;traverse(it);
</del><ins>+        if (node-&gt;getBody())
+            node-&gt;getBody()-&gt;traverse(this);
</ins><span class="cx"> 
</span><del>-            if (mInit)
-                mInit-&gt;traverse(it);
-        }
-        else
-        {
-            if (mInit)
-                mInit-&gt;traverse(it);
</del><ins>+        if (node-&gt;getExpression())
+            node-&gt;getExpression()-&gt;traverse(this);
</ins><span class="cx"> 
</span><del>-            if (mCond)
-                mCond-&gt;traverse(it);
-
-            if (mBody)
-                mBody-&gt;traverse(it);
-
-            if (mExpr)
-                mExpr-&gt;traverse(it);
-        }
-
-        it-&gt;decrementDepth();
</del><ins>+        decrementDepth();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (visit &amp;&amp; it-&gt;postVisit)
-        it-&gt;visitLoop(PostVisit, this);
</del><ins>+    if (visit &amp;&amp; postVisit)
+        visitLoop(PostVisit, node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="cx"> // Traverse a branch node.  Same comments in binary node apply here.
</span><span class="cx"> //
</span><del>-void TIntermBranch::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseBranch(TIntermBranch *node)
</ins><span class="cx"> {
</span><span class="cx">     bool visit = true;
</span><span class="cx"> 
</span><del>-    if (it-&gt;preVisit)
-        visit = it-&gt;visitBranch(PreVisit, this);
</del><ins>+    if (preVisit)
+        visit = visitBranch(PreVisit, node);
</ins><span class="cx"> 
</span><del>-    if (visit &amp;&amp; mExpression) {
-        it-&gt;incrementDepth(this);
-        mExpression-&gt;traverse(it);
-        it-&gt;decrementDepth();
</del><ins>+    if (visit &amp;&amp; node-&gt;getExpression())
+    {
+        incrementDepth(node);
+        node-&gt;getExpression()-&gt;traverse(this);
+        decrementDepth();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (visit &amp;&amp; it-&gt;postVisit)
-        it-&gt;visitBranch(PostVisit, this);
</del><ins>+    if (visit &amp;&amp; postVisit)
+        visitBranch(PostVisit, node);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TIntermRaw::traverse(TIntermTraverser *it)
</del><ins>+void TIntermTraverser::traverseRaw(TIntermRaw *node)
</ins><span class="cx"> {
</span><del>-    it-&gt;visitRaw(this);
</del><ins>+    visitRaw(node);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorIntermediatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Intermediate.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Intermediate.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Intermediate.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,7 +12,7 @@
</span><span class="cx"> #include &lt;limits.h&gt;
</span><span class="cx"> #include &lt;algorithm&gt;
</span><span class="cx"> 
</span><del>-#include &quot;compiler/translator/intermediate.h&quot;
</del><ins>+#include &quot;compiler/translator/Intermediate.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><span class="cx"> 
</span><span class="cx"> ////////////////////////////////////////////////////////////////////////////
</span><span class="lines">@@ -57,20 +57,11 @@
</span><span class="cx">     if (!node-&gt;promote(mInfoSink))
</span><span class="cx">         return NULL;
</span><span class="cx"> 
</span><del>-    //
</del><span class="cx">     // See if we can fold constants.
</span><del>-    //
-    TIntermConstantUnion *leftTempConstant = left-&gt;getAsConstantUnion();
-    TIntermConstantUnion *rightTempConstant = right-&gt;getAsConstantUnion();
-    if (leftTempConstant &amp;&amp; rightTempConstant)
-    {
-        TIntermTyped *typedReturnNode =
-            leftTempConstant-&gt;fold(node-&gt;getOp(), rightTempConstant, mInfoSink);
</del><ins>+    TIntermTyped *foldedNode = node-&gt;fold(mInfoSink);
+    if (foldedNode)
+        return foldedNode;
</ins><span class="cx"> 
</span><del>-        if (typedReturnNode)
-            return typedReturnNode;
-    }
-
</del><span class="cx">     return node;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -129,10 +120,6 @@
</span><span class="cx"> TIntermTyped *TIntermediate::addUnaryMath(
</span><span class="cx">     TOperator op, TIntermTyped *child, const TSourceLoc &amp;line, const TType *funcReturnType)
</span><span class="cx"> {
</span><del>-    TIntermConstantUnion *childTempConstant = 0;
-    if (child-&gt;getAsConstantUnion())
-        childTempConstant = child-&gt;getAsConstantUnion();
-
</del><span class="cx">     //
</span><span class="cx">     // Make a new node for the operator.
</span><span class="cx">     //
</span><span class="lines">@@ -141,14 +128,10 @@
</span><span class="cx">     node-&gt;setOperand(child);
</span><span class="cx">     node-&gt;promote(funcReturnType);
</span><span class="cx"> 
</span><del>-    if (childTempConstant)
-    {
-        TIntermTyped *newChild = childTempConstant-&gt;fold(op, nullptr, mInfoSink);
</del><ins>+    TIntermTyped *foldedNode = node-&gt;fold(mInfoSink);
+    if (foldedNode)
+        return foldedNode;
</ins><span class="cx"> 
</span><del>-        if (newChild)
-            return newChild;
-    }
-
</del><span class="cx">     return node;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -246,6 +229,22 @@
</span><span class="cx">     return aggNode;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// If the input node is nullptr, return nullptr.
+// If the input node is a sequence (block) node, return it.
+// If the input node is not a sequence node, put it inside a sequence node and return that.
+TIntermAggregate *TIntermediate::ensureSequence(TIntermNode *node)
+{
+    if (node == nullptr)
+        return nullptr;
+    TIntermAggregate *aggNode = node-&gt;getAsAggregate();
+    if (aggNode != nullptr &amp;&amp; aggNode-&gt;getOp() == EOpSequence)
+        return aggNode;
+
+    aggNode = makeAggregate(node, node-&gt;getLine());
+    aggNode-&gt;setOp(EOpSequence);
+    return aggNode;
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // For &quot;if&quot; test nodes.  There are three children; a condition,
</span><span class="cx"> // a true path, and a false path.  The two paths are in the
</span><span class="lines">@@ -261,7 +260,7 @@
</span><span class="cx">     // test now.
</span><span class="cx">     //
</span><span class="cx"> 
</span><del>-    if (cond-&gt;getAsTyped() &amp;&amp; cond-&gt;getAsTyped()-&gt;getAsConstantUnion())
</del><ins>+    if (cond-&gt;getAsConstantUnion())
</ins><span class="cx">     {
</span><span class="cx">         if (cond-&gt;getAsConstantUnion()-&gt;getBConst(0) == true)
</span><span class="cx">         {
</span><span class="lines">@@ -276,28 +275,38 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     TIntermSelection *node = new TIntermSelection(
</span><del>-        cond, nodePair.node1, nodePair.node2);
</del><ins>+        cond, ensureSequence(nodePair.node1), ensureSequence(nodePair.node2));
</ins><span class="cx">     node-&gt;setLine(line);
</span><span class="cx"> 
</span><span class="cx">     return node;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped *TIntermediate::addComma(
-    TIntermTyped *left, TIntermTyped *right, const TSourceLoc &amp;line)
</del><ins>+TIntermTyped *TIntermediate::addComma(TIntermTyped *left,
+                                      TIntermTyped *right,
+                                      const TSourceLoc &amp;line,
+                                      int shaderVersion)
</ins><span class="cx"> {
</span><del>-    if (left-&gt;getType().getQualifier() == EvqConst &amp;&amp;
-        right-&gt;getType().getQualifier() == EvqConst)
</del><ins>+    TQualifier resultQualifier = EvqConst;
+    // ESSL3.00 section 12.43: The result of a sequence operator is not a constant-expression.
+    if (shaderVersion &gt;= 300 || left-&gt;getQualifier() != EvqConst ||
+        right-&gt;getQualifier() != EvqConst)
</ins><span class="cx">     {
</span><del>-        return right;
</del><ins>+        resultQualifier = EvqTemporary;
</ins><span class="cx">     }
</span><ins>+
+    TIntermTyped *commaNode = nullptr;
+    if (!left-&gt;hasSideEffects())
+    {
+        commaNode = right;
+    }
</ins><span class="cx">     else
</span><span class="cx">     {
</span><del>-        TIntermTyped *commaAggregate = growAggregate(left, right, line);
-        commaAggregate-&gt;getAsAggregate()-&gt;setOp(EOpComma);
-        commaAggregate-&gt;setType(right-&gt;getType());
-        commaAggregate-&gt;getTypePointer()-&gt;setQualifier(EvqTemporary);
-        return commaAggregate;
</del><ins>+        commaNode = growAggregate(left, right, line);
+        commaNode-&gt;getAsAggregate()-&gt;setOp(EOpComma);
+        commaNode-&gt;setType(right-&gt;getType());
</ins><span class="cx">     }
</span><ins>+    commaNode-&gt;getTypePointer()-&gt;setQualifier(resultQualifier);
+    return commaNode;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -310,27 +319,33 @@
</span><span class="cx"> TIntermTyped *TIntermediate::addSelection(TIntermTyped *cond, TIntermTyped *trueBlock, TIntermTyped *falseBlock,
</span><span class="cx">                                           const TSourceLoc &amp;line)
</span><span class="cx"> {
</span><del>-    // Right now it's safe to fold ternary operators only when all operands
-    // are constant. If only the condition is constant, it's theoretically
-    // possible to fold the ternary operator, but that requires making sure
-    // that the node returned from here won't be treated as a constant
-    // expression in case the node that gets eliminated was not a constant
-    // expression.
-    if (cond-&gt;getAsConstantUnion() &amp;&amp;
-        trueBlock-&gt;getAsConstantUnion() &amp;&amp;
-        falseBlock-&gt;getAsConstantUnion())
</del><ins>+    TQualifier resultQualifier = EvqTemporary;
+    if (cond-&gt;getQualifier() == EvqConst &amp;&amp; trueBlock-&gt;getQualifier() == EvqConst &amp;&amp;
+        falseBlock-&gt;getQualifier() == EvqConst)
</ins><span class="cx">     {
</span><ins>+        resultQualifier = EvqConst;
+    }
+    // Note that the node resulting from here can be a constant union without being qualified as
+    // constant.
+    if (cond-&gt;getAsConstantUnion())
+    {
</ins><span class="cx">         if (cond-&gt;getAsConstantUnion()-&gt;getBConst(0))
</span><ins>+        {
+            trueBlock-&gt;getTypePointer()-&gt;setQualifier(resultQualifier);
</ins><span class="cx">             return trueBlock;
</span><ins>+        }
</ins><span class="cx">         else
</span><ins>+        {
+            falseBlock-&gt;getTypePointer()-&gt;setQualifier(resultQualifier);
</ins><span class="cx">             return falseBlock;
</span><ins>+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     //
</span><span class="cx">     // Make a selection node.
</span><span class="cx">     //
</span><span class="cx">     TIntermSelection *node = new TIntermSelection(cond, trueBlock, falseBlock, trueBlock-&gt;getType());
</span><del>-    node-&gt;getTypePointer()-&gt;setQualifier(EvqTemporary);
</del><ins>+    node-&gt;getTypePointer()-&gt;setQualifier(resultQualifier);
</ins><span class="cx">     node-&gt;setLine(line);
</span><span class="cx"> 
</span><span class="cx">     return node;
</span><span class="lines">@@ -360,8 +375,9 @@
</span><span class="cx"> // Returns the constant union node created.
</span><span class="cx"> //
</span><span class="cx"> 
</span><del>-TIntermConstantUnion *TIntermediate::addConstantUnion(
-    TConstantUnion *constantUnion, const TType &amp;type, const TSourceLoc &amp;line)
</del><ins>+TIntermConstantUnion *TIntermediate::addConstantUnion(const TConstantUnion *constantUnion,
+                                                      const TType &amp;type,
+                                                      const TSourceLoc &amp;line)
</ins><span class="cx"> {
</span><span class="cx">     TIntermConstantUnion *node = new TIntermConstantUnion(constantUnion, type);
</span><span class="cx">     node-&gt;setLine(line);
</span><span class="lines">@@ -399,7 +415,7 @@
</span><span class="cx">     TLoopType type, TIntermNode *init, TIntermTyped *cond, TIntermTyped *expr,
</span><span class="cx">     TIntermNode *body, const TSourceLoc &amp;line)
</span><span class="cx"> {
</span><del>-    TIntermNode *node = new TIntermLoop(type, init, cond, expr, body);
</del><ins>+    TIntermNode *node = new TIntermLoop(type, init, cond, expr, ensureSequence(body));
</ins><span class="cx">     node-&gt;setLine(line);
</span><span class="cx"> 
</span><span class="cx">     return node;
</span><span class="lines">@@ -427,17 +443,66 @@
</span><span class="cx"> // This is to be executed once the final root is put on top by the parsing
</span><span class="cx"> // process.
</span><span class="cx"> //
</span><del>-bool TIntermediate::postProcess(TIntermNode *root)
</del><ins>+TIntermAggregate *TIntermediate::postProcess(TIntermNode *root)
</ins><span class="cx"> {
</span><del>-    if (root == NULL)
-        return true;
</del><ins>+    if (root == nullptr)
+        return nullptr;
</ins><span class="cx"> 
</span><span class="cx">     //
</span><del>-    // First, finish off the top level sequence, if any
</del><ins>+    // Finish off the top level sequence, if any
</ins><span class="cx">     //
</span><span class="cx">     TIntermAggregate *aggRoot = root-&gt;getAsAggregate();
</span><del>-    if (aggRoot &amp;&amp; aggRoot-&gt;getOp() == EOpNull)
</del><ins>+    if (aggRoot != nullptr &amp;&amp; aggRoot-&gt;getOp() == EOpNull)
+    {
</ins><span class="cx">         aggRoot-&gt;setOp(EOpSequence);
</span><ins>+    }
+    else if (aggRoot == nullptr || aggRoot-&gt;getOp() != EOpSequence)
+    {
+        aggRoot = new TIntermAggregate(EOpSequence);
+        aggRoot-&gt;setLine(root-&gt;getLine());
+        aggRoot-&gt;getSequence()-&gt;push_back(root);
+    }
</ins><span class="cx"> 
</span><del>-    return true;
</del><ins>+    return aggRoot;
</ins><span class="cx"> }
</span><ins>+
+TIntermTyped *TIntermediate::foldAggregateBuiltIn(TIntermAggregate *aggregate)
+{
+    switch (aggregate-&gt;getOp())
+    {
+        case EOpAtan:
+        case EOpPow:
+        case EOpMod:
+        case EOpMin:
+        case EOpMax:
+        case EOpClamp:
+        case EOpMix:
+        case EOpStep:
+        case EOpSmoothStep:
+        case EOpMul:
+        case EOpOuterProduct:
+        case EOpLessThan:
+        case EOpLessThanEqual:
+        case EOpGreaterThan:
+        case EOpGreaterThanEqual:
+        case EOpVectorEqual:
+        case EOpVectorNotEqual:
+        case EOpDistance:
+        case EOpDot:
+        case EOpCross:
+        case EOpFaceForward:
+        case EOpReflect:
+        case EOpRefract:
+            return aggregate-&gt;fold(mInfoSink);
+        default:
+            // TODO: Add support for folding array constructors
+            if (aggregate-&gt;isConstructor() &amp;&amp; !aggregate-&gt;isArray())
+            {
+                return aggregate-&gt;fold(mInfoSink);
+            }
+            // Constant folding not supported for the built-in.
+            return nullptr;
+    }
+
+    return nullptr;
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorNodeSearchh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/NodeSearch.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/NodeSearch.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/NodeSearch.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -19,7 +19,8 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     NodeSearchTraverser()
</span><del>-        : mFound(false)
</del><ins>+        : TIntermTraverser(true, false, false),
+          mFound(false)
</ins><span class="cx">     {}
</span><span class="cx"> 
</span><span class="cx">     bool found() const { return mFound; }
</span><span class="lines">@@ -53,28 +54,6 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class FindSideEffectRewriting : public NodeSearchTraverser&lt;FindSideEffectRewriting&gt;
-{
-  public:
-    virtual bool visitBinary(Visit visit, TIntermBinary *node)
-    {
-        switch (node-&gt;getOp())
-        {
-          case EOpLogicalOr:
-          case EOpLogicalAnd:
-            if (node-&gt;getRight()-&gt;hasSideEffects())
-            {
-                mFound = true;
-            }
-            break;
-
-          default: break;
-        }
-
-        return !mFound;
-    }
-};
-
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // COMPILER_TRANSLATOR_NODESEARCH_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorOperatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -164,7 +164,13 @@
</span><span class="cx">       case EOpConstructUVec3: return &quot;uvec3&quot;;
</span><span class="cx">       case EOpConstructUVec4: return &quot;uvec4&quot;;
</span><span class="cx">       case EOpConstructMat2: return &quot;mat2&quot;;
</span><ins>+      case EOpConstructMat2x3: return &quot;mat2x3&quot;;
+      case EOpConstructMat2x4: return &quot;mat2x4&quot;;
+      case EOpConstructMat3x2: return &quot;mat3x2&quot;;
</ins><span class="cx">       case EOpConstructMat3: return &quot;mat3&quot;;
</span><ins>+      case EOpConstructMat3x4: return &quot;mat3x4&quot;;
+      case EOpConstructMat4x2: return &quot;mat4x2&quot;;
+      case EOpConstructMat4x3: return &quot;mat4x3&quot;;
</ins><span class="cx">       case EOpConstructMat4: return &quot;mat4&quot;;
</span><span class="cx">       // Note: EOpConstructStruct can't be handled here
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorOperatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Operator.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,7 +15,6 @@
</span><span class="cx">     EOpNull,            // if in a node, should only mean a node is still being built
</span><span class="cx">     EOpSequence,        // denotes a list of statements, or parameters, etc.
</span><span class="cx">     EOpFunctionCall,
</span><del>-    EOpInternalFunctionCall, // Call to an internal helper function
</del><span class="cx">     EOpFunction,        // For function definition
</span><span class="cx">     EOpParameters,      // an aggregate listing the parameters to a function
</span><span class="cx"> 
</span><span class="lines">@@ -192,7 +191,13 @@
</span><span class="cx">     EOpConstructUVec3,
</span><span class="cx">     EOpConstructUVec4,
</span><span class="cx">     EOpConstructMat2,
</span><ins>+    EOpConstructMat2x3,
+    EOpConstructMat2x4,
+    EOpConstructMat3x2,
</ins><span class="cx">     EOpConstructMat3,
</span><ins>+    EOpConstructMat3x4,
+    EOpConstructMat4x2,
+    EOpConstructMat4x3,
</ins><span class="cx">     EOpConstructMat4,
</span><span class="cx">     EOpConstructStruct,
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorOutputESSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputESSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputESSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputESSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,7 +21,8 @@
</span><span class="cx">                 bool forceHighp);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    virtual bool writeVariablePrecision(TPrecision precision);
</del><ins>+  bool writeVariablePrecision(TPrecision precision) override;
+
</ins><span class="cx"> private:
</span><span class="cx">     bool mForceHighp;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorOutputGLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -45,6 +45,14 @@
</span><span class="cx">     {
</span><span class="cx">         out &lt;&lt; &quot;webgl_FragData&quot;;
</span><span class="cx">     }
</span><ins>+    else if (symbol == &quot;gl_SecondaryFragColorEXT&quot;)
+    {
+        out &lt;&lt; &quot;angle_SecondaryFragColor&quot;;
+    }
+    else if (symbol == &quot;gl_SecondaryFragDataEXT&quot;)
+    {
+        out &lt;&lt; &quot;angle_SecondaryFragData&quot;;
+    }
</ins><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         TOutputGLSLBase::visitSymbol(node);
</span><span class="lines">@@ -67,6 +75,7 @@
</span><span class="cx">         &quot;texture2DProj&quot;, &quot;textureProj&quot;,
</span><span class="cx">         &quot;texture2DLod&quot;, &quot;textureLod&quot;,
</span><span class="cx">         &quot;texture2DProjLod&quot;, &quot;textureProjLod&quot;,
</span><ins>+        &quot;texture2DRect&quot;, &quot;texture&quot;,
</ins><span class="cx">         &quot;textureCube&quot;, &quot;texture&quot;,
</span><span class="cx">         &quot;textureCubeLod&quot;, &quot;textureLod&quot;,
</span><span class="cx">         // Extensions
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorOutputGLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,9 +21,9 @@
</span><span class="cx">                 ShShaderOutput output);
</span><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    virtual bool writeVariablePrecision(TPrecision);
-    virtual void visitSymbol(TIntermSymbol* node);
-    virtual TString translateTextureFunction(TString&amp; name);
</del><ins>+    bool writeVariablePrecision(TPrecision) override;
+    void visitSymbol(TIntermSymbol *node) override;
+    TString translateTextureFunction(TString &amp;name) override;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #endif  // COMPILER_TRANSLATOR_OUTPUTGLSL_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorOutputGLSLBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -89,9 +89,31 @@
</span><span class="cx">     writeTriplet(visit, preString.c_str(), &quot;, &quot;, &quot;)&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TOutputGLSLBase::writeLayoutQualifier(const TType &amp;type)
+{
+    if (type.getQualifier() == EvqFragmentOut || type.getQualifier() == EvqVertexIn)
+    {
+        const TLayoutQualifier &amp;layoutQualifier = type.getLayoutQualifier();
+        if (layoutQualifier.location &gt;= 0)
+        {
+            TInfoSinkBase &amp;out = objSink();
+            out &lt;&lt; &quot;layout(location = &quot; &lt;&lt; layoutQualifier.location &lt;&lt; &quot;) &quot;;
+        }
+    }
+}
+
</ins><span class="cx"> void TOutputGLSLBase::writeVariableType(const TType &amp;type)
</span><span class="cx"> {
</span><span class="cx">     TInfoSinkBase &amp;out = objSink();
</span><ins>+    if (type.isInvariant())
+    {
+        out &lt;&lt; &quot;invariant &quot;;
+    }
+    if (type.getBasicType() == EbtInterfaceBlock)
+    {
+        TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
+        declareInterfaceBlockLayout(interfaceBlock);
+    }
</ins><span class="cx">     TQualifier qualifier = type.getQualifier();
</span><span class="cx">     if (qualifier != EvqTemporary &amp;&amp; qualifier != EvqGlobal)
</span><span class="cx">     {
</span><span class="lines">@@ -100,20 +122,14 @@
</span><span class="cx">             switch (qualifier)
</span><span class="cx">             {
</span><span class="cx">               case EvqAttribute:
</span><del>-                out &lt;&lt; &quot;in&quot; &lt;&lt; &quot; &quot;;
</del><ins>+                out &lt;&lt; &quot;in &quot;;
</ins><span class="cx">                 break;
</span><span class="cx">               case EvqVaryingIn:
</span><del>-                out &lt;&lt; &quot;in&quot; &lt;&lt; &quot; &quot;;
</del><ins>+                out &lt;&lt; &quot;in &quot;;
</ins><span class="cx">                 break;
</span><span class="cx">               case EvqVaryingOut:
</span><del>-                out &lt;&lt; &quot;out&quot; &lt;&lt; &quot; &quot;;
</del><ins>+                out &lt;&lt; &quot;out &quot;;
</ins><span class="cx">                 break;
</span><del>-              case EvqInvariantVaryingIn:
-                out &lt;&lt; &quot;invariant in&quot; &lt;&lt; &quot; &quot;;
-                break;
-              case EvqInvariantVaryingOut:
-                out &lt;&lt; &quot;invariant out&quot; &lt;&lt; &quot; &quot;;
-                break;
</del><span class="cx">               default:
</span><span class="cx">                 out &lt;&lt; type.getQualifierString() &lt;&lt; &quot; &quot;;
</span><span class="cx">                 break;
</span><span class="lines">@@ -136,6 +152,11 @@
</span><span class="cx">             mDeclaredStructs.insert(structure-&gt;uniqueId());
</span><span class="cx">         }
</span><span class="cx">     }
</span><ins>+    else if (type.getBasicType() == EbtInterfaceBlock)
+    {
+        TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
+        declareInterfaceBlock(interfaceBlock);
+    }
</ins><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         if (writeVariablePrecision(type.getPrecision()))
</span><span class="lines">@@ -375,6 +396,22 @@
</span><span class="cx">             visitChildren = false;
</span><span class="cx">         }
</span><span class="cx">         break;
</span><ins>+      case EOpIndexDirectInterfaceBlock:
+          if (visit == InVisit)
+          {
+              out &lt;&lt; &quot;.&quot;;
+              const TInterfaceBlock *interfaceBlock = node-&gt;getLeft()-&gt;getType().getInterfaceBlock();
+              const TIntermConstantUnion *index = node-&gt;getRight()-&gt;getAsConstantUnion();
+              const TField *field = interfaceBlock-&gt;fields()[index-&gt;getIConst(0)];
+
+              TString fieldName = field-&gt;name();
+              ASSERT(!mSymbolTable.findBuiltIn(interfaceBlock-&gt;name(), mShaderVersion));
+              fieldName = hashName(fieldName);
+
+              out &lt;&lt; fieldName;
+              visitChildren = false;
+          }
+          break;
</ins><span class="cx">       case EOpVectorSwizzle:
</span><span class="cx">         if (visit == InVisit)
</span><span class="cx">         {
</span><span class="lines">@@ -785,7 +822,7 @@
</span><span class="cx">                 out &lt;&lt; arrayBrackets(type);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        out &lt;&lt; &quot; &quot; &lt;&lt; hashFunctionName(node-&gt;getName());
</del><ins>+        out &lt;&lt; &quot; &quot; &lt;&lt; hashFunctionNameIfNeeded(node-&gt;getNameObj());
</ins><span class="cx"> 
</span><span class="cx">         out &lt;&lt; &quot;(&quot;;
</span><span class="cx">         writeFunctionParameters(*(node-&gt;getSequence()));
</span><span class="lines">@@ -803,7 +840,7 @@
</span><span class="cx">                 out &lt;&lt; arrayBrackets(type);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        out &lt;&lt; &quot; &quot; &lt;&lt; hashFunctionName(node-&gt;getName());
</del><ins>+        out &lt;&lt; &quot; &quot; &lt;&lt; hashFunctionNameIfNeeded(node-&gt;getNameObj());
</ins><span class="cx"> 
</span><span class="cx">         incrementDepth(node);
</span><span class="cx">         // Function definition node contains one or two children nodes
</span><span class="lines">@@ -832,21 +869,12 @@
</span><span class="cx">       case EOpFunctionCall:
</span><span class="cx">         // Function call.
</span><span class="cx">         if (visit == PreVisit)
</span><del>-            out &lt;&lt; hashFunctionName(node-&gt;getName()) &lt;&lt; &quot;(&quot;;
</del><ins>+            out &lt;&lt; hashFunctionNameIfNeeded(node-&gt;getNameObj()) &lt;&lt; &quot;(&quot;;
</ins><span class="cx">         else if (visit == InVisit)
</span><span class="cx">             out &lt;&lt; &quot;, &quot;;
</span><span class="cx">         else
</span><span class="cx">             out &lt;&lt; &quot;)&quot;;
</span><span class="cx">         break;
</span><del>-      case EOpInternalFunctionCall:
-        // Function call to an internal helper function.
-        if (visit == PreVisit)
-            out &lt;&lt; node-&gt;getName() &lt;&lt; &quot;(&quot;;
-        else if (visit == InVisit)
-            out &lt;&lt; &quot;, &quot;;
-        else
-            out &lt;&lt; &quot;)&quot;;
-        break;
</del><span class="cx">       case EOpParameters:
</span><span class="cx">         // Function parameters.
</span><span class="cx">         ASSERT(visit == PreVisit);
</span><span class="lines">@@ -861,6 +889,7 @@
</span><span class="cx">         {
</span><span class="cx">             const TIntermSequence &amp;sequence = *(node-&gt;getSequence());
</span><span class="cx">             const TIntermTyped *variable = sequence.front()-&gt;getAsTyped();
</span><ins>+            writeLayoutQualifier(variable-&gt;getType());
</ins><span class="cx">             writeVariableType(variable-&gt;getType());
</span><span class="cx">             out &lt;&lt; &quot; &quot;;
</span><span class="cx">             mDeclaringVariables = true;
</span><span class="lines">@@ -923,12 +952,42 @@
</span><span class="cx">       case EOpConstructIVec4:
</span><span class="cx">         writeConstructorTriplet(visit, node-&gt;getType(), &quot;ivec4&quot;);
</span><span class="cx">         break;
</span><ins>+      case EOpConstructUInt:
+        writeConstructorTriplet(visit, node-&gt;getType(), &quot;uint&quot;);
+        break;
+      case EOpConstructUVec2:
+        writeConstructorTriplet(visit, node-&gt;getType(), &quot;uvec2&quot;);
+        break;
+      case EOpConstructUVec3:
+        writeConstructorTriplet(visit, node-&gt;getType(), &quot;uvec3&quot;);
+        break;
+      case EOpConstructUVec4:
+        writeConstructorTriplet(visit, node-&gt;getType(), &quot;uvec4&quot;);
+        break;
</ins><span class="cx">       case EOpConstructMat2:
</span><span class="cx">         writeConstructorTriplet(visit, node-&gt;getType(), &quot;mat2&quot;);
</span><span class="cx">         break;
</span><ins>+      case EOpConstructMat2x3:
+        writeConstructorTriplet(visit, node-&gt;getType(), &quot;mat2x3&quot;);
+        break;
+      case EOpConstructMat2x4:
+        writeConstructorTriplet(visit, node-&gt;getType(), &quot;mat2x4&quot;);
+        break;
+      case EOpConstructMat3x2:
+        writeConstructorTriplet(visit, node-&gt;getType(), &quot;mat3x2&quot;);
+        break;
</ins><span class="cx">       case EOpConstructMat3:
</span><span class="cx">         writeConstructorTriplet(visit, node-&gt;getType(), &quot;mat3&quot;);
</span><span class="cx">         break;
</span><ins>+      case EOpConstructMat3x4:
+        writeConstructorTriplet(visit, node-&gt;getType(), &quot;mat3x4&quot;);
+        break;
+      case EOpConstructMat4x2:
+        writeConstructorTriplet(visit, node-&gt;getType(), &quot;mat4x2&quot;);
+        break;
+      case EOpConstructMat4x3:
+        writeConstructorTriplet(visit, node-&gt;getType(), &quot;mat4x3&quot;);
+        break;
</ins><span class="cx">       case EOpConstructMat4:
</span><span class="cx">         writeConstructorTriplet(visit, node-&gt;getType(), &quot;mat4&quot;);
</span><span class="cx">         break;
</span><span class="lines">@@ -1030,8 +1089,12 @@
</span><span class="cx">     TInfoSinkBase &amp;out = objSink();
</span><span class="cx"> 
</span><span class="cx">     incrementDepth(node);
</span><del>-    // Loop header.
</del><ins>+
</ins><span class="cx">     TLoopType loopType = node-&gt;getType();
</span><ins>+
+    // Only for loops can be unrolled
+    ASSERT(!node-&gt;getUnrollFlag() || loopType == ELoopFor);
+
</ins><span class="cx">     if (loopType == ELoopFor)  // for loop
</span><span class="cx">     {
</span><span class="cx">         if (!node-&gt;getUnrollFlag())
</span><span class="lines">@@ -1048,6 +1111,8 @@
</span><span class="cx">             if (node-&gt;getExpression())
</span><span class="cx">                 node-&gt;getExpression()-&gt;traverse(this);
</span><span class="cx">             out &lt;&lt; &quot;)\n&quot;;
</span><ins>+
+            visitCodeBlock(node-&gt;getBody());
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="lines">@@ -1060,6 +1125,16 @@
</span><span class="cx">             out &lt;&lt; &quot;for (int &quot; &lt;&lt; name &lt;&lt; &quot; = 0; &quot;
</span><span class="cx">                 &lt;&lt; name &lt;&lt; &quot; &lt; 1; &quot;
</span><span class="cx">                 &lt;&lt; &quot;++&quot; &lt;&lt; name &lt;&lt; &quot;)\n&quot;;
</span><ins>+
+            out &lt;&lt; &quot;{\n&quot;;
+            mLoopUnrollStack.push(node);
+            while (mLoopUnrollStack.satisfiesLoopCondition())
+            {
+                visitCodeBlock(node-&gt;getBody());
+                mLoopUnrollStack.step();
+            }
+            mLoopUnrollStack.pop();
+            out &lt;&lt; &quot;}\n&quot;;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     else if (loopType == ELoopWhile)  // while loop
</span><span class="lines">@@ -1068,39 +1143,22 @@
</span><span class="cx">         ASSERT(node-&gt;getCondition() != NULL);
</span><span class="cx">         node-&gt;getCondition()-&gt;traverse(this);
</span><span class="cx">         out &lt;&lt; &quot;)\n&quot;;
</span><ins>+
+        visitCodeBlock(node-&gt;getBody());
</ins><span class="cx">     }
</span><span class="cx">     else  // do-while loop
</span><span class="cx">     {
</span><span class="cx">         ASSERT(loopType == ELoopDoWhile);
</span><span class="cx">         out &lt;&lt; &quot;do\n&quot;;
</span><del>-    }
</del><span class="cx"> 
</span><del>-    // Loop body.
-    if (node-&gt;getUnrollFlag())
-    {
-        out &lt;&lt; &quot;{\n&quot;;
-        mLoopUnrollStack.push(node);
-        while (mLoopUnrollStack.satisfiesLoopCondition())
-        {
-            visitCodeBlock(node-&gt;getBody());
-            mLoopUnrollStack.step();
-        }
-        mLoopUnrollStack.pop();
-        out &lt;&lt; &quot;}\n&quot;;
-    }
-    else
-    {
</del><span class="cx">         visitCodeBlock(node-&gt;getBody());
</span><del>-    }
</del><span class="cx"> 
</span><del>-    // Loop footer.
-    if (loopType == ELoopDoWhile)  // do-while loop
-    {
</del><span class="cx">         out &lt;&lt; &quot;while (&quot;;
</span><span class="cx">         ASSERT(node-&gt;getCondition() != NULL);
</span><span class="cx">         node-&gt;getCondition()-&gt;traverse(this);
</span><span class="cx">         out &lt;&lt; &quot;);\n&quot;;
</span><span class="cx">     }
</span><ins>+
</ins><span class="cx">     decrementDepth();
</span><span class="cx"> 
</span><span class="cx">     // No need to visit children. They have been already processed in
</span><span class="lines">@@ -1155,6 +1213,10 @@
</span><span class="cx">     {
</span><span class="cx">         out &lt;&lt; &quot;mat&quot;;
</span><span class="cx">         out &lt;&lt; type.getNominalSize();
</span><ins>+        if (type.getSecondarySize() != type.getNominalSize())
+        {
+            out &lt;&lt; &quot;x&quot; &lt;&lt; type.getSecondarySize();
+        }
</ins><span class="cx">     }
</span><span class="cx">     else if (type.isVector())
</span><span class="cx">     {
</span><span class="lines">@@ -1169,6 +1231,9 @@
</span><span class="cx">           case EbtBool:
</span><span class="cx">             out &lt;&lt; &quot;bvec&quot;;
</span><span class="cx">             break;
</span><ins>+          case EbtUInt:
+            out &lt;&lt; &quot;uvec&quot;;
+            break;
</ins><span class="cx">           default:
</span><span class="cx">             UNREACHABLE();
</span><span class="cx">         }
</span><span class="lines">@@ -1203,12 +1268,16 @@
</span><span class="cx">     return hashName(name);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TString TOutputGLSLBase::hashFunctionName(const TString &amp;mangled_name)
</del><ins>+TString TOutputGLSLBase::hashFunctionNameIfNeeded(const TName &amp;mangledName)
</ins><span class="cx"> {
</span><del>-    TString name = TFunction::unmangleName(mangled_name);
-    if (mSymbolTable.findBuiltIn(mangled_name, mShaderVersion) != NULL || name == &quot;main&quot;)
</del><ins>+    TString mangledStr = mangledName.getString();
+    TString name = TFunction::unmangleName(mangledStr);
+    if (mSymbolTable.findBuiltIn(mangledStr, mShaderVersion) != nullptr || name == &quot;main&quot;)
</ins><span class="cx">         return translateTextureFunction(name);
</span><del>-    return hashName(name);
</del><ins>+    if (mangledName.isInternal())
+        return name;
+    else
+        return hashName(name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool TOutputGLSLBase::structDeclared(const TStructure *structure) const
</span><span class="lines">@@ -1241,3 +1310,70 @@
</span><span class="cx">     out &lt;&lt; &quot;}&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TOutputGLSLBase::declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock)
+{
+    TInfoSinkBase &amp;out = objSink();
+
+    out &lt;&lt; &quot;layout(&quot;;
+
+    switch (interfaceBlock-&gt;blockStorage())
+    {
+        case EbsUnspecified:
+        case EbsShared:
+            // Default block storage is shared.
+            out &lt;&lt; &quot;shared&quot;;
+            break;
+
+        case EbsPacked:
+            out &lt;&lt; &quot;packed&quot;;
+            break;
+
+        case EbsStd140:
+            out &lt;&lt; &quot;std140&quot;;
+            break;
+
+        default:
+            UNREACHABLE();
+            break;
+    }
+
+    out &lt;&lt; &quot;, &quot;;
+
+    switch (interfaceBlock-&gt;matrixPacking())
+    {
+        case EmpUnspecified:
+        case EmpColumnMajor:
+            // Default matrix packing is column major.
+            out &lt;&lt; &quot;column_major&quot;;
+            break;
+
+        case EmpRowMajor:
+            out &lt;&lt; &quot;row_major&quot;;
+            break;
+
+        default:
+            UNREACHABLE();
+            break;
+    }
+
+    out &lt;&lt; &quot;) &quot;;
+}
+
+void TOutputGLSLBase::declareInterfaceBlock(const TInterfaceBlock *interfaceBlock)
+{
+    TInfoSinkBase &amp;out = objSink();
+
+    out &lt;&lt; hashName(interfaceBlock-&gt;name()) &lt;&lt; &quot;{\n&quot;;
+    const TFieldList &amp;fields = interfaceBlock-&gt;fields();
+    for (size_t i = 0; i &lt; fields.size(); ++i)
+    {
+        const TField *field = fields[i];
+        if (writeVariablePrecision(field-&gt;type()-&gt;getPrecision()))
+            out &lt;&lt; &quot; &quot;;
+        out &lt;&lt; getTypeName(*field-&gt;type()) &lt;&lt; &quot; &quot; &lt;&lt; hashName(field-&gt;name());
+        if (field-&gt;type()-&gt;isArray())
+            out &lt;&lt; arrayBrackets(*field-&gt;type());
+        out &lt;&lt; &quot;;\n&quot;;
+    }
+    out &lt;&lt; &quot;}&quot;;
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorOutputGLSLBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputGLSLBase.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx">   protected:
</span><span class="cx">     TInfoSinkBase &amp;objSink() { return mObjSink; }
</span><span class="cx">     void writeTriplet(Visit visit, const char *preStr, const char *inStr, const char *postStr);
</span><ins>+    void writeLayoutQualifier(const TType &amp;type);
</ins><span class="cx">     void writeVariableType(const TType &amp;type);
</span><span class="cx">     virtual bool writeVariablePrecision(TPrecision precision) = 0;
</span><span class="cx">     void writeFunctionParameters(const TIntermSequence &amp;args);
</span><span class="lines">@@ -39,16 +40,16 @@
</span><span class="cx">     void writeConstructorTriplet(Visit visit, const TType &amp;type, const char *constructorBaseType);
</span><span class="cx">     TString getTypeName(const TType &amp;type);
</span><span class="cx"> 
</span><del>-    virtual void visitSymbol(TIntermSymbol *node);
-    virtual void visitConstantUnion(TIntermConstantUnion *node);
-    virtual bool visitBinary(Visit visit, TIntermBinary *node);
-    virtual bool visitUnary(Visit visit, TIntermUnary *node);
-    virtual bool visitSelection(Visit visit, TIntermSelection *node);
-    virtual bool visitSwitch(Visit visit, TIntermSwitch *node);
-    virtual bool visitCase(Visit visit, TIntermCase *node);
-    virtual bool visitAggregate(Visit visit, TIntermAggregate *node);
-    virtual bool visitLoop(Visit visit, TIntermLoop *node);
-    virtual bool visitBranch(Visit visit, TIntermBranch *node);
</del><ins>+    void visitSymbol(TIntermSymbol *node) override;
+    void visitConstantUnion(TIntermConstantUnion *node) override;
+    bool visitBinary(Visit visit, TIntermBinary *node) override;
+    bool visitUnary(Visit visit, TIntermUnary *node) override;
+    bool visitSelection(Visit visit, TIntermSelection *node) override;
+    bool visitSwitch(Visit visit, TIntermSwitch *node) override;
+    bool visitCase(Visit visit, TIntermCase *node) override;
+    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
+    bool visitLoop(Visit visit, TIntermLoop *node) override;
+    bool visitBranch(Visit visit, TIntermBranch *node) override;
</ins><span class="cx"> 
</span><span class="cx">     void visitCodeBlock(TIntermNode *node);
</span><span class="cx"> 
</span><span class="lines">@@ -57,8 +58,8 @@
</span><span class="cx">     TString hashName(const TString &amp;name);
</span><span class="cx">     // Same as hashName(), but without hashing built-in variables.
</span><span class="cx">     TString hashVariableName(const TString &amp;name);
</span><del>-    // Same as hashName(), but without hashing built-in functions.
-    TString hashFunctionName(const TString &amp;mangled_name);
</del><ins>+    // Same as hashName(), but without hashing built-in functions and with unmangling.
+    TString hashFunctionNameIfNeeded(const TName &amp;mangledName);
</ins><span class="cx">     // Used to translate function names for differences between ESSL and GLSL
</span><span class="cx">     virtual TString translateTextureFunction(TString &amp;name) { return name; }
</span><span class="cx"> 
</span><span class="lines">@@ -66,6 +67,9 @@
</span><span class="cx">     bool structDeclared(const TStructure *structure) const;
</span><span class="cx">     void declareStruct(const TStructure *structure);
</span><span class="cx"> 
</span><ins>+    void declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock);
+    void declareInterfaceBlock(const TInterfaceBlock *interfaceBlock);
+
</ins><span class="cx">     void writeBuiltInFunctionTriplet(Visit visit, const char *preStr, bool useEmulatedFunction);
</span><span class="cx"> 
</span><span class="cx">     TInfoSinkBase &amp;mObjSink;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorOutputHLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -19,37 +19,110 @@
</span><span class="cx"> #include &quot;compiler/translator/InfoSink.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/NodeSearch.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/RemoveSwitchFallThrough.h&quot;
</span><del>-#include &quot;compiler/translator/RewriteElseBlocks.h&quot;
</del><span class="cx"> #include &quot;compiler/translator/SearchSymbol.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/StructureHLSL.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/TranslatorHLSL.h&quot;
</span><del>-#include &quot;compiler/translator/UnfoldShortCircuit.h&quot;
</del><span class="cx"> #include &quot;compiler/translator/UniformHLSL.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/UtilsHLSL.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/blocklayout.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/util.h&quot;
</span><span class="cx"> 
</span><del>-namespace sh
</del><ins>+namespace
</ins><span class="cx"> {
</span><span class="cx"> 
</span><del>-TString OutputHLSL::TextureFunction::name() const
</del><ins>+bool IsSequence(TIntermNode *node)
</ins><span class="cx"> {
</span><del>-    TString name = &quot;gl_texture&quot;;
</del><ins>+    return node-&gt;getAsAggregate() != nullptr &amp;&amp; node-&gt;getAsAggregate()-&gt;getOp() == EOpSequence;
+}
</ins><span class="cx"> 
</span><del>-    if (IsSampler2D(sampler))
</del><ins>+void WriteSingleConstant(TInfoSinkBase &amp;out, const TConstantUnion *const constUnion)
+{
+    ASSERT(constUnion != nullptr);
+    switch (constUnion-&gt;getType())
</ins><span class="cx">     {
</span><del>-        name += &quot;2D&quot;;
</del><ins>+        case EbtFloat:
+            out &lt;&lt; std::min(FLT_MAX, std::max(-FLT_MAX, constUnion-&gt;getFConst()));
+            break;
+        case EbtInt:
+            out &lt;&lt; constUnion-&gt;getIConst();
+            break;
+        case EbtUInt:
+            out &lt;&lt; constUnion-&gt;getUConst();
+            break;
+        case EbtBool:
+            out &lt;&lt; constUnion-&gt;getBConst();
+            break;
+        default:
+            UNREACHABLE();
</ins><span class="cx">     }
</span><del>-    else if (IsSampler3D(sampler))
</del><ins>+}
+
+const TConstantUnion *WriteConstantUnionArray(TInfoSinkBase &amp;out,
+                                              const TConstantUnion *const constUnion,
+                                              const size_t size)
+{
+    const TConstantUnion *constUnionIterated = constUnion;
+    for (size_t i = 0; i &lt; size; i++, constUnionIterated++)
</ins><span class="cx">     {
</span><del>-        name += &quot;3D&quot;;
</del><ins>+        WriteSingleConstant(out, constUnionIterated);
+
+        if (i != size - 1)
+        {
+            out &lt;&lt; &quot;, &quot;;
+        }
</ins><span class="cx">     }
</span><del>-    else if (IsSamplerCube(sampler))
-    {
-        name += &quot;Cube&quot;;
-    }
-    else UNREACHABLE();
</del><ins>+    return constUnionIterated;
+}
</ins><span class="cx"> 
</span><ins>+void OutputIntTexCoordWrap(TInfoSinkBase &amp;out,
+                           const char *wrapMode,
+                           const char *size,
+                           const TString &amp;texCoord,
+                           const TString &amp;texCoordOffset,
+                           const char *texCoordOutName)
+{
+    // GLES 3.0.4 table 3.22 specifies how the wrap modes work. We don't use the formulas verbatim
+    // but rather use equivalent formulas that map better to HLSL.
+    out &lt;&lt; &quot;int &quot; &lt;&lt; texCoordOutName &lt;&lt; &quot;;\n&quot;;
+    out &lt;&lt; &quot;float &quot; &lt;&lt; texCoordOutName &lt;&lt; &quot;Offset = &quot; &lt;&lt; texCoord &lt;&lt; &quot; + float(&quot; &lt;&lt; texCoordOffset
+        &lt;&lt; &quot;) / &quot; &lt;&lt; size &lt;&lt; &quot;;\n&quot;;
+
+    // CLAMP_TO_EDGE
+    out &lt;&lt; &quot;if (&quot; &lt;&lt; wrapMode &lt;&lt; &quot; == 1)\n&quot;;
+    out &lt;&lt; &quot;{\n&quot;;
+    out &lt;&lt; &quot;    &quot; &lt;&lt; texCoordOutName &lt;&lt; &quot; = clamp(int(floor(&quot; &lt;&lt; size &lt;&lt; &quot; * &quot; &lt;&lt; texCoordOutName
+        &lt;&lt; &quot;Offset)), 0, int(&quot; &lt;&lt; size &lt;&lt; &quot;) - 1);\n&quot;;
+    out &lt;&lt; &quot;}\n&quot;;
+
+    // MIRRORED_REPEAT
+    out &lt;&lt; &quot;else if (&quot; &lt;&lt; wrapMode &lt;&lt; &quot; == 3)\n&quot;;
+    out &lt;&lt; &quot;{\n&quot;;
+    out &lt;&lt; &quot;    float coordWrapped = 1.0 - abs(frac(abs(&quot; &lt;&lt; texCoordOutName
+        &lt;&lt; &quot;Offset) * 0.5) * 2.0 - 1.0);\n&quot;;
+    out &lt;&lt; &quot;    &quot; &lt;&lt; texCoordOutName &lt;&lt; &quot; = int(floor(&quot; &lt;&lt; size &lt;&lt; &quot; * coordWrapped));\n&quot;;
+    out &lt;&lt; &quot;}\n&quot;;
+
+    // REPEAT
+    out &lt;&lt; &quot;else\n&quot;;
+    out &lt;&lt; &quot;{\n&quot;;
+    out &lt;&lt; &quot;    &quot; &lt;&lt; texCoordOutName &lt;&lt; &quot; = int(floor(&quot; &lt;&lt; size &lt;&lt; &quot; * frac(&quot; &lt;&lt; texCoordOutName
+        &lt;&lt; &quot;Offset)));\n&quot;;
+    out &lt;&lt; &quot;}\n&quot;;
+}
+
+} // namespace
+
+namespace sh
+{
+
+TString OutputHLSL::TextureFunction::name() const
+{
+    TString name = &quot;gl_texture&quot;;
+
+    // We need to include full the sampler type in the function name to make the signature unique
+    // on D3D11, where samplers are passed to texture functions as indices.
+    name += TextureTypeSuffix(this-&gt;sampler);
+
</ins><span class="cx">     if (proj)
</span><span class="cx">     {
</span><span class="cx">         name += &quot;Proj&quot;;
</span><span class="lines">@@ -107,11 +180,10 @@
</span><span class="cx">       mExtensionBehavior(extensionBehavior),
</span><span class="cx">       mSourcePath(sourcePath),
</span><span class="cx">       mOutputType(outputType),
</span><ins>+      mCompileOptions(compileOptions),
</ins><span class="cx">       mNumRenderTargets(numRenderTargets),
</span><del>-      mCompileOptions(compileOptions),
</del><span class="cx">       mCurrentFunctionMetadata(nullptr)
</span><span class="cx"> {
</span><del>-    mUnfoldShortCircuit = new UnfoldShortCircuit(this);
</del><span class="cx">     mInsideFunction = false;
</span><span class="cx"> 
</span><span class="cx">     mUsesFragColor = false;
</span><span class="lines">@@ -122,6 +194,7 @@
</span><span class="cx">     mUsesFrontFacing = false;
</span><span class="cx">     mUsesPointSize = false;
</span><span class="cx">     mUsesInstanceID = false;
</span><ins>+    mUsesVertexID                = false;
</ins><span class="cx">     mUsesFragDepth = false;
</span><span class="cx">     mUsesXor = false;
</span><span class="cx">     mUsesDiscardRewriting = false;
</span><span class="lines">@@ -139,7 +212,7 @@
</span><span class="cx">     mStructureHLSL = new StructureHLSL;
</span><span class="cx">     mUniformHLSL = new UniformHLSL(mStructureHLSL, outputType, uniforms);
</span><span class="cx"> 
</span><del>-    if (mOutputType == SH_HLSL9_OUTPUT)
</del><ins>+    if (mOutputType == SH_HLSL_3_0_OUTPUT)
</ins><span class="cx">     {
</span><span class="cx">         // Fragment shaders need dx_DepthRange, dx_ViewCoords and dx_DepthFront.
</span><span class="cx">         // Vertex shaders need a slightly different set: dx_DepthRange, dx_ViewCoords and dx_ViewAdjust.
</span><span class="lines">@@ -153,7 +226,6 @@
</span><span class="cx"> 
</span><span class="cx"> OutputHLSL::~OutputHLSL()
</span><span class="cx"> {
</span><del>-    SafeDelete(mUnfoldShortCircuit);
</del><span class="cx">     SafeDelete(mStructureHLSL);
</span><span class="cx">     SafeDelete(mUniformHLSL);
</span><span class="cx">     for (auto &amp;eqFunction : mStructEqualityFunctions)
</span><span class="lines">@@ -171,13 +243,6 @@
</span><span class="cx">     const std::vector&lt;TIntermTyped*&gt; &amp;flaggedStructs = FlagStd140ValueStructs(treeRoot);
</span><span class="cx">     makeFlaggedStructMaps(flaggedStructs);
</span><span class="cx"> 
</span><del>-    // Work around D3D9 bug that would manifest in vertex shaders with selection blocks which
-    // use a vertex attribute as a condition, and some related computation in the else block.
-    if (mOutputType == SH_HLSL9_OUTPUT &amp;&amp; mShaderType == GL_VERTEX_SHADER)
-    {
-        RewriteElseBlocks(treeRoot);
-    }
-
</del><span class="cx">     BuiltInFunctionEmulator builtInFunctionEmulator;
</span><span class="cx">     InitBuiltInFunctionEmulatorForHLSL(&amp;builtInFunctionEmulator);
</span><span class="cx">     builtInFunctionEmulator.MarkBuiltInFunctionsForEmulation(treeRoot);
</span><span class="lines">@@ -194,14 +259,10 @@
</span><span class="cx">     mInfoSinkStack.pop();
</span><span class="cx"> 
</span><span class="cx">     mInfoSinkStack.push(&amp;mFooter);
</span><del>-    if (!mDeferredGlobalInitializers.empty())
-    {
-        writeDeferredGlobalInitializers(mFooter);
-    }
</del><span class="cx">     mInfoSinkStack.pop();
</span><span class="cx"> 
</span><span class="cx">     mInfoSinkStack.push(&amp;mHeader);
</span><del>-    header(&amp;builtInFunctionEmulator);
</del><ins>+    header(mHeader, &amp;builtInFunctionEmulator);
</ins><span class="cx">     mInfoSinkStack.pop();
</span><span class="cx"> 
</span><span class="cx">     objSink &lt;&lt; mHeader.c_str();
</span><span class="lines">@@ -296,10 +357,8 @@
</span><span class="cx">     return init;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void OutputHLSL::header(const BuiltInFunctionEmulator *builtInFunctionEmulator)
</del><ins>+void OutputHLSL::header(TInfoSinkBase &amp;out, const BuiltInFunctionEmulator *builtInFunctionEmulator)
</ins><span class="cx"> {
</span><del>-    TInfoSinkBase &amp;out = getInfoSink();
-
</del><span class="cx">     TString varyings;
</span><span class="cx">     TString attributes;
</span><span class="cx">     TString flaggedStructs;
</span><span class="lines">@@ -336,7 +395,7 @@
</span><span class="cx"> 
</span><span class="cx">     out &lt;&lt; mStructureHLSL-&gt;structsHeader();
</span><span class="cx"> 
</span><del>-    out &lt;&lt; mUniformHLSL-&gt;uniformsHeader(mOutputType, mReferencedUniforms);
</del><ins>+    mUniformHLSL-&gt;uniformsHeader(out, mOutputType, mReferencedUniforms);
</ins><span class="cx">     out &lt;&lt; mUniformHLSL-&gt;interfaceBlocksHeader(mReferencedInterfaceBlocks);
</span><span class="cx"> 
</span><span class="cx">     if (!mEqualityFunctions.empty())
</span><span class="lines">@@ -459,7 +518,7 @@
</span><span class="cx">                    &quot;\n&quot;;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (mOutputType == SH_HLSL11_OUTPUT)
</del><ins>+        if (mOutputType == SH_HLSL_4_1_OUTPUT || mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT)
</ins><span class="cx">         {
</span><span class="cx">             out &lt;&lt; &quot;cbuffer DriverConstants : register(b1)\n&quot;
</span><span class="cx">                    &quot;{\n&quot;;
</span><span class="lines">@@ -479,6 +538,18 @@
</span><span class="cx">                 out &lt;&lt; &quot;    float3 dx_DepthFront : packoffset(c2);\n&quot;;
</span><span class="cx">             }
</span><span class="cx"> 
</span><ins>+            if (mUsesFragCoord)
+            {
+                // dx_ViewScale is only used in the fragment shader to correct
+                // the value for glFragCoord if necessary
+                out &lt;&lt; &quot;    float2 dx_ViewScale : packoffset(c3);\n&quot;;
+            }
+
+            if (mOutputType == SH_HLSL_4_1_OUTPUT)
+            {
+                mUniformHLSL-&gt;samplerMetadataUniforms(out, &quot;c4&quot;);
+            }
+
</ins><span class="cx">             out &lt;&lt; &quot;};\n&quot;;
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="lines">@@ -547,6 +618,11 @@
</span><span class="cx">             out &lt;&lt; &quot;static int gl_InstanceID;&quot;;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        if (mUsesVertexID)
+        {
+            out &lt;&lt; &quot;static int gl_VertexID;&quot;;
+        }
+
</ins><span class="cx">         out &lt;&lt; &quot;\n&quot;
</span><span class="cx">                &quot;// Varyings\n&quot;;
</span><span class="cx">         out &lt;&lt;  varyings;
</span><span class="lines">@@ -563,7 +639,7 @@
</span><span class="cx">                    &quot;\n&quot;;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (mOutputType == SH_HLSL11_OUTPUT)
</del><ins>+        if (mOutputType == SH_HLSL_4_1_OUTPUT || mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT)
</ins><span class="cx">         {
</span><span class="cx">             out &lt;&lt; &quot;cbuffer DriverConstants : register(b1)\n&quot;
</span><span class="cx">                     &quot;{\n&quot;;
</span><span class="lines">@@ -573,12 +649,19 @@
</span><span class="cx">                 out &lt;&lt; &quot;    float3 dx_DepthRange : packoffset(c0);\n&quot;;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            // dx_ViewAdjust and dx_ViewCoords will only be used in Feature Level 9 shaders.
-            // However, we declare it for all shaders (including Feature Level 10+).
-            // The bytecode is the same whether we declare it or not, since D3DCompiler removes it if it's unused.
</del><ins>+            // dx_ViewAdjust and dx_ViewCoords will only be used in Feature Level 9
+            // shaders. However, we declare it for all shaders (including Feature Level 10+).
+            // The bytecode is the same whether we declare it or not, since D3DCompiler removes it
+            // if it's unused.
</ins><span class="cx">             out &lt;&lt; &quot;    float4 dx_ViewAdjust : packoffset(c1);\n&quot;;
</span><span class="cx">             out &lt;&lt; &quot;    float2 dx_ViewCoords : packoffset(c2);\n&quot;;
</span><ins>+            out &lt;&lt; &quot;    float2 dx_ViewScale  : packoffset(c3);\n&quot;;
</ins><span class="cx"> 
</span><ins>+            if (mOutputType == SH_HLSL_4_1_OUTPUT)
+            {
+                mUniformHLSL-&gt;samplerMetadataUniforms(out, &quot;c4&quot;);
+            }
+
</ins><span class="cx">             out &lt;&lt; &quot;};\n&quot;
</span><span class="cx">                    &quot;\n&quot;;
</span><span class="cx">         }
</span><span class="lines">@@ -663,7 +746,7 @@
</span><span class="cx">         // Argument list
</span><span class="cx">         int hlslCoords = 4;
</span><span class="cx"> 
</span><del>-        if (mOutputType == SH_HLSL9_OUTPUT)
</del><ins>+        if (mOutputType == SH_HLSL_3_0_OUTPUT)
</ins><span class="cx">         {
</span><span class="cx">             switch(textureFunction-&gt;sampler)
</span><span class="cx">             {
</span><span class="lines">@@ -682,29 +765,20 @@
</span><span class="cx">               default: UNREACHABLE();
</span><span class="cx">             }
</span><span class="cx">         }
</span><del>-        else if (mOutputType == SH_HLSL11_OUTPUT)
</del><ins>+        else
</ins><span class="cx">         {
</span><del>-            switch(textureFunction-&gt;sampler)
</del><ins>+            hlslCoords = HLSLTextureCoordsCount(textureFunction-&gt;sampler);
+            if (mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT)
</ins><span class="cx">             {
</span><del>-              case EbtSampler2D:            out &lt;&lt; &quot;Texture2D x, SamplerState s&quot;;                hlslCoords = 2; break;
-              case EbtSampler3D:            out &lt;&lt; &quot;Texture3D x, SamplerState s&quot;;                hlslCoords = 3; break;
-              case EbtSamplerCube:          out &lt;&lt; &quot;TextureCube x, SamplerState s&quot;;              hlslCoords = 3; break;
-              case EbtSampler2DArray:       out &lt;&lt; &quot;Texture2DArray x, SamplerState s&quot;;           hlslCoords = 3; break;
-              case EbtISampler2D:           out &lt;&lt; &quot;Texture2D&lt;int4&gt; x, SamplerState s&quot;;          hlslCoords = 2; break;
-              case EbtISampler3D:           out &lt;&lt; &quot;Texture3D&lt;int4&gt; x, SamplerState s&quot;;          hlslCoords = 3; break;
-              case EbtISamplerCube:         out &lt;&lt; &quot;Texture2DArray&lt;int4&gt; x, SamplerState s&quot;;     hlslCoords = 3; break;
-              case EbtISampler2DArray:      out &lt;&lt; &quot;Texture2DArray&lt;int4&gt; x, SamplerState s&quot;;     hlslCoords = 3; break;
-              case EbtUSampler2D:           out &lt;&lt; &quot;Texture2D&lt;uint4&gt; x, SamplerState s&quot;;         hlslCoords = 2; break;
-              case EbtUSampler3D:           out &lt;&lt; &quot;Texture3D&lt;uint4&gt; x, SamplerState s&quot;;         hlslCoords = 3; break;
-              case EbtUSamplerCube:         out &lt;&lt; &quot;Texture2DArray&lt;uint4&gt; x, SamplerState s&quot;;    hlslCoords = 3; break;
-              case EbtUSampler2DArray:      out &lt;&lt; &quot;Texture2DArray&lt;uint4&gt; x, SamplerState s&quot;;    hlslCoords = 3; break;
-              case EbtSampler2DShadow:      out &lt;&lt; &quot;Texture2D x, SamplerComparisonState s&quot;;      hlslCoords = 2; break;
-              case EbtSamplerCubeShadow:    out &lt;&lt; &quot;TextureCube x, SamplerComparisonState s&quot;;    hlslCoords = 3; break;
-              case EbtSampler2DArrayShadow: out &lt;&lt; &quot;Texture2DArray x, SamplerComparisonState s&quot;; hlslCoords = 3; break;
-              default: UNREACHABLE();
</del><ins>+                out &lt;&lt; TextureString(textureFunction-&gt;sampler) &lt;&lt; &quot; x, &quot;
+                    &lt;&lt; SamplerString(textureFunction-&gt;sampler) &lt;&lt; &quot; s&quot;;
</ins><span class="cx">             }
</span><ins>+            else
+            {
+                ASSERT(mOutputType == SH_HLSL_4_1_OUTPUT);
+                out &lt;&lt; &quot;const uint samplerIndex&quot;;
+            }
</ins><span class="cx">         }
</span><del>-        else UNREACHABLE();
</del><span class="cx"> 
</span><span class="cx">         if (textureFunction-&gt;method == TextureFunction::FETCH)   // Integer coordinates
</span><span class="cx">         {
</span><span class="lines">@@ -795,25 +869,56 @@
</span><span class="cx">         out &lt;&lt; &quot;)\n&quot;
</span><span class="cx">                &quot;{\n&quot;;
</span><span class="cx"> 
</span><ins>+        // In some cases we use a variable to store the texture/sampler objects, but to work around
+        // a D3D11 compiler bug related to discard inside a loop that is conditional on texture
+        // sampling we need to call the function directly on a reference to the array. The bug was
+        // found using dEQP-GLES3.functional.shaders.discard*loop_texture* tests.
+        TString textureReference(&quot;x&quot;);
+        TString samplerReference(&quot;s&quot;);
+        if (mOutputType == SH_HLSL_4_1_OUTPUT)
+        {
+            TString suffix = TextureGroupSuffix(textureFunction-&gt;sampler);
+            if (TextureGroup(textureFunction-&gt;sampler) == HLSL_TEXTURE_2D)
+            {
+                textureReference = TString(&quot;textures&quot;) + suffix + &quot;[samplerIndex]&quot;;
+                samplerReference = TString(&quot;samplers&quot;) + suffix + &quot;[samplerIndex]&quot;;
+            }
+            else
+            {
+                out &lt;&lt; &quot;    const uint textureIndex = samplerIndex - textureIndexOffset&quot; &lt;&lt; suffix
+                    &lt;&lt; &quot;;\n&quot;;
+                textureReference = TString(&quot;textures&quot;) + suffix + &quot;[textureIndex]&quot;;
+                out &lt;&lt; &quot;    const uint samplerArrayIndex = samplerIndex - samplerIndexOffset&quot;
+                    &lt;&lt; suffix &lt;&lt; &quot;;\n&quot;;
+                samplerReference = TString(&quot;samplers&quot;) + suffix + &quot;[samplerArrayIndex]&quot;;
+            }
+        }
+
</ins><span class="cx">         if (textureFunction-&gt;method == TextureFunction::SIZE)
</span><span class="cx">         {
</span><ins>+            out &lt;&lt; &quot;int baseLevel = samplerMetadata[samplerIndex].baseLevel;\n&quot;;
</ins><span class="cx">             if (IsSampler2D(textureFunction-&gt;sampler) || IsSamplerCube(textureFunction-&gt;sampler))
</span><span class="cx">             {
</span><del>-                if (IsSamplerArray(textureFunction-&gt;sampler))
</del><ins>+                if (IsSamplerArray(textureFunction-&gt;sampler) ||
+                    (IsIntegerSampler(textureFunction-&gt;sampler) &amp;&amp;
+                     IsSamplerCube(textureFunction-&gt;sampler)))
</ins><span class="cx">                 {
</span><span class="cx">                     out &lt;&lt; &quot;    uint width; uint height; uint layers; uint numberOfLevels;\n&quot;
</span><del>-                           &quot;    x.GetDimensions(lod, width, height, layers, numberOfLevels);\n&quot;;
</del><ins>+                        &lt;&lt; &quot;    &quot; &lt;&lt; textureReference &lt;&lt; &quot;.GetDimensions(baseLevel + lod, width, &quot;
+                                                         &quot;height, layers, numberOfLevels);\n&quot;;
</ins><span class="cx">                 }
</span><span class="cx">                 else
</span><span class="cx">                 {
</span><span class="cx">                     out &lt;&lt; &quot;    uint width; uint height; uint numberOfLevels;\n&quot;
</span><del>-                           &quot;    x.GetDimensions(lod, width, height, numberOfLevels);\n&quot;;
</del><ins>+                        &lt;&lt; &quot;    &quot; &lt;&lt; textureReference
+                        &lt;&lt; &quot;.GetDimensions(baseLevel + lod, width, height, numberOfLevels);\n&quot;;
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">             else if (IsSampler3D(textureFunction-&gt;sampler))
</span><span class="cx">             {
</span><span class="cx">                 out &lt;&lt; &quot;    uint width; uint height; uint depth; uint numberOfLevels;\n&quot;
</span><del>-                       &quot;    x.GetDimensions(lod, width, height, depth, numberOfLevels);\n&quot;;
</del><ins>+                    &lt;&lt; &quot;    &quot; &lt;&lt; textureReference
+                    &lt;&lt; &quot;.GetDimensions(baseLevel + lod, width, height, depth, numberOfLevels);\n&quot;;
</ins><span class="cx">             }
</span><span class="cx">             else UNREACHABLE();
</span><span class="cx"> 
</span><span class="lines">@@ -839,13 +944,40 @@
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><ins>+            TString texCoordX(&quot;t.x&quot;);
+            TString texCoordY(&quot;t.y&quot;);
+            TString texCoordZ(&quot;t.z&quot;);
+            TString proj = &quot;&quot;;
+
+            if (textureFunction-&gt;proj)
+            {
+                switch (textureFunction-&gt;coords)
+                {
+                    case 3:
+                        proj = &quot; / t.z&quot;;
+                        break;
+                    case 4:
+                        proj = &quot; / t.w&quot;;
+                        break;
+                    default:
+                        UNREACHABLE();
+                }
+                if (proj != &quot;&quot;)
+                {
+                    texCoordX = &quot;(&quot; + texCoordX + proj + &quot;)&quot;;
+                    texCoordY = &quot;(&quot; + texCoordY + proj + &quot;)&quot;;
+                    texCoordZ = &quot;(&quot; + texCoordZ + proj + &quot;)&quot;;
+                }
+            }
+
</ins><span class="cx">             if (IsIntegerSampler(textureFunction-&gt;sampler) &amp;&amp; IsSamplerCube(textureFunction-&gt;sampler))
</span><span class="cx">             {
</span><span class="cx">                 out &lt;&lt; &quot;    float width; float height; float layers; float levels;\n&quot;;
</span><span class="cx"> 
</span><span class="cx">                 out &lt;&lt; &quot;    uint mip = 0;\n&quot;;
</span><span class="cx"> 
</span><del>-                out &lt;&lt; &quot;    x.GetDimensions(mip, width, height, layers, levels);\n&quot;;
</del><ins>+                out &lt;&lt; &quot;    &quot; &lt;&lt; textureReference
+                    &lt;&lt; &quot;.GetDimensions(mip, width, height, layers, levels);\n&quot;;
</ins><span class="cx"> 
</span><span class="cx">                 out &lt;&lt; &quot;    bool xMajor = abs(t.x) &gt; abs(t.y) &amp;&amp; abs(t.x) &gt; abs(t.z);\n&quot;;
</span><span class="cx">                 out &lt;&lt; &quot;    bool yMajor = abs(t.y) &gt; abs(t.z) &amp;&amp; abs(t.y) &gt; abs(t.x);\n&quot;;
</span><span class="lines">@@ -866,6 +998,63 @@
</span><span class="cx"> 
</span><span class="cx">                 out &lt;&lt; &quot;    t.x = (u * 0.5f / m) + 0.5f;\n&quot;;
</span><span class="cx">                 out &lt;&lt; &quot;    t.y = (v * 0.5f / m) + 0.5f;\n&quot;;
</span><ins>+
+                // Mip level computation.
+                if (textureFunction-&gt;method == TextureFunction::IMPLICIT ||
+                    textureFunction-&gt;method == TextureFunction::LOD ||
+                    textureFunction-&gt;method == TextureFunction::GRAD)
+                {
+                    if (textureFunction-&gt;method == TextureFunction::IMPLICIT)
+                    {
+                        out &lt;&lt; &quot;    float2 tSized = float2(t.x * width, t.y * height);\n&quot;
+                               &quot;    float2 dx = ddx(tSized);\n&quot;
+                               &quot;    float2 dy = ddy(tSized);\n&quot;
+                               &quot;    float lod = 0.5f * log2(max(dot(dx, dx), dot(dy, dy)));\n&quot;;
+                    }
+                    else if (textureFunction-&gt;method == TextureFunction::GRAD)
+                    {
+                        // ESSL 3.00.6 spec section 8.8: &quot;For the cube version, the partial
+                        // derivatives of P are assumed to be in the coordinate system used before
+                        // texture coordinates are projected onto the appropriate cube face.&quot;
+                        // ddx[0] and ddy[0] are the derivatives of t.x passed into the function
+                        // ddx[1] and ddy[1] are the derivatives of t.y passed into the function
+                        // ddx[2] and ddy[2] are the derivatives of t.z passed into the function
+                        // Determine the derivatives of u, v and m
+                        out &lt;&lt; &quot;    float dudx = xMajor ? ddx[2] : (yMajor &amp;&amp; t.y &lt; 0.0f ? -ddx[0] &quot;
+                               &quot;: ddx[0]);\n&quot;
+                               &quot;    float dudy = xMajor ? ddy[2] : (yMajor &amp;&amp; t.y &lt; 0.0f ? -ddy[0] &quot;
+                               &quot;: ddy[0]);\n&quot;
+                               &quot;    float dvdx = yMajor ? ddx[2] : (negative ? ddx[1] : -ddx[1]);\n&quot;
+                               &quot;    float dvdy = yMajor ? ddy[2] : (negative ? ddy[1] : -ddy[1]);\n&quot;
+                               &quot;    float dmdx = xMajor ? ddx[0] : (yMajor ? ddx[1] : ddx[2]);\n&quot;
+                               &quot;    float dmdy = xMajor ? ddy[0] : (yMajor ? ddy[1] : ddy[2]);\n&quot;;
+                        // Now determine the derivatives of the face coordinates, using the
+                        // derivatives calculated above.
+                        // d / dx (u(x) * 0.5 / m(x) + 0.5)
+                        // = 0.5 * (m(x) * u'(x) - u(x) * m'(x)) / m(x)^2
+                        out &lt;&lt; &quot;    float dfacexdx = 0.5f * (m * dudx - u * dmdx) / (m * m);\n&quot;
+                               &quot;    float dfaceydx = 0.5f * (m * dvdx - v * dmdx) / (m * m);\n&quot;
+                               &quot;    float dfacexdy = 0.5f * (m * dudy - u * dmdy) / (m * m);\n&quot;
+                               &quot;    float dfaceydy = 0.5f * (m * dvdy - v * dmdy) / (m * m);\n&quot;
+                               &quot;    float2 sizeVec = float2(width, height);\n&quot;
+                               &quot;    float2 faceddx = float2(dfacexdx, dfaceydx) * sizeVec;\n&quot;
+                               &quot;    float2 faceddy = float2(dfacexdy, dfaceydy) * sizeVec;\n&quot;;
+                        // Optimization: instead of: log2(max(length(faceddx), length(faceddy)))
+                        // we compute: log2(max(length(faceddx)^2, length(faceddy)^2)) / 2
+                        out &lt;&lt; &quot;    float lengthfaceddx2 = dot(faceddx, faceddx);\n&quot;
+                               &quot;    float lengthfaceddy2 = dot(faceddy, faceddy);\n&quot;
+                               &quot;    float lod = log2(max(lengthfaceddx2, lengthfaceddy2)) * &quot;
+                               &quot;0.5f;\n&quot;;
+                    }
+                    out &lt;&lt; &quot;    mip = uint(min(max(round(lod), 0), levels - 1));\n&quot;
+                        &lt;&lt; &quot;    &quot; &lt;&lt; textureReference
+                        &lt;&lt; &quot;.GetDimensions(mip, width, height, layers, levels);\n&quot;;
+                }
+
+                // Convert from normalized floating-point to integer
+                texCoordX = &quot;int(floor(width * frac(&quot; + texCoordX + &quot;)))&quot;;
+                texCoordY = &quot;int(floor(height * frac(&quot; + texCoordY + &quot;)))&quot;;
+                texCoordZ = &quot;face&quot;;
</ins><span class="cx">             }
</span><span class="cx">             else if (IsIntegerSampler(textureFunction-&gt;sampler) &amp;&amp;
</span><span class="cx">                      textureFunction-&gt;method != TextureFunction::FETCH)
</span><span class="lines">@@ -886,11 +1075,13 @@
</span><span class="cx">                         }
</span><span class="cx">                         else
</span><span class="cx">                         {
</span><ins>+
+                            out &lt;&lt; &quot;    &quot; &lt;&lt; textureReference
+                                &lt;&lt; &quot;.GetDimensions(0, width, height, layers, levels);\n&quot;;
</ins><span class="cx">                             if (textureFunction-&gt;method == TextureFunction::IMPLICIT ||
</span><span class="cx">                                 textureFunction-&gt;method == TextureFunction::BIAS)
</span><span class="cx">                             {
</span><del>-                                out &lt;&lt; &quot;    x.GetDimensions(0, width, height, layers, levels);\n&quot;
-                                       &quot;    float2 tSized = float2(t.x * width, t.y * height);\n&quot;
</del><ins>+                                out &lt;&lt; &quot;    float2 tSized = float2(t.x * width, t.y * height);\n&quot;
</ins><span class="cx">                                        &quot;    float dx = length(ddx(tSized));\n&quot;
</span><span class="cx">                                        &quot;    float dy = length(ddy(tSized));\n&quot;
</span><span class="cx">                                        &quot;    float lod = log2(max(dx, dy));\n&quot;;
</span><span class="lines">@@ -902,14 +1093,18 @@
</span><span class="cx">                             }
</span><span class="cx">                             else if (textureFunction-&gt;method == TextureFunction::GRAD)
</span><span class="cx">                             {
</span><del>-                                out &lt;&lt; &quot;    x.GetDimensions(0, width, height, layers, levels);\n&quot;
-                                       &quot;    float lod = log2(max(length(ddx), length(ddy)));\n&quot;;
</del><ins>+                                out &lt;&lt; &quot;    float2 sizeVec = float2(width, height);\n&quot;
+                                       &quot;    float2 sizeDdx = ddx * sizeVec;\n&quot;
+                                       &quot;    float2 sizeDdy = ddy * sizeVec;\n&quot;
+                                       &quot;    float lod = log2(max(dot(sizeDdx, sizeDdx), &quot;
+                                       &quot;dot(sizeDdy, sizeDdy))) * 0.5f;\n&quot;;
</ins><span class="cx">                             }
</span><span class="cx"> 
</span><span class="cx">                             out &lt;&lt; &quot;    uint mip = uint(min(max(round(lod), 0), levels - 1));\n&quot;;
</span><span class="cx">                         }
</span><span class="cx"> 
</span><del>-                        out &lt;&lt; &quot;    x.GetDimensions(mip, width, height, layers, levels);\n&quot;;
</del><ins>+                        out &lt;&lt; &quot;    &quot; &lt;&lt; textureReference
+                            &lt;&lt; &quot;.GetDimensions(mip, width, height, layers, levels);\n&quot;;
</ins><span class="cx">                     }
</span><span class="cx">                     else
</span><span class="cx">                     {
</span><span class="lines">@@ -925,11 +1120,13 @@
</span><span class="cx">                         }
</span><span class="cx">                         else
</span><span class="cx">                         {
</span><ins>+                            out &lt;&lt; &quot;    &quot; &lt;&lt; textureReference
+                                &lt;&lt; &quot;.GetDimensions(0, width, height, levels);\n&quot;;
+
</ins><span class="cx">                             if (textureFunction-&gt;method == TextureFunction::IMPLICIT ||
</span><span class="cx">                                 textureFunction-&gt;method == TextureFunction::BIAS)
</span><span class="cx">                             {
</span><del>-                                out &lt;&lt; &quot;    x.GetDimensions(0, width, height, levels);\n&quot;
-                                       &quot;    float2 tSized = float2(t.x * width, t.y * height);\n&quot;
</del><ins>+                                out &lt;&lt; &quot;    float2 tSized = float2(t.x * width, t.y * height);\n&quot;
</ins><span class="cx">                                        &quot;    float dx = length(ddx(tSized));\n&quot;
</span><span class="cx">                                        &quot;    float dy = length(ddy(tSized));\n&quot;
</span><span class="cx">                                        &quot;    float lod = log2(max(dx, dy));\n&quot;;
</span><span class="lines">@@ -939,20 +1136,20 @@
</span><span class="cx">                                     out &lt;&lt; &quot;    lod += bias;\n&quot;;
</span><span class="cx">                                 }
</span><span class="cx">                             }
</span><del>-                            else if (textureFunction-&gt;method == TextureFunction::LOD)
-                            {
-                                out &lt;&lt; &quot;    x.GetDimensions(0, width, height, levels);\n&quot;;
-                            }
</del><span class="cx">                             else if (textureFunction-&gt;method == TextureFunction::GRAD)
</span><span class="cx">                             {
</span><del>-                                out &lt;&lt; &quot;    x.GetDimensions(0, width, height, levels);\n&quot;
-                                       &quot;    float lod = log2(max(length(ddx), length(ddy)));\n&quot;;
</del><ins>+                                out &lt;&lt; &quot;    float2 sizeVec = float2(width, height);\n&quot;
+                                       &quot;    float2 sizeDdx = ddx * sizeVec;\n&quot;
+                                       &quot;    float2 sizeDdy = ddy * sizeVec;\n&quot;
+                                       &quot;    float lod = log2(max(dot(sizeDdx, sizeDdx), &quot;
+                                       &quot;dot(sizeDdy, sizeDdy))) * 0.5f;\n&quot;;
</ins><span class="cx">                             }
</span><span class="cx"> 
</span><span class="cx">                             out &lt;&lt; &quot;    uint mip = uint(min(max(round(lod), 0), levels - 1));\n&quot;;
</span><span class="cx">                         }
</span><span class="cx"> 
</span><del>-                        out &lt;&lt; &quot;    x.GetDimensions(mip, width, height, levels);\n&quot;;
</del><ins>+                        out &lt;&lt; &quot;    &quot; &lt;&lt; textureReference
+                            &lt;&lt; &quot;.GetDimensions(mip, width, height, levels);\n&quot;;
</ins><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="cx">                 else if (IsSampler3D(textureFunction-&gt;sampler))
</span><span class="lines">@@ -969,11 +1166,14 @@
</span><span class="cx">                     }
</span><span class="cx">                     else
</span><span class="cx">                     {
</span><ins>+                        out &lt;&lt; &quot;    &quot; &lt;&lt; textureReference
+                            &lt;&lt; &quot;.GetDimensions(0, width, height, depth, levels);\n&quot;;
+
</ins><span class="cx">                         if (textureFunction-&gt;method == TextureFunction::IMPLICIT ||
</span><span class="cx">                             textureFunction-&gt;method == TextureFunction::BIAS)
</span><span class="cx">                         {
</span><del>-                            out &lt;&lt; &quot;    x.GetDimensions(0, width, height, depth, levels);\n&quot;
-                                   &quot;    float3 tSized = float3(t.x * width, t.y * height, t.z * depth);\n&quot;
</del><ins>+                            out &lt;&lt; &quot;    float3 tSized = float3(t.x * width, t.y * height, t.z * &quot;
+                                   &quot;depth);\n&quot;
</ins><span class="cx">                                    &quot;    float dx = length(ddx(tSized));\n&quot;
</span><span class="cx">                                    &quot;    float dy = length(ddy(tSized));\n&quot;
</span><span class="cx">                                    &quot;    float lod = log2(max(dx, dy));\n&quot;;
</span><span class="lines">@@ -985,22 +1185,67 @@
</span><span class="cx">                         }
</span><span class="cx">                         else if (textureFunction-&gt;method == TextureFunction::GRAD)
</span><span class="cx">                         {
</span><del>-                            out &lt;&lt; &quot;    x.GetDimensions(0, width, height, depth, levels);\n&quot;
-                                   &quot;    float lod = log2(max(length(ddx), length(ddy)));\n&quot;;
</del><ins>+                            out &lt;&lt; &quot;    float3 sizeVec = float3(width, height, depth);\n&quot;
+                                   &quot;    float3 sizeDdx = ddx * sizeVec;\n&quot;
+                                   &quot;    float3 sizeDdy = ddy * sizeVec;\n&quot;
+                                   &quot;    float lod = log2(max(dot(sizeDdx, sizeDdx), dot(sizeDdy, &quot;
+                                   &quot;sizeDdy))) * 0.5f;\n&quot;;
</ins><span class="cx">                         }
</span><span class="cx"> 
</span><span class="cx">                         out &lt;&lt; &quot;    uint mip = uint(min(max(round(lod), 0), levels - 1));\n&quot;;
</span><span class="cx">                     }
</span><span class="cx"> 
</span><del>-                    out &lt;&lt; &quot;    x.GetDimensions(mip, width, height, depth, levels);\n&quot;;
</del><ins>+                    out &lt;&lt; &quot;    &quot; &lt;&lt; textureReference
+                        &lt;&lt; &quot;.GetDimensions(mip, width, height, depth, levels);\n&quot;;
</ins><span class="cx">                 }
</span><span class="cx">                 else UNREACHABLE();
</span><ins>+
+                // Convert from normalized floating-point to integer
+                out &lt;&lt; &quot;int wrapS = samplerMetadata[samplerIndex].wrapModes &amp; 0x3;\n&quot;;
+                if (textureFunction-&gt;offset)
+                {
+                    OutputIntTexCoordWrap(out, &quot;wrapS&quot;, &quot;width&quot;, texCoordX, &quot;offset.x&quot;, &quot;tix&quot;);
+                }
+                else
+                {
+                    OutputIntTexCoordWrap(out, &quot;wrapS&quot;, &quot;width&quot;, texCoordX, &quot;0&quot;, &quot;tix&quot;);
+                }
+                texCoordX = &quot;tix&quot;;
+                out &lt;&lt; &quot;int wrapT = (samplerMetadata[samplerIndex].wrapModes &gt;&gt; 2) &amp; 0x3;\n&quot;;
+                if (textureFunction-&gt;offset)
+                {
+                    OutputIntTexCoordWrap(out, &quot;wrapT&quot;, &quot;height&quot;, texCoordY, &quot;offset.y&quot;, &quot;tiy&quot;);
+                }
+                else
+                {
+                    OutputIntTexCoordWrap(out, &quot;wrapT&quot;, &quot;height&quot;, texCoordY, &quot;0&quot;, &quot;tiy&quot;);
+                }
+                texCoordY = &quot;tiy&quot;;
+
+                if (IsSamplerArray(textureFunction-&gt;sampler))
+                {
+                    texCoordZ = &quot;int(max(0, min(layers - 1, floor(0.5 + t.z))))&quot;;
+                }
+                else if (!IsSamplerCube(textureFunction-&gt;sampler) &amp;&amp;
+                         !IsSampler2D(textureFunction-&gt;sampler))
+                {
+                    out &lt;&lt; &quot;int wrapR = (samplerMetadata[samplerIndex].wrapModes &gt;&gt; 4) &amp; 0x3;\n&quot;;
+                    if (textureFunction-&gt;offset)
+                    {
+                        OutputIntTexCoordWrap(out, &quot;wrapR&quot;, &quot;depth&quot;, texCoordZ, &quot;offset.z&quot;, &quot;tiz&quot;);
+                    }
+                    else
+                    {
+                        OutputIntTexCoordWrap(out, &quot;wrapR&quot;, &quot;depth&quot;, texCoordZ, &quot;0&quot;, &quot;tiz&quot;);
+                    }
+                    texCoordZ = &quot;tiz&quot;;
+                }
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             out &lt;&lt; &quot;    return &quot;;
</span><span class="cx"> 
</span><span class="cx">             // HLSL intrinsic
</span><del>-            if (mOutputType == SH_HLSL9_OUTPUT)
</del><ins>+            if (mOutputType == SH_HLSL_3_0_OUTPUT)
</ins><span class="cx">             {
</span><span class="cx">                 switch(textureFunction-&gt;sampler)
</span><span class="cx">                 {
</span><span class="lines">@@ -1011,45 +1256,71 @@
</span><span class="cx"> 
</span><span class="cx">                 switch(textureFunction-&gt;method)
</span><span class="cx">                 {
</span><del>-                  case TextureFunction::IMPLICIT: out &lt;&lt; &quot;(s, &quot;;     break;
-                  case TextureFunction::BIAS:     out &lt;&lt; &quot;bias(s, &quot;; break;
-                  case TextureFunction::LOD:      out &lt;&lt; &quot;lod(s, &quot;;  break;
-                  case TextureFunction::LOD0:     out &lt;&lt; &quot;lod(s, &quot;;  break;
-                  case TextureFunction::LOD0BIAS: out &lt;&lt; &quot;lod(s, &quot;;  break;
</del><ins>+                    case TextureFunction::IMPLICIT:
+                        out &lt;&lt; &quot;(&quot; &lt;&lt; samplerReference &lt;&lt; &quot;, &quot;;
+                        break;
+                    case TextureFunction::BIAS:
+                        out &lt;&lt; &quot;bias(&quot; &lt;&lt; samplerReference &lt;&lt; &quot;, &quot;;
+                        break;
+                    case TextureFunction::LOD:
+                        out &lt;&lt; &quot;lod(&quot; &lt;&lt; samplerReference &lt;&lt; &quot;, &quot;;
+                        break;
+                    case TextureFunction::LOD0:
+                        out &lt;&lt; &quot;lod(&quot; &lt;&lt; samplerReference &lt;&lt; &quot;, &quot;;
+                        break;
+                    case TextureFunction::LOD0BIAS:
+                        out &lt;&lt; &quot;lod(&quot; &lt;&lt; samplerReference &lt;&lt; &quot;, &quot;;
+                        break;
</ins><span class="cx">                   default: UNREACHABLE();
</span><span class="cx">                 }
</span><span class="cx">             }
</span><del>-            else if (mOutputType == SH_HLSL11_OUTPUT)
</del><ins>+            else if (mOutputType == SH_HLSL_4_1_OUTPUT || mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT)
</ins><span class="cx">             {
</span><span class="cx">                 if (textureFunction-&gt;method == TextureFunction::GRAD)
</span><span class="cx">                 {
</span><span class="cx">                     if (IsIntegerSampler(textureFunction-&gt;sampler))
</span><span class="cx">                     {
</span><del>-                        out &lt;&lt; &quot;x.Load(&quot;;
</del><ins>+                        out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.Load(&quot;;
</ins><span class="cx">                     }
</span><span class="cx">                     else if (IsShadowSampler(textureFunction-&gt;sampler))
</span><span class="cx">                     {
</span><del>-                        out &lt;&lt; &quot;x.SampleCmpLevelZero(s, &quot;;
</del><ins>+                        out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleCmpLevelZero(&quot; &lt;&lt; samplerReference
+                            &lt;&lt; &quot;, &quot;;
</ins><span class="cx">                     }
</span><span class="cx">                     else
</span><span class="cx">                     {
</span><del>-                        out &lt;&lt; &quot;x.SampleGrad(s, &quot;;
</del><ins>+                        out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleGrad(&quot; &lt;&lt; samplerReference &lt;&lt; &quot;, &quot;;
</ins><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="cx">                 else if (IsIntegerSampler(textureFunction-&gt;sampler) ||
</span><span class="cx">                          textureFunction-&gt;method == TextureFunction::FETCH)
</span><span class="cx">                 {
</span><del>-                    out &lt;&lt; &quot;x.Load(&quot;;
</del><ins>+                    out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.Load(&quot;;
</ins><span class="cx">                 }
</span><span class="cx">                 else if (IsShadowSampler(textureFunction-&gt;sampler))
</span><span class="cx">                 {
</span><span class="cx">                     switch(textureFunction-&gt;method)
</span><span class="cx">                     {
</span><del>-                      case TextureFunction::IMPLICIT: out &lt;&lt; &quot;x.SampleCmp(s, &quot;;          break;
-                      case TextureFunction::BIAS:     out &lt;&lt; &quot;x.SampleCmp(s, &quot;;          break;
-                      case TextureFunction::LOD:      out &lt;&lt; &quot;x.SampleCmp(s, &quot;;          break;
-                      case TextureFunction::LOD0:     out &lt;&lt; &quot;x.SampleCmpLevelZero(s, &quot;; break;
-                      case TextureFunction::LOD0BIAS: out &lt;&lt; &quot;x.SampleCmpLevelZero(s, &quot;; break;
</del><ins>+                        case TextureFunction::IMPLICIT:
+                            out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleCmp(&quot; &lt;&lt; samplerReference
+                                &lt;&lt; &quot;, &quot;;
+                            break;
+                        case TextureFunction::BIAS:
+                            out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleCmp(&quot; &lt;&lt; samplerReference
+                                &lt;&lt; &quot;, &quot;;
+                            break;
+                        case TextureFunction::LOD:
+                            out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleCmp(&quot; &lt;&lt; samplerReference
+                                &lt;&lt; &quot;, &quot;;
+                            break;
+                        case TextureFunction::LOD0:
+                            out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleCmpLevelZero(&quot;
+                                &lt;&lt; samplerReference &lt;&lt; &quot;, &quot;;
+                            break;
+                        case TextureFunction::LOD0BIAS:
+                            out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleCmpLevelZero(&quot;
+                                &lt;&lt; samplerReference &lt;&lt; &quot;, &quot;;
+                            break;
</ins><span class="cx">                       default: UNREACHABLE();
</span><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="lines">@@ -1057,23 +1328,31 @@
</span><span class="cx">                 {
</span><span class="cx">                     switch(textureFunction-&gt;method)
</span><span class="cx">                     {
</span><del>-                      case TextureFunction::IMPLICIT: out &lt;&lt; &quot;x.Sample(s, &quot;;      break;
-                      case TextureFunction::BIAS:     out &lt;&lt; &quot;x.SampleBias(s, &quot;;  break;
-                      case TextureFunction::LOD:      out &lt;&lt; &quot;x.SampleLevel(s, &quot;; break;
-                      case TextureFunction::LOD0:     out &lt;&lt; &quot;x.SampleLevel(s, &quot;; break;
-                      case TextureFunction::LOD0BIAS: out &lt;&lt; &quot;x.SampleLevel(s, &quot;; break;
</del><ins>+                        case TextureFunction::IMPLICIT:
+                            out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.Sample(&quot; &lt;&lt; samplerReference &lt;&lt; &quot;, &quot;;
+                            break;
+                        case TextureFunction::BIAS:
+                            out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleBias(&quot; &lt;&lt; samplerReference
+                                &lt;&lt; &quot;, &quot;;
+                            break;
+                        case TextureFunction::LOD:
+                            out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleLevel(&quot; &lt;&lt; samplerReference
+                                &lt;&lt; &quot;, &quot;;
+                            break;
+                        case TextureFunction::LOD0:
+                            out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleLevel(&quot; &lt;&lt; samplerReference
+                                &lt;&lt; &quot;, &quot;;
+                            break;
+                        case TextureFunction::LOD0BIAS:
+                            out &lt;&lt; &quot;&quot; &lt;&lt; textureReference &lt;&lt; &quot;.SampleLevel(&quot; &lt;&lt; samplerReference
+                                &lt;&lt; &quot;, &quot;;
+                            break;
</ins><span class="cx">                       default: UNREACHABLE();
</span><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">             else UNREACHABLE();
</span><span class="cx"> 
</span><del>-            // Integer sampling requires integer addresses
-            TString addressx = &quot;&quot;;
-            TString addressy = &quot;&quot;;
-            TString addressz = &quot;&quot;;
-            TString close = &quot;&quot;;
-
</del><span class="cx">             if (IsIntegerSampler(textureFunction-&gt;sampler) ||
</span><span class="cx">                 textureFunction-&gt;method == TextureFunction::FETCH)
</span><span class="cx">             {
</span><span class="lines">@@ -1083,28 +1362,6 @@
</span><span class="cx">                   case 3: out &lt;&lt; &quot;int4(&quot;; break;
</span><span class="cx">                   default: UNREACHABLE();
</span><span class="cx">                 }
</span><del>-
-                // Convert from normalized floating-point to integer
-                if (textureFunction-&gt;method != TextureFunction::FETCH)
-                {
-                    addressx = &quot;int(floor(width * frac((&quot;;
-                    addressy = &quot;int(floor(height * frac((&quot;;
-
-                    if (IsSamplerArray(textureFunction-&gt;sampler))
-                    {
-                        addressz = &quot;int(max(0, min(layers - 1, floor(0.5 + &quot;;
-                    }
-                    else if (IsSamplerCube(textureFunction-&gt;sampler))
-                    {
-                        addressz = &quot;((((&quot;;
-                    }
-                    else
-                    {
-                        addressz = &quot;int(floor(depth * frac((&quot;;
-                    }
-
-                    close = &quot;))))&quot;;
-                }
</del><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><span class="lines">@@ -1117,22 +1374,10 @@
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            TString proj = &quot;&quot;;   // Only used for projected textures
</del><ins>+            out &lt;&lt; texCoordX &lt;&lt; &quot;, &quot; &lt;&lt; texCoordY;
</ins><span class="cx"> 
</span><del>-            if (textureFunction-&gt;proj)
</del><ins>+            if (mOutputType == SH_HLSL_3_0_OUTPUT)
</ins><span class="cx">             {
</span><del>-                switch(textureFunction-&gt;coords)
-                {
-                  case 3: proj = &quot; / t.z&quot;; break;
-                  case 4: proj = &quot; / t.w&quot;; break;
-                  default: UNREACHABLE();
-                }
-            }
-
-            out &lt;&lt; addressx + (&quot;t.x&quot; + proj) + close + &quot;, &quot; + addressy + (&quot;t.y&quot; + proj) + close;
-
-            if (mOutputType == SH_HLSL9_OUTPUT)
-            {
</del><span class="cx">                 if (hlslCoords &gt;= 3)
</span><span class="cx">                 {
</span><span class="cx">                     if (textureFunction-&gt;coords &lt; 3)
</span><span class="lines">@@ -1141,7 +1386,7 @@
</span><span class="cx">                     }
</span><span class="cx">                     else
</span><span class="cx">                     {
</span><del>-                        out &lt;&lt; &quot;, t.z&quot; + proj;
</del><ins>+                        out &lt;&lt; &quot;, t.z&quot; &lt;&lt; proj;
</ins><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="lines">@@ -1159,18 +1404,13 @@
</span><span class="cx"> 
</span><span class="cx">                 out &lt;&lt; &quot;));\n&quot;;
</span><span class="cx">             }
</span><del>-            else if (mOutputType == SH_HLSL11_OUTPUT)
</del><ins>+            else if (mOutputType == SH_HLSL_4_1_OUTPUT || mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT)
</ins><span class="cx">             {
</span><span class="cx">                 if (hlslCoords &gt;= 3)
</span><span class="cx">                 {
</span><del>-                    if (IsIntegerSampler(textureFunction-&gt;sampler) &amp;&amp; IsSamplerCube(textureFunction-&gt;sampler))
-                    {
-                        out &lt;&lt; &quot;, face&quot;;
-                    }
-                    else
-                    {
-                        out &lt;&lt; &quot;, &quot; + addressz + (&quot;t.z&quot; + proj) + close;
-                    }
</del><ins>+                    ASSERT(!IsIntegerSampler(textureFunction-&gt;sampler) ||
+                           !IsSamplerCube(textureFunction-&gt;sampler) || texCoordZ == &quot;face&quot;);
+                    out &lt;&lt; &quot;, &quot; &lt;&lt; texCoordZ;
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 if (textureFunction-&gt;method == TextureFunction::GRAD)
</span><span class="lines">@@ -1240,7 +1480,8 @@
</span><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                if (textureFunction-&gt;offset)
</del><ins>+                if (textureFunction-&gt;offset &amp;&amp; (!IsIntegerSampler(textureFunction-&gt;sampler) ||
+                                                textureFunction-&gt;method == TextureFunction::FETCH))
</ins><span class="cx">                 {
</span><span class="cx">                     out &lt;&lt; &quot;, offset&quot;;
</span><span class="cx">                 }
</span><span class="lines">@@ -1335,7 +1576,8 @@
</span><span class="cx"> 
</span><span class="cx">             ensureStructDefined(nodeType);
</span><span class="cx"> 
</span><del>-            out &lt;&lt; DecorateUniform(name, nodeType);
</del><ins>+            const TName &amp;nameWithMetadata = node-&gt;getName();
+            out &lt;&lt; DecorateUniform(nameWithMetadata, nodeType);
</ins><span class="cx">         }
</span><span class="cx">         else if (qualifier == EvqAttribute || qualifier == EvqVertexIn)
</span><span class="cx">         {
</span><span class="lines">@@ -1387,18 +1629,19 @@
</span><span class="cx">             mUsesInstanceID = true;
</span><span class="cx">             out &lt;&lt; name;
</span><span class="cx">         }
</span><del>-        else if (name == &quot;gl_FragDepthEXT&quot;)
</del><ins>+        else if (qualifier == EvqVertexID)
</ins><span class="cx">         {
</span><ins>+            mUsesVertexID = true;
+            out &lt;&lt; name;
+        }
+        else if (name == &quot;gl_FragDepthEXT&quot; || name == &quot;gl_FragDepth&quot;)
+        {
</ins><span class="cx">             mUsesFragDepth = true;
</span><span class="cx">             out &lt;&lt; &quot;gl_Depth&quot;;
</span><span class="cx">         }
</span><del>-        else if (node-&gt;isInternal())
-        {
-            out &lt;&lt; name;
-        }
</del><span class="cx">         else
</span><span class="cx">         {
</span><del>-            out &lt;&lt; Decorate(name);
</del><ins>+            out &lt;&lt; DecorateIfNeeded(node-&gt;getName());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -1414,11 +1657,11 @@
</span><span class="cx">     {
</span><span class="cx">         if (op == EOpEqual)
</span><span class="cx">         {
</span><del>-            outputTriplet(visit, &quot;(&quot;, &quot; == &quot;, &quot;)&quot;, out);
</del><ins>+            outputTriplet(out, visit, &quot;(&quot;, &quot; == &quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            outputTriplet(visit, &quot;(&quot;, &quot; != &quot;, &quot;)&quot;, out);
</del><ins>+            outputTriplet(out, visit, &quot;(&quot;, &quot; != &quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="lines">@@ -1431,22 +1674,58 @@
</span><span class="cx">         if (type.isArray())
</span><span class="cx">         {
</span><span class="cx">             const TString &amp;functionName = addArrayEqualityFunction(type);
</span><del>-            outputTriplet(visit, (functionName + &quot;(&quot;).c_str(), &quot;, &quot;, &quot;)&quot;, out);
</del><ins>+            outputTriplet(out, visit, (functionName + &quot;(&quot;).c_str(), &quot;, &quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         else if (type.getBasicType() == EbtStruct)
</span><span class="cx">         {
</span><span class="cx">             const TStructure &amp;structure = *type.getStruct();
</span><span class="cx">             const TString &amp;functionName = addStructEqualityFunction(structure);
</span><del>-            outputTriplet(visit, (functionName + &quot;(&quot;).c_str(), &quot;, &quot;, &quot;)&quot;, out);
</del><ins>+            outputTriplet(out, visit, (functionName + &quot;(&quot;).c_str(), &quot;, &quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="cx">             ASSERT(type.isMatrix() || type.isVector());
</span><del>-            outputTriplet(visit, &quot;all(&quot;, &quot; == &quot;, &quot;)&quot;, out);
</del><ins>+            outputTriplet(out, visit, &quot;all(&quot;, &quot; == &quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool OutputHLSL::ancestorEvaluatesToSamplerInStruct(Visit visit)
+{
+    // Inside InVisit the current node is already in the path.
+    const unsigned int initialN = visit == InVisit ? 1u : 0u;
+    for (unsigned int n = initialN; getAncestorNode(n) != nullptr; ++n)
+    {
+        TIntermNode *ancestor               = getAncestorNode(n);
+        const TIntermBinary *ancestorBinary = ancestor-&gt;getAsBinaryNode();
+        if (ancestorBinary == nullptr)
+        {
+            return false;
+        }
+        switch (ancestorBinary-&gt;getOp())
+        {
+            case EOpIndexDirectStruct:
+            {
+                const TStructure *structure = ancestorBinary-&gt;getLeft()-&gt;getType().getStruct();
+                const TIntermConstantUnion *index =
+                    ancestorBinary-&gt;getRight()-&gt;getAsConstantUnion();
+                const TField *field = structure-&gt;fields()[index-&gt;getIConst(0)];
+                if (IsSampler(field-&gt;type()-&gt;getBasicType()))
+                {
+                    return true;
+                }
+                break;
+            }
+            case EOpIndexDirect:
+                break;
+            default:
+                // Returning a sampler from indirect indexing is not supported.
+                return false;
+        }
+    }
+    return false;
+}
+
</ins><span class="cx"> bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
</span><span class="cx"> {
</span><span class="cx">     TInfoSinkBase &amp;out = getInfoSink();
</span><span class="lines">@@ -1482,11 +1761,11 @@
</span><span class="cx">             ASSERT(rightAgg == nullptr || rightAgg-&gt;getOp() != EOpFunctionCall);
</span><span class="cx"> 
</span><span class="cx">             const TString &amp;functionName = addArrayAssignmentFunction(node-&gt;getType());
</span><del>-            outputTriplet(visit, (functionName + &quot;(&quot;).c_str(), &quot;, &quot;, &quot;)&quot;);
</del><ins>+            outputTriplet(out, visit, (functionName + &quot;(&quot;).c_str(), &quot;, &quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            outputTriplet(visit, &quot;(&quot;, &quot; = &quot;, &quot;)&quot;);
</del><ins>+            outputTriplet(out, visit, &quot;(&quot;, &quot; = &quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">       case EOpInitialize:
</span><span class="lines">@@ -1501,18 +1780,17 @@
</span><span class="cx">             ASSERT(symbolNode);
</span><span class="cx">             TIntermTyped *expression = node-&gt;getRight();
</span><span class="cx"> 
</span><del>-            // TODO (jmadill): do a 'deep' scan to know if an expression is statically const
-            if (symbolNode-&gt;getQualifier() == EvqGlobal &amp;&amp; expression-&gt;getQualifier() != EvqConst)
</del><ins>+            // Global initializers must be constant at this point.
+            ASSERT(symbolNode-&gt;getQualifier() != EvqGlobal ||
+                   (expression-&gt;getQualifier() == EvqConst &amp;&amp;
+                    expression-&gt;getAsConstantUnion() != nullptr));
+            if (writeSameSymbolInitializer(out, symbolNode, expression))
</ins><span class="cx">             {
</span><del>-                // For variables which are not constant, defer their real initialization until
-                // after we initialize other globals: uniforms, attributes and varyings.
-                mDeferredGlobalInitializers.push_back(std::make_pair(symbolNode, expression));
-                const TString &amp;initString = initializer(node-&gt;getType());
-                node-&gt;setRight(new TIntermRaw(node-&gt;getType(), initString));
</del><ins>+                // Skip initializing the rest of the expression
+                return false;
</ins><span class="cx">             }
</span><del>-            else if (writeSameSymbolInitializer(out, symbolNode, expression))
</del><ins>+            else if (writeConstantInitialization(out, symbolNode, expression))
</ins><span class="cx">             {
</span><del>-                // Skip initializing the rest of the expression
</del><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -1521,11 +1799,21 @@
</span><span class="cx">             out &lt;&lt; &quot; = &quot;;
</span><span class="cx">         }
</span><span class="cx">         break;
</span><del>-      case EOpAddAssign:               outputTriplet(visit, &quot;(&quot;, &quot; += &quot;, &quot;)&quot;);          break;
-      case EOpSubAssign:               outputTriplet(visit, &quot;(&quot;, &quot; -= &quot;, &quot;)&quot;);          break;
-      case EOpMulAssign:               outputTriplet(visit, &quot;(&quot;, &quot; *= &quot;, &quot;)&quot;);          break;
-      case EOpVectorTimesScalarAssign: outputTriplet(visit, &quot;(&quot;, &quot; *= &quot;, &quot;)&quot;);          break;
-      case EOpMatrixTimesScalarAssign: outputTriplet(visit, &quot;(&quot;, &quot; *= &quot;, &quot;)&quot;);          break;
</del><ins>+      case EOpAddAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; += &quot;, &quot;)&quot;);
+          break;
+      case EOpSubAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; -= &quot;, &quot;)&quot;);
+          break;
+      case EOpMulAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; *= &quot;, &quot;)&quot;);
+          break;
+      case EOpVectorTimesScalarAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; *= &quot;, &quot;)&quot;);
+          break;
+      case EOpMatrixTimesScalarAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; *= &quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       case EOpVectorTimesMatrixAssign:
</span><span class="cx">         if (visit == PreVisit)
</span><span class="cx">         {
</span><span class="lines">@@ -1558,13 +1846,27 @@
</span><span class="cx">             out &lt;&lt; &quot;))))&quot;;
</span><span class="cx">         }
</span><span class="cx">         break;
</span><del>-      case EOpDivAssign:               outputTriplet(visit, &quot;(&quot;, &quot; /= &quot;, &quot;)&quot;);          break;
-      case EOpIModAssign:              outputTriplet(visit, &quot;(&quot;, &quot; %= &quot;, &quot;)&quot;);          break;
-      case EOpBitShiftLeftAssign:      outputTriplet(visit, &quot;(&quot;, &quot; &lt;&lt;= &quot;, &quot;)&quot;);         break;
-      case EOpBitShiftRightAssign:     outputTriplet(visit, &quot;(&quot;, &quot; &gt;&gt;= &quot;, &quot;)&quot;);         break;
-      case EOpBitwiseAndAssign:        outputTriplet(visit, &quot;(&quot;, &quot; &amp;= &quot;, &quot;)&quot;);          break;
-      case EOpBitwiseXorAssign:        outputTriplet(visit, &quot;(&quot;, &quot; ^= &quot;, &quot;)&quot;);          break;
-      case EOpBitwiseOrAssign:         outputTriplet(visit, &quot;(&quot;, &quot; |= &quot;, &quot;)&quot;);          break;
</del><ins>+      case EOpDivAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; /= &quot;, &quot;)&quot;);
+          break;
+      case EOpIModAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; %= &quot;, &quot;)&quot;);
+          break;
+      case EOpBitShiftLeftAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; &lt;&lt;= &quot;, &quot;)&quot;);
+          break;
+      case EOpBitShiftRightAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; &gt;&gt;= &quot;, &quot;)&quot;);
+          break;
+      case EOpBitwiseAndAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; &amp;= &quot;, &quot;)&quot;);
+          break;
+      case EOpBitwiseXorAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; ^= &quot;, &quot;)&quot;);
+          break;
+      case EOpBitwiseOrAssign:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; |= &quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       case EOpIndexDirect:
</span><span class="cx">         {
</span><span class="cx">             const TType&amp; leftType = node-&gt;getLeft()-&gt;getType();
</span><span class="lines">@@ -1579,26 +1881,58 @@
</span><span class="cx">                     return false;
</span><span class="cx">                 }
</span><span class="cx">             }
</span><ins>+            else if (ancestorEvaluatesToSamplerInStruct(visit))
+            {
+                // All parts of an expression that access a sampler in a struct need to use _ as
+                // separator to access the sampler variable that has been moved out of the struct.
+                outputTriplet(out, visit, &quot;&quot;, &quot;_&quot;, &quot;&quot;);
+            }
</ins><span class="cx">             else
</span><span class="cx">             {
</span><del>-                outputTriplet(visit, &quot;&quot;, &quot;[&quot;, &quot;]&quot;);
</del><ins>+                outputTriplet(out, visit, &quot;&quot;, &quot;[&quot;, &quot;]&quot;);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">       case EOpIndexIndirect:
</span><span class="cx">         // We do not currently support indirect references to interface blocks
</span><span class="cx">         ASSERT(node-&gt;getLeft()-&gt;getBasicType() != EbtInterfaceBlock);
</span><del>-        outputTriplet(visit, &quot;&quot;, &quot;[&quot;, &quot;]&quot;);
</del><ins>+        outputTriplet(out, visit, &quot;&quot;, &quot;[&quot;, &quot;]&quot;);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpIndexDirectStruct:
</span><del>-        if (visit == InVisit)
</del><span class="cx">         {
</span><span class="cx">             const TStructure* structure = node-&gt;getLeft()-&gt;getType().getStruct();
</span><span class="cx">             const TIntermConstantUnion* index = node-&gt;getRight()-&gt;getAsConstantUnion();
</span><span class="cx">             const TField* field = structure-&gt;fields()[index-&gt;getIConst(0)];
</span><del>-            out &lt;&lt; &quot;.&quot; + DecorateField(field-&gt;name(), *structure);
</del><span class="cx"> 
</span><del>-            return false;
</del><ins>+            // In cases where indexing returns a sampler, we need to access the sampler variable
+            // that has been moved out of the struct.
+            bool indexingReturnsSampler = IsSampler(field-&gt;type()-&gt;getBasicType());
+            if (visit == PreVisit &amp;&amp; indexingReturnsSampler)
+            {
+                // Samplers extracted from structs have &quot;angle&quot; prefix to avoid name conflicts.
+                // This prefix is only output at the beginning of the indexing expression, which
+                // may have multiple parts.
+                out &lt;&lt; &quot;angle&quot;;
+            }
+            if (!indexingReturnsSampler)
+            {
+                // All parts of an expression that access a sampler in a struct need to use _ as
+                // separator to access the sampler variable that has been moved out of the struct.
+                indexingReturnsSampler = ancestorEvaluatesToSamplerInStruct(visit);
+            }
+            if (visit == InVisit)
+            {
+                if (indexingReturnsSampler)
+                {
+                    out &lt;&lt; &quot;_&quot; + field-&gt;name();
+                }
+                else
+                {
+                    out &lt;&lt; &quot;.&quot; + DecorateField(field-&gt;name(), *structure);
+                }
+
+                return false;
+            }
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">       case EOpIndexDirectInterfaceBlock:
</span><span class="lines">@@ -1648,55 +1982,81 @@
</span><span class="cx">             return false;   // Fully processed
</span><span class="cx">         }
</span><span class="cx">         break;
</span><del>-      case EOpAdd:               outputTriplet(visit, &quot;(&quot;, &quot; + &quot;, &quot;)&quot;); break;
-      case EOpSub:               outputTriplet(visit, &quot;(&quot;, &quot; - &quot;, &quot;)&quot;); break;
-      case EOpMul:               outputTriplet(visit, &quot;(&quot;, &quot; * &quot;, &quot;)&quot;); break;
-      case EOpDiv:               outputTriplet(visit, &quot;(&quot;, &quot; / &quot;, &quot;)&quot;); break;
-      case EOpIMod:              outputTriplet(visit, &quot;(&quot;, &quot; % &quot;, &quot;)&quot;); break;
-      case EOpBitShiftLeft:      outputTriplet(visit, &quot;(&quot;, &quot; &lt;&lt; &quot;, &quot;)&quot;); break;
-      case EOpBitShiftRight:     outputTriplet(visit, &quot;(&quot;, &quot; &gt;&gt; &quot;, &quot;)&quot;); break;
-      case EOpBitwiseAnd:        outputTriplet(visit, &quot;(&quot;, &quot; &amp; &quot;, &quot;)&quot;); break;
-      case EOpBitwiseXor:        outputTriplet(visit, &quot;(&quot;, &quot; ^ &quot;, &quot;)&quot;); break;
-      case EOpBitwiseOr:         outputTriplet(visit, &quot;(&quot;, &quot; | &quot;, &quot;)&quot;); break;
</del><ins>+      case EOpAdd:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; + &quot;, &quot;)&quot;);
+          break;
+      case EOpSub:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; - &quot;, &quot;)&quot;);
+          break;
+      case EOpMul:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; * &quot;, &quot;)&quot;);
+          break;
+      case EOpDiv:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; / &quot;, &quot;)&quot;);
+          break;
+      case EOpIMod:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; % &quot;, &quot;)&quot;);
+          break;
+      case EOpBitShiftLeft:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; &lt;&lt; &quot;, &quot;)&quot;);
+          break;
+      case EOpBitShiftRight:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; &gt;&gt; &quot;, &quot;)&quot;);
+          break;
+      case EOpBitwiseAnd:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; &amp; &quot;, &quot;)&quot;);
+          break;
+      case EOpBitwiseXor:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; ^ &quot;, &quot;)&quot;);
+          break;
+      case EOpBitwiseOr:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; | &quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       case EOpEqual:
</span><span class="cx">       case EOpNotEqual:
</span><span class="cx">         outputEqual(visit, node-&gt;getLeft()-&gt;getType(), node-&gt;getOp(), out);
</span><span class="cx">         break;
</span><del>-      case EOpLessThan:          outputTriplet(visit, &quot;(&quot;, &quot; &lt; &quot;, &quot;)&quot;);   break;
-      case EOpGreaterThan:       outputTriplet(visit, &quot;(&quot;, &quot; &gt; &quot;, &quot;)&quot;);   break;
-      case EOpLessThanEqual:     outputTriplet(visit, &quot;(&quot;, &quot; &lt;= &quot;, &quot;)&quot;);  break;
-      case EOpGreaterThanEqual:  outputTriplet(visit, &quot;(&quot;, &quot; &gt;= &quot;, &quot;)&quot;);  break;
-      case EOpVectorTimesScalar: outputTriplet(visit, &quot;(&quot;, &quot; * &quot;, &quot;)&quot;);   break;
-      case EOpMatrixTimesScalar: outputTriplet(visit, &quot;(&quot;, &quot; * &quot;, &quot;)&quot;);   break;
-      case EOpVectorTimesMatrix: outputTriplet(visit, &quot;mul(&quot;, &quot;, transpose(&quot;, &quot;))&quot;); break;
-      case EOpMatrixTimesVector: outputTriplet(visit, &quot;mul(transpose(&quot;, &quot;), &quot;, &quot;)&quot;); break;
-      case EOpMatrixTimesMatrix: outputTriplet(visit, &quot;transpose(mul(transpose(&quot;, &quot;), transpose(&quot;, &quot;)))&quot;); break;
</del><ins>+      case EOpLessThan:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; &lt; &quot;, &quot;)&quot;);
+          break;
+      case EOpGreaterThan:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; &gt; &quot;, &quot;)&quot;);
+          break;
+      case EOpLessThanEqual:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; &lt;= &quot;, &quot;)&quot;);
+          break;
+      case EOpGreaterThanEqual:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; &gt;= &quot;, &quot;)&quot;);
+          break;
+      case EOpVectorTimesScalar:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; * &quot;, &quot;)&quot;);
+          break;
+      case EOpMatrixTimesScalar:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; * &quot;, &quot;)&quot;);
+          break;
+      case EOpVectorTimesMatrix:
+          outputTriplet(out, visit, &quot;mul(&quot;, &quot;, transpose(&quot;, &quot;))&quot;);
+          break;
+      case EOpMatrixTimesVector:
+          outputTriplet(out, visit, &quot;mul(transpose(&quot;, &quot;), &quot;, &quot;)&quot;);
+          break;
+      case EOpMatrixTimesMatrix:
+          outputTriplet(out, visit, &quot;transpose(mul(transpose(&quot;, &quot;), transpose(&quot;, &quot;)))&quot;);
+          break;
</ins><span class="cx">       case EOpLogicalOr:
</span><del>-        if (node-&gt;getRight()-&gt;hasSideEffects())
-        {
-            out &lt;&lt; &quot;s&quot; &lt;&lt; mUnfoldShortCircuit-&gt;getNextTemporaryIndex();
-            return false;
-        }
-        else
-        {
-           outputTriplet(visit, &quot;(&quot;, &quot; || &quot;, &quot;)&quot;);
-           return true;
-        }
</del><ins>+        // HLSL doesn't short-circuit ||, so we assume that || affected by short-circuiting have been unfolded.
+        ASSERT(!node-&gt;getRight()-&gt;hasSideEffects());
+        outputTriplet(out, visit, &quot;(&quot;, &quot; || &quot;, &quot;)&quot;);
+        return true;
</ins><span class="cx">       case EOpLogicalXor:
</span><span class="cx">         mUsesXor = true;
</span><del>-        outputTriplet(visit, &quot;xor(&quot;, &quot;, &quot;, &quot;)&quot;);
</del><ins>+        outputTriplet(out, visit, &quot;xor(&quot;, &quot;, &quot;, &quot;)&quot;);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpLogicalAnd:
</span><del>-        if (node-&gt;getRight()-&gt;hasSideEffects())
-        {
-            out &lt;&lt; &quot;s&quot; &lt;&lt; mUnfoldShortCircuit-&gt;getNextTemporaryIndex();
-            return false;
-        }
-        else
-        {
-           outputTriplet(visit, &quot;(&quot;, &quot; &amp;&amp; &quot;, &quot;)&quot;);
-           return true;
-        }
</del><ins>+        // HLSL doesn't short-circuit &amp;&amp;, so we assume that &amp;&amp; affected by short-circuiting have been unfolded.
+        ASSERT(!node-&gt;getRight()-&gt;hasSideEffects());
+        outputTriplet(out, visit, &quot;(&quot;, &quot; &amp;&amp; &quot;, &quot;)&quot;);
+        return true;
</ins><span class="cx">       default: UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1705,137 +2065,261 @@
</span><span class="cx"> 
</span><span class="cx"> bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
</span><span class="cx"> {
</span><ins>+    TInfoSinkBase &amp;out = getInfoSink();
+
</ins><span class="cx">     switch (node-&gt;getOp())
</span><span class="cx">     {
</span><del>-      case EOpNegative:         outputTriplet(visit, &quot;(-&quot;, &quot;&quot;, &quot;)&quot;);         break;
-      case EOpPositive:         outputTriplet(visit, &quot;(+&quot;, &quot;&quot;, &quot;)&quot;);         break;
-      case EOpVectorLogicalNot: outputTriplet(visit, &quot;(!&quot;, &quot;&quot;, &quot;)&quot;);         break;
-      case EOpLogicalNot:       outputTriplet(visit, &quot;(!&quot;, &quot;&quot;, &quot;)&quot;);         break;
-      case EOpBitwiseNot:       outputTriplet(visit, &quot;(~&quot;, &quot;&quot;, &quot;)&quot;);         break;
-      case EOpPostIncrement:    outputTriplet(visit, &quot;(&quot;, &quot;&quot;, &quot;++)&quot;);        break;
-      case EOpPostDecrement:    outputTriplet(visit, &quot;(&quot;, &quot;&quot;, &quot;--)&quot;);        break;
-      case EOpPreIncrement:     outputTriplet(visit, &quot;(++&quot;, &quot;&quot;, &quot;)&quot;);        break;
-      case EOpPreDecrement:     outputTriplet(visit, &quot;(--&quot;, &quot;&quot;, &quot;)&quot;);        break;
-      case EOpRadians:          outputTriplet(visit, &quot;radians(&quot;, &quot;&quot;, &quot;)&quot;);   break;
-      case EOpDegrees:          outputTriplet(visit, &quot;degrees(&quot;, &quot;&quot;, &quot;)&quot;);   break;
-      case EOpSin:              outputTriplet(visit, &quot;sin(&quot;, &quot;&quot;, &quot;)&quot;);       break;
-      case EOpCos:              outputTriplet(visit, &quot;cos(&quot;, &quot;&quot;, &quot;)&quot;);       break;
-      case EOpTan:              outputTriplet(visit, &quot;tan(&quot;, &quot;&quot;, &quot;)&quot;);       break;
-      case EOpAsin:             outputTriplet(visit, &quot;asin(&quot;, &quot;&quot;, &quot;)&quot;);      break;
-      case EOpAcos:             outputTriplet(visit, &quot;acos(&quot;, &quot;&quot;, &quot;)&quot;);      break;
-      case EOpAtan:             outputTriplet(visit, &quot;atan(&quot;, &quot;&quot;, &quot;)&quot;);      break;
-      case EOpSinh:             outputTriplet(visit, &quot;sinh(&quot;, &quot;&quot;, &quot;)&quot;);      break;
-      case EOpCosh:             outputTriplet(visit, &quot;cosh(&quot;, &quot;&quot;, &quot;)&quot;);      break;
-      case EOpTanh:             outputTriplet(visit, &quot;tanh(&quot;, &quot;&quot;, &quot;)&quot;);      break;
</del><ins>+        case EOpNegative:
+            outputTriplet(out, visit, &quot;(-&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpPositive:
+            outputTriplet(out, visit, &quot;(+&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpVectorLogicalNot:
+            outputTriplet(out, visit, &quot;(!&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpLogicalNot:
+            outputTriplet(out, visit, &quot;(!&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpBitwiseNot:
+            outputTriplet(out, visit, &quot;(~&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpPostIncrement:
+            outputTriplet(out, visit, &quot;(&quot;, &quot;&quot;, &quot;++)&quot;);
+            break;
+        case EOpPostDecrement:
+            outputTriplet(out, visit, &quot;(&quot;, &quot;&quot;, &quot;--)&quot;);
+            break;
+        case EOpPreIncrement:
+            outputTriplet(out, visit, &quot;(++&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpPreDecrement:
+            outputTriplet(out, visit, &quot;(--&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpRadians:
+            outputTriplet(out, visit, &quot;radians(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpDegrees:
+            outputTriplet(out, visit, &quot;degrees(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpSin:
+            outputTriplet(out, visit, &quot;sin(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpCos:
+            outputTriplet(out, visit, &quot;cos(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpTan:
+            outputTriplet(out, visit, &quot;tan(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpAsin:
+            outputTriplet(out, visit, &quot;asin(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpAcos:
+            outputTriplet(out, visit, &quot;acos(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpAtan:
+            outputTriplet(out, visit, &quot;atan(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpSinh:
+            outputTriplet(out, visit, &quot;sinh(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpCosh:
+            outputTriplet(out, visit, &quot;cosh(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
+        case EOpTanh:
+            outputTriplet(out, visit, &quot;tanh(&quot;, &quot;&quot;, &quot;)&quot;);
+            break;
</ins><span class="cx">       case EOpAsinh:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;asinh(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;asinh(&quot;);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpAcosh:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;acosh(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;acosh(&quot;);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpAtanh:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;atanh(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;atanh(&quot;);
</ins><span class="cx">         break;
</span><del>-      case EOpExp:              outputTriplet(visit, &quot;exp(&quot;, &quot;&quot;, &quot;)&quot;);       break;
-      case EOpLog:              outputTriplet(visit, &quot;log(&quot;, &quot;&quot;, &quot;)&quot;);       break;
-      case EOpExp2:             outputTriplet(visit, &quot;exp2(&quot;, &quot;&quot;, &quot;)&quot;);      break;
-      case EOpLog2:             outputTriplet(visit, &quot;log2(&quot;, &quot;&quot;, &quot;)&quot;);      break;
-      case EOpSqrt:             outputTriplet(visit, &quot;sqrt(&quot;, &quot;&quot;, &quot;)&quot;);      break;
-      case EOpInverseSqrt:      outputTriplet(visit, &quot;rsqrt(&quot;, &quot;&quot;, &quot;)&quot;);     break;
-      case EOpAbs:              outputTriplet(visit, &quot;abs(&quot;, &quot;&quot;, &quot;)&quot;);       break;
-      case EOpSign:             outputTriplet(visit, &quot;sign(&quot;, &quot;&quot;, &quot;)&quot;);      break;
-      case EOpFloor:            outputTriplet(visit, &quot;floor(&quot;, &quot;&quot;, &quot;)&quot;);     break;
-      case EOpTrunc:            outputTriplet(visit, &quot;trunc(&quot;, &quot;&quot;, &quot;)&quot;);     break;
-      case EOpRound:            outputTriplet(visit, &quot;round(&quot;, &quot;&quot;, &quot;)&quot;);     break;
</del><ins>+      case EOpExp:
+          outputTriplet(out, visit, &quot;exp(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpLog:
+          outputTriplet(out, visit, &quot;log(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpExp2:
+          outputTriplet(out, visit, &quot;exp2(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpLog2:
+          outputTriplet(out, visit, &quot;log2(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpSqrt:
+          outputTriplet(out, visit, &quot;sqrt(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpInverseSqrt:
+          outputTriplet(out, visit, &quot;rsqrt(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpAbs:
+          outputTriplet(out, visit, &quot;abs(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpSign:
+          outputTriplet(out, visit, &quot;sign(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpFloor:
+          outputTriplet(out, visit, &quot;floor(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpTrunc:
+          outputTriplet(out, visit, &quot;trunc(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpRound:
+          outputTriplet(out, visit, &quot;round(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       case EOpRoundEven:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;roundEven(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;roundEven(&quot;);
</ins><span class="cx">         break;
</span><del>-      case EOpCeil:             outputTriplet(visit, &quot;ceil(&quot;, &quot;&quot;, &quot;)&quot;);      break;
-      case EOpFract:            outputTriplet(visit, &quot;frac(&quot;, &quot;&quot;, &quot;)&quot;);      break;
</del><ins>+      case EOpCeil:
+          outputTriplet(out, visit, &quot;ceil(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpFract:
+          outputTriplet(out, visit, &quot;frac(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       case EOpIsNan:
</span><del>-        outputTriplet(visit, &quot;isnan(&quot;, &quot;&quot;, &quot;)&quot;);
</del><ins>+          outputTriplet(out, visit, &quot;isnan(&quot;, &quot;&quot;, &quot;)&quot;);
</ins><span class="cx">         mRequiresIEEEStrictCompiling = true;
</span><span class="cx">         break;
</span><del>-      case EOpIsInf:            outputTriplet(visit, &quot;isinf(&quot;, &quot;&quot;, &quot;)&quot;);     break;
-      case EOpFloatBitsToInt:   outputTriplet(visit, &quot;asint(&quot;, &quot;&quot;, &quot;)&quot;);     break;
-      case EOpFloatBitsToUint:  outputTriplet(visit, &quot;asuint(&quot;, &quot;&quot;, &quot;)&quot;);    break;
-      case EOpIntBitsToFloat:   outputTriplet(visit, &quot;asfloat(&quot;, &quot;&quot;, &quot;)&quot;);   break;
-      case EOpUintBitsToFloat:  outputTriplet(visit, &quot;asfloat(&quot;, &quot;&quot;, &quot;)&quot;);   break;
</del><ins>+      case EOpIsInf:
+          outputTriplet(out, visit, &quot;isinf(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpFloatBitsToInt:
+          outputTriplet(out, visit, &quot;asint(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpFloatBitsToUint:
+          outputTriplet(out, visit, &quot;asuint(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpIntBitsToFloat:
+          outputTriplet(out, visit, &quot;asfloat(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpUintBitsToFloat:
+          outputTriplet(out, visit, &quot;asfloat(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       case EOpPackSnorm2x16:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;packSnorm2x16(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;packSnorm2x16(&quot;);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpPackUnorm2x16:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;packUnorm2x16(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;packUnorm2x16(&quot;);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpPackHalf2x16:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;packHalf2x16(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;packHalf2x16(&quot;);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpUnpackSnorm2x16:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;unpackSnorm2x16(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;unpackSnorm2x16(&quot;);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpUnpackUnorm2x16:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;unpackUnorm2x16(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;unpackUnorm2x16(&quot;);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpUnpackHalf2x16:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;unpackHalf2x16(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;unpackHalf2x16(&quot;);
</ins><span class="cx">         break;
</span><del>-      case EOpLength:           outputTriplet(visit, &quot;length(&quot;, &quot;&quot;, &quot;)&quot;);    break;
-      case EOpNormalize:        outputTriplet(visit, &quot;normalize(&quot;, &quot;&quot;, &quot;)&quot;); break;
</del><ins>+      case EOpLength:
+          outputTriplet(out, visit, &quot;length(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpNormalize:
+          outputTriplet(out, visit, &quot;normalize(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       case EOpDFdx:
</span><span class="cx">         if(mInsideDiscontinuousLoop || mOutputLod0Function)
</span><span class="cx">         {
</span><del>-            outputTriplet(visit, &quot;(&quot;, &quot;&quot;, &quot;, 0.0)&quot;);
</del><ins>+            outputTriplet(out, visit, &quot;(&quot;, &quot;&quot;, &quot;, 0.0)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            outputTriplet(visit, &quot;ddx(&quot;, &quot;&quot;, &quot;)&quot;);
</del><ins>+            outputTriplet(out, visit, &quot;ddx(&quot;, &quot;&quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">       case EOpDFdy:
</span><span class="cx">         if(mInsideDiscontinuousLoop || mOutputLod0Function)
</span><span class="cx">         {
</span><del>-            outputTriplet(visit, &quot;(&quot;, &quot;&quot;, &quot;, 0.0)&quot;);
</del><ins>+            outputTriplet(out, visit, &quot;(&quot;, &quot;&quot;, &quot;, 0.0)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-           outputTriplet(visit, &quot;ddy(&quot;, &quot;&quot;, &quot;)&quot;);
</del><ins>+            outputTriplet(out, visit, &quot;ddy(&quot;, &quot;&quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">       case EOpFwidth:
</span><span class="cx">         if(mInsideDiscontinuousLoop || mOutputLod0Function)
</span><span class="cx">         {
</span><del>-            outputTriplet(visit, &quot;(&quot;, &quot;&quot;, &quot;, 0.0)&quot;);
</del><ins>+            outputTriplet(out, visit, &quot;(&quot;, &quot;&quot;, &quot;, 0.0)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            outputTriplet(visit, &quot;fwidth(&quot;, &quot;&quot;, &quot;)&quot;);
</del><ins>+            outputTriplet(out, visit, &quot;fwidth(&quot;, &quot;&quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><del>-      case EOpTranspose:        outputTriplet(visit, &quot;transpose(&quot;, &quot;&quot;, &quot;)&quot;);   break;
-      case EOpDeterminant:      outputTriplet(visit, &quot;determinant(transpose(&quot;, &quot;&quot;, &quot;))&quot;); break;
</del><ins>+      case EOpTranspose:
+          outputTriplet(out, visit, &quot;transpose(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpDeterminant:
+          outputTriplet(out, visit, &quot;determinant(transpose(&quot;, &quot;&quot;, &quot;))&quot;);
+          break;
</ins><span class="cx">       case EOpInverse:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;inverse(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;inverse(&quot;);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><del>-      case EOpAny:              outputTriplet(visit, &quot;any(&quot;, &quot;&quot;, &quot;)&quot;);       break;
-      case EOpAll:              outputTriplet(visit, &quot;all(&quot;, &quot;&quot;, &quot;)&quot;);       break;
</del><ins>+      case EOpAny:
+          outputTriplet(out, visit, &quot;any(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
+      case EOpAll:
+          outputTriplet(out, visit, &quot;all(&quot;, &quot;&quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       default: UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TString OutputHLSL::samplerNamePrefixFromStruct(TIntermTyped *node)
+{
+    if (node-&gt;getAsSymbolNode())
+    {
+        return node-&gt;getAsSymbolNode()-&gt;getSymbol();
+    }
+    TIntermBinary *nodeBinary = node-&gt;getAsBinaryNode();
+    switch (nodeBinary-&gt;getOp())
+    {
+        case EOpIndexDirect:
+        {
+            int index = nodeBinary-&gt;getRight()-&gt;getAsConstantUnion()-&gt;getIConst(0);
+
+            TInfoSinkBase prefixSink;
+            prefixSink &lt;&lt; samplerNamePrefixFromStruct(nodeBinary-&gt;getLeft()) &lt;&lt; &quot;_&quot; &lt;&lt; index;
+            return TString(prefixSink.c_str());
+        }
+        case EOpIndexDirectStruct:
+        {
+            TStructure *s       = nodeBinary-&gt;getLeft()-&gt;getAsTyped()-&gt;getType().getStruct();
+            int index           = nodeBinary-&gt;getRight()-&gt;getAsConstantUnion()-&gt;getIConst(0);
+            const TField *field = s-&gt;fields()[index];
+
+            TInfoSinkBase prefixSink;
+            prefixSink &lt;&lt; samplerNamePrefixFromStruct(nodeBinary-&gt;getLeft()) &lt;&lt; &quot;_&quot;
+                       &lt;&lt; field-&gt;name();
+            return TString(prefixSink.c_str());
+        }
+        default:
+            UNREACHABLE();
+            return TString(&quot;&quot;);
+    }
+}
+
</ins><span class="cx"> bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
</span><span class="cx"> {
</span><span class="cx">     TInfoSinkBase &amp;out = getInfoSink();
</span><span class="lines">@@ -1846,26 +2330,30 @@
</span><span class="cx">         {
</span><span class="cx">             if (mInsideFunction)
</span><span class="cx">             {
</span><del>-                outputLineDirective(node-&gt;getLine().first_line);
</del><ins>+                outputLineDirective(out, node-&gt;getLine().first_line);
</ins><span class="cx">                 out &lt;&lt; &quot;{\n&quot;;
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             for (TIntermSequence::iterator sit = node-&gt;getSequence()-&gt;begin(); sit != node-&gt;getSequence()-&gt;end(); sit++)
</span><span class="cx">             {
</span><del>-                outputLineDirective((*sit)-&gt;getLine().first_line);
</del><ins>+                outputLineDirective(out, (*sit)-&gt;getLine().first_line);
</ins><span class="cx"> 
</span><del>-                traverseStatements(*sit);
</del><ins>+                (*sit)-&gt;traverse(this);
</ins><span class="cx"> 
</span><span class="cx">                 // Don't output ; after case labels, they're terminated by :
</span><span class="cx">                 // This is needed especially since outputting a ; after a case statement would turn empty
</span><span class="cx">                 // case statements into non-empty case statements, disallowing fall-through from them.
</span><del>-                if ((*sit)-&gt;getAsCaseNode() == nullptr)
</del><ins>+                // Also no need to output ; after selection (if) statements or sequences. This is done just
+                // for code clarity.
+                TIntermSelection *asSelection = (*sit)-&gt;getAsSelectionNode();
+                ASSERT(asSelection == nullptr || !asSelection-&gt;usesTernaryOperator());
+                if ((*sit)-&gt;getAsCaseNode() == nullptr &amp;&amp; asSelection == nullptr &amp;&amp; !IsSequence(*sit))
</ins><span class="cx">                     out &lt;&lt; &quot;;\n&quot;;
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (mInsideFunction)
</span><span class="cx">             {
</span><del>-                outputLineDirective(node-&gt;getLine().last_line);
</del><ins>+                outputLineDirective(out, node-&gt;getLine().last_line);
</ins><span class="cx">                 out &lt;&lt; &quot;}\n&quot;;
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="lines">@@ -1876,45 +2364,35 @@
</span><span class="cx">         {
</span><span class="cx">             TIntermSequence *sequence = node-&gt;getSequence();
</span><span class="cx">             TIntermTyped *variable = (*sequence)[0]-&gt;getAsTyped();
</span><ins>+            ASSERT(sequence-&gt;size() == 1);
</ins><span class="cx"> 
</span><del>-            if (variable &amp;&amp; (variable-&gt;getQualifier() == EvqTemporary || variable-&gt;getQualifier() == EvqGlobal))
</del><ins>+            if (variable &amp;&amp;
+                (variable-&gt;getQualifier() == EvqTemporary ||
+                 variable-&gt;getQualifier() == EvqGlobal || variable-&gt;getQualifier() == EvqConst))
</ins><span class="cx">             {
</span><span class="cx">                 ensureStructDefined(variable-&gt;getType());
</span><span class="cx"> 
</span><span class="cx">                 if (!variable-&gt;getAsSymbolNode() || variable-&gt;getAsSymbolNode()-&gt;getSymbol() != &quot;&quot;)   // Variable declaration
</span><span class="cx">                 {
</span><del>-                    for (const auto &amp;seqElement : *sequence)
</del><ins>+                    if (!mInsideFunction)
</ins><span class="cx">                     {
</span><del>-                        if (isSingleStatement(seqElement))
-                        {
-                            mUnfoldShortCircuit-&gt;traverse(seqElement);
-                        }
</del><ins>+                        out &lt;&lt; &quot;static &quot;;
+                    }
</ins><span class="cx"> 
</span><del>-                        if (!mInsideFunction)
-                        {
-                            out &lt;&lt; &quot;static &quot;;
-                        }
</del><ins>+                    out &lt;&lt; TypeString(variable-&gt;getType()) + &quot; &quot;;
</ins><span class="cx"> 
</span><del>-                        out &lt;&lt; TypeString(variable-&gt;getType()) + &quot; &quot;;
</del><ins>+                    TIntermSymbol *symbol = variable-&gt;getAsSymbolNode();
</ins><span class="cx"> 
</span><del>-                        TIntermSymbol *symbol = seqElement-&gt;getAsSymbolNode();
-
-                        if (symbol)
-                        {
-                            symbol-&gt;traverse(this);
-                            out &lt;&lt; ArrayString(symbol-&gt;getType());
-                            out &lt;&lt; &quot; = &quot; + initializer(symbol-&gt;getType());
-                        }
-                        else
-                        {
-                            seqElement-&gt;traverse(this);
-                        }
-
-                        if (seqElement != sequence-&gt;back())
-                        {
-                            out &lt;&lt; &quot;;\n&quot;;
-                        }
</del><ins>+                    if (symbol)
+                    {
+                        symbol-&gt;traverse(this);
+                        out &lt;&lt; ArrayString(symbol-&gt;getType());
+                        out &lt;&lt; &quot; = &quot; + initializer(symbol-&gt;getType());
</ins><span class="cx">                     }
</span><ins>+                    else
+                    {
+                        variable-&gt;traverse(this);
+                    }
</ins><span class="cx">                 }
</span><span class="cx">                 else if (variable-&gt;getAsSymbolNode() &amp;&amp; variable-&gt;getAsSymbolNode()-&gt;getSymbol() == &quot;&quot;)   // Type (struct) declaration
</span><span class="cx">                 {
</span><span class="lines">@@ -1960,10 +2438,12 @@
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            out &lt;&lt; TypeString(node-&gt;getType()) &lt;&lt; &quot; &quot; &lt;&lt; Decorate(TFunction::unmangleName(node-&gt;getName())) &lt;&lt; (mOutputLod0Function ? &quot;Lod0(&quot; : &quot;(&quot;);
-
</del><span class="cx">             TIntermSequence *arguments = node-&gt;getSequence();
</span><span class="cx"> 
</span><ins>+            TString name = DecorateFunctionIfNeeded(node-&gt;getNameObj());
+            out &lt;&lt; TypeString(node-&gt;getType()) &lt;&lt; &quot; &quot; &lt;&lt; name &lt;&lt; DisambiguateFunctionName(arguments)
+                &lt;&lt; (mOutputLod0Function ? &quot;Lod0(&quot; : &quot;(&quot;);
+
</ins><span class="cx">             for (unsigned int i = 0; i &lt; arguments-&gt;size(); i++)
</span><span class="cx">             {
</span><span class="cx">                 TIntermSymbol *symbol = (*arguments)[i]-&gt;getAsSymbolNode();
</span><span class="lines">@@ -1994,11 +2474,13 @@
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx">         break;
</span><del>-      case EOpComma:            outputTriplet(visit, &quot;(&quot;, &quot;, &quot;, &quot;)&quot;);                break;
</del><ins>+      case EOpComma:
+          outputTriplet(out, visit, &quot;(&quot;, &quot;, &quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       case EOpFunction:
</span><span class="cx">         {
</span><span class="cx">             ASSERT(mCurrentFunctionMetadata == nullptr);
</span><del>-            TString name = TFunction::unmangleName(node-&gt;getName());
</del><ins>+            TString name = TFunction::unmangleName(node-&gt;getNameObj().getString());
</ins><span class="cx"> 
</span><span class="cx">             size_t index = mCallDag.findIndex(node);
</span><span class="cx">             ASSERT(index != CallDAG::InvalidIndex);
</span><span class="lines">@@ -2006,18 +2488,19 @@
</span><span class="cx"> 
</span><span class="cx">             out &lt;&lt; TypeString(node-&gt;getType()) &lt;&lt; &quot; &quot;;
</span><span class="cx"> 
</span><ins>+            TIntermSequence *sequence  = node-&gt;getSequence();
+            TIntermSequence *arguments = (*sequence)[0]-&gt;getAsAggregate()-&gt;getSequence();
+
</ins><span class="cx">             if (name == &quot;main&quot;)
</span><span class="cx">             {
</span><span class="cx">                 out &lt;&lt; &quot;gl_main(&quot;;
</span><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><del>-                out &lt;&lt; Decorate(name) &lt;&lt; (mOutputLod0Function ? &quot;Lod0(&quot; : &quot;(&quot;);
</del><ins>+                out &lt;&lt; DecorateFunctionIfNeeded(node-&gt;getNameObj())
+                    &lt;&lt; DisambiguateFunctionName(arguments) &lt;&lt; (mOutputLod0Function ? &quot;Lod0(&quot; : &quot;(&quot;);
</ins><span class="cx">             }
</span><span class="cx"> 
</span><del>-            TIntermSequence *sequence = node-&gt;getSequence();
-            TIntermSequence *arguments = (*sequence)[0]-&gt;getAsAggregate()-&gt;getSequence();
-
</del><span class="cx">             for (unsigned int i = 0; i &lt; arguments-&gt;size(); i++)
</span><span class="cx">             {
</span><span class="cx">                 TIntermSymbol *symbol = (*arguments)[i]-&gt;getAsSymbolNode();
</span><span class="lines">@@ -2036,18 +2519,22 @@
</span><span class="cx">                 else UNREACHABLE();
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            out &lt;&lt; &quot;)\n&quot;
-                &quot;{\n&quot;;
</del><ins>+            out &lt;&lt; &quot;)\n&quot;;
</ins><span class="cx"> 
</span><span class="cx">             if (sequence-&gt;size() &gt; 1)
</span><span class="cx">             {
</span><span class="cx">                 mInsideFunction = true;
</span><del>-                (*sequence)[1]-&gt;traverse(this);
</del><ins>+                TIntermNode *body = (*sequence)[1];
+                // The function body node will output braces.
+                ASSERT(IsSequence(body));
+                body-&gt;traverse(this);
</ins><span class="cx">                 mInsideFunction = false;
</span><span class="cx">             }
</span><ins>+            else
+            {
+                out &lt;&lt; &quot;{}\n&quot;;
+            }
</ins><span class="cx"> 
</span><del>-            out &lt;&lt; &quot;}\n&quot;;
-
</del><span class="cx">             mCurrentFunctionMetadata = nullptr;
</span><span class="cx"> 
</span><span class="cx">             bool needsLod0 = mASTMetadataList[index].mNeedsLod0;
</span><span class="lines">@@ -2064,7 +2551,6 @@
</span><span class="cx">         break;
</span><span class="cx">       case EOpFunctionCall:
</span><span class="cx">         {
</span><del>-            TString name = TFunction::unmangleName(node-&gt;getName());
</del><span class="cx">             TIntermSequence *arguments = node-&gt;getSequence();
</span><span class="cx"> 
</span><span class="cx">             bool lod0 = mInsideDiscontinuousLoop || mOutputLod0Function;
</span><span class="lines">@@ -2078,10 +2564,13 @@
</span><span class="cx">                 ASSERT(index != CallDAG::InvalidIndex);
</span><span class="cx">                 lod0 &amp;= mASTMetadataList[index].mNeedsLod0;
</span><span class="cx"> 
</span><del>-                out &lt;&lt; Decorate(name) &lt;&lt; (lod0 ? &quot;Lod0(&quot; : &quot;(&quot;);
</del><ins>+                out &lt;&lt; DecorateFunctionIfNeeded(node-&gt;getNameObj());
+                out &lt;&lt; DisambiguateFunctionName(node-&gt;getSequence());
+                out &lt;&lt; (lod0 ? &quot;Lod0(&quot; : &quot;(&quot;);
</ins><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><ins>+                TString name           = TFunction::unmangleName(node-&gt;getNameObj().getString());
</ins><span class="cx">                 TBasicType samplerType = (*arguments)[0]-&gt;getAsTyped()-&gt;getType().getBasicType();
</span><span class="cx"> 
</span><span class="cx">                 TextureFunction textureFunction;
</span><span class="lines">@@ -2202,7 +2691,8 @@
</span><span class="cx"> 
</span><span class="cx">             for (TIntermSequence::iterator arg = arguments-&gt;begin(); arg != arguments-&gt;end(); arg++)
</span><span class="cx">             {
</span><del>-                if (mOutputType == SH_HLSL11_OUTPUT &amp;&amp; IsSampler((*arg)-&gt;getAsTyped()-&gt;getBasicType()))
</del><ins>+                TIntermTyped *typedArg = (*arg)-&gt;getAsTyped();
+                if (mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT &amp;&amp; IsSampler(typedArg-&gt;getBasicType()))
</ins><span class="cx">                 {
</span><span class="cx">                     out &lt;&lt; &quot;texture_&quot;;
</span><span class="cx">                     (*arg)-&gt;traverse(this);
</span><span class="lines">@@ -2211,6 +2701,30 @@
</span><span class="cx"> 
</span><span class="cx">                 (*arg)-&gt;traverse(this);
</span><span class="cx"> 
</span><ins>+                if (typedArg-&gt;getType().isStructureContainingSamplers())
+                {
+                    const TType &amp;argType = typedArg-&gt;getType();
+                    TVector&lt;TIntermSymbol *&gt; samplerSymbols;
+                    TString structName = samplerNamePrefixFromStruct(typedArg);
+                    argType.createSamplerSymbols(&quot;angle_&quot; + structName, &quot;&quot;,
+                                                 argType.isArray() ? argType.getArraySize() : 0,
+                                                 &amp;samplerSymbols, nullptr);
+                    for (const TIntermSymbol *sampler : samplerSymbols)
+                    {
+                        if (mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT)
+                        {
+                            out &lt;&lt; &quot;, texture_&quot; &lt;&lt; sampler-&gt;getSymbol();
+                            out &lt;&lt; &quot;, sampler_&quot; &lt;&lt; sampler-&gt;getSymbol();
+                        }
+                        else
+                        {
+                            // In case of HLSL 4.1+, this symbol is the sampler index, and in case
+                            // of D3D9, it's the sampler variable.
+                            out &lt;&lt; &quot;, &quot; + sampler-&gt;getSymbol();
+                        }
+                    }
+                }
+
</ins><span class="cx">                 if (arg &lt; arguments-&gt;end() - 1)
</span><span class="cx">                 {
</span><span class="cx">                     out &lt;&lt; &quot;, &quot;;
</span><span class="lines">@@ -2222,26 +2736,84 @@
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx">         break;
</span><del>-      case EOpParameters:       outputTriplet(visit, &quot;(&quot;, &quot;, &quot;, &quot;)\n{\n&quot;);                                break;
-      case EOpConstructFloat:   outputConstructor(visit, node-&gt;getType(), &quot;vec1&quot;, node-&gt;getSequence());  break;
-      case EOpConstructVec2:    outputConstructor(visit, node-&gt;getType(), &quot;vec2&quot;, node-&gt;getSequence());  break;
-      case EOpConstructVec3:    outputConstructor(visit, node-&gt;getType(), &quot;vec3&quot;, node-&gt;getSequence());  break;
-      case EOpConstructVec4:    outputConstructor(visit, node-&gt;getType(), &quot;vec4&quot;, node-&gt;getSequence());  break;
-      case EOpConstructBool:    outputConstructor(visit, node-&gt;getType(), &quot;bvec1&quot;, node-&gt;getSequence()); break;
-      case EOpConstructBVec2:   outputConstructor(visit, node-&gt;getType(), &quot;bvec2&quot;, node-&gt;getSequence()); break;
-      case EOpConstructBVec3:   outputConstructor(visit, node-&gt;getType(), &quot;bvec3&quot;, node-&gt;getSequence()); break;
-      case EOpConstructBVec4:   outputConstructor(visit, node-&gt;getType(), &quot;bvec4&quot;, node-&gt;getSequence()); break;
-      case EOpConstructInt:     outputConstructor(visit, node-&gt;getType(), &quot;ivec1&quot;, node-&gt;getSequence()); break;
-      case EOpConstructIVec2:   outputConstructor(visit, node-&gt;getType(), &quot;ivec2&quot;, node-&gt;getSequence()); break;
-      case EOpConstructIVec3:   outputConstructor(visit, node-&gt;getType(), &quot;ivec3&quot;, node-&gt;getSequence()); break;
-      case EOpConstructIVec4:   outputConstructor(visit, node-&gt;getType(), &quot;ivec4&quot;, node-&gt;getSequence()); break;
-      case EOpConstructUInt:    outputConstructor(visit, node-&gt;getType(), &quot;uvec1&quot;, node-&gt;getSequence()); break;
-      case EOpConstructUVec2:   outputConstructor(visit, node-&gt;getType(), &quot;uvec2&quot;, node-&gt;getSequence()); break;
-      case EOpConstructUVec3:   outputConstructor(visit, node-&gt;getType(), &quot;uvec3&quot;, node-&gt;getSequence()); break;
-      case EOpConstructUVec4:   outputConstructor(visit, node-&gt;getType(), &quot;uvec4&quot;, node-&gt;getSequence()); break;
-      case EOpConstructMat2:    outputConstructor(visit, node-&gt;getType(), &quot;mat2&quot;, node-&gt;getSequence());  break;
-      case EOpConstructMat3:    outputConstructor(visit, node-&gt;getType(), &quot;mat3&quot;, node-&gt;getSequence());  break;
-      case EOpConstructMat4:    outputConstructor(visit, node-&gt;getType(), &quot;mat4&quot;, node-&gt;getSequence());  break;
</del><ins>+        case EOpParameters:
+            outputTriplet(out, visit, &quot;(&quot;, &quot;, &quot;, &quot;)\n{\n&quot;);
+            break;
+        case EOpConstructFloat:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;vec1&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructVec2:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;vec2&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructVec3:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;vec3&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructVec4:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;vec4&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructBool:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;bvec1&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructBVec2:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;bvec2&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructBVec3:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;bvec3&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructBVec4:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;bvec4&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructInt:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;ivec1&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructIVec2:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;ivec2&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructIVec3:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;ivec3&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructIVec4:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;ivec4&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructUInt:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;uvec1&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructUVec2:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;uvec2&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructUVec3:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;uvec3&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructUVec4:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;uvec4&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructMat2:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;mat2&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructMat2x3:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;mat2x3&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructMat2x4:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;mat2x4&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructMat3x2:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;mat3x2&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructMat3:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;mat3&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructMat3x4:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;mat3x4&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructMat4x2:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;mat4x2&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructMat4x3:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;mat4x3&quot;, node-&gt;getSequence());
+            break;
+        case EOpConstructMat4:
+            outputConstructor(out, visit, node-&gt;getType(), &quot;mat4&quot;, node-&gt;getSequence());
+            break;
</ins><span class="cx">       case EOpConstructStruct:
</span><span class="cx">         {
</span><span class="cx">             if (node-&gt;getType().isArray())
</span><span class="lines">@@ -2250,147 +2822,207 @@
</span><span class="cx">             }
</span><span class="cx">             const TString &amp;structName = StructNameString(*node-&gt;getType().getStruct());
</span><span class="cx">             mStructureHLSL-&gt;addConstructor(node-&gt;getType(), structName, node-&gt;getSequence());
</span><del>-            outputTriplet(visit, (structName + &quot;_ctor(&quot;).c_str(), &quot;, &quot;, &quot;)&quot;);
</del><ins>+            outputTriplet(out, visit, (structName + &quot;_ctor(&quot;).c_str(), &quot;, &quot;, &quot;)&quot;);
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><del>-      case EOpLessThan:         outputTriplet(visit, &quot;(&quot;, &quot; &lt; &quot;, &quot;)&quot;);                 break;
-      case EOpGreaterThan:      outputTriplet(visit, &quot;(&quot;, &quot; &gt; &quot;, &quot;)&quot;);                 break;
-      case EOpLessThanEqual:    outputTriplet(visit, &quot;(&quot;, &quot; &lt;= &quot;, &quot;)&quot;);                break;
-      case EOpGreaterThanEqual: outputTriplet(visit, &quot;(&quot;, &quot; &gt;= &quot;, &quot;)&quot;);                break;
-      case EOpVectorEqual:      outputTriplet(visit, &quot;(&quot;, &quot; == &quot;, &quot;)&quot;);                break;
-      case EOpVectorNotEqual:   outputTriplet(visit, &quot;(&quot;, &quot; != &quot;, &quot;)&quot;);                break;
</del><ins>+        case EOpLessThan:
+            outputTriplet(out, visit, &quot;(&quot;, &quot; &lt; &quot;, &quot;)&quot;);
+            break;
+        case EOpGreaterThan:
+            outputTriplet(out, visit, &quot;(&quot;, &quot; &gt; &quot;, &quot;)&quot;);
+            break;
+        case EOpLessThanEqual:
+            outputTriplet(out, visit, &quot;(&quot;, &quot; &lt;= &quot;, &quot;)&quot;);
+            break;
+        case EOpGreaterThanEqual:
+            outputTriplet(out, visit, &quot;(&quot;, &quot; &gt;= &quot;, &quot;)&quot;);
+            break;
+        case EOpVectorEqual:
+            outputTriplet(out, visit, &quot;(&quot;, &quot; == &quot;, &quot;)&quot;);
+            break;
+        case EOpVectorNotEqual:
+            outputTriplet(out, visit, &quot;(&quot;, &quot; != &quot;, &quot;)&quot;);
+            break;
</ins><span class="cx">       case EOpMod:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;mod(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;mod(&quot;);
</ins><span class="cx">         break;
</span><del>-      case EOpModf:             outputTriplet(visit, &quot;modf(&quot;, &quot;, &quot;, &quot;)&quot;);              break;
-      case EOpPow:              outputTriplet(visit, &quot;pow(&quot;, &quot;, &quot;, &quot;)&quot;);               break;
</del><ins>+      case EOpModf:
+          outputTriplet(out, visit, &quot;modf(&quot;, &quot;, &quot;, &quot;)&quot;);
+          break;
+      case EOpPow:
+          outputTriplet(out, visit, &quot;pow(&quot;, &quot;, &quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       case EOpAtan:
</span><span class="cx">         ASSERT(node-&gt;getSequence()-&gt;size() == 2);   // atan(x) is a unary operator
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;atan(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;atan(&quot;);
</ins><span class="cx">         break;
</span><del>-      case EOpMin:           outputTriplet(visit, &quot;min(&quot;, &quot;, &quot;, &quot;)&quot;);           break;
-      case EOpMax:           outputTriplet(visit, &quot;max(&quot;, &quot;, &quot;, &quot;)&quot;);           break;
-      case EOpClamp:         outputTriplet(visit, &quot;clamp(&quot;, &quot;, &quot;, &quot;)&quot;);         break;
-      case EOpMix:           outputTriplet(visit, &quot;lerp(&quot;, &quot;, &quot;, &quot;)&quot;);          break;
-      case EOpStep:          outputTriplet(visit, &quot;step(&quot;, &quot;, &quot;, &quot;)&quot;);          break;
-      case EOpSmoothStep:    outputTriplet(visit, &quot;smoothstep(&quot;, &quot;, &quot;, &quot;)&quot;);    break;
-      case EOpDistance:      outputTriplet(visit, &quot;distance(&quot;, &quot;, &quot;, &quot;)&quot;);      break;
-      case EOpDot:           outputTriplet(visit, &quot;dot(&quot;, &quot;, &quot;, &quot;)&quot;);           break;
-      case EOpCross:         outputTriplet(visit, &quot;cross(&quot;, &quot;, &quot;, &quot;)&quot;);         break;
</del><ins>+      case EOpMin:
+          outputTriplet(out, visit, &quot;min(&quot;, &quot;, &quot;, &quot;)&quot;);
+          break;
+      case EOpMax:
+          outputTriplet(out, visit, &quot;max(&quot;, &quot;, &quot;, &quot;)&quot;);
+          break;
+      case EOpClamp:
+          outputTriplet(out, visit, &quot;clamp(&quot;, &quot;, &quot;, &quot;)&quot;);
+          break;
+      case EOpMix:
+        {
+            TIntermTyped *lastParamNode = (*(node-&gt;getSequence()))[2]-&gt;getAsTyped();
+            if (lastParamNode-&gt;getType().getBasicType() == EbtBool)
+            {
+                // There is no HLSL equivalent for ESSL3 built-in &quot;genType mix (genType x, genType y, genBType a)&quot;,
+                // so use emulated version.
+                ASSERT(node-&gt;getUseEmulatedFunction());
+                writeEmulatedFunctionTriplet(out, visit, &quot;mix(&quot;);
+            }
+            else
+            {
+                outputTriplet(out, visit, &quot;lerp(&quot;, &quot;, &quot;, &quot;)&quot;);
+            }
+        }
+        break;
+        case EOpStep:
+            outputTriplet(out, visit, &quot;step(&quot;, &quot;, &quot;, &quot;)&quot;);
+            break;
+        case EOpSmoothStep:
+            outputTriplet(out, visit, &quot;smoothstep(&quot;, &quot;, &quot;, &quot;)&quot;);
+            break;
+        case EOpDistance:
+            outputTriplet(out, visit, &quot;distance(&quot;, &quot;, &quot;, &quot;)&quot;);
+            break;
+        case EOpDot:
+            outputTriplet(out, visit, &quot;dot(&quot;, &quot;, &quot;, &quot;)&quot;);
+            break;
+        case EOpCross:
+            outputTriplet(out, visit, &quot;cross(&quot;, &quot;, &quot;, &quot;)&quot;);
+            break;
</ins><span class="cx">       case EOpFaceForward:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;faceforward(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;faceforward(&quot;);
</ins><span class="cx">         break;
</span><del>-      case EOpReflect:       outputTriplet(visit, &quot;reflect(&quot;, &quot;, &quot;, &quot;)&quot;);       break;
-      case EOpRefract:       outputTriplet(visit, &quot;refract(&quot;, &quot;, &quot;, &quot;)&quot;);       break;
</del><ins>+      case EOpReflect:
+          outputTriplet(out, visit, &quot;reflect(&quot;, &quot;, &quot;, &quot;)&quot;);
+          break;
+      case EOpRefract:
+          outputTriplet(out, visit, &quot;refract(&quot;, &quot;, &quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       case EOpOuterProduct:
</span><span class="cx">         ASSERT(node-&gt;getUseEmulatedFunction());
</span><del>-        writeEmulatedFunctionTriplet(visit, &quot;outerProduct(&quot;);
</del><ins>+        writeEmulatedFunctionTriplet(out, visit, &quot;outerProduct(&quot;);
</ins><span class="cx">         break;
</span><del>-      case EOpMul:           outputTriplet(visit, &quot;(&quot;, &quot; * &quot;, &quot;)&quot;);             break;
</del><ins>+      case EOpMul:
+          outputTriplet(out, visit, &quot;(&quot;, &quot; * &quot;, &quot;)&quot;);
+          break;
</ins><span class="cx">       default: UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool OutputHLSL::visitSelection(Visit visit, TIntermSelection *node)
</del><ins>+void OutputHLSL::writeSelection(TInfoSinkBase &amp;out, TIntermSelection *node)
</ins><span class="cx"> {
</span><del>-    TInfoSinkBase &amp;out = getInfoSink();
</del><ins>+    out &lt;&lt; &quot;if (&quot;;
</ins><span class="cx"> 
</span><del>-    if (node-&gt;usesTernaryOperator())
-    {
-        out &lt;&lt; &quot;s&quot; &lt;&lt; mUnfoldShortCircuit-&gt;getNextTemporaryIndex();
-    }
-    else  // if/else statement
-    {
-        mUnfoldShortCircuit-&gt;traverse(node-&gt;getCondition());
</del><ins>+    node-&gt;getCondition()-&gt;traverse(this);
</ins><span class="cx"> 
</span><del>-        // D3D errors when there is a gradient operation in a loop in an unflattened if.
-        if (mShaderType == GL_FRAGMENT_SHADER
-            &amp;&amp; mCurrentFunctionMetadata-&gt;hasDiscontinuousLoop(node)
-            &amp;&amp; mCurrentFunctionMetadata-&gt;hasGradientInCallGraph(node))
-        {
-            out &lt;&lt; &quot;FLATTEN &quot;;
-        }
</del><ins>+    out &lt;&lt; &quot;)\n&quot;;
</ins><span class="cx"> 
</span><del>-        out &lt;&lt; &quot;if (&quot;;
</del><ins>+    outputLineDirective(out, node-&gt;getLine().first_line);
</ins><span class="cx"> 
</span><del>-        node-&gt;getCondition()-&gt;traverse(this);
</del><ins>+    bool discard = false;
</ins><span class="cx"> 
</span><del>-        out &lt;&lt; &quot;)\n&quot;;
</del><ins>+    if (node-&gt;getTrueBlock())
+    {
+        // The trueBlock child node will output braces.
+        ASSERT(IsSequence(node-&gt;getTrueBlock()));
</ins><span class="cx"> 
</span><del>-        outputLineDirective(node-&gt;getLine().first_line);
-        out &lt;&lt; &quot;{\n&quot;;
</del><ins>+        node-&gt;getTrueBlock()-&gt;traverse(this);
</ins><span class="cx"> 
</span><del>-        bool discard = false;
</del><ins>+        // Detect true discard
+        discard = (discard || FindDiscard::search(node-&gt;getTrueBlock()));
+    }
+    else
+    {
+        // TODO(oetuaho): Check if the semicolon inside is necessary.
+        // It's there as a result of conservative refactoring of the output.
+        out &lt;&lt; &quot;{;}\n&quot;;
+    }
</ins><span class="cx"> 
</span><del>-        if (node-&gt;getTrueBlock())
-        {
-            traverseStatements(node-&gt;getTrueBlock());
</del><ins>+    outputLineDirective(out, node-&gt;getLine().first_line);
</ins><span class="cx"> 
</span><del>-            // Detect true discard
-            discard = (discard || FindDiscard::search(node-&gt;getTrueBlock()));
-        }
</del><ins>+    if (node-&gt;getFalseBlock())
+    {
+        out &lt;&lt; &quot;else\n&quot;;
</ins><span class="cx"> 
</span><del>-        outputLineDirective(node-&gt;getLine().first_line);
-        out &lt;&lt; &quot;;\n}\n&quot;;
</del><ins>+        outputLineDirective(out, node-&gt;getFalseBlock()-&gt;getLine().first_line);
</ins><span class="cx"> 
</span><del>-        if (node-&gt;getFalseBlock())
-        {
-            out &lt;&lt; &quot;else\n&quot;;
</del><ins>+        // Either this is &quot;else if&quot; or the falseBlock child node will output braces.
+        ASSERT(IsSequence(node-&gt;getFalseBlock()) || node-&gt;getFalseBlock()-&gt;getAsSelectionNode() != nullptr);
</ins><span class="cx"> 
</span><del>-            outputLineDirective(node-&gt;getFalseBlock()-&gt;getLine().first_line);
-            out &lt;&lt; &quot;{\n&quot;;
</del><ins>+        node-&gt;getFalseBlock()-&gt;traverse(this);
</ins><span class="cx"> 
</span><del>-            outputLineDirective(node-&gt;getFalseBlock()-&gt;getLine().first_line);
-            traverseStatements(node-&gt;getFalseBlock());
</del><ins>+        outputLineDirective(out, node-&gt;getFalseBlock()-&gt;getLine().first_line);
</ins><span class="cx"> 
</span><del>-            outputLineDirective(node-&gt;getFalseBlock()-&gt;getLine().first_line);
-            out &lt;&lt; &quot;;\n}\n&quot;;
</del><ins>+        // Detect false discard
+        discard = (discard || FindDiscard::search(node-&gt;getFalseBlock()));
+    }
</ins><span class="cx"> 
</span><del>-            // Detect false discard
-            discard = (discard || FindDiscard::search(node-&gt;getFalseBlock()));
-        }
</del><ins>+    // ANGLE issue 486: Detect problematic conditional discard
+    if (discard)
+    {
+        mUsesDiscardRewriting = true;
+    }
+}
</ins><span class="cx"> 
</span><del>-        // ANGLE issue 486: Detect problematic conditional discard
-        if (discard &amp;&amp; FindSideEffectRewriting::search(node))
-        {
-            mUsesDiscardRewriting = true;
-        }
</del><ins>+bool OutputHLSL::visitSelection(Visit visit, TIntermSelection *node)
+{
+    TInfoSinkBase &amp;out = getInfoSink();
+
+    ASSERT(!node-&gt;usesTernaryOperator());
+    ASSERT(mInsideFunction);
+
+    // D3D errors when there is a gradient operation in a loop in an unflattened if.
+    if (mShaderType == GL_FRAGMENT_SHADER &amp;&amp; mCurrentFunctionMetadata-&gt;hasGradientLoop(node))
+    {
+        out &lt;&lt; &quot;FLATTEN &quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    writeSelection(out, node);
+
</ins><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool OutputHLSL::visitSwitch(Visit visit, TIntermSwitch *node)
</span><span class="cx"> {
</span><ins>+    TInfoSinkBase &amp;out = getInfoSink();
+
</ins><span class="cx">     if (node-&gt;getStatementList())
</span><span class="cx">     {
</span><span class="cx">         node-&gt;setStatementList(RemoveSwitchFallThrough::removeFallThrough(node-&gt;getStatementList()));
</span><del>-        outputTriplet(visit, &quot;switch (&quot;, &quot;) &quot;, &quot;&quot;);
</del><ins>+        outputTriplet(out, visit, &quot;switch (&quot;, &quot;) &quot;, &quot;&quot;);
</ins><span class="cx">         // The curly braces get written when visiting the statementList aggregate
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         // No statementList, so it won't output curly braces
</span><del>-        outputTriplet(visit, &quot;switch (&quot;, &quot;) {&quot;, &quot;}\n&quot;);
</del><ins>+        outputTriplet(out, visit, &quot;switch (&quot;, &quot;) {&quot;, &quot;}\n&quot;);
</ins><span class="cx">     }
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool OutputHLSL::visitCase(Visit visit, TIntermCase *node)
</span><span class="cx"> {
</span><ins>+    TInfoSinkBase &amp;out = getInfoSink();
+
</ins><span class="cx">     if (node-&gt;hasCondition())
</span><span class="cx">     {
</span><del>-        outputTriplet(visit, &quot;case (&quot;, &quot;&quot;, &quot;):\n&quot;);
</del><ins>+        outputTriplet(out, visit, &quot;case (&quot;, &quot;&quot;, &quot;):\n&quot;);
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        TInfoSinkBase &amp;out = getInfoSink();
</del><span class="cx">         out &lt;&lt; &quot;default:\n&quot;;
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -2398,7 +3030,8 @@
</span><span class="cx"> 
</span><span class="cx"> void OutputHLSL::visitConstantUnion(TIntermConstantUnion *node)
</span><span class="cx"> {
</span><del>-    writeConstantUnion(node-&gt;getType(), node-&gt;getUnionArrayPointer());
</del><ins>+    TInfoSinkBase &amp;out = getInfoSink();
+    writeConstantUnion(out, node-&gt;getType(), node-&gt;getUnionArrayPointer());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool OutputHLSL::visitLoop(Visit visit, TIntermLoop *node)
</span><span class="lines">@@ -2409,9 +3042,11 @@
</span><span class="cx">     mInsideDiscontinuousLoop = mInsideDiscontinuousLoop ||
</span><span class="cx">     mCurrentFunctionMetadata-&gt;mDiscontinuousLoops.count(node) &gt; 0;
</span><span class="cx"> 
</span><del>-    if (mOutputType == SH_HLSL9_OUTPUT)
</del><ins>+    TInfoSinkBase &amp;out = getInfoSink();
+
+    if (mOutputType == SH_HLSL_3_0_OUTPUT)
</ins><span class="cx">     {
</span><del>-        if (handleExcessiveLoop(node))
</del><ins>+        if (handleExcessiveLoop(out, node))
</ins><span class="cx">         {
</span><span class="cx">             mInsideDiscontinuousLoop = wasDiscontinuous;
</span><span class="cx">             mNestedLoopDepth--;
</span><span class="lines">@@ -2420,15 +3055,12 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TInfoSinkBase &amp;out = getInfoSink();
-
</del><span class="cx">     const char *unroll = mCurrentFunctionMetadata-&gt;hasGradientInCallGraph(node) ? &quot;LOOP&quot; : &quot;&quot;;
</span><span class="cx">     if (node-&gt;getType() == ELoopDoWhile)
</span><span class="cx">     {
</span><span class="cx">         out &lt;&lt; &quot;{&quot; &lt;&lt; unroll &lt;&lt; &quot; do\n&quot;;
</span><span class="cx"> 
</span><del>-        outputLineDirective(node-&gt;getLine().first_line);
-        out &lt;&lt; &quot;{\n&quot;;
</del><ins>+        outputLineDirective(out, node-&gt;getLine().first_line);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -2455,21 +3087,27 @@
</span><span class="cx"> 
</span><span class="cx">         out &lt;&lt; &quot;)\n&quot;;
</span><span class="cx"> 
</span><del>-        outputLineDirective(node-&gt;getLine().first_line);
-        out &lt;&lt; &quot;{\n&quot;;
</del><ins>+        outputLineDirective(out, node-&gt;getLine().first_line);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (node-&gt;getBody())
</span><span class="cx">     {
</span><del>-        traverseStatements(node-&gt;getBody());
</del><ins>+        // The loop body node will output braces.
+        ASSERT(IsSequence(node-&gt;getBody()));
+        node-&gt;getBody()-&gt;traverse(this);
</ins><span class="cx">     }
</span><ins>+    else
+    {
+        // TODO(oetuaho): Check if the semicolon inside is necessary.
+        // It's there as a result of conservative refactoring of the output.
+        out &lt;&lt; &quot;{;}\n&quot;;
+    }
</ins><span class="cx"> 
</span><del>-    outputLineDirective(node-&gt;getLine().first_line);
-    out &lt;&lt; &quot;;}\n&quot;;
</del><ins>+    outputLineDirective(out, node-&gt;getLine().first_line);
</ins><span class="cx"> 
</span><span class="cx">     if (node-&gt;getType() == ELoopDoWhile)
</span><span class="cx">     {
</span><del>-        outputLineDirective(node-&gt;getCondition()-&gt;getLine().first_line);
</del><ins>+        outputLineDirective(out, node-&gt;getCondition()-&gt;getLine().first_line);
</ins><span class="cx">         out &lt;&lt; &quot;while(\n&quot;;
</span><span class="cx"> 
</span><span class="cx">         node-&gt;getCondition()-&gt;traverse(this);
</span><span class="lines">@@ -2492,7 +3130,7 @@
</span><span class="cx">     switch (node-&gt;getFlowOp())
</span><span class="cx">     {
</span><span class="cx">       case EOpKill:
</span><del>-        outputTriplet(visit, &quot;discard;\n&quot;, &quot;&quot;, &quot;&quot;);
</del><ins>+          outputTriplet(out, visit, &quot;discard;\n&quot;, &quot;&quot;, &quot;&quot;);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpBreak:
</span><span class="cx">         if (visit == PreVisit)
</span><span class="lines">@@ -2514,7 +3152,9 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         break;
</span><del>-      case EOpContinue: outputTriplet(visit, &quot;continue;\n&quot;, &quot;&quot;, &quot;&quot;); break;
</del><ins>+      case EOpContinue:
+          outputTriplet(out, visit, &quot;continue;\n&quot;, &quot;&quot;, &quot;&quot;);
+          break;
</ins><span class="cx">       case EOpReturn:
</span><span class="cx">         if (visit == PreVisit)
</span><span class="cx">         {
</span><span class="lines">@@ -2541,16 +3181,6 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void OutputHLSL::traverseStatements(TIntermNode *node)
-{
-    if (isSingleStatement(node))
-    {
-        mUnfoldShortCircuit-&gt;traverse(node);
-    }
-
-    node-&gt;traverse(this);
-}
-
</del><span class="cx"> bool OutputHLSL::isSingleStatement(TIntermNode *node)
</span><span class="cx"> {
</span><span class="cx">     TIntermAggregate *aggregate = node-&gt;getAsAggregate();
</span><span class="lines">@@ -2586,10 +3216,9 @@
</span><span class="cx"> 
</span><span class="cx"> // Handle loops with more than 254 iterations (unsupported by D3D9) by splitting them
</span><span class="cx"> // (The D3D documentation says 255 iterations, but the compiler complains at anything more than 254).
</span><del>-bool OutputHLSL::handleExcessiveLoop(TIntermLoop *node)
</del><ins>+bool OutputHLSL::handleExcessiveLoop(TInfoSinkBase &amp;out, TIntermLoop *node)
</ins><span class="cx"> {
</span><span class="cx">     const int MAX_LOOP_ITERATIONS = 254;
</span><del>-    TInfoSinkBase &amp;out = getInfoSink();
</del><span class="cx"> 
</span><span class="cx">     // Parse loops of the form:
</span><span class="cx">     // for(int index = initial; index [comparator] limit; index += increment)
</span><span class="lines">@@ -2756,7 +3385,7 @@
</span><span class="cx">                 out &lt;&lt; increment;
</span><span class="cx">                 out &lt;&lt; &quot;)\n&quot;;
</span><span class="cx"> 
</span><del>-                outputLineDirective(node-&gt;getLine().first_line);
</del><ins>+                outputLineDirective(out, node-&gt;getLine().first_line);
</ins><span class="cx">                 out &lt;&lt; &quot;{\n&quot;;
</span><span class="cx"> 
</span><span class="cx">                 if (node-&gt;getBody())
</span><span class="lines">@@ -2764,7 +3393,7 @@
</span><span class="cx">                     node-&gt;getBody()-&gt;traverse(this);
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                outputLineDirective(node-&gt;getLine().first_line);
</del><ins>+                outputLineDirective(out, node-&gt;getLine().first_line);
</ins><span class="cx">                 out &lt;&lt; &quot;;}\n&quot;;
</span><span class="cx"> 
</span><span class="cx">                 if (!firstLoopFragment)
</span><span class="lines">@@ -2790,7 +3419,11 @@
</span><span class="cx">     return false;   // Not handled as an excessive loop
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void OutputHLSL::outputTriplet(Visit visit, const char *preString, const char *inString, const char *postString, TInfoSinkBase &amp;out)
</del><ins>+void OutputHLSL::outputTriplet(TInfoSinkBase &amp;out,
+                               Visit visit,
+                               const char *preString,
+                               const char *inString,
+                               const char *postString)
</ins><span class="cx"> {
</span><span class="cx">     if (visit == PreVisit)
</span><span class="cx">     {
</span><span class="lines">@@ -2806,17 +3439,10 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void OutputHLSL::outputTriplet(Visit visit, const char *preString, const char *inString, const char *postString)
</del><ins>+void OutputHLSL::outputLineDirective(TInfoSinkBase &amp;out, int line)
</ins><span class="cx"> {
</span><del>-    outputTriplet(visit, preString, inString, postString, getInfoSink());
-}
-
-void OutputHLSL::outputLineDirective(int line)
-{
</del><span class="cx">     if ((mCompileOptions &amp; SH_LINE_DIRECTIVES) &amp;&amp; (line &gt; 0))
</span><span class="cx">     {
</span><del>-        TInfoSinkBase &amp;out = getInfoSink();
-
</del><span class="cx">         out &lt;&lt; &quot;\n&quot;;
</span><span class="cx">         out &lt;&lt; &quot;#line &quot; &lt;&lt; line;
</span><span class="cx"> 
</span><span class="lines">@@ -2832,25 +3458,79 @@
</span><span class="cx"> TString OutputHLSL::argumentString(const TIntermSymbol *symbol)
</span><span class="cx"> {
</span><span class="cx">     TQualifier qualifier = symbol-&gt;getQualifier();
</span><del>-    const TType &amp;type = symbol-&gt;getType();
-    TString name = symbol-&gt;getSymbol();
</del><ins>+    const TType &amp;type    = symbol-&gt;getType();
+    const TName &amp;name    = symbol-&gt;getName();
+    TString nameStr;
</ins><span class="cx"> 
</span><del>-    if (name.empty())   // HLSL demands named arguments, also for prototypes
</del><ins>+    if (name.getString().empty())  // HLSL demands named arguments, also for prototypes
</ins><span class="cx">     {
</span><del>-        name = &quot;x&quot; + str(mUniqueIndex++);
</del><ins>+        nameStr = &quot;x&quot; + str(mUniqueIndex++);
</ins><span class="cx">     }
</span><del>-    else if (!symbol-&gt;isInternal())
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        name = Decorate(name);
</del><ins>+        nameStr = DecorateIfNeeded(name);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (mOutputType == SH_HLSL11_OUTPUT &amp;&amp; IsSampler(type.getBasicType()))
</del><ins>+    if (IsSampler(type.getBasicType()))
</ins><span class="cx">     {
</span><del>-        return QualifierString(qualifier) + &quot; &quot; + TextureString(type) + &quot; texture_&quot; + name + ArrayString(type) + &quot;, &quot; +
-               QualifierString(qualifier) + &quot; &quot; + SamplerString(type) + &quot; sampler_&quot; + name + ArrayString(type);
</del><ins>+        if (mOutputType == SH_HLSL_4_1_OUTPUT)
+        {
+            // Samplers are passed as indices to the sampler array.
+            ASSERT(qualifier != EvqOut &amp;&amp; qualifier != EvqInOut);
+            return &quot;const uint &quot; + nameStr + ArrayString(type);
+        }
+        if (mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT)
+        {
+            return QualifierString(qualifier) + &quot; &quot; + TextureString(type.getBasicType()) +
+                   &quot; texture_&quot; + nameStr + ArrayString(type) + &quot;, &quot; + QualifierString(qualifier) +
+                   &quot; &quot; + SamplerString(type.getBasicType()) + &quot; sampler_&quot; + nameStr +
+                   ArrayString(type);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return QualifierString(qualifier) + &quot; &quot; + TypeString(type) + &quot; &quot; + name + ArrayString(type);
</del><ins>+    TStringStream argString;
+    argString &lt;&lt; QualifierString(qualifier) &lt;&lt; &quot; &quot; &lt;&lt; TypeString(type) &lt;&lt; &quot; &quot; &lt;&lt; nameStr
+              &lt;&lt; ArrayString(type);
+
+    // If the structure parameter contains samplers, they need to be passed into the function as
+    // separate parameters. HLSL doesn't natively support samplers in structs.
+    if (type.isStructureContainingSamplers())
+    {
+        ASSERT(qualifier != EvqOut &amp;&amp; qualifier != EvqInOut);
+        TVector&lt;TIntermSymbol *&gt; samplerSymbols;
+        type.createSamplerSymbols(&quot;angle&quot; + nameStr, &quot;&quot;, 0, &amp;samplerSymbols, nullptr);
+        for (const TIntermSymbol *sampler : samplerSymbols)
+        {
+            if (mOutputType == SH_HLSL_4_1_OUTPUT)
+            {
+                argString &lt;&lt; &quot;, const uint &quot; &lt;&lt; sampler-&gt;getSymbol() &lt;&lt; ArrayString(type);
+            }
+            else if (mOutputType == SH_HLSL_4_0_FL9_3_OUTPUT)
+            {
+                const TType &amp;samplerType = sampler-&gt;getType();
+                ASSERT((!type.isArray() &amp;&amp; !samplerType.isArray()) ||
+                       type.getArraySize() == samplerType.getArraySize());
+                ASSERT(IsSampler(samplerType.getBasicType()));
+                argString &lt;&lt; &quot;, &quot; &lt;&lt; QualifierString(qualifier) &lt;&lt; &quot; &quot;
+                          &lt;&lt; TextureString(samplerType.getBasicType()) &lt;&lt; &quot; texture_&quot;
+                          &lt;&lt; sampler-&gt;getSymbol() &lt;&lt; ArrayString(type) &lt;&lt; &quot;, &quot;
+                          &lt;&lt; QualifierString(qualifier) &lt;&lt; &quot; &quot;
+                          &lt;&lt; SamplerString(samplerType.getBasicType()) &lt;&lt; &quot; sampler_&quot;
+                          &lt;&lt; sampler-&gt;getSymbol() &lt;&lt; ArrayString(type);
+            }
+            else
+            {
+                const TType &amp;samplerType = sampler-&gt;getType();
+                ASSERT((!type.isArray() &amp;&amp; !samplerType.isArray()) ||
+                       type.getArraySize() == samplerType.getArraySize());
+                ASSERT(IsSampler(samplerType.getBasicType()));
+                argString &lt;&lt; &quot;, &quot; &lt;&lt; QualifierString(qualifier) &lt;&lt; &quot; &quot; &lt;&lt; TypeString(samplerType)
+                          &lt;&lt; &quot; &quot; &lt;&lt; sampler-&gt;getSymbol() &lt;&lt; ArrayString(type);
+            }
+        }
+    }
+
+    return argString.str();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TString OutputHLSL::initializer(const TType &amp;type)
</span><span class="lines">@@ -2871,19 +3551,22 @@
</span><span class="cx">     return &quot;{&quot; + string + &quot;}&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void OutputHLSL::outputConstructor(Visit visit, const TType &amp;type, const char *name, const TIntermSequence *parameters)
</del><ins>+void OutputHLSL::outputConstructor(TInfoSinkBase &amp;out,
+                                   Visit visit,
+                                   const TType &amp;type,
+                                   const char *name,
+                                   const TIntermSequence *parameters)
</ins><span class="cx"> {
</span><span class="cx">     if (type.isArray())
</span><span class="cx">     {
</span><span class="cx">         UNIMPLEMENTED();
</span><span class="cx">     }
</span><del>-    TInfoSinkBase &amp;out = getInfoSink();
</del><span class="cx"> 
</span><span class="cx">     if (visit == PreVisit)
</span><span class="cx">     {
</span><del>-        mStructureHLSL-&gt;addConstructor(type, name, parameters);
</del><ins>+        TString constructorName = mStructureHLSL-&gt;addConstructor(type, name, parameters);
</ins><span class="cx"> 
</span><del>-        out &lt;&lt; name &lt;&lt; &quot;(&quot;;
</del><ins>+        out &lt;&lt; constructorName &lt;&lt; &quot;(&quot;;
</ins><span class="cx">     }
</span><span class="cx">     else if (visit == InVisit)
</span><span class="cx">     {
</span><span class="lines">@@ -2895,9 +3578,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const TConstantUnion *OutputHLSL::writeConstantUnion(const TType &amp;type, const TConstantUnion *constUnion)
</del><ins>+const TConstantUnion *OutputHLSL::writeConstantUnion(TInfoSinkBase &amp;out,
+                                                     const TType &amp;type,
+                                                     const TConstantUnion *const constUnion)
</ins><span class="cx"> {
</span><del>-    TInfoSinkBase &amp;out = getInfoSink();
</del><ins>+    const TConstantUnion *constUnionIterated = constUnion;
</ins><span class="cx"> 
</span><span class="cx">     const TStructure* structure = type.getStruct();
</span><span class="cx">     if (structure)
</span><span class="lines">@@ -2909,7 +3594,7 @@
</span><span class="cx">         for (size_t i = 0; i &lt; fields.size(); i++)
</span><span class="cx">         {
</span><span class="cx">             const TType *fieldType = fields[i]-&gt;type();
</span><del>-            constUnion = writeConstantUnion(*fieldType, constUnion);
</del><ins>+            constUnionIterated     = writeConstantUnion(out, *fieldType, constUnionIterated);
</ins><span class="cx"> 
</span><span class="cx">             if (i != fields.size() - 1)
</span><span class="cx">             {
</span><span class="lines">@@ -2928,37 +3613,20 @@
</span><span class="cx">         {
</span><span class="cx">             out &lt;&lt; TypeString(type) &lt;&lt; &quot;(&quot;;
</span><span class="cx">         }
</span><del>-
-        for (size_t i = 0; i &lt; size; i++, constUnion++)
-        {
-            switch (constUnion-&gt;getType())
-            {
-              case EbtFloat: out &lt;&lt; std::min(FLT_MAX, std::max(-FLT_MAX, constUnion-&gt;getFConst())); break;
-              case EbtInt:   out &lt;&lt; constUnion-&gt;getIConst(); break;
-              case EbtUInt:  out &lt;&lt; constUnion-&gt;getUConst(); break;
-              case EbtBool:  out &lt;&lt; constUnion-&gt;getBConst(); break;
-              default: UNREACHABLE();
-            }
-
-            if (i != size - 1)
-            {
-                out &lt;&lt; &quot;, &quot;;
-            }
-        }
-
</del><ins>+        constUnionIterated = WriteConstantUnionArray(out, constUnionIterated, size);
</ins><span class="cx">         if (writeType)
</span><span class="cx">         {
</span><span class="cx">             out &lt;&lt; &quot;)&quot;;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return constUnion;
</del><ins>+    return constUnionIterated;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void OutputHLSL::writeEmulatedFunctionTriplet(Visit visit, const char *preStr)
</del><ins>+void OutputHLSL::writeEmulatedFunctionTriplet(TInfoSinkBase &amp;out, Visit visit, const char *preStr)
</ins><span class="cx"> {
</span><span class="cx">     TString preString = BuiltInFunctionEmulator::GetEmulatedFunctionName(preStr);
</span><del>-    outputTriplet(visit, preString.c_str(), &quot;, &quot;, &quot;)&quot;);
</del><ins>+    outputTriplet(out, visit, preString.c_str(), &quot;, &quot;, &quot;)&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool OutputHLSL::writeSameSymbolInitializer(TInfoSinkBase &amp;out, TIntermSymbol *symbolNode, TIntermTyped *expression)
</span><span class="lines">@@ -2982,33 +3650,66 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void OutputHLSL::writeDeferredGlobalInitializers(TInfoSinkBase &amp;out)
</del><ins>+bool OutputHLSL::canWriteAsHLSLLiteral(TIntermTyped *expression)
</ins><span class="cx"> {
</span><del>-    out &lt;&lt; &quot;#define ANGLE_USES_DEFERRED_INIT\n&quot;
-        &lt;&lt; &quot;\n&quot;
-        &lt;&lt; &quot;void initializeDeferredGlobals()\n&quot;
-        &lt;&lt; &quot;{\n&quot;;
</del><ins>+    // We support writing constant unions and constructors that only take constant unions as
+    // parameters as HLSL literals.
+    if (expression-&gt;getAsConstantUnion())
+    {
+        return true;
+    }
+    if (expression-&gt;getQualifier() != EvqConst || !expression-&gt;getAsAggregate() ||
+        !expression-&gt;getAsAggregate()-&gt;isConstructor())
+    {
+        return false;
+    }
+    TIntermAggregate *constructor = expression-&gt;getAsAggregate();
+    for (TIntermNode *&amp;node : *constructor-&gt;getSequence())
+    {
+        if (!node-&gt;getAsConstantUnion())
+            return false;
+    }
+    return true;
+}
</ins><span class="cx"> 
</span><del>-    for (const auto &amp;deferredGlobal : mDeferredGlobalInitializers)
</del><ins>+bool OutputHLSL::writeConstantInitialization(TInfoSinkBase &amp;out,
+                                             TIntermSymbol *symbolNode,
+                                             TIntermTyped *expression)
+{
+    if (canWriteAsHLSLLiteral(expression))
</ins><span class="cx">     {
</span><del>-        TIntermSymbol *symbol = deferredGlobal.first;
-        TIntermTyped *expression = deferredGlobal.second;
-        ASSERT(symbol);
-        ASSERT(symbol-&gt;getQualifier() == EvqGlobal &amp;&amp; expression-&gt;getQualifier() != EvqConst);
-
-        out &lt;&lt; &quot;    &quot; &lt;&lt; Decorate(symbol-&gt;getSymbol()) &lt;&lt; &quot; = &quot;;
-
-        if (!writeSameSymbolInitializer(out, symbol, expression))
</del><ins>+        symbolNode-&gt;traverse(this);
+        if (expression-&gt;getType().isArray())
</ins><span class="cx">         {
</span><del>-            ASSERT(mInfoSinkStack.top() == &amp;out);
-            expression-&gt;traverse(this);
</del><ins>+            out &lt;&lt; &quot;[&quot; &lt;&lt; expression-&gt;getType().getArraySize() &lt;&lt; &quot;]&quot;;
</ins><span class="cx">         }
</span><del>-
-        out &lt;&lt; &quot;;\n&quot;;
</del><ins>+        out &lt;&lt; &quot; = {&quot;;
+        if (expression-&gt;getAsConstantUnion())
+        {
+            TIntermConstantUnion *nodeConst  = expression-&gt;getAsConstantUnion();
+            const TConstantUnion *constUnion = nodeConst-&gt;getUnionArrayPointer();
+            WriteConstantUnionArray(out, constUnion, nodeConst-&gt;getType().getObjectSize());
+        }
+        else
+        {
+            TIntermAggregate *constructor = expression-&gt;getAsAggregate();
+            ASSERT(constructor != nullptr);
+            for (TIntermNode *&amp;node : *constructor-&gt;getSequence())
+            {
+                TIntermConstantUnion *nodeConst = node-&gt;getAsConstantUnion();
+                ASSERT(nodeConst);
+                const TConstantUnion *constUnion = nodeConst-&gt;getUnionArrayPointer();
+                WriteConstantUnionArray(out, constUnion, nodeConst-&gt;getType().getObjectSize());
+                if (node != constructor-&gt;getSequence()-&gt;back())
+                {
+                    out &lt;&lt; &quot;, &quot;;
+                }
+            }
+        }
+        out &lt;&lt; &quot;}&quot;;
+        return true;
</ins><span class="cx">     }
</span><del>-
-    out &lt;&lt; &quot;}\n&quot;
-        &lt;&lt; &quot;\n&quot;;
</del><ins>+    return false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TString OutputHLSL::addStructEqualityFunction(const TStructure &amp;structure)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorOutputHLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/OutputHLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -47,8 +47,10 @@
</span><span class="cx"> 
</span><span class="cx">     TInfoSinkBase &amp;getInfoSink() { ASSERT(!mInfoSinkStack.empty()); return *mInfoSinkStack.top(); }
</span><span class="cx"> 
</span><ins>+    static bool canWriteAsHLSLLiteral(TIntermTyped *expression);
+
</ins><span class="cx">   protected:
</span><del>-    void header(const BuiltInFunctionEmulator *builtInFunctionEmulator);
</del><ins>+    void header(TInfoSinkBase &amp;out, const BuiltInFunctionEmulator *builtInFunctionEmulator);
</ins><span class="cx"> 
</span><span class="cx">     // Visit AST nodes and output their code to the body stream
</span><span class="cx">     void visitSymbol(TIntermSymbol*);
</span><span class="lines">@@ -63,29 +65,43 @@
</span><span class="cx">     bool visitLoop(Visit visit, TIntermLoop*);
</span><span class="cx">     bool visitBranch(Visit visit, TIntermBranch*);
</span><span class="cx"> 
</span><del>-    void traverseStatements(TIntermNode *node);
</del><span class="cx">     bool isSingleStatement(TIntermNode *node);
</span><del>-    bool handleExcessiveLoop(TIntermLoop *node);
</del><ins>+    bool handleExcessiveLoop(TInfoSinkBase &amp;out, TIntermLoop *node);
</ins><span class="cx"> 
</span><span class="cx">     // Emit one of three strings depending on traverse phase. Called with literal strings so using const char* instead of TString.
</span><del>-    void outputTriplet(Visit visit, const char *preString, const char *inString, const char *postString, TInfoSinkBase &amp;out);
-    void outputTriplet(Visit visit, const char *preString, const char *inString, const char *postString);
-    void outputLineDirective(int line);
</del><ins>+    void outputTriplet(TInfoSinkBase &amp;out,
+                       Visit visit,
+                       const char *preString,
+                       const char *inString,
+                       const char *postString);
+    void outputLineDirective(TInfoSinkBase &amp;out, int line);
</ins><span class="cx">     TString argumentString(const TIntermSymbol *symbol);
</span><span class="cx">     int vectorSize(const TType &amp;type) const;
</span><span class="cx"> 
</span><span class="cx">     // Emit constructor. Called with literal names so using const char* instead of TString.
</span><del>-    void outputConstructor(Visit visit, const TType &amp;type, const char *name, const TIntermSequence *parameters);
-    const TConstantUnion *writeConstantUnion(const TType &amp;type, const TConstantUnion *constUnion);
</del><ins>+    void outputConstructor(TInfoSinkBase &amp;out,
+                           Visit visit,
+                           const TType &amp;type,
+                           const char *name,
+                           const TIntermSequence *parameters);
+    const TConstantUnion *writeConstantUnion(TInfoSinkBase &amp;out,
+                                             const TType &amp;type,
+                                             const TConstantUnion *constUnion);
</ins><span class="cx"> 
</span><span class="cx">     void outputEqual(Visit visit, const TType &amp;type, TOperator op, TInfoSinkBase &amp;out);
</span><span class="cx"> 
</span><del>-    void writeEmulatedFunctionTriplet(Visit visit, const char *preStr);
</del><ins>+    void writeEmulatedFunctionTriplet(TInfoSinkBase &amp;out, Visit visit, const char *preStr);
</ins><span class="cx">     void makeFlaggedStructMaps(const std::vector&lt;TIntermTyped *&gt; &amp;flaggedStructs);
</span><span class="cx"> 
</span><span class="cx">     // Returns true if it found a 'same symbol' initializer (initializer that references the variable it's initting)
</span><span class="cx">     bool writeSameSymbolInitializer(TInfoSinkBase &amp;out, TIntermSymbol *symbolNode, TIntermTyped *expression);
</span><ins>+    // Returns true if variable initializer could be written using literal {} notation.
+    bool writeConstantInitialization(TInfoSinkBase &amp;out,
+                                     TIntermSymbol *symbolNode,
+                                     TIntermTyped *expression);
+
</ins><span class="cx">     void writeDeferredGlobalInitializers(TInfoSinkBase &amp;out);
</span><ins>+    void writeSelection(TInfoSinkBase &amp;out, TIntermSelection *node);
</ins><span class="cx"> 
</span><span class="cx">     // Returns the function name
</span><span class="cx">     TString addStructEqualityFunction(const TStructure &amp;structure);
</span><span class="lines">@@ -103,7 +119,6 @@
</span><span class="cx">     const ShShaderOutput mOutputType;
</span><span class="cx">     int mCompileOptions;
</span><span class="cx"> 
</span><del>-    UnfoldShortCircuit *mUnfoldShortCircuit;
</del><span class="cx">     bool mInsideFunction;
</span><span class="cx"> 
</span><span class="cx">     // Output streams
</span><span class="lines">@@ -162,6 +177,7 @@
</span><span class="cx">     bool mUsesFrontFacing;
</span><span class="cx">     bool mUsesPointSize;
</span><span class="cx">     bool mUsesInstanceID;
</span><ins>+    bool mUsesVertexID;
</ins><span class="cx">     bool mUsesFragDepth;
</span><span class="cx">     bool mUsesXor;
</span><span class="cx">     bool mUsesDiscardRewriting;
</span><span class="lines">@@ -187,12 +203,6 @@
</span><span class="cx">     std::map&lt;TIntermTyped*, TString&gt; mFlaggedStructMappedNames;
</span><span class="cx">     std::map&lt;TIntermTyped*, TString&gt; mFlaggedStructOriginalNames;
</span><span class="cx"> 
</span><del>-    // Some initializers use varyings, uniforms or attributes, thus we can't evaluate some variables
-    // at global static scope in HLSL. These variables depend on values which we retrieve from the
-    // shader input structure, which we set in the D3D main function. Instead, we can initialize
-    // these static globals after we initialize our other globals.
-    std::vector&lt;std::pair&lt;TIntermSymbol*, TIntermTyped*&gt;&gt; mDeferredGlobalInitializers;
-
</del><span class="cx">     struct HelperFunction
</span><span class="cx">     {
</span><span class="cx">         TString functionName;
</span><span class="lines">@@ -225,6 +235,10 @@
</span><span class="cx">     // with the other N parameters of the function. This is used to work around that arrays can't be
</span><span class="cx">     // return values in HLSL.
</span><span class="cx">     std::vector&lt;ArrayHelperFunction&gt; mArrayConstructIntoFunctions;
</span><ins>+
+  private:
+    TString samplerNamePrefixFromStruct(TIntermTyped *node);
+    bool ancestorEvaluatesToSamplerInStruct(Visit visit);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorParseContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,8 +10,11 @@
</span><span class="cx"> #include &lt;stdio.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/preprocessor/SourceLocation.h&quot;
</span><ins>+#include &quot;compiler/translator/Cache.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/glslang.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/ValidateSwitch.h&quot;
</span><ins>+#include &quot;compiler/translator/ValidateGlobalInitializer.h&quot;
+#include &quot;compiler/translator/util.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> ///////////////////////////////////////////////////////////////////////
</span><span class="cx"> //
</span><span class="lines">@@ -23,86 +26,98 @@
</span><span class="cx"> // Look at a '.' field selector string and change it into offsets
</span><span class="cx"> // for a vector.
</span><span class="cx"> //
</span><del>-bool TParseContext::parseVectorFields(const TString&amp; compString, int vecSize, TVectorFields&amp; fields, const TSourceLoc&amp; line)
</del><ins>+bool TParseContext::parseVectorFields(const TString &amp;compString,
+                                      int vecSize,
+                                      TVectorFields &amp;fields,
+                                      const TSourceLoc &amp;line)
</ins><span class="cx"> {
</span><del>-    fields.num = (int) compString.size();
-    if (fields.num &gt; 4) {
</del><ins>+    fields.num = (int)compString.size();
+    if (fields.num &gt; 4)
+    {
</ins><span class="cx">         error(line, &quot;illegal vector field selection&quot;, compString.c_str());
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    enum {
</del><ins>+    enum
+    {
</ins><span class="cx">         exyzw,
</span><span class="cx">         ergba,
</span><span class="cx">         estpq
</span><span class="cx">     } fieldSet[4];
</span><span class="cx"> 
</span><del>-    for (int i = 0; i &lt; fields.num; ++i) {
-        switch (compString[i])  {
-        case 'x': 
-            fields.offsets[i] = 0;
-            fieldSet[i] = exyzw;
-            break;
-        case 'r': 
-            fields.offsets[i] = 0;
-            fieldSet[i] = ergba;
-            break;
-        case 's':
-            fields.offsets[i] = 0;
-            fieldSet[i] = estpq;
-            break;
-        case 'y': 
-            fields.offsets[i] = 1;
-            fieldSet[i] = exyzw;
-            break;
-        case 'g': 
-            fields.offsets[i] = 1;
-            fieldSet[i] = ergba;
-            break;
-        case 't':
-            fields.offsets[i] = 1;
-            fieldSet[i] = estpq;
-            break;
-        case 'z': 
-            fields.offsets[i] = 2;
-            fieldSet[i] = exyzw;
-            break;
-        case 'b': 
-            fields.offsets[i] = 2;
-            fieldSet[i] = ergba;
-            break;
-        case 'p':
-            fields.offsets[i] = 2;
-            fieldSet[i] = estpq;
-            break;
-        
-        case 'w': 
-            fields.offsets[i] = 3;
-            fieldSet[i] = exyzw;
-            break;
-        case 'a': 
-            fields.offsets[i] = 3;
-            fieldSet[i] = ergba;
-            break;
-        case 'q':
-            fields.offsets[i] = 3;
-            fieldSet[i] = estpq;
-            break;
-        default:
-            error(line, &quot;illegal vector field selection&quot;, compString.c_str());
-            return false;
</del><ins>+    for (int i = 0; i &lt; fields.num; ++i)
+    {
+        switch (compString[i])
+        {
+            case 'x':
+                fields.offsets[i] = 0;
+                fieldSet[i]       = exyzw;
+                break;
+            case 'r':
+                fields.offsets[i] = 0;
+                fieldSet[i]       = ergba;
+                break;
+            case 's':
+                fields.offsets[i] = 0;
+                fieldSet[i]       = estpq;
+                break;
+            case 'y':
+                fields.offsets[i] = 1;
+                fieldSet[i]       = exyzw;
+                break;
+            case 'g':
+                fields.offsets[i] = 1;
+                fieldSet[i]       = ergba;
+                break;
+            case 't':
+                fields.offsets[i] = 1;
+                fieldSet[i]       = estpq;
+                break;
+            case 'z':
+                fields.offsets[i] = 2;
+                fieldSet[i]       = exyzw;
+                break;
+            case 'b':
+                fields.offsets[i] = 2;
+                fieldSet[i]       = ergba;
+                break;
+            case 'p':
+                fields.offsets[i] = 2;
+                fieldSet[i]       = estpq;
+                break;
+
+            case 'w':
+                fields.offsets[i] = 3;
+                fieldSet[i]       = exyzw;
+                break;
+            case 'a':
+                fields.offsets[i] = 3;
+                fieldSet[i]       = ergba;
+                break;
+            case 'q':
+                fields.offsets[i] = 3;
+                fieldSet[i]       = estpq;
+                break;
+            default:
+                error(line, &quot;illegal vector field selection&quot;, compString.c_str());
+                return false;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (int i = 0; i &lt; fields.num; ++i) {
-        if (fields.offsets[i] &gt;= vecSize) {
-            error(line, &quot;vector field selection out of range&quot;,  compString.c_str());
</del><ins>+    for (int i = 0; i &lt; fields.num; ++i)
+    {
+        if (fields.offsets[i] &gt;= vecSize)
+        {
+            error(line, &quot;vector field selection out of range&quot;, compString.c_str());
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (i &gt; 0) {
-            if (fieldSet[i] != fieldSet[i-1]) {
-                error(line, &quot;illegal - vector component fields not from the same set&quot;, compString.c_str());
</del><ins>+        if (i &gt; 0)
+        {
+            if (fieldSet[i] != fieldSet[i - 1])
+            {
+                error(line, &quot;illegal - vector component fields not from the same set&quot;,
+                      compString.c_str());
</ins><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -111,55 +126,6 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
-//
-// Look at a '.' field selector string and change it into offsets
-// for a matrix.
-//
-bool TParseContext::parseMatrixFields(const TString&amp; compString, int matCols, int matRows, TMatrixFields&amp; fields, const TSourceLoc&amp; line)
-{
-    fields.wholeRow = false;
-    fields.wholeCol = false;
-    fields.row = -1;
-    fields.col = -1;
-
-    if (compString.size() != 2) {
-        error(line, &quot;illegal length of matrix field selection&quot;, compString.c_str());
-        return false;
-    }
-
-    if (compString[0] == '_') {
-        if (compString[1] &lt; '0' || compString[1] &gt; '3') {
-            error(line, &quot;illegal matrix field selection&quot;, compString.c_str());
-            return false;
-        }
-        fields.wholeCol = true;
-        fields.col = compString[1] - '0';
-    } else if (compString[1] == '_') {
-        if (compString[0] &lt; '0' || compString[0] &gt; '3') {
-            error(line, &quot;illegal matrix field selection&quot;, compString.c_str());
-            return false;
-        }
-        fields.wholeRow = true;
-        fields.row = compString[0] - '0';
-    } else {
-        if (compString[0] &lt; '0' || compString[0] &gt; '3' ||
-            compString[1] &lt; '0' || compString[1] &gt; '3') {
-            error(line, &quot;illegal matrix field selection&quot;, compString.c_str());
-            return false;
-        }
-        fields.row = compString[0] - '0';
-        fields.col = compString[1] - '0';
-    }
-
-    if (fields.row &gt;= matRows || fields.col &gt;= matCols) {
-        error(line, &quot;matrix field selection out of range&quot;, compString.c_str());
-        return false;
-    }
-
-    return true;
-}
-
</del><span class="cx"> ///////////////////////////////////////////////////////////////////////
</span><span class="cx"> //
</span><span class="cx"> // Errors
</span><span class="lines">@@ -176,32 +142,49 @@
</span><span class="cx"> //
</span><span class="cx"> // Used by flex/bison to output all syntax and parsing errors.
</span><span class="cx"> //
</span><del>-void TParseContext::error(const TSourceLoc&amp; loc,
-                          const char* reason, const char* token, 
-                          const char* extraInfo)
</del><ins>+void TParseContext::error(const TSourceLoc &amp;loc,
+                          const char *reason,
+                          const char *token,
+                          const char *extraInfo)
</ins><span class="cx"> {
</span><span class="cx">     pp::SourceLocation srcLoc;
</span><span class="cx">     srcLoc.file = loc.first_file;
</span><span class="cx">     srcLoc.line = loc.first_line;
</span><del>-    diagnostics.writeInfo(pp::Diagnostics::PP_ERROR,
-                          srcLoc, reason, token, extraInfo);
-
</del><ins>+    mDiagnostics.writeInfo(pp::Diagnostics::PP_ERROR, srcLoc, reason, token, extraInfo);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TParseContext::warning(const TSourceLoc&amp; loc,
-                            const char* reason, const char* token,
-                            const char* extraInfo) {
</del><ins>+void TParseContext::warning(const TSourceLoc &amp;loc,
+                            const char *reason,
+                            const char *token,
+                            const char *extraInfo)
+{
</ins><span class="cx">     pp::SourceLocation srcLoc;
</span><span class="cx">     srcLoc.file = loc.first_file;
</span><span class="cx">     srcLoc.line = loc.first_line;
</span><del>-    diagnostics.writeInfo(pp::Diagnostics::PP_WARNING,
-                          srcLoc, reason, token, extraInfo);
</del><ins>+    mDiagnostics.writeInfo(pp::Diagnostics::PP_WARNING, srcLoc, reason, token, extraInfo);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TParseContext::outOfRangeError(bool isError,
+                                    const TSourceLoc &amp;loc,
+                                    const char *reason,
+                                    const char *token,
+                                    const char *extraInfo)
+{
+    if (isError)
+    {
+        error(loc, reason, token, extraInfo);
+        recover();
+    }
+    else
+    {
+        warning(loc, reason, token, extraInfo);
+    }
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // Same error message for all places assignments don't work.
</span><span class="cx"> //
</span><del>-void TParseContext::assignError(const TSourceLoc&amp; line, const char* op, TString left, TString right)
</del><ins>+void TParseContext::assignError(const TSourceLoc &amp;line, const char *op, TString left, TString right)
</ins><span class="cx"> {
</span><span class="cx">     std::stringstream extraInfoStream;
</span><span class="cx">     extraInfoStream &lt;&lt; &quot;cannot convert from '&quot; &lt;&lt; right &lt;&lt; &quot;' to '&quot; &lt;&lt; left &lt;&lt; &quot;'&quot;;
</span><span class="lines">@@ -212,11 +195,11 @@
</span><span class="cx"> //
</span><span class="cx"> // Same error message for all places unary operations don't work.
</span><span class="cx"> //
</span><del>-void TParseContext::unaryOpError(const TSourceLoc&amp; line, const char* op, TString operand)
</del><ins>+void TParseContext::unaryOpError(const TSourceLoc &amp;line, const char *op, TString operand)
</ins><span class="cx"> {
</span><span class="cx">     std::stringstream extraInfoStream;
</span><del>-    extraInfoStream &lt;&lt; &quot;no operation '&quot; &lt;&lt; op &lt;&lt; &quot;' exists that takes an operand of type &quot; &lt;&lt; operand 
-                    &lt;&lt; &quot; (or there is no acceptable conversion)&quot;;
</del><ins>+    extraInfoStream &lt;&lt; &quot;no operation '&quot; &lt;&lt; op &lt;&lt; &quot;' exists that takes an operand of type &quot;
+                    &lt;&lt; operand &lt;&lt; &quot; (or there is no acceptable conversion)&quot;;
</ins><span class="cx">     std::string extraInfo = extraInfoStream.str();
</span><span class="cx">     error(line, &quot; wrong operand type&quot;, op, extraInfo.c_str());
</span><span class="cx"> }
</span><span class="lines">@@ -224,33 +207,44 @@
</span><span class="cx"> //
</span><span class="cx"> // Same error message for all binary operations don't work.
</span><span class="cx"> //
</span><del>-void TParseContext::binaryOpError(const TSourceLoc&amp; line, const char* op, TString left, TString right)
</del><ins>+void TParseContext::binaryOpError(const TSourceLoc &amp;line,
+                                  const char *op,
+                                  TString left,
+                                  TString right)
</ins><span class="cx"> {
</span><span class="cx">     std::stringstream extraInfoStream;
</span><del>-    extraInfoStream &lt;&lt; &quot;no operation '&quot; &lt;&lt; op &lt;&lt; &quot;' exists that takes a left-hand operand of type '&quot; &lt;&lt; left 
-                    &lt;&lt; &quot;' and a right operand of type '&quot; &lt;&lt; right &lt;&lt; &quot;' (or there is no acceptable conversion)&quot;;
</del><ins>+    extraInfoStream &lt;&lt; &quot;no operation '&quot; &lt;&lt; op &lt;&lt; &quot;' exists that takes a left-hand operand of type '&quot;
+                    &lt;&lt; left &lt;&lt; &quot;' and a right operand of type '&quot; &lt;&lt; right
+                    &lt;&lt; &quot;' (or there is no acceptable conversion)&quot;;
</ins><span class="cx">     std::string extraInfo = extraInfoStream.str();
</span><del>-    error(line, &quot; wrong operand types &quot;, op, extraInfo.c_str()); 
</del><ins>+    error(line, &quot; wrong operand types &quot;, op, extraInfo.c_str());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::precisionErrorCheck(const TSourceLoc&amp; line, TPrecision precision, TBasicType type){
-    if (!checksPrecisionErrors)
</del><ins>+bool TParseContext::precisionErrorCheck(const TSourceLoc &amp;line,
+                                        TPrecision precision,
+                                        TBasicType type)
+{
+    if (!mChecksPrecisionErrors)
</ins><span class="cx">         return false;
</span><del>-    switch( type ){
-    case EbtFloat:
-        if( precision == EbpUndefined ){
-            error( line, &quot;No precision specified for (float)&quot;, &quot;&quot; );
-            return true;
</del><ins>+    if (precision == EbpUndefined)
+    {
+        switch (type)
+        {
+            case EbtFloat:
+                error(line, &quot;No precision specified for (float)&quot;, &quot;&quot;);
+                return true;
+            case EbtInt:
+            case EbtUInt:
+                UNREACHABLE();  // there's always a predeclared qualifier
+                error(line, &quot;No precision specified (int)&quot;, &quot;&quot;);
+                return true;
+            default:
+                if (IsSampler(type))
+                {
+                    error(line, &quot;No precision specified (sampler)&quot;, &quot;&quot;);
+                    return true;
+                }
</ins><span class="cx">         }
</span><del>-        break;
-    case EbtInt:
-        if( precision == EbpUndefined ){
-            error( line, &quot;No precision specified (int)&quot;, &quot;&quot; );
-            return true;
-        }
-        break;
-    default:
-        return false;
</del><span class="cx">     }
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="lines">@@ -261,86 +255,112 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true if the was an error.
</span><span class="cx"> //
</span><del>-bool TParseContext::lValueErrorCheck(const TSourceLoc&amp; line, const char* op, TIntermTyped* node)
</del><ins>+bool TParseContext::lValueErrorCheck(const TSourceLoc &amp;line, const char *op, TIntermTyped *node)
</ins><span class="cx"> {
</span><del>-    TIntermSymbol* symNode = node-&gt;getAsSymbolNode();
-    TIntermBinary* binaryNode = node-&gt;getAsBinaryNode();
</del><ins>+    TIntermSymbol *symNode    = node-&gt;getAsSymbolNode();
+    TIntermBinary *binaryNode = node-&gt;getAsBinaryNode();
</ins><span class="cx"> 
</span><del>-    if (binaryNode) {
</del><ins>+    if (binaryNode)
+    {
</ins><span class="cx">         bool errorReturn;
</span><span class="cx"> 
</span><del>-        switch(binaryNode-&gt;getOp()) {
-        case EOpIndexDirect:
-        case EOpIndexIndirect:
-        case EOpIndexDirectStruct:
-        case EOpIndexDirectInterfaceBlock:
-            return lValueErrorCheck(line, op, binaryNode-&gt;getLeft());
-        case EOpVectorSwizzle:
-            errorReturn = lValueErrorCheck(line, op, binaryNode-&gt;getLeft());
-            if (!errorReturn) {
-                int offset[4] = {0,0,0,0};
</del><ins>+        switch (binaryNode-&gt;getOp())
+        {
+            case EOpIndexDirect:
+            case EOpIndexIndirect:
+            case EOpIndexDirectStruct:
+            case EOpIndexDirectInterfaceBlock:
+                return lValueErrorCheck(line, op, binaryNode-&gt;getLeft());
+            case EOpVectorSwizzle:
+                errorReturn = lValueErrorCheck(line, op, binaryNode-&gt;getLeft());
+                if (!errorReturn)
+                {
+                    int offset[4] = {0, 0, 0, 0};
</ins><span class="cx"> 
</span><del>-                TIntermTyped* rightNode = binaryNode-&gt;getRight();
-                TIntermAggregate *aggrNode = rightNode-&gt;getAsAggregate();
</del><ins>+                    TIntermTyped *rightNode    = binaryNode-&gt;getRight();
+                    TIntermAggregate *aggrNode = rightNode-&gt;getAsAggregate();
</ins><span class="cx"> 
</span><del>-                for (TIntermSequence::iterator p = aggrNode-&gt;getSequence()-&gt;begin();
-                                               p != aggrNode-&gt;getSequence()-&gt;end(); p++) {
-                    int value = (*p)-&gt;getAsTyped()-&gt;getAsConstantUnion()-&gt;getIConst(0);
-                    offset[value]++;
-                    if (offset[value] &gt; 1) {
-                        error(line, &quot; l-value of swizzle cannot have duplicate components&quot;, op);
</del><ins>+                    for (TIntermSequence::iterator p = aggrNode-&gt;getSequence()-&gt;begin();
+                         p != aggrNode-&gt;getSequence()-&gt;end(); p++)
+                    {
+                        int value = (*p)-&gt;getAsTyped()-&gt;getAsConstantUnion()-&gt;getIConst(0);
+                        offset[value]++;
+                        if (offset[value] &gt; 1)
+                        {
+                            error(line, &quot; l-value of swizzle cannot have duplicate components&quot;, op);
</ins><span class="cx"> 
</span><del>-                        return true;
</del><ins>+                            return true;
+                        }
</ins><span class="cx">                     }
</span><span class="cx">                 }
</span><del>-            }
</del><span class="cx"> 
</span><del>-            return errorReturn;
-        default:
-            break;
</del><ins>+                return errorReturn;
+            default:
+                break;
</ins><span class="cx">         }
</span><span class="cx">         error(line, &quot; l-value required&quot;, op);
</span><span class="cx"> 
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-
-    const char* symbol = 0;
</del><ins>+    const char *symbol = 0;
</ins><span class="cx">     if (symNode != 0)
</span><span class="cx">         symbol = symNode-&gt;getSymbol().c_str();
</span><span class="cx"> 
</span><del>-    const char* message = 0;
-    switch (node-&gt;getQualifier()) {
-    case EvqConst:          message = &quot;can't modify a const&quot;;        break;
-    case EvqConstReadOnly:  message = &quot;can't modify a const&quot;;        break;
-    case EvqAttribute:      message = &quot;can't modify an attribute&quot;;   break;
-    case EvqFragmentIn:     message = &quot;can't modify an input&quot;;       break;
-    case EvqVertexIn:       message = &quot;can't modify an input&quot;;       break;
-    case EvqUniform:        message = &quot;can't modify a uniform&quot;;      break;
-    case EvqVaryingIn:      message = &quot;can't modify a varying&quot;;      break;
-    case EvqFragCoord:      message = &quot;can't modify gl_FragCoord&quot;;   break;
-    case EvqFrontFacing:    message = &quot;can't modify gl_FrontFacing&quot;; break;
-    case EvqPointCoord:     message = &quot;can't modify gl_PointCoord&quot;;  break;
-    default:
-
-        //
-        // Type that can't be written to?
-        //
-        if (node-&gt;getBasicType() == EbtVoid) {
-            message = &quot;can't modify void&quot;;
-        }
-        if (IsSampler(node-&gt;getBasicType())) {
-            message = &quot;can't modify a sampler&quot;;
-        }
</del><ins>+    const char *message = 0;
+    switch (node-&gt;getQualifier())
+    {
+        case EvqConst:
+            message = &quot;can't modify a const&quot;;
+            break;
+        case EvqConstReadOnly:
+            message = &quot;can't modify a const&quot;;
+            break;
+        case EvqAttribute:
+            message = &quot;can't modify an attribute&quot;;
+            break;
+        case EvqFragmentIn:
+            message = &quot;can't modify an input&quot;;
+            break;
+        case EvqVertexIn:
+            message = &quot;can't modify an input&quot;;
+            break;
+        case EvqUniform:
+            message = &quot;can't modify a uniform&quot;;
+            break;
+        case EvqVaryingIn:
+            message = &quot;can't modify a varying&quot;;
+            break;
+        case EvqFragCoord:
+            message = &quot;can't modify gl_FragCoord&quot;;
+            break;
+        case EvqFrontFacing:
+            message = &quot;can't modify gl_FrontFacing&quot;;
+            break;
+        case EvqPointCoord:
+            message = &quot;can't modify gl_PointCoord&quot;;
+            break;
+        default:
+            //
+            // Type that can't be written to?
+            //
+            if (node-&gt;getBasicType() == EbtVoid)
+            {
+                message = &quot;can't modify void&quot;;
+            }
+            if (IsSampler(node-&gt;getBasicType()))
+            {
+                message = &quot;can't modify a sampler&quot;;
+            }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (message == 0 &amp;&amp; binaryNode == 0 &amp;&amp; symNode == 0) {
</del><ins>+    if (message == 0 &amp;&amp; binaryNode == 0 &amp;&amp; symNode == 0)
+    {
</ins><span class="cx">         error(line, &quot; l-value required&quot;, op);
</span><span class="cx"> 
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-
</del><span class="cx">     //
</span><span class="cx">     // Everything else is okay, no error.
</span><span class="cx">     //
</span><span class="lines">@@ -350,13 +370,15 @@
</span><span class="cx">     //
</span><span class="cx">     // If we get here, we have an error and a message.
</span><span class="cx">     //
</span><del>-    if (symNode) {
</del><ins>+    if (symNode)
+    {
</ins><span class="cx">         std::stringstream extraInfoStream;
</span><span class="cx">         extraInfoStream &lt;&lt; &quot;\&quot;&quot; &lt;&lt; symbol &lt;&lt; &quot;\&quot; (&quot; &lt;&lt; message &lt;&lt; &quot;)&quot;;
</span><span class="cx">         std::string extraInfo = extraInfoStream.str();
</span><span class="cx">         error(line, &quot; l-value required&quot;, op, extraInfo.c_str());
</span><span class="cx">     }
</span><del>-    else {
</del><ins>+    else
+    {
</ins><span class="cx">         std::stringstream extraInfoStream;
</span><span class="cx">         extraInfoStream &lt;&lt; &quot;(&quot; &lt;&lt; message &lt;&lt; &quot;)&quot;;
</span><span class="cx">         std::string extraInfo = extraInfoStream.str();
</span><span class="lines">@@ -372,7 +394,7 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true if the was an error.
</span><span class="cx"> //
</span><del>-bool TParseContext::constErrorCheck(TIntermTyped* node)
</del><ins>+bool TParseContext::constErrorCheck(TIntermTyped *node)
</ins><span class="cx"> {
</span><span class="cx">     if (node-&gt;getQualifier() == EvqConst)
</span><span class="cx">         return false;
</span><span class="lines">@@ -388,7 +410,7 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true if the was an error.
</span><span class="cx"> //
</span><del>-bool TParseContext::integerErrorCheck(TIntermTyped* node, const char* token)
</del><ins>+bool TParseContext::integerErrorCheck(TIntermTyped *node, const char *token)
</ins><span class="cx"> {
</span><span class="cx">     if (node-&gt;isScalarInt())
</span><span class="cx">         return false;
</span><span class="lines">@@ -404,7 +426,7 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true if the was an error.
</span><span class="cx"> //
</span><del>-bool TParseContext::globalErrorCheck(const TSourceLoc&amp; line, bool global, const char* token)
</del><ins>+bool TParseContext::globalErrorCheck(const TSourceLoc &amp;line, bool global, const char *token)
</ins><span class="cx"> {
</span><span class="cx">     if (global)
</span><span class="cx">         return false;
</span><span class="lines">@@ -423,30 +445,40 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true if there was an error.
</span><span class="cx"> //
</span><del>-bool TParseContext::reservedErrorCheck(const TSourceLoc&amp; line, const TString&amp; identifier)
</del><ins>+bool TParseContext::reservedErrorCheck(const TSourceLoc &amp;line, const TString &amp;identifier)
</ins><span class="cx"> {
</span><del>-    static const char* reservedErrMsg = &quot;reserved built-in name&quot;;
-    if (!symbolTable.atBuiltInLevel()) {
-        if (identifier.compare(0, 3, &quot;gl_&quot;) == 0) {
</del><ins>+    static const char *reservedErrMsg = &quot;reserved built-in name&quot;;
+    if (!symbolTable.atBuiltInLevel())
+    {
+        if (identifier.compare(0, 3, &quot;gl_&quot;) == 0)
+        {
</ins><span class="cx">             error(line, reservedErrMsg, &quot;gl_&quot;);
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><del>-        if (IsWebGLBasedSpec(shaderSpec)) {
-            if (identifier.compare(0, 6, &quot;webgl_&quot;) == 0) {
</del><ins>+        if (IsWebGLBasedSpec(mShaderSpec))
+        {
+            if (identifier.compare(0, 6, &quot;webgl_&quot;) == 0)
+            {
</ins><span class="cx">                 error(line, reservedErrMsg, &quot;webgl_&quot;);
</span><span class="cx">                 return true;
</span><span class="cx">             }
</span><del>-            if (identifier.compare(0, 7, &quot;_webgl_&quot;) == 0) {
</del><ins>+            if (identifier.compare(0, 7, &quot;_webgl_&quot;) == 0)
+            {
</ins><span class="cx">                 error(line, reservedErrMsg, &quot;_webgl_&quot;);
</span><span class="cx">                 return true;
</span><span class="cx">             }
</span><del>-            if (shaderSpec == SH_CSS_SHADERS_SPEC &amp;&amp; identifier.compare(0, 4, &quot;css_&quot;) == 0) {
</del><ins>+            if (mShaderSpec == SH_CSS_SHADERS_SPEC &amp;&amp; identifier.compare(0, 4, &quot;css_&quot;) == 0)
+            {
</ins><span class="cx">                 error(line, reservedErrMsg, &quot;css_&quot;);
</span><span class="cx">                 return true;
</span><span class="cx">             }
</span><span class="cx">         }
</span><del>-        if (identifier.find(&quot;__&quot;) != TString::npos) {
-            error(line, &quot;identifiers containing two consecutive underscores (__) are reserved as possible future keywords&quot;, identifier.c_str());
</del><ins>+        if (identifier.find(&quot;__&quot;) != TString::npos)
+        {
+            error(line,
+                  &quot;identifiers containing two consecutive underscores (__) are reserved as &quot;
+                  &quot;possible future keywords&quot;,
+                  identifier.c_str());
</ins><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -461,19 +493,30 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true if there was an error in construction.
</span><span class="cx"> //
</span><del>-bool TParseContext::constructorErrorCheck(const TSourceLoc&amp; line, TIntermNode* node, TFunction&amp; function, TOperator op, TType* type)
</del><ins>+bool TParseContext::constructorErrorCheck(const TSourceLoc &amp;line,
+                                          TIntermNode *argumentsNode,
+                                          TFunction &amp;function,
+                                          TOperator op,
+                                          TType *type)
</ins><span class="cx"> {
</span><span class="cx">     *type = function.getReturnType();
</span><span class="cx"> 
</span><span class="cx">     bool constructingMatrix = false;
</span><del>-    switch(op) {
-    case EOpConstructMat2:
-    case EOpConstructMat3:
-    case EOpConstructMat4:
-        constructingMatrix = true;
-        break;
-    default: 
-        break;
</del><ins>+    switch (op)
+    {
+        case EOpConstructMat2:
+        case EOpConstructMat2x3:
+        case EOpConstructMat2x4:
+        case EOpConstructMat3x2:
+        case EOpConstructMat3:
+        case EOpConstructMat3x4:
+        case EOpConstructMat4x2:
+        case EOpConstructMat4x3:
+        case EOpConstructMat4:
+            constructingMatrix = true;
+            break;
+        default:
+            break;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     //
</span><span class="lines">@@ -482,16 +525,17 @@
</span><span class="cx">     // again, there is an extra argument, so 'overfull' will become true.
</span><span class="cx">     //
</span><span class="cx"> 
</span><del>-    size_t size = 0;
-    bool constType = true;
-    bool full = false;
-    bool overFull = false;
</del><ins>+    size_t size         = 0;
+    bool constType      = true;
+    bool full           = false;
+    bool overFull       = false;
</ins><span class="cx">     bool matrixInMatrix = false;
</span><span class="cx">     bool arrayArg = false;
</span><del>-    for (size_t i = 0; i &lt; function.getParamCount(); ++i) {
-        const TParameter&amp; param = function.getParam(i);
</del><ins>+    for (size_t i = 0; i &lt; function.getParamCount(); ++i)
+    {
+        const TConstParameter &amp;param = function.getParam(i);
</ins><span class="cx">         size += param.type-&gt;getObjectSize();
</span><del>-        
</del><ins>+
</ins><span class="cx">         if (constructingMatrix &amp;&amp; param.type-&gt;isMatrix())
</span><span class="cx">             matrixInMatrix = true;
</span><span class="cx">         if (full)
</span><span class="lines">@@ -503,7 +547,7 @@
</span><span class="cx">         if (param.type-&gt;isArray())
</span><span class="cx">             arrayArg = true;
</span><span class="cx">     }
</span><del>-    
</del><ins>+
</ins><span class="cx">     if (constType)
</span><span class="cx">         type-&gt;setQualifier(EvqConst);
</span><span class="cx"> 
</span><span class="lines">@@ -520,58 +564,81 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (arrayArg &amp;&amp; op != EOpConstructStruct) {
</del><ins>+    if (arrayArg &amp;&amp; op != EOpConstructStruct)
+    {
</ins><span class="cx">         error(line, &quot;constructing from a non-dereferenced array&quot;, &quot;constructor&quot;);
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (matrixInMatrix &amp;&amp; !type-&gt;isArray()) {
-        if (function.getParamCount() != 1) {
-          error(line, &quot;constructing matrix from matrix can only take one argument&quot;, &quot;constructor&quot;);
-          return true;
</del><ins>+    if (matrixInMatrix &amp;&amp; !type-&gt;isArray())
+    {
+        if (function.getParamCount() != 1)
+        {
+            error(line, &quot;constructing matrix from matrix can only take one argument&quot;,
+                  &quot;constructor&quot;);
+            return true;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (overFull) {
</del><ins>+    if (overFull)
+    {
</ins><span class="cx">         error(line, &quot;too many arguments&quot;, &quot;constructor&quot;);
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><del>-    
-    if (op == EOpConstructStruct &amp;&amp; !type-&gt;isArray() &amp;&amp; type-&gt;getStruct()-&gt;fields().size() != function.getParamCount()) {
-        error(line, &quot;Number of constructor parameters does not match the number of structure fields&quot;, &quot;constructor&quot;);
</del><ins>+
+    if (op == EOpConstructStruct &amp;&amp; !type-&gt;isArray() &amp;&amp;
+        type-&gt;getStruct()-&gt;fields().size() != function.getParamCount())
+    {
+        error(line,
+              &quot;Number of constructor parameters does not match the number of structure fields&quot;,
+              &quot;constructor&quot;);
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!type-&gt;isMatrix() || !matrixInMatrix) {
</del><ins>+    if (!type-&gt;isMatrix() || !matrixInMatrix)
+    {
</ins><span class="cx">         if ((op != EOpConstructStruct &amp;&amp; size != 1 &amp;&amp; size &lt; type-&gt;getObjectSize()) ||
</span><del>-            (op == EOpConstructStruct &amp;&amp; size &lt; type-&gt;getObjectSize())) {
</del><ins>+            (op == EOpConstructStruct &amp;&amp; size &lt; type-&gt;getObjectSize()))
+        {
</ins><span class="cx">             error(line, &quot;not enough data provided for construction&quot;, &quot;constructor&quot;);
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TIntermTyped *typed = node ? node-&gt;getAsTyped() : 0;
-    if (typed == 0) {
-        error(line, &quot;constructor argument does not have a type&quot;, &quot;constructor&quot;);
</del><ins>+    if (argumentsNode == nullptr)
+    {
+        error(line, &quot;constructor does not have any arguments&quot;, &quot;constructor&quot;);
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><del>-    if (op != EOpConstructStruct &amp;&amp; IsSampler(typed-&gt;getBasicType())) {
-        error(line, &quot;cannot convert a sampler&quot;, &quot;constructor&quot;);
-        return true;
</del><ins>+
+    TIntermAggregate *argumentsAgg = argumentsNode-&gt;getAsAggregate();
+    for (TIntermNode *&amp;argNode : *argumentsAgg-&gt;getSequence())
+    {
+        TIntermTyped *argTyped = argNode-&gt;getAsTyped();
+        ASSERT(argTyped != nullptr);
+        if (op != EOpConstructStruct &amp;&amp; IsSampler(argTyped-&gt;getBasicType()))
+        {
+            error(line, &quot;cannot convert a sampler&quot;, &quot;constructor&quot;);
+            return true;
+        }
+        if (argTyped-&gt;getBasicType() == EbtVoid)
+        {
+            error(line, &quot;cannot convert a void&quot;, &quot;constructor&quot;);
+            return true;
+        }
</ins><span class="cx">     }
</span><del>-    if (typed-&gt;getBasicType() == EbtVoid) {
-        error(line, &quot;cannot convert a void&quot;, &quot;constructor&quot;);
-        return true;
-    }
</del><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// This function checks to see if a void variable has been declared and raise an error message for such a case
</del><ins>+// This function checks to see if a void variable has been declared and raise an error message for
+// such a case
</ins><span class="cx"> //
</span><span class="cx"> // returns true in case of an error
</span><span class="cx"> //
</span><del>-bool TParseContext::voidErrorCheck(const TSourceLoc &amp;line, const TString &amp;identifier, const TBasicType &amp;type)
</del><ins>+bool TParseContext::voidErrorCheck(const TSourceLoc &amp;line,
+                                   const TString &amp;identifier,
+                                   const TBasicType &amp;type)
</ins><span class="cx"> {
</span><span class="cx">     if (type == EbtVoid)
</span><span class="cx">     {
</span><span class="lines">@@ -582,45 +649,55 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// This function checks to see if the node (for the expression) contains a scalar boolean expression or not
</del><ins>+// This function checks to see if the node (for the expression) contains a scalar boolean expression
+// or not
</ins><span class="cx"> //
</span><span class="cx"> // returns true in case of an error
</span><span class="cx"> //
</span><del>-bool TParseContext::boolErrorCheck(const TSourceLoc&amp; line, const TIntermTyped* type)
</del><ins>+bool TParseContext::boolErrorCheck(const TSourceLoc &amp;line, const TIntermTyped *type)
</ins><span class="cx"> {
</span><del>-    if (type-&gt;getBasicType() != EbtBool || type-&gt;isArray() || type-&gt;isMatrix() || type-&gt;isVector()) {
</del><ins>+    if (type-&gt;getBasicType() != EbtBool || type-&gt;isArray() || type-&gt;isMatrix() || type-&gt;isVector())
+    {
</ins><span class="cx">         error(line, &quot;boolean expression expected&quot;, &quot;&quot;);
</span><span class="cx">         return true;
</span><del>-    } 
</del><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// This function checks to see if the node (for the expression) contains a scalar boolean expression or not
</del><ins>+// This function checks to see if the node (for the expression) contains a scalar boolean expression
+// or not
</ins><span class="cx"> //
</span><span class="cx"> // returns true in case of an error
</span><span class="cx"> //
</span><del>-bool TParseContext::boolErrorCheck(const TSourceLoc&amp; line, const TPublicType&amp; pType)
</del><ins>+bool TParseContext::boolErrorCheck(const TSourceLoc &amp;line, const TPublicType &amp;pType)
</ins><span class="cx"> {
</span><del>-    if (pType.type != EbtBool || pType.isAggregate()) {
</del><ins>+    if (pType.type != EbtBool || pType.isAggregate())
+    {
</ins><span class="cx">         error(line, &quot;boolean expression expected&quot;, &quot;&quot;);
</span><span class="cx">         return true;
</span><del>-    } 
</del><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::samplerErrorCheck(const TSourceLoc&amp; line, const TPublicType&amp; pType, const char* reason)
</del><ins>+bool TParseContext::samplerErrorCheck(const TSourceLoc &amp;line,
+                                      const TPublicType &amp;pType,
+                                      const char *reason)
</ins><span class="cx"> {
</span><del>-    if (pType.type == EbtStruct) {
-        if (containsSampler(*pType.userDef)) {
</del><ins>+    if (pType.type == EbtStruct)
+    {
+        if (containsSampler(*pType.userDef))
+        {
</ins><span class="cx">             error(line, reason, getBasicString(pType.type), &quot;(structure contains a sampler)&quot;);
</span><del>-        
</del><ins>+
</ins><span class="cx">             return true;
</span><span class="cx">         }
</span><del>-        
</del><ins>+
</ins><span class="cx">         return false;
</span><del>-    } else if (IsSampler(pType.type)) {
</del><ins>+    }
+    else if (IsSampler(pType.type))
+    {
</ins><span class="cx">         error(line, reason, getBasicString(pType.type));
</span><span class="cx"> 
</span><span class="cx">         return true;
</span><span class="lines">@@ -629,21 +706,25 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::locationDeclaratorListCheck(const TSourceLoc&amp; line, const TPublicType &amp;pType)
</del><ins>+bool TParseContext::locationDeclaratorListCheck(const TSourceLoc &amp;line, const TPublicType &amp;pType)
</ins><span class="cx"> {
</span><span class="cx">     if (pType.layoutQualifier.location != -1)
</span><span class="cx">     {
</span><del>-        error(line, &quot;location must only be specified for a single input or output variable&quot;, &quot;location&quot;);
</del><ins>+        error(line, &quot;location must only be specified for a single input or output variable&quot;,
+              &quot;location&quot;);
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::parameterSamplerErrorCheck(const TSourceLoc&amp; line, TQualifier qualifier, const TType&amp; type)
</del><ins>+bool TParseContext::parameterSamplerErrorCheck(const TSourceLoc &amp;line,
+                                               TQualifier qualifier,
+                                               const TType &amp;type)
</ins><span class="cx"> {
</span><del>-    if ((qualifier == EvqOut || qualifier == EvqInOut) &amp;&amp; 
-             type.getBasicType() != EbtStruct &amp;&amp; IsSampler(type.getBasicType())) {
</del><ins>+    if ((qualifier == EvqOut || qualifier == EvqInOut) &amp;&amp; type.getBasicType() != EbtStruct &amp;&amp;
+        IsSampler(type.getBasicType()))
+    {
</ins><span class="cx">         error(line, &quot;samplers cannot be output parameters&quot;, type.getBasicString());
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="lines">@@ -651,14 +732,16 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::containsSampler(TType&amp; type)
</del><ins>+bool TParseContext::containsSampler(const TType &amp;type)
</ins><span class="cx"> {
</span><span class="cx">     if (IsSampler(type.getBasicType()))
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><del>-    if (type.getBasicType() == EbtStruct || type.isInterfaceBlock()) {
-        const TFieldList&amp; fields = type.getStruct()-&gt;fields();
-        for (unsigned int i = 0; i &lt; fields.size(); ++i) {
</del><ins>+    if (type.getBasicType() == EbtStruct || type.isInterfaceBlock())
+    {
+        const TFieldList &amp;fields = type.getStruct()-&gt;fields();
+        for (unsigned int i = 0; i &lt; fields.size(); ++i)
+        {
</ins><span class="cx">             if (containsSampler(*fields[i]-&gt;type()))
</span><span class="cx">                 return true;
</span><span class="cx">         }
</span><span class="lines">@@ -672,11 +755,14 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true if there was an error.
</span><span class="cx"> //
</span><del>-bool TParseContext::arraySizeErrorCheck(const TSourceLoc&amp; line, TIntermTyped* expr, int&amp; size)
</del><ins>+bool TParseContext::arraySizeErrorCheck(const TSourceLoc &amp;line, TIntermTyped *expr, int &amp;size)
</ins><span class="cx"> {
</span><del>-    TIntermConstantUnion* constant = expr-&gt;getAsConstantUnion();
</del><ins>+    TIntermConstantUnion *constant = expr-&gt;getAsConstantUnion();
</ins><span class="cx"> 
</span><del>-    if (constant == nullptr || !constant-&gt;isScalarInt())
</del><ins>+    // TODO(oetuaho@nvidia.com): Get rid of the constant == nullptr check here once all constant
+    // expressions can be folded. Right now we don't allow constant expressions that ANGLE can't
+    // fold as array size.
+    if (expr-&gt;getQualifier() != EvqConst || constant == nullptr || !constant-&gt;isScalarInt())
</ins><span class="cx">     {
</span><span class="cx">         error(line, &quot;array size must be a constant integer expression&quot;, &quot;&quot;);
</span><span class="cx">         size = 1;
</span><span class="lines">@@ -688,7 +774,7 @@
</span><span class="cx">     if (constant-&gt;getBasicType() == EbtUInt)
</span><span class="cx">     {
</span><span class="cx">         unsignedSize = constant-&gt;getUConst(0);
</span><del>-        size = static_cast&lt;int&gt;(unsignedSize);
</del><ins>+        size         = static_cast&lt;int&gt;(unsignedSize);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -734,9 +820,10 @@
</span><span class="cx"> bool TParseContext::arrayQualifierErrorCheck(const TSourceLoc &amp;line, const TPublicType &amp;type)
</span><span class="cx"> {
</span><span class="cx">     if ((type.qualifier == EvqAttribute) || (type.qualifier == EvqVertexIn) ||
</span><del>-        (type.qualifier == EvqConst &amp;&amp; shaderVersion &lt; 300))
</del><ins>+        (type.qualifier == EvqConst &amp;&amp; mShaderVersion &lt; 300))
</ins><span class="cx">     {
</span><del>-        error(line, &quot;cannot declare arrays of this qualifier&quot;, TType(type).getCompleteString().c_str());
</del><ins>+        error(line, &quot;cannot declare arrays of this qualifier&quot;,
+              TType(type).getCompleteString().c_str());
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -748,15 +835,25 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true if there is an error.
</span><span class="cx"> //
</span><del>-bool TParseContext::arrayTypeErrorCheck(const TSourceLoc&amp; line, TPublicType type)
</del><ins>+bool TParseContext::arrayTypeErrorCheck(const TSourceLoc &amp;line, const TPublicType &amp;type)
</ins><span class="cx"> {
</span><span class="cx">     //
</span><span class="cx">     // Can the type be an array?
</span><span class="cx">     //
</span><del>-    if (type.array) {
</del><ins>+    if (type.array)
+    {
</ins><span class="cx">         error(line, &quot;cannot declare arrays of arrays&quot;, TType(type).getCompleteString().c_str());
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><ins>+    // In ESSL1.00 shaders, structs cannot be varying (section 4.3.5). This is checked elsewhere.
+    // In ESSL3.00 shaders, struct inputs/outputs are allowed but not arrays of structs (section
+    // 4.3.4).
+    if (mShaderVersion &gt;= 300 &amp;&amp; type.type == EbtStruct &amp;&amp; sh::IsVarying(type.qualifier))
+    {
+        error(line, &quot;cannot declare arrays of structs of this qualifier&quot;,
+              TType(type).getCompleteString().c_str());
+        return true;
+    }
</ins><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="lines">@@ -766,7 +863,9 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true if there was an error.
</span><span class="cx"> //
</span><del>-bool TParseContext::nonInitErrorCheck(const TSourceLoc &amp;line, const TString &amp;identifier, TPublicType *type)
</del><ins>+bool TParseContext::nonInitErrorCheck(const TSourceLoc &amp;line,
+                                      const TString &amp;identifier,
+                                      TPublicType *type)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(type != nullptr);
</span><span class="cx">     if (type-&gt;qualifier == EvqConst)
</span><span class="lines">@@ -776,9 +875,12 @@
</span><span class="cx"> 
</span><span class="cx">         // Generate informative error messages for ESSL1.
</span><span class="cx">         // In ESSL3 arrays and structures containing arrays can be constant.
</span><del>-        if (shaderVersion &lt; 300 &amp;&amp; type-&gt;isStructureContainingArrays())
</del><ins>+        if (mShaderVersion &lt; 300 &amp;&amp; type-&gt;isStructureContainingArrays())
</ins><span class="cx">         {
</span><del>-            error(line, &quot;structures containing arrays may not be declared constant since they cannot be initialized&quot;, identifier.c_str());
</del><ins>+            error(line,
+                  &quot;structures containing arrays may not be declared constant since they cannot be &quot;
+                  &quot;initialized&quot;,
+                  identifier.c_str());
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="lines">@@ -800,7 +902,9 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true if declaring the variable succeeded.
</span><span class="cx"> //
</span><del>-bool TParseContext::declareVariable(const TSourceLoc &amp;line, const TString &amp;identifier, const TType &amp;type,
</del><ins>+bool TParseContext::declareVariable(const TSourceLoc &amp;line,
+                                    const TString &amp;identifier,
+                                    const TType &amp;type,
</ins><span class="cx">                                     TVariable **variable)
</span><span class="cx"> {
</span><span class="cx">     ASSERT((*variable) == nullptr);
</span><span class="lines">@@ -810,18 +914,19 @@
</span><span class="cx">     // gl_LastFragData may be redeclared with a new precision qualifier
</span><span class="cx">     if (type.isArray() &amp;&amp; identifier.compare(0, 15, &quot;gl_LastFragData&quot;) == 0)
</span><span class="cx">     {
</span><del>-        const TVariable *maxDrawBuffers =
-            static_cast&lt;const TVariable *&gt;(symbolTable.findBuiltIn(&quot;gl_MaxDrawBuffers&quot;, shaderVersion));
</del><ins>+        const TVariable *maxDrawBuffers = static_cast&lt;const TVariable *&gt;(
+            symbolTable.findBuiltIn(&quot;gl_MaxDrawBuffers&quot;, mShaderVersion));
</ins><span class="cx">         if (type.getArraySize() == maxDrawBuffers-&gt;getConstPointer()-&gt;getIConst())
</span><span class="cx">         {
</span><del>-            if (TSymbol *builtInSymbol = symbolTable.findBuiltIn(identifier, shaderVersion))
</del><ins>+            if (TSymbol *builtInSymbol = symbolTable.findBuiltIn(identifier, mShaderVersion))
</ins><span class="cx">             {
</span><span class="cx">                 needsReservedErrorCheck = extensionErrorCheck(line, builtInSymbol-&gt;getExtension());
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            error(line, &quot;redeclaration of gl_LastFragData with size != gl_MaxDrawBuffers&quot;, identifier.c_str());
</del><ins>+            error(line, &quot;redeclaration of gl_LastFragData with size != gl_MaxDrawBuffers&quot;,
+                  identifier.c_str());
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -833,8 +938,7 @@
</span><span class="cx">     if (!symbolTable.declare(*variable))
</span><span class="cx">     {
</span><span class="cx">         error(line, &quot;redefinition&quot;, identifier.c_str());
</span><del>-        delete (*variable);
-        (*variable) = nullptr;
</del><ins>+        *variable = nullptr;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -844,14 +948,20 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::paramErrorCheck(const TSourceLoc&amp; line, TQualifier qualifier, TQualifier paramQualifier, TType* type)
-{    
-    if (qualifier != EvqConst &amp;&amp; qualifier != EvqTemporary) {
</del><ins>+bool TParseContext::paramErrorCheck(const TSourceLoc &amp;line,
+                                    TQualifier qualifier,
+                                    TQualifier paramQualifier,
+                                    TType *type)
+{
+    if (qualifier != EvqConst &amp;&amp; qualifier != EvqTemporary)
+    {
</ins><span class="cx">         error(line, &quot;qualifier not allowed on function parameter&quot;, getQualifierString(qualifier));
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><del>-    if (qualifier == EvqConst &amp;&amp; paramQualifier != EvqIn) {
-        error(line, &quot;qualifier not allowed with &quot;, getQualifierString(qualifier), getQualifierString(paramQualifier));
</del><ins>+    if (qualifier == EvqConst &amp;&amp; paramQualifier != EvqIn)
+    {
+        error(line, &quot;qualifier not allowed with &quot;, getQualifierString(qualifier),
+              getQualifierString(paramQualifier));
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -863,20 +973,23 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::extensionErrorCheck(const TSourceLoc&amp; line, const TString&amp; extension)
</del><ins>+bool TParseContext::extensionErrorCheck(const TSourceLoc &amp;line, const TString &amp;extension)
</ins><span class="cx"> {
</span><del>-    const TExtensionBehavior&amp; extBehavior = extensionBehavior();
</del><ins>+    const TExtensionBehavior &amp;extBehavior   = extensionBehavior();
</ins><span class="cx">     TExtensionBehavior::const_iterator iter = extBehavior.find(extension.c_str());
</span><del>-    if (iter == extBehavior.end()) {
</del><ins>+    if (iter == extBehavior.end())
+    {
</ins><span class="cx">         error(line, &quot;extension&quot;, extension.c_str(), &quot;is not supported&quot;);
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx">     // In GLSL ES, an extension's default behavior is &quot;disable&quot;.
</span><del>-    if (iter-&gt;second == EBhDisable || iter-&gt;second == EBhUndefined) {
</del><ins>+    if (iter-&gt;second == EBhDisable || iter-&gt;second == EBhUndefined)
+    {
</ins><span class="cx">         error(line, &quot;extension&quot;, extension.c_str(), &quot;is disabled&quot;);
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><del>-    if (iter-&gt;second == EBhWarn) {
</del><ins>+    if (iter-&gt;second == EBhWarn)
+    {
</ins><span class="cx">         warning(line, &quot;extension&quot;, extension.c_str(), &quot;is being used&quot;);
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -884,30 +997,32 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// These checks are common for all declarations starting a declarator list, and declarators that follow an empty
-// declaration.
</del><ins>+// These checks are common for all declarations starting a declarator list, and declarators that
+// follow an empty declaration.
</ins><span class="cx"> //
</span><del>-bool TParseContext::singleDeclarationErrorCheck(TPublicType &amp;publicType, const TSourceLoc &amp;identifierLocation)
</del><ins>+bool TParseContext::singleDeclarationErrorCheck(const TPublicType &amp;publicType,
+                                                const TSourceLoc &amp;identifierLocation)
</ins><span class="cx"> {
</span><span class="cx">     switch (publicType.qualifier)
</span><span class="cx">     {
</span><del>-      case EvqVaryingIn:
-      case EvqVaryingOut:
-      case EvqAttribute:
-      case EvqVertexIn:
-      case EvqFragmentOut:
-        if (publicType.type == EbtStruct)
-        {
-            error(identifierLocation, &quot;cannot be used with a structure&quot;,
-                  getQualifierString(publicType.qualifier));
-            return true;
-        }
</del><ins>+        case EvqVaryingIn:
+        case EvqVaryingOut:
+        case EvqAttribute:
+        case EvqVertexIn:
+        case EvqFragmentOut:
+            if (publicType.type == EbtStruct)
+            {
+                error(identifierLocation, &quot;cannot be used with a structure&quot;,
+                      getQualifierString(publicType.qualifier));
+                return true;
+            }
</ins><span class="cx"> 
</span><del>-      default: break;
</del><ins>+        default:
+            break;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (publicType.qualifier != EvqUniform &amp;&amp; samplerErrorCheck(identifierLocation, publicType,
-                                                                &quot;samplers must be uniform&quot;))
</del><ins>+    if (publicType.qualifier != EvqUniform &amp;&amp;
+        samplerErrorCheck(identifierLocation, publicType, &quot;samplers must be uniform&quot;))
</ins><span class="cx">     {
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="lines">@@ -917,14 +1032,16 @@
</span><span class="cx"> 
</span><span class="cx">     if (layoutQualifier.matrixPacking != EmpUnspecified)
</span><span class="cx">     {
</span><del>-        error(identifierLocation, &quot;layout qualifier&quot;, getMatrixPackingString(layoutQualifier.matrixPacking),
</del><ins>+        error(identifierLocation, &quot;layout qualifier&quot;,
+              getMatrixPackingString(layoutQualifier.matrixPacking),
</ins><span class="cx">               &quot;only valid for interface blocks&quot;);
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (layoutQualifier.blockStorage != EbsUnspecified)
</span><span class="cx">     {
</span><del>-        error(identifierLocation, &quot;layout qualifier&quot;, getBlockStorageString(layoutQualifier.blockStorage),
</del><ins>+        error(identifierLocation, &quot;layout qualifier&quot;,
+              getBlockStorageString(layoutQualifier.blockStorage),
</ins><span class="cx">               &quot;only valid for interface blocks&quot;);
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="lines">@@ -938,18 +1055,21 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::layoutLocationErrorCheck(const TSourceLoc&amp; location, const TLayoutQualifier &amp;layoutQualifier)
</del><ins>+bool TParseContext::layoutLocationErrorCheck(const TSourceLoc &amp;location,
+                                             const TLayoutQualifier &amp;layoutQualifier)
</ins><span class="cx"> {
</span><span class="cx">     if (layoutQualifier.location != -1)
</span><span class="cx">     {
</span><del>-        error(location, &quot;invalid layout qualifier:&quot;, &quot;location&quot;, &quot;only valid on program inputs and outputs&quot;);
</del><ins>+        error(location, &quot;invalid layout qualifier:&quot;, &quot;location&quot;,
+              &quot;only valid on program inputs and outputs&quot;);
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::functionCallLValueErrorCheck(const TFunction *fnCandidate, TIntermAggregate *aggregate)
</del><ins>+bool TParseContext::functionCallLValueErrorCheck(const TFunction *fnCandidate,
+                                                 TIntermAggregate *aggregate)
</ins><span class="cx"> {
</span><span class="cx">     for (size_t i = 0; i &lt; fnCandidate-&gt;getParamCount(); ++i)
</span><span class="cx">     {
</span><span class="lines">@@ -960,7 +1080,7 @@
</span><span class="cx">             if (lValueErrorCheck(node-&gt;getLine(), &quot;assign&quot;, node))
</span><span class="cx">             {
</span><span class="cx">                 error(node-&gt;getLine(),
</span><del>-                    &quot;Constant value cannot be passed for 'out' or 'inout' parameters.&quot;, &quot;Error&quot;);
</del><ins>+                      &quot;Constant value cannot be passed for 'out' or 'inout' parameters.&quot;, &quot;Error&quot;);
</ins><span class="cx">                 recover();
</span><span class="cx">                 return true;
</span><span class="cx">             }
</span><span class="lines">@@ -969,40 +1089,47 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::supportsExtension(const char* extension)
</del><ins>+void TParseContext::es3InvariantErrorCheck(const TQualifier qualifier,
+                                           const TSourceLoc &amp;invariantLocation)
</ins><span class="cx"> {
</span><del>-    const TExtensionBehavior&amp; extbehavior = extensionBehavior();
</del><ins>+    if (!sh::IsVaryingOut(qualifier) &amp;&amp; qualifier != EvqFragmentOut)
+    {
+        error(invariantLocation, &quot;Only out variables can be invariant.&quot;, &quot;invariant&quot;);
+        recover();
+    }
+}
+
+bool TParseContext::supportsExtension(const char *extension)
+{
+    const TExtensionBehavior &amp;extbehavior   = extensionBehavior();
</ins><span class="cx">     TExtensionBehavior::const_iterator iter = extbehavior.find(extension);
</span><span class="cx">     return (iter != extbehavior.end());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::isExtensionEnabled(const char* extension) const
</del><ins>+bool TParseContext::isExtensionEnabled(const char *extension) const
</ins><span class="cx"> {
</span><del>-    const TExtensionBehavior&amp; extbehavior = extensionBehavior();
-    TExtensionBehavior::const_iterator iter = extbehavior.find(extension);
-
-    if (iter == extbehavior.end())
-    {
-        return false;
-    }
-
-    return (iter-&gt;second == EBhEnable || iter-&gt;second == EBhRequire);
</del><ins>+    return ::IsExtensionEnabled(extensionBehavior(), extension);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TParseContext::handleExtensionDirective(const TSourceLoc&amp; loc, const char* extName, const char* behavior)
</del><ins>+void TParseContext::handleExtensionDirective(const TSourceLoc &amp;loc,
+                                             const char *extName,
+                                             const char *behavior)
</ins><span class="cx"> {
</span><span class="cx">     pp::SourceLocation srcLoc;
</span><span class="cx">     srcLoc.file = loc.first_file;
</span><span class="cx">     srcLoc.line = loc.first_line;
</span><del>-    directiveHandler.handleExtension(srcLoc, extName, behavior);
</del><ins>+    mDirectiveHandler.handleExtension(srcLoc, extName, behavior);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TParseContext::handlePragmaDirective(const TSourceLoc&amp; loc, const char* name, const char* value, bool stdgl)
</del><ins>+void TParseContext::handlePragmaDirective(const TSourceLoc &amp;loc,
+                                          const char *name,
+                                          const char *value,
+                                          bool stdgl)
</ins><span class="cx"> {
</span><span class="cx">     pp::SourceLocation srcLoc;
</span><span class="cx">     srcLoc.file = loc.first_file;
</span><span class="cx">     srcLoc.line = loc.first_line;
</span><del>-    directiveHandler.handlePragma(srcLoc, name, value, stdgl);
</del><ins>+    mDirectiveHandler.handlePragma(srcLoc, name, value, stdgl);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /////////////////////////////////////////////////////////////////////////////////
</span><span class="lines">@@ -1029,14 +1156,46 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        variable = static_cast&lt;const TVariable*&gt;(symbol);
</del><ins>+        variable = static_cast&lt;const TVariable *&gt;(symbol);
</ins><span class="cx"> 
</span><del>-        if (symbolTable.findBuiltIn(variable-&gt;getName(), shaderVersion) &amp;&amp;
</del><ins>+        if (symbolTable.findBuiltIn(variable-&gt;getName(), mShaderVersion) &amp;&amp;
</ins><span class="cx">             !variable-&gt;getExtension().empty() &amp;&amp;
</span><span class="cx">             extensionErrorCheck(location, variable-&gt;getExtension()))
</span><span class="cx">         {
</span><span class="cx">             recover();
</span><span class="cx">         }
</span><ins>+
+        // Reject shaders using both gl_FragData and gl_FragColor
+        TQualifier qualifier = variable-&gt;getType().getQualifier();
+        if (qualifier == EvqFragData || qualifier == EvqSecondaryFragDataEXT)
+        {
+            mUsesFragData = true;
+        }
+        else if (qualifier == EvqFragColor || qualifier == EvqSecondaryFragColorEXT)
+        {
+            mUsesFragColor = true;
+        }
+        if (qualifier == EvqSecondaryFragDataEXT || qualifier == EvqSecondaryFragColorEXT)
+        {
+            mUsesSecondaryOutputs = true;
+        }
+
+        // This validation is not quite correct - it's only an error to write to
+        // both FragData and FragColor. For simplicity, and because users shouldn't
+        // be rewarded for reading from undefined varaibles, return an error
+        // if they are both referenced, rather than assigned.
+        if (mUsesFragData &amp;&amp; mUsesFragColor)
+        {
+            const char *errorMessage = &quot;cannot use both gl_FragData and gl_FragColor&quot;;
+            if (mUsesSecondaryOutputs)
+            {
+                errorMessage =
+                    &quot;cannot use both output variable sets (gl_FragData, gl_SecondaryFragDataEXT)&quot;
+                    &quot; and (gl_FragColor, gl_SecondaryFragColorEXT)&quot;;
+            }
+            error(location, errorMessage, name-&gt;c_str());
+            recover();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (!variable)
</span><span class="lines">@@ -1050,32 +1209,56 @@
</span><span class="cx">     return variable;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TIntermTyped *TParseContext::parseVariableIdentifier(const TSourceLoc &amp;location,
+                                                     const TString *name,
+                                                     const TSymbol *symbol)
+{
+    const TVariable *variable = getNamedVariable(location, name, symbol);
+
+    if (variable-&gt;getConstPointer())
+    {
+        const TConstantUnion *constArray = variable-&gt;getConstPointer();
+        return intermediate.addConstantUnion(constArray, variable-&gt;getType(), location);
+    }
+    else
+    {
+        return intermediate.addSymbol(variable-&gt;getUniqueId(), variable-&gt;getName(),
+                                      variable-&gt;getType(), location);
+    }
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // Look up a function name in the symbol table, and make sure it is a function.
</span><span class="cx"> //
</span><span class="cx"> // Return the function symbol if found, otherwise 0.
</span><span class="cx"> //
</span><del>-const TFunction* TParseContext::findFunction(const TSourceLoc&amp; line, TFunction* call, int inputShaderVersion, bool *builtIn)
</del><ins>+const TFunction *TParseContext::findFunction(const TSourceLoc &amp;line,
+                                             TFunction *call,
+                                             int inputShaderVersion,
+                                             bool *builtIn)
</ins><span class="cx"> {
</span><span class="cx">     // First find by unmangled name to check whether the function name has been
</span><span class="cx">     // hidden by a variable name or struct typename.
</span><span class="cx">     // If a function is found, check for one with a matching argument list.
</span><del>-    const TSymbol* symbol = symbolTable.find(call-&gt;getName(), inputShaderVersion, builtIn);
-    if (symbol == 0 || symbol-&gt;isFunction()) {
</del><ins>+    const TSymbol *symbol = symbolTable.find(call-&gt;getName(), inputShaderVersion, builtIn);
+    if (symbol == 0 || symbol-&gt;isFunction())
+    {
</ins><span class="cx">         symbol = symbolTable.find(call-&gt;getMangledName(), inputShaderVersion, builtIn);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (symbol == 0) {
</del><ins>+    if (symbol == 0)
+    {
</ins><span class="cx">         error(line, &quot;no matching overloaded function found&quot;, call-&gt;getName().c_str());
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!symbol-&gt;isFunction()) {
</del><ins>+    if (!symbol-&gt;isFunction())
+    {
</ins><span class="cx">         error(line, &quot;function name expected&quot;, call-&gt;getName().c_str());
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return static_cast&lt;const TFunction*&gt;(symbol);
</del><ins>+    return static_cast&lt;const TFunction *&gt;(symbol);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -1084,8 +1267,11 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns true on error, false if no error
</span><span class="cx"> //
</span><del>-bool TParseContext::executeInitializer(const TSourceLoc &amp;line, const TString &amp;identifier, TPublicType &amp;pType,
-                                       TIntermTyped *initializer, TIntermNode **intermNode)
</del><ins>+bool TParseContext::executeInitializer(const TSourceLoc &amp;line,
+                                       const TString &amp;identifier,
+                                       const TPublicType &amp;pType,
+                                       TIntermTyped *initializer,
+                                       TIntermNode **intermNode)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(intermNode != nullptr);
</span><span class="cx">     TType type = TType(pType);
</span><span class="lines">@@ -1100,20 +1286,42 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool globalInitWarning = false;
+    if (symbolTable.atGlobalLevel() &amp;&amp;
+        !ValidateGlobalInitializer(initializer, this, &amp;globalInitWarning))
+    {
+        // Error message does not completely match behavior with ESSL 1.00, but
+        // we want to steer developers towards only using constant expressions.
+        error(line, &quot;global variable initializers must be constant expressions&quot;, &quot;=&quot;);
+        return true;
+    }
+    if (globalInitWarning)
+    {
+        warning(
+            line,
+            &quot;global variable initializers should be constant expressions &quot;
+            &quot;(uniforms and globals are allowed in global initializers for legacy compatibility)&quot;,
+            &quot;=&quot;);
+    }
+
</ins><span class="cx">     //
</span><span class="cx">     // identifier must be of type constant, a global, or a temporary
</span><span class="cx">     //
</span><span class="cx">     TQualifier qualifier = variable-&gt;getType().getQualifier();
</span><del>-    if ((qualifier != EvqTemporary) &amp;&amp; (qualifier != EvqGlobal) &amp;&amp; (qualifier != EvqConst)) {
-        error(line, &quot; cannot initialize this type of qualifier &quot;, variable-&gt;getType().getQualifierString());
</del><ins>+    if ((qualifier != EvqTemporary) &amp;&amp; (qualifier != EvqGlobal) &amp;&amp; (qualifier != EvqConst))
+    {
+        error(line, &quot; cannot initialize this type of qualifier &quot;,
+              variable-&gt;getType().getQualifierString());
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx">     //
</span><span class="cx">     // test for and propagate constant
</span><span class="cx">     //
</span><span class="cx"> 
</span><del>-    if (qualifier == EvqConst) {
-        if (qualifier != initializer-&gt;getType().getQualifier()) {
</del><ins>+    if (qualifier == EvqConst)
+    {
+        if (qualifier != initializer-&gt;getType().getQualifier())
+        {
</ins><span class="cx">             std::stringstream extraInfoStream;
</span><span class="cx">             extraInfoStream &lt;&lt; &quot;'&quot; &lt;&lt; variable-&gt;getType().getCompleteString() &lt;&lt; &quot;'&quot;;
</span><span class="cx">             std::string extraInfo = extraInfoStream.str();
</span><span class="lines">@@ -1121,84 +1329,74 @@
</span><span class="cx">             variable-&gt;getType().setQualifier(EvqTemporary);
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><del>-        if (type != initializer-&gt;getType()) {
-            error(line, &quot; non-matching types for const initializer &quot;, 
-                variable-&gt;getType().getQualifierString());
</del><ins>+        if (type != initializer-&gt;getType())
+        {
+            error(line, &quot; non-matching types for const initializer &quot;,
+                  variable-&gt;getType().getQualifierString());
</ins><span class="cx">             variable-&gt;getType().setQualifier(EvqTemporary);
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><del>-        if (initializer-&gt;getAsConstantUnion()) { 
</del><ins>+
+        // Save the constant folded value to the variable if possible. For example array
+        // initializers are not folded, since that way copying the array literal to multiple places
+        // in the shader is avoided.
+        // TODO(oetuaho@nvidia.com): Consider constant folding array initialization in cases where
+        // it would be beneficial.
+        if (initializer-&gt;getAsConstantUnion())
+        {
</ins><span class="cx">             variable-&gt;shareConstPointer(initializer-&gt;getAsConstantUnion()-&gt;getUnionArrayPointer());
</span><del>-        } else if (initializer-&gt;getAsSymbolNode()) {
-            const TSymbol* symbol = symbolTable.find(initializer-&gt;getAsSymbolNode()-&gt;getSymbol(), 0);
-            const TVariable* tVar = static_cast&lt;const TVariable*&gt;(symbol);
</del><ins>+            *intermNode = nullptr;
+            return false;
+        }
+        else if (initializer-&gt;getAsSymbolNode())
+        {
+            const TSymbol *symbol =
+                symbolTable.find(initializer-&gt;getAsSymbolNode()-&gt;getSymbol(), 0);
+            const TVariable *tVar = static_cast&lt;const TVariable *&gt;(symbol);
</ins><span class="cx"> 
</span><del>-            TConstantUnion* constArray = tVar-&gt;getConstPointer();
-            variable-&gt;shareConstPointer(constArray);
-        } else {
-            std::stringstream extraInfoStream;
-            extraInfoStream &lt;&lt; &quot;'&quot; &lt;&lt; variable-&gt;getType().getCompleteString() &lt;&lt; &quot;'&quot;;
-            std::string extraInfo = extraInfoStream.str();
-            error(line, &quot; cannot assign to&quot;, &quot;=&quot;, extraInfo.c_str());
-            variable-&gt;getType().setQualifier(EvqTemporary);
-            return true;
</del><ins>+            const TConstantUnion *constArray = tVar-&gt;getConstPointer();
+            if (constArray)
+            {
+                variable-&gt;shareConstPointer(constArray);
+                *intermNode = nullptr;
+                return false;
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (qualifier != EvqConst)
</del><ins>+    TIntermSymbol *intermSymbol = intermediate.addSymbol(
+        variable-&gt;getUniqueId(), variable-&gt;getName(), variable-&gt;getType(), line);
+    *intermNode = createAssign(EOpInitialize, intermSymbol, initializer, line);
+    if (*intermNode == nullptr)
</ins><span class="cx">     {
</span><del>-        TIntermSymbol *intermSymbol = intermediate.addSymbol(variable-&gt;getUniqueId(), variable-&gt;getName(),
-                                                             variable-&gt;getType(), line);
-        *intermNode = createAssign(EOpInitialize, intermSymbol, initializer, line);
-        if (*intermNode == nullptr)
-        {
-            assignError(line, &quot;=&quot;, intermSymbol-&gt;getCompleteString(), initializer-&gt;getCompleteString());
-            return true;
-        }
</del><ins>+        assignError(line, &quot;=&quot;, intermSymbol-&gt;getCompleteString(), initializer-&gt;getCompleteString());
+        return true;
</ins><span class="cx">     }
</span><del>-    else
-    {
-        *intermNode = nullptr;
-    }
</del><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::areAllChildConst(TIntermAggregate* aggrNode)
</del><ins>+TPublicType TParseContext::addFullySpecifiedType(TQualifier qualifier,
+                                                 bool invariant,
+                                                 TLayoutQualifier layoutQualifier,
+                                                 const TPublicType &amp;typeSpecifier)
</ins><span class="cx"> {
</span><del>-    ASSERT(aggrNode != NULL);
-    if (!aggrNode-&gt;isConstructor())
-        return false;
-
-    bool allConstant = true;
-
-    // check if all the child nodes are constants so that they can be inserted into 
-    // the parent node
-    TIntermSequence *sequence = aggrNode-&gt;getSequence() ;
-    for (TIntermSequence::iterator p = sequence-&gt;begin(); p != sequence-&gt;end(); ++p) {
-        if (!(*p)-&gt;getAsTyped()-&gt;getAsConstantUnion())
-            return false;
-    }
-
-    return allConstant;
-}
-
-TPublicType TParseContext::addFullySpecifiedType(TQualifier qualifier, TLayoutQualifier layoutQualifier, const TPublicType&amp; typeSpecifier)
-{
-    TPublicType returnType = typeSpecifier;
-    returnType.qualifier = qualifier;
</del><ins>+    TPublicType returnType     = typeSpecifier;
+    returnType.qualifier       = qualifier;
+    returnType.invariant       = invariant;
</ins><span class="cx">     returnType.layoutQualifier = layoutQualifier;
</span><span class="cx"> 
</span><del>-    if (typeSpecifier.array)
</del><ins>+    if (mShaderVersion &lt; 300)
</ins><span class="cx">     {
</span><del>-        error(typeSpecifier.line, &quot;not supported&quot;, &quot;first-class array&quot;);
-        recover();
-        returnType.clearArrayness();
-    }
</del><ins>+        if (typeSpecifier.array)
+        {
+            error(typeSpecifier.line, &quot;not supported&quot;, &quot;first-class array&quot;);
+            recover();
+            returnType.clearArrayness();
+        }
</ins><span class="cx"> 
</span><del>-    if (shaderVersion &lt; 300)
-    {
-        if (qualifier == EvqAttribute &amp;&amp; (typeSpecifier.type == EbtBool || typeSpecifier.type == EbtInt))
</del><ins>+        if (qualifier == EvqAttribute &amp;&amp;
+            (typeSpecifier.type == EbtBool || typeSpecifier.type == EbtInt))
</ins><span class="cx">         {
</span><span class="cx">             error(typeSpecifier.line, &quot;cannot be bool or int&quot;, getQualifierString(qualifier));
</span><span class="cx">             recover();
</span><span class="lines">@@ -1213,54 +1411,125 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        switch (qualifier)
</del><ins>+        if (!layoutQualifier.isEmpty())
</ins><span class="cx">         {
</span><del>-          case EvqSmoothIn:
-          case EvqSmoothOut:
-          case EvqVertexOut:
-          case EvqFragmentIn:
-          case EvqCentroidOut:
-          case EvqCentroidIn:
-            if (typeSpecifier.type == EbtBool)
</del><ins>+            if (globalErrorCheck(typeSpecifier.line, symbolTable.atGlobalLevel(), &quot;layout&quot;))
</ins><span class="cx">             {
</span><del>-                error(typeSpecifier.line, &quot;cannot be bool&quot;, getQualifierString(qualifier));
</del><span class="cx">                 recover();
</span><span class="cx">             }
</span><del>-            if (typeSpecifier.type == EbtInt || typeSpecifier.type == EbtUInt)
</del><ins>+        }
+        if (sh::IsVarying(qualifier) || qualifier == EvqVertexIn || qualifier == EvqFragmentOut)
+        {
+            es3InputOutputTypeCheck(qualifier, typeSpecifier, typeSpecifier.line);
+        }
+    }
+
+    return returnType;
+}
+
+void TParseContext::es3InputOutputTypeCheck(const TQualifier qualifier,
+                                            const TPublicType &amp;type,
+                                            const TSourceLoc &amp;qualifierLocation)
+{
+    // An input/output variable can never be bool or a sampler. Samplers are checked elsewhere.
+    if (type.type == EbtBool)
+    {
+        error(qualifierLocation, &quot;cannot be bool&quot;, getQualifierString(qualifier));
+        recover();
+    }
+
+    // Specific restrictions apply for vertex shader inputs and fragment shader outputs.
+    switch (qualifier)
+    {
+        case EvqVertexIn:
+            // ESSL 3.00 section 4.3.4
+            if (type.array)
</ins><span class="cx">             {
</span><del>-                error(typeSpecifier.line, &quot;must use 'flat' interpolation here&quot;, getQualifierString(qualifier));
</del><ins>+                error(qualifierLocation, &quot;cannot be array&quot;, getQualifierString(qualifier));
</ins><span class="cx">                 recover();
</span><span class="cx">             }
</span><del>-            break;
-
-          case EvqVertexIn:
-          case EvqFragmentOut:
-          case EvqFlatIn:
-          case EvqFlatOut:
-            if (typeSpecifier.type == EbtBool)
</del><ins>+            // Vertex inputs with a struct type are disallowed in singleDeclarationErrorCheck
+            return;
+        case EvqFragmentOut:
+            // ESSL 3.00 section 4.3.6
+            if (type.isMatrix())
</ins><span class="cx">             {
</span><del>-                error(typeSpecifier.line, &quot;cannot be bool&quot;, getQualifierString(qualifier));
</del><ins>+                error(qualifierLocation, &quot;cannot be matrix&quot;, getQualifierString(qualifier));
</ins><span class="cx">                 recover();
</span><span class="cx">             }
</span><ins>+            // Fragment outputs with a struct type are disallowed in singleDeclarationErrorCheck
+            return;
+        default:
</ins><span class="cx">             break;
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-          default: break;
</del><ins>+    // Vertex shader outputs / fragment shader inputs have a different, slightly more lenient set of
+    // restrictions.
+    bool typeContainsIntegers =
+        (type.type == EbtInt || type.type == EbtUInt || type.isStructureContainingType(EbtInt) ||
+         type.isStructureContainingType(EbtUInt));
+    if (typeContainsIntegers &amp;&amp; qualifier != EvqFlatIn &amp;&amp; qualifier != EvqFlatOut)
+    {
+        error(qualifierLocation, &quot;must use 'flat' interpolation here&quot;,
+              getQualifierString(qualifier));
+        recover();
+    }
+
+    if (type.type == EbtStruct)
+    {
+        // ESSL 3.00 sections 4.3.4 and 4.3.6.
+        // These restrictions are only implied by the ESSL 3.00 spec, but
+        // the ESSL 3.10 spec lists these restrictions explicitly.
+        if (type.array)
+        {
+            error(qualifierLocation, &quot;cannot be an array of structures&quot;,
+                  getQualifierString(qualifier));
+            recover();
</ins><span class="cx">         }
</span><ins>+        if (type.isStructureContainingArrays())
+        {
+            error(qualifierLocation, &quot;cannot be a structure containing an array&quot;,
+                  getQualifierString(qualifier));
+            recover();
+        }
+        if (type.isStructureContainingType(EbtStruct))
+        {
+            error(qualifierLocation, &quot;cannot be a structure containing a structure&quot;,
+                  getQualifierString(qualifier));
+            recover();
+        }
+        if (type.isStructureContainingType(EbtBool))
+        {
+            error(qualifierLocation, &quot;cannot be a structure containing a bool&quot;,
+                  getQualifierString(qualifier));
+            recover();
+        }
</ins><span class="cx">     }
</span><del>-
-    return returnType;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TIntermAggregate *TParseContext::parseSingleDeclaration(TPublicType &amp;publicType,
</span><span class="cx">                                                         const TSourceLoc &amp;identifierOrTypeLocation,
</span><span class="cx">                                                         const TString &amp;identifier)
</span><span class="cx"> {
</span><del>-    TIntermSymbol *symbol = intermediate.addSymbol(0, identifier, TType(publicType), identifierOrTypeLocation);
</del><ins>+    TIntermSymbol *symbol =
+        intermediate.addSymbol(0, identifier, TType(publicType), identifierOrTypeLocation);
</ins><span class="cx"> 
</span><del>-    mDeferredSingleDeclarationErrorCheck = (identifier == &quot;&quot;);
</del><ins>+    bool emptyDeclaration = (identifier == &quot;&quot;);
</ins><span class="cx"> 
</span><del>-    if (!mDeferredSingleDeclarationErrorCheck)
</del><ins>+    mDeferredSingleDeclarationErrorCheck = emptyDeclaration;
+
+    if (emptyDeclaration)
</ins><span class="cx">     {
</span><ins>+        if (publicType.isUnsizedArray())
+        {
+            // ESSL3 spec section 4.1.9: Array declaration which leaves the size unspecified is an
+            // error. It is assumed that this applies to empty declarations as well.
+            error(identifierOrTypeLocation, &quot;empty array declaration needs to specify a size&quot;,
+                  identifier.c_str());
+        }
+    }
+    else
+    {
</ins><span class="cx">         if (singleDeclarationErrorCheck(publicType, identifierOrTypeLocation))
</span><span class="cx">             recover();
</span><span class="cx"> 
</span><span class="lines">@@ -1292,7 +1561,8 @@
</span><span class="cx">     if (nonInitErrorCheck(identifierLocation, identifier, &amp;publicType))
</span><span class="cx">         recover();
</span><span class="cx"> 
</span><del>-    if (arrayTypeErrorCheck(indexLocation, publicType) || arrayQualifierErrorCheck(indexLocation, publicType))
</del><ins>+    if (arrayTypeErrorCheck(indexLocation, publicType) ||
+        arrayQualifierErrorCheck(indexLocation, publicType))
</ins><span class="cx">     {
</span><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="lines">@@ -1319,7 +1589,7 @@
</span><span class="cx">     return intermediate.makeAggregate(symbol, identifierLocation);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermAggregate *TParseContext::parseSingleInitDeclaration(TPublicType &amp;publicType,
</del><ins>+TIntermAggregate *TParseContext::parseSingleInitDeclaration(const TPublicType &amp;publicType,
</ins><span class="cx">                                                             const TSourceLoc &amp;identifierLocation,
</span><span class="cx">                                                             const TString &amp;identifier,
</span><span class="cx">                                                             const TSourceLoc &amp;initLocation,
</span><span class="lines">@@ -1345,20 +1615,22 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermAggregate *TParseContext::parseSingleArrayInitDeclaration(TPublicType &amp;publicType,
-                                                                 const TSourceLoc &amp;identifierLocation,
-                                                                 const TString &amp;identifier,
-                                                                 const TSourceLoc &amp;indexLocation,
-                                                                 TIntermTyped *indexExpression,
-                                                                 const TSourceLoc &amp;initLocation,
-                                                                 TIntermTyped *initializer)
</del><ins>+TIntermAggregate *TParseContext::parseSingleArrayInitDeclaration(
+    TPublicType &amp;publicType,
+    const TSourceLoc &amp;identifierLocation,
+    const TString &amp;identifier,
+    const TSourceLoc &amp;indexLocation,
+    TIntermTyped *indexExpression,
+    const TSourceLoc &amp;initLocation,
+    TIntermTyped *initializer)
</ins><span class="cx"> {
</span><span class="cx">     mDeferredSingleDeclarationErrorCheck = false;
</span><span class="cx"> 
</span><span class="cx">     if (singleDeclarationErrorCheck(publicType, identifierLocation))
</span><span class="cx">         recover();
</span><span class="cx"> 
</span><del>-    if (arrayTypeErrorCheck(indexLocation, publicType) || arrayQualifierErrorCheck(indexLocation, publicType))
</del><ins>+    if (arrayTypeErrorCheck(indexLocation, publicType) ||
+        arrayQualifierErrorCheck(indexLocation, publicType))
</ins><span class="cx">     {
</span><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="lines">@@ -1366,8 +1638,10 @@
</span><span class="cx">     TPublicType arrayType(publicType);
</span><span class="cx"> 
</span><span class="cx">     int size = 0;
</span><del>-    // If indexExpression is nullptr, then the array will eventually get its size implicitly from the initializer.
-    if (indexExpression != nullptr &amp;&amp; arraySizeErrorCheck(identifierLocation, indexExpression, size))
</del><ins>+    // If indexExpression is nullptr, then the array will eventually get its size implicitly from
+    // the initializer.
+    if (indexExpression != nullptr &amp;&amp;
+        arraySizeErrorCheck(identifierLocation, indexExpression, size))
</ins><span class="cx">     {
</span><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="lines">@@ -1410,7 +1684,8 @@
</span><span class="cx">         const TString kGlFrontFacing(&quot;gl_FrontFacing&quot;);
</span><span class="cx">         if (*identifier == kGlFrontFacing)
</span><span class="cx">         {
</span><del>-            error(identifierLoc, &quot;identifier should not be declared as invariant&quot;, identifier-&gt;c_str());
</del><ins>+            error(identifierLoc, &quot;identifier should not be declared as invariant&quot;,
+                  identifier-&gt;c_str());
</ins><span class="cx">             recover();
</span><span class="cx">             return nullptr;
</span><span class="cx">         }
</span><span class="lines">@@ -1418,8 +1693,8 @@
</span><span class="cx">         const TVariable *variable = getNamedVariable(identifierLoc, identifier, symbol);
</span><span class="cx">         ASSERT(variable);
</span><span class="cx">         const TType &amp;type = variable-&gt;getType();
</span><del>-        TIntermSymbol *intermSymbol = intermediate.addSymbol(variable-&gt;getUniqueId(),
-                                                             *identifier, type, identifierLoc);
</del><ins>+        TIntermSymbol *intermSymbol =
+            intermediate.addSymbol(variable-&gt;getUniqueId(), *identifier, type, identifierLoc);
</ins><span class="cx"> 
</span><span class="cx">         TIntermAggregate *aggregate = intermediate.makeAggregate(intermSymbol, identifierLoc);
</span><span class="cx">         aggregate-&gt;setOp(EOpInvariantDeclaration);
</span><span class="lines">@@ -1427,10 +1702,13 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermAggregate *TParseContext::parseDeclarator(TPublicType &amp;publicType, TIntermAggregate *aggregateDeclaration,
-                                                 const TSourceLoc &amp;identifierLocation, const TString &amp;identifier)
</del><ins>+TIntermAggregate *TParseContext::parseDeclarator(TPublicType &amp;publicType,
+                                                 TIntermAggregate *aggregateDeclaration,
+                                                 const TSourceLoc &amp;identifierLocation,
+                                                 const TString &amp;identifier)
</ins><span class="cx"> {
</span><del>-    // If the declaration starting this declarator list was empty (example: int,), some checks were not performed.
</del><ins>+    // If the declaration starting this declarator list was empty (example: int,), some checks were
+    // not performed.
</ins><span class="cx">     if (mDeferredSingleDeclarationErrorCheck)
</span><span class="cx">     {
</span><span class="cx">         if (singleDeclarationErrorCheck(publicType, identifierLocation))
</span><span class="lines">@@ -1448,18 +1726,23 @@
</span><span class="cx">     if (!declareVariable(identifierLocation, identifier, TType(publicType), &amp;variable))
</span><span class="cx">         recover();
</span><span class="cx"> 
</span><del>-    TIntermSymbol *symbol = intermediate.addSymbol(0, identifier, TType(publicType), identifierLocation);
</del><ins>+    TIntermSymbol *symbol =
+        intermediate.addSymbol(0, identifier, TType(publicType), identifierLocation);
</ins><span class="cx">     if (variable &amp;&amp; symbol)
</span><span class="cx">         symbol-&gt;setId(variable-&gt;getUniqueId());
</span><span class="cx"> 
</span><span class="cx">     return intermediate.growAggregate(aggregateDeclaration, symbol, identifierLocation);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermAggregate *TParseContext::parseArrayDeclarator(TPublicType &amp;publicType, TIntermAggregate *aggregateDeclaration,
-                                                      const TSourceLoc &amp;identifierLocation, const TString &amp;identifier,
-                                                      const TSourceLoc &amp;arrayLocation, TIntermTyped *indexExpression)
</del><ins>+TIntermAggregate *TParseContext::parseArrayDeclarator(TPublicType &amp;publicType,
+                                                      TIntermAggregate *aggregateDeclaration,
+                                                      const TSourceLoc &amp;identifierLocation,
+                                                      const TString &amp;identifier,
+                                                      const TSourceLoc &amp;arrayLocation,
+                                                      TIntermTyped *indexExpression)
</ins><span class="cx"> {
</span><del>-    // If the declaration starting this declarator list was empty (example: int,), some checks were not performed.
</del><ins>+    // If the declaration starting this declarator list was empty (example: int,), some checks were
+    // not performed.
</ins><span class="cx">     if (mDeferredSingleDeclarationErrorCheck)
</span><span class="cx">     {
</span><span class="cx">         if (singleDeclarationErrorCheck(publicType, identifierLocation))
</span><span class="lines">@@ -1473,7 +1756,8 @@
</span><span class="cx">     if (nonInitErrorCheck(identifierLocation, identifier, &amp;publicType))
</span><span class="cx">         recover();
</span><span class="cx"> 
</span><del>-    if (arrayTypeErrorCheck(arrayLocation, publicType) || arrayQualifierErrorCheck(arrayLocation, publicType))
</del><ins>+    if (arrayTypeErrorCheck(arrayLocation, publicType) ||
+        arrayQualifierErrorCheck(arrayLocation, publicType))
</ins><span class="cx">     {
</span><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="lines">@@ -1491,7 +1775,8 @@
</span><span class="cx">         if (!declareVariable(identifierLocation, identifier, arrayType, &amp;variable))
</span><span class="cx">             recover();
</span><span class="cx"> 
</span><del>-        TIntermSymbol *symbol = intermediate.addSymbol(0, identifier, arrayType, identifierLocation);
</del><ins>+        TIntermSymbol *symbol =
+            intermediate.addSymbol(0, identifier, arrayType, identifierLocation);
</ins><span class="cx">         if (variable &amp;&amp; symbol)
</span><span class="cx">             symbol-&gt;setId(variable-&gt;getUniqueId());
</span><span class="cx"> 
</span><span class="lines">@@ -1501,11 +1786,15 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermAggregate *TParseContext::parseInitDeclarator(TPublicType &amp;publicType, TIntermAggregate *aggregateDeclaration,
-                                                     const TSourceLoc &amp;identifierLocation, const TString &amp;identifier,
-                                                     const TSourceLoc &amp;initLocation, TIntermTyped *initializer)
</del><ins>+TIntermAggregate *TParseContext::parseInitDeclarator(const TPublicType &amp;publicType,
+                                                     TIntermAggregate *aggregateDeclaration,
+                                                     const TSourceLoc &amp;identifierLocation,
+                                                     const TString &amp;identifier,
+                                                     const TSourceLoc &amp;initLocation,
+                                                     TIntermTyped *initializer)
</ins><span class="cx"> {
</span><del>-    // If the declaration starting this declarator list was empty (example: int,), some checks were not performed.
</del><ins>+    // If the declaration starting this declarator list was empty (example: int,), some checks were
+    // not performed.
</ins><span class="cx">     if (mDeferredSingleDeclarationErrorCheck)
</span><span class="cx">     {
</span><span class="cx">         if (singleDeclarationErrorCheck(publicType, identifierLocation))
</span><span class="lines">@@ -1538,15 +1827,17 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermAggregate *TParseContext::parseArrayInitDeclarator(TPublicType &amp;publicType,
</del><ins>+TIntermAggregate *TParseContext::parseArrayInitDeclarator(const TPublicType &amp;publicType,
</ins><span class="cx">                                                           TIntermAggregate *aggregateDeclaration,
</span><del>-                                                          const TSourceLoc&amp; identifierLocation,
</del><ins>+                                                          const TSourceLoc &amp;identifierLocation,
</ins><span class="cx">                                                           const TString &amp;identifier,
</span><del>-                                                          const TSourceLoc&amp; indexLocation,
</del><ins>+                                                          const TSourceLoc &amp;indexLocation,
</ins><span class="cx">                                                           TIntermTyped *indexExpression,
</span><del>-                                                          const TSourceLoc &amp;initLocation, TIntermTyped *initializer)
</del><ins>+                                                          const TSourceLoc &amp;initLocation,
+                                                          TIntermTyped *initializer)
</ins><span class="cx"> {
</span><del>-    // If the declaration starting this declarator list was empty (example: int,), some checks were not performed.
</del><ins>+    // If the declaration starting this declarator list was empty (example: int,), some checks were
+    // not performed.
</ins><span class="cx">     if (mDeferredSingleDeclarationErrorCheck)
</span><span class="cx">     {
</span><span class="cx">         if (singleDeclarationErrorCheck(publicType, identifierLocation))
</span><span class="lines">@@ -1557,7 +1848,8 @@
</span><span class="cx">     if (locationDeclaratorListCheck(identifierLocation, publicType))
</span><span class="cx">         recover();
</span><span class="cx"> 
</span><del>-    if (arrayTypeErrorCheck(indexLocation, publicType) || arrayQualifierErrorCheck(indexLocation, publicType))
</del><ins>+    if (arrayTypeErrorCheck(indexLocation, publicType) ||
+        arrayQualifierErrorCheck(indexLocation, publicType))
</ins><span class="cx">     {
</span><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="lines">@@ -1565,8 +1857,10 @@
</span><span class="cx">     TPublicType arrayType(publicType);
</span><span class="cx"> 
</span><span class="cx">     int size = 0;
</span><del>-    // If indexExpression is nullptr, then the array will eventually get its size implicitly from the initializer.
-    if (indexExpression != nullptr &amp;&amp; arraySizeErrorCheck(identifierLocation, indexExpression, size))
</del><ins>+    // If indexExpression is nullptr, then the array will eventually get its size implicitly from
+    // the initializer.
+    if (indexExpression != nullptr &amp;&amp;
+        arraySizeErrorCheck(identifierLocation, indexExpression, size))
</ins><span class="cx">     {
</span><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="lines">@@ -1598,7 +1892,8 @@
</span><span class="cx"> {
</span><span class="cx">     if (typeQualifier.qualifier != EvqUniform)
</span><span class="cx">     {
</span><del>-        error(typeQualifier.line, &quot;invalid qualifier:&quot;, getQualifierString(typeQualifier.qualifier), &quot;global layout must be uniform&quot;);
</del><ins>+        error(typeQualifier.line, &quot;invalid qualifier:&quot;, getQualifierString(typeQualifier.qualifier),
+              &quot;global layout must be uniform&quot;);
</ins><span class="cx">         recover();
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -1606,7 +1901,7 @@
</span><span class="cx">     const TLayoutQualifier layoutQualifier = typeQualifier.layoutQualifier;
</span><span class="cx">     ASSERT(!layoutQualifier.isEmpty());
</span><span class="cx"> 
</span><del>-    if (shaderVersion &lt; 300)
</del><ins>+    if (mShaderVersion &lt; 300)
</ins><span class="cx">     {
</span><span class="cx">         error(typeQualifier.line, &quot;layout qualifiers supported in GLSL ES 3.00 only&quot;, &quot;layout&quot;);
</span><span class="cx">         recover();
</span><span class="lines">@@ -1621,17 +1916,278 @@
</span><span class="cx"> 
</span><span class="cx">     if (layoutQualifier.matrixPacking != EmpUnspecified)
</span><span class="cx">     {
</span><del>-        defaultMatrixPacking = layoutQualifier.matrixPacking;
</del><ins>+        mDefaultMatrixPacking = layoutQualifier.matrixPacking;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (layoutQualifier.blockStorage != EbsUnspecified)
</span><span class="cx">     {
</span><del>-        defaultBlockStorage = layoutQualifier.blockStorage;
</del><ins>+        mDefaultBlockStorage = layoutQualifier.blockStorage;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TFunction *TParseContext::addConstructorFunc(TPublicType publicType)
</del><ins>+TIntermAggregate *TParseContext::addFunctionPrototypeDeclaration(const TFunction &amp;function,
+                                                                 const TSourceLoc &amp;location)
</ins><span class="cx"> {
</span><ins>+    // Note: symbolTableFunction could be the same as function if this is the first declaration.
+    // Either way the instance in the symbol table is used to track whether the function is declared
+    // multiple times.
+    TFunction *symbolTableFunction =
+        static_cast&lt;TFunction *&gt;(symbolTable.find(function.getMangledName(), getShaderVersion()));
+    if (symbolTableFunction-&gt;hasPrototypeDeclaration() &amp;&amp; mShaderVersion == 100)
+    {
+        // ESSL 1.00.17 section 4.2.7.
+        // Doesn't apply to ESSL 3.00.4: see section 4.2.3.
+        error(location, &quot;duplicate function prototype declarations are not allowed&quot;, &quot;function&quot;);
+        recover();
+    }
+    symbolTableFunction-&gt;setHasPrototypeDeclaration();
+
+    TIntermAggregate *prototype = new TIntermAggregate;
+    prototype-&gt;setType(function.getReturnType());
+    prototype-&gt;setName(function.getMangledName());
+    prototype-&gt;setFunctionId(function.getUniqueId());
+
+    for (size_t i = 0; i &lt; function.getParamCount(); i++)
+    {
+        const TConstParameter &amp;param = function.getParam(i);
+        if (param.name != 0)
+        {
+            TVariable variable(param.name, *param.type);
+
+            TIntermSymbol *paramSymbol = intermediate.addSymbol(
+                variable.getUniqueId(), variable.getName(), variable.getType(), location);
+            prototype = intermediate.growAggregate(prototype, paramSymbol, location);
+        }
+        else
+        {
+            TIntermSymbol *paramSymbol = intermediate.addSymbol(0, &quot;&quot;, *param.type, location);
+            prototype                  = intermediate.growAggregate(prototype, paramSymbol, location);
+        }
+    }
+
+    prototype-&gt;setOp(EOpPrototype);
+
+    symbolTable.pop();
+
+    if (!symbolTable.atGlobalLevel())
+    {
+        // ESSL 3.00.4 section 4.2.4.
+        error(location, &quot;local function prototype declarations are not allowed&quot;, &quot;function&quot;);
+        recover();
+    }
+
+    return prototype;
+}
+
+TIntermAggregate *TParseContext::addFunctionDefinition(const TFunction &amp;function,
+                                                       TIntermAggregate *functionPrototype,
+                                                       TIntermAggregate *functionBody,
+                                                       const TSourceLoc &amp;location)
+{
+    //?? Check that all paths return a value if return type != void ?
+    //   May be best done as post process phase on intermediate code
+    if (mCurrentFunctionType-&gt;getBasicType() != EbtVoid &amp;&amp; !mFunctionReturnsValue)
+    {
+        error(location, &quot;function does not return a value:&quot;, &quot;&quot;, function.getName().c_str());
+        recover();
+    }
+
+    TIntermAggregate *aggregate =
+        intermediate.growAggregate(functionPrototype, functionBody, location);
+    intermediate.setAggregateOperator(aggregate, EOpFunction, location);
+    aggregate-&gt;setName(function.getMangledName().c_str());
+    aggregate-&gt;setType(function.getReturnType());
+    aggregate-&gt;setFunctionId(function.getUniqueId());
+
+    symbolTable.pop();
+    return aggregate;
+}
+
+void TParseContext::parseFunctionPrototype(const TSourceLoc &amp;location,
+                                           TFunction *function,
+                                           TIntermAggregate **aggregateOut)
+{
+    const TSymbol *builtIn =
+        symbolTable.findBuiltIn(function-&gt;getMangledName(), getShaderVersion());
+
+    if (builtIn)
+    {
+        error(location, &quot;built-in functions cannot be redefined&quot;, function-&gt;getName().c_str());
+        recover();
+    }
+
+    TFunction *prevDec =
+        static_cast&lt;TFunction *&gt;(symbolTable.find(function-&gt;getMangledName(), getShaderVersion()));
+    //
+    // Note:  'prevDec' could be 'function' if this is the first time we've seen function
+    // as it would have just been put in the symbol table.  Otherwise, we're looking up
+    // an earlier occurance.
+    //
+    if (prevDec-&gt;isDefined())
+    {
+        // Then this function already has a body.
+        error(location, &quot;function already has a body&quot;, function-&gt;getName().c_str());
+        recover();
+    }
+    prevDec-&gt;setDefined();
+    //
+    // Overload the unique ID of the definition to be the same unique ID as the declaration.
+    // Eventually we will probably want to have only a single definition and just swap the
+    // arguments to be the definition's arguments.
+    //
+    function-&gt;setUniqueId(prevDec-&gt;getUniqueId());
+
+    // Raise error message if main function takes any parameters or return anything other than void
+    if (function-&gt;getName() == &quot;main&quot;)
+    {
+        if (function-&gt;getParamCount() &gt; 0)
+        {
+            error(location, &quot;function cannot take any parameter(s)&quot;, function-&gt;getName().c_str());
+            recover();
+        }
+        if (function-&gt;getReturnType().getBasicType() != EbtVoid)
+        {
+            error(location, &quot;&quot;, function-&gt;getReturnType().getBasicString(),
+                  &quot;main function cannot return a value&quot;);
+            recover();
+        }
+    }
+
+    //
+    // Remember the return type for later checking for RETURN statements.
+    //
+    mCurrentFunctionType  = &amp;(prevDec-&gt;getReturnType());
+    mFunctionReturnsValue = false;
+
+    //
+    // Insert parameters into the symbol table.
+    // If the parameter has no name, it's not an error, just don't insert it
+    // (could be used for unused args).
+    //
+    // Also, accumulate the list of parameters into the HIL, so lower level code
+    // knows where to find parameters.
+    //
+    TIntermAggregate *paramNodes = new TIntermAggregate;
+    for (size_t i = 0; i &lt; function-&gt;getParamCount(); i++)
+    {
+        const TConstParameter &amp;param = function-&gt;getParam(i);
+        if (param.name != 0)
+        {
+            TVariable *variable = new TVariable(param.name, *param.type);
+            //
+            // Insert the parameters with name in the symbol table.
+            //
+            if (!symbolTable.declare(variable))
+            {
+                error(location, &quot;redefinition&quot;, variable-&gt;getName().c_str());
+                recover();
+                paramNodes = intermediate.growAggregate(
+                    paramNodes, intermediate.addSymbol(0, &quot;&quot;, *param.type, location), location);
+                continue;
+            }
+
+            //
+            // Add the parameter to the HIL
+            //
+            TIntermSymbol *symbol = intermediate.addSymbol(
+                variable-&gt;getUniqueId(), variable-&gt;getName(), variable-&gt;getType(), location);
+
+            paramNodes = intermediate.growAggregate(paramNodes, symbol, location);
+        }
+        else
+        {
+            paramNodes = intermediate.growAggregate(
+                paramNodes, intermediate.addSymbol(0, &quot;&quot;, *param.type, location), location);
+        }
+    }
+    intermediate.setAggregateOperator(paramNodes, EOpParameters, location);
+    *aggregateOut = paramNodes;
+    setLoopNestingLevel(0);
+}
+
+TFunction *TParseContext::parseFunctionDeclarator(const TSourceLoc &amp;location, TFunction *function)
+{
+    //
+    // We don't know at this point whether this is a function definition or a prototype.
+    // The definition production code will check for redefinitions.
+    // In the case of ESSL 1.00 the prototype production code will also check for redeclarations.
+    //
+    // Return types and parameter qualifiers must match in all redeclarations, so those are checked
+    // here.
+    //
+    TFunction *prevDec =
+        static_cast&lt;TFunction *&gt;(symbolTable.find(function-&gt;getMangledName(), getShaderVersion()));
+
+    if (getShaderVersion() &gt;= 300 &amp;&amp; symbolTable.hasUnmangledBuiltIn(function-&gt;getName().c_str()))
+    {
+        // With ESSL 3.00, names of built-in functions cannot be redeclared as functions.
+        // Therefore overloading or redefining builtin functions is an error.
+        error(location, &quot;Name of a built-in function cannot be redeclared as function&quot;,
+              function-&gt;getName().c_str());
+        recover();
+    }
+    else if (prevDec)
+    {
+        if (prevDec-&gt;getReturnType() != function-&gt;getReturnType())
+        {
+            error(location, &quot;overloaded functions must have the same return type&quot;,
+                  function-&gt;getReturnType().getBasicString());
+            recover();
+        }
+        for (size_t i = 0; i &lt; prevDec-&gt;getParamCount(); ++i)
+        {
+            if (prevDec-&gt;getParam(i).type-&gt;getQualifier() !=
+                function-&gt;getParam(i).type-&gt;getQualifier())
+            {
+                error(location, &quot;overloaded functions must have the same parameter qualifiers&quot;,
+                      function-&gt;getParam(i).type-&gt;getQualifierString());
+                recover();
+            }
+        }
+    }
+
+    //
+    // Check for previously declared variables using the same name.
+    //
+    TSymbol *prevSym = symbolTable.find(function-&gt;getName(), getShaderVersion());
+    if (prevSym)
+    {
+        if (!prevSym-&gt;isFunction())
+        {
+            error(location, &quot;redefinition&quot;, function-&gt;getName().c_str(), &quot;function&quot;);
+            recover();
+        }
+    }
+    else
+    {
+        // Insert the unmangled name to detect potential future redefinition as a variable.
+        TFunction *newFunction =
+            new TFunction(NewPoolTString(function-&gt;getName().c_str()), &amp;function-&gt;getReturnType());
+        symbolTable.getOuterLevel()-&gt;insertUnmangled(newFunction);
+    }
+
+    // We're at the inner scope level of the function's arguments and body statement.
+    // Add the function prototype to the surrounding scope instead.
+    symbolTable.getOuterLevel()-&gt;insert(function);
+
+    //
+    // If this is a redeclaration, it could also be a definition, in which case, we want to use the
+    // variable names from this one, and not the one that's
+    // being redeclared.  So, pass back up this declaration, not the one in the symbol table.
+    //
+    return function;
+}
+
+TFunction *TParseContext::addConstructorFunc(const TPublicType &amp;publicTypeIn)
+{
+    TPublicType publicType = publicTypeIn;
+    if (publicType.isStructSpecifier)
+    {
+        error(publicType.line, &quot;constructor can't be a structure definition&quot;,
+              getBasicString(publicType.type));
+        recover();
+    }
+
</ins><span class="cx">     TOperator op = EOpNull;
</span><span class="cx">     if (publicType.userDef)
</span><span class="cx">     {
</span><span class="lines">@@ -1641,60 +2197,131 @@
</span><span class="cx">     {
</span><span class="cx">         switch (publicType.type)
</span><span class="cx">         {
</span><del>-          case EbtFloat:
-            if (publicType.isMatrix())
-            {
-                // TODO: non-square matrices
-                switch(publicType.getCols())
</del><ins>+            case EbtFloat:
+                if (publicType.isMatrix())
</ins><span class="cx">                 {
</span><del>-                  case 2: op = EOpConstructMat2;  break;
-                  case 3: op = EOpConstructMat3;  break;
-                  case 4: op = EOpConstructMat4;  break;
</del><ins>+                    switch (publicType.getCols())
+                    {
+                        case 2:
+                            switch (publicType.getRows())
+                            {
+                                case 2:
+                                    op = EOpConstructMat2;
+                                    break;
+                                case 3:
+                                    op = EOpConstructMat2x3;
+                                    break;
+                                case 4:
+                                    op = EOpConstructMat2x4;
+                                    break;
+                            }
+                            break;
+                        case 3:
+                            switch (publicType.getRows())
+                            {
+                                case 2:
+                                    op = EOpConstructMat3x2;
+                                    break;
+                                case 3:
+                                    op = EOpConstructMat3;
+                                    break;
+                                case 4:
+                                    op = EOpConstructMat3x4;
+                                    break;
+                            }
+                            break;
+                        case 4:
+                            switch (publicType.getRows())
+                            {
+                                case 2:
+                                    op = EOpConstructMat4x2;
+                                    break;
+                                case 3:
+                                    op = EOpConstructMat4x3;
+                                    break;
+                                case 4:
+                                    op = EOpConstructMat4;
+                                    break;
+                            }
+                            break;
+                    }
</ins><span class="cx">                 }
</span><del>-            }
-            else
-            {
-                switch(publicType.getNominalSize())
</del><ins>+                else
</ins><span class="cx">                 {
</span><del>-                  case 1: op = EOpConstructFloat; break;
-                  case 2: op = EOpConstructVec2;  break;
-                  case 3: op = EOpConstructVec3;  break;
-                  case 4: op = EOpConstructVec4;  break;
</del><ins>+                    switch (publicType.getNominalSize())
+                    {
+                        case 1:
+                            op = EOpConstructFloat;
+                            break;
+                        case 2:
+                            op = EOpConstructVec2;
+                            break;
+                        case 3:
+                            op = EOpConstructVec3;
+                            break;
+                        case 4:
+                            op = EOpConstructVec4;
+                            break;
+                    }
</ins><span class="cx">                 }
</span><del>-            }
-            break;
</del><ins>+                break;
</ins><span class="cx"> 
</span><del>-          case EbtInt:
-            switch(publicType.getNominalSize())
-            {
-              case 1: op = EOpConstructInt;   break;
-              case 2: op = EOpConstructIVec2; break;
-              case 3: op = EOpConstructIVec3; break;
-              case 4: op = EOpConstructIVec4; break;
-            }
-            break;
</del><ins>+            case EbtInt:
+                switch (publicType.getNominalSize())
+                {
+                    case 1:
+                        op = EOpConstructInt;
+                        break;
+                    case 2:
+                        op = EOpConstructIVec2;
+                        break;
+                    case 3:
+                        op = EOpConstructIVec3;
+                        break;
+                    case 4:
+                        op = EOpConstructIVec4;
+                        break;
+                }
+                break;
</ins><span class="cx"> 
</span><del>-          case EbtUInt:
-            switch(publicType.getNominalSize())
-            {
-              case 1: op = EOpConstructUInt;  break;
-              case 2: op = EOpConstructUVec2; break;
-              case 3: op = EOpConstructUVec3; break;
-              case 4: op = EOpConstructUVec4; break;
-            }
-            break;
</del><ins>+            case EbtUInt:
+                switch (publicType.getNominalSize())
+                {
+                    case 1:
+                        op = EOpConstructUInt;
+                        break;
+                    case 2:
+                        op = EOpConstructUVec2;
+                        break;
+                    case 3:
+                        op = EOpConstructUVec3;
+                        break;
+                    case 4:
+                        op = EOpConstructUVec4;
+                        break;
+                }
+                break;
</ins><span class="cx"> 
</span><del>-          case EbtBool:
-            switch(publicType.getNominalSize())
-            {
-                case 1: op = EOpConstructBool;  break;
-                case 2: op = EOpConstructBVec2; break;
-                case 3: op = EOpConstructBVec3; break;
-                case 4: op = EOpConstructBVec4; break;
-            }
-            break;
</del><ins>+            case EbtBool:
+                switch (publicType.getNominalSize())
+                {
+                    case 1:
+                        op = EOpConstructBool;
+                        break;
+                    case 2:
+                        op = EOpConstructBVec2;
+                        break;
+                    case 3:
+                        op = EOpConstructBVec3;
+                        break;
+                    case 4:
+                        op = EOpConstructBVec4;
+                        break;
+                }
+                break;
</ins><span class="cx"> 
</span><del>-          default: break;
</del><ins>+            default:
+                break;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (op == EOpNull)
</span><span class="lines">@@ -1702,34 +2329,34 @@
</span><span class="cx">             error(publicType.line, &quot;cannot construct this type&quot;, getBasicString(publicType.type));
</span><span class="cx">             recover();
</span><span class="cx">             publicType.type = EbtFloat;
</span><del>-            op = EOpConstructFloat;
</del><ins>+            op              = EOpConstructFloat;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     TString tempString;
</span><del>-    TType type(publicType);
</del><ins>+    const TType *type = new TType(publicType);
</ins><span class="cx">     return new TFunction(&amp;tempString, type, op);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// This function is used to test for the correctness of the parameters passed to various constructor functions
-// and also convert them to the right datatype if it is allowed and required. 
</del><ins>+// This function is used to test for the correctness of the parameters passed to various constructor
+// functions and also convert them to the right datatype if it is allowed and required.
</ins><span class="cx"> //
</span><span class="cx"> // Returns 0 for an error or the constructed node (aggregate or typed) for no error.
</span><span class="cx"> //
</span><del>-TIntermTyped *TParseContext::addConstructor(TIntermNode *arguments, TType *type, TOperator op, TFunction *fnCall, const TSourceLoc &amp;line)
</del><ins>+TIntermTyped *TParseContext::addConstructor(TIntermNode *arguments,
+                                            TType *type,
+                                            TOperator op,
+                                            TFunction *fnCall,
+                                            const TSourceLoc &amp;line)
</ins><span class="cx"> {
</span><del>-    TIntermAggregate *aggregateArguments = arguments-&gt;getAsAggregate();
</del><ins>+    TIntermAggregate *constructor = arguments-&gt;getAsAggregate();
+    ASSERT(constructor != nullptr);
</ins><span class="cx"> 
</span><del>-    if (!aggregateArguments)
-    {
-        aggregateArguments = new TIntermAggregate;
-        aggregateArguments-&gt;getSequence()-&gt;push_back(arguments);
-    }
-
</del><span class="cx">     if (type-&gt;isArray())
</span><span class="cx">     {
</span><del>-        // GLSL ES 3.00 section 5.4.4: Each argument must be the same type as the element type of the array.
-        TIntermSequence *args = aggregateArguments-&gt;getSequence();
</del><ins>+        // GLSL ES 3.00 section 5.4.4: Each argument must be the same type as the element type of
+        // the array.
+        TIntermSequence *args = constructor-&gt;getSequence();
</ins><span class="cx">         for (size_t i = 0; i &lt; args-&gt;size(); i++)
</span><span class="cx">         {
</span><span class="cx">             const TType &amp;argType = (*args)[i]-&gt;getAsTyped()-&gt;getType();
</span><span class="lines">@@ -1746,13 +2373,14 @@
</span><span class="cx">     else if (op == EOpConstructStruct)
</span><span class="cx">     {
</span><span class="cx">         const TFieldList &amp;fields = type-&gt;getStruct()-&gt;fields();
</span><del>-        TIntermSequence *args = aggregateArguments-&gt;getSequence();
</del><ins>+        TIntermSequence *args    = constructor-&gt;getSequence();
</ins><span class="cx"> 
</span><span class="cx">         for (size_t i = 0; i &lt; fields.size(); i++)
</span><span class="cx">         {
</span><span class="cx">             if (i &gt;= args-&gt;size() || (*args)[i]-&gt;getAsTyped()-&gt;getType() != *fields[i]-&gt;type())
</span><span class="cx">             {
</span><del>-                error(line, &quot;Structure constructor arguments do not match structure fields&quot;, &quot;Error&quot;);
</del><ins>+                error(line, &quot;Structure constructor arguments do not match structure fields&quot;,
+                      &quot;Error&quot;);
</ins><span class="cx">                 recover();
</span><span class="cx"> 
</span><span class="cx">                 return 0;
</span><span class="lines">@@ -1761,13 +2389,13 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Turn the argument list itself into a constructor
</span><del>-    TIntermAggregate *constructor = intermediate.setAggregateOperator(aggregateArguments, op, line);
-    TIntermTyped *constConstructor = foldConstConstructor(constructor, *type);
-    if (constConstructor)
-    {
-        return constConstructor;
-    }
</del><ins>+    constructor-&gt;setOp(op);
+    constructor-&gt;setLine(line);
+    ASSERT(constructor-&gt;isConstructor());
</ins><span class="cx"> 
</span><ins>+    // Need to set type before setPrecisionFromChildren() because bool doesn't have precision.
+    constructor-&gt;setType(*type);
+
</ins><span class="cx">     // Structs should not be precision qualified, the individual members may be.
</span><span class="cx">     // Built-in types on the other hand should be precision qualified.
</span><span class="cx">     if (op != EOpConstructStruct)
</span><span class="lines">@@ -1776,174 +2404,142 @@
</span><span class="cx">         type-&gt;setPrecision(constructor-&gt;getPrecision());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return constructor;
-}
-
-TIntermTyped* TParseContext::foldConstConstructor(TIntermAggregate* aggrNode, const TType&amp; type)
-{
-    // TODO: Add support for folding array constructors
-    bool canBeFolded = areAllChildConst(aggrNode) &amp;&amp; !type.isArray();
-    aggrNode-&gt;setType(type);
-    if (canBeFolded) {
-        bool returnVal = false;
-        TConstantUnion* unionArray = new TConstantUnion[type.getObjectSize()];
-        if (aggrNode-&gt;getSequence()-&gt;size() == 1)  {
-            returnVal = intermediate.parseConstTree(aggrNode-&gt;getLine(), aggrNode, unionArray, aggrNode-&gt;getOp(), type, true);
-        }
-        else {
-            returnVal = intermediate.parseConstTree(aggrNode-&gt;getLine(), aggrNode, unionArray, aggrNode-&gt;getOp(), type);
-        }
-        if (returnVal)
-            return 0;
-
-        return intermediate.addConstantUnion(unionArray, type, aggrNode-&gt;getLine());
</del><ins>+    TIntermTyped *constConstructor = intermediate.foldAggregateBuiltIn(constructor);
+    if (constConstructor)
+    {
+        return constConstructor;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return 0;
</del><ins>+    return constructor;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><del>-// This function returns the tree representation for the vector field(s) being accessed from contant vector.
-// If only one component of vector is accessed (v.x or v[0] where v is a contant vector), then a contant node is
-// returned, else an aggregate node is returned (for v.xy). The input to this function could either be the symbol
-// node or it could be the intermediate tree representation of accessing fields in a constant structure or column of 
-// a constant matrix.
</del><ins>+// This function returns the tree representation for the vector field(s) being accessed from contant
+// vector.
+// If only one component of vector is accessed (v.x or v[0] where v is a contant vector), then a
+// contant node is returned, else an aggregate node is returned (for v.xy). The input to this
+// function could either be the symbol node or it could be the intermediate tree representation of
+// accessing fields in a constant structure or column of a constant matrix.
</ins><span class="cx"> //
</span><del>-TIntermTyped* TParseContext::addConstVectorNode(TVectorFields&amp; fields, TIntermTyped* node, const TSourceLoc&amp; line)
</del><ins>+TIntermTyped *TParseContext::addConstVectorNode(TVectorFields &amp;fields,
+                                                TIntermConstantUnion *node,
+                                                const TSourceLoc &amp;line,
+                                                bool outOfRangeIndexIsError)
</ins><span class="cx"> {
</span><del>-    TIntermTyped* typedNode;
-    TIntermConstantUnion* tempConstantNode = node-&gt;getAsConstantUnion();
</del><ins>+    const TConstantUnion *unionArray = node-&gt;getUnionArrayPointer();
+    ASSERT(unionArray);
</ins><span class="cx"> 
</span><del>-    const TConstantUnion *unionArray;
-    if (tempConstantNode) {
-        unionArray = tempConstantNode-&gt;getUnionArrayPointer();
</del><ins>+    TConstantUnion *constArray = new TConstantUnion[fields.num];
</ins><span class="cx"> 
</span><del>-        if (!unionArray) {
-            return node;
-        }
-    } else { // The node has to be either a symbol node or an aggregate node or a tempConstant node, else, its an error
-        error(line, &quot;Cannot offset into the vector&quot;, &quot;Error&quot;);
-        recover();
-
-        return 0;
-    }
-
-    TConstantUnion* constArray = new TConstantUnion[fields.num];
-
-    for (int i = 0; i &lt; fields.num; i++) {
-        if (fields.offsets[i] &gt;= node-&gt;getType().getNominalSize()) {
</del><ins>+    for (int i = 0; i &lt; fields.num; i++)
+    {
+        if (fields.offsets[i] &gt;= node-&gt;getType().getNominalSize())
+        {
</ins><span class="cx">             std::stringstream extraInfoStream;
</span><span class="cx">             extraInfoStream &lt;&lt; &quot;vector field selection out of range '&quot; &lt;&lt; fields.offsets[i] &lt;&lt; &quot;'&quot;;
</span><span class="cx">             std::string extraInfo = extraInfoStream.str();
</span><del>-            error(line, &quot;&quot;, &quot;[&quot;, extraInfo.c_str());
-            recover();
-            fields.offsets[i] = 0;
</del><ins>+            outOfRangeError(outOfRangeIndexIsError, line, &quot;&quot;, &quot;[&quot;, extraInfo.c_str());
+            fields.offsets[i] = node-&gt;getType().getNominalSize() - 1;
</ins><span class="cx">         }
</span><del>-        
</del><ins>+
</ins><span class="cx">         constArray[i] = unionArray[fields.offsets[i]];
</span><del>-
-    } 
-    typedNode = intermediate.addConstantUnion(constArray, node-&gt;getType(), line);
-    return typedNode;
</del><ins>+    }
+    return intermediate.addConstantUnion(constArray, node-&gt;getType(), line);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><del>-// This function returns the column being accessed from a constant matrix. The values are retrieved from
-// the symbol table and parse-tree is built for a vector (each column of a matrix is a vector). The input 
-// to the function could either be a symbol node (m[0] where m is a constant matrix)that represents a 
-// constant matrix or it could be the tree representation of the constant matrix (s.m1[0] where s is a constant structure)
</del><ins>+// This function returns the column being accessed from a constant matrix. The values are retrieved
+// from the symbol table and parse-tree is built for a vector (each column of a matrix is a vector).
+// The input to the function could either be a symbol node (m[0] where m is a constant matrix)that
+// represents a constant matrix or it could be the tree representation of the constant matrix
+// (s.m1[0] where s is a constant structure)
</ins><span class="cx"> //
</span><del>-TIntermTyped* TParseContext::addConstMatrixNode(int index, TIntermTyped* node, const TSourceLoc&amp; line)
</del><ins>+TIntermTyped *TParseContext::addConstMatrixNode(int index,
+                                                TIntermConstantUnion *node,
+                                                const TSourceLoc &amp;line,
+                                                bool outOfRangeIndexIsError)
</ins><span class="cx"> {
</span><del>-    TIntermTyped* typedNode;
-    TIntermConstantUnion* tempConstantNode = node-&gt;getAsConstantUnion();
-
-    if (index &gt;= node-&gt;getType().getCols()) {
</del><ins>+    if (index &gt;= node-&gt;getType().getCols())
+    {
</ins><span class="cx">         std::stringstream extraInfoStream;
</span><span class="cx">         extraInfoStream &lt;&lt; &quot;matrix field selection out of range '&quot; &lt;&lt; index &lt;&lt; &quot;'&quot;;
</span><span class="cx">         std::string extraInfo = extraInfoStream.str();
</span><del>-        error(line, &quot;&quot;, &quot;[&quot;, extraInfo.c_str());
-        recover();
-        index = 0;
</del><ins>+        outOfRangeError(outOfRangeIndexIsError, line, &quot;&quot;, &quot;[&quot;, extraInfo.c_str());
+        index = node-&gt;getType().getCols() - 1;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (tempConstantNode) {
-         TConstantUnion *unionArray = tempConstantNode-&gt;getUnionArrayPointer();
-         int size = tempConstantNode-&gt;getType().getCols();
-         typedNode = intermediate.addConstantUnion(&amp;unionArray[size*index], tempConstantNode-&gt;getType(), line);
-    } else {
-        error(line, &quot;Cannot offset into the matrix&quot;, &quot;Error&quot;);
-        recover();
-
-        return 0;
-    }
-
-    return typedNode;
</del><ins>+    const TConstantUnion *unionArray = node-&gt;getUnionArrayPointer();
+    int size = node-&gt;getType().getCols();
+    return intermediate.addConstantUnion(&amp;unionArray[size * index], node-&gt;getType(), line);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> //
</span><del>-// This function returns an element of an array accessed from a constant array. The values are retrieved from
-// the symbol table and parse-tree is built for the type of the element. The input 
-// to the function could either be a symbol node (a[0] where a is a constant array)that represents a 
-// constant array or it could be the tree representation of the constant array (s.a1[0] where s is a constant structure)
</del><ins>+// This function returns an element of an array accessed from a constant array. The values are
+// retrieved from the symbol table and parse-tree is built for the type of the element. The input
+// to the function could either be a symbol node (a[0] where a is a constant array)that represents a
+// constant array or it could be the tree representation of the constant array (s.a1[0] where s is a
+// constant structure)
</ins><span class="cx"> //
</span><del>-TIntermTyped* TParseContext::addConstArrayNode(int index, TIntermTyped* node, const TSourceLoc&amp; line)
</del><ins>+TIntermTyped *TParseContext::addConstArrayNode(int index,
+                                               TIntermConstantUnion *node,
+                                               const TSourceLoc &amp;line,
+                                               bool outOfRangeIndexIsError)
</ins><span class="cx"> {
</span><del>-    TIntermTyped* typedNode;
-    TIntermConstantUnion* tempConstantNode = node-&gt;getAsConstantUnion();
</del><span class="cx">     TType arrayElementType = node-&gt;getType();
</span><span class="cx">     arrayElementType.clearArrayness();
</span><span class="cx"> 
</span><del>-    if (index &gt;= node-&gt;getType().getArraySize()) {
</del><ins>+    if (index &gt;= node-&gt;getType().getArraySize())
+    {
</ins><span class="cx">         std::stringstream extraInfoStream;
</span><span class="cx">         extraInfoStream &lt;&lt; &quot;array field selection out of range '&quot; &lt;&lt; index &lt;&lt; &quot;'&quot;;
</span><span class="cx">         std::string extraInfo = extraInfoStream.str();
</span><del>-        error(line, &quot;&quot;, &quot;[&quot;, extraInfo.c_str());
-        recover();
-        index = 0;
</del><ins>+        outOfRangeError(outOfRangeIndexIsError, line, &quot;&quot;, &quot;[&quot;, extraInfo.c_str());
+        index = node-&gt;getType().getArraySize() - 1;
</ins><span class="cx">     }
</span><del>-
-    if (tempConstantNode) {
-        size_t arrayElementSize = arrayElementType.getObjectSize();
-        TConstantUnion* unionArray = tempConstantNode-&gt;getUnionArrayPointer();
-        typedNode = intermediate.addConstantUnion(&amp;unionArray[arrayElementSize * index], tempConstantNode-&gt;getType(), line);
-    } else {
-        error(line, &quot;Cannot offset into the array&quot;, &quot;Error&quot;);
-        recover();
-
-        return 0;
-    }
-
-    return typedNode;
</del><ins>+    size_t arrayElementSize          = arrayElementType.getObjectSize();
+    const TConstantUnion *unionArray = node-&gt;getUnionArrayPointer();
+    return intermediate.addConstantUnion(&amp;unionArray[arrayElementSize * index], node-&gt;getType(),
+                                         line);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> //
</span><del>-// This function returns the value of a particular field inside a constant structure from the symbol table. 
-// If there is an embedded/nested struct, it appropriately calls addConstStructNested or addConstStructFromAggr
-// function and returns the parse-tree with the values of the embedded/nested struct.
</del><ins>+// This function returns the value of a particular field inside a constant structure from the symbol
+// table.
+// If there is an embedded/nested struct, it appropriately calls addConstStructNested or
+// addConstStructFromAggr function and returns the parse-tree with the values of the embedded/nested
+// struct.
</ins><span class="cx"> //
</span><del>-TIntermTyped* TParseContext::addConstStruct(const TString &amp;identifier, TIntermTyped *node, const TSourceLoc&amp; line)
</del><ins>+TIntermTyped *TParseContext::addConstStruct(const TString &amp;identifier,
+                                            TIntermTyped *node,
+                                            const TSourceLoc &amp;line)
</ins><span class="cx"> {
</span><del>-    const TFieldList&amp; fields = node-&gt;getType().getStruct()-&gt;fields();
-    size_t instanceSize = 0;
</del><ins>+    const TFieldList &amp;fields = node-&gt;getType().getStruct()-&gt;fields();
+    size_t instanceSize      = 0;
</ins><span class="cx"> 
</span><del>-    for (size_t index = 0; index &lt; fields.size(); ++index) {
-        if (fields[index]-&gt;name() == identifier) {
</del><ins>+    for (size_t index = 0; index &lt; fields.size(); ++index)
+    {
+        if (fields[index]-&gt;name() == identifier)
+        {
</ins><span class="cx">             break;
</span><del>-        } else {
</del><ins>+        }
+        else
+        {
</ins><span class="cx">             instanceSize += fields[index]-&gt;type()-&gt;getObjectSize();
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     TIntermTyped *typedNode;
</span><span class="cx">     TIntermConstantUnion *tempConstantNode = node-&gt;getAsConstantUnion();
</span><del>-    if (tempConstantNode) {
-         TConstantUnion* constArray = tempConstantNode-&gt;getUnionArrayPointer();
</del><ins>+    if (tempConstantNode)
+    {
+        const TConstantUnion *constArray = tempConstantNode-&gt;getUnionArrayPointer();
</ins><span class="cx"> 
</span><del>-         typedNode = intermediate.addConstantUnion(constArray+instanceSize, tempConstantNode-&gt;getType(), line); // type will be changed in the calling function
-    } else {
</del><ins>+        // type will be changed in the calling function
+        typedNode = intermediate.addConstantUnion(constArray + instanceSize,
+                                                  tempConstantNode-&gt;getType(), line);
+    }
+    else
+    {
</ins><span class="cx">         error(line, &quot;Cannot offset into the structure&quot;, &quot;Error&quot;);
</span><span class="cx">         recover();
</span><span class="cx"> 
</span><span class="lines">@@ -1956,15 +2552,22 @@
</span><span class="cx"> //
</span><span class="cx"> // Interface/uniform blocks
</span><span class="cx"> //
</span><del>-TIntermAggregate* TParseContext::addInterfaceBlock(const TPublicType&amp; typeQualifier, const TSourceLoc&amp; nameLine, const TString&amp; blockName, TFieldList* fieldList, 
-                                                   const TString* instanceName, const TSourceLoc&amp; instanceLine, TIntermTyped* arrayIndex, const TSourceLoc&amp; arrayIndexLine)
</del><ins>+TIntermAggregate *TParseContext::addInterfaceBlock(const TPublicType &amp;typeQualifier,
+                                                   const TSourceLoc &amp;nameLine,
+                                                   const TString &amp;blockName,
+                                                   TFieldList *fieldList,
+                                                   const TString *instanceName,
+                                                   const TSourceLoc &amp;instanceLine,
+                                                   TIntermTyped *arrayIndex,
+                                                   const TSourceLoc &amp;arrayIndexLine)
</ins><span class="cx"> {
</span><span class="cx">     if (reservedErrorCheck(nameLine, blockName))
</span><span class="cx">         recover();
</span><span class="cx"> 
</span><span class="cx">     if (typeQualifier.qualifier != EvqUniform)
</span><span class="cx">     {
</span><del>-        error(typeQualifier.line, &quot;invalid qualifier:&quot;, getQualifierString(typeQualifier.qualifier), &quot;interface blocks must be uniform&quot;);
</del><ins>+        error(typeQualifier.line, &quot;invalid qualifier:&quot;, getQualifierString(typeQualifier.qualifier),
+              &quot;interface blocks must be uniform&quot;);
</ins><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1976,39 +2579,44 @@
</span><span class="cx"> 
</span><span class="cx">     if (blockLayoutQualifier.matrixPacking == EmpUnspecified)
</span><span class="cx">     {
</span><del>-        blockLayoutQualifier.matrixPacking = defaultMatrixPacking;
</del><ins>+        blockLayoutQualifier.matrixPacking = mDefaultMatrixPacking;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (blockLayoutQualifier.blockStorage == EbsUnspecified)
</span><span class="cx">     {
</span><del>-        blockLayoutQualifier.blockStorage = defaultBlockStorage;
</del><ins>+        blockLayoutQualifier.blockStorage = mDefaultBlockStorage;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TSymbol* blockNameSymbol = new TInterfaceBlockName(&amp;blockName);
-    if (!symbolTable.declare(blockNameSymbol)) {
</del><ins>+    TSymbol *blockNameSymbol = new TInterfaceBlockName(&amp;blockName);
+    if (!symbolTable.declare(blockNameSymbol))
+    {
</ins><span class="cx">         error(nameLine, &quot;redefinition&quot;, blockName.c_str(), &quot;interface block name&quot;);
</span><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // check for sampler types and apply layout qualifiers
</span><del>-    for (size_t memberIndex = 0; memberIndex &lt; fieldList-&gt;size(); ++memberIndex) {
-        TField* field = (*fieldList)[memberIndex];
-        TType* fieldType = field-&gt;type();
-        if (IsSampler(fieldType-&gt;getBasicType())) {
-            error(field-&gt;line(), &quot;unsupported type&quot;, fieldType-&gt;getBasicString(), &quot;sampler types are not allowed in interface blocks&quot;);
</del><ins>+    for (size_t memberIndex = 0; memberIndex &lt; fieldList-&gt;size(); ++memberIndex)
+    {
+        TField *field    = (*fieldList)[memberIndex];
+        TType *fieldType = field-&gt;type();
+        if (IsSampler(fieldType-&gt;getBasicType()))
+        {
+            error(field-&gt;line(), &quot;unsupported type&quot;, fieldType-&gt;getBasicString(),
+                  &quot;sampler types are not allowed in interface blocks&quot;);
</ins><span class="cx">             recover();
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         const TQualifier qualifier = fieldType-&gt;getQualifier();
</span><span class="cx">         switch (qualifier)
</span><span class="cx">         {
</span><del>-          case EvqGlobal:
-          case EvqUniform:
-            break;
-          default:
-            error(field-&gt;line(), &quot;invalid qualifier on interface block member&quot;, getQualifierString(qualifier));
-            recover();
-            break;
</del><ins>+            case EvqGlobal:
+            case EvqUniform:
+                break;
+            default:
+                error(field-&gt;line(), &quot;invalid qualifier on interface block member&quot;,
+                      getQualifierString(qualifier));
+                recover();
+                break;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // check layout qualifiers
</span><span class="lines">@@ -2020,7 +2628,8 @@
</span><span class="cx"> 
</span><span class="cx">         if (fieldLayoutQualifier.blockStorage != EbsUnspecified)
</span><span class="cx">         {
</span><del>-            error(field-&gt;line(), &quot;invalid layout qualifier:&quot;, getBlockStorageString(fieldLayoutQualifier.blockStorage), &quot;cannot be used here&quot;);
</del><ins>+            error(field-&gt;line(), &quot;invalid layout qualifier:&quot;,
+                  getBlockStorageString(fieldLayoutQualifier.blockStorage), &quot;cannot be used here&quot;);
</ins><span class="cx">             recover();
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -2028,10 +2637,11 @@
</span><span class="cx">         {
</span><span class="cx">             fieldLayoutQualifier.matrixPacking = blockLayoutQualifier.matrixPacking;
</span><span class="cx">         }
</span><del>-        else if (!fieldType-&gt;isMatrix())
</del><ins>+        else if (!fieldType-&gt;isMatrix() &amp;&amp; fieldType-&gt;getBasicType() != EbtStruct)
</ins><span class="cx">         {
</span><del>-            error(field-&gt;line(), &quot;invalid layout qualifier:&quot;, getMatrixPackingString(fieldLayoutQualifier.matrixPacking), &quot;can only be used on matrix types&quot;);
-            recover();
</del><ins>+            warning(field-&gt;line(), &quot;extraneous layout qualifier:&quot;,
+                    getMatrixPackingString(fieldLayoutQualifier.matrixPacking),
+                    &quot;only has an effect on matrix types&quot;);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         fieldType-&gt;setLayoutQualifier(fieldLayoutQualifier);
</span><span class="lines">@@ -2045,62 +2655,74 @@
</span><span class="cx">             recover();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TInterfaceBlock* interfaceBlock = new TInterfaceBlock(&amp;blockName, fieldList, instanceName, arraySize, blockLayoutQualifier);
-    TType interfaceBlockType(interfaceBlock, typeQualifier.qualifier, blockLayoutQualifier, arraySize);
</del><ins>+    TInterfaceBlock *interfaceBlock =
+        new TInterfaceBlock(&amp;blockName, fieldList, instanceName, arraySize, blockLayoutQualifier);
+    TType interfaceBlockType(interfaceBlock, typeQualifier.qualifier, blockLayoutQualifier,
+                             arraySize);
</ins><span class="cx"> 
</span><span class="cx">     TString symbolName = &quot;&quot;;
</span><del>-    int symbolId = 0;
</del><ins>+    int symbolId       = 0;
</ins><span class="cx"> 
</span><span class="cx">     if (!instanceName)
</span><span class="cx">     {
</span><span class="cx">         // define symbols for the members of the interface block
</span><span class="cx">         for (size_t memberIndex = 0; memberIndex &lt; fieldList-&gt;size(); ++memberIndex)
</span><span class="cx">         {
</span><del>-            TField* field = (*fieldList)[memberIndex];
-            TType* fieldType = field-&gt;type();
</del><ins>+            TField *field    = (*fieldList)[memberIndex];
+            TType *fieldType = field-&gt;type();
</ins><span class="cx"> 
</span><span class="cx">             // set parent pointer of the field variable
</span><span class="cx">             fieldType-&gt;setInterfaceBlock(interfaceBlock);
</span><span class="cx"> 
</span><del>-            TVariable* fieldVariable = new TVariable(&amp;field-&gt;name(), *fieldType);
</del><ins>+            TVariable *fieldVariable = new TVariable(&amp;field-&gt;name(), *fieldType);
</ins><span class="cx">             fieldVariable-&gt;setQualifier(typeQualifier.qualifier);
</span><span class="cx"> 
</span><del>-            if (!symbolTable.declare(fieldVariable)) {
-                error(field-&gt;line(), &quot;redefinition&quot;, field-&gt;name().c_str(), &quot;interface block member name&quot;);
</del><ins>+            if (!symbolTable.declare(fieldVariable))
+            {
+                error(field-&gt;line(), &quot;redefinition&quot;, field-&gt;name().c_str(),
+                      &quot;interface block member name&quot;);
</ins><span class="cx">                 recover();
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><ins>+        if (reservedErrorCheck(instanceLine, *instanceName))
+            recover();
+
</ins><span class="cx">         // add a symbol for this interface block
</span><del>-        TVariable* instanceTypeDef = new TVariable(instanceName, interfaceBlockType, false);
</del><ins>+        TVariable *instanceTypeDef = new TVariable(instanceName, interfaceBlockType, false);
</ins><span class="cx">         instanceTypeDef-&gt;setQualifier(typeQualifier.qualifier);
</span><span class="cx"> 
</span><del>-        if (!symbolTable.declare(instanceTypeDef)) {
-            error(instanceLine, &quot;redefinition&quot;, instanceName-&gt;c_str(), &quot;interface block instance name&quot;);
</del><ins>+        if (!symbolTable.declare(instanceTypeDef))
+        {
+            error(instanceLine, &quot;redefinition&quot;, instanceName-&gt;c_str(),
+                  &quot;interface block instance name&quot;);
</ins><span class="cx">             recover();
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        symbolId = instanceTypeDef-&gt;getUniqueId();
</del><ins>+        symbolId   = instanceTypeDef-&gt;getUniqueId();
</ins><span class="cx">         symbolName = instanceTypeDef-&gt;getName();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TIntermAggregate *aggregate = intermediate.makeAggregate(intermediate.addSymbol(symbolId, symbolName, interfaceBlockType, typeQualifier.line), nameLine);
</del><ins>+    TIntermAggregate *aggregate = intermediate.makeAggregate(
+        intermediate.addSymbol(symbolId, symbolName, interfaceBlockType, typeQualifier.line),
+        nameLine);
</ins><span class="cx">     aggregate-&gt;setOp(EOpDeclaration);
</span><span class="cx"> 
</span><span class="cx">     exitStructDeclaration();
</span><span class="cx">     return aggregate;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::enterStructDeclaration(const TSourceLoc&amp; line, const TString&amp; identifier)
</del><ins>+bool TParseContext::enterStructDeclaration(const TSourceLoc &amp;line, const TString &amp;identifier)
</ins><span class="cx"> {
</span><del>-    ++structNestingLevel;
</del><ins>+    ++mStructNestingLevel;
</ins><span class="cx"> 
</span><span class="cx">     // Embedded structure definitions are not supported per GLSL ES spec.
</span><span class="cx">     // They aren't allowed in GLSL either, but we need to detect this here
</span><span class="cx">     // so we don't rely on the GLSL compiler to catch it.
</span><del>-    if (structNestingLevel &gt; 1) {
</del><ins>+    if (mStructNestingLevel &gt; 1)
+    {
</ins><span class="cx">         error(line, &quot;&quot;, &quot;Embedded struct definitions are not allowed&quot;);
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="lines">@@ -2110,33 +2732,34 @@
</span><span class="cx"> 
</span><span class="cx"> void TParseContext::exitStructDeclaration()
</span><span class="cx"> {
</span><del>-    --structNestingLevel;
</del><ins>+    --mStructNestingLevel;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-namespace {
-
</del><ins>+namespace
+{
</ins><span class="cx"> const int kWebGLMaxStructNesting = 4;
</span><span class="cx"> 
</span><span class="cx"> }  // namespace
</span><span class="cx"> 
</span><del>-bool TParseContext::structNestingErrorCheck(const TSourceLoc&amp; line, const TField&amp; field)
</del><ins>+bool TParseContext::structNestingErrorCheck(const TSourceLoc &amp;line, const TField &amp;field)
</ins><span class="cx"> {
</span><del>-    if (!IsWebGLBasedSpec(shaderSpec)) {
</del><ins>+    if (!IsWebGLBasedSpec(mShaderSpec))
+    {
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (field.type()-&gt;getBasicType() != EbtStruct) {
</del><ins>+    if (field.type()-&gt;getBasicType() != EbtStruct)
+    {
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // We're already inside a structure definition at this point, so add
</span><span class="cx">     // one to the field's struct nesting.
</span><del>-    if (1 + field.type()-&gt;getDeepestStructNesting() &gt; kWebGLMaxStructNesting) {
</del><ins>+    if (1 + field.type()-&gt;getDeepestStructNesting() &gt; kWebGLMaxStructNesting)
+    {
</ins><span class="cx">         std::stringstream reasonStream;
</span><del>-        reasonStream &lt;&lt; &quot;Reference of struct type &quot;
-                     &lt;&lt; field.type()-&gt;getStruct()-&gt;name().c_str()
-                     &lt;&lt; &quot; exceeds maximum allowed nesting level of &quot;
-                     &lt;&lt; kWebGLMaxStructNesting;
</del><ins>+        reasonStream &lt;&lt; &quot;Reference of struct type &quot; &lt;&lt; field.type()-&gt;getStruct()-&gt;name().c_str()
+                     &lt;&lt; &quot; exceeds maximum allowed nesting level of &quot; &lt;&lt; kWebGLMaxStructNesting;
</ins><span class="cx">         std::string reason = reasonStream.str();
</span><span class="cx">         error(line, reason.c_str(), field.name().c_str(), &quot;&quot;);
</span><span class="cx">         return true;
</span><span class="lines">@@ -2148,7 +2771,9 @@
</span><span class="cx"> //
</span><span class="cx"> // Parse an array index expression
</span><span class="cx"> //
</span><del>-TIntermTyped* TParseContext::addIndexExpression(TIntermTyped *baseExpression, const TSourceLoc&amp; location, TIntermTyped *indexExpression)
</del><ins>+TIntermTyped *TParseContext::addIndexExpression(TIntermTyped *baseExpression,
+                                                const TSourceLoc &amp;location,
+                                                TIntermTyped *indexExpression)
</ins><span class="cx"> {
</span><span class="cx">     TIntermTyped *indexedExpression = NULL;
</span><span class="cx"> 
</span><span class="lines">@@ -2156,7 +2781,8 @@
</span><span class="cx">     {
</span><span class="cx">         if (baseExpression-&gt;getAsSymbolNode())
</span><span class="cx">         {
</span><del>-            error(location, &quot; left of '[' is not of type array, matrix, or vector &quot;, baseExpression-&gt;getAsSymbolNode()-&gt;getSymbol().c_str());
</del><ins>+            error(location, &quot; left of '[' is not of type array, matrix, or vector &quot;,
+                  baseExpression-&gt;getAsSymbolNode()-&gt;getSymbol().c_str());
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="lines">@@ -2167,37 +2793,73 @@
</span><span class="cx"> 
</span><span class="cx">     TIntermConstantUnion *indexConstantUnion = indexExpression-&gt;getAsConstantUnion();
</span><span class="cx"> 
</span><del>-    if (indexExpression-&gt;getQualifier() == EvqConst &amp;&amp; indexConstantUnion)
</del><ins>+    // TODO(oetuaho@nvidia.com): Get rid of indexConstantUnion == nullptr below once ANGLE is able
+    // to constant fold all constant expressions. Right now we don't allow indexing interface blocks
+    // or fragment outputs with expressions that ANGLE is not able to constant fold, even if the
+    // index is a constant expression.
+    if (indexExpression-&gt;getQualifier() != EvqConst || indexConstantUnion == nullptr)
</ins><span class="cx">     {
</span><ins>+        if (baseExpression-&gt;isInterfaceBlock())
+        {
+            error(
+                location, &quot;&quot;, &quot;[&quot;,
+                &quot;array indexes for interface blocks arrays must be constant integral expressions&quot;);
+            recover();
+        }
+        else if (baseExpression-&gt;getQualifier() == EvqFragmentOut)
+        {
+            error(location, &quot;&quot;, &quot;[&quot;,
+                  &quot;array indexes for fragment outputs must be constant integral expressions&quot;);
+            recover();
+        }
+        else if (mShaderSpec == SH_WEBGL2_SPEC &amp;&amp; baseExpression-&gt;getQualifier() == EvqFragData)
+        {
+            error(location, &quot;&quot;, &quot;[&quot;, &quot;array index for gl_FragData must be constant zero&quot;);
+            recover();
+        }
+    }
+
+    if (indexConstantUnion)
+    {
+        // If the index is not qualified as constant, the behavior in the spec is undefined. This
+        // applies even if ANGLE has been able to constant fold it (ANGLE may constant fold
+        // expressions that are not constant expressions). The most compatible way to handle this
+        // case is to report a warning instead of an error and force the index to be in the
+        // correct range.
+        bool outOfRangeIndexIsError = indexExpression-&gt;getQualifier() == EvqConst;
</ins><span class="cx">         int index = indexConstantUnion-&gt;getIConst(0);
</span><span class="cx">         if (index &lt; 0)
</span><span class="cx">         {
</span><span class="cx">             std::stringstream infoStream;
</span><span class="cx">             infoStream &lt;&lt; index;
</span><span class="cx">             std::string info = infoStream.str();
</span><del>-            error(location, &quot;negative index&quot;, info.c_str());
-            recover();
</del><ins>+            outOfRangeError(outOfRangeIndexIsError, location, &quot;negative index&quot;, info.c_str());
</ins><span class="cx">             index = 0;
</span><span class="cx">         }
</span><del>-        if (baseExpression-&gt;getType().getQualifier() == EvqConst)
</del><ins>+        TIntermConstantUnion *baseConstantUnion = baseExpression-&gt;getAsConstantUnion();
+        if (baseConstantUnion)
</ins><span class="cx">         {
</span><span class="cx">             if (baseExpression-&gt;isArray())
</span><span class="cx">             {
</span><del>-                // constant folding for arrays
-                indexedExpression = addConstArrayNode(index, baseExpression, location);
</del><ins>+                // constant folding for array indexing
+                indexedExpression =
+                    addConstArrayNode(index, baseConstantUnion, location, outOfRangeIndexIsError);
</ins><span class="cx">             }
</span><span class="cx">             else if (baseExpression-&gt;isVector())
</span><span class="cx">             {
</span><del>-                // constant folding for vectors
</del><ins>+                // constant folding for vector indexing
</ins><span class="cx">                 TVectorFields fields;
</span><span class="cx">                 fields.num = 1;
</span><del>-                fields.offsets[0] = index; // need to do it this way because v.xy sends fields integer array
-                indexedExpression = addConstVectorNode(fields, baseExpression, location);
</del><ins>+                fields.offsets[0] =
+                    index;  // need to do it this way because v.xy sends fields integer array
+                indexedExpression =
+                    addConstVectorNode(fields, baseConstantUnion, location, outOfRangeIndexIsError);
</ins><span class="cx">             }
</span><span class="cx">             else if (baseExpression-&gt;isMatrix())
</span><span class="cx">             {
</span><del>-                // constant folding for matrices
-                indexedExpression = addConstMatrixNode(index, baseExpression, location);
</del><ins>+                // constant folding for matrix indexing
+                indexedExpression =
+                    addConstMatrixNode(index, baseConstantUnion, location, outOfRangeIndexIsError);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="lines">@@ -2206,34 +2868,50 @@
</span><span class="cx"> 
</span><span class="cx">             if (baseExpression-&gt;isArray())
</span><span class="cx">             {
</span><del>-                if (index &gt;= baseExpression-&gt;getType().getArraySize())
</del><ins>+                if (baseExpression-&gt;getQualifier() == EvqFragData &amp;&amp; index &gt; 0)
</ins><span class="cx">                 {
</span><ins>+                    if (mShaderSpec == SH_WEBGL2_SPEC)
+                    {
+                        // Error has been already generated if index is not const.
+                        if (indexExpression-&gt;getQualifier() == EvqConst)
+                        {
+                            error(location, &quot;&quot;, &quot;[&quot;,
+                                  &quot;array index for gl_FragData must be constant zero&quot;);
+                            recover();
+                        }
+                        safeIndex = 0;
+                    }
+                    else if (!isExtensionEnabled(&quot;GL_EXT_draw_buffers&quot;))
+                    {
+                        outOfRangeError(outOfRangeIndexIsError, location, &quot;&quot;, &quot;[&quot;,
+                                        &quot;array index for gl_FragData must be zero when &quot;
+                                        &quot;GL_EXT_draw_buffers is disabled&quot;);
+                        safeIndex = 0;
+                    }
+                }
+                // Only do generic out-of-range check if similar error hasn't already been reported.
+                if (safeIndex &lt; 0 &amp;&amp; index &gt;= baseExpression-&gt;getType().getArraySize())
+                {
</ins><span class="cx">                     std::stringstream extraInfoStream;
</span><span class="cx">                     extraInfoStream &lt;&lt; &quot;array index out of range '&quot; &lt;&lt; index &lt;&lt; &quot;'&quot;;
</span><span class="cx">                     std::string extraInfo = extraInfoStream.str();
</span><del>-                    error(location, &quot;&quot;, &quot;[&quot;, extraInfo.c_str());
-                    recover();
</del><ins>+                    outOfRangeError(outOfRangeIndexIsError, location, &quot;&quot;, &quot;[&quot;, extraInfo.c_str());
</ins><span class="cx">                     safeIndex = baseExpression-&gt;getType().getArraySize() - 1;
</span><span class="cx">                 }
</span><del>-                else if (baseExpression-&gt;getQualifier() == EvqFragData &amp;&amp; index &gt; 0 &amp;&amp; !isExtensionEnabled(&quot;GL_EXT_draw_buffers&quot;))
-                {
-                    error(location, &quot;&quot;, &quot;[&quot;, &quot;array indexes for gl_FragData must be zero when GL_EXT_draw_buffers is disabled&quot;);
-                    recover();
-                    safeIndex = 0;
-                }
</del><span class="cx">             }
</span><del>-            else if ((baseExpression-&gt;isVector() || baseExpression-&gt;isMatrix()) &amp;&amp; baseExpression-&gt;getType().getNominalSize() &lt;= index)
</del><ins>+            else if ((baseExpression-&gt;isVector() || baseExpression-&gt;isMatrix()) &amp;&amp;
+                     baseExpression-&gt;getType().getNominalSize() &lt;= index)
</ins><span class="cx">             {
</span><span class="cx">                 std::stringstream extraInfoStream;
</span><span class="cx">                 extraInfoStream &lt;&lt; &quot;field selection out of range '&quot; &lt;&lt; index &lt;&lt; &quot;'&quot;;
</span><span class="cx">                 std::string extraInfo = extraInfoStream.str();
</span><del>-                error(location, &quot;&quot;, &quot;[&quot;, extraInfo.c_str());
-                recover();
</del><ins>+                outOfRangeError(outOfRangeIndexIsError, location, &quot;&quot;, &quot;[&quot;, extraInfo.c_str());
</ins><span class="cx">                 safeIndex = baseExpression-&gt;getType().getNominalSize() - 1;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            // Don't modify the data of the previous constant union, because it can point
-            // to builtins, like gl_MaxDrawBuffers. Instead use a new sanitized object.
</del><ins>+            // Data of constant unions can't be changed, because it may be shared with other
+            // constant unions or even builtins, like gl_MaxDrawBuffers. Instead use a new
+            // sanitized object.
</ins><span class="cx">             if (safeIndex != -1)
</span><span class="cx">             {
</span><span class="cx">                 TConstantUnion *safeConstantUnion = new TConstantUnion();
</span><span class="lines">@@ -2241,74 +2919,62 @@
</span><span class="cx">                 indexConstantUnion-&gt;replaceConstantUnion(safeConstantUnion);
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            indexedExpression = intermediate.addIndex(EOpIndexDirect, baseExpression, indexExpression, location);
</del><ins>+            indexedExpression =
+                intermediate.addIndex(EOpIndexDirect, baseExpression, indexExpression, location);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        if (baseExpression-&gt;isInterfaceBlock())
-        {
-            error(location, &quot;&quot;, &quot;[&quot;, &quot;array indexes for interface blocks arrays must be constant integral expressions&quot;);
-            recover();
-        }
-        else if (baseExpression-&gt;getQualifier() == EvqFragmentOut)
-        {
-            error(location, &quot;&quot;, &quot;[&quot;, &quot;array indexes for fragment outputs must be constant integral expressions&quot;);
-            recover();
-        }
-
-        indexedExpression = intermediate.addIndex(EOpIndexIndirect, baseExpression, indexExpression, location);
</del><ins>+        indexedExpression =
+            intermediate.addIndex(EOpIndexIndirect, baseExpression, indexExpression, location);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (indexedExpression == 0)
</span><span class="cx">     {
</span><span class="cx">         TConstantUnion *unionArray = new TConstantUnion[1];
</span><span class="cx">         unionArray-&gt;setFConst(0.0f);
</span><del>-        indexedExpression = intermediate.addConstantUnion(unionArray, TType(EbtFloat, EbpHigh, EvqConst), location);
</del><ins>+        indexedExpression =
+            intermediate.addConstantUnion(unionArray, TType(EbtFloat, EbpHigh, EvqConst), location);
</ins><span class="cx">     }
</span><span class="cx">     else if (baseExpression-&gt;isArray())
</span><span class="cx">     {
</span><del>-        const TType &amp;baseType = baseExpression-&gt;getType();
-        if (baseType.getStruct())
-        {
-            TType copyOfType(baseType.getStruct());
-            indexedExpression-&gt;setType(copyOfType);
-        }
-        else if (baseType.isInterfaceBlock())
-        {
-            TType copyOfType(baseType.getInterfaceBlock(), baseType.getQualifier(), baseType.getLayoutQualifier(), 0);
-            indexedExpression-&gt;setType(copyOfType);
-        }
-        else
-        {
-            indexedExpression-&gt;setType(TType(baseExpression-&gt;getBasicType(), baseExpression-&gt;getPrecision(), EvqTemporary,
-                                       static_cast&lt;unsigned char&gt;(baseExpression-&gt;getNominalSize()), static_cast&lt;unsigned char&gt;(baseExpression-&gt;getSecondarySize())));
-        }
-
-        if (baseExpression-&gt;getType().getQualifier() == EvqConst)
-        {
-            indexedExpression-&gt;getTypePointer()-&gt;setQualifier(EvqConst);
-        }
</del><ins>+        TType indexedType = baseExpression-&gt;getType();
+        indexedType.clearArrayness();
+        indexedExpression-&gt;setType(indexedType);
</ins><span class="cx">     }
</span><span class="cx">     else if (baseExpression-&gt;isMatrix())
</span><span class="cx">     {
</span><del>-        TQualifier qualifier = baseExpression-&gt;getType().getQualifier() == EvqConst ? EvqConst : EvqTemporary;
-        indexedExpression-&gt;setType(TType(baseExpression-&gt;getBasicType(), baseExpression-&gt;getPrecision(), qualifier, static_cast&lt;unsigned char&gt;(baseExpression-&gt;getRows())));
</del><ins>+        indexedExpression-&gt;setType(TType(baseExpression-&gt;getBasicType(),
+                                         baseExpression-&gt;getPrecision(), EvqTemporary,
+                                         static_cast&lt;unsigned char&gt;(baseExpression-&gt;getRows())));
</ins><span class="cx">     }
</span><span class="cx">     else if (baseExpression-&gt;isVector())
</span><span class="cx">     {
</span><del>-        TQualifier qualifier = baseExpression-&gt;getType().getQualifier() == EvqConst ? EvqConst : EvqTemporary;
-        indexedExpression-&gt;setType(TType(baseExpression-&gt;getBasicType(), baseExpression-&gt;getPrecision(), qualifier));
</del><ins>+        indexedExpression-&gt;setType(
+            TType(baseExpression-&gt;getBasicType(), baseExpression-&gt;getPrecision(), EvqTemporary));
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         indexedExpression-&gt;setType(baseExpression-&gt;getType());
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (baseExpression-&gt;getType().getQualifier() == EvqConst &amp;&amp;
+        indexExpression-&gt;getType().getQualifier() == EvqConst)
+    {
+        indexedExpression-&gt;getTypePointer()-&gt;setQualifier(EvqConst);
+    }
+    else
+    {
+        indexedExpression-&gt;getTypePointer()-&gt;setQualifier(EvqTemporary);
+    }
+
</ins><span class="cx">     return indexedExpression;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped* TParseContext::addFieldSelectionExpression(TIntermTyped *baseExpression, const TSourceLoc&amp; dotLocation, const TString &amp;fieldString, const TSourceLoc&amp; fieldLocation)
</del><ins>+TIntermTyped *TParseContext::addFieldSelectionExpression(TIntermTyped *baseExpression,
+                                                         const TSourceLoc &amp;dotLocation,
+                                                         const TString &amp;fieldString,
+                                                         const TSourceLoc &amp;fieldLocation)
</ins><span class="cx"> {
</span><span class="cx">     TIntermTyped *indexedExpression = NULL;
</span><span class="cx"> 
</span><span class="lines">@@ -2321,71 +2987,43 @@
</span><span class="cx">     if (baseExpression-&gt;isVector())
</span><span class="cx">     {
</span><span class="cx">         TVectorFields fields;
</span><del>-        if (!parseVectorFields(fieldString, baseExpression-&gt;getNominalSize(), fields, fieldLocation))
</del><ins>+        if (!parseVectorFields(fieldString, baseExpression-&gt;getNominalSize(), fields,
+                               fieldLocation))
</ins><span class="cx">         {
</span><del>-            fields.num = 1;
</del><ins>+            fields.num        = 1;
</ins><span class="cx">             fields.offsets[0] = 0;
</span><span class="cx">             recover();
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (baseExpression-&gt;getType().getQualifier() == EvqConst)
</del><ins>+        if (baseExpression-&gt;getAsConstantUnion())
</ins><span class="cx">         {
</span><span class="cx">             // constant folding for vector fields
</span><del>-            indexedExpression = addConstVectorNode(fields, baseExpression, fieldLocation);
-            if (indexedExpression == 0)
-            {
-                recover();
-                indexedExpression = baseExpression;
-            }
-            else
-            {
-                indexedExpression-&gt;setType(TType(baseExpression-&gt;getBasicType(), baseExpression-&gt;getPrecision(), EvqConst, (unsigned char) (fieldString).size()));
-            }
</del><ins>+            indexedExpression = addConstVectorNode(fields, baseExpression-&gt;getAsConstantUnion(),
+                                                   fieldLocation, true);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            TString vectorString = fieldString;
-            TIntermTyped* index = intermediate.addSwizzle(fields, fieldLocation);
-            indexedExpression = intermediate.addIndex(EOpVectorSwizzle, baseExpression, index, dotLocation);
-            indexedExpression-&gt;setType(TType(baseExpression-&gt;getBasicType(), baseExpression-&gt;getPrecision(), EvqTemporary, (unsigned char) vectorString.size()));
</del><ins>+            TIntermTyped *index = intermediate.addSwizzle(fields, fieldLocation);
+            indexedExpression =
+                intermediate.addIndex(EOpVectorSwizzle, baseExpression, index, dotLocation);
</ins><span class="cx">         }
</span><del>-    }
-    else if (baseExpression-&gt;isMatrix())
-    {
-        TMatrixFields fields;
-        if (!parseMatrixFields(fieldString, baseExpression-&gt;getCols(), baseExpression-&gt;getRows(), fields, fieldLocation))
</del><ins>+        if (indexedExpression == nullptr)
</ins><span class="cx">         {
</span><del>-            fields.wholeRow = false;
-            fields.wholeCol = false;
-            fields.row = 0;
-            fields.col = 0;
</del><span class="cx">             recover();
</span><ins>+            indexedExpression = baseExpression;
</ins><span class="cx">         }
</span><del>-
-        if (fields.wholeRow || fields.wholeCol)
-        {
-            error(dotLocation, &quot; non-scalar fields not implemented yet&quot;, &quot;.&quot;);
-            recover();
-            TConstantUnion *unionArray = new TConstantUnion[1];
-            unionArray-&gt;setIConst(0);
-            TIntermTyped* index = intermediate.addConstantUnion(unionArray, TType(EbtInt, EbpUndefined, EvqConst), fieldLocation);
-            indexedExpression = intermediate.addIndex(EOpIndexDirect, baseExpression, index, dotLocation);
-            indexedExpression-&gt;setType(TType(baseExpression-&gt;getBasicType(), baseExpression-&gt;getPrecision(),EvqTemporary,
-                                       static_cast&lt;unsigned char&gt;(baseExpression-&gt;getCols()), static_cast&lt;unsigned char&gt;(baseExpression-&gt;getRows())));
-        }
</del><span class="cx">         else
</span><span class="cx">         {
</span><del>-            TConstantUnion *unionArray = new TConstantUnion[1];
-            unionArray-&gt;setIConst(fields.col * baseExpression-&gt;getRows() + fields.row);
-            TIntermTyped* index = intermediate.addConstantUnion(unionArray, TType(EbtInt, EbpUndefined, EvqConst), fieldLocation);
-            indexedExpression = intermediate.addIndex(EOpIndexDirect, baseExpression, index, dotLocation);
-            indexedExpression-&gt;setType(TType(baseExpression-&gt;getBasicType(), baseExpression-&gt;getPrecision()));
</del><ins>+            // Note that the qualifier set here will be corrected later.
+            indexedExpression-&gt;setType(TType(baseExpression-&gt;getBasicType(),
+                                             baseExpression-&gt;getPrecision(), EvqTemporary,
+                                             (unsigned char)(fieldString).size()));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     else if (baseExpression-&gt;getBasicType() == EbtStruct)
</span><span class="cx">     {
</span><del>-        bool fieldFound = false;
-        const TFieldList&amp; fields = baseExpression-&gt;getType().getStruct()-&gt;fields();
</del><ins>+        bool fieldFound          = false;
+        const TFieldList &amp;fields = baseExpression-&gt;getType().getStruct()-&gt;fields();
</ins><span class="cx">         if (fields.empty())
</span><span class="cx">         {
</span><span class="cx">             error(dotLocation, &quot;structure has no fields&quot;, &quot;Internal Error&quot;);
</span><span class="lines">@@ -2405,7 +3043,7 @@
</span><span class="cx">             }
</span><span class="cx">             if (fieldFound)
</span><span class="cx">             {
</span><del>-                if (baseExpression-&gt;getType().getQualifier() == EvqConst)
</del><ins>+                if (baseExpression-&gt;getAsConstantUnion())
</ins><span class="cx">                 {
</span><span class="cx">                     indexedExpression = addConstStruct(fieldString, baseExpression, dotLocation);
</span><span class="cx">                     if (indexedExpression == 0)
</span><span class="lines">@@ -2416,17 +3054,16 @@
</span><span class="cx">                     else
</span><span class="cx">                     {
</span><span class="cx">                         indexedExpression-&gt;setType(*fields[i]-&gt;type());
</span><del>-                        // change the qualifier of the return type, not of the structure field
-                        // as the structure definition is shared between various structures.
-                        indexedExpression-&gt;getTypePointer()-&gt;setQualifier(EvqConst);
</del><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="cx">                 else
</span><span class="cx">                 {
</span><span class="cx">                     TConstantUnion *unionArray = new TConstantUnion[1];
</span><span class="cx">                     unionArray-&gt;setIConst(i);
</span><del>-                    TIntermTyped* index = intermediate.addConstantUnion(unionArray, *fields[i]-&gt;type(), fieldLocation);
-                    indexedExpression = intermediate.addIndex(EOpIndexDirectStruct, baseExpression, index, dotLocation);
</del><ins>+                    TIntermTyped *index = intermediate.addConstantUnion(
+                        unionArray, *fields[i]-&gt;type(), fieldLocation);
+                    indexedExpression = intermediate.addIndex(EOpIndexDirectStruct, baseExpression,
+                                                              index, dotLocation);
</ins><span class="cx">                     indexedExpression-&gt;setType(*fields[i]-&gt;type());
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="lines">@@ -2440,8 +3077,8 @@
</span><span class="cx">     }
</span><span class="cx">     else if (baseExpression-&gt;isInterfaceBlock())
</span><span class="cx">     {
</span><del>-        bool fieldFound = false;
-        const TFieldList&amp; fields = baseExpression-&gt;getType().getInterfaceBlock()-&gt;fields();
</del><ins>+        bool fieldFound          = false;
+        const TFieldList &amp;fields = baseExpression-&gt;getType().getInterfaceBlock()-&gt;fields();
</ins><span class="cx">         if (fields.empty())
</span><span class="cx">         {
</span><span class="cx">             error(dotLocation, &quot;interface block has no fields&quot;, &quot;Internal Error&quot;);
</span><span class="lines">@@ -2463,8 +3100,10 @@
</span><span class="cx">             {
</span><span class="cx">                 TConstantUnion *unionArray = new TConstantUnion[1];
</span><span class="cx">                 unionArray-&gt;setIConst(i);
</span><del>-                TIntermTyped* index = intermediate.addConstantUnion(unionArray, *fields[i]-&gt;type(), fieldLocation);
-                indexedExpression = intermediate.addIndex(EOpIndexDirectInterfaceBlock, baseExpression, index, dotLocation);
</del><ins>+                TIntermTyped *index =
+                    intermediate.addConstantUnion(unionArray, *fields[i]-&gt;type(), fieldLocation);
+                indexedExpression = intermediate.addIndex(EOpIndexDirectInterfaceBlock,
+                                                          baseExpression, index, dotLocation);
</ins><span class="cx">                 indexedExpression-&gt;setType(*fields[i]-&gt;type());
</span><span class="cx">             }
</span><span class="cx">             else
</span><span class="lines">@@ -2477,28 +3116,42 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        if (shaderVersion &lt; 300)
</del><ins>+        if (mShaderVersion &lt; 300)
</ins><span class="cx">         {
</span><del>-            error(dotLocation, &quot; field selection requires structure, vector, or matrix on left hand side&quot;, fieldString.c_str());
</del><ins>+            error(dotLocation, &quot; field selection requires structure or vector on left hand side&quot;,
+                  fieldString.c_str());
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            error(dotLocation, &quot; field selection requires structure, vector, matrix, or interface block on left hand side&quot;, fieldString.c_str());
</del><ins>+            error(dotLocation,
+                  &quot; field selection requires structure, vector, or interface block on left hand &quot;
+                  &quot;side&quot;,
+                  fieldString.c_str());
</ins><span class="cx">         }
</span><span class="cx">         recover();
</span><span class="cx">         indexedExpression = baseExpression;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (baseExpression-&gt;getQualifier() == EvqConst)
+    {
+        indexedExpression-&gt;getTypePointer()-&gt;setQualifier(EvqConst);
+    }
+    else
+    {
+        indexedExpression-&gt;getTypePointer()-&gt;setQualifier(EvqTemporary);
+    }
+
</ins><span class="cx">     return indexedExpression;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &amp;qualifierType, const TSourceLoc&amp; qualifierTypeLine)
</del><ins>+TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &amp;qualifierType,
+                                                     const TSourceLoc &amp;qualifierTypeLine)
</ins><span class="cx"> {
</span><span class="cx">     TLayoutQualifier qualifier;
</span><span class="cx"> 
</span><del>-    qualifier.location = -1;
</del><ins>+    qualifier.location      = -1;
</ins><span class="cx">     qualifier.matrixPacking = EmpUnspecified;
</span><del>-    qualifier.blockStorage = EbsUnspecified;
</del><ins>+    qualifier.blockStorage  = EbsUnspecified;
</ins><span class="cx"> 
</span><span class="cx">     if (qualifierType == &quot;shared&quot;)
</span><span class="cx">     {
</span><span class="lines">@@ -2522,7 +3175,8 @@
</span><span class="cx">     }
</span><span class="cx">     else if (qualifierType == &quot;location&quot;)
</span><span class="cx">     {
</span><del>-        error(qualifierTypeLine, &quot;invalid layout qualifier&quot;, qualifierType.c_str(), &quot;location requires an argument&quot;);
</del><ins>+        error(qualifierTypeLine, &quot;invalid layout qualifier&quot;, qualifierType.c_str(),
+              &quot;location requires an argument&quot;);
</ins><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="lines">@@ -2534,17 +3188,22 @@
</span><span class="cx">     return qualifier;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &amp;qualifierType, const TSourceLoc&amp; qualifierTypeLine, const TString &amp;intValueString, int intValue, const TSourceLoc&amp; intValueLine)
</del><ins>+TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &amp;qualifierType,
+                                                     const TSourceLoc &amp;qualifierTypeLine,
+                                                     const TString &amp;intValueString,
+                                                     int intValue,
+                                                     const TSourceLoc &amp;intValueLine)
</ins><span class="cx"> {
</span><span class="cx">     TLayoutQualifier qualifier;
</span><span class="cx"> 
</span><del>-    qualifier.location = -1;
</del><ins>+    qualifier.location      = -1;
</ins><span class="cx">     qualifier.matrixPacking = EmpUnspecified;
</span><del>-    qualifier.blockStorage = EbsUnspecified;
</del><ins>+    qualifier.blockStorage  = EbsUnspecified;
</ins><span class="cx"> 
</span><span class="cx">     if (qualifierType != &quot;location&quot;)
</span><span class="cx">     {
</span><del>-        error(qualifierTypeLine, &quot;invalid layout qualifier&quot;, qualifierType.c_str(), &quot;only location may have arguments&quot;);
</del><ins>+        error(qualifierTypeLine, &quot;invalid layout qualifier&quot;, qualifierType.c_str(),
+              &quot;only location may have arguments&quot;);
</ins><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="lines">@@ -2552,7 +3211,8 @@
</span><span class="cx">         // must check that location is non-negative
</span><span class="cx">         if (intValue &lt; 0)
</span><span class="cx">         {
</span><del>-            error(intValueLine, &quot;out of range:&quot;, intValueString.c_str(), &quot;location must be non-negative&quot;);
</del><ins>+            error(intValueLine, &quot;out of range:&quot;, intValueString.c_str(),
+                  &quot;location must be non-negative&quot;);
</ins><span class="cx">             recover();
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="lines">@@ -2564,7 +3224,8 @@
</span><span class="cx">     return qualifier;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TLayoutQualifier TParseContext::joinLayoutQualifiers(TLayoutQualifier leftQualifier, TLayoutQualifier rightQualifier)
</del><ins>+TLayoutQualifier TParseContext::joinLayoutQualifiers(TLayoutQualifier leftQualifier,
+                                                     TLayoutQualifier rightQualifier)
</ins><span class="cx"> {
</span><span class="cx">     TLayoutQualifier joinedQualifier = leftQualifier;
</span><span class="cx"> 
</span><span class="lines">@@ -2584,41 +3245,54 @@
</span><span class="cx">     return joinedQualifier;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TPublicType TParseContext::joinInterpolationQualifiers(const TSourceLoc &amp;interpolationLoc, TQualifier interpolationQualifier,
-                                                       const TSourceLoc &amp;storageLoc, TQualifier storageQualifier)
</del><ins>+TPublicType TParseContext::joinInterpolationQualifiers(const TSourceLoc &amp;interpolationLoc,
+                                                       TQualifier interpolationQualifier,
+                                                       const TSourceLoc &amp;storageLoc,
+                                                       TQualifier storageQualifier)
</ins><span class="cx"> {
</span><span class="cx">     TQualifier mergedQualifier = EvqSmoothIn;
</span><span class="cx"> 
</span><del>-    if (storageQualifier == EvqFragmentIn) {
</del><ins>+    if (storageQualifier == EvqFragmentIn)
+    {
</ins><span class="cx">         if (interpolationQualifier == EvqSmooth)
</span><span class="cx">             mergedQualifier = EvqSmoothIn;
</span><span class="cx">         else if (interpolationQualifier == EvqFlat)
</span><span class="cx">             mergedQualifier = EvqFlatIn;
</span><del>-        else UNREACHABLE();
</del><ins>+        else
+            UNREACHABLE();
</ins><span class="cx">     }
</span><del>-    else if (storageQualifier == EvqCentroidIn) {
</del><ins>+    else if (storageQualifier == EvqCentroidIn)
+    {
</ins><span class="cx">         if (interpolationQualifier == EvqSmooth)
</span><span class="cx">             mergedQualifier = EvqCentroidIn;
</span><span class="cx">         else if (interpolationQualifier == EvqFlat)
</span><span class="cx">             mergedQualifier = EvqFlatIn;
</span><del>-        else UNREACHABLE();
</del><ins>+        else
+            UNREACHABLE();
</ins><span class="cx">     }
</span><del>-    else if (storageQualifier == EvqVertexOut) {
</del><ins>+    else if (storageQualifier == EvqVertexOut)
+    {
</ins><span class="cx">         if (interpolationQualifier == EvqSmooth)
</span><span class="cx">             mergedQualifier = EvqSmoothOut;
</span><span class="cx">         else if (interpolationQualifier == EvqFlat)
</span><span class="cx">             mergedQualifier = EvqFlatOut;
</span><del>-        else UNREACHABLE();
</del><ins>+        else
+            UNREACHABLE();
</ins><span class="cx">     }
</span><del>-    else if (storageQualifier == EvqCentroidOut) {
</del><ins>+    else if (storageQualifier == EvqCentroidOut)
+    {
</ins><span class="cx">         if (interpolationQualifier == EvqSmooth)
</span><span class="cx">             mergedQualifier = EvqCentroidOut;
</span><span class="cx">         else if (interpolationQualifier == EvqFlat)
</span><span class="cx">             mergedQualifier = EvqFlatOut;
</span><del>-        else UNREACHABLE();
</del><ins>+        else
+            UNREACHABLE();
</ins><span class="cx">     }
</span><del>-    else {
-        error(interpolationLoc, &quot;interpolation qualifier requires a fragment 'in' or vertex 'out' storage qualifier&quot;, getInterpolationString(interpolationQualifier));
</del><ins>+    else
+    {
+        error(interpolationLoc,
+              &quot;interpolation qualifier requires a fragment 'in' or vertex 'out' storage qualifier&quot;,
+              getInterpolationString(interpolationQualifier));
</ins><span class="cx">         recover();
</span><span class="cx"> 
</span><span class="cx">         mergedQualifier = storageQualifier;
</span><span class="lines">@@ -2629,18 +3303,20 @@
</span><span class="cx">     return type;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TFieldList *TParseContext::addStructDeclaratorList(const TPublicType&amp; typeSpecifier, TFieldList *fieldList)
</del><ins>+TFieldList *TParseContext::addStructDeclaratorList(const TPublicType &amp;typeSpecifier,
+                                                   TFieldList *fieldList)
</ins><span class="cx"> {
</span><span class="cx">     if (voidErrorCheck(typeSpecifier.line, (*fieldList)[0]-&gt;name(), typeSpecifier.type))
</span><span class="cx">     {
</span><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (unsigned int i = 0; i &lt; fieldList-&gt;size(); ++i) {
</del><ins>+    for (unsigned int i = 0; i &lt; fieldList-&gt;size(); ++i)
+    {
</ins><span class="cx">         //
</span><span class="cx">         // Careful not to replace already known aspects of type, like array-ness
</span><span class="cx">         //
</span><del>-        TType* type = (*fieldList)[i]-&gt;type();
</del><ins>+        TType *type = (*fieldList)[i]-&gt;type();
</ins><span class="cx">         type-&gt;setBasicType(typeSpecifier.type);
</span><span class="cx">         type-&gt;setPrimarySize(typeSpecifier.primarySize);
</span><span class="cx">         type-&gt;setSecondarySize(typeSpecifier.secondarySize);
</span><span class="lines">@@ -2649,17 +3325,20 @@
</span><span class="cx">         type-&gt;setLayoutQualifier(typeSpecifier.layoutQualifier);
</span><span class="cx"> 
</span><span class="cx">         // don't allow arrays of arrays
</span><del>-        if (type-&gt;isArray()) {
</del><ins>+        if (type-&gt;isArray())
+        {
</ins><span class="cx">             if (arrayTypeErrorCheck(typeSpecifier.line, typeSpecifier))
</span><span class="cx">                 recover();
</span><span class="cx">         }
</span><span class="cx">         if (typeSpecifier.array)
</span><span class="cx">             type-&gt;setArraySize(typeSpecifier.arraySize);
</span><del>-        if (typeSpecifier.userDef) {
</del><ins>+        if (typeSpecifier.userDef)
+        {
</ins><span class="cx">             type-&gt;setStruct(typeSpecifier.userDef-&gt;getStruct());
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (structNestingErrorCheck(typeSpecifier.line, *(*fieldList)[i])) {
</del><ins>+        if (structNestingErrorCheck(typeSpecifier.line, *(*fieldList)[i]))
+        {
</ins><span class="cx">             recover();
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -2667,10 +3346,13 @@
</span><span class="cx">     return fieldList;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TPublicType TParseContext::addStructure(const TSourceLoc&amp; structLine, const TSourceLoc&amp; nameLine, const TString *structName, TFieldList* fieldList)
</del><ins>+TPublicType TParseContext::addStructure(const TSourceLoc &amp;structLine,
+                                        const TSourceLoc &amp;nameLine,
+                                        const TString *structName,
+                                        TFieldList *fieldList)
</ins><span class="cx"> {
</span><del>-    TStructure* structure = new TStructure(structName, fieldList);
-    TType* structureType = new TType(structure);
</del><ins>+    TStructure *structure = new TStructure(structName, fieldList);
+    TType *structureType  = new TType(structure);
</ins><span class="cx"> 
</span><span class="cx">     // Store a bool in the struct if we're at global scope, to allow us to
</span><span class="cx">     // skip the local struct scoping workaround in HLSL.
</span><span class="lines">@@ -2683,8 +3365,9 @@
</span><span class="cx">         {
</span><span class="cx">             recover();
</span><span class="cx">         }
</span><del>-        TVariable* userTypeDef = new TVariable(structName, *structureType, true);
-        if (!symbolTable.declare(userTypeDef)) {
</del><ins>+        TVariable *userTypeDef = new TVariable(structName, *structureType, true);
+        if (!symbolTable.declare(userTypeDef))
+        {
</ins><span class="cx">             error(nameLine, &quot;redefinition&quot;, structName-&gt;c_str(), &quot;struct&quot;);
</span><span class="cx">             recover();
</span><span class="cx">         }
</span><span class="lines">@@ -2693,37 +3376,40 @@
</span><span class="cx">     // ensure we do not specify any storage qualifiers on the struct members
</span><span class="cx">     for (unsigned int typeListIndex = 0; typeListIndex &lt; fieldList-&gt;size(); typeListIndex++)
</span><span class="cx">     {
</span><del>-        const TField &amp;field = *(*fieldList)[typeListIndex];
</del><ins>+        const TField &amp;field        = *(*fieldList)[typeListIndex];
</ins><span class="cx">         const TQualifier qualifier = field.type()-&gt;getQualifier();
</span><span class="cx">         switch (qualifier)
</span><span class="cx">         {
</span><del>-          case EvqGlobal:
-          case EvqTemporary:
-            break;
-          default:
-            error(field.line(), &quot;invalid qualifier on struct member&quot;, getQualifierString(qualifier));
-            recover();
-            break;
</del><ins>+            case EvqGlobal:
+            case EvqTemporary:
+                break;
+            default:
+                error(field.line(), &quot;invalid qualifier on struct member&quot;,
+                      getQualifierString(qualifier));
+                recover();
+                break;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     TPublicType publicType;
</span><span class="cx">     publicType.setBasic(EbtStruct, EvqTemporary, structLine);
</span><span class="cx">     publicType.userDef = structureType;
</span><ins>+    publicType.isStructSpecifier = true;
</ins><span class="cx">     exitStructDeclaration();
</span><span class="cx"> 
</span><span class="cx">     return publicType;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermSwitch *TParseContext::addSwitch(TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &amp;loc)
</del><ins>+TIntermSwitch *TParseContext::addSwitch(TIntermTyped *init,
+                                        TIntermAggregate *statementList,
+                                        const TSourceLoc &amp;loc)
</ins><span class="cx"> {
</span><span class="cx">     TBasicType switchType = init-&gt;getBasicType();
</span><del>-    if ((switchType != EbtInt &amp;&amp; switchType != EbtUInt) ||
-        init-&gt;isMatrix() ||
-        init-&gt;isArray() ||
</del><ins>+    if ((switchType != EbtInt &amp;&amp; switchType != EbtUInt) || init-&gt;isMatrix() || init-&gt;isArray() ||
</ins><span class="cx">         init-&gt;isVector())
</span><span class="cx">     {
</span><del>-        error(init-&gt;getLine(), &quot;init-expression in a switch statement must be a scalar integer&quot;, &quot;switch&quot;);
</del><ins>+        error(init-&gt;getLine(), &quot;init-expression in a switch statement must be a scalar integer&quot;,
+              &quot;switch&quot;);
</ins><span class="cx">         recover();
</span><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="lines">@@ -2762,15 +3448,16 @@
</span><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="cx">     if ((condition-&gt;getBasicType() != EbtInt &amp;&amp; condition-&gt;getBasicType() != EbtUInt) ||
</span><del>-        condition-&gt;isMatrix() ||
-        condition-&gt;isArray() ||
-        condition-&gt;isVector())
</del><ins>+        condition-&gt;isMatrix() || condition-&gt;isArray() || condition-&gt;isVector())
</ins><span class="cx">     {
</span><span class="cx">         error(condition-&gt;getLine(), &quot;case label must be a scalar integer&quot;, &quot;case&quot;);
</span><span class="cx">         recover();
</span><span class="cx">     }
</span><span class="cx">     TIntermConstantUnion *conditionConst = condition-&gt;getAsConstantUnion();
</span><del>-    if (conditionConst == nullptr)
</del><ins>+    // TODO(oetuaho@nvidia.com): Get rid of the conditionConst == nullptr check once all constant
+    // expressions can be folded. Right now we don't allow constant expressions that ANGLE can't
+    // fold in case labels.
+    if (condition-&gt;getQualifier() != EvqConst || conditionConst == nullptr)
</ins><span class="cx">     {
</span><span class="cx">         error(condition-&gt;getLine(), &quot;case label must be constant&quot;, &quot;case&quot;);
</span><span class="cx">         recover();
</span><span class="lines">@@ -2803,8 +3490,10 @@
</span><span class="cx">     return node;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped *TParseContext::createUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &amp;loc,
-    const TType *funcReturnType)
</del><ins>+TIntermTyped *TParseContext::createUnaryMath(TOperator op,
+                                             TIntermTyped *child,
+                                             const TSourceLoc &amp;loc,
+                                             const TType *funcReturnType)
</ins><span class="cx"> {
</span><span class="cx">     if (child == nullptr)
</span><span class="cx">     {
</span><span class="lines">@@ -2813,38 +3502,34 @@
</span><span class="cx"> 
</span><span class="cx">     switch (op)
</span><span class="cx">     {
</span><del>-      case EOpLogicalNot:
-        if (child-&gt;getBasicType() != EbtBool ||
-            child-&gt;isMatrix() ||
-            child-&gt;isArray() ||
-            child-&gt;isVector())
-        {
-            return nullptr;
-        }
-        break;
-      case EOpBitwiseNot:
-        if ((child-&gt;getBasicType() != EbtInt &amp;&amp; child-&gt;getBasicType() != EbtUInt) ||
-            child-&gt;isMatrix() ||
-            child-&gt;isArray())
-        {
-            return nullptr;
-        }
-        break;
-      case EOpPostIncrement:
-      case EOpPreIncrement:
-      case EOpPostDecrement:
-      case EOpPreDecrement:
-      case EOpNegative:
-      case EOpPositive:
-        if (child-&gt;getBasicType() == EbtStruct ||
-            child-&gt;getBasicType() == EbtBool ||
-            child-&gt;isArray())
-        {
-            return nullptr;
-        }
-      // Operators for built-ins are already type checked against their prototype.
-      default:
-        break;
</del><ins>+        case EOpLogicalNot:
+            if (child-&gt;getBasicType() != EbtBool || child-&gt;isMatrix() || child-&gt;isArray() ||
+                child-&gt;isVector())
+            {
+                return nullptr;
+            }
+            break;
+        case EOpBitwiseNot:
+            if ((child-&gt;getBasicType() != EbtInt &amp;&amp; child-&gt;getBasicType() != EbtUInt) ||
+                child-&gt;isMatrix() || child-&gt;isArray())
+            {
+                return nullptr;
+            }
+            break;
+        case EOpPostIncrement:
+        case EOpPreIncrement:
+        case EOpPostDecrement:
+        case EOpPreDecrement:
+        case EOpNegative:
+        case EOpPositive:
+            if (child-&gt;getBasicType() == EbtStruct || child-&gt;getBasicType() == EbtBool ||
+                child-&gt;isArray())
+            {
+                return nullptr;
+            }
+        // Operators for built-ins are already type checked against their prototype.
+        default:
+            break;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return intermediate.addUnaryMath(op, child, loc, funcReturnType);
</span><span class="lines">@@ -2862,19 +3547,23 @@
</span><span class="cx">     return node;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped *TParseContext::addUnaryMathLValue(TOperator op, TIntermTyped *child, const TSourceLoc &amp;loc)
</del><ins>+TIntermTyped *TParseContext::addUnaryMathLValue(TOperator op,
+                                                TIntermTyped *child,
+                                                const TSourceLoc &amp;loc)
</ins><span class="cx"> {
</span><span class="cx">     if (lValueErrorCheck(loc, GetOperatorString(op), child))
</span><span class="cx">         recover();
</span><span class="cx">     return addUnaryMath(op, child, loc);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TParseContext::binaryOpCommonCheck(TOperator op, TIntermTyped *left, TIntermTyped *right,
-    const TSourceLoc &amp;loc)
</del><ins>+bool TParseContext::binaryOpCommonCheck(TOperator op,
+                                        TIntermTyped *left,
+                                        TIntermTyped *right,
+                                        const TSourceLoc &amp;loc)
</ins><span class="cx"> {
</span><span class="cx">     if (left-&gt;isArray() || right-&gt;isArray())
</span><span class="cx">     {
</span><del>-        if (shaderVersion &lt; 300)
</del><ins>+        if (mShaderVersion &lt; 300)
</ins><span class="cx">         {
</span><span class="cx">             error(loc, &quot;Invalid operation for arrays&quot;, GetOperatorString(op));
</span><span class="cx">             return false;
</span><span class="lines">@@ -2888,14 +3577,14 @@
</span><span class="cx"> 
</span><span class="cx">         switch (op)
</span><span class="cx">         {
</span><del>-          case EOpEqual:
-          case EOpNotEqual:
-          case EOpAssign:
-          case EOpInitialize:
-            break;
-          default:
-            error(loc, &quot;Invalid operation for arrays&quot;, GetOperatorString(op));
-            return false;
</del><ins>+            case EOpEqual:
+            case EOpNotEqual:
+            case EOpAssign:
+            case EOpInitialize:
+                break;
+            default:
+                error(loc, &quot;Invalid operation for arrays&quot;, GetOperatorString(op));
+                return false;
</ins><span class="cx">         }
</span><span class="cx">         // At this point, size of implicitly sized arrays should be resolved.
</span><span class="cx">         if (left-&gt;getArraySize() != right-&gt;getArraySize())
</span><span class="lines">@@ -2909,33 +3598,33 @@
</span><span class="cx">     bool isBitShift = false;
</span><span class="cx">     switch (op)
</span><span class="cx">     {
</span><del>-      case EOpBitShiftLeft:
-      case EOpBitShiftRight:
-      case EOpBitShiftLeftAssign:
-      case EOpBitShiftRightAssign:
-        // Unsigned can be bit-shifted by signed and vice versa, but we need to
-        // check that the basic type is an integer type.
-        isBitShift = true;
-        if (!IsInteger(left-&gt;getBasicType()) || !IsInteger(right-&gt;getBasicType()))
-        {
-            return false;
-        }
-        break;
-      case EOpBitwiseAnd:
-      case EOpBitwiseXor:
-      case EOpBitwiseOr:
-      case EOpBitwiseAndAssign:
-      case EOpBitwiseXorAssign:
-      case EOpBitwiseOrAssign:
-        // It is enough to check the type of only one operand, since later it
-        // is checked that the operand types match.
-        if (!IsInteger(left-&gt;getBasicType()))
-        {
-            return false;
-        }
-        break;
-      default:
-        break;
</del><ins>+        case EOpBitShiftLeft:
+        case EOpBitShiftRight:
+        case EOpBitShiftLeftAssign:
+        case EOpBitShiftRightAssign:
+            // Unsigned can be bit-shifted by signed and vice versa, but we need to
+            // check that the basic type is an integer type.
+            isBitShift = true;
+            if (!IsInteger(left-&gt;getBasicType()) || !IsInteger(right-&gt;getBasicType()))
+            {
+                return false;
+            }
+            break;
+        case EOpBitwiseAnd:
+        case EOpBitwiseXor:
+        case EOpBitwiseOr:
+        case EOpBitwiseAndAssign:
+        case EOpBitwiseXorAssign:
+        case EOpBitwiseOrAssign:
+            // It is enough to check the type of only one operand, since later it
+            // is checked that the operand types match.
+            if (!IsInteger(left-&gt;getBasicType()))
+            {
+                return false;
+            }
+            break;
+        default:
+            break;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // GLSL ES 1.00 and 3.00 do not support implicit type casting.
</span><span class="lines">@@ -2947,132 +3636,144 @@
</span><span class="cx"> 
</span><span class="cx">     // Check that type sizes match exactly on ops that require that.
</span><span class="cx">     // Also check restrictions for structs that contain arrays or samplers.
</span><del>-    switch(op)
</del><ins>+    switch (op)
</ins><span class="cx">     {
</span><del>-      case EOpAssign:
-      case EOpInitialize:
-      case EOpEqual:
-      case EOpNotEqual:
-        // ESSL 1.00 sections 5.7, 5.8, 5.9
-        if (shaderVersion &lt; 300 &amp;&amp; left-&gt;getType().isStructureContainingArrays())
-        {
-            error(loc, &quot;undefined operation for structs containing arrays&quot;, GetOperatorString(op));
-            return false;
-        }
-        // Samplers as l-values are disallowed also in ESSL 3.00, see section 4.1.7,
-        // we interpret the spec so that this extends to structs containing samplers,
-        // similarly to ESSL 1.00 spec.
-        if ((shaderVersion &lt; 300 || op == EOpAssign || op == EOpInitialize) &amp;&amp;
-            left-&gt;getType().isStructureContainingSamplers())
-        {
-            error(loc, &quot;undefined operation for structs containing samplers&quot;, GetOperatorString(op));
-            return false;
-        }
-      case EOpLessThan:
-      case EOpGreaterThan:
-      case EOpLessThanEqual:
-      case EOpGreaterThanEqual:
-        if ((left-&gt;getNominalSize() != right-&gt;getNominalSize()) ||
-            (left-&gt;getSecondarySize() != right-&gt;getSecondarySize()))
-        {
-            return false;
-        }
-      default:
-        break;
</del><ins>+        case EOpAssign:
+        case EOpInitialize:
+        case EOpEqual:
+        case EOpNotEqual:
+            // ESSL 1.00 sections 5.7, 5.8, 5.9
+            if (mShaderVersion &lt; 300 &amp;&amp; left-&gt;getType().isStructureContainingArrays())
+            {
+                error(loc, &quot;undefined operation for structs containing arrays&quot;,
+                      GetOperatorString(op));
+                return false;
+            }
+            // Samplers as l-values are disallowed also in ESSL 3.00, see section 4.1.7,
+            // we interpret the spec so that this extends to structs containing samplers,
+            // similarly to ESSL 1.00 spec.
+            if ((mShaderVersion &lt; 300 || op == EOpAssign || op == EOpInitialize) &amp;&amp;
+                left-&gt;getType().isStructureContainingSamplers())
+            {
+                error(loc, &quot;undefined operation for structs containing samplers&quot;,
+                      GetOperatorString(op));
+                return false;
+            }
+        case EOpLessThan:
+        case EOpGreaterThan:
+        case EOpLessThanEqual:
+        case EOpGreaterThanEqual:
+            if ((left-&gt;getNominalSize() != right-&gt;getNominalSize()) ||
+                (left-&gt;getSecondarySize() != right-&gt;getSecondarySize()))
+            {
+                return false;
+            }
+        default:
+            break;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped *TParseContext::addBinaryMathInternal(TOperator op, TIntermTyped *left, TIntermTyped *right,
-    const TSourceLoc &amp;loc)
</del><ins>+TIntermTyped *TParseContext::addBinaryMathInternal(TOperator op,
+                                                   TIntermTyped *left,
+                                                   TIntermTyped *right,
+                                                   const TSourceLoc &amp;loc)
</ins><span class="cx"> {
</span><span class="cx">     if (!binaryOpCommonCheck(op, left, right, loc))
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><span class="cx">     switch (op)
</span><span class="cx">     {
</span><del>-      case EOpEqual:
-      case EOpNotEqual:
-        break;
-      case EOpLessThan:
-      case EOpGreaterThan:
-      case EOpLessThanEqual:
-      case EOpGreaterThanEqual:
-        ASSERT(!left-&gt;isArray() &amp;&amp; !right-&gt;isArray());
-        if (left-&gt;isMatrix() || left-&gt;isVector() ||
-            left-&gt;getBasicType() == EbtStruct)
-        {
-            return nullptr;
-        }
-        break;
-      case EOpLogicalOr:
-      case EOpLogicalXor:
-      case EOpLogicalAnd:
-        ASSERT(!left-&gt;isArray() &amp;&amp; !right-&gt;isArray());
-        if (left-&gt;getBasicType() != EbtBool ||
-            left-&gt;isMatrix() || left-&gt;isVector())
-        {
-            return nullptr;
-        }
-        break;
-      case EOpAdd:
-      case EOpSub:
-      case EOpDiv:
-      case EOpMul:
-        ASSERT(!left-&gt;isArray() &amp;&amp; !right-&gt;isArray());
-        if (left-&gt;getBasicType() == EbtStruct || left-&gt;getBasicType() == EbtBool)
-        {
-            return nullptr;
-        }
-        break;
-      case EOpIMod:
-        ASSERT(!left-&gt;isArray() &amp;&amp; !right-&gt;isArray());
-        // Note that this is only for the % operator, not for mod()
-        if (left-&gt;getBasicType() == EbtStruct || left-&gt;getBasicType() == EbtBool || left-&gt;getBasicType() == EbtFloat)
-        {
-            return nullptr;
-        }
-        break;
-      // Note that for bitwise ops, type checking is done in promote() to
-      // share code between ops and compound assignment
-      default:
-        break;
</del><ins>+        case EOpEqual:
+        case EOpNotEqual:
+            break;
+        case EOpLessThan:
+        case EOpGreaterThan:
+        case EOpLessThanEqual:
+        case EOpGreaterThanEqual:
+            ASSERT(!left-&gt;isArray() &amp;&amp; !right-&gt;isArray());
+            if (left-&gt;isMatrix() || left-&gt;isVector() || left-&gt;getBasicType() == EbtStruct)
+            {
+                return nullptr;
+            }
+            break;
+        case EOpLogicalOr:
+        case EOpLogicalXor:
+        case EOpLogicalAnd:
+            ASSERT(!left-&gt;isArray() &amp;&amp; !right-&gt;isArray());
+            if (left-&gt;getBasicType() != EbtBool || left-&gt;isMatrix() || left-&gt;isVector())
+            {
+                return nullptr;
+            }
+            break;
+        case EOpAdd:
+        case EOpSub:
+        case EOpDiv:
+        case EOpMul:
+            ASSERT(!left-&gt;isArray() &amp;&amp; !right-&gt;isArray());
+            if (left-&gt;getBasicType() == EbtStruct || left-&gt;getBasicType() == EbtBool)
+            {
+                return nullptr;
+            }
+            break;
+        case EOpIMod:
+            ASSERT(!left-&gt;isArray() &amp;&amp; !right-&gt;isArray());
+            // Note that this is only for the % operator, not for mod()
+            if (left-&gt;getBasicType() == EbtStruct || left-&gt;getBasicType() == EbtBool ||
+                left-&gt;getBasicType() == EbtFloat)
+            {
+                return nullptr;
+            }
+            break;
+        // Note that for bitwise ops, type checking is done in promote() to
+        // share code between ops and compound assignment
+        default:
+            break;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return intermediate.addBinaryMath(op, left, right, loc);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped *TParseContext::addBinaryMath(TOperator op, TIntermTyped *left, TIntermTyped *right,
-    const TSourceLoc &amp;loc)
</del><ins>+TIntermTyped *TParseContext::addBinaryMath(TOperator op,
+                                           TIntermTyped *left,
+                                           TIntermTyped *right,
+                                           const TSourceLoc &amp;loc)
</ins><span class="cx"> {
</span><span class="cx">     TIntermTyped *node = addBinaryMathInternal(op, left, right, loc);
</span><span class="cx">     if (node == 0)
</span><span class="cx">     {
</span><del>-        binaryOpError(loc, GetOperatorString(op), left-&gt;getCompleteString(), right-&gt;getCompleteString());
</del><ins>+        binaryOpError(loc, GetOperatorString(op), left-&gt;getCompleteString(),
+                      right-&gt;getCompleteString());
</ins><span class="cx">         recover();
</span><span class="cx">         return left;
</span><span class="cx">     }
</span><span class="cx">     return node;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped *TParseContext::addBinaryMathBooleanResult(TOperator op, TIntermTyped *left, TIntermTyped *right,
-    const TSourceLoc &amp;loc)
</del><ins>+TIntermTyped *TParseContext::addBinaryMathBooleanResult(TOperator op,
+                                                        TIntermTyped *left,
+                                                        TIntermTyped *right,
+                                                        const TSourceLoc &amp;loc)
</ins><span class="cx"> {
</span><span class="cx">     TIntermTyped *node = addBinaryMathInternal(op, left, right, loc);
</span><span class="cx">     if (node == 0)
</span><span class="cx">     {
</span><del>-        binaryOpError(loc, GetOperatorString(op), left-&gt;getCompleteString(), right-&gt;getCompleteString());
</del><ins>+        binaryOpError(loc, GetOperatorString(op), left-&gt;getCompleteString(),
+                      right-&gt;getCompleteString());
</ins><span class="cx">         recover();
</span><span class="cx">         TConstantUnion *unionArray = new TConstantUnion[1];
</span><span class="cx">         unionArray-&gt;setBConst(false);
</span><del>-        return intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), loc);
</del><ins>+        return intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst),
+                                             loc);
</ins><span class="cx">     }
</span><span class="cx">     return node;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped *TParseContext::createAssign(TOperator op, TIntermTyped *left, TIntermTyped *right,
-    const TSourceLoc &amp;loc)
</del><ins>+TIntermTyped *TParseContext::createAssign(TOperator op,
+                                          TIntermTyped *left,
+                                          TIntermTyped *right,
+                                          const TSourceLoc &amp;loc)
</ins><span class="cx"> {
</span><span class="cx">     if (binaryOpCommonCheck(op, left, right, loc))
</span><span class="cx">     {
</span><span class="lines">@@ -3081,8 +3782,10 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped *TParseContext::addAssign(TOperator op, TIntermTyped *left, TIntermTyped *right,
-    const TSourceLoc &amp;loc)
</del><ins>+TIntermTyped *TParseContext::addAssign(TOperator op,
+                                       TIntermTyped *left,
+                                       TIntermTyped *right,
+                                       const TSourceLoc &amp;loc)
</ins><span class="cx"> {
</span><span class="cx">     TIntermTyped *node = createAssign(op, left, right, loc);
</span><span class="cx">     if (node == nullptr)
</span><span class="lines">@@ -3094,48 +3797,57 @@
</span><span class="cx">     return node;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TIntermTyped *TParseContext::addComma(TIntermTyped *left,
+                                      TIntermTyped *right,
+                                      const TSourceLoc &amp;loc)
+{
+    return intermediate.addComma(left, right, loc, mShaderVersion);
+}
+
</ins><span class="cx"> TIntermBranch *TParseContext::addBranch(TOperator op, const TSourceLoc &amp;loc)
</span><span class="cx"> {
</span><span class="cx">     switch (op)
</span><span class="cx">     {
</span><del>-      case EOpContinue:
-        if (mLoopNestingLevel &lt;= 0)
-        {
-            error(loc, &quot;continue statement only allowed in loops&quot;, &quot;&quot;);
-            recover();
-        }
-        break;
-      case EOpBreak:
-        if (mLoopNestingLevel &lt;= 0 &amp;&amp; mSwitchNestingLevel &lt;= 0)
-        {
-            error(loc, &quot;break statement only allowed in loops and switch statements&quot;, &quot;&quot;);
-            recover();
-        }
-        break;
-      case EOpReturn:
-        if (currentFunctionType-&gt;getBasicType() != EbtVoid)
-        {
-            error(loc, &quot;non-void function must return a value&quot;, &quot;return&quot;);
-            recover();
-        }
-        break;
-      default:
-        // No checks for discard
-        break;
</del><ins>+        case EOpContinue:
+            if (mLoopNestingLevel &lt;= 0)
+            {
+                error(loc, &quot;continue statement only allowed in loops&quot;, &quot;&quot;);
+                recover();
+            }
+            break;
+        case EOpBreak:
+            if (mLoopNestingLevel &lt;= 0 &amp;&amp; mSwitchNestingLevel &lt;= 0)
+            {
+                error(loc, &quot;break statement only allowed in loops and switch statements&quot;, &quot;&quot;);
+                recover();
+            }
+            break;
+        case EOpReturn:
+            if (mCurrentFunctionType-&gt;getBasicType() != EbtVoid)
+            {
+                error(loc, &quot;non-void function must return a value&quot;, &quot;return&quot;);
+                recover();
+            }
+            break;
+        default:
+            // No checks for discard
+            break;
</ins><span class="cx">     }
</span><span class="cx">     return intermediate.addBranch(op, loc);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermBranch *TParseContext::addBranch(TOperator op, TIntermTyped *returnValue, const TSourceLoc &amp;loc)
</del><ins>+TIntermBranch *TParseContext::addBranch(TOperator op,
+                                        TIntermTyped *returnValue,
+                                        const TSourceLoc &amp;loc)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(op == EOpReturn);
</span><span class="cx">     mFunctionReturnsValue = true;
</span><del>-    if (currentFunctionType-&gt;getBasicType() == EbtVoid)
</del><ins>+    if (mCurrentFunctionType-&gt;getBasicType() == EbtVoid)
</ins><span class="cx">     {
</span><span class="cx">         error(loc, &quot;void function cannot return a value&quot;, &quot;return&quot;);
</span><span class="cx">         recover();
</span><span class="cx">     }
</span><del>-    else if (*currentFunctionType != returnValue-&gt;getType())
</del><ins>+    else if (*mCurrentFunctionType != returnValue-&gt;getType())
</ins><span class="cx">     {
</span><span class="cx">         error(loc, &quot;function return is not matching type:&quot;, &quot;return&quot;);
</span><span class="cx">         recover();
</span><span class="lines">@@ -3143,17 +3855,73 @@
</span><span class="cx">     return intermediate.addBranch(op, returnValue, loc);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped *TParseContext::addFunctionCallOrMethod(TFunction *fnCall, TIntermNode *paramNode, TIntermNode *thisNode,
-                                                     const TSourceLoc &amp;loc, bool *fatalError)
</del><ins>+void TParseContext::checkTextureOffsetConst(TIntermAggregate *functionCall)
</ins><span class="cx"> {
</span><del>-    *fatalError = false;
-    TOperator op = fnCall-&gt;getBuiltInOp();
</del><ins>+    ASSERT(!functionCall-&gt;isUserDefined());
+    const TString &amp;name        = functionCall-&gt;getName();
+    TIntermNode *offset        = nullptr;
+    TIntermSequence *arguments = functionCall-&gt;getSequence();
+    if (name.compare(0, 16, &quot;texelFetchOffset&quot;) == 0 ||
+        name.compare(0, 16, &quot;textureLodOffset&quot;) == 0 ||
+        name.compare(0, 20, &quot;textureProjLodOffset&quot;) == 0 ||
+        name.compare(0, 17, &quot;textureGradOffset&quot;) == 0 ||
+        name.compare(0, 21, &quot;textureProjGradOffset&quot;) == 0)
+    {
+        offset = arguments-&gt;back();
+    }
+    else if (name.compare(0, 13, &quot;textureOffset&quot;) == 0 ||
+             name.compare(0, 17, &quot;textureProjOffset&quot;) == 0)
+    {
+        // A bias parameter might follow the offset parameter.
+        ASSERT(arguments-&gt;size() &gt;= 3);
+        offset = (*arguments)[2];
+    }
+    if (offset != nullptr)
+    {
+        TIntermConstantUnion *offsetConstantUnion = offset-&gt;getAsConstantUnion();
+        if (offset-&gt;getAsTyped()-&gt;getQualifier() != EvqConst || !offsetConstantUnion)
+        {
+            TString unmangledName = TFunction::unmangleName(name);
+            error(functionCall-&gt;getLine(), &quot;Texture offset must be a constant expression&quot;,
+                  unmangledName.c_str());
+            recover();
+        }
+        else
+        {
+            ASSERT(offsetConstantUnion-&gt;getBasicType() == EbtInt);
+            size_t size                  = offsetConstantUnion-&gt;getType().getObjectSize();
+            const TConstantUnion *values = offsetConstantUnion-&gt;getUnionArrayPointer();
+            for (size_t i = 0u; i &lt; size; ++i)
+            {
+                int offsetValue = values[i].getIConst();
+                if (offsetValue &gt; mMaxProgramTexelOffset || offsetValue &lt; mMinProgramTexelOffset)
+                {
+                    std::stringstream tokenStream;
+                    tokenStream &lt;&lt; offsetValue;
+                    std::string token = tokenStream.str();
+                    error(offset-&gt;getLine(), &quot;Texture offset value out of valid range&quot;,
+                          token.c_str());
+                    recover();
+                }
+            }
+        }
+    }
+}
+
+TIntermTyped *TParseContext::addFunctionCallOrMethod(TFunction *fnCall,
+                                                     TIntermNode *paramNode,
+                                                     TIntermNode *thisNode,
+                                                     const TSourceLoc &amp;loc,
+                                                     bool *fatalError)
+{
+    *fatalError            = false;
+    TOperator op           = fnCall-&gt;getBuiltInOp();
</ins><span class="cx">     TIntermTyped *callNode = nullptr;
</span><span class="cx"> 
</span><span class="cx">     if (thisNode != nullptr)
</span><span class="cx">     {
</span><span class="cx">         TConstantUnion *unionArray = new TConstantUnion[1];
</span><del>-        int arraySize = 0;
</del><ins>+        int arraySize              = 0;
</ins><span class="cx">         TIntermTyped *typedThis = thisNode-&gt;getAsTyped();
</span><span class="cx">         if (fnCall-&gt;getName() != &quot;length&quot;)
</span><span class="cx">         {
</span><span class="lines">@@ -3179,15 +3947,19 @@
</span><span class="cx">                 // (a = b).length()
</span><span class="cx">                 // (func()).length()
</span><span class="cx">                 // (int[3](0, 1, 2)).length()
</span><del>-                // ESSL 3.00 section 5.9 defines expressions so that this is not actually a valid expression.
-                // It allows &quot;An array name with the length method applied&quot; in contrast to GLSL 4.4 spec section 5.9
-                // which allows &quot;An array, vector or matrix expression with the length method applied&quot;.
-                error(loc, &quot;length can only be called on array names, not on array expressions&quot;, &quot;length&quot;);
</del><ins>+                // ESSL 3.00 section 5.9 defines expressions so that this is not actually a valid
+                // expression.
+                // It allows &quot;An array name with the length method applied&quot; in contrast to GLSL 4.4
+                // spec section 5.9 which allows &quot;An array, vector or matrix expression with the
+                // length method applied&quot;.
+                error(loc, &quot;length can only be called on array names, not on array expressions&quot;,
+                      &quot;length&quot;);
</ins><span class="cx">                 recover();
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         unionArray-&gt;setIConst(arraySize);
</span><del>-        callNode = intermediate.addConstantUnion(unionArray, TType(EbtInt, EbpUndefined, EvqConst), loc);
</del><ins>+        callNode =
+            intermediate.addConstantUnion(unionArray, TType(EbtInt, EbpUndefined, EvqConst), loc);
</ins><span class="cx">     }
</span><span class="cx">     else if (op != EOpNull)
</span><span class="cx">     {
</span><span class="lines">@@ -3217,9 +3989,9 @@
</span><span class="cx">         //
</span><span class="cx">         // Not a constructor.  Find it in the symbol table.
</span><span class="cx">         //
</span><del>-        const TFunction* fnCandidate;
</del><ins>+        const TFunction *fnCandidate;
</ins><span class="cx">         bool builtIn;
</span><del>-        fnCandidate = findFunction(loc, fnCall, shaderVersion, &amp;builtIn);
</del><ins>+        fnCandidate = findFunction(loc, fnCall, mShaderVersion, &amp;builtIn);
</ins><span class="cx">         if (fnCandidate)
</span><span class="cx">         {
</span><span class="cx">             //
</span><span class="lines">@@ -3241,38 +4013,61 @@
</span><span class="cx">                     //
</span><span class="cx">                     // Treat it like a built-in unary operator.
</span><span class="cx">                     //
</span><del>-                    callNode = createUnaryMath(op, paramNode-&gt;getAsTyped(), loc, &amp;fnCandidate-&gt;getReturnType());
</del><ins>+                    TIntermAggregate *paramAgg = paramNode-&gt;getAsAggregate();
+                    paramNode                  = paramAgg-&gt;getSequence()-&gt;front();
+                    callNode = createUnaryMath(op, paramNode-&gt;getAsTyped(), loc,
+                                               &amp;fnCandidate-&gt;getReturnType());
</ins><span class="cx">                     if (callNode == nullptr)
</span><span class="cx">                     {
</span><span class="cx">                         std::stringstream extraInfoStream;
</span><del>-                        extraInfoStream &lt;&lt; &quot;built in unary operator function.  Type: &quot;
-                            &lt;&lt; static_cast&lt;TIntermTyped*&gt;(paramNode)-&gt;getCompleteString();
</del><ins>+                        extraInfoStream
+                            &lt;&lt; &quot;built in unary operator function.  Type: &quot;
+                            &lt;&lt; static_cast&lt;TIntermTyped *&gt;(paramNode)-&gt;getCompleteString();
</ins><span class="cx">                         std::string extraInfo = extraInfoStream.str();
</span><del>-                        error(paramNode-&gt;getLine(), &quot; wrong operand type&quot;, &quot;Internal Error&quot;, extraInfo.c_str());
</del><ins>+                        error(paramNode-&gt;getLine(), &quot; wrong operand type&quot;, &quot;Internal Error&quot;,
+                              extraInfo.c_str());
</ins><span class="cx">                         *fatalError = true;
</span><span class="cx">                         return nullptr;
</span><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="cx">                 else
</span><span class="cx">                 {
</span><del>-                    TIntermAggregate *aggregate = intermediate.setAggregateOperator(paramNode, op, loc);
</del><ins>+                    TIntermAggregate *aggregate =
+                        intermediate.setAggregateOperator(paramNode, op, loc);
</ins><span class="cx">                     aggregate-&gt;setType(fnCandidate-&gt;getReturnType());
</span><span class="cx">                     aggregate-&gt;setPrecisionFromChildren();
</span><del>-                    callNode = aggregate;
</del><ins>+                    if (aggregate-&gt;areChildrenConstQualified())
+                    {
+                        aggregate-&gt;getTypePointer()-&gt;setQualifier(EvqConst);
+                    }
</ins><span class="cx"> 
</span><span class="cx">                     // Some built-in functions have out parameters too.
</span><span class="cx">                     functionCallLValueErrorCheck(fnCandidate, aggregate);
</span><ins>+
+                    // See if we can constant fold a built-in. Note that this may be possible even
+                    // if it is not const-qualified.
+                    TIntermTyped *foldedNode = intermediate.foldAggregateBuiltIn(aggregate);
+                    if (foldedNode)
+                    {
+                        callNode = foldedNode;
+                    }
+                    else
+                    {
+                        callNode = aggregate;
+                    }
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><span class="cx">                 // This is a real function call
</span><del>-
-                TIntermAggregate *aggregate = intermediate.setAggregateOperator(paramNode, EOpFunctionCall, loc);
</del><ins>+                TIntermAggregate *aggregate =
+                    intermediate.setAggregateOperator(paramNode, EOpFunctionCall, loc);
</ins><span class="cx">                 aggregate-&gt;setType(fnCandidate-&gt;getReturnType());
</span><span class="cx"> 
</span><del>-                // this is how we know whether the given function is a builtIn function or a user defined function
-                // if builtIn == false, it's a userDefined -&gt; could be an overloaded builtIn function also
</del><ins>+                // this is how we know whether the given function is a builtIn function or a user
+                // defined function
+                // if builtIn == false, it's a userDefined -&gt; could be an overloaded
+                // builtIn function also
</ins><span class="cx">                 // if builtIn == true, it's definitely a builtIn function with EOpNull
</span><span class="cx">                 if (!builtIn)
</span><span class="cx">                     aggregate-&gt;setUserDefined();
</span><span class="lines">@@ -3281,8 +4076,12 @@
</span><span class="cx"> 
</span><span class="cx">                 // This needs to happen after the name is set
</span><span class="cx">                 if (builtIn)
</span><ins>+                {
</ins><span class="cx">                     aggregate-&gt;setBuiltInFunctionPrecision();
</span><span class="cx"> 
</span><ins>+                    checkTextureOffsetConst(aggregate);
+                }
+
</ins><span class="cx">                 callNode = aggregate;
</span><span class="cx"> 
</span><span class="cx">                 functionCallLValueErrorCheck(fnCandidate, aggregate);
</span><span class="lines">@@ -3294,15 +4093,17 @@
</span><span class="cx">             // Put on a dummy node for error recovery
</span><span class="cx">             TConstantUnion *unionArray = new TConstantUnion[1];
</span><span class="cx">             unionArray-&gt;setFConst(0.0f);
</span><del>-            callNode = intermediate.addConstantUnion(unionArray, TType(EbtFloat, EbpUndefined, EvqConst), loc);
</del><ins>+            callNode = intermediate.addConstantUnion(unionArray,
+                                                     TType(EbtFloat, EbpUndefined, EvqConst), loc);
</ins><span class="cx">             recover();
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    delete fnCall;
</del><span class="cx">     return callNode;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TIntermTyped *TParseContext::addTernarySelection(TIntermTyped *cond, TIntermTyped *trueBlock, TIntermTyped *falseBlock,
</del><ins>+TIntermTyped *TParseContext::addTernarySelection(TIntermTyped *cond,
+                                                 TIntermTyped *trueBlock,
+                                                 TIntermTyped *falseBlock,
</ins><span class="cx">                                                  const TSourceLoc &amp;loc)
</span><span class="cx"> {
</span><span class="cx">     if (boolErrorCheck(loc, cond))
</span><span class="lines">@@ -3331,8 +4132,11 @@
</span><span class="cx"> //
</span><span class="cx"> // Returns 0 for success.
</span><span class="cx"> //
</span><del>-int PaParseStrings(size_t count, const char* const string[], const int length[],
-                   TParseContext* context) {
</del><ins>+int PaParseStrings(size_t count,
+                   const char *const string[],
+                   const int length[],
+                   TParseContext *context)
+{
</ins><span class="cx">     if ((count == 0) || (string == NULL))
</span><span class="cx">         return 1;
</span><span class="cx"> 
</span><span class="lines">@@ -3347,6 +4151,3 @@
</span><span class="cx"> 
</span><span class="cx">     return (error == 0) &amp;&amp; (context-&gt;numErrors() == 0) ? 0 : 1;
</span><span class="cx"> }
</span><del>-
-
-
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorParseContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,11 +9,12 @@
</span><span class="cx"> #include &quot;compiler/translator/Compiler.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/Diagnostics.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/DirectiveHandler.h&quot;
</span><del>-#include &quot;compiler/translator/intermediate.h&quot;
</del><ins>+#include &quot;compiler/translator/Intermediate.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><span class="cx"> #include &quot;compiler/preprocessor/Preprocessor.h&quot;
</span><span class="cx"> 
</span><del>-struct TMatrixFields {
</del><ins>+struct TMatrixFields
+{
</ins><span class="cx">     bool wholeRow;
</span><span class="cx">     bool wholeCol;
</span><span class="cx">     int row;
</span><span class="lines">@@ -24,162 +25,275 @@
</span><span class="cx"> // The following are extra variables needed during parsing, grouped together so
</span><span class="cx"> // they can be passed to the parser without needing a global.
</span><span class="cx"> //
</span><del>-struct TParseContext {
-    TParseContext(TSymbolTable&amp; symt, TExtensionBehavior&amp; ext, TIntermediate&amp; interm, sh::GLenum type, ShShaderSpec spec, int options, bool checksPrecErrors, TInfoSink&amp; is, bool debugShaderPrecisionSupported) :
-            intermediate(interm),
-            symbolTable(symt),
-            shaderType(type),
-            shaderSpec(spec),
-            compileOptions(options),
-            treeRoot(0),
-            mLoopNestingLevel(0),
-            structNestingLevel(0),
-            mSwitchNestingLevel(0),
-            currentFunctionType(NULL),
-            mFunctionReturnsValue(false),
-            checksPrecisionErrors(checksPrecErrors),
-            fragmentPrecisionHigh(false),
-            defaultMatrixPacking(EmpColumnMajor),
-            defaultBlockStorage(EbsShared),
-            diagnostics(is),
-            shaderVersion(100),
-            directiveHandler(ext, diagnostics, shaderVersion, debugShaderPrecisionSupported),
-            preprocessor(&amp;diagnostics, &amp;directiveHandler),
-            scanner(NULL),
-            mDeferredSingleDeclarationErrorCheck(false)
</del><ins>+class TParseContext : angle::NonCopyable
+{
+  public:
+    TParseContext(TSymbolTable &amp;symt,
+                  TExtensionBehavior &amp;ext,
+                  TIntermediate &amp;interm,
+                  sh::GLenum type,
+                  ShShaderSpec spec,
+                  int options,
+                  bool checksPrecErrors,
+                  TInfoSink &amp;is,
+                  const ShBuiltInResources &amp;resources)
+        : intermediate(interm),
+          symbolTable(symt),
+          mDeferredSingleDeclarationErrorCheck(false),
+          mShaderType(type),
+          mShaderSpec(spec),
+          mShaderVersion(100),
+          mTreeRoot(nullptr),
+          mLoopNestingLevel(0),
+          mStructNestingLevel(0),
+          mSwitchNestingLevel(0),
+          mCurrentFunctionType(nullptr),
+          mFunctionReturnsValue(false),
+          mChecksPrecisionErrors(checksPrecErrors),
+          mFragmentPrecisionHighOnESSL1(false),
+          mDefaultMatrixPacking(EmpColumnMajor),
+          mDefaultBlockStorage(EbsShared),
+          mDiagnostics(is),
+          mDirectiveHandler(ext,
+                            mDiagnostics,
+                            mShaderVersion,
+                            mShaderType,
+                            resources.WEBGL_debug_shader_precision == 1),
+          mPreprocessor(&amp;mDiagnostics, &amp;mDirectiveHandler),
+          mScanner(nullptr),
+          mUsesFragData(false),
+          mUsesFragColor(false),
+          mUsesSecondaryOutputs(false),
+          mMinProgramTexelOffset(resources.MinProgramTexelOffset),
+          mMaxProgramTexelOffset(resources.MaxProgramTexelOffset)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><del>-    TIntermediate&amp; intermediate; // to hold and build a parse tree
-    TSymbolTable&amp; symbolTable;   // symbol table that goes with the language currently being parsed
-    sh::GLenum shaderType;              // vertex or fragment language (future: pack or unpack)
-    ShShaderSpec shaderSpec;              // The language specification compiler conforms to - GLES2 or WebGL.
-    int shaderVersion;
-    int compileOptions;
-    TIntermNode* treeRoot;       // root of parse tree being created
-    int mLoopNestingLevel;       // 0 if outside all loops
-    int structNestingLevel;      // incremented while parsing a struct declaration
-    int mSwitchNestingLevel;     // 0 if outside all switch statements
-    const TType* currentFunctionType;  // the return type of the function that's currently being parsed
-    bool mFunctionReturnsValue;  // true if a non-void function has a return
-    bool checksPrecisionErrors;  // true if an error will be generated when a variable is declared without precision, explicit or implicit.
-    bool fragmentPrecisionHigh;  // true if highp precision is supported in the fragment language.
-    TLayoutMatrixPacking defaultMatrixPacking;
-    TLayoutBlockStorage defaultBlockStorage;
-    TString HashErrMsg;
-    TDiagnostics diagnostics;
-    TDirectiveHandler directiveHandler;
-    pp::Preprocessor preprocessor;
-    void* scanner;
</del><span class="cx"> 
</span><del>-    int getShaderVersion() const { return shaderVersion; }
-    int numErrors() const { return diagnostics.numErrors(); }
-    TInfoSink&amp; infoSink() { return diagnostics.infoSink(); }
-    void error(const TSourceLoc&amp; loc, const char *reason, const char* token,
-               const char* extraInfo=&quot;&quot;);
-    void warning(const TSourceLoc&amp; loc, const char* reason, const char* token,
-                 const char* extraInfo=&quot;&quot;);
</del><ins>+    const pp::Preprocessor &amp;getPreprocessor() const { return mPreprocessor; }
+    pp::Preprocessor &amp;getPreprocessor() { return mPreprocessor; }
+    void *getScanner() const { return mScanner; }
+    void setScanner(void *scanner) { mScanner = scanner; }
+    int getShaderVersion() const { return mShaderVersion; }
+    sh::GLenum getShaderType() const { return mShaderType; }
+    ShShaderSpec getShaderSpec() const { return mShaderSpec; }
+    int numErrors() const { return mDiagnostics.numErrors(); }
+    TInfoSink &amp;infoSink() { return mDiagnostics.infoSink(); }
+    void error(const TSourceLoc &amp;loc, const char *reason, const char *token,
+               const char *extraInfo=&quot;&quot;);
+    void warning(const TSourceLoc &amp;loc, const char *reason, const char *token,
+                 const char *extraInfo=&quot;&quot;);
+
+    // If isError is false, a warning will be reported instead.
+    void outOfRangeError(bool isError,
+                         const TSourceLoc &amp;loc,
+                         const char *reason,
+                         const char *token,
+                         const char *extraInfo = &quot;&quot;);
+
</ins><span class="cx">     void recover();
</span><ins>+    TIntermNode *getTreeRoot() const { return mTreeRoot; }
+    void setTreeRoot(TIntermNode *treeRoot) { mTreeRoot = treeRoot; }
</ins><span class="cx"> 
</span><ins>+    bool getFragmentPrecisionHigh() const
+    {
+        return mFragmentPrecisionHighOnESSL1 || mShaderVersion &gt;= 300;
+    }
+    void setFragmentPrecisionHighOnESSL1(bool fragmentPrecisionHigh)
+    {
+        mFragmentPrecisionHighOnESSL1 = fragmentPrecisionHigh;
+    }
+
+    void setLoopNestingLevel(int loopNestintLevel)
+    {
+        mLoopNestingLevel = loopNestintLevel;
+    }
+
+    void incrLoopNestingLevel() { ++mLoopNestingLevel; }
+    void decrLoopNestingLevel() { --mLoopNestingLevel; }
+
+    void incrSwitchNestingLevel() { ++mSwitchNestingLevel; }
+    void decrSwitchNestingLevel() { --mSwitchNestingLevel; }
+
</ins><span class="cx">     // This method is guaranteed to succeed, even if no variable with 'name' exists.
</span><span class="cx">     const TVariable *getNamedVariable(const TSourceLoc &amp;location, const TString *name, const TSymbol *symbol);
</span><ins>+    TIntermTyped *parseVariableIdentifier(const TSourceLoc &amp;location,
+                                          const TString *name,
+                                          const TSymbol *symbol);
</ins><span class="cx"> 
</span><del>-    bool parseVectorFields(const TString&amp;, int vecSize, TVectorFields&amp;, const TSourceLoc&amp; line);
-    bool parseMatrixFields(const TString&amp;, int matCols, int matRows, TMatrixFields&amp;, const TSourceLoc&amp; line);
</del><ins>+    bool parseVectorFields(const TString&amp;, int vecSize, TVectorFields&amp;, const TSourceLoc &amp;line);
</ins><span class="cx"> 
</span><del>-    bool reservedErrorCheck(const TSourceLoc&amp; line, const TString&amp; identifier);
-    void assignError(const TSourceLoc&amp; line, const char* op, TString left, TString right);
-    void unaryOpError(const TSourceLoc&amp; line, const char* op, TString operand);
-    void binaryOpError(const TSourceLoc&amp; line, const char* op, TString left, TString right);
-    bool precisionErrorCheck(const TSourceLoc&amp; line, TPrecision precision, TBasicType type);
-    bool lValueErrorCheck(const TSourceLoc&amp; line, const char* op, TIntermTyped*);
-    bool constErrorCheck(TIntermTyped* node);
-    bool integerErrorCheck(TIntermTyped* node, const char* token);
-    bool globalErrorCheck(const TSourceLoc&amp; line, bool global, const char* token);
-    bool constructorErrorCheck(const TSourceLoc&amp; line, TIntermNode*, TFunction&amp;, TOperator, TType*);
-    bool arraySizeErrorCheck(const TSourceLoc&amp; line, TIntermTyped* expr, int&amp; size);
</del><ins>+    bool reservedErrorCheck(const TSourceLoc &amp;line, const TString &amp;identifier);
+    void assignError(const TSourceLoc &amp;line, const char *op, TString left, TString right);
+    void unaryOpError(const TSourceLoc &amp;line, const char *op, TString operand);
+    void binaryOpError(const TSourceLoc &amp;line, const char *op, TString left, TString right);
+    bool precisionErrorCheck(const TSourceLoc &amp;line, TPrecision precision, TBasicType type);
+    bool lValueErrorCheck(const TSourceLoc &amp;line, const char *op, TIntermTyped*);
+    bool constErrorCheck(TIntermTyped *node);
+    bool integerErrorCheck(TIntermTyped *node, const char *token);
+    bool globalErrorCheck(const TSourceLoc &amp;line, bool global, const char *token);
+    bool constructorErrorCheck(const TSourceLoc &amp;line,
+                               TIntermNode *argumentsNode,
+                               TFunction &amp;function,
+                               TOperator op,
+                               TType *type);
+    bool arraySizeErrorCheck(const TSourceLoc &amp;line, TIntermTyped *expr, int &amp;size);
</ins><span class="cx">     bool arrayQualifierErrorCheck(const TSourceLoc &amp;line, const TPublicType &amp;type);
</span><del>-    bool arrayTypeErrorCheck(const TSourceLoc&amp; line, TPublicType type);
</del><ins>+    bool arrayTypeErrorCheck(const TSourceLoc &amp;line, const TPublicType &amp;type);
</ins><span class="cx">     bool voidErrorCheck(const TSourceLoc &amp;line, const TString &amp;identifier, const TBasicType &amp;type);
</span><span class="cx">     bool boolErrorCheck(const TSourceLoc&amp;, const TIntermTyped*);
</span><span class="cx">     bool boolErrorCheck(const TSourceLoc&amp;, const TPublicType&amp;);
</span><del>-    bool samplerErrorCheck(const TSourceLoc&amp; line, const TPublicType&amp; pType, const char* reason);
-    bool locationDeclaratorListCheck(const TSourceLoc&amp; line, const TPublicType &amp;pType);
-    bool parameterSamplerErrorCheck(const TSourceLoc&amp; line, TQualifier qualifier, const TType&amp; type);
-    bool paramErrorCheck(const TSourceLoc&amp; line, TQualifier qualifier, TQualifier paramQualifier, TType* type);
-    bool extensionErrorCheck(const TSourceLoc&amp; line, const TString&amp;);
-    bool singleDeclarationErrorCheck(TPublicType &amp;publicType, const TSourceLoc &amp;identifierLocation);
-    bool layoutLocationErrorCheck(const TSourceLoc&amp; location, const TLayoutQualifier &amp;layoutQualifier);
</del><ins>+    bool samplerErrorCheck(const TSourceLoc &amp;line, const TPublicType &amp;pType, const char *reason);
+    bool locationDeclaratorListCheck(const TSourceLoc &amp;line, const TPublicType &amp;pType);
+    bool parameterSamplerErrorCheck(const TSourceLoc &amp;line, TQualifier qualifier, const TType &amp;type);
+    bool paramErrorCheck(const TSourceLoc &amp;line, TQualifier qualifier, TQualifier paramQualifier, TType *type);
+    bool extensionErrorCheck(const TSourceLoc &amp;line, const TString&amp;);
+    bool singleDeclarationErrorCheck(const TPublicType &amp;publicType, const TSourceLoc &amp;identifierLocation);
+    bool layoutLocationErrorCheck(const TSourceLoc &amp;location, const TLayoutQualifier &amp;layoutQualifier);
</ins><span class="cx">     bool functionCallLValueErrorCheck(const TFunction *fnCandidate, TIntermAggregate *);
</span><ins>+    void es3InvariantErrorCheck(const TQualifier qualifier, const TSourceLoc &amp;invariantLocation);
+    void es3InputOutputTypeCheck(const TQualifier qualifier,
+                                 const TPublicType &amp;type,
+                                 const TSourceLoc &amp;qualifierLocation);
</ins><span class="cx"> 
</span><del>-    const TPragma&amp; pragma() const { return directiveHandler.pragma(); }
-    const TExtensionBehavior&amp; extensionBehavior() const { return directiveHandler.extensionBehavior(); }
-    bool supportsExtension(const char* extension);
-    bool isExtensionEnabled(const char* extension) const;
-    void handleExtensionDirective(const TSourceLoc&amp; loc, const char* extName, const char* behavior);
-    void handlePragmaDirective(const TSourceLoc&amp; loc, const char* name, const char* value, bool stdgl);
</del><ins>+    const TPragma &amp;pragma() const { return mDirectiveHandler.pragma(); }
+    const TExtensionBehavior &amp;extensionBehavior() const { return mDirectiveHandler.extensionBehavior(); }
+    bool supportsExtension(const char *extension);
+    bool isExtensionEnabled(const char *extension) const;
+    void handleExtensionDirective(const TSourceLoc &amp;loc, const char *extName, const char *behavior);
+    void handlePragmaDirective(const TSourceLoc &amp;loc, const char *name, const char *value, bool stdgl);
</ins><span class="cx"> 
</span><del>-    bool containsSampler(TType&amp; type);
-    bool areAllChildConst(TIntermAggregate* aggrNode);
-    const TFunction* findFunction(const TSourceLoc&amp; line, TFunction* pfnCall, int inputShaderVersion, bool *builtIn = 0);
-    bool executeInitializer(const TSourceLoc &amp;line, const TString &amp;identifier, TPublicType &amp;pType,
-                            TIntermTyped *initializer, TIntermNode **intermNode);
</del><ins>+    bool containsSampler(const TType &amp;type);
+    const TFunction* findFunction(
+        const TSourceLoc &amp;line, TFunction *pfnCall, int inputShaderVersion, bool *builtIn = 0);
+    bool executeInitializer(const TSourceLoc &amp;line,
+                            const TString &amp;identifier,
+                            const TPublicType &amp;pType,
+                            TIntermTyped *initializer,
+                            TIntermNode **intermNode);
</ins><span class="cx"> 
</span><del>-    TPublicType addFullySpecifiedType(TQualifier qualifier, const TPublicType&amp; typeSpecifier);
-    TPublicType addFullySpecifiedType(TQualifier qualifier, TLayoutQualifier layoutQualifier, const TPublicType&amp; typeSpecifier);
</del><ins>+    TPublicType addFullySpecifiedType(TQualifier qualifier,
+                                      bool invariant,
+                                      TLayoutQualifier layoutQualifier,
+                                      const TPublicType &amp;typeSpecifier);
</ins><span class="cx"> 
</span><span class="cx">     TIntermAggregate *parseSingleDeclaration(TPublicType &amp;publicType,
</span><del>-                                             const TSourceLoc &amp;identifierOrTypeLocation, const TString &amp;identifier);
</del><ins>+                                             const TSourceLoc &amp;identifierOrTypeLocation,
+                                             const TString &amp;identifier);
</ins><span class="cx">     TIntermAggregate *parseSingleArrayDeclaration(TPublicType &amp;publicType,
</span><del>-                                                  const TSourceLoc &amp;identifierLocation, const TString &amp;identifier,
-                                                  const TSourceLoc &amp;indexLocation, TIntermTyped *indexExpression);
-    TIntermAggregate *parseSingleInitDeclaration(TPublicType &amp;publicType,
-                                                 const TSourceLoc &amp;identifierLocation, const TString &amp;identifier,
-                                                 const TSourceLoc &amp;initLocation, TIntermTyped *initializer);
</del><ins>+                                                  const TSourceLoc &amp;identifierLocation,
+                                                  const TString &amp;identifier,
+                                                  const TSourceLoc &amp;indexLocation,
+                                                  TIntermTyped *indexExpression);
+    TIntermAggregate *parseSingleInitDeclaration(const TPublicType &amp;publicType,
+                                                 const TSourceLoc &amp;identifierLocation,
+                                                 const TString &amp;identifier,
+                                                 const TSourceLoc &amp;initLocation,
+                                                 TIntermTyped *initializer);
</ins><span class="cx"> 
</span><span class="cx">     // Parse a declaration like &quot;type a[n] = initializer&quot;
</span><span class="cx">     // Note that this does not apply to declarations like &quot;type[n] a = initializer&quot;
</span><span class="cx">     TIntermAggregate *parseSingleArrayInitDeclaration(TPublicType &amp;publicType,
</span><del>-                                                      const TSourceLoc &amp;identifierLocation, const TString &amp;identifier,
-                                                      const TSourceLoc &amp;indexLocation, TIntermTyped *indexExpression,
-                                                      const TSourceLoc &amp;initLocation, TIntermTyped *initializer);
</del><ins>+                                                      const TSourceLoc &amp;identifierLocation,
+                                                      const TString &amp;identifier,
+                                                      const TSourceLoc &amp;indexLocation,
+                                                      TIntermTyped *indexExpression,
+                                                      const TSourceLoc &amp;initLocation,
+                                                      TIntermTyped *initializer);
</ins><span class="cx"> 
</span><del>-    TIntermAggregate *parseInvariantDeclaration(const TSourceLoc &amp;invariantLoc, const TSourceLoc &amp;identifierLoc,
-                                                const TString *identifier, const TSymbol *symbol);
</del><ins>+    TIntermAggregate *parseInvariantDeclaration(const TSourceLoc &amp;invariantLoc,
+                                                const TSourceLoc &amp;identifierLoc,
+                                                const TString *identifier,
+                                                const TSymbol *symbol);
</ins><span class="cx"> 
</span><del>-    TIntermAggregate *parseDeclarator(TPublicType &amp;publicType, TIntermAggregate *aggregateDeclaration,
-                                      const TSourceLoc &amp;identifierLocation, const TString &amp;identifier);
-    TIntermAggregate *parseArrayDeclarator(TPublicType &amp;publicType, TIntermAggregate *aggregateDeclaration,
-                                           const TSourceLoc &amp;identifierLocation, const TString &amp;identifier,
-                                           const TSourceLoc &amp;arrayLocation, TIntermTyped *indexExpression);
-    TIntermAggregate *parseInitDeclarator(TPublicType &amp;publicType, TIntermAggregate *aggregateDeclaration,
-                                          const TSourceLoc &amp;identifierLocation, const TString &amp;identifier,
-                                          const TSourceLoc &amp;initLocation, TIntermTyped *initializer);
</del><ins>+    TIntermAggregate *parseDeclarator(TPublicType &amp;publicType,
+                                      TIntermAggregate *aggregateDeclaration,
+                                      const TSourceLoc &amp;identifierLocation,
+                                      const TString &amp;identifier);
+    TIntermAggregate *parseArrayDeclarator(TPublicType &amp;publicType,
+                                           TIntermAggregate *aggregateDeclaration,
+                                           const TSourceLoc &amp;identifierLocation,
+                                           const TString &amp;identifier,
+                                           const TSourceLoc &amp;arrayLocation,
+                                           TIntermTyped *indexExpression);
+    TIntermAggregate *parseInitDeclarator(const TPublicType &amp;publicType,
+                                          TIntermAggregate *aggregateDeclaration,
+                                          const TSourceLoc &amp;identifierLocation,
+                                          const TString &amp;identifier,
+                                          const TSourceLoc &amp;initLocation,
+                                          TIntermTyped *initializer);
</ins><span class="cx"> 
</span><span class="cx">     // Parse a declarator like &quot;a[n] = initializer&quot;
</span><del>-    TIntermAggregate *parseArrayInitDeclarator(TPublicType &amp;publicType, TIntermAggregate *aggregateDeclaration,
-                                               const TSourceLoc&amp; identifierLocation, const TString &amp;identifier,
-                                               const TSourceLoc&amp; indexLocation, TIntermTyped *indexExpression,
-                                               const TSourceLoc &amp;initLocation, TIntermTyped *initializer);
</del><ins>+    TIntermAggregate *parseArrayInitDeclarator(const TPublicType &amp;publicType,
+                                               TIntermAggregate *aggregateDeclaration,
+                                               const TSourceLoc &amp;identifierLocation,
+                                               const TString &amp;identifier,
+                                               const TSourceLoc &amp;indexLocation,
+                                               TIntermTyped *indexExpression,
+                                               const TSourceLoc &amp;initLocation,
+                                               TIntermTyped *initializer);
</ins><span class="cx"> 
</span><span class="cx">     void parseGlobalLayoutQualifier(const TPublicType &amp;typeQualifier);
</span><del>-    TFunction *addConstructorFunc(TPublicType publicType);
-    TIntermTyped* addConstructor(TIntermNode*, TType*, TOperator, TFunction*, const TSourceLoc&amp;);
-    TIntermTyped* foldConstConstructor(TIntermAggregate* aggrNode, const TType&amp; type);
-    TIntermTyped* addConstVectorNode(TVectorFields&amp;, TIntermTyped*, const TSourceLoc&amp;);
-    TIntermTyped* addConstMatrixNode(int , TIntermTyped*, const TSourceLoc&amp;);
-    TIntermTyped* addConstArrayNode(int index, TIntermTyped* node, const TSourceLoc&amp; line);
-    TIntermTyped* addConstStruct(const TString &amp;identifier, TIntermTyped *node, const TSourceLoc&amp; line);
-    TIntermTyped* addIndexExpression(TIntermTyped *baseExpression, const TSourceLoc&amp; location, TIntermTyped *indexExpression);
-    TIntermTyped* addFieldSelectionExpression(TIntermTyped *baseExpression, const TSourceLoc&amp; dotLocation, const TString &amp;fieldString, const TSourceLoc&amp; fieldLocation);
</del><ins>+    TIntermAggregate *addFunctionPrototypeDeclaration(const TFunction &amp;function,
+                                                      const TSourceLoc &amp;location);
+    TIntermAggregate *addFunctionDefinition(const TFunction &amp;function,
+                                            TIntermAggregate *functionPrototype,
+                                            TIntermAggregate *functionBody,
+                                            const TSourceLoc &amp;location);
+    void parseFunctionPrototype(const TSourceLoc &amp;location,
+                                TFunction *function,
+                                TIntermAggregate **aggregateOut);
+    TFunction *parseFunctionDeclarator(const TSourceLoc &amp;location,
+                                       TFunction *function);
+    TFunction *addConstructorFunc(const TPublicType &amp;publicType);
+    TIntermTyped *addConstructor(TIntermNode *arguments,
+                                 TType *type,
+                                 TOperator op,
+                                 TFunction *fnCall,
+                                 const TSourceLoc &amp;line);
+    TIntermTyped *addConstVectorNode(TVectorFields &amp;fields,
+                                     TIntermConstantUnion *node,
+                                     const TSourceLoc &amp;line,
+                                     bool outOfRangeIndexIsError);
+    TIntermTyped *addConstMatrixNode(int index,
+                                     TIntermConstantUnion *node,
+                                     const TSourceLoc &amp;line,
+                                     bool outOfRangeIndexIsError);
+    TIntermTyped *addConstArrayNode(int index,
+                                    TIntermConstantUnion *node,
+                                    const TSourceLoc &amp;line,
+                                    bool outOfRangeIndexIsError);
+    TIntermTyped *addConstStruct(
+        const TString &amp;identifier, TIntermTyped *node, const TSourceLoc&amp; line);
+    TIntermTyped *addIndexExpression(TIntermTyped *baseExpression,
+                                     const TSourceLoc&amp; location,
+                                     TIntermTyped *indexExpression);
+    TIntermTyped* addFieldSelectionExpression(TIntermTyped *baseExpression,
+                                              const TSourceLoc &amp;dotLocation,
+                                              const TString &amp;fieldString,
+                                              const TSourceLoc &amp;fieldLocation);
</ins><span class="cx"> 
</span><del>-    TFieldList *addStructDeclaratorList(const TPublicType&amp; typeSpecifier, TFieldList *fieldList);
-    TPublicType addStructure(const TSourceLoc&amp; structLine, const TSourceLoc&amp; nameLine, const TString *structName, TFieldList* fieldList);
</del><ins>+    TFieldList *addStructDeclaratorList(const TPublicType &amp;typeSpecifier, TFieldList *fieldList);
+    TPublicType addStructure(const TSourceLoc &amp;structLine,
+                             const TSourceLoc &amp;nameLine,
+                             const TString *structName,
+                             TFieldList *fieldList);
</ins><span class="cx"> 
</span><del>-    TIntermAggregate* addInterfaceBlock(const TPublicType&amp; typeQualifier, const TSourceLoc&amp; nameLine, const TString&amp; blockName, TFieldList* fieldList, 
-                                        const TString* instanceName, const TSourceLoc&amp; instanceLine, TIntermTyped* arrayIndex, const TSourceLoc&amp; arrayIndexLine);
</del><ins>+    TIntermAggregate* addInterfaceBlock(const TPublicType &amp;typeQualifier,
+                                        const TSourceLoc &amp;nameLine,
+                                        const TString &amp;blockName,
+                                        TFieldList *fieldList,
+                                        const TString *instanceName,
+                                        const TSourceLoc &amp;instanceLine,
+                                        TIntermTyped *arrayIndex,
+                                        const TSourceLoc&amp; arrayIndexLine);
</ins><span class="cx"> 
</span><del>-    TLayoutQualifier parseLayoutQualifier(const TString &amp;qualifierType, const TSourceLoc&amp; qualifierTypeLine);
-    TLayoutQualifier parseLayoutQualifier(const TString &amp;qualifierType, const TSourceLoc&amp; qualifierTypeLine, const TString &amp;intValueString, int intValue, const TSourceLoc&amp; intValueLine);
</del><ins>+    TLayoutQualifier parseLayoutQualifier(
+        const TString &amp;qualifierType, const TSourceLoc &amp;qualifierTypeLine);
+    TLayoutQualifier parseLayoutQualifier(const TString &amp;qualifierType,
+                                          const TSourceLoc &amp;qualifierTypeLine,
+                                          const TString &amp;intValueString,
+                                          int intValue,
+                                          const TSourceLoc &amp;intValueLine);
</ins><span class="cx">     TLayoutQualifier joinLayoutQualifiers(TLayoutQualifier leftQualifier, TLayoutQualifier rightQualifier);
</span><span class="cx">     TPublicType joinInterpolationQualifiers(const TSourceLoc &amp;interpolationLoc, TQualifier interpolationQualifier,
</span><span class="cx">                                             const TSourceLoc &amp;storageLoc, TQualifier storageQualifier);
</span><span class="lines">@@ -187,56 +301,92 @@
</span><span class="cx">     // Performs an error check for embedded struct declarations.
</span><span class="cx">     // Returns true if an error was raised due to the declaration of
</span><span class="cx">     // this struct.
</span><del>-    bool enterStructDeclaration(const TSourceLoc&amp; line, const TString&amp; identifier);
</del><ins>+    bool enterStructDeclaration(const TSourceLoc &amp;line, const TString &amp;identifier);
</ins><span class="cx">     void exitStructDeclaration();
</span><span class="cx"> 
</span><del>-    bool structNestingErrorCheck(const TSourceLoc&amp; line, const TField&amp; field);
</del><ins>+    bool structNestingErrorCheck(const TSourceLoc &amp;line, const TField &amp;field);
</ins><span class="cx"> 
</span><span class="cx">     TIntermSwitch *addSwitch(TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &amp;loc);
</span><span class="cx">     TIntermCase *addCase(TIntermTyped *condition, const TSourceLoc &amp;loc);
</span><span class="cx">     TIntermCase *addDefault(const TSourceLoc &amp;loc);
</span><span class="cx"> 
</span><del>-    TIntermTyped *addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &amp;);
-    TIntermTyped *addUnaryMathLValue(TOperator op, TIntermTyped *child, const TSourceLoc &amp;);
-    TIntermTyped *addBinaryMath(TOperator op, TIntermTyped *left, TIntermTyped *right,
-        const TSourceLoc &amp;);
-    TIntermTyped *addBinaryMathBooleanResult(TOperator op, TIntermTyped *left, TIntermTyped *right,
-        const TSourceLoc &amp;);
-    TIntermTyped *addAssign(TOperator op, TIntermTyped *left, TIntermTyped *right,
-        const TSourceLoc &amp;loc);
</del><ins>+    TIntermTyped *addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &amp;loc);
+    TIntermTyped *addUnaryMathLValue(TOperator op, TIntermTyped *child, const TSourceLoc &amp;loc);
+    TIntermTyped *addBinaryMath(
+        TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &amp;loc);
+    TIntermTyped *addBinaryMathBooleanResult(
+        TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &amp;loc);
+    TIntermTyped *addAssign(
+        TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &amp;loc);
</ins><span class="cx"> 
</span><ins>+    TIntermTyped *addComma(TIntermTyped *left, TIntermTyped *right, const TSourceLoc &amp;loc);
+
</ins><span class="cx">     TIntermBranch *addBranch(TOperator op, const TSourceLoc &amp;loc);
</span><span class="cx">     TIntermBranch *addBranch(TOperator op, TIntermTyped *returnValue, const TSourceLoc &amp;loc);
</span><span class="cx"> 
</span><del>-    TIntermTyped *addFunctionCallOrMethod(TFunction *fnCall, TIntermNode *paramNode, TIntermNode *thisNode,
-                                          const TSourceLoc &amp;loc, bool *fatalError);
</del><ins>+    void checkTextureOffsetConst(TIntermAggregate *functionCall);
+    TIntermTyped *addFunctionCallOrMethod(TFunction *fnCall,
+                                          TIntermNode *paramNode,
+                                          TIntermNode *thisNode,
+                                          const TSourceLoc &amp;loc,
+                                          bool *fatalError);
</ins><span class="cx"> 
</span><del>-    TIntermTyped *addTernarySelection(TIntermTyped *cond, TIntermTyped *trueBlock, TIntermTyped *falseBlock,
-                                      const TSourceLoc &amp;line);
</del><ins>+    TIntermTyped *addTernarySelection(
+        TIntermTyped *cond, TIntermTyped *trueBlock, TIntermTyped *falseBlock, const TSourceLoc &amp;line);
</ins><span class="cx"> 
</span><ins>+    // TODO(jmadill): make these private
+    TIntermediate &amp;intermediate; // to hold and build a parse tree
+    TSymbolTable &amp;symbolTable;   // symbol table that goes with the language currently being parsed
+
</ins><span class="cx">   private:
</span><span class="cx">     bool declareVariable(const TSourceLoc &amp;line, const TString &amp;identifier, const TType &amp;type, TVariable **variable);
</span><span class="cx"> 
</span><span class="cx">     bool nonInitErrorCheck(const TSourceLoc &amp;line, const TString &amp;identifier, TPublicType *type);
</span><span class="cx"> 
</span><del>-    TIntermTyped *addBinaryMathInternal(TOperator op, TIntermTyped *left, TIntermTyped *right,
-        const TSourceLoc &amp;loc);
-    TIntermTyped *createAssign(TOperator op, TIntermTyped *left, TIntermTyped *right,
-        const TSourceLoc &amp;loc);
</del><ins>+    TIntermTyped *addBinaryMathInternal(
+        TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &amp;loc);
+    TIntermTyped *createAssign(
+        TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &amp;loc);
</ins><span class="cx">     // The funcReturnType parameter is expected to be non-null when the operation is a built-in function.
</span><span class="cx">     // It is expected to be null for other unary operators.
</span><del>-    TIntermTyped *createUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &amp;loc,
-        const TType *funcReturnType);
</del><ins>+    TIntermTyped *createUnaryMath(
+        TOperator op, TIntermTyped *child, const TSourceLoc &amp;loc, const TType *funcReturnType);
</ins><span class="cx"> 
</span><span class="cx">     // Return true if the checks pass
</span><del>-    bool binaryOpCommonCheck(TOperator op, TIntermTyped *left, TIntermTyped *right,
-        const TSourceLoc &amp;loc);
</del><ins>+    bool binaryOpCommonCheck(
+        TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &amp;loc);
</ins><span class="cx"> 
</span><span class="cx">     // Set to true when the last/current declarator list was started with an empty declaration.
</span><span class="cx">     bool mDeferredSingleDeclarationErrorCheck;
</span><ins>+
+    sh::GLenum mShaderType;              // vertex or fragment language (future: pack or unpack)
+    ShShaderSpec mShaderSpec;              // The language specification compiler conforms to - GLES2 or WebGL.
+    int mShaderVersion;
+    TIntermNode *mTreeRoot;       // root of parse tree being created
+    int mLoopNestingLevel;       // 0 if outside all loops
+    int mStructNestingLevel;      // incremented while parsing a struct declaration
+    int mSwitchNestingLevel;     // 0 if outside all switch statements
+    const TType *mCurrentFunctionType;  // the return type of the function that's currently being parsed
+    bool mFunctionReturnsValue;  // true if a non-void function has a return
+    bool mChecksPrecisionErrors;  // true if an error will be generated when a variable is declared without precision, explicit or implicit.
+    bool mFragmentPrecisionHighOnESSL1;  // true if highp precision is supported when compiling
+                                         // ESSL1.
+    TLayoutMatrixPacking mDefaultMatrixPacking;
+    TLayoutBlockStorage mDefaultBlockStorage;
+    TString mHashErrMsg;
+    TDiagnostics mDiagnostics;
+    TDirectiveHandler mDirectiveHandler;
+    pp::Preprocessor mPreprocessor;
+    void *mScanner;
+    bool mUsesFragData; // track if we are using both gl_FragData and gl_FragColor
+    bool mUsesFragColor;
+    bool mUsesSecondaryOutputs;  // Track if we are using either gl_SecondaryFragData or
+                                 // gl_Secondary FragColor or both.
+    int mMinProgramTexelOffset;
+    int mMaxProgramTexelOffset;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-int PaParseStrings(size_t count, const char* const string[], const int length[],
-                   TParseContext* context);
</del><ins>+int PaParseStrings(
+    size_t count, const char *const string[], const int length[], TParseContext *context);
</ins><span class="cx"> 
</span><span class="cx"> #endif // COMPILER_TRANSLATOR_PARSECONTEXT_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorPoolAlloch"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/PoolAlloc.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -247,19 +247,14 @@
</span><span class="cx">     pointer address(reference x) const { return &amp;x; }
</span><span class="cx">     const_pointer address(const_reference x) const { return &amp;x; }
</span><span class="cx"> 
</span><del>-    pool_allocator() : allocator(GetGlobalPoolAllocator()) { }
-    pool_allocator(TPoolAllocator&amp; a) : allocator(&amp;a) { }
-    pool_allocator(const pool_allocator&lt;T&gt;&amp; p) : allocator(p.allocator) { }
</del><ins>+    pool_allocator() { }
</ins><span class="cx"> 
</span><del>-    template &lt;class Other&gt;
-    pool_allocator&lt;T&gt;&amp; operator=(const pool_allocator&lt;Other&gt;&amp; p) {
-      allocator = p.allocator;
-      return *this;
-    }
-
</del><span class="cx">     template&lt;class Other&gt;
</span><del>-    pool_allocator(const pool_allocator&lt;Other&gt;&amp; p) : allocator(&amp;p.getAllocator()) { }
</del><ins>+    pool_allocator(const pool_allocator&lt;Other&gt;&amp; p) { }
</ins><span class="cx"> 
</span><ins>+    template &lt;class Other&gt;
+    pool_allocator&lt;T&gt;&amp; operator=(const pool_allocator&lt;Other&gt;&amp; p) { return *this; }
+
</ins><span class="cx"> #if defined(__SUNPRO_CC) &amp;&amp; !defined(_RWSTD_ALLOCATOR)
</span><span class="cx">     // libCStd on some platforms have a different allocate/deallocate interface.
</span><span class="cx">     // Caller pre-bakes sizeof(T) into 'n' which is the number of bytes to be
</span><span class="lines">@@ -284,17 +279,13 @@
</span><span class="cx">     void construct(pointer p, const T&amp; val) { new ((void *)p) T(val); }
</span><span class="cx">     void destroy(pointer p) { p-&gt;T::~T(); }
</span><span class="cx"> 
</span><del>-    bool operator==(const pool_allocator&amp; rhs) const { return &amp;getAllocator() == &amp;rhs.getAllocator(); }
-    bool operator!=(const pool_allocator&amp; rhs) const { return &amp;getAllocator() != &amp;rhs.getAllocator(); }
</del><ins>+    bool operator==(const pool_allocator&amp; rhs) const { return true; }
+    bool operator!=(const pool_allocator&amp; rhs) const { return false; }
</ins><span class="cx"> 
</span><span class="cx">     size_type max_size() const { return static_cast&lt;size_type&gt;(-1) / sizeof(T); }
</span><span class="cx">     size_type max_size(int size) const { return static_cast&lt;size_type&gt;(-1) / size; }
</span><span class="cx"> 
</span><del>-    void setAllocator(TPoolAllocator* a) { allocator = a; }
-    TPoolAllocator&amp; getAllocator() const { return *allocator; }
-
-protected:
-    TPoolAllocator* allocator;
</del><ins>+    TPoolAllocator&amp; getAllocator() const { return *GetGlobalPoolAllocator(); }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #endif // COMPILER_TRANSLATOR_POOLALLOC_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorQualifierAlivecpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierAlive.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierAlive.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/QualifierAlive.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,58 +0,0 @@
</span><del>-//
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#include &quot;compiler/translator/IntermNode.h&quot;
-
-class TAliveTraverser : public TIntermTraverser {
-public:
-    TAliveTraverser(TQualifier q) : TIntermTraverser(true, false, false, true), found(false), qualifier(q)
-    {
-    }
-
-        bool wasFound() { return found; }
-
-protected:
-    bool found;
-    TQualifier qualifier;
-
-    void visitSymbol(TIntermSymbol*);
-    bool visitSelection(Visit, TIntermSelection*);
-};
-
-//
-// Report whether or not a variable of the given qualifier type
-// is guaranteed written.  Not always possible to determine if
-// it is written conditionally.
-//
-// ?? It does not do this well yet, this is just a place holder
-// that simply determines if it was reference at all, anywhere.
-//
-bool QualifierWritten(TIntermNode* node, TQualifier qualifier)
-{
-    TAliveTraverser it(qualifier);
-
-    if (node)
-        node-&gt;traverse(&amp;it);
-
-    return it.wasFound();
-}
-
-void TAliveTraverser::visitSymbol(TIntermSymbol* node)
-{
-    //
-    // If it's what we're looking for, record it.
-    //
-    if (node-&gt;getQualifier() == qualifier)
-        found = true;
-}
-
-bool TAliveTraverser::visitSelection(Visit, TIntermSelection*)
-{
-    if (wasFound())
-        return false;
-
-    return true;
-}
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRecordConstantPrecisioncpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,157 @@
</span><ins>+//
+// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// During parsing, all constant expressions are folded to constant union nodes. The expressions that have been
+// folded may have had precision qualifiers, which should affect the precision of the consuming operation.
+// If the folded constant union nodes are written to output as such they won't have any precision qualifiers,
+// and their effect on the precision of the consuming operation is lost.
+//
+// RecordConstantPrecision is an AST traverser that inspects the precision qualifiers of constants and hoists
+// the constants outside the containing expression as precision qualified named variables in case that is
+// required for correct precision propagation.
+//
+
+#include &quot;compiler/translator/RecordConstantPrecision.h&quot;
+
+#include &quot;compiler/translator/InfoSink.h&quot;
+#include &quot;compiler/translator/IntermNode.h&quot;
+
+namespace
+{
+
+class RecordConstantPrecisionTraverser : public TIntermTraverser
+{
+  public:
+    RecordConstantPrecisionTraverser();
+
+    void visitConstantUnion(TIntermConstantUnion *node) override;
+
+    void nextIteration();
+
+    bool foundHigherPrecisionConstant() const { return mFoundHigherPrecisionConstant; }
+  protected:
+    bool operandAffectsParentOperationPrecision(TIntermTyped *operand);
+
+    bool mFoundHigherPrecisionConstant;
+};
+
+RecordConstantPrecisionTraverser::RecordConstantPrecisionTraverser()
+    : TIntermTraverser(true, false, true),
+      mFoundHigherPrecisionConstant(false)
+{
+}
+
+bool RecordConstantPrecisionTraverser::operandAffectsParentOperationPrecision(TIntermTyped *operand)
+{
+    const TIntermBinary *parentAsBinary = getParentNode()-&gt;getAsBinaryNode();
+    if (parentAsBinary != nullptr)
+    {
+        // If the constant is assigned or is used to initialize a variable, or if it's an index,
+        // its precision has no effect.
+        switch (parentAsBinary-&gt;getOp())
+        {
+          case EOpInitialize:
+          case EOpAssign:
+          case EOpIndexDirect:
+          case EOpIndexDirectStruct:
+          case EOpIndexDirectInterfaceBlock:
+          case EOpIndexIndirect:
+            return false;
+          default:
+            break;
+        }
+
+        TIntermTyped *otherOperand = parentAsBinary-&gt;getRight();
+        if (otherOperand == operand)
+        {
+            otherOperand = parentAsBinary-&gt;getLeft();
+        }
+        // If the precision of the other child is at least as high as the precision of the constant, the precision of
+        // the constant has no effect.
+        if (otherOperand-&gt;getAsConstantUnion() == nullptr &amp;&amp; otherOperand-&gt;getPrecision() &gt;= operand-&gt;getPrecision())
+        {
+            return false;
+        }
+    }
+
+    TIntermAggregate *parentAsAggregate = getParentNode()-&gt;getAsAggregate();
+    if (parentAsAggregate != nullptr)
+    {
+        if (!parentAsAggregate-&gt;gotPrecisionFromChildren())
+        {
+            // This can be either:
+            // * a call to an user-defined function
+            // * a call to a texture function
+            // * some other kind of aggregate
+            // In any of these cases the constant precision has no effect.
+            return false;
+        }
+        if (parentAsAggregate-&gt;isConstructor() &amp;&amp; parentAsAggregate-&gt;getBasicType() == EbtBool)
+        {
+            return false;
+        }
+        // If the precision of operands does affect the result, but the precision of any of the other children
+        // has a precision that's at least as high as the precision of the constant, the precision of the constant
+        // has no effect.
+        TIntermSequence *parameters = parentAsAggregate-&gt;getSequence();
+        for (TIntermNode *parameter : *parameters)
+        {
+            const TIntermTyped *typedParameter = parameter-&gt;getAsTyped();
+            if (parameter != operand &amp;&amp; typedParameter != nullptr &amp;&amp; parameter-&gt;getAsConstantUnion() == nullptr &amp;&amp;
+                typedParameter-&gt;getPrecision() &gt;= operand-&gt;getPrecision())
+            {
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+void RecordConstantPrecisionTraverser::visitConstantUnion(TIntermConstantUnion *node)
+{
+    if (mFoundHigherPrecisionConstant)
+        return;
+
+    // If the constant has lowp or undefined precision, it can't increase the precision of consuming operations.
+    if (node-&gt;getPrecision() &lt; EbpMedium)
+        return;
+
+    // It's possible the node has no effect on the precision of the consuming expression, depending on the
+    // consuming expression, and the precision of the other parameters of the expression.
+    if (!operandAffectsParentOperationPrecision(node))
+        return;
+
+    // Make the constant a precision-qualified named variable to make sure it affects the precision of the consuming
+    // expression.
+    TIntermSequence insertions;
+    insertions.push_back(createTempInitDeclaration(node, EvqConst));
+    insertStatementsInParentBlock(insertions);
+    mReplacements.push_back(NodeUpdateEntry(getParentNode(), node, createTempSymbol(node-&gt;getType()), false));
+    mFoundHigherPrecisionConstant = true;
+}
+
+void RecordConstantPrecisionTraverser::nextIteration()
+{
+    nextTemporaryIndex();
+    mFoundHigherPrecisionConstant = false;
+}
+
+} // namespace
+
+void RecordConstantPrecision(TIntermNode *root, unsigned int *temporaryIndex)
+{
+    RecordConstantPrecisionTraverser traverser;
+    ASSERT(temporaryIndex != nullptr);
+    traverser.useTemporaryIndex(temporaryIndex);
+    // Iterate as necessary, and reset the traverser between iterations.
+    do
+    {
+        traverser.nextIteration();
+        root-&gt;traverse(&amp;traverser);
+        if (traverser.foundHigherPrecisionConstant())
+            traverser.updateTree();
+    }
+    while (traverser.foundHigherPrecisionConstant());
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRecordConstantPrecisionh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RecordConstantPrecision.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,23 @@
</span><ins>+//
+// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// During parsing, all constant expressions are folded to constant union nodes. The expressions that have been
+// folded may have had precision qualifiers, which should affect the precision of the consuming operation.
+// If the folded constant union nodes are written to output as such they won't have any precision qualifiers,
+// and their effect on the precision of the consuming operation is lost.
+//
+// RecordConstantPrecision is an AST traverser that inspects the precision qualifiers of constants and hoists
+// the constants outside the containing expression as precision qualified named variables in case that is
+// required for correct precision propagation.
+//
+
+#ifndef COMPILER_TRANSLATOR_RECORDCONSTANTPRECISION_H_
+#define COMPILER_TRANSLATOR_RECORDCONSTANTPRECISION_H_
+
+class TIntermNode;
+
+void RecordConstantPrecision(TIntermNode *root, unsigned int *temporaryIndex);
+
+#endif   // COMPILER_TRANSLATOR_RECORDCONSTANTPRECISION_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRegenerateStructNamesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RegenerateStructNames.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RegenerateStructNames.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RegenerateStructNames.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,7 +7,7 @@
</span><span class="cx"> #ifndef COMPILER_TRANSLATOR_REGENERATESTRUCTNAMES_H_
</span><span class="cx"> #define COMPILER_TRANSLATOR_REGENERATESTRUCTNAMES_H_
</span><span class="cx"> 
</span><del>-#include &quot;compiler/translator/intermediate.h&quot;
</del><ins>+#include &quot;compiler/translator/Intermediate.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;set&gt;
</span><span class="lines">@@ -17,13 +17,14 @@
</span><span class="cx">   public:
</span><span class="cx">     RegenerateStructNames(const TSymbolTable &amp;symbolTable,
</span><span class="cx">                           int shaderVersion)
</span><del>-        : mSymbolTable(symbolTable),
</del><ins>+        : TIntermTraverser(true, false, false),
+          mSymbolTable(symbolTable),
</ins><span class="cx">           mShaderVersion(shaderVersion),
</span><span class="cx">           mScopeDepth(0) {}
</span><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    virtual void visitSymbol(TIntermSymbol *);
-    virtual bool visitAggregate(Visit, TIntermAggregate *);
</del><ins>+    void visitSymbol(TIntermSymbol *) override;
+    bool visitAggregate(Visit, TIntermAggregate *) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     const TSymbolTable &amp;mSymbolTable;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRemoveDynamicIndexingcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,513 @@
</span><ins>+//
+// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// RemoveDynamicIndexing is an AST traverser to remove dynamic indexing of vectors and matrices,
+// replacing them with calls to functions that choose which component to return or write.
+//
+
+#include &quot;compiler/translator/RemoveDynamicIndexing.h&quot;
+
+#include &quot;compiler/translator/InfoSink.h&quot;
+#include &quot;compiler/translator/IntermNode.h&quot;
+#include &quot;compiler/translator/SymbolTable.h&quot;
+
+namespace
+{
+
+TName GetIndexFunctionName(const TType &amp;type, bool write)
+{
+    TInfoSinkBase nameSink;
+    nameSink &lt;&lt; &quot;dyn_index_&quot;;
+    if (write)
+    {
+        nameSink &lt;&lt; &quot;write_&quot;;
+    }
+    if (type.isMatrix())
+    {
+        nameSink &lt;&lt; &quot;mat&quot; &lt;&lt; type.getCols() &lt;&lt; &quot;x&quot; &lt;&lt; type.getRows();
+    }
+    else
+    {
+        switch (type.getBasicType())
+        {
+            case EbtInt:
+                nameSink &lt;&lt; &quot;ivec&quot;;
+                break;
+            case EbtBool:
+                nameSink &lt;&lt; &quot;bvec&quot;;
+                break;
+            case EbtUInt:
+                nameSink &lt;&lt; &quot;uvec&quot;;
+                break;
+            case EbtFloat:
+                nameSink &lt;&lt; &quot;vec&quot;;
+                break;
+            default:
+                UNREACHABLE();
+        }
+        nameSink &lt;&lt; type.getNominalSize();
+    }
+    TString nameString = TFunction::mangleName(nameSink.c_str());
+    TName name(nameString);
+    name.setInternal(true);
+    return name;
+}
+
+TIntermSymbol *CreateBaseSymbol(const TType &amp;type, TQualifier qualifier)
+{
+    TIntermSymbol *symbol = new TIntermSymbol(0, &quot;base&quot;, type);
+    symbol-&gt;setInternal(true);
+    symbol-&gt;getTypePointer()-&gt;setQualifier(qualifier);
+    return symbol;
+}
+
+TIntermSymbol *CreateIndexSymbol()
+{
+    TIntermSymbol *symbol = new TIntermSymbol(0, &quot;index&quot;, TType(EbtInt, EbpHigh));
+    symbol-&gt;setInternal(true);
+    symbol-&gt;getTypePointer()-&gt;setQualifier(EvqIn);
+    return symbol;
+}
+
+TIntermSymbol *CreateValueSymbol(const TType &amp;type)
+{
+    TIntermSymbol *symbol = new TIntermSymbol(0, &quot;value&quot;, type);
+    symbol-&gt;setInternal(true);
+    symbol-&gt;getTypePointer()-&gt;setQualifier(EvqIn);
+    return symbol;
+}
+
+TIntermConstantUnion *CreateIntConstantNode(int i)
+{
+    TConstantUnion *constant = new TConstantUnion();
+    constant-&gt;setIConst(i);
+    return new TIntermConstantUnion(constant, TType(EbtInt, EbpHigh));
+}
+
+TIntermBinary *CreateIndexDirectBaseSymbolNode(const TType &amp;indexedType,
+                                               const TType &amp;fieldType,
+                                               const int index,
+                                               TQualifier baseQualifier)
+{
+    TIntermBinary *indexNode = new TIntermBinary(EOpIndexDirect);
+    indexNode-&gt;setType(fieldType);
+    TIntermSymbol *baseSymbol = CreateBaseSymbol(indexedType, baseQualifier);
+    indexNode-&gt;setLeft(baseSymbol);
+    indexNode-&gt;setRight(CreateIntConstantNode(index));
+    return indexNode;
+}
+
+TIntermBinary *CreateAssignValueSymbolNode(TIntermTyped *targetNode, const TType &amp;assignedValueType)
+{
+    TIntermBinary *assignNode = new TIntermBinary(EOpAssign);
+    assignNode-&gt;setType(assignedValueType);
+    assignNode-&gt;setLeft(targetNode);
+    assignNode-&gt;setRight(CreateValueSymbol(assignedValueType));
+    return assignNode;
+}
+
+TIntermTyped *EnsureSignedInt(TIntermTyped *node)
+{
+    if (node-&gt;getBasicType() == EbtInt)
+        return node;
+
+    TIntermAggregate *convertedNode = new TIntermAggregate(EOpConstructInt);
+    convertedNode-&gt;setType(TType(EbtInt));
+    convertedNode-&gt;getSequence()-&gt;push_back(node);
+    convertedNode-&gt;setPrecisionFromChildren();
+    return convertedNode;
+}
+
+TType GetFieldType(const TType &amp;indexedType)
+{
+    if (indexedType.isMatrix())
+    {
+        TType fieldType = TType(indexedType.getBasicType(), indexedType.getPrecision());
+        fieldType.setPrimarySize(static_cast&lt;unsigned char&gt;(indexedType.getRows()));
+        return fieldType;
+    }
+    else
+    {
+        return TType(indexedType.getBasicType(), indexedType.getPrecision());
+    }
+}
+
+// Generate a read or write function for one field in a vector/matrix.
+// Out-of-range indices are clamped. This is consistent with how ANGLE handles out-of-range
+// indices in other places.
+// Note that indices can be either int or uint. We create only int versions of the functions,
+// and convert uint indices to int at the call site.
+// read function example:
+// float dyn_index_vec2(in vec2 base, in int index)
+// {
+//    switch(index)
+//    {
+//      case (0):
+//        return base[0];
+//      case (1):
+//        return base[1];
+//      default:
+//        break;
+//    }
+//    if (index &lt; 0)
+//      return base[0];
+//    return base[1];
+// }
+// write function example:
+// void dyn_index_write_vec2(inout vec2 base, in int index, in float value)
+// {
+//    switch(index)
+//    {
+//      case (0):
+//        base[0] = value;
+//        return;
+//      case (1):
+//        base[1] = value;
+//        return;
+//      default:
+//        break;
+//    }
+//    if (index &lt; 0)
+//    {
+//      base[0] = value;
+//      return;
+//    }
+//    base[1] = value;
+// }
+// Note that else is not used in above functions to avoid the RewriteElseBlocks transformation.
+TIntermAggregate *GetIndexFunctionDefinition(TType type, bool write)
+{
+    ASSERT(!type.isArray());
+    // Conservatively use highp here, even if the indexed type is not highp. That way the code can't
+    // end up using mediump version of an indexing function for a highp value, if both mediump and
+    // highp values are being indexed in the shader. For HLSL precision doesn't matter, but in
+    // principle this code could be used with multiple backends.
+    type.setPrecision(EbpHigh);
+    TIntermAggregate *indexingFunction = new TIntermAggregate(EOpFunction);
+    indexingFunction-&gt;setNameObj(GetIndexFunctionName(type, write));
+
+    TType fieldType = GetFieldType(type);
+    int numCases = 0;
+    if (type.isMatrix())
+    {
+        numCases = type.getCols();
+    }
+    else
+    {
+        numCases = type.getNominalSize();
+    }
+    if (write)
+    {
+        indexingFunction-&gt;setType(TType(EbtVoid));
+    }
+    else
+    {
+        indexingFunction-&gt;setType(fieldType);
+    }
+
+    TIntermAggregate *paramsNode = new TIntermAggregate(EOpParameters);
+    TQualifier baseQualifier = EvqInOut;
+    if (!write)
+        baseQualifier        = EvqIn;
+    TIntermSymbol *baseParam = CreateBaseSymbol(type, baseQualifier);
+    paramsNode-&gt;getSequence()-&gt;push_back(baseParam);
+    TIntermSymbol *indexParam = CreateIndexSymbol();
+    paramsNode-&gt;getSequence()-&gt;push_back(indexParam);
+    if (write)
+    {
+        TIntermSymbol *valueParam = CreateValueSymbol(fieldType);
+        paramsNode-&gt;getSequence()-&gt;push_back(valueParam);
+    }
+    indexingFunction-&gt;getSequence()-&gt;push_back(paramsNode);
+
+    TIntermAggregate *statementList = new TIntermAggregate(EOpSequence);
+    for (int i = 0; i &lt; numCases; ++i)
+    {
+        TIntermCase *caseNode = new TIntermCase(CreateIntConstantNode(i));
+        statementList-&gt;getSequence()-&gt;push_back(caseNode);
+
+        TIntermBinary *indexNode =
+            CreateIndexDirectBaseSymbolNode(type, fieldType, i, baseQualifier);
+        if (write)
+        {
+            TIntermBinary *assignNode = CreateAssignValueSymbolNode(indexNode, fieldType);
+            statementList-&gt;getSequence()-&gt;push_back(assignNode);
+            TIntermBranch *returnNode = new TIntermBranch(EOpReturn, nullptr);
+            statementList-&gt;getSequence()-&gt;push_back(returnNode);
+        }
+        else
+        {
+            TIntermBranch *returnNode = new TIntermBranch(EOpReturn, indexNode);
+            statementList-&gt;getSequence()-&gt;push_back(returnNode);
+        }
+    }
+
+    // Default case
+    TIntermCase *defaultNode = new TIntermCase(nullptr);
+    statementList-&gt;getSequence()-&gt;push_back(defaultNode);
+    TIntermBranch *breakNode = new TIntermBranch(EOpBreak, nullptr);
+    statementList-&gt;getSequence()-&gt;push_back(breakNode);
+
+    TIntermSwitch *switchNode = new TIntermSwitch(CreateIndexSymbol(), statementList);
+
+    TIntermAggregate *bodyNode = new TIntermAggregate(EOpSequence);
+    bodyNode-&gt;getSequence()-&gt;push_back(switchNode);
+
+    TIntermBinary *cond = new TIntermBinary(EOpLessThan);
+    cond-&gt;setType(TType(EbtBool, EbpUndefined));
+    cond-&gt;setLeft(CreateIndexSymbol());
+    cond-&gt;setRight(CreateIntConstantNode(0));
+
+    // Two blocks: one accesses (either reads or writes) the first element and returns,
+    // the other accesses the last element.
+    TIntermAggregate *useFirstBlock = new TIntermAggregate(EOpSequence);
+    TIntermAggregate *useLastBlock = new TIntermAggregate(EOpSequence);
+    TIntermBinary *indexFirstNode =
+        CreateIndexDirectBaseSymbolNode(type, fieldType, 0, baseQualifier);
+    TIntermBinary *indexLastNode =
+        CreateIndexDirectBaseSymbolNode(type, fieldType, numCases - 1, baseQualifier);
+    if (write)
+    {
+        TIntermBinary *assignFirstNode = CreateAssignValueSymbolNode(indexFirstNode, fieldType);
+        useFirstBlock-&gt;getSequence()-&gt;push_back(assignFirstNode);
+        TIntermBranch *returnNode = new TIntermBranch(EOpReturn, nullptr);
+        useFirstBlock-&gt;getSequence()-&gt;push_back(returnNode);
+
+        TIntermBinary *assignLastNode = CreateAssignValueSymbolNode(indexLastNode, fieldType);
+        useLastBlock-&gt;getSequence()-&gt;push_back(assignLastNode);
+    }
+    else
+    {
+        TIntermBranch *returnFirstNode = new TIntermBranch(EOpReturn, indexFirstNode);
+        useFirstBlock-&gt;getSequence()-&gt;push_back(returnFirstNode);
+
+        TIntermBranch *returnLastNode = new TIntermBranch(EOpReturn, indexLastNode);
+        useLastBlock-&gt;getSequence()-&gt;push_back(returnLastNode);
+    }
+    TIntermSelection *ifNode = new TIntermSelection(cond, useFirstBlock, nullptr);
+    bodyNode-&gt;getSequence()-&gt;push_back(ifNode);
+    bodyNode-&gt;getSequence()-&gt;push_back(useLastBlock);
+
+    indexingFunction-&gt;getSequence()-&gt;push_back(bodyNode);
+
+    return indexingFunction;
+}
+
+class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser
+{
+  public:
+    RemoveDynamicIndexingTraverser(const TSymbolTable &amp;symbolTable, int shaderVersion);
+
+    bool visitBinary(Visit visit, TIntermBinary *node) override;
+
+    void insertHelperDefinitions(TIntermNode *root);
+
+    void nextIteration();
+
+    bool usedTreeInsertion() const { return mUsedTreeInsertion; }
+
+  protected:
+    // Sets of types that are indexed. Note that these can not store multiple variants
+    // of the same type with different precisions - only one precision gets stored.
+    std::set&lt;TType&gt; mIndexedVecAndMatrixTypes;
+    std::set&lt;TType&gt; mWrittenVecAndMatrixTypes;
+
+    bool mUsedTreeInsertion;
+
+    // When true, the traverser will remove side effects from any indexing expression.
+    // This is done so that in code like
+    //   V[j++][i]++.
+    // where V is an array of vectors, j++ will only be evaluated once.
+    bool mRemoveIndexSideEffectsInSubtree;
+};
+
+RemoveDynamicIndexingTraverser::RemoveDynamicIndexingTraverser(const TSymbolTable &amp;symbolTable,
+                                                               int shaderVersion)
+    : TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion),
+      mUsedTreeInsertion(false),
+      mRemoveIndexSideEffectsInSubtree(false)
+{
+}
+
+void RemoveDynamicIndexingTraverser::insertHelperDefinitions(TIntermNode *root)
+{
+    TIntermAggregate *rootAgg = root-&gt;getAsAggregate();
+    ASSERT(rootAgg != nullptr &amp;&amp; rootAgg-&gt;getOp() == EOpSequence);
+    TIntermSequence insertions;
+    for (TType type : mIndexedVecAndMatrixTypes)
+    {
+        insertions.push_back(GetIndexFunctionDefinition(type, false));
+    }
+    for (TType type : mWrittenVecAndMatrixTypes)
+    {
+        insertions.push_back(GetIndexFunctionDefinition(type, true));
+    }
+    mInsertions.push_back(NodeInsertMultipleEntry(rootAgg, 0, insertions, TIntermSequence()));
+}
+
+// Create a call to dyn_index_*() based on an indirect indexing op node
+TIntermAggregate *CreateIndexFunctionCall(TIntermBinary *node,
+                                          TIntermTyped *indexedNode,
+                                          TIntermTyped *index)
+{
+    ASSERT(node-&gt;getOp() == EOpIndexIndirect);
+    TIntermAggregate *indexingCall = new TIntermAggregate(EOpFunctionCall);
+    indexingCall-&gt;setLine(node-&gt;getLine());
+    indexingCall-&gt;setUserDefined();
+    indexingCall-&gt;setNameObj(GetIndexFunctionName(indexedNode-&gt;getType(), false));
+    indexingCall-&gt;getSequence()-&gt;push_back(indexedNode);
+    indexingCall-&gt;getSequence()-&gt;push_back(index);
+
+    TType fieldType = GetFieldType(indexedNode-&gt;getType());
+    indexingCall-&gt;setType(fieldType);
+    return indexingCall;
+}
+
+TIntermAggregate *CreateIndexedWriteFunctionCall(TIntermBinary *node,
+                                                 TIntermTyped *index,
+                                                 TIntermTyped *writtenValue)
+{
+    // Deep copy the left node so that two pointers to the same node don't end up in the tree.
+    TIntermNode *leftCopy = node-&gt;getLeft()-&gt;deepCopy();
+    ASSERT(leftCopy != nullptr &amp;&amp; leftCopy-&gt;getAsTyped() != nullptr);
+    TIntermAggregate *indexedWriteCall =
+        CreateIndexFunctionCall(node, leftCopy-&gt;getAsTyped(), index);
+    indexedWriteCall-&gt;setNameObj(GetIndexFunctionName(node-&gt;getLeft()-&gt;getType(), true));
+    indexedWriteCall-&gt;setType(TType(EbtVoid));
+    indexedWriteCall-&gt;getSequence()-&gt;push_back(writtenValue);
+    return indexedWriteCall;
+}
+
+bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *node)
+{
+    if (mUsedTreeInsertion)
+        return false;
+
+    if (node-&gt;getOp() == EOpIndexIndirect)
+    {
+        if (mRemoveIndexSideEffectsInSubtree)
+        {
+            ASSERT(node-&gt;getRight()-&gt;hasSideEffects());
+            // In case we're just removing index side effects, convert
+            //   v_expr[index_expr]
+            // to this:
+            //   int s0 = index_expr; v_expr[s0];
+            // Now v_expr[s0] can be safely executed several times without unintended side effects.
+
+            // Init the temp variable holding the index
+            TIntermAggregate *initIndex = createTempInitDeclaration(node-&gt;getRight());
+            TIntermSequence insertions;
+            insertions.push_back(initIndex);
+            insertStatementsInParentBlock(insertions);
+            mUsedTreeInsertion = true;
+
+            // Replace the index with the temp variable
+            TIntermSymbol *tempIndex = createTempSymbol(node-&gt;getRight()-&gt;getType());
+            NodeUpdateEntry replaceIndex(node, node-&gt;getRight(), tempIndex, false);
+            mReplacements.push_back(replaceIndex);
+        }
+        else if (!node-&gt;getLeft()-&gt;isArray() &amp;&amp; node-&gt;getLeft()-&gt;getBasicType() != EbtStruct)
+        {
+            bool write = isLValueRequiredHere();
+
+            TType type = node-&gt;getLeft()-&gt;getType();
+            mIndexedVecAndMatrixTypes.insert(type);
+
+            if (write)
+            {
+                // Convert:
+                //   v_expr[index_expr]++;
+                // to this:
+                //   int s0 = index_expr; float s1 = dyn_index(v_expr, s0); s1++;
+                //   dyn_index_write(v_expr, s0, s1);
+                // This works even if index_expr has some side effects.
+                if (node-&gt;getLeft()-&gt;hasSideEffects())
+                {
+                    // If v_expr has side effects, those need to be removed before proceeding.
+                    // Otherwise the side effects of v_expr would be evaluated twice.
+                    // The only case where an l-value can have side effects is when it is
+                    // indexing. For example, it can be V[j++] where V is an array of vectors.
+                    mRemoveIndexSideEffectsInSubtree = true;
+                    return true;
+                }
+                // TODO(oetuaho@nvidia.com): This is not optimal if the expression using the value
+                // only writes it and doesn't need the previous value. http://anglebug.com/1116
+
+                mWrittenVecAndMatrixTypes.insert(type);
+                TType fieldType = GetFieldType(type);
+
+                TIntermSequence insertionsBefore;
+                TIntermSequence insertionsAfter;
+
+                // Store the index in a temporary signed int variable.
+                TIntermTyped *indexInitializer = EnsureSignedInt(node-&gt;getRight());
+                TIntermAggregate *initIndex = createTempInitDeclaration(indexInitializer);
+                initIndex-&gt;setLine(node-&gt;getLine());
+                insertionsBefore.push_back(initIndex);
+
+                TIntermAggregate *indexingCall = CreateIndexFunctionCall(
+                    node, node-&gt;getLeft(), createTempSymbol(indexInitializer-&gt;getType()));
+
+                // Create a node for referring to the index after the nextTemporaryIndex() call
+                // below.
+                TIntermSymbol *tempIndex = createTempSymbol(indexInitializer-&gt;getType());
+
+                nextTemporaryIndex();  // From now on, creating temporary symbols that refer to the
+                                       // field value.
+                insertionsBefore.push_back(createTempInitDeclaration(indexingCall));
+
+                TIntermAggregate *indexedWriteCall =
+                    CreateIndexedWriteFunctionCall(node, tempIndex, createTempSymbol(fieldType));
+                insertionsAfter.push_back(indexedWriteCall);
+                insertStatementsInParentBlock(insertionsBefore, insertionsAfter);
+                NodeUpdateEntry replaceIndex(getParentNode(), node, createTempSymbol(fieldType),
+                                             false);
+                mReplacements.push_back(replaceIndex);
+                mUsedTreeInsertion = true;
+            }
+            else
+            {
+                // The indexed value is not being written, so we can simply convert
+                //   v_expr[index_expr]
+                // into
+                //   dyn_index(v_expr, index_expr)
+                // If the index_expr is unsigned, we'll convert it to signed.
+                ASSERT(!mRemoveIndexSideEffectsInSubtree);
+                TIntermAggregate *indexingCall = CreateIndexFunctionCall(
+                    node, node-&gt;getLeft(), EnsureSignedInt(node-&gt;getRight()));
+                NodeUpdateEntry replaceIndex(getParentNode(), node, indexingCall, false);
+                mReplacements.push_back(replaceIndex);
+            }
+        }
+    }
+    return !mUsedTreeInsertion;
+}
+
+void RemoveDynamicIndexingTraverser::nextIteration()
+{
+    mUsedTreeInsertion               = false;
+    mRemoveIndexSideEffectsInSubtree = false;
+    nextTemporaryIndex();
+}
+
+}  // namespace
+
+void RemoveDynamicIndexing(TIntermNode *root,
+                           unsigned int *temporaryIndex,
+                           const TSymbolTable &amp;symbolTable,
+                           int shaderVersion)
+{
+    RemoveDynamicIndexingTraverser traverser(symbolTable, shaderVersion);
+    ASSERT(temporaryIndex != nullptr);
+    traverser.useTemporaryIndex(temporaryIndex);
+    do
+    {
+        traverser.nextIteration();
+        root-&gt;traverse(&amp;traverser);
+        traverser.updateTree();
+    } while (traverser.usedTreeInsertion());
+    traverser.insertHelperDefinitions(root);
+    traverser.updateTree();
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRemoveDynamicIndexingh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemoveDynamicIndexing.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+//
+// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// RemoveDynamicIndexing is an AST traverser to remove dynamic indexing of vectors and matrices,
+// replacing them with calls to functions that choose which component to return or write.
+//
+
+#ifndef COMPILER_TRANSLATOR_REMOVEDYNAMICINDEXING_H_
+#define COMPILER_TRANSLATOR_REMOVEDYNAMICINDEXING_H_
+
+class TIntermNode;
+class TSymbolTable;
+
+void RemoveDynamicIndexing(TIntermNode *root,
+                           unsigned int *temporaryIndex,
+                           const TSymbolTable &amp;symbolTable,
+                           int shaderVersion);
+
+#endif  // COMPILER_TRANSLATOR_REMOVEDYNAMICINDEXING_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRemovePowcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,105 @@
</span><ins>+//
+// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// RemovePow is an AST traverser to convert pow(x, y) built-in calls where y is a
+// constant to exp2(y * log2(x)). This works around an issue in NVIDIA 311 series
+// OpenGL drivers.
+//
+
+#include &quot;compiler/translator/RemovePow.h&quot;
+
+#include &quot;compiler/translator/InfoSink.h&quot;
+#include &quot;compiler/translator/IntermNode.h&quot;
+
+namespace
+{
+
+bool IsProblematicPow(TIntermTyped *node)
+{
+    TIntermAggregate *agg = node-&gt;getAsAggregate();
+    if (agg != nullptr &amp;&amp; agg-&gt;getOp() == EOpPow)
+    {
+        ASSERT(agg-&gt;getSequence()-&gt;size() == 2);
+        return agg-&gt;getSequence()-&gt;at(1)-&gt;getAsConstantUnion() != nullptr;
+    }
+    return false;
+}
+
+// Traverser that converts all pow operations simultaneously.
+class RemovePowTraverser : public TIntermTraverser
+{
+  public:
+    RemovePowTraverser();
+
+    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
+
+    void nextIteration() { mNeedAnotherIteration = false; }
+    bool needAnotherIteration() const { return mNeedAnotherIteration; }
+
+  protected:
+    bool mNeedAnotherIteration;
+};
+
+RemovePowTraverser::RemovePowTraverser()
+    : TIntermTraverser(true, false, false),
+      mNeedAnotherIteration(false)
+{
+}
+
+bool RemovePowTraverser::visitAggregate(Visit visit, TIntermAggregate *node)
+{
+    if (IsProblematicPow(node))
+    {
+        TInfoSink nullSink;
+
+        TIntermTyped *x = node-&gt;getSequence()-&gt;at(0)-&gt;getAsTyped();
+        TIntermTyped *y = node-&gt;getSequence()-&gt;at(1)-&gt;getAsTyped();
+
+        TIntermUnary *log = new TIntermUnary(EOpLog2);
+        log-&gt;setOperand(x);
+        log-&gt;setLine(node-&gt;getLine());
+        log-&gt;setType(x-&gt;getType());
+
+        TIntermBinary *mul = new TIntermBinary(EOpMul);
+        mul-&gt;setLeft(y);
+        mul-&gt;setRight(log);
+        mul-&gt;setLine(node-&gt;getLine());
+        bool valid = mul-&gt;promote(nullSink);
+        UNUSED_ASSERTION_VARIABLE(valid);
+        ASSERT(valid);
+
+        TIntermUnary *exp = new TIntermUnary(EOpExp2);
+        exp-&gt;setOperand(mul);
+        exp-&gt;setLine(node-&gt;getLine());
+        exp-&gt;setType(node-&gt;getType());
+
+        NodeUpdateEntry replacePow(getParentNode(), node, exp, false);
+        mReplacements.push_back(replacePow);
+
+        // If the x parameter also needs to be replaced, we need to do that in another traversal,
+        // since it's parent node will change in a way that's not handled correctly by updateTree().
+        if (IsProblematicPow(x))
+        {
+            mNeedAnotherIteration = true;
+            return false;
+        }
+    }
+    return true;
+}
+
+} // namespace
+
+void RemovePow(TIntermNode *root)
+{
+    RemovePowTraverser traverser;
+    // Iterate as necessary, and reset the traverser between iterations.
+    do
+    {
+        traverser.nextIteration();
+        root-&gt;traverse(&amp;traverser);
+        traverser.updateTree();
+    }
+    while (traverser.needAnotherIteration());
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRemovePowh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RemovePow.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,18 @@
</span><ins>+//
+// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// RemovePow is an AST traverser to convert pow(x, y) built-in calls where y is a
+// constant to exp2(y * log2(x)). This works around an issue in NVIDIA 311 series
+// OpenGL drivers.
+//
+
+#ifndef COMPILER_TRANSLATOR_REMOVEPOW_H_
+#define COMPILER_TRANSLATOR_REMOVEPOW_H_
+
+class TIntermNode;
+
+void RemovePow(TIntermNode *root);
+
+#endif   // COMPILER_TRANSLATOR_REMOVEPOW_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRenameFunctionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RenameFunction.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RenameFunction.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RenameFunction.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -20,7 +20,7 @@
</span><span class="cx">     , mOldFunctionName(oldFunctionName)
</span><span class="cx">     , mNewFunctionName(newFunctionName) {}
</span><span class="cx"> 
</span><del>-    virtual bool visitAggregate(Visit visit, TIntermAggregate* node)
</del><ins>+    bool visitAggregate(Visit visit, TIntermAggregate *node) override
</ins><span class="cx">     {
</span><span class="cx">         TOperator op = node-&gt;getOp();
</span><span class="cx">         if ((op == EOpFunction || op == EOpFunctionCall) &amp;&amp; node-&gt;getName() == mOldFunctionName)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRewriteDoWhilecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,163 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// RewriteDoWhile.cpp: rewrites do-while loops using another equivalent
+// construct.
+
+#include &quot;compiler/translator/RewriteDoWhile.h&quot;
+
+#include &quot;compiler/translator/IntermNode.h&quot;
+
+namespace
+{
+
+// An AST traverser that rewrites loops of the form
+//   do {
+//     CODE;
+//   } while (CONDITION)
+//
+// to loops of the form
+//   bool temp = false;
+//   while (true) {
+//     if (temp) {
+//       if (!CONDITION) {
+//         break;
+//       }
+//     }
+//     temp = true;
+//     CODE;
+//   }
+//
+// The reason we don't use a simpler form, with for example just (temp &amp;&amp; !CONDITION) in the
+// while condition, is that short-circuit is often badly supported by driver shader compiler.
+// The double if has the same effect, but forces shader compilers to behave.
+//
+// TODO(cwallez) when UnfoldShortCircuitIntoIf handles loops correctly, revisit this as we might
+// be able to use while (temp || CONDITION) with temp initially set to true then run
+// UnfoldShortCircuitIntoIf
+class DoWhileRewriter : public TIntermTraverser
+{
+  public:
+    DoWhileRewriter() : TIntermTraverser(true, false, false) {}
+
+    bool visitAggregate(Visit, TIntermAggregate *node) override
+    {
+        // A well-formed AST can only have do-while in EOpSequence which represent lists of
+        // statements. By doing a prefix traversal we are able to replace the do-while in the
+        // sequence directly as the content of the do-while will be traversed later.
+        if (node-&gt;getOp() != EOpSequence)
+        {
+            return true;
+        }
+
+        TIntermSequence *statements = node-&gt;getSequence();
+
+        // The statements vector will have new statements inserted when we encounter a do-while,
+        // which prevents us from using a range-based for loop. Using the usual i++ works, as
+        // the (two) new statements inserted replace the statement at the current position.
+        for (size_t i = 0; i &lt; statements-&gt;size(); i++)
+        {
+            TIntermNode *statement = (*statements)[i];
+            TIntermLoop *loop      = statement-&gt;getAsLoopNode();
+
+            if (loop == nullptr || loop-&gt;getType() != ELoopDoWhile)
+            {
+                continue;
+            }
+
+            TType boolType = TType(EbtBool);
+
+            // bool temp = false;
+            TIntermAggregate *tempDeclaration = nullptr;
+            {
+                TConstantUnion *falseConstant = new TConstantUnion();
+                falseConstant-&gt;setBConst(false);
+                TIntermTyped *falseValue = new TIntermConstantUnion(falseConstant, boolType);
+
+                tempDeclaration = createTempInitDeclaration(falseValue);
+            }
+
+            // temp = true;
+            TIntermBinary *assignTrue = nullptr;
+            {
+                TConstantUnion *trueConstant = new TConstantUnion();
+                trueConstant-&gt;setBConst(true);
+                TIntermTyped *trueValue = new TIntermConstantUnion(trueConstant, boolType);
+
+                assignTrue = createTempAssignment(trueValue);
+            }
+
+            // if (temp) {
+            //   if (!CONDITION) {
+            //     break;
+            //   }
+            // }
+            TIntermSelection *breakIf = nullptr;
+            {
+                TIntermBranch *breakStatement = new TIntermBranch(EOpBreak, nullptr);
+
+                TIntermAggregate *breakBlock = new TIntermAggregate(EOpSequence);
+                breakBlock-&gt;getSequence()-&gt;push_back(breakStatement);
+
+                TIntermUnary *negatedCondition = new TIntermUnary(EOpLogicalNot);
+                negatedCondition-&gt;setOperand(loop-&gt;getCondition());
+
+                TIntermSelection *innerIf =
+                    new TIntermSelection(negatedCondition, breakBlock, nullptr);
+
+                TIntermAggregate *innerIfBlock = new TIntermAggregate(EOpSequence);
+                innerIfBlock-&gt;getSequence()-&gt;push_back(innerIf);
+
+                breakIf = new TIntermSelection(createTempSymbol(boolType), innerIfBlock, nullptr);
+            }
+
+            // Assemble the replacement loops, reusing the do-while loop's body and inserting our
+            // statements at the front.
+            TIntermLoop *newLoop = nullptr;
+            {
+                TConstantUnion *trueConstant = new TConstantUnion();
+                trueConstant-&gt;setBConst(true);
+                TIntermTyped *trueValue = new TIntermConstantUnion(trueConstant, boolType);
+
+                TIntermAggregate *body = nullptr;
+                if (loop-&gt;getBody() != nullptr)
+                {
+                    body = loop-&gt;getBody()-&gt;getAsAggregate();
+                }
+                else
+                {
+                    body = new TIntermAggregate(EOpSequence);
+                }
+                auto sequence = body-&gt;getSequence();
+                sequence-&gt;insert(sequence-&gt;begin(), assignTrue);
+                sequence-&gt;insert(sequence-&gt;begin(), breakIf);
+
+                newLoop = new TIntermLoop(ELoopWhile, nullptr, trueValue, nullptr, body);
+            }
+
+            TIntermSequence replacement;
+            replacement.push_back(tempDeclaration);
+            replacement.push_back(newLoop);
+
+            node-&gt;replaceChildNodeWithMultiple(loop, replacement);
+
+            nextTemporaryIndex();
+        }
+        return true;
+    }
+};
+
+}  // anonymous namespace
+
+void RewriteDoWhile(TIntermNode *root, unsigned int *temporaryIndex)
+{
+    ASSERT(temporaryIndex != 0);
+
+    DoWhileRewriter rewriter;
+    rewriter.useTemporaryIndex(temporaryIndex);
+
+    root-&gt;traverse(&amp;rewriter);
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRewriteDoWhileh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteDoWhile.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// RewriteDoWhile.h: rewrite do-while loops as while loops to work around
+// driver bugs
+
+#ifndef COMPILER_TRANSLATOR_REWRITEDOWHILE_H_
+#define COMPILER_TRANSLATOR_REWRITEDOWHILE_H_
+
+class TIntermNode;
+void RewriteDoWhile(TIntermNode *root, unsigned int *temporaryIndex);
+
+#endif  // COMPILER_TRANSLATOR_REWRITEDOWHILE_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRewriteElseBlockscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -23,32 +23,14 @@
</span><span class="cx">     ElseBlockRewriter();
</span><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    bool visitAggregate(Visit visit, TIntermAggregate *aggregate);
</del><ins>+    bool visitAggregate(Visit visit, TIntermAggregate *aggregate) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    int mTemporaryIndex;
</del><span class="cx">     const TType *mFunctionType;
</span><span class="cx"> 
</span><span class="cx">     TIntermNode *rewriteSelection(TIntermSelection *selection);
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-TIntermSymbol *MakeNewTemporary(const TString &amp;name, TBasicType type)
-{
-    TType variableType(type, EbpHigh, EvqTemporary);
-    TIntermSymbol *node = new TIntermSymbol(-1, name, variableType);
-    node-&gt;setInternal(true);
-    return node;
-}
-
-TIntermBinary *MakeNewBinary(TOperator op, TIntermTyped *left, TIntermTyped *right, const TType &amp;resultType)
-{
-    TIntermBinary *binary = new TIntermBinary(op);
-    binary-&gt;setLeft(left);
-    binary-&gt;setRight(right);
-    binary-&gt;setType(resultType);
-    return binary;
-}
-
</del><span class="cx"> TIntermUnary *MakeNewUnary(TOperator op, TIntermTyped *operand)
</span><span class="cx"> {
</span><span class="cx">     TIntermUnary *unary = new TIntermUnary(op, operand-&gt;getType());
</span><span class="lines">@@ -57,8 +39,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ElseBlockRewriter::ElseBlockRewriter()
</span><del>-    : TIntermTraverser(true, false, true, false),
-      mTemporaryIndex(0),
</del><ins>+    : TIntermTraverser(true, false, true),
</ins><span class="cx">       mFunctionType(NULL)
</span><span class="cx"> {}
</span><span class="cx"> 
</span><span class="lines">@@ -73,7 +54,7 @@
</span><span class="cx">             {
</span><span class="cx">                 TIntermNode *statement = (*node-&gt;getSequence())[statementIndex];
</span><span class="cx">                 TIntermSelection *selection = statement-&gt;getAsSelectionNode();
</span><del>-                if (selection &amp;&amp; selection-&gt;getFalseBlock() != NULL)
</del><ins>+                if (selection &amp;&amp; selection-&gt;getFalseBlock() != nullptr)
</ins><span class="cx">                 {
</span><span class="cx">                     // Check for if / else if
</span><span class="cx">                     TIntermSelection *elseIfBranch = selection-&gt;getFalseBlock()-&gt;getAsSelectionNode();
</span><span class="lines">@@ -103,20 +84,20 @@
</span><span class="cx"> 
</span><span class="cx"> TIntermNode *ElseBlockRewriter::rewriteSelection(TIntermSelection *selection)
</span><span class="cx"> {
</span><del>-    ASSERT(selection != NULL);
</del><ins>+    ASSERT(selection != nullptr);
</ins><span class="cx"> 
</span><del>-    TString temporaryName = &quot;cond_&quot; + str(mTemporaryIndex++);
</del><ins>+    nextTemporaryIndex();
+
</ins><span class="cx">     TIntermTyped *typedCondition = selection-&gt;getCondition()-&gt;getAsTyped();
</span><del>-    TType resultType(EbtBool, EbpUndefined);
-    TIntermSymbol *conditionSymbolInit = MakeNewTemporary(temporaryName, EbtBool);
-    TIntermBinary *storeCondition = MakeNewBinary(EOpInitialize, conditionSymbolInit,
-                                                  typedCondition, resultType);
-    TIntermNode *negatedElse = NULL;
</del><ins>+    TIntermAggregate *storeCondition = createTempInitDeclaration(typedCondition);
</ins><span class="cx"> 
</span><del>-    TIntermSelection *falseBlock = NULL;
</del><ins>+    TIntermSelection *falseBlock = nullptr;
</ins><span class="cx"> 
</span><ins>+    TType boolType(EbtBool, EbpUndefined, EvqTemporary);
+
</ins><span class="cx">     if (selection-&gt;getFalseBlock())
</span><span class="cx">     {
</span><ins>+        TIntermAggregate *negatedElse = nullptr;
</ins><span class="cx">         // crbug.com/346463
</span><span class="cx">         // D3D generates error messages claiming a function has no return value, when rewriting
</span><span class="cx">         // an if-else clause that returns something non-void in a function. By appending dummy
</span><span class="lines">@@ -126,24 +107,22 @@
</span><span class="cx">             TString typeString = mFunctionType-&gt;getStruct() ? mFunctionType-&gt;getStruct()-&gt;name() :
</span><span class="cx">                 mFunctionType-&gt;getBasicString();
</span><span class="cx">             TString rawText = &quot;return (&quot; + typeString + &quot;)0&quot;;
</span><del>-            negatedElse = new TIntermRaw(*mFunctionType, rawText);
</del><ins>+            TIntermRaw *returnNode = new TIntermRaw(*mFunctionType, rawText);
+            negatedElse = new TIntermAggregate(EOpSequence);
+            negatedElse-&gt;getSequence()-&gt;push_back(returnNode);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        TIntermSymbol *conditionSymbolElse = MakeNewTemporary(temporaryName, EbtBool);
</del><ins>+        TIntermSymbol *conditionSymbolElse = createTempSymbol(boolType);
</ins><span class="cx">         TIntermUnary *negatedCondition = MakeNewUnary(EOpLogicalNot, conditionSymbolElse);
</span><span class="cx">         falseBlock = new TIntermSelection(negatedCondition,
</span><span class="cx">                                           selection-&gt;getFalseBlock(), negatedElse);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TIntermSymbol *conditionSymbolSel = MakeNewTemporary(temporaryName, EbtBool);
-    TIntermSelection *newSelection = new TIntermSelection(conditionSymbolSel,
-                                                          selection-&gt;getTrueBlock(), falseBlock);
</del><ins>+    TIntermSymbol *conditionSymbolSel = createTempSymbol(boolType);
+    TIntermSelection *newSelection = new TIntermSelection(conditionSymbolSel, selection-&gt;getTrueBlock(), falseBlock);
</ins><span class="cx"> 
</span><del>-    TIntermAggregate *declaration = new TIntermAggregate(EOpDeclaration);
-    declaration-&gt;getSequence()-&gt;push_back(storeCondition);
-
</del><span class="cx">     TIntermAggregate *block = new TIntermAggregate(EOpSequence);
</span><del>-    block-&gt;getSequence()-&gt;push_back(declaration);
</del><ins>+    block-&gt;getSequence()-&gt;push_back(storeCondition);
</ins><span class="cx">     block-&gt;getSequence()-&gt;push_back(newSelection);
</span><span class="cx"> 
</span><span class="cx">     return block;
</span><span class="lines">@@ -151,9 +130,10 @@
</span><span class="cx"> 
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RewriteElseBlocks(TIntermNode *node)
</del><ins>+void RewriteElseBlocks(TIntermNode *node, unsigned int *temporaryIndex)
</ins><span class="cx"> {
</span><span class="cx">     ElseBlockRewriter rewriter;
</span><ins>+    rewriter.useTemporaryIndex(temporaryIndex);
</ins><span class="cx">     node-&gt;traverse(&amp;rewriter);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorRewriteElseBlocksh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/RewriteElseBlocks.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,7 +15,7 @@
</span><span class="cx"> namespace sh
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-void RewriteElseBlocks(TIntermNode *node);
</del><ins>+void RewriteElseBlocks(TIntermNode *node, unsigned int *temporaryIndex);
</ins><span class="cx"> 
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorScalarizeVecAndMatConstructorArgscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -109,7 +109,13 @@
</span><span class="cx">                 scalarizeArgs(node, false, true);
</span><span class="cx">             break;
</span><span class="cx">           case EOpConstructMat2:
</span><ins>+          case EOpConstructMat2x3:
+          case EOpConstructMat2x4:
+          case EOpConstructMat3x2:
</ins><span class="cx">           case EOpConstructMat3:
</span><ins>+          case EOpConstructMat3x4:
+          case EOpConstructMat4x2:
+          case EOpConstructMat4x3:
</ins><span class="cx">           case EOpConstructMat4:
</span><span class="cx">             if (ContainsVectorNode(*(node-&gt;getSequence())))
</span><span class="cx">                 scalarizeArgs(node, true, false);
</span><span class="lines">@@ -144,9 +150,21 @@
</span><span class="cx">       case EOpConstructMat2:
</span><span class="cx">         size = 4;
</span><span class="cx">         break;
</span><ins>+      case EOpConstructMat2x3:
+      case EOpConstructMat3x2:
+        size = 6;
+        break;
+      case EOpConstructMat2x4:
+      case EOpConstructMat4x2:
+        size = 8;
+        break;
</ins><span class="cx">       case EOpConstructMat3:
</span><span class="cx">         size = 9;
</span><span class="cx">         break;
</span><ins>+      case EOpConstructMat3x4:
+      case EOpConstructMat4x3:
+        size = 12;
+        break;
</ins><span class="cx">       case EOpConstructMat4:
</span><span class="cx">         size = 16;
</span><span class="cx">         break;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorScalarizeVecAndMatConstructorArgsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,12 +14,13 @@
</span><span class="cx">   public:
</span><span class="cx">     ScalarizeVecAndMatConstructorArgs(sh::GLenum shaderType,
</span><span class="cx">                                       bool fragmentPrecisionHigh)
</span><del>-        : mTempVarCount(0),
</del><ins>+        : TIntermTraverser(true, false, false),
+          mTempVarCount(0),
</ins><span class="cx">           mShaderType(shaderType),
</span><span class="cx">           mFragmentPrecisionHigh(fragmentPrecisionHigh) {}
</span><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    virtual bool visitAggregate(Visit visit, TIntermAggregate *node);
</del><ins>+    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     void scalarizeArgs(TIntermAggregate *aggregate,
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSearchSymbolcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,7 +12,9 @@
</span><span class="cx"> 
</span><span class="cx"> namespace sh
</span><span class="cx"> {
</span><del>-SearchSymbol::SearchSymbol(const TString &amp;symbol) : mSymbol(symbol)
</del><ins>+SearchSymbol::SearchSymbol(const TString &amp;symbol)
+    : TIntermTraverser(true, false, false),
+      mSymbol(symbol)
</ins><span class="cx"> {
</span><span class="cx">     match = false;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSearchSymbolh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SearchSymbol.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -20,7 +20,7 @@
</span><span class="cx">     SearchSymbol(const TString &amp;symbol);
</span><span class="cx"> 
</span><span class="cx">     void traverse(TIntermNode *node);
</span><del>-    void visitSymbol(TIntermSymbol *symbolNode);
</del><ins>+    void visitSymbol(TIntermSymbol *symbolNode) override;
</ins><span class="cx"> 
</span><span class="cx">     bool foundMatch() const;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateArrayInitializationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,10 +9,16 @@
</span><span class="cx"> // will effectively become
</span><span class="cx"> //     type[n] a;
</span><span class="cx"> //     a = initializer;
</span><ins>+//
+// Note that if the array is declared as const, the initialization may still be split, making the
+// AST technically invalid. Because of that this transformation should only be used when subsequent
+// stages don't care about const qualifiers. However, the initialization will not be split if the
+// initializer can be written as a HLSL literal.
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/SeparateArrayInitialization.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/IntermNode.h&quot;
</span><ins>+#include &quot;compiler/translator/OutputHLSL.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace
</span><span class="cx"> {
</span><span class="lines">@@ -47,7 +53,7 @@
</span><span class="cx">         if (initNode != nullptr &amp;&amp; initNode-&gt;getOp() == EOpInitialize)
</span><span class="cx">         {
</span><span class="cx">             TIntermTyped *initializer = initNode-&gt;getRight();
</span><del>-            if (initializer-&gt;isArray())
</del><ins>+            if (initializer-&gt;isArray() &amp;&amp; !sh::OutputHLSL::canWriteAsHLSLLiteral(initializer))
</ins><span class="cx">             {
</span><span class="cx">                 // We rely on that array declarations have been isolated to single declarations.
</span><span class="cx">                 ASSERT(sequence-&gt;size() == 1);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateArrayInitializationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateArrayInitialization.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,6 +9,11 @@
</span><span class="cx"> // will effectively become
</span><span class="cx"> //     type[n] a;
</span><span class="cx"> //     a = initializer;
</span><ins>+//
+// Note that if the array is declared as const, the initialization may still be split, making the
+// AST technically invalid. Because of that this transformation should only be used when subsequent
+// stages don't care about const qualifiers. However, the initialization will not be split if the
+// initializer can be written as a HLSL literal.
</ins><span class="cx"> 
</span><span class="cx"> #ifndef COMPILER_TRANSLATOR_SEPARATEARRAYINITIALIZATION_H_
</span><span class="cx"> #define COMPILER_TRANSLATOR_SEPARATEARRAYINITIALIZATION_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateDeclarationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -3,9 +3,10 @@
</span><span class="cx"> // Use of this source code is governed by a BSD-style license that can be
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><del>-// The SeparateArrayDeclarations function processes declarations that contain array declarators. Each declarator in
-// such declarations gets its own declaration.
-// This is useful as an intermediate step when initialization needs to be separated from declaration.
</del><ins>+// The SeparateDeclarations function processes declarations, so that in the end each declaration
+// contains only one declarator.
+// This is useful as an intermediate step when initialization needs to be separated from declaration,
+// or when things need to be unfolded out of the initializer.
</ins><span class="cx"> // Example:
</span><span class="cx"> //     int a[1] = int[1](1), b[1] = int[1](2);
</span><span class="cx"> // gets transformed when run through this class into the AST equivalent of:
</span><span class="lines">@@ -19,44 +20,34 @@
</span><span class="cx"> namespace
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-class SeparateDeclarations : private TIntermTraverser
</del><ins>+class SeparateDeclarationsTraverser : private TIntermTraverser
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     static void apply(TIntermNode *root);
</span><span class="cx">   private:
</span><del>-    SeparateDeclarations();
</del><ins>+    SeparateDeclarationsTraverser();
</ins><span class="cx">     bool visitAggregate(Visit, TIntermAggregate *node) override;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-void SeparateDeclarations::apply(TIntermNode *root)
</del><ins>+void SeparateDeclarationsTraverser::apply(TIntermNode *root)
</ins><span class="cx"> {
</span><del>-    SeparateDeclarations separateDecl;
</del><ins>+    SeparateDeclarationsTraverser separateDecl;
</ins><span class="cx">     root-&gt;traverse(&amp;separateDecl);
</span><span class="cx">     separateDecl.updateTree();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-SeparateDeclarations::SeparateDeclarations()
</del><ins>+SeparateDeclarationsTraverser::SeparateDeclarationsTraverser()
</ins><span class="cx">     : TIntermTraverser(true, false, false)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool SeparateDeclarations::visitAggregate(Visit, TIntermAggregate *node)
</del><ins>+bool SeparateDeclarationsTraverser::visitAggregate(Visit, TIntermAggregate *node)
</ins><span class="cx"> {
</span><span class="cx">     if (node-&gt;getOp() == EOpDeclaration)
</span><span class="cx">     {
</span><span class="cx">         TIntermSequence *sequence = node-&gt;getSequence();
</span><del>-        bool sequenceContainsArrays = false;
-        for (size_t ii = 0; ii &lt; sequence-&gt;size(); ++ii)
</del><ins>+        if (sequence-&gt;size() &gt; 1)
</ins><span class="cx">         {
</span><del>-            TIntermTyped *typed = sequence-&gt;at(ii)-&gt;getAsTyped();
-            if (typed != nullptr &amp;&amp; typed-&gt;isArray())
-            {
-                sequenceContainsArrays = true;
-                break;
-            }
-        }
-        if (sequence-&gt;size() &gt; 1 &amp;&amp; sequenceContainsArrays)
-        {
</del><span class="cx">             TIntermAggregate *parentAgg = getParentNode()-&gt;getAsAggregate();
</span><span class="cx">             ASSERT(parentAgg != nullptr);
</span><span class="cx"> 
</span><span class="lines">@@ -80,7 +71,7 @@
</span><span class="cx"> 
</span><span class="cx"> } // namespace
</span><span class="cx"> 
</span><del>-void SeparateArrayDeclarations(TIntermNode *root)
</del><ins>+void SeparateDeclarations(TIntermNode *root)
</ins><span class="cx"> {
</span><del>-    SeparateDeclarations::apply(root);
</del><ins>+    SeparateDeclarationsTraverser::apply(root);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateDeclarationsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateDeclarations.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -3,9 +3,10 @@
</span><span class="cx"> // Use of this source code is governed by a BSD-style license that can be
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><del>-// The SeparateArrayDeclarations function processes declarations that contain array declarators. Each declarator in
-// such declarations gets its own declaration.
-// This is useful as an intermediate step when initialization needs to be separated from declaration.
</del><ins>+// The SeparateDeclarations function processes declarations, so that in the end each declaration
+// contains only one declarator.
+// This is useful as an intermediate step when initialization needs to be separated from declaration,
+// or when things need to be unfolded out of the initializer.
</ins><span class="cx"> // Example:
</span><span class="cx"> //     int a[1] = int[1](1), b[1] = int[1](2);
</span><span class="cx"> // gets transformed when run through this class into the AST equivalent of:
</span><span class="lines">@@ -17,6 +18,6 @@
</span><span class="cx"> 
</span><span class="cx"> class TIntermNode;
</span><span class="cx"> 
</span><del>-void SeparateArrayDeclarations(TIntermNode *root);
</del><ins>+void SeparateDeclarations(TIntermNode *root);
</ins><span class="cx"> 
</span><span class="cx"> #endif  // COMPILER_TRANSLATOR_SEPARATEDECLARATIONS_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateExpressionsReturningArrayscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,169 @@
</span><ins>+//
+// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// SeparateExpressionsReturningArrays splits array-returning expressions that are not array names from more complex
+// expressions, assigning them to a temporary variable a#.
+// Examples where a, b and c are all arrays:
+// (a = b) == (a = c) is split into a = b; type[n] a1 = a; a = c; type[n] a2 = a; a1 == a2;
+// type d = type[n](...)[i]; is split into type[n] a1 = type[n](...); type d = a1[i];
+
+#include &quot;compiler/translator/SeparateExpressionsReturningArrays.h&quot;
+
+#include &quot;compiler/translator/IntermNode.h&quot;
+
+namespace
+{
+
+// Traverser that separates one array expression into a statement at a time.
+class SeparateExpressionsTraverser : public TIntermTraverser
+{
+  public:
+    SeparateExpressionsTraverser();
+
+    bool visitBinary(Visit visit, TIntermBinary *node) override;
+    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
+
+    void nextIteration();
+    bool foundArrayExpression() const { return mFoundArrayExpression; }
+
+  protected:
+    // Marked to true once an operation that needs to be hoisted out of the expression has been found.
+    // After that, no more AST updates are performed on that traversal.
+    bool mFoundArrayExpression;
+};
+
+SeparateExpressionsTraverser::SeparateExpressionsTraverser()
+    : TIntermTraverser(true, false, false),
+      mFoundArrayExpression(false)
+{
+}
+
+// Performs a shallow copy of an assignment node.
+// These shallow copies are useful when a node gets inserted into an aggregate node
+// and also needs to be replaced in its original location by a different node.
+TIntermBinary *CopyAssignmentNode(TIntermBinary *node)
+{
+    TIntermBinary *copyNode = new TIntermBinary(node-&gt;getOp());
+    copyNode-&gt;setLeft(node-&gt;getLeft());
+    copyNode-&gt;setRight(node-&gt;getRight());
+    copyNode-&gt;setType(node-&gt;getType());
+    return copyNode;
+}
+
+// Performs a shallow copy of a constructor/function call node.
+TIntermAggregate *CopyAggregateNode(TIntermAggregate *node)
+{
+    TIntermAggregate *copyNode = new TIntermAggregate(node-&gt;getOp());
+    TIntermSequence *copySeq = copyNode-&gt;getSequence();
+    copySeq-&gt;insert(copySeq-&gt;begin(), node-&gt;getSequence()-&gt;begin(), node-&gt;getSequence()-&gt;end());
+    copyNode-&gt;setType(node-&gt;getType());
+    copyNode-&gt;setFunctionId(node-&gt;getFunctionId());
+    if (node-&gt;isUserDefined())
+    {
+        copyNode-&gt;setUserDefined();
+    }
+    copyNode-&gt;setNameObj(node-&gt;getNameObj());
+    return copyNode;
+}
+
+bool SeparateExpressionsTraverser::visitBinary(Visit visit, TIntermBinary *node)
+{
+    if (mFoundArrayExpression)
+        return false;
+
+    // Early return if the expression is not an array or if we're not inside a complex expression.
+    if (!node-&gt;getType().isArray() || parentNodeIsBlock())
+        return true;
+
+    switch (node-&gt;getOp())
+    {
+      case EOpAssign:
+        {
+            mFoundArrayExpression = true;
+
+            TIntermSequence insertions;
+            insertions.push_back(CopyAssignmentNode(node));
+            // TODO(oetuaho): In some cases it would be more optimal to not add the temporary node, but just use the
+            // original target of the assignment. Care must be taken so that this doesn't happen when the same array
+            // symbol is a target of assignment more than once in one expression.
+            insertions.push_back(createTempInitDeclaration(node-&gt;getLeft()));
+            insertStatementsInParentBlock(insertions);
+
+            NodeUpdateEntry replaceVariable(getParentNode(), node, createTempSymbol(node-&gt;getType()), false);
+            mReplacements.push_back(replaceVariable);
+        }
+        return false;
+      default:
+        return true;
+    }
+}
+
+bool SeparateExpressionsTraverser::visitAggregate(Visit visit, TIntermAggregate *node)
+{
+    if (mFoundArrayExpression)
+        return false; // No need to traverse further
+
+    if (getParentNode() != nullptr)
+    {
+        TIntermBinary *parentBinary = getParentNode()-&gt;getAsBinaryNode();
+        bool parentIsAssignment = (parentBinary != nullptr &amp;&amp;
+            (parentBinary-&gt;getOp() == EOpAssign || parentBinary-&gt;getOp() == EOpInitialize));
+
+        if (!node-&gt;getType().isArray() || parentNodeIsBlock() || parentIsAssignment)
+            return true;
+
+        if (node-&gt;isConstructor())
+        {
+            mFoundArrayExpression = true;
+
+            TIntermSequence insertions;
+            insertions.push_back(createTempInitDeclaration(CopyAggregateNode(node)));
+            insertStatementsInParentBlock(insertions);
+
+            NodeUpdateEntry replaceVariable(getParentNode(), node, createTempSymbol(node-&gt;getType()), false);
+            mReplacements.push_back(replaceVariable);
+
+            return false;
+        }
+        else if (node-&gt;getOp() == EOpFunctionCall)
+        {
+            mFoundArrayExpression = true;
+
+            TIntermSequence insertions;
+            insertions.push_back(createTempInitDeclaration(CopyAggregateNode(node)));
+            insertStatementsInParentBlock(insertions);
+
+            NodeUpdateEntry replaceVariable(getParentNode(), node, createTempSymbol(node-&gt;getType()), false);
+            mReplacements.push_back(replaceVariable);
+
+            return false;
+        }
+    }
+    return true;
+}
+
+void SeparateExpressionsTraverser::nextIteration()
+{
+    mFoundArrayExpression = false;
+    nextTemporaryIndex();
+}
+
+} // namespace
+
+void SeparateExpressionsReturningArrays(TIntermNode *root, unsigned int *temporaryIndex)
+{
+    SeparateExpressionsTraverser traverser;
+    ASSERT(temporaryIndex != nullptr);
+    traverser.useTemporaryIndex(temporaryIndex);
+    // Separate one expression at a time, and reset the traverser between iterations.
+    do
+    {
+        traverser.nextIteration();
+        root-&gt;traverse(&amp;traverser);
+        if (traverser.foundArrayExpression())
+            traverser.updateTree();
+    }
+    while (traverser.foundArrayExpression());
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSeparateExpressionsReturningArraysh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SeparateExpressionsReturningArrays.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+//
+// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// SeparateExpressionsReturningArrays splits array-returning expressions that are not array names from more complex
+// expressions, assigning them to a temporary variable a#.
+// Examples where a, b and c are all arrays:
+// (a = b) == (a = c) is split into a = b; type[n] a1 = a; a = c; type[n] a2 = a; a1 == a2;
+// type d = type[n](...)[i]; is split into type[n] a1 = type[n](...); type d = a1[i];
+
+#ifndef COMPILER_TRANSLATOR_SEPARATEEXPRESSIONSRETURNINGARRAYS_H_
+#define COMPILER_TRANSLATOR_SEPARATEEXPRESSIONSRETURNINGARRAYS_H_
+
+class TIntermNode;
+
+void SeparateExpressionsReturningArrays(TIntermNode *root, unsigned int *temporaryIndex);
+
+#endif // COMPILER_TRANSLATOR_SEPARATEEXPRESSIONSRETURNINGARRAYS_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorShaderLangcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderLang.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderLang.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderLang.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -23,15 +23,6 @@
</span><span class="cx"> namespace
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-enum ShaderVariableType
-{
-    SHADERVAR_UNIFORM,
-    SHADERVAR_VARYING,
-    SHADERVAR_ATTRIBUTE,
-    SHADERVAR_OUTPUTVARIABLE,
-    SHADERVAR_INTERFACEBLOCK
-};
-    
</del><span class="cx"> bool isInitialized = false;
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -40,36 +31,40 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename VarT&gt;
</span><del>-const std::vector&lt;VarT&gt; *GetVariableList(const TCompiler *compiler, ShaderVariableType variableType);
</del><ins>+const std::vector&lt;VarT&gt; *GetVariableList(const TCompiler *compiler);
</ins><span class="cx"> 
</span><span class="cx"> template &lt;&gt;
</span><del>-const std::vector&lt;sh::Uniform&gt; *GetVariableList(const TCompiler *compiler, ShaderVariableType)
</del><ins>+const std::vector&lt;sh::Uniform&gt; *GetVariableList(const TCompiler *compiler)
</ins><span class="cx"> {
</span><span class="cx">     return &amp;compiler-&gt;getUniforms();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;&gt;
</span><del>-const std::vector&lt;sh::Varying&gt; *GetVariableList(const TCompiler *compiler, ShaderVariableType)
</del><ins>+const std::vector&lt;sh::Varying&gt; *GetVariableList(const TCompiler *compiler)
</ins><span class="cx"> {
</span><span class="cx">     return &amp;compiler-&gt;getVaryings();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;&gt;
</span><del>-const std::vector&lt;sh::Attribute&gt; *GetVariableList(const TCompiler *compiler, ShaderVariableType variableType)
</del><ins>+const std::vector&lt;sh::Attribute&gt; *GetVariableList(const TCompiler *compiler)
</ins><span class="cx"> {
</span><del>-    return (variableType == SHADERVAR_ATTRIBUTE ?
-        &amp;compiler-&gt;getAttributes() :
-        &amp;compiler-&gt;getOutputVariables());
</del><ins>+    return &amp;compiler-&gt;getAttributes();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;&gt;
</span><del>-const std::vector&lt;sh::InterfaceBlock&gt; *GetVariableList(const TCompiler *compiler, ShaderVariableType)
</del><ins>+const std::vector&lt;sh::OutputVariable&gt; *GetVariableList(const TCompiler *compiler)
</ins><span class="cx"> {
</span><ins>+    return &amp;compiler-&gt;getOutputVariables();
+}
+
+template &lt;&gt;
+const std::vector&lt;sh::InterfaceBlock&gt; *GetVariableList(const TCompiler *compiler)
+{
</ins><span class="cx">     return &amp;compiler-&gt;getInterfaceBlocks();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename VarT&gt;
</span><del>-const std::vector&lt;VarT&gt; *GetShaderVariables(const ShHandle handle, ShaderVariableType variableType)
</del><ins>+const std::vector&lt;VarT&gt; *GetShaderVariables(const ShHandle handle)
</ins><span class="cx"> {
</span><span class="cx">     if (!handle)
</span><span class="cx">     {
</span><span class="lines">@@ -83,7 +78,7 @@
</span><span class="cx">         return NULL;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return GetVariableList&lt;VarT&gt;(compiler, variableType);
</del><ins>+    return GetVariableList&lt;VarT&gt;(compiler);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TCompiler *GetCompilerFromHandle(ShHandle handle)
</span><span class="lines">@@ -104,7 +99,7 @@
</span><span class="cx"> }
</span><span class="cx"> #endif // ANGLE_ENABLE_HLSL
</span><span class="cx"> 
</span><del>-}  // namespace anonymous
</del><ins>+}  // anonymous namespace
</ins><span class="cx"> 
</span><span class="cx"> //
</span><span class="cx"> // Driver must call this first, once, before doing any other compiler operations.
</span><span class="lines">@@ -154,6 +149,7 @@
</span><span class="cx">     resources-&gt;OES_standard_derivatives = 0;
</span><span class="cx">     resources-&gt;OES_EGL_image_external = 0;
</span><span class="cx">     resources-&gt;ARB_texture_rectangle = 0;
</span><ins>+    resources-&gt;EXT_blend_func_extended      = 0;
</ins><span class="cx">     resources-&gt;EXT_draw_buffers = 0;
</span><span class="cx">     resources-&gt;EXT_frag_depth = 0;
</span><span class="cx">     resources-&gt;EXT_shader_texture_lod = 0;
</span><span class="lines">@@ -173,13 +169,17 @@
</span><span class="cx">     resources-&gt;MinProgramTexelOffset = -8;
</span><span class="cx">     resources-&gt;MaxProgramTexelOffset = 7;
</span><span class="cx"> 
</span><ins>+    // Extensions constants.
+    resources-&gt;MaxDualSourceDrawBuffers = 0;
+
</ins><span class="cx">     // Disable name hashing by default.
</span><span class="cx">     resources-&gt;HashFunction = NULL;
</span><span class="cx"> 
</span><span class="cx">     resources-&gt;ArrayIndexClampingStrategy = SH_CLAMP_WITH_CLAMP_INTRINSIC;
</span><span class="cx"> 
</span><span class="cx">     resources-&gt;MaxExpressionComplexity = 256;
</span><del>-    resources-&gt;MaxCallStackDepth = 256;
</del><ins>+    resources-&gt;MaxCallStackDepth       = 256;
+    resources-&gt;MaxFunctionParameters   = 1024;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -190,9 +190,16 @@
</span><span class="cx">                              const ShBuiltInResources* resources)
</span><span class="cx"> {
</span><span class="cx">     TShHandleBase* base = static_cast&lt;TShHandleBase*&gt;(ConstructCompiler(type, spec, output));
</span><ins>+    if (base == nullptr)
+    {
+        return 0;
+    }
+
</ins><span class="cx">     TCompiler* compiler = base-&gt;getAsCompiler();
</span><del>-    if (compiler == 0)
</del><ins>+    if (compiler == nullptr)
+    {
</ins><span class="cx">         return 0;
</span><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     // Generate built-in symbol table.
</span><span class="cx">     if (!compiler-&gt;Init(*resources)) {
</span><span class="lines">@@ -240,6 +247,13 @@
</span><span class="cx">     return compiler-&gt;compile(shaderStrings, numStrings, compileOptions);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void ShClearResults(const ShHandle handle)
+{
+    TCompiler *compiler = GetCompilerFromHandle(handle);
+    ASSERT(compiler);
+    compiler-&gt;clearResults();
+}
+
</ins><span class="cx"> int ShGetShaderVersion(const ShHandle handle)
</span><span class="cx"> {
</span><span class="cx">     TCompiler* compiler = GetCompilerFromHandle(handle);
</span><span class="lines">@@ -288,27 +302,27 @@
</span><span class="cx"> 
</span><span class="cx"> const std::vector&lt;sh::Uniform&gt; *ShGetUniforms(const ShHandle handle)
</span><span class="cx"> {
</span><del>-    return GetShaderVariables&lt;sh::Uniform&gt;(handle, SHADERVAR_UNIFORM);
</del><ins>+    return GetShaderVariables&lt;sh::Uniform&gt;(handle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const std::vector&lt;sh::Varying&gt; *ShGetVaryings(const ShHandle handle)
</span><span class="cx"> {
</span><del>-    return GetShaderVariables&lt;sh::Varying&gt;(handle, SHADERVAR_VARYING);
</del><ins>+    return GetShaderVariables&lt;sh::Varying&gt;(handle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const std::vector&lt;sh::Attribute&gt; *ShGetAttributes(const ShHandle handle)
</span><span class="cx"> {
</span><del>-    return GetShaderVariables&lt;sh::Attribute&gt;(handle, SHADERVAR_ATTRIBUTE);
</del><ins>+    return GetShaderVariables&lt;sh::Attribute&gt;(handle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const std::vector&lt;sh::Attribute&gt; *ShGetOutputVariables(const ShHandle handle)
</del><ins>+const std::vector&lt;sh::OutputVariable&gt; *ShGetOutputVariables(const ShHandle handle)
</ins><span class="cx"> {
</span><del>-    return GetShaderVariables&lt;sh::Attribute&gt;(handle, SHADERVAR_OUTPUTVARIABLE);
</del><ins>+    return GetShaderVariables&lt;sh::OutputVariable&gt;(handle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const std::vector&lt;sh::InterfaceBlock&gt; *ShGetInterfaceBlocks(const ShHandle handle)
</span><span class="cx"> {
</span><del>-    return GetShaderVariables&lt;sh::InterfaceBlock&gt;(handle, SHADERVAR_INTERFACEBLOCK);
</del><ins>+    return GetShaderVariables&lt;sh::InterfaceBlock&gt;(handle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool ShCheckVariablesWithinPackingLimits(
</span><span class="lines">@@ -349,23 +363,15 @@
</span><span class="cx"> #endif // ANGLE_ENABLE_HLSL
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ShGetUniformRegister(const ShHandle handle,
-                          const std::string &amp;uniformName,
-                          unsigned int *indexOut)
</del><ins>+const std::map&lt;std::string, unsigned int&gt; *ShGetUniformRegisterMap(const ShHandle handle)
</ins><span class="cx"> {
</span><span class="cx"> #ifdef ANGLE_ENABLE_HLSL
</span><del>-    ASSERT(indexOut);
</del><span class="cx">     TranslatorHLSL *translator = GetTranslatorHLSLFromHandle(handle);
</span><span class="cx">     ASSERT(translator);
</span><span class="cx"> 
</span><del>-    if (!translator-&gt;hasUniform(uniformName))
-    {
-        return false;
-    }
-
-    *indexOut = translator-&gt;getUniformRegister(uniformName);
-    return true;
</del><ins>+    return translator-&gt;getUniformRegisterMap();
</ins><span class="cx"> #else
</span><del>-    return false;
-#endif // ANGLE_ENABLE_HLSL
</del><ins>+    static std::map&lt;std::string, unsigned int&gt; map;
+    return &amp;map;
+#endif  // ANGLE_ENABLE_HLSL
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorShaderVarscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderVars.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderVars.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderVars.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -217,31 +217,75 @@
</span><span class="cx">     return ShaderVariable::isSameVariableAtLinkTime(other, true);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Attribute::Attribute()
-    : location(-1)
</del><ins>+InterfaceVariable::InterfaceVariable() : location(-1)
</ins><span class="cx"> {}
</span><span class="cx"> 
</span><del>-Attribute::~Attribute()
</del><ins>+InterfaceVariable::~InterfaceVariable()
</ins><span class="cx"> {}
</span><span class="cx"> 
</span><del>-Attribute::Attribute(const Attribute &amp;other)
-    : ShaderVariable(other),
-      location(other.location)
</del><ins>+InterfaceVariable::InterfaceVariable(const InterfaceVariable &amp;other)
+    : ShaderVariable(other), location(other.location)
</ins><span class="cx"> {}
</span><span class="cx"> 
</span><del>-Attribute &amp;Attribute::operator=(const Attribute &amp;other)
</del><ins>+InterfaceVariable &amp;InterfaceVariable::operator=(const InterfaceVariable &amp;other)
</ins><span class="cx"> {
</span><span class="cx">     ShaderVariable::operator=(other);
</span><span class="cx">     location = other.location;
</span><span class="cx">     return *this;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Attribute::operator==(const Attribute &amp;other) const
</del><ins>+bool InterfaceVariable::operator==(const InterfaceVariable &amp;other) const
</ins><span class="cx"> {
</span><span class="cx">     return (ShaderVariable::operator==(other) &amp;&amp;
</span><span class="cx">             location == other.location);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Attribute::Attribute()
+{
+}
+
+Attribute::~Attribute()
+{
+}
+
+Attribute::Attribute(const Attribute &amp;other) : InterfaceVariable(other)
+{
+}
+
+Attribute &amp;Attribute::operator=(const Attribute &amp;other)
+{
+    InterfaceVariable::operator=(other);
+    return *this;
+}
+
+bool Attribute::operator==(const Attribute &amp;other) const
+{
+    return InterfaceVariable::operator==(other);
+}
+
+OutputVariable::OutputVariable()
+{
+}
+
+OutputVariable::~OutputVariable()
+{
+}
+
+OutputVariable::OutputVariable(const OutputVariable &amp;other) : InterfaceVariable(other)
+{
+}
+
+OutputVariable &amp;OutputVariable::operator=(const OutputVariable &amp;other)
+{
+    InterfaceVariable::operator=(other);
+    return *this;
+}
+
+bool OutputVariable::operator==(const OutputVariable &amp;other) const
+{
+    return InterfaceVariable::operator==(other);
+}
+
</ins><span class="cx"> InterfaceBlockField::InterfaceBlockField()
</span><span class="cx">     : isRowMajorLayout(false)
</span><span class="cx"> {}
</span><span class="lines">@@ -305,9 +349,14 @@
</span><span class="cx"> 
</span><span class="cx"> bool Varying::isSameVaryingAtLinkTime(const Varying &amp;other) const
</span><span class="cx"> {
</span><ins>+    return isSameVaryingAtLinkTime(other, 100);
+}
+
+bool Varying::isSameVaryingAtLinkTime(const Varying &amp;other, int shaderVersion) const
+{
</ins><span class="cx">     return (ShaderVariable::isSameVariableAtLinkTime(other, false) &amp;&amp;
</span><span class="cx">             interpolation == other.interpolation &amp;&amp;
</span><del>-            isInvariant == other.isInvariant);
</del><ins>+            (shaderVersion &gt;= 300 || isInvariant == other.isInvariant));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> InterfaceBlock::InterfaceBlock()
</span><span class="lines">@@ -344,4 +393,9 @@
</span><span class="cx">     return *this;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+std::string InterfaceBlock::fieldPrefix() const
+{
+    return instanceName.empty() ? &quot;&quot; : name;
</ins><span class="cx"> }
</span><ins>+
+}  // namespace sh
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSimplifyArrayAssignmentcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyArrayAssignment.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyArrayAssignment.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyArrayAssignment.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,38 +0,0 @@
</span><del>-//
-// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#include &quot;compiler/translator/SimplifyArrayAssignment.h&quot;
-
-bool SimplifyArrayAssignment::visitBinary(Visit visit, TIntermBinary *node)
-{
-    switch (node-&gt;getOp())
-    {
-      case EOpAssign:
-        {
-            TIntermNode *parent = getParentNode();
-            if (node-&gt;getLeft()-&gt;isArray() &amp;&amp; parent != nullptr)
-            {
-                TIntermAggregate *parentAgg = parent-&gt;getAsAggregate();
-                if (parentAgg != nullptr &amp;&amp; parentAgg-&gt;getOp() == EOpSequence)
-                {
-                    // This case is fine, the result of the assignment is not used.
-                    break;
-                }
-
-                // The result of the assignment needs to be stored into a temporary variable,
-                // the assignment needs to be replaced with a reference to the temporary variable,
-                // and the temporary variable needs to finally be assigned to the target variable.
-
-                // This also needs to interact correctly with unfolding short circuiting operators.
-                UNIMPLEMENTED();
-            }
-        }
-        break;
-      default:
-        break;
-    }
-    return true;
-}
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSimplifyArrayAssignmenth"></a>
<div class="delfile"><h4>Deleted: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyArrayAssignment.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyArrayAssignment.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SimplifyArrayAssignment.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,25 +0,0 @@
</span><del>-//
-// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// SimplifyArrayAssignment is an AST traverser to replace statements where
-// the return value of array assignment is used with statements where
-// the return value of array assignment is not used.
-//
-
-#ifndef COMPILER_TRANSLATOR_SIMPLIFYARRAYASSIGNMENT_H_
-#define COMPILER_TRANSLATOR_SIMPLIFYARRAYASSIGNMENT_H_
-
-#include &quot;common/angleutils.h&quot;
-#include &quot;compiler/translator/IntermNode.h&quot;
-
-class SimplifyArrayAssignment : public TIntermTraverser
-{
-  public:
-    SimplifyArrayAssignment() { }
-
-    virtual bool visitBinary(Visit visit, TIntermBinary *node);
-};
-
-#endif  // COMPILER_TRANSLATOR_SIMPLIFYARRAYASSIGNMENT_H_
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorStructureHLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -182,26 +182,29 @@
</span><span class="cx">     string += declareString + &quot;\n&quot;
</span><span class="cx">               &quot;{\n&quot;;
</span><span class="cx"> 
</span><del>-    for (unsigned int i = 0; i &lt; fields.size(); i++)
</del><ins>+    for (const TField *field : fields)
</ins><span class="cx">     {
</span><del>-        const TField &amp;field = *fields[i];
-        const TType &amp;fieldType = *field.type();
-        const TStructure *fieldStruct = fieldType.getStruct();
-        const TString &amp;fieldTypeString = fieldStruct ?
-                                         QualifiedStructNameString(*fieldStruct, useHLSLRowMajorPacking,
-                                                                   useStd140Packing) :
-                                         TypeString(fieldType);
-
-        if (padHelper)
</del><ins>+        const TType &amp;fieldType = *field-&gt;type();
+        if (!IsSampler(fieldType.getBasicType()))
</ins><span class="cx">         {
</span><del>-            string += padHelper-&gt;prePaddingString(fieldType);
-        }
</del><ins>+            const TStructure *fieldStruct = fieldType.getStruct();
+            const TString &amp;fieldTypeString =
+                fieldStruct ? QualifiedStructNameString(*fieldStruct, useHLSLRowMajorPacking,
+                                                        useStd140Packing)
+                            : TypeString(fieldType);
</ins><span class="cx"> 
</span><del>-        string += &quot;    &quot; + fieldTypeString + &quot; &quot; + DecorateField(field.name(), structure) + ArrayString(fieldType) + &quot;;\n&quot;;
</del><ins>+            if (padHelper)
+            {
+                string += padHelper-&gt;prePaddingString(fieldType);
+            }
</ins><span class="cx"> 
</span><del>-        if (padHelper)
-        {
-            string += padHelper-&gt;postPaddingString(fieldType, useHLSLRowMajorPacking);
</del><ins>+            string += &quot;    &quot; + fieldTypeString + &quot; &quot; + DecorateField(field-&gt;name(), structure) +
+                      ArrayString(fieldType) + &quot;;\n&quot;;
+
+            if (padHelper)
+            {
+                string += padHelper-&gt;postPaddingString(fieldType, useHLSLRowMajorPacking);
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -211,16 +214,18 @@
</span><span class="cx">     return string;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void StructureHLSL::addConstructor(const TType &amp;type, const TString &amp;name, const TIntermSequence *parameters)
</del><ins>+TString StructureHLSL::addConstructor(const TType &amp;type,
+                                      const TString &amp;name,
+                                      const TIntermSequence *parameters)
</ins><span class="cx"> {
</span><span class="cx">     if (name == &quot;&quot;)
</span><span class="cx">     {
</span><del>-        return;   // Nameless structures don't have constructors
</del><ins>+        return TString();  // Nameless structures don't have constructors
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (type.getStruct() &amp;&amp; mStructNames.find(name) != mStructNames.end())
</span><span class="cx">     {
</span><del>-        return;   // Already added
</del><ins>+        return TString(name);  // Already added
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     TType ctorType = type;
</span><span class="lines">@@ -231,6 +236,8 @@
</span><span class="cx">     typedef std::vector&lt;TType&gt; ParameterArray;
</span><span class="cx">     ParameterArray ctorParameters;
</span><span class="cx"> 
</span><ins>+    TString constructorFunctionName;
+
</ins><span class="cx">     const TStructure* structure = type.getStruct();
</span><span class="cx">     if (structure)
</span><span class="cx">     {
</span><span class="lines">@@ -261,17 +268,24 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         const TFieldList &amp;fields = structure-&gt;fields();
</span><del>-        for (unsigned int i = 0; i &lt; fields.size(); i++)
</del><ins>+        for (const TField *field : fields)
</ins><span class="cx">         {
</span><del>-            ctorParameters.push_back(*fields[i]-&gt;type());
</del><ins>+            const TType *fieldType = field-&gt;type();
+            if (!IsSampler(fieldType-&gt;getBasicType()))
+            {
+                ctorParameters.push_back(*fieldType);
+            }
</ins><span class="cx">         }
</span><ins>+        constructorFunctionName = TString(name);
</ins><span class="cx">     }
</span><span class="cx">     else if (parameters)
</span><span class="cx">     {
</span><del>-        for (TIntermSequence::const_iterator parameter = parameters-&gt;begin(); parameter != parameters-&gt;end(); parameter++)
</del><ins>+        for (auto parameter : *parameters)
</ins><span class="cx">         {
</span><del>-            ctorParameters.push_back((*parameter)-&gt;getAsTyped()-&gt;getType());
</del><ins>+            const TType &amp;paramType = parameter-&gt;getAsTyped()-&gt;getType();
+            ctorParameters.push_back(paramType);
</ins><span class="cx">         }
</span><ins>+        constructorFunctionName = TString(name) + DisambiguateFunctionName(parameters);
</ins><span class="cx">     }
</span><span class="cx">     else UNREACHABLE();
</span><span class="cx"> 
</span><span class="lines">@@ -283,7 +297,7 @@
</span><span class="cx">     }
</span><span class="cx">     else   // Built-in type
</span><span class="cx">     {
</span><del>-        constructor += TypeString(ctorType) + &quot; &quot; + name + &quot;(&quot;;
</del><ins>+        constructor += TypeString(ctorType) + &quot; &quot; + constructorFunctionName + &quot;(&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (unsigned int parameter = 0; parameter &lt; ctorParameters.size(); parameter++)
</span><span class="lines">@@ -303,7 +317,15 @@
</span><span class="cx"> 
</span><span class="cx">     if (ctorType.getStruct())
</span><span class="cx">     {
</span><del>-        constructor += &quot;    &quot; + name + &quot; structure = {&quot;;
</del><ins>+        constructor += &quot;    &quot; + name + &quot; structure&quot;;
+        if (ctorParameters.empty())
+        {
+            constructor += &quot;;\n&quot;;
+        }
+        else
+        {
+            constructor += &quot; = { &quot;;
+        }
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -362,7 +384,15 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        size_t remainingComponents = ctorType.getObjectSize();
</del><ins>+        size_t remainingComponents = 0;
+        if (ctorType.getStruct())
+        {
+            remainingComponents = ctorParameters.size();
+        }
+        else
+        {
+            remainingComponents = ctorType.getObjectSize();
+        }
</ins><span class="cx">         size_t parameterIndex = 0;
</span><span class="cx"> 
</span><span class="cx">         while (remainingComponents &gt; 0)
</span><span class="lines">@@ -375,10 +405,9 @@
</span><span class="cx"> 
</span><span class="cx">             if (ctorType.getStruct())
</span><span class="cx">             {
</span><del>-                ASSERT(remainingComponents == parameterSize || moreParameters);
-                ASSERT(parameterSize &lt;= remainingComponents);
</del><ins>+                ASSERT(remainingComponents == 1 || moreParameters);
</ins><span class="cx"> 
</span><del>-                remainingComponents -= parameterSize;
</del><ins>+                --remainingComponents;
</ins><span class="cx">             }
</span><span class="cx">             else if (parameter.isScalar())
</span><span class="cx">             {
</span><span class="lines">@@ -454,9 +483,13 @@
</span><span class="cx"> 
</span><span class="cx">     if (ctorType.getStruct())
</span><span class="cx">     {
</span><del>-        constructor += &quot;};\n&quot;
-                        &quot;    return structure;\n&quot;
-                        &quot;}\n&quot;;
</del><ins>+        if (!ctorParameters.empty())
+        {
+            constructor += &quot;};\n&quot;;
+        }
+        constructor +=
+            &quot;    return structure;\n&quot;
+            &quot;}\n&quot;;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -465,6 +498,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mConstructors.insert(constructor);
</span><ins>+
+    return constructorFunctionName;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> std::string StructureHLSL::structsHeader() const
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorStructureHLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -49,7 +49,11 @@
</span><span class="cx">   public:
</span><span class="cx">     StructureHLSL();
</span><span class="cx"> 
</span><del>-    void addConstructor(const TType &amp;type, const TString &amp;name, const TIntermSequence *parameters);
</del><ins>+    // Returns the name of the constructor function. &quot;name&quot; parameter is the name of the type being
+    // constructed.
+    TString addConstructor(const TType &amp;type,
+                           const TString &amp;name,
+                           const TIntermSequence *parameters);
</ins><span class="cx">     std::string structsHeader() const;
</span><span class="cx"> 
</span><span class="cx">     TString defineQualified(const TStructure &amp;structure, bool useHLSLRowMajorPacking, bool useStd140Packing);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSymbolTablecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,6 +14,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><ins>+#include &quot;compiler/translator/Cache.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #include &lt;stdio.h&gt;
</span><span class="cx"> #include &lt;algorithm&gt;
</span><span class="lines">@@ -29,6 +30,18 @@
</span><span class="cx">         delete (*i).type;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const TString *TFunction::buildMangledName() const
+{
+    std::string newName = mangleName(getName()).c_str();
+
+    for (const auto &amp;p : parameters)
+    {
+        newName += p.type-&gt;getMangledName().c_str();
+    }
+
+    return NewPoolTString(newName.c_str());
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // Symbol table levels are a map of pointers to symbols that have to be deleted.
</span><span class="cx"> //
</span><span class="lines">@@ -139,7 +152,7 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TType *SpecificType(TType *type, int size)
</del><ins>+const TType *SpecificType(const TType *type, int size)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(size &gt;= 1 &amp;&amp; size &lt;= 4);
</span><span class="cx"> 
</span><span class="lines">@@ -152,15 +165,15 @@
</span><span class="cx"> 
</span><span class="cx">     switch(type-&gt;getBasicType())
</span><span class="cx">     {
</span><del>-      case EbtGenType:  return new TType(EbtFloat, static_cast&lt;unsigned char&gt;(size));
-      case EbtGenIType: return new TType(EbtInt, static_cast&lt;unsigned char&gt;(size));
-      case EbtGenUType: return new TType(EbtUInt, static_cast&lt;unsigned char&gt;(size));
-      case EbtGenBType: return new TType(EbtBool, static_cast&lt;unsigned char&gt;(size));
</del><ins>+      case EbtGenType:  return TCache::getType(EbtFloat, static_cast&lt;unsigned char&gt;(size));
+      case EbtGenIType: return TCache::getType(EbtInt, static_cast&lt;unsigned char&gt;(size));
+      case EbtGenUType: return TCache::getType(EbtUInt, static_cast&lt;unsigned char&gt;(size));
+      case EbtGenBType: return TCache::getType(EbtBool, static_cast&lt;unsigned char&gt;(size));
</ins><span class="cx">       default: return type;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TType *VectorType(TType *type, int size)
</del><ins>+const TType *VectorType(const TType *type, int size)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(size &gt;= 2 &amp;&amp; size &lt;= 4);
</span><span class="cx"> 
</span><span class="lines">@@ -173,48 +186,53 @@
</span><span class="cx"> 
</span><span class="cx">     switch(type-&gt;getBasicType())
</span><span class="cx">     {
</span><del>-      case EbtVec:  return new TType(EbtFloat, static_cast&lt;unsigned char&gt;(size));
-      case EbtIVec: return new TType(EbtInt, static_cast&lt;unsigned char&gt;(size));
-      case EbtUVec: return new TType(EbtUInt, static_cast&lt;unsigned char&gt;(size));
-      case EbtBVec: return new TType(EbtBool, static_cast&lt;unsigned char&gt;(size));
</del><ins>+      case EbtVec:  return TCache::getType(EbtFloat, static_cast&lt;unsigned char&gt;(size));
+      case EbtIVec: return TCache::getType(EbtInt, static_cast&lt;unsigned char&gt;(size));
+      case EbtUVec: return TCache::getType(EbtUInt, static_cast&lt;unsigned char&gt;(size));
+      case EbtBVec: return TCache::getType(EbtBool, static_cast&lt;unsigned char&gt;(size));
</ins><span class="cx">       default: return type;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TSymbolTable::insertBuiltIn(ESymbolLevel level, TOperator op, const char *ext, TType *rvalue, const char *name,
-                                 TType *ptype1, TType *ptype2, TType *ptype3, TType *ptype4, TType *ptype5)
</del><ins>+void TSymbolTable::insertBuiltIn(ESymbolLevel level, TOperator op, const char *ext, const TType *rvalue, const char *name,
+                                 const TType *ptype1, const TType *ptype2, const TType *ptype3, const TType *ptype4, const TType *ptype5)
</ins><span class="cx"> {
</span><span class="cx">     if (ptype1-&gt;getBasicType() == EbtGSampler2D)
</span><span class="cx">     {
</span><ins>+        insertUnmangledBuiltIn(name);
</ins><span class="cx">         bool gvec4 = (rvalue-&gt;getBasicType() == EbtGVec4);
</span><del>-        insertBuiltIn(level, gvec4 ? new TType(EbtFloat, 4) : rvalue, name, new TType(EbtSampler2D), ptype2, ptype3, ptype4, ptype5);
-        insertBuiltIn(level, gvec4 ? new TType(EbtInt, 4) : rvalue, name, new TType(EbtISampler2D), ptype2, ptype3, ptype4, ptype5);
-        insertBuiltIn(level, gvec4 ? new TType(EbtUInt, 4) : rvalue, name, new TType(EbtUSampler2D), ptype2, ptype3, ptype4, ptype5);
</del><ins>+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name, TCache::getType(EbtSampler2D), ptype2, ptype3, ptype4, ptype5);
+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name, TCache::getType(EbtISampler2D), ptype2, ptype3, ptype4, ptype5);
+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, TCache::getType(EbtUSampler2D), ptype2, ptype3, ptype4, ptype5);
</ins><span class="cx">     }
</span><span class="cx">     else if (ptype1-&gt;getBasicType() == EbtGSampler3D)
</span><span class="cx">     {
</span><ins>+        insertUnmangledBuiltIn(name);
</ins><span class="cx">         bool gvec4 = (rvalue-&gt;getBasicType() == EbtGVec4);
</span><del>-        insertBuiltIn(level, gvec4 ? new TType(EbtFloat, 4) : rvalue, name, new TType(EbtSampler3D), ptype2, ptype3, ptype4, ptype5);
-        insertBuiltIn(level, gvec4 ? new TType(EbtInt, 4) : rvalue, name, new TType(EbtISampler3D), ptype2, ptype3, ptype4, ptype5);
-        insertBuiltIn(level, gvec4 ? new TType(EbtUInt, 4) : rvalue, name, new TType(EbtUSampler3D), ptype2, ptype3, ptype4, ptype5);
</del><ins>+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name, TCache::getType(EbtSampler3D), ptype2, ptype3, ptype4, ptype5);
+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name, TCache::getType(EbtISampler3D), ptype2, ptype3, ptype4, ptype5);
+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, TCache::getType(EbtUSampler3D), ptype2, ptype3, ptype4, ptype5);
</ins><span class="cx">     }
</span><span class="cx">     else if (ptype1-&gt;getBasicType() == EbtGSamplerCube)
</span><span class="cx">     {
</span><ins>+        insertUnmangledBuiltIn(name);
</ins><span class="cx">         bool gvec4 = (rvalue-&gt;getBasicType() == EbtGVec4);
</span><del>-        insertBuiltIn(level, gvec4 ? new TType(EbtFloat, 4) : rvalue, name, new TType(EbtSamplerCube), ptype2, ptype3, ptype4, ptype5);
-        insertBuiltIn(level, gvec4 ? new TType(EbtInt, 4) : rvalue, name, new TType(EbtISamplerCube), ptype2, ptype3, ptype4, ptype5);
-        insertBuiltIn(level, gvec4 ? new TType(EbtUInt, 4) : rvalue, name, new TType(EbtUSamplerCube), ptype2, ptype3, ptype4, ptype5);
</del><ins>+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name, TCache::getType(EbtSamplerCube), ptype2, ptype3, ptype4, ptype5);
+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name, TCache::getType(EbtISamplerCube), ptype2, ptype3, ptype4, ptype5);
+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, TCache::getType(EbtUSamplerCube), ptype2, ptype3, ptype4, ptype5);
</ins><span class="cx">     }
</span><span class="cx">     else if (ptype1-&gt;getBasicType() == EbtGSampler2DArray)
</span><span class="cx">     {
</span><ins>+        insertUnmangledBuiltIn(name);
</ins><span class="cx">         bool gvec4 = (rvalue-&gt;getBasicType() == EbtGVec4);
</span><del>-        insertBuiltIn(level, gvec4 ? new TType(EbtFloat, 4) : rvalue, name, new TType(EbtSampler2DArray), ptype2, ptype3, ptype4, ptype5);
-        insertBuiltIn(level, gvec4 ? new TType(EbtInt, 4) : rvalue, name, new TType(EbtISampler2DArray), ptype2, ptype3, ptype4, ptype5);
-        insertBuiltIn(level, gvec4 ? new TType(EbtUInt, 4) : rvalue, name, new TType(EbtUSampler2DArray), ptype2, ptype3, ptype4, ptype5);
</del><ins>+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name, TCache::getType(EbtSampler2DArray), ptype2, ptype3, ptype4, ptype5);
+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name, TCache::getType(EbtISampler2DArray), ptype2, ptype3, ptype4, ptype5);
+        insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, TCache::getType(EbtUSampler2DArray), ptype2, ptype3, ptype4, ptype5);
</ins><span class="cx">     }
</span><span class="cx">     else if (IsGenType(rvalue) || IsGenType(ptype1) || IsGenType(ptype2) || IsGenType(ptype3))
</span><span class="cx">     {
</span><span class="cx">         ASSERT(!ptype4 &amp;&amp; !ptype5);
</span><ins>+        insertUnmangledBuiltIn(name);
</ins><span class="cx">         insertBuiltIn(level, op, ext, SpecificType(rvalue, 1), name, SpecificType(ptype1, 1), SpecificType(ptype2, 1), SpecificType(ptype3, 1));
</span><span class="cx">         insertBuiltIn(level, op, ext, SpecificType(rvalue, 2), name, SpecificType(ptype1, 2), SpecificType(ptype2, 2), SpecificType(ptype3, 2));
</span><span class="cx">         insertBuiltIn(level, op, ext, SpecificType(rvalue, 3), name, SpecificType(ptype1, 3), SpecificType(ptype2, 3), SpecificType(ptype3, 3));
</span><span class="lines">@@ -223,41 +241,38 @@
</span><span class="cx">     else if (IsVecType(rvalue) || IsVecType(ptype1) || IsVecType(ptype2) || IsVecType(ptype3))
</span><span class="cx">     {
</span><span class="cx">         ASSERT(!ptype4 &amp;&amp; !ptype5);
</span><ins>+        insertUnmangledBuiltIn(name);
</ins><span class="cx">         insertBuiltIn(level, op, ext, VectorType(rvalue, 2), name, VectorType(ptype1, 2), VectorType(ptype2, 2), VectorType(ptype3, 2));
</span><span class="cx">         insertBuiltIn(level, op, ext, VectorType(rvalue, 3), name, VectorType(ptype1, 3), VectorType(ptype2, 3), VectorType(ptype3, 3));
</span><span class="cx">         insertBuiltIn(level, op, ext, VectorType(rvalue, 4), name, VectorType(ptype1, 4), VectorType(ptype2, 4), VectorType(ptype3, 4));
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        TFunction *function = new TFunction(NewPoolTString(name), *rvalue, op, ext);
</del><ins>+        TFunction *function = new TFunction(NewPoolTString(name), rvalue, op, ext);
</ins><span class="cx"> 
</span><del>-        TParameter param1 = {0, ptype1};
-        function-&gt;addParameter(param1);
</del><ins>+        function-&gt;addParameter(TConstParameter(ptype1));
</ins><span class="cx"> 
</span><span class="cx">         if (ptype2)
</span><span class="cx">         {
</span><del>-            TParameter param2 = {0, ptype2};
-            function-&gt;addParameter(param2);
</del><ins>+            function-&gt;addParameter(TConstParameter(ptype2));
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (ptype3)
</span><span class="cx">         {
</span><del>-            TParameter param3 = {0, ptype3};
-            function-&gt;addParameter(param3);
</del><ins>+            function-&gt;addParameter(TConstParameter(ptype3));
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (ptype4)
</span><span class="cx">         {
</span><del>-            TParameter param4 = {0, ptype4};
-            function-&gt;addParameter(param4);
</del><ins>+            function-&gt;addParameter(TConstParameter(ptype4));
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (ptype5)
</span><span class="cx">         {
</span><del>-            TParameter param5 = {0, ptype5};
-            function-&gt;addParameter(param5);
</del><ins>+            function-&gt;addParameter(TConstParameter(ptype5));
</ins><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        ASSERT(hasUnmangledBuiltIn(name));
</ins><span class="cx">         insert(level, function);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -272,7 +287,7 @@
</span><span class="cx"> 
</span><span class="cx">     int level = static_cast&lt;int&gt;(precisionStack.size()) - 1;
</span><span class="cx">     assert(level &gt;= 0); // Just to be safe. Should not happen.
</span><del>-    // If we dont find anything we return this. Should we error check this?
</del><ins>+    // If we dont find anything we return this. Some types don't have predefined default precision.
</ins><span class="cx">     TPrecision prec = EbpUndefined;
</span><span class="cx">     while (level &gt;= 0)
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorSymbolTableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -109,13 +109,8 @@
</span><span class="cx">           unionArray(0)
</span><span class="cx">     {
</span><span class="cx">     }
</span><del>-    virtual ~TVariable()
-    {
-    }
-    virtual bool isVariable() const
-    {
-        return true;
-    }
</del><ins>+    ~TVariable() override {}
+    bool isVariable() const override { return true; }
</ins><span class="cx">     TType &amp;getType()
</span><span class="cx">     {
</span><span class="cx">         return type;
</span><span class="lines">@@ -133,40 +128,67 @@
</span><span class="cx">         type.setQualifier(qualifier);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TConstantUnion *getConstPointer()
-    { 
-        if (!unionArray)
-            unionArray = new TConstantUnion[type.getObjectSize()];
</del><ins>+    const TConstantUnion *getConstPointer() const { return unionArray; }
</ins><span class="cx"> 
</span><del>-        return unionArray;
-    }
</del><ins>+    void shareConstPointer(const TConstantUnion *constArray) { unionArray = constArray; }
</ins><span class="cx"> 
</span><del>-    TConstantUnion *getConstPointer() const
-    {
-        return unionArray;
-    }
-
-    void shareConstPointer(TConstantUnion *constArray)
-    {
-        if (unionArray == constArray)
-            return;
-
-        delete[] unionArray;
-        unionArray = constArray;  
-    }
-
</del><span class="cx">   private:
</span><span class="cx">     TType type;
</span><span class="cx">     bool userType;
</span><span class="cx">     // we are assuming that Pool Allocator will free the memory
</span><span class="cx">     // allocated to unionArray when this object is destroyed.
</span><del>-    TConstantUnion *unionArray;
</del><ins>+    const TConstantUnion *unionArray;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+// Immutable version of TParameter.
+struct TConstParameter
+{
+    TConstParameter()
+        : name(nullptr),
+          type(nullptr)
+    {
+    }
+    explicit TConstParameter(const TString *n)
+        : name(n),
+          type(nullptr)
+    {
+    }
+    explicit TConstParameter(const TType *t)
+        : name(nullptr),
+          type(t)
+    {
+    }
+    TConstParameter(const TString *n, const TType *t)
+        : name(n),
+          type(t)
+    {
+    }
+
+    // Both constructor arguments must be const.
+    TConstParameter(TString *n, TType *t) = delete;
+    TConstParameter(const TString *n, TType *t) = delete;
+    TConstParameter(TString *n, const TType *t) = delete;
+
+    const TString *name;
+    const TType *type;
+};
+
</ins><span class="cx"> // The function sub-class of symbols and the parser will need to
</span><span class="cx"> // share this definition of a function parameter.
</span><span class="cx"> struct TParameter
</span><span class="cx"> {
</span><ins>+    // Destructively converts to TConstParameter.
+    // This method resets name and type to nullptrs to make sure
+    // their content cannot be modified after the call.
+    TConstParameter turnToConst()
+    {
+        const TString *constName = name;
+        const TType *constType = type;
+        name = nullptr;
+        type = nullptr;
+        return TConstParameter(constName, constType);
+    }
+
</ins><span class="cx">     TString *name;
</span><span class="cx">     TType *type;
</span><span class="cx"> };
</span><span class="lines">@@ -175,27 +197,21 @@
</span><span class="cx"> class TFunction : public TSymbol
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    TFunction(TOperator o)
-        : TSymbol(0),
-          returnType(TType(EbtVoid, EbpUndefined)),
-          op(o),
-          defined(false)
-    {
-    }
-    TFunction(const TString *name, const TType &amp;retType, TOperator tOp = EOpNull, const char *ext = &quot;&quot;)
</del><ins>+    TFunction(const TString *name,
+              const TType *retType,
+              TOperator tOp   = EOpNull,
+              const char *ext = &quot;&quot;)
</ins><span class="cx">         : TSymbol(name),
</span><span class="cx">           returnType(retType),
</span><del>-          mangledName(TFunction::mangleName(*name)),
</del><ins>+          mangledName(nullptr),
</ins><span class="cx">           op(tOp),
</span><del>-          defined(false)
</del><ins>+          defined(false),
+          mHasPrototypeDeclaration(false)
</ins><span class="cx">     {
</span><span class="cx">         relateToExtension(ext);
</span><span class="cx">     }
</span><del>-    virtual ~TFunction();
-    virtual bool isFunction() const
-    {
-        return true;
-    }
</del><ins>+    ~TFunction() override;
+    bool isFunction() const override { return true; }
</ins><span class="cx"> 
</span><span class="cx">     static TString mangleName(const TString &amp;name)
</span><span class="cx">     {
</span><span class="lines">@@ -206,19 +222,23 @@
</span><span class="cx">         return TString(mangledName.c_str(), mangledName.find_first_of('('));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void addParameter(TParameter &amp;p)
-    { 
</del><ins>+    void addParameter(const TConstParameter &amp;p)
+    {
</ins><span class="cx">         parameters.push_back(p);
</span><del>-        mangledName = mangledName + p.type-&gt;getMangledName();
</del><ins>+        mangledName = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const TString &amp;getMangledName() const
</del><ins>+    const TString &amp;getMangledName() const override
</ins><span class="cx">     {
</span><del>-        return mangledName;
</del><ins>+        if (mangledName == nullptr)
+        {
+            mangledName = buildMangledName();
+        }
+        return *mangledName;
</ins><span class="cx">     }
</span><span class="cx">     const TType &amp;getReturnType() const
</span><span class="cx">     {
</span><del>-        return returnType;
</del><ins>+        return *returnType;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     TOperator getBuiltInOp() const
</span><span class="lines">@@ -226,31 +246,30 @@
</span><span class="cx">         return op;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void setDefined()
-    {
-        defined = true;
-    }
-    bool isDefined()
-    {
-        return defined;
-    }
</del><ins>+    void setDefined() { defined = true; }
+    bool isDefined() { return defined; }
+    void setHasPrototypeDeclaration() { mHasPrototypeDeclaration = true; }
+    bool hasPrototypeDeclaration() const { return mHasPrototypeDeclaration; }
</ins><span class="cx"> 
</span><span class="cx">     size_t getParamCount() const
</span><span class="cx">     {
</span><span class="cx">         return parameters.size();
</span><span class="cx">     }
</span><del>-    const TParameter &amp;getParam(size_t i) const
</del><ins>+    const TConstParameter &amp;getParam(size_t i) const
</ins><span class="cx">     {
</span><span class="cx">         return parameters[i];
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    typedef TVector&lt;TParameter&gt; TParamList;
</del><ins>+    const TString *buildMangledName() const;
+
+    typedef TVector&lt;TConstParameter&gt; TParamList;
</ins><span class="cx">     TParamList parameters;
</span><del>-    TType returnType;
-    TString mangledName;
</del><ins>+    const TType *returnType;
+    mutable const TString *mangledName;
</ins><span class="cx">     TOperator op;
</span><span class="cx">     bool defined;
</span><ins>+    bool mHasPrototypeDeclaration;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // Interface block name sub-symbol
</span><span class="lines">@@ -364,28 +383,43 @@
</span><span class="cx">     {
</span><span class="cx">         TVariable *constant = new TVariable(
</span><span class="cx">             NewPoolTString(name), TType(EbtInt, EbpUndefined, EvqConst, 1));
</span><del>-        constant-&gt;getConstPointer()-&gt;setIConst(value);
</del><ins>+        TConstantUnion *unionArray = new TConstantUnion[1];
+        unionArray[0].setIConst(value);
+        constant-&gt;shareConstPointer(unionArray);
</ins><span class="cx">         return insert(level, constant);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void insertBuiltIn(ESymbolLevel level, TOperator op, const char *ext, TType *rvalue, const char *name,
-                       TType *ptype1, TType *ptype2 = 0, TType *ptype3 = 0, TType *ptype4 = 0, TType *ptype5 = 0);
</del><ins>+    bool insertConstIntExt(ESymbolLevel level, const char *ext, const char *name, int value)
+    {
+        TVariable *constant =
+            new TVariable(NewPoolTString(name), TType(EbtInt, EbpUndefined, EvqConst, 1));
+        TConstantUnion *unionArray = new TConstantUnion[1];
+        unionArray[0].setIConst(value);
+        constant-&gt;shareConstPointer(unionArray);
+        return insert(level, ext, constant);
+    }
</ins><span class="cx"> 
</span><del>-    void insertBuiltIn(ESymbolLevel level, TType *rvalue, const char *name,
-                       TType *ptype1, TType *ptype2 = 0, TType *ptype3 = 0, TType *ptype4 = 0, TType *ptype5 = 0)
</del><ins>+    void insertBuiltIn(ESymbolLevel level, TOperator op, const char *ext, const TType *rvalue, const char *name,
+                       const TType *ptype1, const TType *ptype2 = 0, const TType *ptype3 = 0, const TType *ptype4 = 0, const TType *ptype5 = 0);
+
+    void insertBuiltIn(ESymbolLevel level, const TType *rvalue, const char *name,
+                       const TType *ptype1, const TType *ptype2 = 0, const TType *ptype3 = 0, const TType *ptype4 = 0, const TType *ptype5 = 0)
</ins><span class="cx">     {
</span><ins>+        insertUnmangledBuiltIn(name);
</ins><span class="cx">         insertBuiltIn(level, EOpNull, &quot;&quot;, rvalue, name, ptype1, ptype2, ptype3, ptype4, ptype5);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void insertBuiltIn(ESymbolLevel level, const char *ext, TType *rvalue, const char *name,
-                       TType *ptype1, TType *ptype2 = 0, TType *ptype3 = 0, TType *ptype4 = 0, TType *ptype5 = 0)
</del><ins>+    void insertBuiltIn(ESymbolLevel level, const char *ext, const TType *rvalue, const char *name,
+                       const TType *ptype1, const TType *ptype2 = 0, const TType *ptype3 = 0, const TType *ptype4 = 0, const TType *ptype5 = 0)
</ins><span class="cx">     {
</span><ins>+        insertUnmangledBuiltIn(name);
</ins><span class="cx">         insertBuiltIn(level, EOpNull, ext, rvalue, name, ptype1, ptype2, ptype3, ptype4, ptype5);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void insertBuiltIn(ESymbolLevel level, TOperator op, TType *rvalue, const char *name,
-                       TType *ptype1, TType *ptype2 = 0, TType *ptype3 = 0, TType *ptype4 = 0, TType *ptype5 = 0)
</del><ins>+    void insertBuiltIn(ESymbolLevel level, TOperator op, const TType *rvalue, const char *name,
+                       const TType *ptype1, const TType *ptype2 = 0, const TType *ptype3 = 0, const TType *ptype4 = 0, const TType *ptype5 = 0)
</ins><span class="cx">     {
</span><ins>+        insertUnmangledBuiltIn(name);
</ins><span class="cx">         insertBuiltIn(level, op, &quot;&quot;, rvalue, name, ptype1, ptype2, ptype3, ptype4, ptype5);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -405,6 +439,8 @@
</span><span class="cx">     {
</span><span class="cx">         if (!SupportsPrecision(type.type))
</span><span class="cx">             return false;
</span><ins>+        if (type.type == EbtUInt)
+            return false;  // ESSL 3.00.4 section 4.5.4
</ins><span class="cx">         if (type.isAggregate())
</span><span class="cx">             return false; // Not allowed to set for aggregate types
</span><span class="cx">         int indexOfLastElement = static_cast&lt;int&gt;(precisionStack.size()) - 1;
</span><span class="lines">@@ -441,16 +477,29 @@
</span><span class="cx">         return ++uniqueIdCounter;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool hasUnmangledBuiltIn(const char *name)
+    {
+        return mUnmangledBuiltinNames.count(std::string(name)) &gt; 0;
+    }
+
</ins><span class="cx">   private:
</span><span class="cx">     ESymbolLevel currentLevel() const
</span><span class="cx">     {
</span><span class="cx">         return static_cast&lt;ESymbolLevel&gt;(table.size() - 1);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Used to insert unmangled functions to check redeclaration of built-ins in ESSL 3.00.
+    void insertUnmangledBuiltIn(const char *name)
+    {
+        mUnmangledBuiltinNames.insert(std::string(name));
+    }
+
</ins><span class="cx">     std::vector&lt;TSymbolTableLevel *&gt; table;
</span><span class="cx">     typedef TMap&lt;TBasicType, TPrecision&gt; PrecisionStackLevel;
</span><span class="cx">     std::vector&lt; PrecisionStackLevel *&gt; precisionStack;
</span><span class="cx"> 
</span><ins>+    std::set&lt;std::string&gt; mUnmangledBuiltinNames;
+
</ins><span class="cx">     std::set&lt;std::string&gt; mInvariantVaryings;
</span><span class="cx">     bool mGlobalInvariant;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorESSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,6 +8,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/BuiltInFunctionEmulatorGLSL.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/EmulatePrecision.h&quot;
</span><ins>+#include &quot;compiler/translator/RecordConstantPrecision.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/OutputESSL.h&quot;
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -19,16 +20,18 @@
</span><span class="cx"> void TranslatorESSL::initBuiltInFunctionEmulator(BuiltInFunctionEmulator *emu, int compileOptions)
</span><span class="cx"> {
</span><span class="cx">     if (compileOptions &amp; SH_EMULATE_BUILT_IN_FUNCTIONS)
</span><del>-        InitBuiltInFunctionEmulatorForGLSL(emu, getShaderType());
</del><ins>+    {
+        InitBuiltInFunctionEmulatorForGLSLWorkarounds(emu, getShaderType());
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TranslatorESSL::translate(TIntermNode *root, int) {
</span><span class="cx">     TInfoSinkBase&amp; sink = getInfoSink().obj;
</span><span class="cx"> 
</span><del>-    int shaderVersion = getShaderVersion();
-    if (shaderVersion &gt; 100)
</del><ins>+    int shaderVer = getShaderVersion();
+    if (shaderVer &gt; 100)
</ins><span class="cx">     {
</span><del>-        sink &lt;&lt; &quot;#version &quot; &lt;&lt; shaderVersion &lt;&lt; &quot; es\n&quot;;
</del><ins>+        sink &lt;&lt; &quot;#version &quot; &lt;&lt; shaderVer &lt;&lt; &quot; es\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     writePragma();
</span><span class="lines">@@ -40,12 +43,14 @@
</span><span class="cx"> 
</span><span class="cx">     if (precisionEmulation)
</span><span class="cx">     {
</span><del>-        EmulatePrecision emulatePrecision;
</del><ins>+        EmulatePrecision emulatePrecision(getSymbolTable(), shaderVer);
</ins><span class="cx">         root-&gt;traverse(&amp;emulatePrecision);
</span><span class="cx">         emulatePrecision.updateTree();
</span><span class="cx">         emulatePrecision.writeEmulationHelpers(sink, SH_ESSL_OUTPUT);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    RecordConstantPrecision(root, getTemporaryIndex());
+
</ins><span class="cx">     // Write emulated built-in functions if needed.
</span><span class="cx">     if (!getBuiltInFunctionEmulator().IsOutputEmpty())
</span><span class="cx">     {
</span><span class="lines">@@ -71,13 +76,8 @@
</span><span class="cx">     getArrayBoundsClamper().OutputClampingFunctionDefinition(sink);
</span><span class="cx"> 
</span><span class="cx">     // Write translated shader.
</span><del>-    TOutputESSL outputESSL(sink,
-                           getArrayIndexClampingStrategy(),
-                           getHashFunction(),
-                           getNameMap(),
-                           getSymbolTable(),
-                           shaderVersion,
-                           precisionEmulation);
</del><ins>+    TOutputESSL outputESSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), getNameMap(),
+                           getSymbolTable(), shaderVer, precisionEmulation);
</ins><span class="cx">     root-&gt;traverse(&amp;outputESSL);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorESSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorESSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx">   protected:
</span><span class="cx">     void initBuiltInFunctionEmulator(BuiltInFunctionEmulator *emu, int compileOptions) override;
</span><span class="cx"> 
</span><del>-    virtual void translate(TIntermNode *root, int compileOptions) override;
</del><ins>+    void translate(TIntermNode *root, int compileOptions) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     void writeExtensionBehavior();
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorGLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,53 +9,10 @@
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/BuiltInFunctionEmulatorGLSL.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/EmulatePrecision.h&quot;
</span><ins>+#include &quot;compiler/translator/ExtensionGLSL.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/OutputGLSL.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/VersionGLSL.h&quot;
</span><span class="cx"> 
</span><del>-namespace
-{
-
-// To search for what output variables are used in a fragment shader.
-// We handle gl_FragColor and gl_FragData at the moment.
-class TFragmentOutSearcher : public TIntermTraverser
-{
-  public:
-    TFragmentOutSearcher()
-        : mUsesGlFragColor(false),
-          mUsesGlFragData(false)
-    {
-    }
-
-    bool usesGlFragColor() const
-    {
-        return mUsesGlFragColor;
-    }
-
-    bool usesGlFragData() const
-    {
-        return mUsesGlFragData;
-    }
-
-  protected:
-    virtual void visitSymbol(TIntermSymbol *node) override
-    {
-        if (node-&gt;getSymbol() == &quot;gl_FragColor&quot;)
-        {
-            mUsesGlFragColor = true;
-        }
-        else if (node-&gt;getSymbol() == &quot;gl_FragData&quot;)
-        {
-            mUsesGlFragData = true;
-        }
-    }
-
-  private:
-    bool mUsesGlFragColor;
-    bool mUsesGlFragData;
-};
-
-}  // namespace anonymous
-
</del><span class="cx"> TranslatorGLSL::TranslatorGLSL(sh::GLenum type,
</span><span class="cx">                                ShShaderSpec spec,
</span><span class="cx">                                ShShaderOutput output)
</span><span class="lines">@@ -65,10 +22,16 @@
</span><span class="cx"> void TranslatorGLSL::initBuiltInFunctionEmulator(BuiltInFunctionEmulator *emu, int compileOptions)
</span><span class="cx"> {
</span><span class="cx">     if (compileOptions &amp; SH_EMULATE_BUILT_IN_FUNCTIONS)
</span><del>-        InitBuiltInFunctionEmulatorForGLSL(emu, getShaderType());
</del><ins>+    {
+        InitBuiltInFunctionEmulatorForGLSLWorkarounds(emu, getShaderType());
+    }
+
+    int targetGLSLVersion = ShaderOutputTypeToGLSLVersion(getOutputType());
+    InitBuiltInFunctionEmulatorForGLSLMissingFunctions(emu, getShaderType(), targetGLSLVersion);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TranslatorGLSL::translate(TIntermNode *root, int) {
</del><ins>+void TranslatorGLSL::translate(TIntermNode *root, int compileOptions)
+{
</ins><span class="cx">     TInfoSinkBase&amp; sink = getInfoSink().obj;
</span><span class="cx"> 
</span><span class="cx">     // Write GLSL version.
</span><span class="lines">@@ -77,13 +40,13 @@
</span><span class="cx">     writePragma();
</span><span class="cx"> 
</span><span class="cx">     // Write extension behaviour as needed
</span><del>-    writeExtensionBehavior();
</del><ins>+    writeExtensionBehavior(root);
</ins><span class="cx"> 
</span><span class="cx">     bool precisionEmulation = getResources().WEBGL_debug_shader_precision &amp;&amp; getPragma().debugShaderPrecision;
</span><span class="cx"> 
</span><span class="cx">     if (precisionEmulation)
</span><span class="cx">     {
</span><del>-        EmulatePrecision emulatePrecision;
</del><ins>+        EmulatePrecision emulatePrecision(getSymbolTable(), getShaderVersion());
</ins><span class="cx">         root-&gt;traverse(&amp;emulatePrecision);
</span><span class="cx">         emulatePrecision.updateTree();
</span><span class="cx">         emulatePrecision.writeEmulationHelpers(sink, getOutputType());
</span><span class="lines">@@ -103,19 +66,70 @@
</span><span class="cx"> 
</span><span class="cx">     // Declare gl_FragColor and glFragData as webgl_FragColor and webgl_FragData
</span><span class="cx">     // if it's core profile shaders and they are used.
</span><del>-    if (getShaderType() == GL_FRAGMENT_SHADER &amp;&amp; IsGLSL130OrNewer(getOutputType()))
</del><ins>+    if (getShaderType() == GL_FRAGMENT_SHADER)
</ins><span class="cx">     {
</span><del>-        TFragmentOutSearcher searcher;
-        root-&gt;traverse(&amp;searcher);
-        ASSERT(!(searcher.usesGlFragData() &amp;&amp; searcher.usesGlFragColor()));
-        if (searcher.usesGlFragColor())
</del><ins>+        const bool mayHaveESSL1SecondaryOutputs =
+            IsExtensionEnabled(getExtensionBehavior(), &quot;GL_EXT_blend_func_extended&quot;) &amp;&amp;
+            getShaderVersion() == 100;
+        const bool declareGLFragmentOutputs = IsGLSL130OrNewer(getOutputType());
+
+        bool hasGLFragColor          = false;
+        bool hasGLFragData           = false;
+        bool hasGLSecondaryFragColor = false;
+        bool hasGLSecondaryFragData  = false;
+
+        for (const auto &amp;outputVar : outputVariables)
</ins><span class="cx">         {
</span><ins>+            if (declareGLFragmentOutputs)
+            {
+                if (outputVar.name == &quot;gl_FragColor&quot;)
+                {
+                    ASSERT(!hasGLFragColor);
+                    hasGLFragColor = true;
+                    continue;
+                }
+                else if (outputVar.name == &quot;gl_FragData&quot;)
+                {
+                    ASSERT(!hasGLFragData);
+                    hasGLFragData = true;
+                    continue;
+                }
+            }
+            if (mayHaveESSL1SecondaryOutputs)
+            {
+                if (outputVar.name == &quot;gl_SecondaryFragColorEXT&quot;)
+                {
+                    ASSERT(!hasGLSecondaryFragColor);
+                    hasGLSecondaryFragColor = true;
+                    continue;
+                }
+                else if (outputVar.name == &quot;gl_SecondaryFragDataEXT&quot;)
+                {
+                    ASSERT(!hasGLSecondaryFragData);
+                    hasGLSecondaryFragData = true;
+                    continue;
+                }
+            }
+        }
+        ASSERT(!((hasGLFragColor || hasGLSecondaryFragColor) &amp;&amp;
+                 (hasGLFragData || hasGLSecondaryFragData)));
+        if (hasGLFragColor)
+        {
</ins><span class="cx">             sink &lt;&lt; &quot;out vec4 webgl_FragColor;\n&quot;;
</span><span class="cx">         }
</span><del>-        if (searcher.usesGlFragData())
</del><ins>+        if (hasGLFragData)
</ins><span class="cx">         {
</span><span class="cx">             sink &lt;&lt; &quot;out vec4 webgl_FragData[gl_MaxDrawBuffers];\n&quot;;
</span><span class="cx">         }
</span><ins>+        if (hasGLSecondaryFragColor)
+        {
+            sink &lt;&lt; &quot;out vec4 angle_SecondaryFragColor;\n&quot;;
+        }
+        if (hasGLSecondaryFragData)
+        {
+            sink &lt;&lt; &quot;out vec4 angle_SecondaryFragData[&quot; &lt;&lt; getResources().MaxDualSourceDrawBuffers
+                 &lt;&lt; &quot;];\n&quot;;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Write translated shader.
</span><span class="lines">@@ -143,19 +157,41 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TranslatorGLSL::writeExtensionBehavior() {
</del><ins>+void TranslatorGLSL::writeExtensionBehavior(TIntermNode *root)
+{
</ins><span class="cx">     TInfoSinkBase&amp; sink = getInfoSink().obj;
</span><span class="cx">     const TExtensionBehavior&amp; extBehavior = getExtensionBehavior();
</span><del>-    for (TExtensionBehavior::const_iterator iter = extBehavior.begin();
-         iter != extBehavior.end(); ++iter) {
-        if (iter-&gt;second == EBhUndefined)
</del><ins>+    for (const auto &amp;iter : extBehavior)
+    {
+        if (iter.second == EBhUndefined)
+        {
</ins><span class="cx">             continue;
</span><ins>+        }
</ins><span class="cx"> 
</span><span class="cx">         // For GLSL output, we don't need to emit most extensions explicitly,
</span><span class="cx">         // but some we need to translate.
</span><del>-        if (iter-&gt;first == &quot;GL_EXT_shader_texture_lod&quot;) {
-            sink &lt;&lt; &quot;#extension GL_ARB_shader_texture_lod : &quot;
-                 &lt;&lt; getBehaviorString(iter-&gt;second) &lt;&lt; &quot;\n&quot;;
</del><ins>+        if (iter.first == &quot;GL_EXT_shader_texture_lod&quot;)
+        {
+            sink &lt;&lt; &quot;#extension GL_ARB_shader_texture_lod : &quot; &lt;&lt; getBehaviorString(iter.second)
+                 &lt;&lt; &quot;\n&quot;;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    // GLSL ES 3 explicit location qualifiers need to use an extension before GLSL 330
+    if (getShaderVersion() &gt;= 300 &amp;&amp; getOutputType() &lt; SH_GLSL_330_CORE_OUTPUT)
+    {
+        sink &lt;&lt; &quot;#extension GL_ARB_explicit_attrib_location : require\n&quot;;
+    }
+
+    TExtensionGLSL extensionGLSL(getOutputType());
+    root-&gt;traverse(&amp;extensionGLSL);
+
+    for (const auto &amp;ext : extensionGLSL.getEnabledExtensions())
+    {
+        sink &lt;&lt; &quot;#extension &quot; &lt;&lt; ext &lt;&lt; &quot; : enable\n&quot;;
+    }
+    for (const auto &amp;ext : extensionGLSL.getRequiredExtensions())
+    {
+        sink &lt;&lt; &quot;#extension &quot; &lt;&lt; ext &lt;&lt; &quot; : require\n&quot;;
+    }
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorGLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorGLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -17,11 +17,11 @@
</span><span class="cx">   protected:
</span><span class="cx">     void initBuiltInFunctionEmulator(BuiltInFunctionEmulator *emu, int compileOptions) override;
</span><span class="cx"> 
</span><del>-    virtual void translate(TIntermNode *root, int compileOptions) override;
</del><ins>+    void translate(TIntermNode *root, int compileOptions) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     void writeVersion(TIntermNode *root);
</span><del>-    void writeExtensionBehavior();
</del><ins>+    void writeExtensionBehavior(TIntermNode *root);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #endif  // COMPILER_TRANSLATOR_TRANSLATORGLSL_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorHLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,9 +8,12 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/ArrayReturnValueToOutParameter.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/OutputHLSL.h&quot;
</span><ins>+#include &quot;compiler/translator/RemoveDynamicIndexing.h&quot;
+#include &quot;compiler/translator/RewriteElseBlocks.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/SeparateArrayInitialization.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/SeparateDeclarations.h&quot;
</span><del>-#include &quot;compiler/translator/SimplifyArrayAssignment.h&quot;
</del><ins>+#include &quot;compiler/translator/SeparateExpressionsReturningArrays.h&quot;
+#include &quot;compiler/translator/UnfoldShortCircuitToIf.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> TranslatorHLSL::TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output)
</span><span class="cx">     : TCompiler(type, spec, output)
</span><span class="lines">@@ -22,18 +25,33 @@
</span><span class="cx">     const ShBuiltInResources &amp;resources = getResources();
</span><span class="cx">     int numRenderTargets = resources.EXT_draw_buffers ? resources.MaxDrawBuffers : 1;
</span><span class="cx"> 
</span><del>-    SeparateArrayDeclarations(root);
</del><ins>+    SeparateDeclarations(root);
</ins><span class="cx"> 
</span><ins>+    // Note that SeparateDeclarations needs to be run before UnfoldShortCircuitToIf.
+    UnfoldShortCircuitToIf(root, getTemporaryIndex());
+
+    SeparateExpressionsReturningArrays(root, getTemporaryIndex());
+
</ins><span class="cx">     // Note that SeparateDeclarations needs to be run before SeparateArrayInitialization.
</span><span class="cx">     SeparateArrayInitialization(root);
</span><span class="cx"> 
</span><del>-    SimplifyArrayAssignment simplify;
-    root-&gt;traverse(&amp;simplify);
-
</del><span class="cx">     // HLSL doesn't support arrays as return values, we'll need to make functions that have an array
</span><span class="cx">     // as a return value to use an out parameter to transfer the array data instead.
</span><del>-    ArrayReturnValueToOutParameter(root);
</del><ins>+    ArrayReturnValueToOutParameter(root, getTemporaryIndex());
</ins><span class="cx"> 
</span><ins>+    if (!shouldRunLoopAndIndexingValidation(compileOptions))
+    {
+        // HLSL doesn't support dynamic indexing of vectors and matrices.
+        RemoveDynamicIndexing(root, getTemporaryIndex(), getSymbolTable(), getShaderVersion());
+    }
+
+    // Work around D3D9 bug that would manifest in vertex shaders with selection blocks which
+    // use a vertex attribute as a condition, and some related computation in the else block.
+    if (getOutputType() == SH_HLSL_3_0_OUTPUT &amp;&amp; getShaderType() == GL_VERTEX_SHADER)
+    {
+        sh::RewriteElseBlocks(root, getTemporaryIndex());
+    }
+
</ins><span class="cx">     sh::OutputHLSL outputHLSL(getShaderType(), getShaderVersion(), getExtensionBehavior(),
</span><span class="cx">         getSourcePath(), getOutputType(), numRenderTargets, getUniforms(), compileOptions);
</span><span class="cx"> 
</span><span class="lines">@@ -54,13 +72,7 @@
</span><span class="cx">     return mInterfaceBlockRegisterMap.find(interfaceBlockName)-&gt;second;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TranslatorHLSL::hasUniform(const std::string &amp;uniformName) const
</del><ins>+const std::map&lt;std::string, unsigned int&gt; *TranslatorHLSL::getUniformRegisterMap() const
</ins><span class="cx"> {
</span><del>-    return (mUniformRegisterMap.count(uniformName) &gt; 0);
</del><ins>+    return &amp;mUniformRegisterMap;
</ins><span class="cx"> }
</span><del>-
-unsigned int TranslatorHLSL::getUniformRegister(const std::string &amp;uniformName) const
-{
-    ASSERT(hasUniform(uniformName));
-    return mUniformRegisterMap.find(uniformName)-&gt;second;
-}
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorTranslatorHLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorHLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,17 +13,21 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output);
</span><del>-    virtual TranslatorHLSL *getAsTranslatorHLSL() { return this; }
</del><ins>+#ifdef ANGLE_ENABLE_HLSL
+    TranslatorHLSL *getAsTranslatorHLSL() override { return this; }
+#endif
</ins><span class="cx"> 
</span><span class="cx">     bool hasInterfaceBlock(const std::string &amp;interfaceBlockName) const;
</span><span class="cx">     unsigned int getInterfaceBlockRegister(const std::string &amp;interfaceBlockName) const;
</span><span class="cx"> 
</span><del>-    bool hasUniform(const std::string &amp;uniformName) const;
-    unsigned int getUniformRegister(const std::string &amp;uniformName) const;
</del><ins>+    const std::map&lt;std::string, unsigned int&gt; *getUniformRegisterMap() const;
</ins><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    virtual void translate(TIntermNode *root, int compileOptions) override;
</del><ins>+    void translate(TIntermNode *root, int compileOptions) override;
</ins><span class="cx"> 
</span><ins>+    // collectVariables needs to be run always so registers can be assigned.
+    bool shouldCollectVariables(int compileOptions) override { return true; }
+
</ins><span class="cx">     std::map&lt;std::string, unsigned int&gt; mInterfaceBlockRegisterMap;
</span><span class="cx">     std::map&lt;std::string, unsigned int&gt; mUniformRegisterMap;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorTypescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,6 +9,8 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/Types.h&quot;
</span><ins>+#include &quot;compiler/translator/InfoSink.h&quot;
+#include &quot;compiler/translator/IntermNode.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #include &lt;algorithm&gt;
</span><span class="cx"> #include &lt;climits&gt;
</span><span class="lines">@@ -46,9 +48,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TType::TType(const TPublicType &amp;p)
</span><del>-    : type(p.type), precision(p.precision), qualifier(p.qualifier), layoutQualifier(p.layoutQualifier),
-      primarySize(p.primarySize), secondarySize(p.secondarySize), array(p.array), arraySize(p.arraySize),
-      interfaceBlock(0), structure(0)
</del><ins>+    : type(p.type), precision(p.precision), qualifier(p.qualifier), invariant(p.invariant),
+      layoutQualifier(p.layoutQualifier), primarySize(p.primarySize), secondarySize(p.secondarySize),
+      array(p.array), arraySize(p.arraySize), interfaceBlock(0), structure(0)
</ins><span class="cx"> {
</span><span class="cx">     if (p.userDef)
</span><span class="cx">         structure = p.userDef-&gt;getStruct();
</span><span class="lines">@@ -59,6 +61,27 @@
</span><span class="cx">     return (uniqueId() == other.uniqueId());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TString TType::getCompleteString() const
+{
+    TStringStream stream;
+
+    if (invariant)
+        stream &lt;&lt; &quot;invariant &quot;;
+    if (qualifier != EvqTemporary &amp;&amp; qualifier != EvqGlobal)
+        stream &lt;&lt; getQualifierString() &lt;&lt; &quot; &quot;;
+    if (precision != EbpUndefined)
+        stream &lt;&lt; getPrecisionString() &lt;&lt; &quot; &quot;;
+    if (array)
+        stream &lt;&lt; &quot;array[&quot; &lt;&lt; getArraySize() &lt;&lt; &quot;] of &quot;;
+    if (isMatrix())
+        stream &lt;&lt; getCols() &lt;&lt; &quot;X&quot; &lt;&lt; getRows() &lt;&lt; &quot; matrix of &quot;;
+    else if (isVector())
+        stream &lt;&lt; getNominalSize() &lt;&lt; &quot;-component vector of &quot;;
+
+    stream &lt;&lt; getBasicString();
+    return stream.str();
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // Recursively generate mangled names.
</span><span class="cx"> //
</span><span class="lines">@@ -201,6 +224,17 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool TStructure::containsType(TBasicType type) const
+{
+    for (size_t i = 0; i &lt; mFields-&gt;size(); ++i)
+    {
+        const TType *fieldType = (*mFields)[i]-&gt;type();
+        if (fieldType-&gt;getBasicType() == type || fieldType-&gt;isStructureContainingType(type))
+            return true;
+    }
+    return false;
+}
+
</ins><span class="cx"> bool TStructure::containsSamplers() const
</span><span class="cx"> {
</span><span class="cx">     for (size_t i = 0; i &lt; mFields-&gt;size(); ++i)
</span><span class="lines">@@ -212,9 +246,79 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TString TFieldListCollection::buildMangledName() const
</del><ins>+void TStructure::createSamplerSymbols(const TString &amp;structName,
+                                      const TString &amp;structAPIName,
+                                      const int arrayOfStructsSize,
+                                      TVector&lt;TIntermSymbol *&gt; *outputSymbols,
+                                      TMap&lt;TIntermSymbol *, TString&gt; *outputSymbolsToAPINames) const
</ins><span class="cx"> {
</span><del>-    TString mangledName(mangledNamePrefix());
</del><ins>+    for (auto &amp;field : *mFields)
+    {
+        const TType *fieldType = field-&gt;type();
+        if (IsSampler(fieldType-&gt;getBasicType()))
+        {
+            if (arrayOfStructsSize &gt; 0)
+            {
+                for (int arrayIndex = 0; arrayIndex &lt; arrayOfStructsSize; ++arrayIndex)
+                {
+                    TStringStream name;
+                    name &lt;&lt; structName &lt;&lt; &quot;_&quot; &lt;&lt; arrayIndex &lt;&lt; &quot;_&quot; &lt;&lt; field-&gt;name();
+                    TIntermSymbol *symbol = new TIntermSymbol(0, name.str(), *fieldType);
+                    outputSymbols-&gt;push_back(symbol);
+
+                    if (outputSymbolsToAPINames)
+                    {
+                        TStringStream apiName;
+                        apiName &lt;&lt; structAPIName &lt;&lt; &quot;[&quot; &lt;&lt; arrayIndex &lt;&lt; &quot;].&quot; &lt;&lt; field-&gt;name();
+                        (*outputSymbolsToAPINames)[symbol] = apiName.str();
+                    }
+                }
+            }
+            else
+            {
+                TString symbolName    = structName + &quot;_&quot; + field-&gt;name();
+                TIntermSymbol *symbol = new TIntermSymbol(0, symbolName, *fieldType);
+                outputSymbols-&gt;push_back(symbol);
+
+                if (outputSymbolsToAPINames)
+                {
+                    TString apiName = structAPIName + &quot;.&quot; + field-&gt;name();
+                    (*outputSymbolsToAPINames)[symbol] = apiName;
+                }
+            }
+        }
+        else if (fieldType-&gt;isStructureContainingSamplers())
+        {
+            int nestedArrayOfStructsSize = fieldType-&gt;isArray() ? fieldType-&gt;getArraySize() : 0;
+            if (arrayOfStructsSize &gt; 0)
+            {
+                for (int arrayIndex = 0; arrayIndex &lt; arrayOfStructsSize; ++arrayIndex)
+                {
+                    TStringStream fieldName;
+                    fieldName &lt;&lt; structName &lt;&lt; &quot;_&quot; &lt;&lt; arrayIndex &lt;&lt; &quot;_&quot; &lt;&lt; field-&gt;name();
+                    TStringStream fieldAPIName;
+                    if (outputSymbolsToAPINames)
+                    {
+                        fieldAPIName &lt;&lt; structAPIName &lt;&lt; &quot;[&quot; &lt;&lt; arrayIndex &lt;&lt; &quot;].&quot; &lt;&lt; field-&gt;name();
+                    }
+                    fieldType-&gt;createSamplerSymbols(fieldName.str(), fieldAPIName.str(),
+                                                    nestedArrayOfStructsSize, outputSymbols,
+                                                    outputSymbolsToAPINames);
+                }
+            }
+            else
+            {
+                fieldType-&gt;createSamplerSymbols(
+                    structName + &quot;_&quot; + field-&gt;name(), structAPIName + &quot;.&quot; + field-&gt;name(),
+                    nestedArrayOfStructsSize, outputSymbols, outputSymbolsToAPINames);
+            }
+        }
+    }
+}
+
+TString TFieldListCollection::buildMangledName(const TString &amp;mangledNamePrefix) const
+{
+    TString mangledName(mangledNamePrefix);
</ins><span class="cx">     mangledName += *mName;
</span><span class="cx">     for (size_t i = 0; i &lt; mFields-&gt;size(); ++i)
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorTypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,6 +16,7 @@
</span><span class="cx"> struct TPublicType;
</span><span class="cx"> class TType;
</span><span class="cx"> class TSymbol;
</span><ins>+class TIntermSymbol;
</ins><span class="cx"> 
</span><span class="cx"> class TField : angle::NonCopyable
</span><span class="cx"> {
</span><span class="lines">@@ -73,12 +74,6 @@
</span><span class="cx">         return *mFields;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const TString &amp;mangledName() const
-    {
-        if (mMangledName.empty())
-            mMangledName = buildMangledName();
-        return mMangledName;
-    }
</del><span class="cx">     size_t objectSize() const
</span><span class="cx">     {
</span><span class="cx">         if (mObjectSize == 0)
</span><span class="lines">@@ -93,9 +88,8 @@
</span><span class="cx">           mObjectSize(0)
</span><span class="cx">     {
</span><span class="cx">     }
</span><del>-    TString buildMangledName() const;
</del><ins>+    TString buildMangledName(const TString &amp;mangledNamePrefix) const;
</ins><span class="cx">     size_t calculateObjectSize() const;
</span><del>-    virtual TString mangledNamePrefix() const = 0;
</del><span class="cx"> 
</span><span class="cx">     const TString *mName;
</span><span class="cx">     TFieldList *mFields;
</span><span class="lines">@@ -124,8 +118,15 @@
</span><span class="cx">         return mDeepestNesting;
</span><span class="cx">     }
</span><span class="cx">     bool containsArrays() const;
</span><ins>+    bool containsType(TBasicType t) const;
</ins><span class="cx">     bool containsSamplers() const;
</span><span class="cx"> 
</span><ins>+    void createSamplerSymbols(const TString &amp;structName,
+                              const TString &amp;structAPIName,
+                              const int arrayOfStructsSize,
+                              TVector&lt;TIntermSymbol *&gt; *outputSymbols,
+                              TMap&lt;TIntermSymbol *, TString&gt; *outputSymbolsToAPINames) const;
+
</ins><span class="cx">     bool equals(const TStructure &amp;other) const;
</span><span class="cx"> 
</span><span class="cx">     void setUniqueId(int uniqueId)
</span><span class="lines">@@ -149,6 +150,13 @@
</span><span class="cx">         return mAtGlobalScope;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    const TString &amp;mangledName() const
+    {
+        if (mMangledName.empty())
+            mMangledName = buildMangledName(&quot;struct-&quot;);
+        return mMangledName;
+    }
+
</ins><span class="cx">   private:
</span><span class="cx">     // TODO(zmo): Find a way to get rid of the const_cast in function
</span><span class="cx">     // setName().  At the moment keep this function private so only
</span><span class="lines">@@ -160,10 +168,6 @@
</span><span class="cx">         *mutableName = name;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual TString mangledNamePrefix() const
-    {
-        return &quot;struct-&quot;;
-    }
</del><span class="cx">     int calculateDeepestNesting() const;
</span><span class="cx"> 
</span><span class="cx">     mutable int mDeepestNesting;
</span><span class="lines">@@ -209,13 +213,14 @@
</span><span class="cx">     {
</span><span class="cx">         return mMatrixPacking;
</span><span class="cx">     }
</span><del>-
-  private:
-    virtual TString mangledNamePrefix() const
</del><ins>+    const TString &amp;mangledName() const
</ins><span class="cx">     {
</span><del>-        return &quot;iblock-&quot;;
</del><ins>+        if (mMangledName.empty())
+            mMangledName = buildMangledName(&quot;iblock-&quot;);
+        return mMangledName;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+  private:
</ins><span class="cx">     const TString *mInstanceName; // for interface block instance names
</span><span class="cx">     int mArraySize; // 0 if not an array
</span><span class="cx">     TLayoutBlockStorage mBlockStorage;
</span><span class="lines">@@ -230,10 +235,14 @@
</span><span class="cx">   public:
</span><span class="cx">     POOL_ALLOCATOR_NEW_DELETE();
</span><span class="cx">     TType()
</span><ins>+        : type(EbtVoid), precision(EbpUndefined), qualifier(EvqGlobal), invariant(false),
+          layoutQualifier(TLayoutQualifier::create()),
+          primarySize(0), secondarySize(0), array(false), arraySize(0),
+          interfaceBlock(nullptr), structure(nullptr)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     TType(TBasicType t, unsigned char ps = 1, unsigned char ss = 1)
</span><del>-        : type(t), precision(EbpUndefined), qualifier(EvqGlobal),
</del><ins>+        : type(t), precision(EbpUndefined), qualifier(EvqGlobal), invariant(false),
</ins><span class="cx">           layoutQualifier(TLayoutQualifier::create()),
</span><span class="cx">           primarySize(ps), secondarySize(ss), array(false), arraySize(0),
</span><span class="cx">           interfaceBlock(0), structure(0)
</span><span class="lines">@@ -241,7 +250,7 @@
</span><span class="cx">     }
</span><span class="cx">     TType(TBasicType t, TPrecision p, TQualifier q = EvqTemporary,
</span><span class="cx">           unsigned char ps = 1, unsigned char ss = 1, bool a = false)
</span><del>-        : type(t), precision(p), qualifier(q),
</del><ins>+        : type(t), precision(p), qualifier(q), invariant(false),
</ins><span class="cx">           layoutQualifier(TLayoutQualifier::create()),
</span><span class="cx">           primarySize(ps), secondarySize(ss), array(a), arraySize(0),
</span><span class="cx">           interfaceBlock(0), structure(0)
</span><span class="lines">@@ -249,7 +258,7 @@
</span><span class="cx">     }
</span><span class="cx">     explicit TType(const TPublicType &amp;p);
</span><span class="cx">     TType(TStructure *userDef, TPrecision p = EbpUndefined)
</span><del>-        : type(EbtStruct), precision(p), qualifier(EvqTemporary),
</del><ins>+        : type(EbtStruct), precision(p), qualifier(EvqTemporary), invariant(false),
</ins><span class="cx">           layoutQualifier(TLayoutQualifier::create()),
</span><span class="cx">           primarySize(1), secondarySize(1), array(false), arraySize(0),
</span><span class="cx">           interfaceBlock(0), structure(userDef)
</span><span class="lines">@@ -258,19 +267,26 @@
</span><span class="cx">     TType(TInterfaceBlock *interfaceBlockIn, TQualifier qualifierIn,
</span><span class="cx">           TLayoutQualifier layoutQualifierIn, int arraySizeIn)
</span><span class="cx">         : type(EbtInterfaceBlock), precision(EbpUndefined), qualifier(qualifierIn),
</span><del>-          layoutQualifier(layoutQualifierIn),
</del><ins>+          invariant(false), layoutQualifier(layoutQualifierIn),
</ins><span class="cx">           primarySize(1), secondarySize(1), array(arraySizeIn &gt; 0), arraySize(arraySizeIn),
</span><span class="cx">           interfaceBlock(interfaceBlockIn), structure(0)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    TType(const TType &amp;) = default;
+    TType &amp;operator=(const TType &amp;) = default;
+
</ins><span class="cx">     TBasicType getBasicType() const
</span><span class="cx">     {
</span><span class="cx">         return type;
</span><span class="cx">     }
</span><span class="cx">     void setBasicType(TBasicType t)
</span><span class="cx">     {
</span><del>-        type = t;
</del><ins>+        if (type != t)
+        {
+            type = t;
+            invalidateMangledName();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     TPrecision getPrecision() const
</span><span class="lines">@@ -291,6 +307,11 @@
</span><span class="cx">         qualifier = q;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool isInvariant() const
+    {
+        return invariant;
+    }
+
</ins><span class="cx">     TLayoutQualifier getLayoutQualifier() const
</span><span class="cx">     {
</span><span class="cx">         return layoutQualifier;
</span><span class="lines">@@ -320,11 +341,19 @@
</span><span class="cx">     }
</span><span class="cx">     void setPrimarySize(unsigned char ps)
</span><span class="cx">     {
</span><del>-        primarySize = ps;
</del><ins>+        if (primarySize != ps)
+        {
+            primarySize = ps;
+            invalidateMangledName();
+        }
</ins><span class="cx">     }
</span><span class="cx">     void setSecondarySize(unsigned char ss)
</span><span class="cx">     {
</span><del>-        secondarySize = ss;
</del><ins>+        if (secondarySize != ss)
+        {
+            secondarySize = ss;
+            invalidateMangledName();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Full size of single instance of type
</span><span class="lines">@@ -352,13 +381,21 @@
</span><span class="cx">     }
</span><span class="cx">     void setArraySize(int s)
</span><span class="cx">     {
</span><del>-        array = true;
-        arraySize = s;
</del><ins>+        if (!array || arraySize != s)
+        {
+            array     = true;
+            arraySize = s;
+            invalidateMangledName();
+        }
</ins><span class="cx">     }
</span><span class="cx">     void clearArrayness()
</span><span class="cx">     {
</span><del>-        array = false;
-        arraySize = 0;
</del><ins>+        if (array)
+        {
+            array     = false;
+            arraySize = 0;
+            invalidateMangledName();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     TInterfaceBlock *getInterfaceBlock() const
</span><span class="lines">@@ -367,7 +404,11 @@
</span><span class="cx">     }
</span><span class="cx">     void setInterfaceBlock(TInterfaceBlock *interfaceBlockIn)
</span><span class="cx">     {
</span><del>-        interfaceBlock = interfaceBlockIn;
</del><ins>+        if (interfaceBlock != interfaceBlockIn)
+        {
+            interfaceBlock = interfaceBlockIn;
+            invalidateMangledName();
+        }
</ins><span class="cx">     }
</span><span class="cx">     bool isInterfaceBlock() const
</span><span class="cx">     {
</span><span class="lines">@@ -393,10 +434,14 @@
</span><span class="cx">     }
</span><span class="cx">     void setStruct(TStructure *s)
</span><span class="cx">     {
</span><del>-        structure = s;
</del><ins>+        if (structure != s)
+        {
+            structure = s;
+            invalidateMangledName();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const TString &amp;getMangledName()
</del><ins>+    const TString &amp;getMangledName() const
</ins><span class="cx">     {
</span><span class="cx">         if (mangled.empty())
</span><span class="cx">         {
</span><span class="lines">@@ -481,19 +526,42 @@
</span><span class="cx">         return structure ? structure-&gt;containsArrays() : false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool isStructureContainingType(TBasicType t) const
+    {
+        return structure ? structure-&gt;containsType(t) : false;
+    }
+
</ins><span class="cx">     bool isStructureContainingSamplers() const
</span><span class="cx">     {
</span><span class="cx">         return structure ? structure-&gt;containsSamplers() : false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-  protected:
</del><ins>+    void createSamplerSymbols(const TString &amp;structName,
+                              const TString &amp;structAPIName,
+                              const int arrayOfStructsSize,
+                              TVector&lt;TIntermSymbol *&gt; *outputSymbols,
+                              TMap&lt;TIntermSymbol *, TString&gt; *outputSymbolsToAPINames) const
+    {
+        ASSERT(structure != nullptr &amp;&amp; structure-&gt;containsSamplers());
+        structure-&gt;createSamplerSymbols(structName, structAPIName, arrayOfStructsSize,
+                                        outputSymbols, outputSymbolsToAPINames);
+    }
+
+    // Initializes all lazily-initialized members.
+    void realize()
+    {
+        getMangledName();
+    }
+
+  private:
+    void invalidateMangledName() { mangled = &quot;&quot;; }
</ins><span class="cx">     TString buildMangledName() const;
</span><span class="cx">     size_t getStructSize() const;
</span><del>-    void computeDeepestStructNesting();
</del><span class="cx"> 
</span><span class="cx">     TBasicType type;
</span><span class="cx">     TPrecision precision;
</span><span class="cx">     TQualifier qualifier;
</span><ins>+    bool invariant;
</ins><span class="cx">     TLayoutQualifier layoutQualifier;
</span><span class="cx">     unsigned char primarySize; // size of vector or cols matrix
</span><span class="cx">     unsigned char secondarySize; // rows of a matrix
</span><span class="lines">@@ -523,6 +591,7 @@
</span><span class="cx">     TBasicType type;
</span><span class="cx">     TLayoutQualifier layoutQualifier;
</span><span class="cx">     TQualifier qualifier;
</span><ins>+    bool invariant;
</ins><span class="cx">     TPrecision precision;
</span><span class="cx">     unsigned char primarySize;          // size of vector or cols of matrix
</span><span class="cx">     unsigned char secondarySize;        // rows of matrix
</span><span class="lines">@@ -531,11 +600,15 @@
</span><span class="cx">     TType *userDef;
</span><span class="cx">     TSourceLoc line;
</span><span class="cx"> 
</span><ins>+    // true if the type was defined by a struct specifier rather than a reference to a type name.
+    bool isStructSpecifier;
+
</ins><span class="cx">     void setBasic(TBasicType bt, TQualifier q, const TSourceLoc &amp;ln)
</span><span class="cx">     {
</span><span class="cx">         type = bt;
</span><span class="cx">         layoutQualifier = TLayoutQualifier::create();
</span><span class="cx">         qualifier = q;
</span><ins>+        invariant = false;
</ins><span class="cx">         precision = EbpUndefined;
</span><span class="cx">         primarySize = 1;
</span><span class="cx">         secondarySize = 1;
</span><span class="lines">@@ -543,6 +616,7 @@
</span><span class="cx">         arraySize = 0;
</span><span class="cx">         userDef = 0;
</span><span class="cx">         line = ln;
</span><ins>+        isStructSpecifier = false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void setAggregate(unsigned char size)
</span><span class="lines">@@ -582,6 +656,16 @@
</span><span class="cx">         return userDef-&gt;isStructureContainingArrays();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool isStructureContainingType(TBasicType t) const
+    {
+        if (!userDef)
+        {
+            return false;
+        }
+
+        return userDef-&gt;isStructureContainingType(t);
+    }
+
</ins><span class="cx">     bool isMatrix() const
</span><span class="cx">     {
</span><span class="cx">         return primarySize &gt; 1 &amp;&amp; secondarySize &gt; 1;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorUnfoldShortCircuitcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuit.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuit.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuit.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,185 +0,0 @@
</span><del>-//
-// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// UnfoldShortCircuit is an AST traverser to output short-circuiting operators as if-else statements.
-// The results are assigned to s# temporaries, which are used by the main translator instead of
-// the original expression.
-//
-
-#include &quot;compiler/translator/UnfoldShortCircuit.h&quot;
-
-#include &quot;compiler/translator/InfoSink.h&quot;
-#include &quot;compiler/translator/OutputHLSL.h&quot;
-#include &quot;compiler/translator/UtilsHLSL.h&quot;
-
-namespace sh
-{
-UnfoldShortCircuit::UnfoldShortCircuit(OutputHLSL *outputHLSL) : mOutputHLSL(outputHLSL)
-{
-    mTemporaryIndex = 0;
-}
-
-void UnfoldShortCircuit::traverse(TIntermNode *node)
-{
-    int rewindIndex = mTemporaryIndex;
-    node-&gt;traverse(this);
-    mTemporaryIndex = rewindIndex;
-}
-
-bool UnfoldShortCircuit::visitBinary(Visit visit, TIntermBinary *node)
-{
-    TInfoSinkBase &amp;out = mOutputHLSL-&gt;getInfoSink();
-
-    // If our right node doesn't have side effects, we know we don't need to unfold this
-    // expression: there will be no short-circuiting side effects to avoid
-    // (note: unfolding doesn't depend on the left node -- it will always be evaluated)
-    if (!node-&gt;getRight()-&gt;hasSideEffects())
-    {
-        return true;
-    }
-
-    switch (node-&gt;getOp())
-    {
-      case EOpLogicalOr:
-        // &quot;x || y&quot; is equivalent to &quot;x ? true : y&quot;, which unfolds to &quot;bool s; if(x) s = true; else s = y;&quot;,
-        // and then further simplifies down to &quot;bool s = x; if(!s) s = y;&quot;.
-        {
-            int i = mTemporaryIndex;
-
-            out &lt;&lt; &quot;bool s&quot; &lt;&lt; i &lt;&lt; &quot;;\n&quot;;
-
-            out &lt;&lt; &quot;{\n&quot;;
-
-            mTemporaryIndex = i + 1;
-            node-&gt;getLeft()-&gt;traverse(this);
-            out &lt;&lt; &quot;s&quot; &lt;&lt; i &lt;&lt; &quot; = &quot;;
-            mTemporaryIndex = i + 1;
-            node-&gt;getLeft()-&gt;traverse(mOutputHLSL);
-            out &lt;&lt; &quot;;\n&quot;;
-            out &lt;&lt; &quot;if (!s&quot; &lt;&lt; i &lt;&lt; &quot;)\n&quot;
-                   &quot;{\n&quot;;
-            mTemporaryIndex = i + 1;
-            node-&gt;getRight()-&gt;traverse(this);
-            out &lt;&lt; &quot;    s&quot; &lt;&lt; i &lt;&lt; &quot; = &quot;;
-            mTemporaryIndex = i + 1;
-            node-&gt;getRight()-&gt;traverse(mOutputHLSL);
-            out &lt;&lt; &quot;;\n&quot;
-                   &quot;}\n&quot;;
-
-            out &lt;&lt; &quot;}\n&quot;;
-
-            mTemporaryIndex = i + 1;
-        }
-        return false;
-      case EOpLogicalAnd:
-        // &quot;x &amp;&amp; y&quot; is equivalent to &quot;x ? y : false&quot;, which unfolds to &quot;bool s; if(x) s = y; else s = false;&quot;,
-        // and then further simplifies down to &quot;bool s = x; if(s) s = y;&quot;.
-        {
-            int i = mTemporaryIndex;
-
-            out &lt;&lt; &quot;bool s&quot; &lt;&lt; i &lt;&lt; &quot;;\n&quot;;
-
-            out &lt;&lt; &quot;{\n&quot;;
-
-            mTemporaryIndex = i + 1;
-            node-&gt;getLeft()-&gt;traverse(this);
-            out &lt;&lt; &quot;s&quot; &lt;&lt; i &lt;&lt; &quot; = &quot;;
-            mTemporaryIndex = i + 1;
-            node-&gt;getLeft()-&gt;traverse(mOutputHLSL);
-            out &lt;&lt; &quot;;\n&quot;;
-            out &lt;&lt; &quot;if (s&quot; &lt;&lt; i &lt;&lt; &quot;)\n&quot;
-                   &quot;{\n&quot;;
-            mTemporaryIndex = i + 1;
-            node-&gt;getRight()-&gt;traverse(this);
-            out &lt;&lt; &quot;    s&quot; &lt;&lt; i &lt;&lt; &quot; = &quot;;
-            mTemporaryIndex = i + 1;
-            node-&gt;getRight()-&gt;traverse(mOutputHLSL);
-            out &lt;&lt; &quot;;\n&quot;
-                   &quot;}\n&quot;;
-
-            out &lt;&lt; &quot;}\n&quot;;
-
-            mTemporaryIndex = i + 1;
-        }
-        return false;
-      default:
-        return true;
-    }
-}
-
-bool UnfoldShortCircuit::visitSelection(Visit visit, TIntermSelection *node)
-{
-    TInfoSinkBase &amp;out = mOutputHLSL-&gt;getInfoSink();
-
-    // Unfold &quot;b ? x : y&quot; into &quot;type s; if(b) s = x; else s = y;&quot;
-    if (node-&gt;usesTernaryOperator())
-    {
-        int i = mTemporaryIndex;
-
-        out &lt;&lt; TypeString(node-&gt;getType()) &lt;&lt; &quot; s&quot; &lt;&lt; i &lt;&lt; &quot;;\n&quot;;
-
-        out &lt;&lt; &quot;{\n&quot;;
-
-        mTemporaryIndex = i + 1;
-        node-&gt;getCondition()-&gt;traverse(this);
-        out &lt;&lt; &quot;if (&quot;;
-        mTemporaryIndex = i + 1;
-        node-&gt;getCondition()-&gt;traverse(mOutputHLSL);
-        out &lt;&lt; &quot;)\n&quot;
-               &quot;{\n&quot;;
-        mTemporaryIndex = i + 1;
-        node-&gt;getTrueBlock()-&gt;traverse(this);
-        out &lt;&lt; &quot;    s&quot; &lt;&lt; i &lt;&lt; &quot; = &quot;;
-        mTemporaryIndex = i + 1;
-        node-&gt;getTrueBlock()-&gt;traverse(mOutputHLSL);
-        out &lt;&lt; &quot;;\n&quot;
-               &quot;}\n&quot;
-               &quot;else\n&quot;
-               &quot;{\n&quot;;
-        mTemporaryIndex = i + 1;
-        node-&gt;getFalseBlock()-&gt;traverse(this);
-        out &lt;&lt; &quot;    s&quot; &lt;&lt; i &lt;&lt; &quot; = &quot;;
-        mTemporaryIndex = i + 1;
-        node-&gt;getFalseBlock()-&gt;traverse(mOutputHLSL);
-        out &lt;&lt; &quot;;\n&quot;
-               &quot;}\n&quot;;
-
-        out &lt;&lt; &quot;}\n&quot;;
-
-        mTemporaryIndex = i + 1;
-    }
-
-    return false;
-}
-
-bool UnfoldShortCircuit::visitLoop(Visit visit, TIntermLoop *node)
-{
-    int rewindIndex = mTemporaryIndex;
-
-    if (node-&gt;getInit())
-    {
-        node-&gt;getInit()-&gt;traverse(this);
-    }
-    
-    if (node-&gt;getCondition())
-    {
-        node-&gt;getCondition()-&gt;traverse(this);
-    }
-
-    if (node-&gt;getExpression())
-    {
-        node-&gt;getExpression()-&gt;traverse(this);
-    }
-
-    mTemporaryIndex = rewindIndex;
-
-    return false;
-}
-
-int UnfoldShortCircuit::getNextTemporaryIndex()
-{
-    return mTemporaryIndex++;
-}
-}
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorUnfoldShortCircuith"></a>
<div class="delfile"><h4>Deleted: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuit.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuit.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuit.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,38 +0,0 @@
</span><del>-//
-// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// UnfoldShortCircuit is an AST traverser to output short-circuiting operators as if-else statements
-//
-
-#ifndef COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUIT_H_
-#define COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUIT_H_
-
-#include &quot;compiler/translator/IntermNode.h&quot;
-#include &quot;compiler/translator/ParseContext.h&quot;
-
-namespace sh
-{
-class OutputHLSL;
-
-class UnfoldShortCircuit : public TIntermTraverser
-{
-  public:
-    UnfoldShortCircuit(OutputHLSL *outputHLSL);
-
-    void traverse(TIntermNode *node);
-    bool visitBinary(Visit visit, TIntermBinary*);
-    bool visitSelection(Visit visit, TIntermSelection *node);
-    bool visitLoop(Visit visit, TIntermLoop *node);
-
-    int getNextTemporaryIndex();
-
-  protected:
-    OutputHLSL *const mOutputHLSL;
-
-    int mTemporaryIndex;
-};
-}
-
-#endif   // COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUIT_H_
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorUnfoldShortCircuitASTh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -20,9 +20,12 @@
</span><span class="cx"> class UnfoldShortCircuitAST : public TIntermTraverser
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    UnfoldShortCircuitAST() { }
</del><ins>+    UnfoldShortCircuitAST()
+        : TIntermTraverser(true, false, false)
+    {
+    }
</ins><span class="cx"> 
</span><del>-    virtual bool visitBinary(Visit visit, TIntermBinary *);
</del><ins>+    bool visitBinary(Visit visit, TIntermBinary *) override;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #endif  // COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUITAST_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorUnfoldShortCircuitToIfcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,368 @@
</span><ins>+//
+// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// UnfoldShortCircuitToIf is an AST traverser to convert short-circuiting operators to if-else statements.
+// The results are assigned to s# temporaries, which are used by the main translator instead of
+// the original expression.
+//
+
+#include &quot;compiler/translator/UnfoldShortCircuitToIf.h&quot;
+
+#include &quot;compiler/translator/IntermNode.h&quot;
+
+namespace
+{
+
+// Traverser that unfolds one short-circuiting operation at a time.
+class UnfoldShortCircuitTraverser : public TIntermTraverser
+{
+  public:
+    UnfoldShortCircuitTraverser();
+
+    bool visitBinary(Visit visit, TIntermBinary *node) override;
+    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
+    bool visitSelection(Visit visit, TIntermSelection *node) override;
+    bool visitLoop(Visit visit, TIntermLoop *node) override;
+
+    void nextIteration();
+    bool foundShortCircuit() const { return mFoundShortCircuit; }
+
+  protected:
+    // Check if the traversal is inside a loop condition or expression, in which case the unfolded
+    // expression needs to be copied inside the loop. Returns true if the copying is done, in which
+    // case no further unfolding should be done on the same traversal.
+    // The parameters are the node that will be unfolded to multiple statements and so can't remain
+    // inside a loop condition, and its parent.
+    bool copyLoopConditionOrExpression(TIntermNode *parent, TIntermTyped *node);
+
+    // Marked to true once an operation that needs to be unfolded has been found.
+    // After that, no more unfolding is performed on that traversal.
+    bool mFoundShortCircuit;
+
+    // Set to the loop node while a loop condition or expression is being traversed.
+    TIntermLoop *mParentLoop;
+    // Parent of the loop node while a loop condition or expression is being traversed.
+    TIntermNode *mLoopParent;
+
+    bool mInLoopCondition;
+    bool mInLoopExpression;
+};
+
+UnfoldShortCircuitTraverser::UnfoldShortCircuitTraverser()
+    : TIntermTraverser(true, false, true),
+      mFoundShortCircuit(false),
+      mParentLoop(nullptr),
+      mLoopParent(nullptr),
+      mInLoopCondition(false),
+      mInLoopExpression(false)
+{
+}
+
+bool UnfoldShortCircuitTraverser::visitBinary(Visit visit, TIntermBinary *node)
+{
+    if (mFoundShortCircuit)
+        return false;
+    // If our right node doesn't have side effects, we know we don't need to unfold this
+    // expression: there will be no short-circuiting side effects to avoid
+    // (note: unfolding doesn't depend on the left node -- it will always be evaluated)
+    if (!node-&gt;getRight()-&gt;hasSideEffects())
+    {
+        return true;
+    }
+
+    switch (node-&gt;getOp())
+    {
+      case EOpLogicalOr:
+        mFoundShortCircuit = true;
+        if (!copyLoopConditionOrExpression(getParentNode(), node))
+        {
+            // &quot;x || y&quot; is equivalent to &quot;x ? true : y&quot;, which unfolds to &quot;bool s; if(x) s = true;
+            // else s = y;&quot;,
+            // and then further simplifies down to &quot;bool s = x; if(!s) s = y;&quot;.
+
+            TIntermSequence insertions;
+            TType boolType(EbtBool, EbpUndefined, EvqTemporary);
+
+            ASSERT(node-&gt;getLeft()-&gt;getType() == boolType);
+            insertions.push_back(createTempInitDeclaration(node-&gt;getLeft()));
+
+            TIntermAggregate *assignRightBlock = new TIntermAggregate(EOpSequence);
+            ASSERT(node-&gt;getRight()-&gt;getType() == boolType);
+            assignRightBlock-&gt;getSequence()-&gt;push_back(createTempAssignment(node-&gt;getRight()));
+
+            TIntermUnary *notTempSymbol = new TIntermUnary(EOpLogicalNot, boolType);
+            notTempSymbol-&gt;setOperand(createTempSymbol(boolType));
+            TIntermSelection *ifNode = new TIntermSelection(notTempSymbol, assignRightBlock, nullptr);
+            insertions.push_back(ifNode);
+
+            insertStatementsInParentBlock(insertions);
+
+            NodeUpdateEntry replaceVariable(getParentNode(), node, createTempSymbol(boolType), false);
+            mReplacements.push_back(replaceVariable);
+        }
+        return false;
+      case EOpLogicalAnd:
+        mFoundShortCircuit = true;
+        if (!copyLoopConditionOrExpression(getParentNode(), node))
+        {
+            // &quot;x &amp;&amp; y&quot; is equivalent to &quot;x ? y : false&quot;, which unfolds to &quot;bool s; if(x) s = y;
+            // else s = false;&quot;,
+            // and then further simplifies down to &quot;bool s = x; if(s) s = y;&quot;.
+            TIntermSequence insertions;
+            TType boolType(EbtBool, EbpUndefined, EvqTemporary);
+
+            ASSERT(node-&gt;getLeft()-&gt;getType() == boolType);
+            insertions.push_back(createTempInitDeclaration(node-&gt;getLeft()));
+
+            TIntermAggregate *assignRightBlock = new TIntermAggregate(EOpSequence);
+            ASSERT(node-&gt;getRight()-&gt;getType() == boolType);
+            assignRightBlock-&gt;getSequence()-&gt;push_back(createTempAssignment(node-&gt;getRight()));
+
+            TIntermSelection *ifNode = new TIntermSelection(createTempSymbol(boolType), assignRightBlock, nullptr);
+            insertions.push_back(ifNode);
+
+            insertStatementsInParentBlock(insertions);
+
+            NodeUpdateEntry replaceVariable(getParentNode(), node, createTempSymbol(boolType), false);
+            mReplacements.push_back(replaceVariable);
+        }
+        return false;
+      default:
+        return true;
+    }
+}
+
+bool UnfoldShortCircuitTraverser::visitSelection(Visit visit, TIntermSelection *node)
+{
+    if (mFoundShortCircuit)
+        return false;
+
+    // Unfold &quot;b ? x : y&quot; into &quot;type s; if(b) s = x; else s = y;&quot;
+    if (visit == PreVisit &amp;&amp; node-&gt;usesTernaryOperator())
+    {
+        mFoundShortCircuit = true;
+        if (!copyLoopConditionOrExpression(getParentNode(), node))
+        {
+            TIntermSequence insertions;
+
+            TIntermSymbol *tempSymbol         = createTempSymbol(node-&gt;getType());
+            TIntermAggregate *tempDeclaration = new TIntermAggregate(EOpDeclaration);
+            tempDeclaration-&gt;getSequence()-&gt;push_back(tempSymbol);
+            insertions.push_back(tempDeclaration);
+
+            TIntermAggregate *trueBlock = new TIntermAggregate(EOpSequence);
+            TIntermBinary *trueAssignment =
+                createTempAssignment(node-&gt;getTrueBlock()-&gt;getAsTyped());
+            trueBlock-&gt;getSequence()-&gt;push_back(trueAssignment);
+
+            TIntermAggregate *falseBlock = new TIntermAggregate(EOpSequence);
+            TIntermBinary *falseAssignment =
+                createTempAssignment(node-&gt;getFalseBlock()-&gt;getAsTyped());
+            falseBlock-&gt;getSequence()-&gt;push_back(falseAssignment);
+
+            TIntermSelection *ifNode =
+                new TIntermSelection(node-&gt;getCondition()-&gt;getAsTyped(), trueBlock, falseBlock);
+            insertions.push_back(ifNode);
+
+            insertStatementsInParentBlock(insertions);
+
+            TIntermSymbol *ternaryResult = createTempSymbol(node-&gt;getType());
+            NodeUpdateEntry replaceVariable(getParentNode(), node, ternaryResult, false);
+            mReplacements.push_back(replaceVariable);
+        }
+        return false;
+    }
+
+    return true;
+}
+
+bool UnfoldShortCircuitTraverser::visitAggregate(Visit visit, TIntermAggregate *node)
+{
+    if (visit == PreVisit &amp;&amp; mFoundShortCircuit)
+        return false; // No need to traverse further
+
+    if (node-&gt;getOp() == EOpComma)
+    {
+        ASSERT(visit != PreVisit || !mFoundShortCircuit);
+
+        if (visit == PostVisit &amp;&amp; mFoundShortCircuit)
+        {
+            // We can be sure that we arrived here because there was a short-circuiting operator
+            // inside the sequence operator since we only start traversing the sequence operator in
+            // case a short-circuiting operator has not been found so far.
+            // We need to unfold the sequence (comma) operator, otherwise the evaluation order of
+            // statements would be messed up by unfolded operations inside.
+            // Don't do any other unfolding on this round of traversal.
+            mReplacements.clear();
+            mMultiReplacements.clear();
+            mInsertions.clear();
+
+            if (!copyLoopConditionOrExpression(getParentNode(), node))
+            {
+                TIntermSequence insertions;
+                TIntermSequence *seq = node-&gt;getSequence();
+
+                TIntermSequence::size_type i = 0;
+                ASSERT(!seq-&gt;empty());
+                while (i &lt; seq-&gt;size() - 1)
+                {
+                    TIntermTyped *child = (*seq)[i]-&gt;getAsTyped();
+                    insertions.push_back(child);
+                    ++i;
+                }
+
+                insertStatementsInParentBlock(insertions);
+
+                NodeUpdateEntry replaceVariable(getParentNode(), node, (*seq)[i], false);
+                mReplacements.push_back(replaceVariable);
+            }
+        }
+    }
+    return true;
+}
+
+bool UnfoldShortCircuitTraverser::visitLoop(Visit visit, TIntermLoop *node)
+{
+    if (visit == PreVisit)
+    {
+        if (mFoundShortCircuit)
+            return false;  // No need to traverse further
+
+        mLoopParent = getParentNode();
+        mParentLoop = node;
+        incrementDepth(node);
+
+        if (node-&gt;getInit())
+        {
+            node-&gt;getInit()-&gt;traverse(this);
+            if (mFoundShortCircuit)
+            {
+                decrementDepth();
+                return false;
+            }
+        }
+
+        if (node-&gt;getCondition())
+        {
+            mInLoopCondition = true;
+            node-&gt;getCondition()-&gt;traverse(this);
+            mInLoopCondition = false;
+
+            if (mFoundShortCircuit)
+            {
+                decrementDepth();
+                return false;
+            }
+        }
+
+        if (node-&gt;getExpression())
+        {
+            mInLoopExpression = true;
+            node-&gt;getExpression()-&gt;traverse(this);
+            mInLoopExpression = false;
+
+            if (mFoundShortCircuit)
+            {
+                decrementDepth();
+                return false;
+            }
+        }
+
+        if (node-&gt;getBody())
+            node-&gt;getBody()-&gt;traverse(this);
+
+        decrementDepth();
+    }
+    return false;
+}
+
+bool UnfoldShortCircuitTraverser::copyLoopConditionOrExpression(TIntermNode *parent,
+                                                                TIntermTyped *node)
+{
+    if (mInLoopCondition)
+    {
+        mReplacements.push_back(
+            NodeUpdateEntry(parent, node, createTempSymbol(node-&gt;getType()), false));
+        TIntermAggregate *body = mParentLoop-&gt;getBody();
+        TIntermSequence empty;
+        if (mParentLoop-&gt;getType() == ELoopDoWhile)
+        {
+            // Declare the temporary variable before the loop.
+            TIntermSequence insertionsBeforeLoop;
+            insertionsBeforeLoop.push_back(createTempDeclaration(node-&gt;getType()));
+            insertStatementsInParentBlock(insertionsBeforeLoop);
+
+            // Move a part of do-while loop condition to inside the loop.
+            TIntermSequence insertionsInLoop;
+            insertionsInLoop.push_back(createTempAssignment(node));
+            mInsertions.push_back(NodeInsertMultipleEntry(body, body-&gt;getSequence()-&gt;size() - 1,
+                                                          empty, insertionsInLoop));
+        }
+        else
+        {
+            // The loop initializer expression and one copy of the part of the loop condition are
+            // executed before the loop. They need to be in a new scope.
+            TIntermAggregate *loopScope = new TIntermAggregate(EOpSequence);
+
+            TIntermNode *initializer = mParentLoop-&gt;getInit();
+            if (initializer != nullptr)
+            {
+                // Move the initializer to the newly created outer scope, so that condition can
+                // depend on it.
+                mReplacements.push_back(NodeUpdateEntry(mParentLoop, initializer, nullptr, false));
+                loopScope-&gt;getSequence()-&gt;push_back(initializer);
+            }
+
+            loopScope-&gt;getSequence()-&gt;push_back(createTempInitDeclaration(node));
+            loopScope-&gt;getSequence()-&gt;push_back(mParentLoop);
+            mReplacements.push_back(NodeUpdateEntry(mLoopParent, mParentLoop, loopScope, true));
+
+            // The second copy of the part of the loop condition is executed inside the loop.
+            TIntermSequence insertionsInLoop;
+            insertionsInLoop.push_back(createTempAssignment(node-&gt;deepCopy()));
+            mInsertions.push_back(NodeInsertMultipleEntry(body, body-&gt;getSequence()-&gt;size() - 1,
+                                                          empty, insertionsInLoop));
+        }
+        return true;
+    }
+
+    if (mInLoopExpression)
+    {
+        TIntermTyped *movedExpression = mParentLoop-&gt;getExpression();
+        mReplacements.push_back(NodeUpdateEntry(mParentLoop, movedExpression, nullptr, false));
+        TIntermAggregate *body = mParentLoop-&gt;getBody();
+        TIntermSequence empty;
+        TIntermSequence insertions;
+        insertions.push_back(movedExpression);
+        mInsertions.push_back(
+            NodeInsertMultipleEntry(body, body-&gt;getSequence()-&gt;size() - 1, empty, insertions));
+        return true;
+    }
+    return false;
+}
+
+void UnfoldShortCircuitTraverser::nextIteration()
+{
+    mFoundShortCircuit = false;
+    nextTemporaryIndex();
+}
+
+} // namespace
+
+void UnfoldShortCircuitToIf(TIntermNode *root, unsigned int *temporaryIndex)
+{
+    UnfoldShortCircuitTraverser traverser;
+    ASSERT(temporaryIndex != nullptr);
+    traverser.useTemporaryIndex(temporaryIndex);
+    // Unfold one operator at a time, and reset the traverser between iterations.
+    do
+    {
+        traverser.nextIteration();
+        root-&gt;traverse(&amp;traverser);
+        if (traverser.foundShortCircuit())
+            traverser.updateTree();
+    }
+    while (traverser.foundShortCircuit());
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorUnfoldShortCircuitToIfh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UnfoldShortCircuitToIf.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,18 @@
</span><ins>+//
+// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// UnfoldShortCircuitToIf is an AST traverser to convert short-circuiting operators to if-else statements.
+// The results are assigned to s# temporaries, which are used by the main translator instead of
+// the original expression.
+//
+
+#ifndef COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUIT_H_
+#define COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUIT_H_
+
+class TIntermNode;
+
+void UnfoldShortCircuitToIf(TIntermNode *root, unsigned int *temporaryIndex);
+
+#endif   // COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUIT_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorUniformHLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -89,11 +89,12 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    UNREACHABLE();
-    return NULL;
</del><ins>+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int UniformHLSL::declareUniformAndAssignRegister(const TType &amp;type, const TString &amp;name)
</del><ins>+unsigned int UniformHLSL::assignUniformRegister(const TType &amp;type,
+                                                const TString &amp;name,
+                                                unsigned int *outRegisterCount)
</ins><span class="cx"> {
</span><span class="cx">     unsigned int registerIndex = (IsSampler(type.getBasicType()) ? mSamplerRegister : mUniformRegister);
</span><span class="cx"> 
</span><span class="lines">@@ -112,50 +113,242 @@
</span><span class="cx">     {
</span><span class="cx">         mUniformRegister += registerCount;
</span><span class="cx">     }
</span><ins>+    if (outRegisterCount)
+    {
+        *outRegisterCount = registerCount;
+    }
+    return registerIndex;
+}
</ins><span class="cx"> 
</span><ins>+unsigned int UniformHLSL::assignSamplerInStructUniformRegister(const TType &amp;type,
+                                                               const TString &amp;name,
+                                                               unsigned int *outRegisterCount)
+{
+    // Sampler that is a field of a uniform structure.
+    ASSERT(IsSampler(type.getBasicType()));
+    unsigned int registerIndex = mSamplerRegister;
+    mUniformRegisterMap[std::string(name.c_str())] = registerIndex;
+    unsigned int registerCount = type.isArray() ? type.getArraySize() : 1;
+    mSamplerRegister += registerCount;
+    if (outRegisterCount)
+    {
+        *outRegisterCount = registerCount;
+    }
</ins><span class="cx">     return registerIndex;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TString UniformHLSL::uniformsHeader(ShShaderOutput outputType, const ReferencedSymbols &amp;referencedUniforms)
</del><ins>+void UniformHLSL::outputHLSLSamplerUniformGroup(
+    TInfoSinkBase &amp;out,
+    const HLSLTextureSamplerGroup textureGroup,
+    const TVector&lt;const TIntermSymbol *&gt; &amp;group,
+    const TMap&lt;const TIntermSymbol *, TString&gt; &amp;samplerInStructSymbolsToAPINames,
+    unsigned int *groupTextureRegisterIndex)
</ins><span class="cx"> {
</span><del>-    TString uniforms;
</del><ins>+    if (group.empty())
+    {
+        return;
+    }
+    unsigned int groupRegisterCount = 0;
+    for (const TIntermSymbol *uniform : group)
+    {
+        const TType &amp;type   = uniform-&gt;getType();
+        const TString &amp;name = uniform-&gt;getSymbol();
+        unsigned int registerCount;
</ins><span class="cx"> 
</span><del>-    for (ReferencedSymbols::const_iterator uniformIt = referencedUniforms.begin();
-         uniformIt != referencedUniforms.end(); uniformIt++)
</del><ins>+        // The uniform might be just a regular sampler or one extracted from a struct.
+        unsigned int samplerArrayIndex = 0u;
+        const Uniform *uniformByName = findUniformByName(name);
+        if (uniformByName)
+        {
+            samplerArrayIndex = assignUniformRegister(type, name, &amp;registerCount);
+        }
+        else
+        {
+            ASSERT(samplerInStructSymbolsToAPINames.find(uniform) !=
+                   samplerInStructSymbolsToAPINames.end());
+            samplerArrayIndex = assignSamplerInStructUniformRegister(
+                type, samplerInStructSymbolsToAPINames.at(uniform), &amp;registerCount);
+        }
+        groupRegisterCount += registerCount;
+
+        if (type.isArray())
+        {
+            out &lt;&lt; &quot;static const uint &quot; &lt;&lt; DecorateIfNeeded(uniform-&gt;getName()) &lt;&lt; ArrayString(type)
+                &lt;&lt; &quot; = {&quot;;
+            for (int i = 0; i &lt; type.getArraySize(); ++i)
+            {
+                if (i &gt; 0)
+                    out &lt;&lt; &quot;, &quot;;
+                out &lt;&lt; (samplerArrayIndex + i);
+            }
+            out &lt;&lt; &quot;};\n&quot;;
+        }
+        else
+        {
+            out &lt;&lt; &quot;static const uint &quot; &lt;&lt; DecorateIfNeeded(uniform-&gt;getName()) &lt;&lt; &quot; = &quot;
+                &lt;&lt; samplerArrayIndex &lt;&lt; &quot;;\n&quot;;
+        }
+    }
+    TString suffix = TextureGroupSuffix(textureGroup);
+    // Since HLSL_TEXTURE_2D is the first group, it has a fixed offset of zero.
+    if (textureGroup != HLSL_TEXTURE_2D)
</ins><span class="cx">     {
</span><del>-        const TIntermSymbol &amp;uniform = *uniformIt-&gt;second;
-        const TType &amp;type = uniform.getType();
-        const TString &amp;name = uniform.getSymbol();
</del><ins>+        out &lt;&lt; &quot;static const uint textureIndexOffset&quot; &lt;&lt; suffix &lt;&lt; &quot; = &quot;
+            &lt;&lt; (*groupTextureRegisterIndex) &lt;&lt; &quot;;\n&quot;;
+        out &lt;&lt; &quot;static const uint samplerIndexOffset&quot; &lt;&lt; suffix &lt;&lt; &quot; = &quot;
+            &lt;&lt; (*groupTextureRegisterIndex) &lt;&lt; &quot;;\n&quot;;
+    }
+    out &lt;&lt; &quot;uniform &quot; &lt;&lt; TextureString(textureGroup) &lt;&lt; &quot; textures&quot; &lt;&lt; suffix &lt;&lt; &quot;[&quot;
+        &lt;&lt; groupRegisterCount &lt;&lt; &quot;]&quot;
+        &lt;&lt; &quot; : register(t&quot; &lt;&lt; (*groupTextureRegisterIndex) &lt;&lt; &quot;);\n&quot;;
+    out &lt;&lt; &quot;uniform &quot; &lt;&lt; SamplerString(textureGroup) &lt;&lt; &quot; samplers&quot; &lt;&lt; suffix &lt;&lt; &quot;[&quot;
+        &lt;&lt; groupRegisterCount &lt;&lt; &quot;]&quot;
+        &lt;&lt; &quot; : register(s&quot; &lt;&lt; (*groupTextureRegisterIndex) &lt;&lt; &quot;);\n&quot;;
+    *groupTextureRegisterIndex += groupRegisterCount;
+}
</ins><span class="cx"> 
</span><del>-        unsigned int registerIndex = declareUniformAndAssignRegister(type, name);
</del><ins>+void UniformHLSL::outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &amp;out,
+                                             const TType &amp;type,
+                                             const TName &amp;name,
+                                             const unsigned int registerIndex)
+{
+    out &lt;&lt; &quot;uniform &quot; &lt;&lt; SamplerString(type.getBasicType()) &lt;&lt; &quot; sampler_&quot;
+        &lt;&lt; DecorateUniform(name, type) &lt;&lt; ArrayString(type) &lt;&lt; &quot; : register(s&quot; &lt;&lt; str(registerIndex)
+        &lt;&lt; &quot;);\n&quot;;
+    out &lt;&lt; &quot;uniform &quot; &lt;&lt; TextureString(type.getBasicType()) &lt;&lt; &quot; texture_&quot;
+        &lt;&lt; DecorateUniform(name, type) &lt;&lt; ArrayString(type) &lt;&lt; &quot; : register(t&quot; &lt;&lt; str(registerIndex)
+        &lt;&lt; &quot;);\n&quot;;
+}
</ins><span class="cx"> 
</span><del>-        if (outputType == SH_HLSL11_OUTPUT &amp;&amp; IsSampler(type.getBasicType()))   // Also declare the texture
</del><ins>+void UniformHLSL::outputUniform(TInfoSinkBase &amp;out,
+                                const TType &amp;type,
+                                const TName &amp;name,
+                                const unsigned int registerIndex)
+{
+    const TStructure *structure = type.getStruct();
+    // If this is a nameless struct, we need to use its full definition, rather than its (empty)
+    // name.
+    // TypeString() will invoke defineNameless in this case; qualifier prefixes are unnecessary for
+    // nameless structs in ES, as nameless structs cannot be used anywhere that layout qualifiers
+    // are permitted.
+    const TString &amp;typeName = ((structure &amp;&amp; !structure-&gt;name().empty())
+                                   ? QualifiedStructNameString(*structure, false, false)
+                                   : TypeString(type));
+
+    const TString &amp;registerString =
+        TString(&quot;register(&quot;) + UniformRegisterPrefix(type) + str(registerIndex) + &quot;)&quot;;
+
+    out &lt;&lt; &quot;uniform &quot; &lt;&lt; typeName &lt;&lt; &quot; &quot;;
+
+    out &lt;&lt; DecorateUniform(name, type);
+
+    out &lt;&lt; ArrayString(type) &lt;&lt; &quot; : &quot; &lt;&lt; registerString &lt;&lt; &quot;;\n&quot;;
+}
+
+void UniformHLSL::uniformsHeader(TInfoSinkBase &amp;out,
+                                 ShShaderOutput outputType,
+                                 const ReferencedSymbols &amp;referencedUniforms)
+{
+    if (!referencedUniforms.empty())
+    {
+        out &lt;&lt; &quot;// Uniforms\n\n&quot;;
+    }
+    // In the case of HLSL 4, sampler uniforms need to be grouped by type before the code is
+    // written. They are grouped based on the combination of the HLSL texture type and
+    // HLSL sampler type, enumerated in HLSLTextureSamplerGroup.
+    TVector&lt;TVector&lt;const TIntermSymbol *&gt;&gt; groupedSamplerUniforms(HLSL_TEXTURE_MAX + 1);
+    TMap&lt;const TIntermSymbol *, TString&gt; samplerInStructSymbolsToAPINames;
+    for (auto &amp;uniformIt : referencedUniforms)
+    {
+        // Output regular uniforms. Group sampler uniforms by type.
+        const TIntermSymbol &amp;uniform = *uniformIt.second;
+        const TType &amp;type            = uniform.getType();
+        const TName &amp;name            = uniform.getName();
+
+        if (outputType == SH_HLSL_4_1_OUTPUT &amp;&amp; IsSampler(type.getBasicType()))
</ins><span class="cx">         {
</span><del>-            uniforms += &quot;uniform &quot; + SamplerString(type) + &quot; sampler_&quot; + DecorateUniform(name, type) + ArrayString(type) +
-                        &quot; : register(s&quot; + str(registerIndex) + &quot;);\n&quot;;
-
-            uniforms += &quot;uniform &quot; + TextureString(type) + &quot; texture_&quot; + DecorateUniform(name, type) + ArrayString(type) +
-                        &quot; : register(t&quot; + str(registerIndex) + &quot;);\n&quot;;
</del><ins>+            HLSLTextureSamplerGroup group = TextureGroup(type.getBasicType());
+            groupedSamplerUniforms[group].push_back(&amp;uniform);
</ins><span class="cx">         }
</span><ins>+        else if (outputType == SH_HLSL_4_0_FL9_3_OUTPUT &amp;&amp; IsSampler(type.getBasicType()))
+        {
+            unsigned int registerIndex = assignUniformRegister(type, name.getString(), nullptr);
+            outputHLSL4_0_FL9_3Sampler(out, type, name, registerIndex);
+        }
</ins><span class="cx">         else
</span><span class="cx">         {
</span><del>-            const TStructure *structure = type.getStruct();
-            // If this is a nameless struct, we need to use its full definition, rather than its (empty) name.
-            // TypeString() will invoke defineNameless in this case; qualifier prefixes are unnecessary for 
-            // nameless structs in ES, as nameless structs cannot be used anywhere that layout qualifiers are
-            // permitted.
-            const TString &amp;typeName = ((structure &amp;&amp; !structure-&gt;name().empty()) ?
-                                        QualifiedStructNameString(*structure, false, false) : TypeString(type));
</del><ins>+            if (type.isStructureContainingSamplers())
+            {
+                TVector&lt;TIntermSymbol *&gt; samplerSymbols;
+                TMap&lt;TIntermSymbol *, TString&gt; symbolsToAPINames;
+                int arrayOfStructsSize = type.isArray() ? type.getArraySize() : 0;
+                type.createSamplerSymbols(&quot;angle_&quot; + name.getString(), name.getString(),
+                                          arrayOfStructsSize, &amp;samplerSymbols, &amp;symbolsToAPINames);
+                for (TIntermSymbol *sampler : samplerSymbols)
+                {
+                    const TType &amp;samplerType = sampler-&gt;getType();
</ins><span class="cx"> 
</span><del>-            const TString &amp;registerString = TString(&quot;register(&quot;) + UniformRegisterPrefix(type) + str(registerIndex) + &quot;)&quot;;
</del><ins>+                    // Will use angle_ prefix instead of regular prefix.
+                    sampler-&gt;setInternal(true);
+                    const TName &amp;samplerName = sampler-&gt;getName();
</ins><span class="cx"> 
</span><del>-            uniforms += &quot;uniform &quot; + typeName + &quot; &quot; + DecorateUniform(name, type) + ArrayString(type) + &quot; : &quot; + registerString + &quot;;\n&quot;;
</del><ins>+                    if (outputType == SH_HLSL_4_1_OUTPUT)
+                    {
+                        HLSLTextureSamplerGroup group = TextureGroup(samplerType.getBasicType());
+                        groupedSamplerUniforms[group].push_back(sampler);
+                        samplerInStructSymbolsToAPINames[sampler] = symbolsToAPINames[sampler];
+                    }
+                    else if (outputType == SH_HLSL_4_0_FL9_3_OUTPUT)
+                    {
+                        unsigned int registerIndex = assignSamplerInStructUniformRegister(
+                            samplerType, symbolsToAPINames[sampler], nullptr);
+                        outputHLSL4_0_FL9_3Sampler(out, samplerType, samplerName, registerIndex);
+                    }
+                    else
+                    {
+                        ASSERT(outputType == SH_HLSL_3_0_OUTPUT);
+                        unsigned int registerIndex = assignSamplerInStructUniformRegister(
+                            samplerType, symbolsToAPINames[sampler], nullptr);
+                        outputUniform(out, samplerType, samplerName, registerIndex);
+                    }
+                }
+            }
+            unsigned int registerIndex = assignUniformRegister(type, name.getString(), nullptr);
+            outputUniform(out, type, name, registerIndex);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return (uniforms.empty() ? &quot;&quot; : (&quot;// Uniforms\n\n&quot; + uniforms));
</del><ins>+    if (outputType == SH_HLSL_4_1_OUTPUT)
+    {
+        unsigned int groupTextureRegisterIndex = 0;
+        // TEXTURE_2D is special, index offset is assumed to be 0 and omitted in that case.
+        ASSERT(HLSL_TEXTURE_MIN == HLSL_TEXTURE_2D);
+        for (int groupId = HLSL_TEXTURE_MIN; groupId &lt; HLSL_TEXTURE_MAX; ++groupId)
+        {
+            outputHLSLSamplerUniformGroup(
+                out, HLSLTextureSamplerGroup(groupId), groupedSamplerUniforms[groupId],
+                samplerInStructSymbolsToAPINames, &amp;groupTextureRegisterIndex);
+        }
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UniformHLSL::samplerMetadataUniforms(TInfoSinkBase &amp;out, const char *reg)
+{
+    // If mSamplerRegister is 0 the shader doesn't use any textures.
+    if (mSamplerRegister &gt; 0)
+    {
+        out &lt;&lt; &quot;    struct SamplerMetadata\n&quot;
+               &quot;    {\n&quot;
+               &quot;        int baseLevel;\n&quot;
+               &quot;        int internalFormatBits;\n&quot;
+               &quot;        int wrapModes;\n&quot;
+               &quot;        int padding;\n&quot;
+               &quot;    };\n&quot;
+               &quot;    SamplerMetadata samplerMetadata[&quot;
+            &lt;&lt; mSamplerRegister &lt;&lt; &quot;] : packoffset(&quot; &lt;&lt; reg &lt;&lt; &quot;);\n&quot;;
+    }
+}
+
</ins><span class="cx"> TString UniformHLSL::interfaceBlocksHeader(const ReferencedSymbols &amp;referencedInterfaceBlocks)
</span><span class="cx"> {
</span><span class="cx">     TString interfaceBlocks;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorUniformHLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UniformHLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,6 +11,7 @@
</span><span class="cx"> #define COMPILER_TRANSLATOR_UNIFORMHLSL_H_
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/OutputHLSL.h&quot;
</span><ins>+#include &quot;compiler/translator/UtilsHLSL.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace sh
</span><span class="cx"> {
</span><span class="lines">@@ -23,7 +24,13 @@
</span><span class="cx"> 
</span><span class="cx">     void reserveUniformRegisters(unsigned int registerCount);
</span><span class="cx">     void reserveInterfaceBlockRegisters(unsigned int registerCount);
</span><del>-    TString uniformsHeader(ShShaderOutput outputType, const ReferencedSymbols &amp;referencedUniforms);
</del><ins>+    void uniformsHeader(TInfoSinkBase &amp;out,
+                        ShShaderOutput outputType,
+                        const ReferencedSymbols &amp;referencedUniforms);
+
+    // Must be called after uniformsHeader
+    void samplerMetadataUniforms(TInfoSinkBase &amp;out, const char *reg);
+
</ins><span class="cx">     TString interfaceBlocksHeader(const ReferencedSymbols &amp;referencedInterfaceBlocks);
</span><span class="cx"> 
</span><span class="cx">     // Used for direct index references
</span><span class="lines">@@ -44,9 +51,31 @@
</span><span class="cx">     TString interfaceBlockStructString(const TInterfaceBlock &amp;interfaceBlock);
</span><span class="cx">     const Uniform *findUniformByName(const TString &amp;name) const;
</span><span class="cx"> 
</span><ins>+    void outputHLSL4_0_FL9_3Sampler(TInfoSinkBase &amp;out,
+                                    const TType &amp;type,
+                                    const TName &amp;name,
+                                    const unsigned int registerIndex);
+
+    void outputUniform(TInfoSinkBase &amp;out,
+                       const TType &amp;type,
+                       const TName &amp;name,
+                       const unsigned int registerIndex);
+
</ins><span class="cx">     // Returns the uniform's register index
</span><del>-    unsigned int declareUniformAndAssignRegister(const TType &amp;type, const TString &amp;name);
</del><ins>+    unsigned int assignUniformRegister(const TType &amp;type,
+                                       const TString &amp;name,
+                                       unsigned int *outRegisterCount);
+    unsigned int assignSamplerInStructUniformRegister(const TType &amp;type,
+                                                      const TString &amp;name,
+                                                      unsigned int *outRegisterCount);
</ins><span class="cx"> 
</span><ins>+    void outputHLSLSamplerUniformGroup(
+        TInfoSinkBase &amp;out,
+        const HLSLTextureSamplerGroup textureGroup,
+        const TVector&lt;const TIntermSymbol *&gt; &amp;group,
+        const TMap&lt;const TIntermSymbol *, TString&gt; &amp;samplerInStructSymbolsToAPINames,
+        unsigned int *groupTextureRegisterIndex);
+
</ins><span class="cx">     unsigned int mUniformRegister;
</span><span class="cx">     unsigned int mInterfaceBlockRegister;
</span><span class="cx">     unsigned int mSamplerRegister;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorUtilsHLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,15 +8,16 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/UtilsHLSL.h&quot;
</span><ins>+#include &quot;compiler/translator/IntermNode.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/StructureHLSL.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace sh
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-TString SamplerString(const TType &amp;type)
</del><ins>+TString SamplerString(const TBasicType type)
</ins><span class="cx"> {
</span><del>-    if (IsShadowSampler(type.getBasicType()))
</del><ins>+    if (IsShadowSampler(type))
</ins><span class="cx">     {
</span><span class="cx">         return &quot;SamplerComparisonState&quot;;
</span><span class="cx">     }
</span><span class="lines">@@ -26,40 +27,166 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TString TextureString(const TType &amp;type)
</del><ins>+TString SamplerString(HLSLTextureSamplerGroup type)
</ins><span class="cx"> {
</span><del>-    switch (type.getBasicType())
</del><ins>+    if (type &gt;= HLSL_COMPARISON_SAMPLER_GROUP_BEGIN &amp;&amp; type &lt;= HLSL_COMPARISON_SAMPLER_GROUP_END)
</ins><span class="cx">     {
</span><del>-      case EbtSampler2D:            return &quot;Texture2D&quot;;
-      case EbtSamplerCube:          return &quot;TextureCube&quot;;
-      case EbtSamplerExternalOES:   return &quot;Texture2D&quot;;
-      case EbtSampler2DArray:       return &quot;Texture2DArray&quot;;
-      case EbtSampler3D:            return &quot;Texture3D&quot;;
-      case EbtISampler2D:           return &quot;Texture2D&lt;int4&gt;&quot;;
-      case EbtISampler3D:           return &quot;Texture3D&lt;int4&gt;&quot;;
-      case EbtISamplerCube:         return &quot;Texture2DArray&lt;int4&gt;&quot;;
-      case EbtISampler2DArray:      return &quot;Texture2DArray&lt;int4&gt;&quot;;
-      case EbtUSampler2D:           return &quot;Texture2D&lt;uint4&gt;&quot;;
-      case EbtUSampler3D:           return &quot;Texture3D&lt;uint4&gt;&quot;;
-      case EbtUSamplerCube:         return &quot;Texture2DArray&lt;uint4&gt;&quot;;
-      case EbtUSampler2DArray:      return &quot;Texture2DArray&lt;uint4&gt;&quot;;
-      case EbtSampler2DShadow:      return &quot;Texture2D&quot;;
-      case EbtSamplerCubeShadow:    return &quot;TextureCube&quot;;
-      case EbtSampler2DArrayShadow: return &quot;Texture2DArray&quot;;
-      default: UNREACHABLE();
</del><ins>+        return &quot;SamplerComparisonState&quot;;
</ins><span class="cx">     }
</span><ins>+    else
+    {
+        return &quot;SamplerState&quot;;
+    }
+}
</ins><span class="cx"> 
</span><ins>+HLSLTextureSamplerGroup TextureGroup(const TBasicType type)
+{
+    switch (type)
+    {
+        case EbtSampler2D:
+            return HLSL_TEXTURE_2D;
+        case EbtSamplerCube:
+            return HLSL_TEXTURE_CUBE;
+        case EbtSamplerExternalOES:
+            return HLSL_TEXTURE_2D;
+        case EbtSampler2DArray:
+            return HLSL_TEXTURE_2D_ARRAY;
+        case EbtSampler3D:
+            return HLSL_TEXTURE_3D;
+        case EbtISampler2D:
+            return HLSL_TEXTURE_2D_INT4;
+        case EbtISampler3D:
+            return HLSL_TEXTURE_3D_INT4;
+        case EbtISamplerCube:
+            return HLSL_TEXTURE_2D_ARRAY_INT4;
+        case EbtISampler2DArray:
+            return HLSL_TEXTURE_2D_ARRAY_INT4;
+        case EbtUSampler2D:
+            return HLSL_TEXTURE_2D_UINT4;
+        case EbtUSampler3D:
+            return HLSL_TEXTURE_3D_UINT4;
+        case EbtUSamplerCube:
+            return HLSL_TEXTURE_2D_ARRAY_UINT4;
+        case EbtUSampler2DArray:
+            return HLSL_TEXTURE_2D_ARRAY_UINT4;
+        case EbtSampler2DShadow:
+            return HLSL_TEXTURE_2D_COMPARISON;
+        case EbtSamplerCubeShadow:
+            return HLSL_TEXTURE_CUBE_COMPARISON;
+        case EbtSampler2DArrayShadow:
+            return HLSL_TEXTURE_2D_ARRAY_COMPARISON;
+        default:
+            UNREACHABLE();
+    }
+    return HLSL_TEXTURE_UNKNOWN;
+}
+
+TString TextureString(const HLSLTextureSamplerGroup type)
+{
+    switch (type)
+    {
+        case HLSL_TEXTURE_2D:
+            return &quot;Texture2D&quot;;
+        case HLSL_TEXTURE_CUBE:
+            return &quot;TextureCube&quot;;
+        case HLSL_TEXTURE_2D_ARRAY:
+            return &quot;Texture2DArray&quot;;
+        case HLSL_TEXTURE_3D:
+            return &quot;Texture3D&quot;;
+        case HLSL_TEXTURE_2D_INT4:
+            return &quot;Texture2D&lt;int4&gt;&quot;;
+        case HLSL_TEXTURE_3D_INT4:
+            return &quot;Texture3D&lt;int4&gt;&quot;;
+        case HLSL_TEXTURE_2D_ARRAY_INT4:
+            return &quot;Texture2DArray&lt;int4&gt;&quot;;
+        case HLSL_TEXTURE_2D_UINT4:
+            return &quot;Texture2D&lt;uint4&gt;&quot;;
+        case HLSL_TEXTURE_3D_UINT4:
+            return &quot;Texture3D&lt;uint4&gt;&quot;;
+        case HLSL_TEXTURE_2D_ARRAY_UINT4:
+            return &quot;Texture2DArray&lt;uint4&gt;&quot;;
+        case HLSL_TEXTURE_2D_COMPARISON:
+            return &quot;Texture2D&quot;;
+        case HLSL_TEXTURE_CUBE_COMPARISON:
+            return &quot;TextureCube&quot;;
+        case HLSL_TEXTURE_2D_ARRAY_COMPARISON:
+            return &quot;Texture2DArray&quot;;
+        default:
+            UNREACHABLE();
+    }
+
</ins><span class="cx">     return &quot;&lt;unknown texture type&gt;&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TString DecorateUniform(const TString &amp;string, const TType &amp;type)
</del><ins>+TString TextureString(const TBasicType type)
</ins><span class="cx"> {
</span><ins>+    return TextureString(TextureGroup(type));
+}
+
+TString TextureGroupSuffix(const HLSLTextureSamplerGroup type)
+{
+    switch (type)
+    {
+        case HLSL_TEXTURE_2D:
+            return &quot;2D&quot;;
+        case HLSL_TEXTURE_CUBE:
+            return &quot;Cube&quot;;
+        case HLSL_TEXTURE_2D_ARRAY:
+            return &quot;2DArray&quot;;
+        case HLSL_TEXTURE_3D:
+            return &quot;3D&quot;;
+        case HLSL_TEXTURE_2D_INT4:
+            return &quot;2D_int4_&quot;;
+        case HLSL_TEXTURE_3D_INT4:
+            return &quot;3D_int4_&quot;;
+        case HLSL_TEXTURE_2D_ARRAY_INT4:
+            return &quot;2DArray_int4_&quot;;
+        case HLSL_TEXTURE_2D_UINT4:
+            return &quot;2D_uint4_&quot;;
+        case HLSL_TEXTURE_3D_UINT4:
+            return &quot;3D_uint4_&quot;;
+        case HLSL_TEXTURE_2D_ARRAY_UINT4:
+            return &quot;2DArray_uint4_&quot;;
+        case HLSL_TEXTURE_2D_COMPARISON:
+            return &quot;2D_comparison&quot;;
+        case HLSL_TEXTURE_CUBE_COMPARISON:
+            return &quot;Cube_comparison&quot;;
+        case HLSL_TEXTURE_2D_ARRAY_COMPARISON:
+            return &quot;2DArray_comparison&quot;;
+        default:
+            UNREACHABLE();
+    }
+
+    return &quot;&lt;unknown texture type&gt;&quot;;
+}
+
+TString TextureGroupSuffix(const TBasicType type)
+{
+    return TextureGroupSuffix(TextureGroup(type));
+}
+
+TString TextureTypeSuffix(const TBasicType type)
+{
+    switch (type)
+    {
+        case EbtISamplerCube:
+            return &quot;Cube_int4_&quot;;
+        case EbtUSamplerCube:
+            return &quot;Cube_uint4_&quot;;
+        default:
+            // All other types are identified by their group suffix
+            return TextureGroupSuffix(type);
+    }
+}
+
+TString DecorateUniform(const TName &amp;name, const TType &amp;type)
+{
</ins><span class="cx">     if (type.getBasicType() == EbtSamplerExternalOES)
</span><span class="cx">     {
</span><del>-        return &quot;ex_&quot; + string;
</del><ins>+        return &quot;ex_&quot; + name.getString();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return Decorate(string);
</del><ins>+    return DecorateIfNeeded(name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TString DecorateField(const TString &amp;string, const TStructure &amp;structure)
</span><span class="lines">@@ -87,6 +214,30 @@
</span><span class="cx">     return string;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TString DecorateIfNeeded(const TName &amp;name)
+{
+    if (name.isInternal())
+    {
+        return name.getString();
+    }
+    else
+    {
+        return Decorate(name.getString());
+    }
+}
+
+TString DecorateFunctionIfNeeded(const TName &amp;name)
+{
+    if (name.isInternal())
+    {
+        return TFunction::unmangleName(name.getString());
+    }
+    else
+    {
+        return Decorate(TFunction::unmangleName(name.getString()));
+    }
+}
+
</ins><span class="cx"> TString TypeString(const TType &amp;type)
</span><span class="cx"> {
</span><span class="cx">     const TStructure* structure = type.getStruct();
</span><span class="lines">@@ -217,13 +368,11 @@
</span><span class="cx">     {
</span><span class="cx">       case EvqVaryingIn:           return &quot;&quot;;
</span><span class="cx">       case EvqFragmentIn:          return &quot;&quot;;
</span><del>-      case EvqInvariantVaryingIn:  return &quot;&quot;;
</del><span class="cx">       case EvqSmoothIn:            return &quot;linear&quot;;
</span><span class="cx">       case EvqFlatIn:              return &quot;nointerpolation&quot;;
</span><span class="cx">       case EvqCentroidIn:          return &quot;centroid&quot;;
</span><span class="cx">       case EvqVaryingOut:          return &quot;&quot;;
</span><span class="cx">       case EvqVertexOut:           return &quot;&quot;;
</span><del>-      case EvqInvariantVaryingOut: return &quot;&quot;;
</del><span class="cx">       case EvqSmoothOut:           return &quot;linear&quot;;
</span><span class="cx">       case EvqFlatOut:             return &quot;nointerpolation&quot;;
</span><span class="cx">       case EvqCentroidOut:         return &quot;centroid&quot;;
</span><span class="lines">@@ -247,4 +396,62 @@
</span><span class="cx">     return &quot;&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+int HLSLTextureCoordsCount(const TBasicType samplerType)
+{
+    switch (samplerType)
+    {
+        case EbtSampler2D:
+            return 2;
+        case EbtSampler3D:
+            return 3;
+        case EbtSamplerCube:
+            return 3;
+        case EbtSampler2DArray:
+            return 3;
+        case EbtISampler2D:
+            return 2;
+        case EbtISampler3D:
+            return 3;
+        case EbtISamplerCube:
+            return 3;
+        case EbtISampler2DArray:
+            return 3;
+        case EbtUSampler2D:
+            return 2;
+        case EbtUSampler3D:
+            return 3;
+        case EbtUSamplerCube:
+            return 3;
+        case EbtUSampler2DArray:
+            return 3;
+        case EbtSampler2DShadow:
+            return 2;
+        case EbtSamplerCubeShadow:
+            return 3;
+        case EbtSampler2DArrayShadow:
+            return 3;
+        default:
+            UNREACHABLE();
+    }
+    return 0;
</ins><span class="cx"> }
</span><ins>+
+TString DisambiguateFunctionName(const TIntermSequence *parameters)
+{
+    TString disambiguatingString;
+    for (auto parameter : *parameters)
+    {
+        const TType &amp;paramType = parameter-&gt;getAsTyped()-&gt;getType();
+        // Disambiguation is needed for float2x2 and float4 parameters. These are the only parameter
+        // types that HLSL thinks are identical. float2x3 and float3x2 are different types, for
+        // example. Other parameter types are not added to function names to avoid making function
+        // names longer.
+        if (paramType.getObjectSize() == 4 &amp;&amp; paramType.getBasicType() == EbtFloat)
+        {
+            disambiguatingString += &quot;_&quot; + TypeString(paramType);
+        }
+    }
+    return disambiguatingString;
+}
+
+}  // namespace sh
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorUtilsHLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,18 +11,60 @@
</span><span class="cx"> #define COMPILER_TRANSLATOR_UTILSHLSL_H_
</span><span class="cx"> 
</span><span class="cx"> #include &lt;vector&gt;
</span><ins>+#include &quot;compiler/translator/IntermNode.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/Types.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> 
</span><ins>+class TName;
+
</ins><span class="cx"> namespace sh
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-TString TextureString(const TType &amp;type);
-TString SamplerString(const TType &amp;type);
</del><ins>+// Unique combinations of HLSL Texture type and HLSL Sampler type.
+enum HLSLTextureSamplerGroup
+{
+    // Regular samplers
+    HLSL_TEXTURE_2D,
+    HLSL_TEXTURE_MIN = HLSL_TEXTURE_2D,
+
+    HLSL_TEXTURE_CUBE,
+    HLSL_TEXTURE_2D_ARRAY,
+    HLSL_TEXTURE_3D,
+    HLSL_TEXTURE_2D_INT4,
+    HLSL_TEXTURE_3D_INT4,
+    HLSL_TEXTURE_2D_ARRAY_INT4,
+    HLSL_TEXTURE_2D_UINT4,
+    HLSL_TEXTURE_3D_UINT4,
+    HLSL_TEXTURE_2D_ARRAY_UINT4,
+
+    // Comparison samplers
+
+    HLSL_TEXTURE_2D_COMPARISON,
+    HLSL_TEXTURE_CUBE_COMPARISON,
+    HLSL_TEXTURE_2D_ARRAY_COMPARISON,
+
+    HLSL_COMPARISON_SAMPLER_GROUP_BEGIN = HLSL_TEXTURE_2D_COMPARISON,
+    HLSL_COMPARISON_SAMPLER_GROUP_END   = HLSL_TEXTURE_2D_ARRAY_COMPARISON,
+
+    HLSL_TEXTURE_UNKNOWN,
+    HLSL_TEXTURE_MAX = HLSL_TEXTURE_UNKNOWN
+};
+
+HLSLTextureSamplerGroup TextureGroup(const TBasicType type);
+TString TextureString(const HLSLTextureSamplerGroup type);
+TString TextureString(const TBasicType type);
+TString TextureGroupSuffix(const HLSLTextureSamplerGroup type);
+TString TextureGroupSuffix(const TBasicType type);
+TString TextureTypeSuffix(const TBasicType type);
+TString SamplerString(const TBasicType type);
+TString SamplerString(HLSLTextureSamplerGroup type);
</ins><span class="cx"> // Prepends an underscore to avoid naming clashes
</span><span class="cx"> TString Decorate(const TString &amp;string);
</span><del>-TString DecorateUniform(const TString &amp;string, const TType &amp;type);
</del><ins>+TString DecorateIfNeeded(const TName &amp;name);
+// Decorates and also unmangles the function name
+TString DecorateFunctionIfNeeded(const TName &amp;name);
+TString DecorateUniform(const TName &amp;name, const TType &amp;type);
</ins><span class="cx"> TString DecorateField(const TString &amp;string, const TStructure &amp;structure);
</span><span class="cx"> TString DecoratePrivate(const TString &amp;privateText);
</span><span class="cx"> TString TypeString(const TType &amp;type);
</span><span class="lines">@@ -31,7 +73,10 @@
</span><span class="cx">                                   bool useStd140Packing);
</span><span class="cx"> TString InterpolationString(TQualifier qualifier);
</span><span class="cx"> TString QualifierString(TQualifier qualifier);
</span><del>-
</del><ins>+int HLSLTextureCoordsCount(const TBasicType samplerType);
+// Parameters may need to be included in function names to disambiguate between overloaded
+// functions.
+TString DisambiguateFunctionName(const TIntermSequence *parameters);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // COMPILER_TRANSLATOR_UTILSHLSL_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorValidateGlobalInitializercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,112 @@
</span><ins>+//
+// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#include &quot;compiler/translator/ValidateGlobalInitializer.h&quot;
+
+#include &quot;compiler/translator/ParseContext.h&quot;
+
+namespace
+{
+
+class ValidateGlobalInitializerTraverser : public TIntermTraverser
+{
+  public:
+    ValidateGlobalInitializerTraverser(const TParseContext *context);
+
+    void visitSymbol(TIntermSymbol *node) override;
+    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
+    bool visitBinary(Visit visit, TIntermBinary *node) override;
+    bool visitUnary(Visit visit, TIntermUnary *node) override;
+
+    bool isValid() const { return mIsValid; }
+    bool issueWarning() const { return mIssueWarning; }
+
+  private:
+    const TParseContext *mContext;
+    bool mIsValid;
+    bool mIssueWarning;
+};
+
+void ValidateGlobalInitializerTraverser::visitSymbol(TIntermSymbol *node)
+{
+    const TSymbol *sym = mContext-&gt;symbolTable.find(node-&gt;getSymbol(), mContext-&gt;getShaderVersion());
+    if (sym-&gt;isVariable())
+    {
+        // ESSL 1.00 section 4.3 (or ESSL 3.00 section 4.3):
+        // Global initializers must be constant expressions.
+        const TVariable *var = static_cast&lt;const TVariable *&gt;(sym);
+        switch (var-&gt;getType().getQualifier())
+        {
+          case EvqConst:
+            break;
+          case EvqGlobal:
+          case EvqTemporary:
+          case EvqUniform:
+            // We allow these cases to be compatible with legacy ESSL 1.00 content.
+            // Implement stricter rules for ESSL 3.00 since there's no legacy content to deal with.
+            if (mContext-&gt;getShaderVersion() &gt;= 300)
+            {
+                mIsValid = false;
+            }
+            else
+            {
+                mIssueWarning = true;
+            }
+            break;
+          default:
+            mIsValid = false;
+        }
+    }
+}
+
+bool ValidateGlobalInitializerTraverser::visitAggregate(Visit visit, TIntermAggregate *node)
+{
+    // Disallow calls to user-defined functions and texture lookup functions in global variable initializers.
+    // This is done simply by disabling all function calls - built-in math functions don't use EOpFunctionCall.
+    if (node-&gt;getOp() == EOpFunctionCall)
+    {
+        mIsValid = false;
+    }
+    return true;
+}
+
+bool ValidateGlobalInitializerTraverser::visitBinary(Visit visit, TIntermBinary *node)
+{
+    if (node-&gt;isAssignment())
+    {
+        mIsValid = false;
+    }
+    return true;
+}
+
+bool ValidateGlobalInitializerTraverser::visitUnary(Visit visit, TIntermUnary *node)
+{
+    if (node-&gt;isAssignment())
+    {
+        mIsValid = false;
+    }
+    return true;
+}
+
+ValidateGlobalInitializerTraverser::ValidateGlobalInitializerTraverser(const TParseContext *context)
+    : TIntermTraverser(true, false, false),
+      mContext(context),
+      mIsValid(true),
+      mIssueWarning(false)
+{
+}
+
+} // namespace
+
+bool ValidateGlobalInitializer(TIntermTyped *initializer, const TParseContext *context, bool *warning)
+{
+    ValidateGlobalInitializerTraverser validate(context);
+    initializer-&gt;traverse(&amp;validate);
+    ASSERT(warning != nullptr);
+    *warning = validate.issueWarning();
+    return validate.isValid();
+}
+
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorValidateGlobalInitializerh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateGlobalInitializer.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+//
+// Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#ifndef COMPILER_TRANSLATOR_VALIDATEGLOBALINITIALIZER_H_
+#define COMPILER_TRANSLATOR_VALIDATEGLOBALINITIALIZER_H_
+
+class TIntermTyped;
+class TParseContext;
+
+// Returns true if the initializer is valid.
+bool ValidateGlobalInitializer(TIntermTyped *initializer, const TParseContext *context, bool *warning);
+
+#endif // COMPILER_TRANSLATOR_VALIDATEGLOBALINITIALIZER_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorValidateLimitationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -26,12 +26,16 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     ValidateConstIndexExpr(TLoopStack&amp; stack)
</span><del>-        : mValid(true), mLoopStack(stack) {}
</del><ins>+        : TIntermTraverser(true, false, false),
+          mValid(true),
+          mLoopStack(stack)
+    {
+    }
</ins><span class="cx"> 
</span><span class="cx">     // Returns true if the parsed node represents a constant index expression.
</span><span class="cx">     bool isValid() const { return mValid; }
</span><span class="cx"> 
</span><del>-    virtual void visitSymbol(TIntermSymbol *symbol)
</del><ins>+    void visitSymbol(TIntermSymbol *symbol) override
</ins><span class="cx">     {
</span><span class="cx">         // Only constants and loop indices are allowed in a
</span><span class="cx">         // constant index expression.
</span><span class="lines">@@ -49,14 +53,37 @@
</span><span class="cx"> 
</span><span class="cx"> }  // namespace anonymous
</span><span class="cx"> 
</span><del>-ValidateLimitations::ValidateLimitations(sh::GLenum shaderType,
-                                         TInfoSinkBase &amp;sink)
-    : mShaderType(shaderType),
</del><ins>+ValidateLimitations::ValidateLimitations(sh::GLenum shaderType, TInfoSinkBase *sink)
+    : TIntermTraverser(true, false, false),
+      mShaderType(shaderType),
</ins><span class="cx">       mSink(sink),
</span><del>-      mNumErrors(0)
</del><ins>+      mNumErrors(0),
+      mValidateIndexing(true),
+      mValidateInnerLoops(true)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// static
+bool ValidateLimitations::IsLimitedForLoop(TIntermLoop *loop)
+{
+    // The shader type doesn't matter in this case.
+    ValidateLimitations validate(GL_FRAGMENT_SHADER, nullptr);
+    validate.mValidateIndexing   = false;
+    validate.mValidateInnerLoops = false;
+    if (!validate.validateLoopType(loop))
+        return false;
+    if (!validate.validateForLoopHeader(loop))
+        return false;
+    TIntermNode *body = loop-&gt;getBody();
+    if (body != nullptr)
+    {
+        validate.mLoopStack.push(loop);
+        body-&gt;traverse(&amp;validate);
+        validate.mLoopStack.pop();
+    }
+    return (validate.mNumErrors == 0);
+}
+
</ins><span class="cx"> bool ValidateLimitations::visitBinary(Visit, TIntermBinary *node)
</span><span class="cx"> {
</span><span class="cx">     // Check if loop index is modified in the loop body.
</span><span class="lines">@@ -67,10 +94,11 @@
</span><span class="cx">     {
</span><span class="cx">       case EOpIndexDirect:
</span><span class="cx">       case EOpIndexIndirect:
</span><del>-        validateIndexing(node);
-        break;
</del><ins>+          if (mValidateIndexing)
+              validateIndexing(node);
+          break;
</ins><span class="cx">       default:
</span><del>-        break;
</del><ins>+          break;
</ins><span class="cx">     }
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="lines">@@ -97,6 +125,9 @@
</span><span class="cx"> 
</span><span class="cx"> bool ValidateLimitations::visitLoop(Visit, TIntermLoop *node)
</span><span class="cx"> {
</span><ins>+    if (!mValidateInnerLoops)
+        return true;
+
</ins><span class="cx">     if (!validateLoopType(node))
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="lines">@@ -118,9 +149,12 @@
</span><span class="cx"> void ValidateLimitations::error(TSourceLoc loc,
</span><span class="cx">                                 const char *reason, const char *token)
</span><span class="cx"> {
</span><del>-    mSink.prefix(EPrefixError);
-    mSink.location(loc);
-    mSink &lt;&lt; &quot;'&quot; &lt;&lt; token &lt;&lt; &quot;' : &quot; &lt;&lt; reason &lt;&lt; &quot;\n&quot;;
</del><ins>+    if (mSink)
+    {
+        mSink-&gt;prefix(EPrefixError);
+        mSink-&gt;location(loc);
+        (*mSink) &lt;&lt; &quot;'&quot; &lt;&lt; token &lt;&lt; &quot;' : &quot; &lt;&lt; reason &lt;&lt; &quot;\n&quot;;
+    }
</ins><span class="cx">     ++mNumErrors;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -389,13 +423,13 @@
</span><span class="cx"> 
</span><span class="cx">     bool valid = true;
</span><span class="cx">     TSymbolTable&amp; symbolTable = GetGlobalParseContext()-&gt;symbolTable;
</span><del>-    TSymbol* symbol = symbolTable.find(node-&gt;getName(), GetGlobalParseContext()-&gt;shaderVersion);
</del><ins>+    TSymbol* symbol = symbolTable.find(node-&gt;getName(), GetGlobalParseContext()-&gt;getShaderVersion());
</ins><span class="cx">     ASSERT(symbol &amp;&amp; symbol-&gt;isFunction());
</span><span class="cx">     TFunction *function = static_cast&lt;TFunction *&gt;(symbol);
</span><span class="cx">     for (ParamIndex::const_iterator i = pIndex.begin();
</span><span class="cx">          i != pIndex.end(); ++i)
</span><span class="cx">     {
</span><del>-        const TParameter &amp;param = function-&gt;getParam(*i);
</del><ins>+        const TConstParameter &amp;param = function-&gt;getParam(*i);
</ins><span class="cx">         TQualifier qual = param.type-&gt;getQualifier();
</span><span class="cx">         if ((qual == EvqOut) || (qual == EvqInOut))
</span><span class="cx">         {
</span><span class="lines">@@ -428,8 +462,8 @@
</span><span class="cx"> 
</span><span class="cx"> bool ValidateLimitations::isConstExpr(TIntermNode *node)
</span><span class="cx"> {
</span><del>-    ASSERT(node != NULL);
-    return node-&gt;getAsConstantUnion() != NULL;
</del><ins>+    ASSERT(node != nullptr);
+    return node-&gt;getAsConstantUnion() != nullptr &amp;&amp; node-&gt;getAsTyped()-&gt;getQualifier() == EvqConst;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool ValidateLimitations::isConstIndexExpr(TIntermNode *node)
</span><span class="lines">@@ -448,13 +482,6 @@
</span><span class="cx"> 
</span><span class="cx">     bool valid = true;
</span><span class="cx">     TIntermTyped *index = node-&gt;getRight();
</span><del>-    // The index expression must have integral type.
-    if (!index-&gt;isScalarInt()) {
-        error(index-&gt;getLine(),
-              &quot;Index expression must have integral type&quot;,
-              index-&gt;getCompleteString().c_str());
-        valid = false;
-    }
</del><span class="cx">     // The index expession must be a constant-index-expression unless
</span><span class="cx">     // the operand is a uniform in a vertex shader.
</span><span class="cx">     TIntermTyped *operand = node-&gt;getLeft();
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorValidateLimitationsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateLimitations.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -17,15 +17,17 @@
</span><span class="cx"> class ValidateLimitations : public TIntermTraverser
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    ValidateLimitations(sh::GLenum shaderType, TInfoSinkBase &amp;sink);
</del><ins>+    ValidateLimitations(sh::GLenum shaderType, TInfoSinkBase *sink);
</ins><span class="cx"> 
</span><span class="cx">     int numErrors() const { return mNumErrors; }
</span><span class="cx"> 
</span><del>-    virtual bool visitBinary(Visit, TIntermBinary *);
-    virtual bool visitUnary(Visit, TIntermUnary *);
-    virtual bool visitAggregate(Visit, TIntermAggregate *);
-    virtual bool visitLoop(Visit, TIntermLoop *);
</del><ins>+    bool visitBinary(Visit, TIntermBinary *) override;
+    bool visitUnary(Visit, TIntermUnary *) override;
+    bool visitAggregate(Visit, TIntermAggregate *) override;
+    bool visitLoop(Visit, TIntermLoop *) override;
</ins><span class="cx"> 
</span><ins>+    static bool IsLimitedForLoop(TIntermLoop *node);
+
</ins><span class="cx">   private:
</span><span class="cx">     void error(TSourceLoc loc, const char *reason, const char *token);
</span><span class="cx"> 
</span><span class="lines">@@ -51,9 +53,11 @@
</span><span class="cx">     bool validateIndexing(TIntermBinary *node);
</span><span class="cx"> 
</span><span class="cx">     sh::GLenum mShaderType;
</span><del>-    TInfoSinkBase &amp;mSink;
</del><ins>+    TInfoSinkBase *mSink;
</ins><span class="cx">     int mNumErrors;
</span><span class="cx">     TLoopStack mLoopStack;
</span><ins>+    bool mValidateIndexing;
+    bool mValidateInnerLoops;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #endif // COMPILER_TRANSLATOR_VALIDATELIMITATIONS_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorValidateMaxParameterscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+//
+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// ValidateMaxParameters checks if function definitions have more than a set number of parameters.
+
+#include &quot;compiler/translator/ValidateMaxParameters.h&quot;
+
+ValidateMaxParameters::ValidateMaxParameters(unsigned int maxParameters)
+    : TIntermTraverser(true, false, false), mMaxParameters(maxParameters), mValid(true)
+{
+}
+
+bool ValidateMaxParameters::visitAggregate(Visit visit, TIntermAggregate *node)
+{
+    if (!mValid)
+    {
+        return false;
+    }
+
+    if (node-&gt;getOp() == EOpParameters &amp;&amp; node-&gt;getSequence()-&gt;size() &gt; mMaxParameters)
+    {
+        mValid = false;
+    }
+
+    return mValid;
+}
+
+bool ValidateMaxParameters::validate(TIntermNode *root, unsigned int maxParameters)
+{
+    ValidateMaxParameters argsTraverser(maxParameters);
+    root-&gt;traverse(&amp;argsTraverser);
+    return argsTraverser.mValid;
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorValidateMaxParametersh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateMaxParameters.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,29 @@
</span><ins>+//
+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// ValidateMaxParameters checks if function definitions have more than a set number of parameters.
+
+#ifndef COMPILER_TRANSLATOR_VALIDATEMAXPARAMETERS_H_
+#define COMPILER_TRANSLATOR_VALIDATEMAXPARAMETERS_H_
+
+#include &quot;compiler/translator/IntermNode.h&quot;
+
+class ValidateMaxParameters : public TIntermTraverser
+{
+  public:
+    // Returns false if maxParameters is exceeded.
+    static bool validate(TIntermNode *root, unsigned int maxParameters);
+
+  protected:
+    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
+
+  private:
+    ValidateMaxParameters(unsigned int maxParameters);
+
+    unsigned int mMaxParameters;
+    bool mValid;
+};
+
+#endif  // COMPILER_TRANSLATOR_VALIDATEMAXPARAMETERS_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorValidateOutputscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,11 +9,23 @@
</span><span class="cx"> #include &quot;compiler/translator/InitializeParseContext.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/ParseContext.h&quot;
</span><span class="cx"> 
</span><del>-ValidateOutputs::ValidateOutputs(TInfoSinkBase&amp; sink, int maxDrawBuffers)
-    : mSink(sink),
</del><ins>+namespace
+{
+void error(int *errorCount, TInfoSinkBase &amp;sink, const TIntermSymbol &amp;symbol, const char *reason)
+{
+    sink.prefix(EPrefixError);
+    sink.location(symbol.getLine());
+    sink &lt;&lt; &quot;'&quot; &lt;&lt; symbol.getSymbol() &lt;&lt; &quot;' : &quot; &lt;&lt; reason &lt;&lt; &quot;\n&quot;;
+    (*errorCount)++;
+}
+
+}  // namespace
+
+ValidateOutputs::ValidateOutputs(const TExtensionBehavior &amp;extBehavior, int maxDrawBuffers)
+    : TIntermTraverser(true, false, false),
</ins><span class="cx">       mMaxDrawBuffers(maxDrawBuffers),
</span><del>-      mNumErrors(0),
-      mHasUnspecifiedOutputLocation(false)
</del><ins>+      mAllowUnspecifiedOutputLocationResolution(
+          IsExtensionEnabled(extBehavior, &quot;GL_EXT_blend_func_extended&quot;))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -29,50 +41,68 @@
</span><span class="cx"> 
</span><span class="cx">     if (qualifier == EvqFragmentOut)
</span><span class="cx">     {
</span><del>-        const TType &amp;type = symbol-&gt;getType();
-        const int location = type.getLayoutQualifier().location;
-
-        if (mHasUnspecifiedOutputLocation)
</del><ins>+        if (symbol-&gt;getType().getLayoutQualifier().location == -1)
</ins><span class="cx">         {
</span><del>-            error(symbol-&gt;getLine(), &quot;must explicitly specify all locations when using multiple fragment outputs&quot;, name.c_str());
</del><ins>+            mUnspecifiedLocationOutputs.push_back(symbol);
</ins><span class="cx">         }
</span><del>-        else if (location == -1)
</del><ins>+        else
</ins><span class="cx">         {
</span><del>-            mHasUnspecifiedOutputLocation = true;
</del><ins>+            mOutputs.push_back(symbol);
</ins><span class="cx">         }
</span><del>-        else
</del><ins>+    }
+}
+
+int ValidateOutputs::validateAndCountErrors(TInfoSinkBase &amp;sink) const
+{
+    OutputVector validOutputs(mMaxDrawBuffers);
+    int errorCount = 0;
+
+    for (const auto &amp;symbol : mOutputs)
+    {
+        const TType &amp;type         = symbol-&gt;getType();
+        const size_t elementCount = static_cast&lt;size_t&gt;(type.isArray() ? type.getArraySize() : 1);
+        const size_t location     = static_cast&lt;size_t&gt;(type.getLayoutQualifier().location);
+
+        ASSERT(type.getLayoutQualifier().location != -1);
+
+        if (location + elementCount &lt;= validOutputs.size())
</ins><span class="cx">         {
</span><del>-            OutputMap::iterator mapEntry = mOutputMap.find(location);
-            if (mapEntry == mOutputMap.end())
</del><ins>+            for (size_t elementIndex = 0; elementIndex &lt; elementCount; elementIndex++)
</ins><span class="cx">             {
</span><del>-                const int elementCount = type.isArray() ? type.getArraySize() : 1;
-                if (location + elementCount &gt; mMaxDrawBuffers)
</del><ins>+                const size_t offsetLocation = location + elementIndex;
+                if (validOutputs[offsetLocation])
</ins><span class="cx">                 {
</span><del>-                    error(symbol-&gt;getLine(), &quot;output location must be &lt; MAX_DRAW_BUFFERS&quot;, name.c_str());
</del><ins>+                    std::stringstream strstr;
+                    strstr &lt;&lt; &quot;conflicting output locations with previously defined output '&quot;
+                           &lt;&lt; validOutputs[offsetLocation]-&gt;getSymbol() &lt;&lt; &quot;'&quot;;
+                    error(&amp;errorCount, sink, *symbol, strstr.str().c_str());
</ins><span class="cx">                 }
</span><del>-
-                for (int elementIndex = 0; elementIndex &lt; elementCount; elementIndex++)
</del><ins>+                else
</ins><span class="cx">                 {
</span><del>-                    const int offsetLocation = location + elementIndex;
-                    mOutputMap[offsetLocation] = symbol;
</del><ins>+                    validOutputs[offsetLocation] = symbol;
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><del>-            else
</del><ins>+        }
+        else
+        {
+            if (elementCount &gt; 0)
</ins><span class="cx">             {
</span><del>-                std::stringstream strstr;
-                strstr &lt;&lt; &quot;conflicting output locations with previously defined output '&quot;
-                       &lt;&lt; mapEntry-&gt;second-&gt;getSymbol() &lt;&lt; &quot;'&quot;;
-
-                error(symbol-&gt;getLine(), strstr.str().c_str(), name.c_str());
</del><ins>+                error(&amp;errorCount, sink, *symbol,
+                      elementCount &gt; 1 ? &quot;output array locations would exceed MAX_DRAW_BUFFERS&quot;
+                                       : &quot;output location must be &lt; MAX_DRAW_BUFFERS&quot;);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-}
</del><span class="cx"> 
</span><del>-void ValidateOutputs::error(TSourceLoc loc, const char *reason, const char* token)
-{
-    mSink.prefix(EPrefixError);
-    mSink.location(loc);
-    mSink &lt;&lt; &quot;'&quot; &lt;&lt; token &lt;&lt; &quot;' : &quot; &lt;&lt; reason &lt;&lt; &quot;\n&quot;;
-    mNumErrors++;
</del><ins>+    if (!mAllowUnspecifiedOutputLocationResolution &amp;&amp;
+        ((!mOutputs.empty() &amp;&amp; !mUnspecifiedLocationOutputs.empty()) ||
+         mUnspecifiedLocationOutputs.size() &gt; 1))
+    {
+        for (const auto &amp;symbol : mUnspecifiedLocationOutputs)
+        {
+            error(&amp;errorCount, sink, *symbol,
+                  &quot;must explicitly specify all locations when using multiple fragment outputs&quot;);
+        }
+    }
+    return errorCount;
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorValidateOutputsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateOutputs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,6 +7,7 @@
</span><span class="cx"> #ifndef COMPILER_TRANSLATOR_VALIDATEOUTPUTS_H_
</span><span class="cx"> #define COMPILER_TRANSLATOR_VALIDATEOUTPUTS_H_
</span><span class="cx"> 
</span><ins>+#include &quot;compiler/translator/ExtensionBehavior.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/IntermNode.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;set&gt;
</span><span class="lines">@@ -16,23 +17,20 @@
</span><span class="cx"> class ValidateOutputs : public TIntermTraverser
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    ValidateOutputs(TInfoSinkBase&amp; sink, int maxDrawBuffers);
</del><ins>+    ValidateOutputs(const TExtensionBehavior &amp;extBehavior, int maxDrawBuffers);
</ins><span class="cx"> 
</span><del>-    int numErrors() const { return mNumErrors; }
</del><ins>+    int validateAndCountErrors(TInfoSinkBase &amp;sink) const;
</ins><span class="cx"> 
</span><del>-    virtual void visitSymbol(TIntermSymbol*);
</del><ins>+    void visitSymbol(TIntermSymbol *) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    TInfoSinkBase&amp; mSink;
</del><span class="cx">     int mMaxDrawBuffers;
</span><del>-    int mNumErrors;
-    bool mHasUnspecifiedOutputLocation;
</del><ins>+    bool mAllowUnspecifiedOutputLocationResolution;
</ins><span class="cx"> 
</span><del>-    typedef std::map&lt;int, TIntermSymbol*&gt; OutputMap;
-    OutputMap mOutputMap;
</del><ins>+    typedef std::vector&lt;TIntermSymbol *&gt; OutputVector;
+    OutputVector mOutputs;
+    OutputVector mUnspecifiedLocationOutputs;
</ins><span class="cx">     std::set&lt;TString&gt; mVisitedSymbols;
</span><del>-
-    void error(TSourceLoc loc, const char *reason, const char* token);
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #endif // COMPILER_TRANSLATOR_VALIDATEOUTPUTS_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorValidateSwitchh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/ValidateSwitch.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,7 +9,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/IntermNode.h&quot;
</span><span class="cx"> 
</span><del>-struct TParseContext;
</del><ins>+class TParseContext;
</ins><span class="cx"> 
</span><span class="cx"> class ValidateSwitch : public TIntermTraverser
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorVariableInfocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VariableInfo.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VariableInfo.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VariableInfo.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,18 +16,6 @@
</span><span class="cx"> namespace
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-TString InterfaceBlockFieldName(const TInterfaceBlock &amp;interfaceBlock, const TField &amp;field)
-{
-    if (interfaceBlock.hasInstanceName())
-    {
-        return interfaceBlock.name() + &quot;.&quot; + field.name();
-    }
-    else
-    {
-        return field.name();
-    }
-}
-
</del><span class="cx"> BlockLayoutType GetBlockLayoutType(TLayoutBlockStorage blockStorage)
</span><span class="cx"> {
</span><span class="cx">     switch (blockStorage)
</span><span class="lines">@@ -55,7 +43,8 @@
</span><span class="cx">     {
</span><span class="cx">         if (variable.isArray())
</span><span class="cx">         {
</span><del>-            for (unsigned int elementIndex = 0; elementIndex &lt; variable.elementCount(); elementIndex++)
</del><ins>+            for (unsigned int elementIndex = 0; elementIndex &lt; variable.elementCount();
+                 elementIndex++)
</ins><span class="cx">             {
</span><span class="cx">                 std::string lname = name + ::ArrayString(elementIndex);
</span><span class="cx">                 std::string lmappedName = mappedName + ::ArrayString(elementIndex);
</span><span class="lines">@@ -128,13 +117,14 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CollectVariables::CollectVariables(std::vector&lt;sh::Attribute&gt; *attribs,
</span><del>-                                   std::vector&lt;sh::Attribute&gt; *outputVariables,
</del><ins>+                                   std::vector&lt;sh::OutputVariable&gt; *outputVariables,
</ins><span class="cx">                                    std::vector&lt;sh::Uniform&gt; *uniforms,
</span><span class="cx">                                    std::vector&lt;sh::Varying&gt; *varyings,
</span><span class="cx">                                    std::vector&lt;sh::InterfaceBlock&gt; *interfaceBlocks,
</span><span class="cx">                                    ShHashFunction64 hashFunction,
</span><span class="cx">                                    const TSymbolTable &amp;symbolTable)
</span><del>-    : mAttribs(attribs),
</del><ins>+    : TIntermTraverser(true, false, false),
+      mAttribs(attribs),
</ins><span class="cx">       mOutputVariables(outputVariables),
</span><span class="cx">       mUniforms(uniforms),
</span><span class="cx">       mVaryings(varyings),
</span><span class="lines">@@ -144,9 +134,16 @@
</span><span class="cx">       mFrontFacingAdded(false),
</span><span class="cx">       mFragCoordAdded(false),
</span><span class="cx">       mInstanceIDAdded(false),
</span><ins>+      mVertexIDAdded(false),
</ins><span class="cx">       mPositionAdded(false),
</span><span class="cx">       mPointSizeAdded(false),
</span><span class="cx">       mLastFragDataAdded(false),
</span><ins>+      mFragColorAdded(false),
+      mFragDataAdded(false),
+      mFragDepthEXTAdded(false),
+      mFragDepthAdded(false),
+      mSecondaryFragColorEXTAdded(false),
+      mSecondaryFragDataEXTAdded(false),
</ins><span class="cx">       mHashFunction(hashFunction),
</span><span class="cx">       mSymbolTable(symbolTable)
</span><span class="cx"> {
</span><span class="lines">@@ -317,6 +314,22 @@
</span><span class="cx">                 mInstanceIDAdded = true;
</span><span class="cx">             }
</span><span class="cx">             return;
</span><ins>+          case EvqVertexID:
+              if (!mVertexIDAdded)
+              {
+                  Attribute info;
+                  const char kName[] = &quot;gl_VertexID&quot;;
+                  info.name          = kName;
+                  info.mappedName    = kName;
+                  info.type          = GL_INT;
+                  info.arraySize     = 0;
+                  info.precision     = GL_HIGH_INT;  // Defined by spec.
+                  info.staticUse     = true;
+                  info.location      = -1;
+                  mAttribs-&gt;push_back(info);
+                  mVertexIDAdded = true;
+              }
+              return;
</ins><span class="cx">           case EvqPosition:
</span><span class="cx">             if (!mPositionAdded)
</span><span class="cx">             {
</span><span class="lines">@@ -365,6 +378,105 @@
</span><span class="cx">                 mLastFragDataAdded = true;
</span><span class="cx">             }
</span><span class="cx">             return;
</span><ins>+          case EvqFragColor:
+              if (!mFragColorAdded)
+              {
+                  OutputVariable info;
+                  const char kName[] = &quot;gl_FragColor&quot;;
+                  info.name          = kName;
+                  info.mappedName    = kName;
+                  info.type          = GL_FLOAT_VEC4;
+                  info.arraySize     = 0;
+                  info.precision     = GL_MEDIUM_FLOAT;  // Defined by spec.
+                  info.staticUse = true;
+                  mOutputVariables-&gt;push_back(info);
+                  mFragColorAdded = true;
+              }
+              return;
+          case EvqFragData:
+              if (!mFragDataAdded)
+              {
+                  OutputVariable info;
+                  const char kName[] = &quot;gl_FragData&quot;;
+                  info.name          = kName;
+                  info.mappedName    = kName;
+                  info.type          = GL_FLOAT_VEC4;
+                  info.arraySize = static_cast&lt;const TVariable *&gt;(
+                                       mSymbolTable.findBuiltIn(&quot;gl_MaxDrawBuffers&quot;, 100))
+                                       -&gt;getConstPointer()
+                                       -&gt;getIConst();
+                  info.precision = GL_MEDIUM_FLOAT;  // Defined by spec.
+                  info.staticUse = true;
+                  mOutputVariables-&gt;push_back(info);
+                  mFragDataAdded = true;
+              }
+              return;
+          case EvqFragDepthEXT:
+              if (!mFragDepthEXTAdded)
+              {
+                  OutputVariable info;
+                  const char kName[] = &quot;gl_FragDepthEXT&quot;;
+                  info.name          = kName;
+                  info.mappedName    = kName;
+                  info.type          = GL_FLOAT;
+                  info.arraySize = 0;
+                  info.precision =
+                      GLVariablePrecision(static_cast&lt;const TVariable *&gt;(
+                                              mSymbolTable.findBuiltIn(&quot;gl_FragDepthEXT&quot;, 100))
+                                              -&gt;getType());
+                  info.staticUse = true;
+                  mOutputVariables-&gt;push_back(info);
+                  mFragDepthEXTAdded = true;
+              }
+              return;
+          case EvqFragDepth:
+              if (!mFragDepthAdded)
+              {
+                  OutputVariable info;
+                  const char kName[] = &quot;gl_FragDepth&quot;;
+                  info.name          = kName;
+                  info.mappedName    = kName;
+                  info.type          = GL_FLOAT;
+                  info.arraySize     = 0;
+                  info.precision     = GL_HIGH_FLOAT;
+                  info.staticUse = true;
+                  mOutputVariables-&gt;push_back(info);
+                  mFragDepthAdded = true;
+              }
+              return;
+          case EvqSecondaryFragColorEXT:
+              if (!mSecondaryFragColorEXTAdded)
+              {
+                  OutputVariable info;
+                  const char kName[] = &quot;gl_SecondaryFragColorEXT&quot;;
+                  info.name          = kName;
+                  info.mappedName    = kName;
+                  info.type          = GL_FLOAT_VEC4;
+                  info.arraySize     = 0;
+                  info.precision     = GL_MEDIUM_FLOAT;  // Defined by spec.
+                  info.staticUse = true;
+                  mOutputVariables-&gt;push_back(info);
+                  mSecondaryFragColorEXTAdded = true;
+              }
+              return;
+          case EvqSecondaryFragDataEXT:
+              if (!mSecondaryFragDataEXTAdded)
+              {
+                  OutputVariable info;
+                  const char kName[] = &quot;gl_SecondaryFragDataEXT&quot;;
+                  info.name          = kName;
+                  info.mappedName    = kName;
+                  info.type          = GL_FLOAT_VEC4;
+
+                  const TVariable *maxDualSourceDrawBuffersVar = static_cast&lt;const TVariable *&gt;(
+                      mSymbolTable.findBuiltIn(&quot;gl_MaxDualSourceDrawBuffersEXT&quot;, 100));
+                  info.arraySize = maxDualSourceDrawBuffersVar-&gt;getConstPointer()-&gt;getIConst();
+                  info.precision = GL_MEDIUM_FLOAT;  // Defined by spec.
+                  info.staticUse = true;
+                  mOutputVariables-&gt;push_back(info);
+                  mSecondaryFragDataEXTAdded = true;
+              }
+              return;
</ins><span class="cx">           default:
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -385,7 +497,7 @@
</span><span class="cx">     {}
</span><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    virtual void visitVariable(ShaderVariable *variable)
</del><ins>+    void visitVariable(ShaderVariable *variable) override
</ins><span class="cx">     {
</span><span class="cx">         TString stringName = TString(variable-&gt;name.c_str());
</span><span class="cx">         variable-&gt;mappedName = TIntermTraverser::hash(stringName, mHashFunction).c_str();
</span><span class="lines">@@ -417,6 +529,26 @@
</span><span class="cx"> 
</span><span class="cx"> template &lt;&gt;
</span><span class="cx"> void CollectVariables::visitVariable(const TIntermSymbol *variable,
</span><ins>+                                     std::vector&lt;OutputVariable&gt; *infoList) const
+{
+    ASSERT(variable);
+    const TType &amp;type = variable-&gt;getType();
+    ASSERT(!type.getStruct());
+
+    OutputVariable attribute;
+
+    attribute.type       = GLVariableType(type);
+    attribute.precision  = GLVariablePrecision(type);
+    attribute.name       = variable-&gt;getSymbol().c_str();
+    attribute.arraySize  = static_cast&lt;unsigned int&gt;(type.getArraySize());
+    attribute.mappedName = TIntermTraverser::hash(variable-&gt;getSymbol(), mHashFunction).c_str();
+    attribute.location   = variable-&gt;getType().getLayoutQualifier().location;
+
+    infoList-&gt;push_back(attribute);
+}
+
+template &lt;&gt;
+void CollectVariables::visitVariable(const TIntermSymbol *variable,
</ins><span class="cx">                                      std::vector&lt;InterfaceBlock&gt; *infoList) const
</span><span class="cx"> {
</span><span class="cx">     InterfaceBlock interfaceBlock;
</span><span class="lines">@@ -424,23 +556,20 @@
</span><span class="cx">     ASSERT(blockType);
</span><span class="cx"> 
</span><span class="cx">     interfaceBlock.name = blockType-&gt;name().c_str();
</span><del>-    interfaceBlock.mappedName = TIntermTraverser::hash(variable-&gt;getSymbol(), mHashFunction).c_str();
</del><ins>+    interfaceBlock.mappedName =
+        TIntermTraverser::hash(blockType-&gt;name().c_str(), mHashFunction).c_str();
</ins><span class="cx">     interfaceBlock.instanceName = (blockType-&gt;hasInstanceName() ? blockType-&gt;instanceName().c_str() : &quot;&quot;);
</span><span class="cx">     interfaceBlock.arraySize = variable-&gt;getArraySize();
</span><span class="cx">     interfaceBlock.isRowMajorLayout = (blockType-&gt;matrixPacking() == EmpRowMajor);
</span><span class="cx">     interfaceBlock.layout = GetBlockLayoutType(blockType-&gt;blockStorage());
</span><span class="cx"> 
</span><span class="cx">     // Gather field information
</span><del>-    const TFieldList &amp;fieldList = blockType-&gt;fields();
-
-    for (size_t fieldIndex = 0; fieldIndex &lt; fieldList.size(); ++fieldIndex)
</del><ins>+    for (const TField *field : blockType-&gt;fields())
</ins><span class="cx">     {
</span><del>-        const TField &amp;field = *fieldList[fieldIndex];
-        const TString &amp;fullFieldName = InterfaceBlockFieldName(*blockType, field);
-        const TType &amp;fieldType = *field.type();
</del><ins>+        const TType &amp;fieldType = *field-&gt;type();
</ins><span class="cx"> 
</span><del>-        GetVariableTraverser traverser(mSymbolTable);
-        traverser.traverse(fieldType, fullFieldName, &amp;interfaceBlock.fields);
</del><ins>+        NameHashingTraverser traverser(mHashFunction, mSymbolTable);
+        traverser.traverse(fieldType, field-&gt;name(), &amp;interfaceBlock.fields);
</ins><span class="cx"> 
</span><span class="cx">         interfaceBlock.fields.back().isRowMajorLayout = (fieldType.getLayoutQualifier().matrixPacking == EmpRowMajor);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorVariableInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VariableInfo.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VariableInfo.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VariableInfo.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,16 +21,16 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     CollectVariables(std::vector&lt;Attribute&gt; *attribs,
</span><del>-                     std::vector&lt;Attribute&gt; *outputVariables,
</del><ins>+                     std::vector&lt;OutputVariable&gt; *outputVariables,
</ins><span class="cx">                      std::vector&lt;Uniform&gt; *uniforms,
</span><span class="cx">                      std::vector&lt;Varying&gt; *varyings,
</span><span class="cx">                      std::vector&lt;InterfaceBlock&gt; *interfaceBlocks,
</span><span class="cx">                      ShHashFunction64 hashFunction,
</span><span class="cx">                      const TSymbolTable &amp;symbolTable);
</span><span class="cx"> 
</span><del>-    virtual void visitSymbol(TIntermSymbol *symbol);
-    virtual bool visitAggregate(Visit, TIntermAggregate *node);
-    virtual bool visitBinary(Visit visit, TIntermBinary *binaryNode);
</del><ins>+    void visitSymbol(TIntermSymbol *symbol) override;
+    bool visitAggregate(Visit, TIntermAggregate *node) override;
+    bool visitBinary(Visit visit, TIntermBinary *binaryNode) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     template &lt;typename VarT&gt;
</span><span class="lines">@@ -40,7 +40,7 @@
</span><span class="cx">     void visitInfoList(const TIntermSequence &amp;sequence, std::vector&lt;VarT&gt; *infoList) const;
</span><span class="cx"> 
</span><span class="cx">     std::vector&lt;Attribute&gt; *mAttribs;
</span><del>-    std::vector&lt;Attribute&gt; *mOutputVariables;
</del><ins>+    std::vector&lt;OutputVariable&gt; *mOutputVariables;
</ins><span class="cx">     std::vector&lt;Uniform&gt; *mUniforms;
</span><span class="cx">     std::vector&lt;Varying&gt; *mVaryings;
</span><span class="cx">     std::vector&lt;InterfaceBlock&gt; *mInterfaceBlocks;
</span><span class="lines">@@ -53,9 +53,16 @@
</span><span class="cx">     bool mFragCoordAdded;
</span><span class="cx"> 
</span><span class="cx">     bool mInstanceIDAdded;
</span><ins>+    bool mVertexIDAdded;
</ins><span class="cx">     bool mPositionAdded;
</span><span class="cx">     bool mPointSizeAdded;
</span><span class="cx">     bool mLastFragDataAdded;
</span><ins>+    bool mFragColorAdded;
+    bool mFragDataAdded;
+    bool mFragDepthEXTAdded;
+    bool mFragDepthAdded;
+    bool mSecondaryFragColorEXTAdded;
+    bool mSecondaryFragDataEXTAdded;
</ins><span class="cx"> 
</span><span class="cx">     ShHashFunction64 mHashFunction;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorVersionGLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,11 +6,24 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/VersionGLSL.h&quot;
</span><span class="cx"> 
</span><del>-static const int GLSL_VERSION_110 = 110;
-static const int GLSL_VERSION_120 = 120;
-static const int GLSL_VERSION_130 = 130;
-static const int GLSL_VERSION_410 = 410;
-static const int GLSL_VERSION_420 = 420;
</del><ins>+int ShaderOutputTypeToGLSLVersion(ShShaderOutput output)
+{
+    switch (output)
+    {
+      case SH_GLSL_130_OUTPUT:           return GLSL_VERSION_130;
+      case SH_GLSL_140_OUTPUT:           return GLSL_VERSION_140;
+      case SH_GLSL_150_CORE_OUTPUT:      return GLSL_VERSION_150;
+      case SH_GLSL_330_CORE_OUTPUT:      return GLSL_VERSION_330;
+      case SH_GLSL_400_CORE_OUTPUT:      return GLSL_VERSION_400;
+      case SH_GLSL_410_CORE_OUTPUT:      return GLSL_VERSION_410;
+      case SH_GLSL_420_CORE_OUTPUT:      return GLSL_VERSION_420;
+      case SH_GLSL_430_CORE_OUTPUT:      return GLSL_VERSION_430;
+      case SH_GLSL_440_CORE_OUTPUT:      return GLSL_VERSION_440;
+      case SH_GLSL_450_CORE_OUTPUT:      return GLSL_VERSION_450;
+      case SH_GLSL_COMPATIBILITY_OUTPUT: return GLSL_VERSION_110;
+      default: UNREACHABLE();            return 0;
+    }
+}
</ins><span class="cx"> 
</span><span class="cx"> // We need to scan for the following:
</span><span class="cx"> // 1. &quot;invariant&quot; keyword: This can occur in both - vertex and fragment shaders
</span><span class="lines">@@ -32,33 +45,21 @@
</span><span class="cx"> TVersionGLSL::TVersionGLSL(sh::GLenum type,
</span><span class="cx">                            const TPragma &amp;pragma,
</span><span class="cx">                            ShShaderOutput output)
</span><ins>+    : TIntermTraverser(true, false, false)
</ins><span class="cx"> {
</span><del>-    if (output == SH_GLSL_130_OUTPUT)
</del><ins>+    mVersion = ShaderOutputTypeToGLSLVersion(output);
+    if (pragma.stdgl.invariantAll)
</ins><span class="cx">     {
</span><del>-        mVersion = GLSL_VERSION_130;
</del><ins>+        ensureVersionIsAtLeast(GLSL_VERSION_120);
</ins><span class="cx">     }
</span><del>-    else if (output == SH_GLSL_410_CORE_OUTPUT)
-    {
-        mVersion = GLSL_VERSION_410;
-    }
-    else if (output == SH_GLSL_420_CORE_OUTPUT)
-    {
-        mVersion = GLSL_VERSION_420;
-    }
-    else
-    {
-      ASSERT(output == SH_GLSL_COMPATIBILITY_OUTPUT);
-      if (pragma.stdgl.invariantAll)
-          mVersion = GLSL_VERSION_120;
-      else
-          mVersion = GLSL_VERSION_110;
-    }
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TVersionGLSL::visitSymbol(TIntermSymbol *node)
</span><span class="cx"> {
</span><span class="cx">     if (node-&gt;getSymbol() == &quot;gl_PointCoord&quot;)
</span><del>-        updateVersion(GLSL_VERSION_120);
</del><ins>+    {
+        ensureVersionIsAtLeast(GLSL_VERSION_120);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool TVersionGLSL::visitAggregate(Visit, TIntermAggregate *node)
</span><span class="lines">@@ -74,16 +75,14 @@
</span><span class="cx">       case EOpDeclaration:
</span><span class="cx">         {
</span><span class="cx">             const TIntermSequence &amp;sequence = *(node-&gt;getSequence());
</span><del>-            TQualifier qualifier = sequence.front()-&gt;getAsTyped()-&gt;getQualifier();
-            if ((qualifier == EvqInvariantVaryingIn) ||
-                (qualifier == EvqInvariantVaryingOut))
</del><ins>+            if (sequence.front()-&gt;getAsTyped()-&gt;getType().isInvariant())
</ins><span class="cx">             {
</span><del>-                updateVersion(GLSL_VERSION_120);
</del><ins>+                ensureVersionIsAtLeast(GLSL_VERSION_120);
</ins><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">       case EOpInvariantDeclaration:
</span><del>-        updateVersion(GLSL_VERSION_120);
</del><ins>+        ensureVersionIsAtLeast(GLSL_VERSION_120);
</ins><span class="cx">         break;
</span><span class="cx">       case EOpParameters:
</span><span class="cx">         {
</span><span class="lines">@@ -97,7 +96,7 @@
</span><span class="cx">                     TQualifier qualifier = param-&gt;getQualifier();
</span><span class="cx">                     if ((qualifier == EvqOut) || (qualifier ==  EvqInOut))
</span><span class="cx">                     {
</span><del>-                        updateVersion(GLSL_VERSION_120);
</del><ins>+                        ensureVersionIsAtLeast(GLSL_VERSION_120);
</ins><span class="cx">                         break;
</span><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="lines">@@ -107,7 +106,13 @@
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">       case EOpConstructMat2:
</span><ins>+      case EOpConstructMat2x3:
+      case EOpConstructMat2x4:
+      case EOpConstructMat3x2:
</ins><span class="cx">       case EOpConstructMat3:
</span><ins>+      case EOpConstructMat3x4:
+      case EOpConstructMat4x2:
+      case EOpConstructMat4x3:
</ins><span class="cx">       case EOpConstructMat4:
</span><span class="cx">         {
</span><span class="cx">             const TIntermSequence &amp;sequence = *(node-&gt;getSequence());
</span><span class="lines">@@ -116,7 +121,7 @@
</span><span class="cx">                 TIntermTyped *typed = sequence.front()-&gt;getAsTyped();
</span><span class="cx">                 if (typed &amp;&amp; typed-&gt;isMatrix())
</span><span class="cx">                 {
</span><del>-                    updateVersion(GLSL_VERSION_120);
</del><ins>+                    ensureVersionIsAtLeast(GLSL_VERSION_120);
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">             break;
</span><span class="lines">@@ -128,7 +133,7 @@
</span><span class="cx">     return visitChildren;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TVersionGLSL::updateVersion(int version)
</del><ins>+void TVersionGLSL::ensureVersionIsAtLeast(int version)
</ins><span class="cx"> {
</span><span class="cx">     mVersion = std::max(version, mVersion);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorVersionGLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/VersionGLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,6 +11,21 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/Pragma.h&quot;
</span><span class="cx"> 
</span><ins>+static const int GLSL_VERSION_110 = 110;
+static const int GLSL_VERSION_120 = 120;
+static const int GLSL_VERSION_130 = 130;
+static const int GLSL_VERSION_140 = 140;
+static const int GLSL_VERSION_150 = 150;
+static const int GLSL_VERSION_330 = 330;
+static const int GLSL_VERSION_400 = 400;
+static const int GLSL_VERSION_410 = 410;
+static const int GLSL_VERSION_420 = 420;
+static const int GLSL_VERSION_430 = 430;
+static const int GLSL_VERSION_440 = 440;
+static const int GLSL_VERSION_450 = 450;
+
+int ShaderOutputTypeToGLSLVersion(ShShaderOutput output);
+
</ins><span class="cx"> // Traverses the intermediate tree to return the minimum GLSL version
</span><span class="cx"> // required to legally access all built-in features used in the shader.
</span><span class="cx"> // GLSL 1.1 which is mandated by OpenGL 2.0 provides:
</span><span class="lines">@@ -39,15 +54,14 @@
</span><span class="cx">     //   - matrix/matrix constructors
</span><span class="cx">     //   - array &quot;out&quot; parameters
</span><span class="cx">     //   Else 110 is returned.
</span><del>-    int getVersion() { return mVersion; }
</del><ins>+    int getVersion() const { return mVersion; }
</ins><span class="cx"> 
</span><del>-    virtual void visitSymbol(TIntermSymbol *);
-    virtual bool visitAggregate(Visit, TIntermAggregate *);
</del><ins>+    void visitSymbol(TIntermSymbol *) override;
+    bool visitAggregate(Visit, TIntermAggregate *) override;
</ins><span class="cx"> 
</span><del>-  protected:
-    void updateVersion(int version);
</del><ins>+  private:
+    void ensureVersionIsAtLeast(int version);
</ins><span class="cx"> 
</span><del>-  private:
</del><span class="cx">     int mVersion;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorblocklayoutcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -27,7 +27,10 @@
</span><span class="cx"> 
</span><span class="cx">     getBlockLayoutInfo(type, arraySize, isRowMajorMatrix, &amp;arrayStride, &amp;matrixStride);
</span><span class="cx"> 
</span><del>-    const BlockMemberInfo memberInfo(static_cast&lt;int&gt;(mCurrentOffset * BytesPerComponent), arrayStride * BytesPerComponent, matrixStride * BytesPerComponent, isRowMajorMatrix);
</del><ins>+    const BlockMemberInfo memberInfo(static_cast&lt;int&gt;(mCurrentOffset * BytesPerComponent),
+                                     static_cast&lt;int&gt;(arrayStride * BytesPerComponent),
+                                     static_cast&lt;int&gt;(matrixStride * BytesPerComponent),
+                                     isRowMajorMatrix);
</ins><span class="cx"> 
</span><span class="cx">     advanceOffset(type, arraySize, isRowMajorMatrix, arrayStride, matrixStride);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorblocklayouth"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayout.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -26,6 +26,8 @@
</span><span class="cx"> 
</span><span class="cx"> struct COMPILER_EXPORT BlockMemberInfo
</span><span class="cx"> {
</span><ins>+    BlockMemberInfo() : offset(-1), arrayStride(-1), matrixStride(-1), isRowMajorMatrix(false) {}
+
</ins><span class="cx">     BlockMemberInfo(int offset, int arrayStride, int matrixStride, bool isRowMajorMatrix)
</span><span class="cx">         : offset(offset),
</span><span class="cx">           arrayStride(arrayStride),
</span><span class="lines">@@ -48,12 +50,11 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     BlockLayoutEncoder();
</span><ins>+    virtual ~BlockLayoutEncoder() {}
</ins><span class="cx"> 
</span><span class="cx">     BlockMemberInfo encodeType(GLenum type, unsigned int arraySize, bool isRowMajorMatrix);
</span><span class="cx"> 
</span><span class="cx">     size_t getBlockSize() const { return mCurrentOffset * BytesPerComponent; }
</span><del>-    size_t getCurrentRegister() const { return mCurrentOffset / ComponentsPerRegister; }
-    size_t getCurrentElement() const { return mCurrentOffset % ComponentsPerRegister; }
</del><span class="cx"> 
</span><span class="cx">     virtual void enterAggregateType() = 0;
</span><span class="cx">     virtual void exitAggregateType() = 0;
</span><span class="lines">@@ -81,12 +82,20 @@
</span><span class="cx">   public:
</span><span class="cx">     Std140BlockEncoder();
</span><span class="cx"> 
</span><del>-    virtual void enterAggregateType();
-    virtual void exitAggregateType();
</del><ins>+    void enterAggregateType() override;
+    void exitAggregateType() override;
</ins><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    virtual void getBlockLayoutInfo(GLenum type, unsigned int arraySize, bool isRowMajorMatrix, int *arrayStrideOut, int *matrixStrideOut);
-    virtual void advanceOffset(GLenum type, unsigned int arraySize, bool isRowMajorMatrix, int arrayStride, int matrixStride);
</del><ins>+    void getBlockLayoutInfo(GLenum type,
+                            unsigned int arraySize,
+                            bool isRowMajorMatrix,
+                            int *arrayStrideOut,
+                            int *matrixStrideOut) override;
+    void advanceOffset(GLenum type,
+                       unsigned int arraySize,
+                       bool isRowMajorMatrix,
+                       int arrayStride,
+                       int matrixStride) override;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorblocklayoutHLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/blocklayoutHLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -113,9 +113,14 @@
</span><span class="cx"> {
</span><span class="cx">     switch (outputType)
</span><span class="cx">     {
</span><del>-      case SH_HLSL9_OUTPUT: return ENCODE_LOOSE;
-      case SH_HLSL11_OUTPUT: return ENCODE_PACKED;
-      default: UNREACHABLE(); return ENCODE_PACKED;
</del><ins>+        case SH_HLSL_3_0_OUTPUT:
+            return ENCODE_LOOSE;
+        case SH_HLSL_4_1_OUTPUT:
+        case SH_HLSL_4_0_FL9_3_OUTPUT:
+            return ENCODE_PACKED;
+        default:
+            UNREACHABLE();
+            return ENCODE_PACKED;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -156,6 +161,7 @@
</span><span class="cx"> unsigned int HLSLVariableRegisterCount(const Uniform &amp;variable, ShShaderOutput outputType)
</span><span class="cx"> {
</span><span class="cx">     HLSLBlockEncoder encoder(HLSLBlockEncoder::GetStrategyFor(outputType));
</span><ins>+    encoder.setTransposeMatrices(true);
</ins><span class="cx">     HLSLVariableRegisterCount(variable, &amp;encoder);
</span><span class="cx"> 
</span><span class="cx">     const size_t registerBytes = (encoder.BytesPerComponent * encoder.ComponentsPerRegister);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatordepgraphDependencyGraphcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraph.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraph.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraph.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -4,8 +4,6 @@
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><span class="cx"> 
</span><del>-#pragma warning(disable: 4718)
-
</del><span class="cx"> #include &quot;compiler/translator/depgraph/DependencyGraph.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/depgraph/DependencyGraphBuilder.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatordepgraphDependencyGraphh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraph.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraph.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraph.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -46,9 +46,10 @@
</span><span class="cx"> class TGraphParentNode : public TGraphNode {
</span><span class="cx"> public:
</span><span class="cx">     TGraphParentNode(TIntermNode* node) : TGraphNode(node) {}
</span><del>-    virtual ~TGraphParentNode() {}
</del><ins>+    ~TGraphParentNode() override {}
</ins><span class="cx">     void addDependentNode(TGraphNode* node) { if (node != this) mDependentNodes.insert(node); }
</span><del>-    virtual void traverse(TDependencyGraphTraverser* graphTraverser);
</del><ins>+    void traverse(TDependencyGraphTraverser *graphTraverser) override;
+
</ins><span class="cx"> private:
</span><span class="cx">     TGraphNodeSet mDependentNodes;
</span><span class="cx"> };
</span><span class="lines">@@ -61,10 +62,11 @@
</span><span class="cx">     TGraphArgument(TIntermAggregate* intermFunctionCall, int argumentNumber)
</span><span class="cx">         : TGraphParentNode(intermFunctionCall)
</span><span class="cx">         , mArgumentNumber(argumentNumber) {}
</span><del>-    virtual ~TGraphArgument() {}
</del><ins>+    ~TGraphArgument() override {}
</ins><span class="cx">     const TIntermAggregate* getIntermFunctionCall() const { return intermNode-&gt;getAsAggregate(); }
</span><span class="cx">     int getArgumentNumber() const { return mArgumentNumber; }
</span><del>-    virtual void traverse(TDependencyGraphTraverser* graphTraverser);
</del><ins>+    void traverse(TDependencyGraphTraverser *graphTraverser) override;
+
</ins><span class="cx"> private:
</span><span class="cx">     int mArgumentNumber;
</span><span class="cx"> };
</span><span class="lines">@@ -76,9 +78,9 @@
</span><span class="cx"> public:
</span><span class="cx">     TGraphFunctionCall(TIntermAggregate* intermFunctionCall)
</span><span class="cx">         : TGraphParentNode(intermFunctionCall) {}
</span><del>-    virtual ~TGraphFunctionCall() {}
</del><ins>+    ~TGraphFunctionCall() override {}
</ins><span class="cx">     const TIntermAggregate* getIntermFunctionCall() const { return intermNode-&gt;getAsAggregate(); }
</span><del>-    virtual void traverse(TDependencyGraphTraverser* graphTraverser);
</del><ins>+    void traverse(TDependencyGraphTraverser *graphTraverser) override;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -87,9 +89,9 @@
</span><span class="cx"> class TGraphSymbol : public TGraphParentNode {
</span><span class="cx"> public:
</span><span class="cx">     TGraphSymbol(TIntermSymbol* intermSymbol) : TGraphParentNode(intermSymbol) {}
</span><del>-    virtual ~TGraphSymbol() {}
</del><ins>+    ~TGraphSymbol() override {}
</ins><span class="cx">     const TIntermSymbol* getIntermSymbol() const { return intermNode-&gt;getAsSymbolNode(); }
</span><del>-    virtual void traverse(TDependencyGraphTraverser* graphTraverser);
</del><ins>+    void traverse(TDependencyGraphTraverser *graphTraverser) override;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -98,9 +100,9 @@
</span><span class="cx"> class TGraphSelection : public TGraphNode {
</span><span class="cx"> public:
</span><span class="cx">     TGraphSelection(TIntermSelection* intermSelection) : TGraphNode(intermSelection) {}
</span><del>-    virtual ~TGraphSelection() {}
</del><ins>+    ~TGraphSelection() override {}
</ins><span class="cx">     const TIntermSelection* getIntermSelection() const { return intermNode-&gt;getAsSelectionNode(); }
</span><del>-    virtual void traverse(TDependencyGraphTraverser* graphTraverser);
</del><ins>+    void traverse(TDependencyGraphTraverser *graphTraverser) override;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -109,9 +111,9 @@
</span><span class="cx"> class TGraphLoop : public TGraphNode {
</span><span class="cx"> public:
</span><span class="cx">     TGraphLoop(TIntermLoop* intermLoop) : TGraphNode(intermLoop) {}
</span><del>-    virtual ~TGraphLoop() {}
</del><ins>+    ~TGraphLoop() override {}
</ins><span class="cx">     const TIntermLoop* getIntermLoop() const { return intermNode-&gt;getAsLoopNode(); }
</span><del>-    virtual void traverse(TDependencyGraphTraverser* graphTraverser);
</del><ins>+    void traverse(TDependencyGraphTraverser *graphTraverser) override;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -120,10 +122,10 @@
</span><span class="cx"> class TGraphLogicalOp : public TGraphNode {
</span><span class="cx"> public:
</span><span class="cx">     TGraphLogicalOp(TIntermBinary* intermLogicalOp) : TGraphNode(intermLogicalOp) {}
</span><del>-    virtual ~TGraphLogicalOp() {}
</del><ins>+    ~TGraphLogicalOp() override {}
</ins><span class="cx">     const TIntermBinary* getIntermLogicalOp() const { return intermNode-&gt;getAsBinaryNode(); }
</span><span class="cx">     const char* getOpString() const;
</span><del>-    virtual void traverse(TDependencyGraphTraverser* graphTraverser);
</del><ins>+    void traverse(TDependencyGraphTraverser *graphTraverser) override;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -140,29 +142,13 @@
</span><span class="cx"> public:
</span><span class="cx">     TDependencyGraph(TIntermNode* intermNode);
</span><span class="cx">     ~TDependencyGraph();
</span><del>-    TGraphNodeVector::const_iterator begin() const { return mAllNodes.begin(); }
-    TGraphNodeVector::const_iterator end() const { return mAllNodes.end(); }
-
-    TGraphSymbolVector::const_iterator beginSamplerSymbols() const
</del><ins>+    const TGraphNodeVector &amp;allNodes() const { return mAllNodes; }
+    const TGraphSymbolVector &amp;samplerSymbols() const { return mSamplerSymbols; }
+    const TFunctionCallVector &amp;userDefinedFunctionCalls() const
</ins><span class="cx">     {
</span><del>-        return mSamplerSymbols.begin();
</del><ins>+        return mUserDefinedFunctionCalls;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TGraphSymbolVector::const_iterator endSamplerSymbols() const
-    {
-        return mSamplerSymbols.end();
-    }
-
-    TFunctionCallVector::const_iterator beginUserDefinedFunctionCalls() const
-    {
-        return mUserDefinedFunctionCalls.begin();
-    }
-
-    TFunctionCallVector::const_iterator endUserDefinedFunctionCalls() const
-    {
-        return mUserDefinedFunctionCalls.end();
-    }
-
</del><span class="cx">     TGraphArgument* createArgument(TIntermAggregate* intermFunctionCall, int argumentNumber);
</span><span class="cx">     TGraphFunctionCall* createFunctionCall(TIntermAggregate* intermFunctionCall);
</span><span class="cx">     TGraphSymbol* getOrCreateSymbol(TIntermSymbol* intermSymbol);
</span><span class="lines">@@ -189,6 +175,7 @@
</span><span class="cx"> class TDependencyGraphTraverser : angle::NonCopyable {
</span><span class="cx"> public:
</span><span class="cx">     TDependencyGraphTraverser() : mDepth(0) {}
</span><ins>+    virtual ~TDependencyGraphTraverser() {}
</ins><span class="cx"> 
</span><span class="cx">     virtual void visitSymbol(TGraphSymbol* symbol) {};
</span><span class="cx">     virtual void visitArgument(TGraphArgument* selection) {};
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatordepgraphDependencyGraphBuilderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraphBuilder.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraphBuilder.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraphBuilder.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,11 +18,11 @@
</span><span class="cx">   public:
</span><span class="cx">     static void build(TIntermNode *node, TDependencyGraph *graph);
</span><span class="cx"> 
</span><del>-    virtual void visitSymbol(TIntermSymbol *);
-    virtual bool visitBinary(Visit visit, TIntermBinary *);
-    virtual bool visitSelection(Visit visit, TIntermSelection *);
-    virtual bool visitAggregate(Visit visit, TIntermAggregate *);
-    virtual bool visitLoop(Visit visit, TIntermLoop *);
</del><ins>+    void visitSymbol(TIntermSymbol *) override;
+    bool visitBinary(Visit visit, TIntermBinary *) override;
+    bool visitSelection(Visit visit, TIntermSelection *) override;
+    bool visitAggregate(Visit visit, TIntermAggregate *) override;
+    bool visitLoop(Visit visit, TIntermLoop *) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     typedef std::stack&lt;TGraphSymbol *&gt; TSymbolStack;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatordepgraphDependencyGraphOutputcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraphOutput.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraphOutput.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/depgraph/DependencyGraphOutput.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -54,9 +54,8 @@
</span><span class="cx"> {
</span><span class="cx">     mSink &lt;&lt; &quot;\n&quot;;
</span><span class="cx"> 
</span><del>-    for (TGraphNodeVector::const_iterator iter = graph.begin(); iter != graph.end(); ++iter)
</del><ins>+    for (auto symbol : graph.allNodes())
</ins><span class="cx">     {
</span><del>-        TGraphNode* symbol = *iter;
</del><span class="cx">         mSink &lt;&lt; &quot;--- Dependency graph spanning tree ---\n&quot;;
</span><span class="cx">         clearVisited();
</span><span class="cx">         symbol-&gt;traverse(this);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorgenerate_parsersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/generate_parser.sh (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/generate_parser.sh        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/generate_parser.sh        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,22 +7,23 @@
</span><span class="cx"> 
</span><span class="cx"> run_flex()
</span><span class="cx"> {
</span><del>-input_file=$script_dir/$1.l
-output_source=$script_dir/$1_lex.cpp
</del><ins>+input_file=./$1.l
+output_source=./$1_lex.cpp
</ins><span class="cx"> flex --noline --nounistd --outfile=$output_source $input_file
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> run_bison()
</span><span class="cx"> {
</span><del>-input_file=$script_dir/$1.y
-output_header=$script_dir/$1_tab.h
-output_source=$script_dir/$1_tab.cpp
</del><ins>+input_file=./$1.y
+output_header=./$1_tab.h
+output_source=./$1_tab.cpp
</ins><span class="cx"> bison --no-lines --skeleton=yacc.c --defines=$output_header --output=$output_source $input_file
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> script_dir=$(dirname $0)
</span><span class="cx"> 
</span><span class="cx"> # Generate Parser
</span><ins>+cd $script_dir
</ins><span class="cx"> run_flex glslang
</span><span class="cx"> run_bison glslang
</span><span class="cx"> patch --silent --forward &lt; 64bit-lexer-safety.patch
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorglslangh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,7 +7,7 @@
</span><span class="cx"> #ifndef COMPILER_TRANSLATOR_GLSLANG_H_
</span><span class="cx"> #define COMPILER_TRANSLATOR_GLSLANG_H_
</span><span class="cx"> 
</span><del>-struct TParseContext;
</del><ins>+class TParseContext;
</ins><span class="cx"> extern int glslang_initialize(TParseContext* context);
</span><span class="cx"> extern int glslang_finalize(TParseContext* context);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorglslangl"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.l (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.l        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.l        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -72,7 +72,7 @@
</span><span class="cx"> static int ES2_keyword_ES3_reserved(TParseContext *context, int token);
</span><span class="cx"> static int ES2_ident_ES3_keyword(TParseContext *context, int token);
</span><span class="cx"> static int uint_constant(TParseContext *context);
</span><del>-static int int_constant(yyscan_t yyscanner);
</del><ins>+static int int_constant(TParseContext *context);
</ins><span class="cx"> static int float_constant(yyscan_t yyscanner);
</span><span class="cx"> static int floatsuffix_check(TParseContext* context);
</span><span class="cx"> %}
</span><span class="lines">@@ -246,7 +246,7 @@
</span><span class="cx"> &quot;sampler2DMSArray&quot;  |
</span><span class="cx"> &quot;isampler2DMSArray&quot; |
</span><span class="cx"> &quot;usampler2DMSArray&quot; { 
</span><del>-    if (context-&gt;shaderVersion &lt; 300) {
</del><ins>+    if (context-&gt;getShaderVersion() &lt; 300) {
</ins><span class="cx">                 yylval-&gt;lex.string = NewPoolTString(yytext); 
</span><span class="cx">             return check_type(yyscanner); 
</span><span class="cx">         }
</span><span class="lines">@@ -255,7 +255,7 @@
</span><span class="cx"> 
</span><span class="cx">     /* Reserved keywords in GLSL ES 1.00 that are not reserved in GLSL ES 3.00 */
</span><span class="cx"> &quot;packed&quot;  {
</span><del>-    if (context-&gt;shaderVersion &gt;= 300)
</del><ins>+    if (context-&gt;getShaderVersion() &gt;= 300)
</ins><span class="cx">     {
</span><span class="cx">         yylval-&gt;lex.string = NewPoolTString(yytext);
</span><span class="cx">         return check_type(yyscanner);
</span><span class="lines">@@ -321,9 +321,9 @@
</span><span class="cx">    return check_type(yyscanner);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-0[xX]{H}+         { return int_constant(yyscanner); }
-0{O}+             { return int_constant(yyscanner); }
-{D}+              { return int_constant(yyscanner); }
</del><ins>+0[xX]{H}+         { return int_constant(context); }
+0{O}+             { return int_constant(context); }
+{D}+              { return int_constant(context); }
</ins><span class="cx"> 
</span><span class="cx"> 0[xX]{H}+[uU]     { return uint_constant(context); }
</span><span class="cx"> 0{O}+[uU]         { return uint_constant(context); }
</span><span class="lines">@@ -390,16 +390,21 @@
</span><span class="cx">     return FIELD_SELECTION;
</span><span class="cx"> }
</span><span class="cx"> &lt;FIELDS&gt;[ \t\v\f\r] {}
</span><ins>+&lt;FIELDS&gt;. {
+    yyextra-&gt;error(*yylloc, &quot;Illegal character at fieldname start&quot;, yytext, &quot;&quot;);
+    yyextra-&gt;recover();
+    return 0;
+}
</ins><span class="cx"> 
</span><span class="cx"> [ \t\v\n\f\r] { }
</span><span class="cx"> &lt;*&gt;&lt;&lt;EOF&gt;&gt;    { yyterminate(); }
</span><del>-&lt;*&gt;.          { return 0; }
</del><ins>+&lt;*&gt;.          { assert(false); return 0; }
</ins><span class="cx"> 
</span><span class="cx"> %%
</span><span class="cx"> 
</span><span class="cx"> yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) {
</span><span class="cx">     pp::Token token;
</span><del>-    yyget_extra(yyscanner)-&gt;preprocessor.lex(&amp;token);
</del><ins>+    yyget_extra(yyscanner)-&gt;getPreprocessor().lex(&amp;token);
</ins><span class="cx">     yy_size_t len = token.type == pp::Token::LAST ? 0 : token.text.size();
</span><span class="cx">     if (len &lt; max_size)
</span><span class="cx">         memcpy(buf, token.text.c_str(), len);
</span><span class="lines">@@ -417,7 +422,7 @@
</span><span class="cx">     struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
</span><span class="cx">     
</span><span class="cx">     int token = IDENTIFIER;
</span><del>-    TSymbol* symbol = yyextra-&gt;symbolTable.find(yytext, yyextra-&gt;shaderVersion);
</del><ins>+    TSymbol* symbol = yyextra-&gt;symbolTable.find(yytext, yyextra-&gt;getShaderVersion());
</ins><span class="cx">     if (symbol &amp;&amp; symbol-&gt;isVariable()) {
</span><span class="cx">         TVariable* variable = static_cast&lt;TVariable*&gt;(symbol);
</span><span class="cx">         if (variable-&gt;isUserType()) {
</span><span class="lines">@@ -438,9 +443,9 @@
</span><span class="cx"> 
</span><span class="cx"> int ES2_reserved_ES3_keyword(TParseContext *context, int token)
</span><span class="cx"> {
</span><del>-    yyscan_t yyscanner = (yyscan_t) context-&gt;scanner;
</del><ins>+    yyscan_t yyscanner = (yyscan_t) context-&gt;getScanner();
</ins><span class="cx"> 
</span><del>-    if (context-&gt;shaderVersion &lt; 300)
</del><ins>+    if (context-&gt;getShaderVersion() &lt; 300)
</ins><span class="cx">     {
</span><span class="cx">         return reserved_word(yyscanner);
</span><span class="cx">     }
</span><span class="lines">@@ -450,9 +455,9 @@
</span><span class="cx"> 
</span><span class="cx"> int ES2_keyword_ES3_reserved(TParseContext *context, int token)
</span><span class="cx"> {
</span><del>-    yyscan_t yyscanner = (yyscan_t) context-&gt;scanner;
</del><ins>+    yyscan_t yyscanner = (yyscan_t) context-&gt;getScanner();
</ins><span class="cx"> 
</span><del>-    if (context-&gt;shaderVersion &gt;= 300)
</del><ins>+    if (context-&gt;getShaderVersion() &gt;= 300)
</ins><span class="cx">     {
</span><span class="cx">         return reserved_word(yyscanner);
</span><span class="cx">     }
</span><span class="lines">@@ -462,11 +467,11 @@
</span><span class="cx"> 
</span><span class="cx"> int ES2_ident_ES3_keyword(TParseContext *context, int token)
</span><span class="cx"> {
</span><del>-    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;scanner;
-    yyscan_t yyscanner = (yyscan_t) context-&gt;scanner;
</del><ins>+    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;getScanner();
+    yyscan_t yyscanner = (yyscan_t) context-&gt;getScanner();
</ins><span class="cx"> 
</span><span class="cx">     // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name
</span><del>-    if (context-&gt;shaderVersion &lt; 300)
</del><ins>+    if (context-&gt;getShaderVersion() &lt; 300)
</ins><span class="cx">     {
</span><span class="cx">         yylval-&gt;lex.string = NewPoolTString(yytext);
</span><span class="cx">         return check_type(yyscanner);
</span><span class="lines">@@ -477,34 +482,35 @@
</span><span class="cx"> 
</span><span class="cx"> int uint_constant(TParseContext *context)
</span><span class="cx"> {
</span><del>-    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;scanner;
-    yyscan_t yyscanner = (yyscan_t) context-&gt;scanner;
</del><ins>+    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;getScanner();
</ins><span class="cx"> 
</span><del>-    if (context-&gt;shaderVersion &lt; 300)
</del><ins>+    if (context-&gt;getShaderVersion() &lt; 300)
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;error(*yylloc, &quot;Unsigned integers are unsupported prior to GLSL ES 3.00&quot;, yytext, &quot;&quot;);
</span><span class="cx">         context-&gt;recover();
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!atoi_clamp(yytext, &amp;(yylval-&gt;lex.i)))
-        yyextra-&gt;warning(*yylloc, &quot;Integer overflow&quot;, yytext, &quot;&quot;);
</del><ins>+    if (!atoi_clamp(yytext, &amp;(yylval-&gt;lex.u)))
+        yyextra-&gt;error(*yylloc, &quot;Integer overflow&quot;, yytext, &quot;&quot;);
</ins><span class="cx"> 
</span><span class="cx">     return UINTCONSTANT;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int floatsuffix_check(TParseContext* context)
</span><span class="cx"> {
</span><del>-    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;scanner;
</del><ins>+    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;getScanner();
</ins><span class="cx"> 
</span><del>-    if (context-&gt;shaderVersion &lt; 300)
</del><ins>+    if (context-&gt;getShaderVersion() &lt; 300)
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;error(*yylloc, &quot;Floating-point suffix unsupported prior to GLSL ES 3.00&quot;, yytext);
</span><span class="cx">         context-&gt;recover();
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!atof_clamp(yytext, &amp;(yylval-&gt;lex.f)))
</del><ins>+    std::string text = yytext;
+    text.resize(text.size() - 1);
+    if (!strtof_clamp(text, &amp;(yylval-&gt;lex.f)))
</ins><span class="cx">         yyextra-&gt;warning(*yylloc, &quot;Float overflow&quot;, yytext, &quot;&quot;);
</span><span class="cx"> 
</span><span class="cx">     return(FLOATCONSTANT);
</span><span class="lines">@@ -515,18 +521,25 @@
</span><span class="cx">     context-&gt;recover();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-int int_constant(yyscan_t yyscanner) {
-    struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
</del><ins>+int int_constant(TParseContext *context) {
+    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;getScanner();
</ins><span class="cx"> 
</span><del>-    if (!atoi_clamp(yytext, &amp;(yylval-&gt;lex.i)))
-        yyextra-&gt;warning(*yylloc, &quot;Integer overflow&quot;, yytext, &quot;&quot;);
</del><ins>+    unsigned int u;
+    if (!atoi_clamp(yytext, &amp;u))
+    {
+        if (context-&gt;getShaderVersion() &gt;= 300)
+            yyextra-&gt;error(*yylloc, &quot;Integer overflow&quot;, yytext, &quot;&quot;);
+        else
+            yyextra-&gt;warning(*yylloc, &quot;Integer overflow&quot;, yytext, &quot;&quot;);
+    }
+    yylval-&gt;lex.i = static_cast&lt;int&gt;(u);
</ins><span class="cx">     return INTCONSTANT;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int float_constant(yyscan_t yyscanner) {
</span><span class="cx">     struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
</span><span class="cx"> 
</span><del>-    if (!atof_clamp(yytext, &amp;(yylval-&gt;lex.f)))
</del><ins>+    if (!strtof_clamp(yytext, &amp;(yylval-&gt;lex.f)))
</ins><span class="cx">         yyextra-&gt;warning(*yylloc, &quot;Float overflow&quot;, yytext, &quot;&quot;);
</span><span class="cx">     return FLOATCONSTANT;
</span><span class="cx"> }
</span><span class="lines">@@ -536,15 +549,15 @@
</span><span class="cx">     if (yylex_init_extra(context, &amp;scanner))
</span><span class="cx">         return 1;
</span><span class="cx"> 
</span><del>-    context-&gt;scanner = scanner;
</del><ins>+    context-&gt;setScanner(scanner);
</ins><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int glslang_finalize(TParseContext* context) {
</span><del>-    yyscan_t scanner = context-&gt;scanner;
</del><ins>+    yyscan_t scanner = context-&gt;getScanner();
</ins><span class="cx">     if (scanner == NULL) return 0;
</span><span class="cx">     
</span><del>-    context-&gt;scanner = NULL;
</del><ins>+    context-&gt;setScanner(NULL);
</ins><span class="cx">     yylex_destroy(scanner);
</span><span class="cx"> 
</span><span class="cx">     return 0;
</span><span class="lines">@@ -552,24 +565,26 @@
</span><span class="cx"> 
</span><span class="cx"> int glslang_scan(size_t count, const char* const string[], const int length[],
</span><span class="cx">                  TParseContext* context) {
</span><del>-    yyrestart(NULL, context-&gt;scanner);
-    yyset_column(0, context-&gt;scanner);
-    yyset_lineno(1, context-&gt;scanner);
</del><ins>+    yyrestart(NULL, context-&gt;getScanner());
+    yyset_column(0, context-&gt;getScanner());
+    yyset_lineno(1, context-&gt;getScanner());
</ins><span class="cx"> 
</span><span class="cx">     // Initialize preprocessor.
</span><del>-    if (!context-&gt;preprocessor.init(count, string, length))
</del><ins>+    pp::Preprocessor *preprocessor = &amp;context-&gt;getPreprocessor();
+
+    if (!preprocessor-&gt;init(count, string, length))
</ins><span class="cx">         return 1;
</span><span class="cx"> 
</span><span class="cx">     // Define extension macros.
</span><span class="cx">     const TExtensionBehavior&amp; extBehavior = context-&gt;extensionBehavior();
</span><span class="cx">     for (TExtensionBehavior::const_iterator iter = extBehavior.begin();
</span><span class="cx">          iter != extBehavior.end(); ++iter) {
</span><del>-        context-&gt;preprocessor.predefineMacro(iter-&gt;first.c_str(), 1);
</del><ins>+        preprocessor-&gt;predefineMacro(iter-&gt;first.c_str(), 1);
</ins><span class="cx">     }
</span><del>-    if (context-&gt;fragmentPrecisionHigh)
-        context-&gt;preprocessor.predefineMacro(&quot;GL_FRAGMENT_PRECISION_HIGH&quot;, 1);
</del><ins>+    if (context-&gt;getFragmentPrecisionHigh())
+        preprocessor-&gt;predefineMacro(&quot;GL_FRAGMENT_PRECISION_HIGH&quot;, 1);
</ins><span class="cx"> 
</span><del>-    context-&gt;preprocessor.setMaxTokenSize(GetGlobalMaxTokenSize(context-&gt;shaderSpec));
</del><ins>+    preprocessor-&gt;setMaxTokenSize(GetGlobalMaxTokenSize(context-&gt;getShaderSpec()));
</ins><span class="cx"> 
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorglslangy"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.y (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.y        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang.y        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><ins>+#include &quot;compiler/translator/Cache.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/ParseContext.h&quot;
</span><span class="cx"> #include &quot;GLSLANG/ShaderLang.h&quot;
</span><span class="lines">@@ -110,28 +111,28 @@
</span><span class="cx">   } while (0)
</span><span class="cx"> 
</span><span class="cx"> #define VERTEX_ONLY(S, L) {  \
</span><del>-    if (context-&gt;shaderType != GL_VERTEX_SHADER) {  \
</del><ins>+    if (context-&gt;getShaderType() != GL_VERTEX_SHADER) {  \
</ins><span class="cx">         context-&gt;error(L, &quot; supported in vertex shaders only &quot;, S);  \
</span><span class="cx">         context-&gt;recover();  \
</span><span class="cx">     }  \
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #define FRAG_ONLY(S, L) {  \
</span><del>-    if (context-&gt;shaderType != GL_FRAGMENT_SHADER) {  \
</del><ins>+    if (context-&gt;getShaderType() != GL_FRAGMENT_SHADER) {  \
</ins><span class="cx">         context-&gt;error(L, &quot; supported in fragment shaders only &quot;, S);  \
</span><span class="cx">         context-&gt;recover();  \
</span><span class="cx">     }  \
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #define ES2_ONLY(S, L) {  \
</span><del>-    if (context-&gt;shaderVersion != 100) {  \
</del><ins>+    if (context-&gt;getShaderVersion() != 100) {  \
</ins><span class="cx">         context-&gt;error(L, &quot; supported in GLSL ES 1.00 only &quot;, S);  \
</span><span class="cx">         context-&gt;recover();  \
</span><span class="cx">     }  \
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #define ES3_ONLY(TOKEN, LINE, REASON) {  \
</span><del>-    if (context-&gt;shaderVersion != 300) {  \
</del><ins>+    if (context-&gt;getShaderVersion() != 300) {  \
</ins><span class="cx">         context-&gt;error(LINE, REASON &quot; supported in GLSL ES 3.00 only &quot;, TOKEN);  \
</span><span class="cx">         context-&gt;recover();  \
</span><span class="cx">     }  \
</span><span class="lines">@@ -177,10 +178,10 @@
</span><span class="cx"> 
</span><span class="cx"> %type &lt;interm.intermNode&gt; translation_unit function_definition
</span><span class="cx"> %type &lt;interm.intermNode&gt; statement simple_statement
</span><del>-%type &lt;interm.intermAggregate&gt;  statement_list compound_statement
</del><ins>+%type &lt;interm.intermAggregate&gt;  statement_list compound_statement compound_statement_no_new_scope
</ins><span class="cx"> %type &lt;interm.intermNode&gt; declaration_statement selection_statement expression_statement
</span><span class="cx"> %type &lt;interm.intermNode&gt; declaration external_declaration
</span><del>-%type &lt;interm.intermNode&gt; for_init_statement compound_statement_no_new_scope
</del><ins>+%type &lt;interm.intermNode&gt; for_init_statement
</ins><span class="cx"> %type &lt;interm.nodePair&gt; selection_rest_statement for_rest_statement
</span><span class="cx"> %type &lt;interm.intermSwitch&gt; switch_statement
</span><span class="cx"> %type &lt;interm.intermCase&gt; case_label
</span><span class="lines">@@ -214,22 +215,8 @@
</span><span class="cx"> variable_identifier
</span><span class="cx">     : IDENTIFIER {
</span><span class="cx">         // The symbol table search was done in the lexical phase
</span><del>-        const TVariable *variable = context-&gt;getNamedVariable(@1, $1.string, $1.symbol);
</del><ins>+        $$ = context-&gt;parseVariableIdentifier(@1, $1.string, $1.symbol);
</ins><span class="cx"> 
</span><del>-        if (variable-&gt;getType().getQualifier() == EvqConst)
-        {
-            TConstantUnion* constArray = variable-&gt;getConstPointer();
-            TType t(variable-&gt;getType());
-            $$ = context-&gt;intermediate.addConstantUnion(constArray, t, @1);
-        }
-        else
-        {
-            $$ = context-&gt;intermediate.addSymbol(variable-&gt;getUniqueId(),
-                                                 variable-&gt;getName(),
-                                                 variable-&gt;getType(),
-                                                 @1);
-        }
-
</del><span class="cx">         // don't delete $1.string, it's used by error recovery, and the pool
</span><span class="cx">         // pop will reclaim the memory
</span><span class="cx">     }
</span><span class="lines">@@ -338,14 +325,14 @@
</span><span class="cx"> 
</span><span class="cx"> function_call_header_with_parameters
</span><span class="cx">     : function_call_header assignment_expression {
</span><del>-        TParameter param = { 0, new TType($2-&gt;getType()) };
-        $1-&gt;addParameter(param);
</del><ins>+        const TType *type = new TType($2-&gt;getType());
+        $1-&gt;addParameter(TConstParameter(type));
</ins><span class="cx">         $$.function = $1;
</span><del>-        $$.nodePair.node1 = $2;
</del><ins>+        $$.nodePair.node1 = context-&gt;intermediate.makeAggregate($2, @2);
</ins><span class="cx">     }
</span><span class="cx">     | function_call_header_with_parameters COMMA assignment_expression {
</span><del>-        TParameter param = { 0, new TType($3-&gt;getType()) };
-        $1.function-&gt;addParameter(param);
</del><ins>+        const TType *type = new TType($3-&gt;getType());
+        $1.function-&gt;addParameter(TConstParameter(type));
</ins><span class="cx">         $$.function = $1.function;
</span><span class="cx">         $$.nodePair.node1 = context-&gt;intermediate.growAggregate($1.intermNode, $3, @2);
</span><span class="cx">     }
</span><span class="lines">@@ -369,14 +356,14 @@
</span><span class="cx">     | IDENTIFIER {
</span><span class="cx">         if (context-&gt;reservedErrorCheck(@1, *$1.string))
</span><span class="cx">             context-&gt;recover();
</span><del>-        TType type(EbtVoid, EbpUndefined);
</del><ins>+        const TType *type = TCache::getType(EbtVoid, EbpUndefined);
</ins><span class="cx">         TFunction *function = new TFunction($1.string, type);
</span><span class="cx">         $$ = function;
</span><span class="cx">     }
</span><span class="cx">     | FIELD_SELECTION {
</span><span class="cx">         if (context-&gt;reservedErrorCheck(@1, *$1.string))
</span><span class="cx">             context-&gt;recover();
</span><del>-        TType type(EbtVoid, EbpUndefined);
</del><ins>+        const TType *type = TCache::getType(EbtVoid, EbpUndefined);
</ins><span class="cx">         TFunction *function = new TFunction($1.string, type);
</span><span class="cx">         $$ = function;
</span><span class="cx">     }
</span><span class="lines">@@ -572,12 +559,7 @@
</span><span class="cx">         $$ = $1;
</span><span class="cx">     }
</span><span class="cx">     | expression COMMA assignment_expression {
</span><del>-        $$ = context-&gt;intermediate.addComma($1, $3, @2);
-        if ($$ == 0) {
-            context-&gt;binaryOpError(@2, &quot;,&quot;, $1-&gt;getCompleteString(), $3-&gt;getCompleteString());
-            context-&gt;recover();
-            $$ = $3;
-        }
</del><ins>+        $$ = context-&gt;addComma($1, $3, @2);
</ins><span class="cx">     }
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="lines">@@ -598,33 +580,8 @@
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="cx"> declaration
</span><del>-    : function_prototype SEMICOLON   {
-        TFunction &amp;function = *($1.function);
-        
-        TIntermAggregate *prototype = new TIntermAggregate;
-        prototype-&gt;setType(function.getReturnType());
-        prototype-&gt;setName(function.getMangledName());
-        prototype-&gt;setFunctionId(function.getUniqueId());
-        
-        for (size_t i = 0; i &lt; function.getParamCount(); i++)
-        {
-            const TParameter &amp;param = function.getParam(i);
-            if (param.name != 0)
-            {
-                TVariable variable(param.name, *param.type);
-                
-                prototype = context-&gt;intermediate.growAggregate(prototype, context-&gt;intermediate.addSymbol(variable.getUniqueId(), variable.getName(), variable.getType(), @1), @1);
-            }
-            else
-            {
-                prototype = context-&gt;intermediate.growAggregate(prototype, context-&gt;intermediate.addSymbol(0, &quot;&quot;, *param.type, @1), @1);
-            }
-        }
-        
-        prototype-&gt;setOp(EOpPrototype);
-        $$ = prototype;
-
-        context-&gt;symbolTable.pop();
</del><ins>+    : function_prototype SEMICOLON {
+        $$ = context-&gt;addFunctionPrototypeDeclaration(*($1.function), @1);
</ins><span class="cx">     }
</span><span class="cx">     | init_declarator_list SEMICOLON {
</span><span class="cx">         TIntermAggregate *aggNode = $1.intermAggregate;
</span><span class="lines">@@ -633,7 +590,7 @@
</span><span class="cx">         $$ = aggNode;
</span><span class="cx">     }
</span><span class="cx">     | PRECISION precision_qualifier type_specifier_no_prec SEMICOLON {
</span><del>-        if (($2 == EbpHigh) &amp;&amp; (context-&gt;shaderType == GL_FRAGMENT_SHADER) &amp;&amp; !context-&gt;fragmentPrecisionHigh) {
</del><ins>+        if (($2 == EbpHigh) &amp;&amp; (context-&gt;getShaderType() == GL_FRAGMENT_SHADER) &amp;&amp; !context-&gt;getFragmentPrecisionHigh()) {
</ins><span class="cx">             context-&gt;error(@1, &quot;precision is not supported in fragment shader&quot;, &quot;highp&quot;);
</span><span class="cx">             context-&gt;recover();
</span><span class="cx">         }
</span><span class="lines">@@ -663,57 +620,7 @@
</span><span class="cx"> 
</span><span class="cx"> function_prototype
</span><span class="cx">     : function_declarator RIGHT_PAREN  {
</span><del>-        //
-        // Multiple declarations of the same function are allowed.
-        //
-        // If this is a definition, the definition production code will check for redefinitions
-        // (we don't know at this point if it's a definition or not).
-        //
-        // Redeclarations are allowed.  But, return types and parameter qualifiers must match.
-        //
-        TFunction* prevDec = static_cast&lt;TFunction*&gt;(context-&gt;symbolTable.find($1-&gt;getMangledName(), context-&gt;shaderVersion));
-        if (prevDec) {
-            if (prevDec-&gt;getReturnType() != $1-&gt;getReturnType()) {
-                context-&gt;error(@2, &quot;overloaded functions must have the same return type&quot;, $1-&gt;getReturnType().getBasicString());
-                context-&gt;recover();
-            }
-            for (size_t i = 0; i &lt; prevDec-&gt;getParamCount(); ++i) {
-                if (prevDec-&gt;getParam(i).type-&gt;getQualifier() != $1-&gt;getParam(i).type-&gt;getQualifier()) {
-                    context-&gt;error(@2, &quot;overloaded functions must have the same parameter qualifiers&quot;, $1-&gt;getParam(i).type-&gt;getQualifierString());
-                    context-&gt;recover();
-                }
-            }
-        }
-
-        //
-        // Check for previously declared variables using the same name.
-        //
-        TSymbol *prevSym = context-&gt;symbolTable.find($1-&gt;getName(), context-&gt;shaderVersion);
-        if (prevSym)
-        {
-            if (!prevSym-&gt;isFunction())
-            {
-                context-&gt;error(@2, &quot;redefinition&quot;, $1-&gt;getName().c_str(), &quot;function&quot;);
-                context-&gt;recover();
-            }
-        }
-        else
-        {
-            // Insert the unmangled name to detect potential future redefinition as a variable.
-            TFunction *function = new TFunction(NewPoolTString($1-&gt;getName().c_str()), $1-&gt;getReturnType());
-            context-&gt;symbolTable.getOuterLevel()-&gt;insertUnmangled(function);
-        }
-
-        //
-        // If this is a redeclaration, it could also be a definition,
-        // in which case, we want to use the variable names from this one, and not the one that's
-        // being redeclared.  So, pass back up this declaration, not the one in the symbol table.
-        //
-        $$.function = $1;
-
-        // We're at the inner scope level of the function's arguments and body statement.
-        // Add the function prototype to the surrounding scope instead.
-        context-&gt;symbolTable.getOuterLevel()-&gt;insert($$.function);
</del><ins>+        $$.function = context-&gt;parseFunctionDeclarator(@2, $1);
</ins><span class="cx">     }
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="lines">@@ -732,7 +639,7 @@
</span><span class="cx">         // Add the parameter
</span><span class="cx">         $$ = $1;
</span><span class="cx">         if ($2.param.type-&gt;getBasicType() != EbtVoid)
</span><del>-            $1-&gt;addParameter($2.param);
</del><ins>+            $1-&gt;addParameter($2.param.turnToConst());
</ins><span class="cx">         else
</span><span class="cx">             delete $2.param.type;
</span><span class="cx">     }
</span><span class="lines">@@ -751,24 +658,30 @@
</span><span class="cx">         } else {
</span><span class="cx">             // Add the parameter
</span><span class="cx">             $$ = $1;
</span><del>-            $1-&gt;addParameter($3.param);
</del><ins>+            $1-&gt;addParameter($3.param.turnToConst());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="cx"> function_header
</span><span class="cx">     : fully_specified_type IDENTIFIER LEFT_PAREN {
</span><del>-        if ($1.qualifier != EvqGlobal &amp;&amp; $1.qualifier != EvqTemporary) {
</del><ins>+        if ($1.qualifier != EvqGlobal &amp;&amp; $1.qualifier != EvqTemporary)
+        {
</ins><span class="cx">             context-&gt;error(@2, &quot;no qualifiers allowed for function return&quot;, getQualifierString($1.qualifier));
</span><span class="cx">             context-&gt;recover();
</span><span class="cx">         }
</span><ins>+        if (!$1.layoutQualifier.isEmpty())
+        {
+            context-&gt;error(@2, &quot;no qualifiers allowed for function return&quot;, &quot;layout&quot;);
+            context-&gt;recover();
+        }
</ins><span class="cx">         // make sure a sampler is not involved as well...
</span><span class="cx">         if (context-&gt;samplerErrorCheck(@2, $1, &quot;samplers can't be function return values&quot;))
</span><span class="cx">             context-&gt;recover();
</span><span class="cx"> 
</span><span class="cx">         // Add the function as a prototype after parsing it (we do not support recursion)
</span><span class="cx">         TFunction *function;
</span><del>-        TType type($1);
</del><ins>+        const TType *type = new TType($1);
</ins><span class="cx">         function = new TFunction($2.string, type);
</span><span class="cx">         $$ = function;
</span><span class="cx">         
</span><span class="lines">@@ -934,13 +847,13 @@
</span><span class="cx"> 
</span><span class="cx">         if ($1.array) {
</span><span class="cx">             ES3_ONLY(&quot;[]&quot;, @1, &quot;first-class-array&quot;);
</span><del>-            if (context-&gt;shaderVersion != 300) {
</del><ins>+            if (context-&gt;getShaderVersion() != 300) {
</ins><span class="cx">                 $1.clearArrayness();
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     | type_qualifier type_specifier  {
</span><del>-        $$ = context-&gt;addFullySpecifiedType($1.qualifier, $1.layoutQualifier, $2);
</del><ins>+        $$ = context-&gt;addFullySpecifiedType($1.qualifier, $1.invariant, $1.layoutQualifier, $2);
</ins><span class="cx">     }
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="lines">@@ -971,7 +884,7 @@
</span><span class="cx">         ES2_ONLY(&quot;varying&quot;, @1);
</span><span class="cx">         if (context-&gt;globalErrorCheck(@1, context-&gt;symbolTable.atGlobalLevel(), &quot;varying&quot;))
</span><span class="cx">             context-&gt;recover();
</span><del>-        if (context-&gt;shaderType == GL_VERTEX_SHADER)
</del><ins>+        if (context-&gt;getShaderType() == GL_VERTEX_SHADER)
</ins><span class="cx">             $$.setBasic(EbtVoid, EvqVaryingOut, @1);
</span><span class="cx">         else
</span><span class="cx">             $$.setBasic(EbtVoid, EvqVaryingIn, @1);
</span><span class="lines">@@ -980,18 +893,19 @@
</span><span class="cx">         ES2_ONLY(&quot;varying&quot;, @1);
</span><span class="cx">         if (context-&gt;globalErrorCheck(@1, context-&gt;symbolTable.atGlobalLevel(), &quot;invariant varying&quot;))
</span><span class="cx">             context-&gt;recover();
</span><del>-        if (context-&gt;shaderType == GL_VERTEX_SHADER)
-            $$.setBasic(EbtVoid, EvqInvariantVaryingOut, @1);
</del><ins>+        if (context-&gt;getShaderType() == GL_VERTEX_SHADER)
+            $$.setBasic(EbtVoid, EvqVaryingOut, @1);
</ins><span class="cx">         else
</span><del>-            $$.setBasic(EbtVoid, EvqInvariantVaryingIn, @1);
</del><ins>+            $$.setBasic(EbtVoid, EvqVaryingIn, @1);
+        $$.invariant = true;
</ins><span class="cx">     }
</span><span class="cx">     | storage_qualifier {
</span><del>-        if ($1.qualifier != EvqConst &amp;&amp; !context-&gt;symbolTable.atGlobalLevel()) {
</del><ins>+        if ($1.qualifier != EvqConst &amp;&amp; !context-&gt;symbolTable.atGlobalLevel())
+        {
</ins><span class="cx">             context-&gt;error(@1, &quot;Local variables can only use the const storage qualifier.&quot;, getQualifierString($1.qualifier));
</span><span class="cx">             context-&gt;recover();
</span><del>-        } else {
-            $$.setBasic(EbtVoid, $1.qualifier, @1);
</del><span class="cx">         }
</span><ins>+        $$.setBasic(EbtVoid, $1.qualifier, @1);
</ins><span class="cx">     }
</span><span class="cx">     | interpolation_qualifier storage_qualifier {
</span><span class="cx">         $$ = context-&gt;joinInterpolationQualifiers(@1, $1.qualifier, @2, $2.qualifier);
</span><span class="lines">@@ -1011,6 +925,16 @@
</span><span class="cx">         $$.setBasic(EbtVoid, $2.qualifier, @2);
</span><span class="cx">         $$.layoutQualifier = $1;
</span><span class="cx">     }
</span><ins>+    | INVARIANT storage_qualifier {
+        context-&gt;es3InvariantErrorCheck($2.qualifier, @1);
+        $$.setBasic(EbtVoid, $2.qualifier, @2);
+        $$.invariant = true;
+    }
+    | INVARIANT interpolation_qualifier storage_qualifier {
+        context-&gt;es3InvariantErrorCheck($3.qualifier, @1);
+        $$ = context-&gt;joinInterpolationQualifiers(@2, $2.qualifier, @3, $3.qualifier);
+        $$.invariant = true;
+    }
</ins><span class="cx">     ;
</span><span class="cx"> 
</span><span class="cx"> storage_qualifier
</span><span class="lines">@@ -1019,29 +943,29 @@
</span><span class="cx">     }
</span><span class="cx">     | IN_QUAL {
</span><span class="cx">         ES3_ONLY(&quot;in&quot;, @1, &quot;storage qualifier&quot;);
</span><del>-        $$.qualifier = (context-&gt;shaderType == GL_FRAGMENT_SHADER) ? EvqFragmentIn : EvqVertexIn;
</del><ins>+        $$.qualifier = (context-&gt;getShaderType() == GL_FRAGMENT_SHADER) ? EvqFragmentIn : EvqVertexIn;
</ins><span class="cx">     }
</span><span class="cx">     | OUT_QUAL {
</span><span class="cx">         ES3_ONLY(&quot;out&quot;, @1, &quot;storage qualifier&quot;);
</span><del>-        $$.qualifier = (context-&gt;shaderType == GL_FRAGMENT_SHADER) ? EvqFragmentOut : EvqVertexOut;
</del><ins>+        $$.qualifier = (context-&gt;getShaderType() == GL_FRAGMENT_SHADER) ? EvqFragmentOut : EvqVertexOut;
</ins><span class="cx">     }
</span><span class="cx">     | CENTROID IN_QUAL {
</span><span class="cx">         ES3_ONLY(&quot;centroid in&quot;, @1, &quot;storage qualifier&quot;);
</span><del>-        if (context-&gt;shaderType == GL_VERTEX_SHADER)
</del><ins>+        if (context-&gt;getShaderType() == GL_VERTEX_SHADER)
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;error(@1, &quot;invalid storage qualifier&quot;, &quot;it is an error to use 'centroid in' in the vertex shader&quot;);
</span><span class="cx">             context-&gt;recover();
</span><span class="cx">         }
</span><del>-        $$.qualifier = (context-&gt;shaderType == GL_FRAGMENT_SHADER) ? EvqCentroidIn : EvqVertexIn;
</del><ins>+        $$.qualifier = (context-&gt;getShaderType() == GL_FRAGMENT_SHADER) ? EvqCentroidIn : EvqVertexIn;
</ins><span class="cx">     }
</span><span class="cx">     | CENTROID OUT_QUAL {
</span><span class="cx">         ES3_ONLY(&quot;centroid out&quot;, @1, &quot;storage qualifier&quot;);
</span><del>-        if (context-&gt;shaderType == GL_FRAGMENT_SHADER)
</del><ins>+        if (context-&gt;getShaderType() == GL_FRAGMENT_SHADER)
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;error(@1, &quot;invalid storage qualifier&quot;, &quot;it is an error to use 'centroid out' in the fragment shader&quot;);
</span><span class="cx">             context-&gt;recover();
</span><span class="cx">         }
</span><del>-        $$.qualifier = (context-&gt;shaderType == GL_FRAGMENT_SHADER) ? EvqFragmentOut : EvqCentroidOut;
</del><ins>+        $$.qualifier = (context-&gt;getShaderType() == GL_FRAGMENT_SHADER) ? EvqFragmentOut : EvqCentroidOut;
</ins><span class="cx">     }
</span><span class="cx">     | UNIFORM {
</span><span class="cx">         if (context-&gt;globalErrorCheck(@1, context-&gt;symbolTable.atGlobalLevel(), &quot;uniform&quot;))
</span><span class="lines">@@ -1519,9 +1443,9 @@
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="cx"> switch_statement
</span><del>-    : SWITCH LEFT_PAREN expression RIGHT_PAREN { ++context-&gt;mSwitchNestingLevel; } compound_statement {
</del><ins>+    : SWITCH LEFT_PAREN expression RIGHT_PAREN { context-&gt;incrSwitchNestingLevel(); } compound_statement {
</ins><span class="cx">         $$ = context-&gt;addSwitch($3, $6, @1);
</span><del>-        --context-&gt;mSwitchNestingLevel;
</del><ins>+        context-&gt;decrSwitchNestingLevel();
</ins><span class="cx">     }
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="lines">@@ -1556,22 +1480,22 @@
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="cx"> iteration_statement
</span><del>-    : WHILE LEFT_PAREN { context-&gt;symbolTable.push(); ++context-&gt;mLoopNestingLevel; } condition RIGHT_PAREN statement_no_new_scope {
</del><ins>+    : WHILE LEFT_PAREN { context-&gt;symbolTable.push(); context-&gt;incrLoopNestingLevel(); } condition RIGHT_PAREN statement_no_new_scope {
</ins><span class="cx">         context-&gt;symbolTable.pop();
</span><span class="cx">         $$ = context-&gt;intermediate.addLoop(ELoopWhile, 0, $4, 0, $6, @1);
</span><del>-        --context-&gt;mLoopNestingLevel;
</del><ins>+        context-&gt;decrLoopNestingLevel();
</ins><span class="cx">     }
</span><del>-    | DO { ++context-&gt;mLoopNestingLevel; } statement_with_scope WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON {
</del><ins>+    | DO { context-&gt;incrLoopNestingLevel(); } statement_with_scope WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON {
</ins><span class="cx">         if (context-&gt;boolErrorCheck(@8, $6))
</span><span class="cx">             context-&gt;recover();
</span><span class="cx"> 
</span><span class="cx">         $$ = context-&gt;intermediate.addLoop(ELoopDoWhile, 0, $6, 0, $3, @4);
</span><del>-        --context-&gt;mLoopNestingLevel;
</del><ins>+        context-&gt;decrLoopNestingLevel();
</ins><span class="cx">     }
</span><del>-    | FOR LEFT_PAREN { context-&gt;symbolTable.push(); ++context-&gt;mLoopNestingLevel; } for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope {
</del><ins>+    | FOR LEFT_PAREN { context-&gt;symbolTable.push(); context-&gt;incrLoopNestingLevel(); } for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope {
</ins><span class="cx">         context-&gt;symbolTable.pop();
</span><span class="cx">         $$ = context-&gt;intermediate.addLoop(ELoopFor, $4, reinterpret_cast&lt;TIntermTyped*&gt;($5.node1), reinterpret_cast&lt;TIntermTyped*&gt;($5.node2), $7, @1);
</span><del>-        --context-&gt;mLoopNestingLevel;
</del><ins>+        context-&gt;decrLoopNestingLevel();
</ins><span class="cx">     }
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="lines">@@ -1628,11 +1552,11 @@
</span><span class="cx"> translation_unit
</span><span class="cx">     : external_declaration {
</span><span class="cx">         $$ = $1;
</span><del>-        context-&gt;treeRoot = $$;
</del><ins>+        context-&gt;setTreeRoot($$);
</ins><span class="cx">     }
</span><span class="cx">     | translation_unit external_declaration {
</span><span class="cx">         $$ = context-&gt;intermediate.growAggregate($1, $2, @$);
</span><del>-        context-&gt;treeRoot = $$;
</del><ins>+        context-&gt;setTreeRoot($$);
</ins><span class="cx">     }
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="lines">@@ -1647,121 +1571,15 @@
</span><span class="cx"> 
</span><span class="cx"> function_definition
</span><span class="cx">     : function_prototype {
</span><del>-        TFunction* function = $1.function;
-        
-        const TSymbol *builtIn = context-&gt;symbolTable.findBuiltIn(function-&gt;getMangledName(), context-&gt;shaderVersion);
-        
-        if (builtIn)
-        {
-            context-&gt;error(@1, &quot;built-in functions cannot be redefined&quot;, function-&gt;getName().c_str());
-            context-&gt;recover();
-        }
-        
-        TFunction* prevDec = static_cast&lt;TFunction*&gt;(context-&gt;symbolTable.find(function-&gt;getMangledName(), context-&gt;shaderVersion));
-        //
-        // Note:  'prevDec' could be 'function' if this is the first time we've seen function
-        // as it would have just been put in the symbol table.  Otherwise, we're looking up
-        // an earlier occurance.
-        //
-        if (prevDec-&gt;isDefined()) {
-            //
-            // Then this function already has a body.
-            //
-            context-&gt;error(@1, &quot;function already has a body&quot;, function-&gt;getName().c_str());
-            context-&gt;recover();
-        }
-        prevDec-&gt;setDefined();
-        //
-        // Overload the unique ID of the definition to be the same unique ID as the declaration.
-        // Eventually we will probably want to have only a single definition and just swap the
-        // arguments to be the definition's arguments.
-        //
-        function-&gt;setUniqueId(prevDec-&gt;getUniqueId());
-
-        //
-        // Raise error message if main function takes any parameters or return anything other than void
-        //
-        if (function-&gt;getName() == &quot;main&quot;) {
-            if (function-&gt;getParamCount() &gt; 0) {
-                context-&gt;error(@1, &quot;function cannot take any parameter(s)&quot;, function-&gt;getName().c_str());
-                context-&gt;recover();
-            }
-            if (function-&gt;getReturnType().getBasicType() != EbtVoid) {
-                context-&gt;error(@1, &quot;&quot;, function-&gt;getReturnType().getBasicString(), &quot;main function cannot return a value&quot;);
-                context-&gt;recover();
-            }
-        }
-
-        //
-        // Remember the return type for later checking for RETURN statements.
-        //
-        context-&gt;currentFunctionType = &amp;(prevDec-&gt;getReturnType());
-        context-&gt;mFunctionReturnsValue = false;
-
-        //
-        // Insert parameters into the symbol table.
-        // If the parameter has no name, it's not an error, just don't insert it
-        // (could be used for unused args).
-        //
-        // Also, accumulate the list of parameters into the HIL, so lower level code
-        // knows where to find parameters.
-        //
-        TIntermAggregate* paramNodes = new TIntermAggregate;
-        for (size_t i = 0; i &lt; function-&gt;getParamCount(); i++) {
-            const TParameter&amp; param = function-&gt;getParam(i);
-            if (param.name != 0) {
-                TVariable *variable = new TVariable(param.name, *param.type);
-                //
-                // Insert the parameters with name in the symbol table.
-                //
-                if (! context-&gt;symbolTable.declare(variable)) {
-                    context-&gt;error(@1, &quot;redefinition&quot;, variable-&gt;getName().c_str());
-                    context-&gt;recover();
-                    delete variable;
-                }
-
-                //
-                // Add the parameter to the HIL
-                //
-                paramNodes = context-&gt;intermediate.growAggregate(
-                                               paramNodes,
-                                               context-&gt;intermediate.addSymbol(variable-&gt;getUniqueId(),
-                                                                       variable-&gt;getName(),
-                                                                       variable-&gt;getType(), @1),
-                                               @1);
-            } else {
-                paramNodes = context-&gt;intermediate.growAggregate(paramNodes, context-&gt;intermediate.addSymbol(0, &quot;&quot;, *param.type, @1), @1);
-            }
-        }
-        context-&gt;intermediate.setAggregateOperator(paramNodes, EOpParameters, @1);
-        $1.intermAggregate = paramNodes;
-        context-&gt;mLoopNestingLevel = 0;
</del><ins>+        context-&gt;parseFunctionPrototype(@1, $1.function, &amp;$1.intermAggregate);
</ins><span class="cx">     }
</span><span class="cx">     compound_statement_no_new_scope {
</span><del>-        //?? Check that all paths return a value if return type != void ?
-        //   May be best done as post process phase on intermediate code
-        if (context-&gt;currentFunctionType-&gt;getBasicType() != EbtVoid &amp;&amp; ! context-&gt;mFunctionReturnsValue) {
-            context-&gt;error(@1, &quot;function does not return a value:&quot;, &quot;&quot;, $1.function-&gt;getName().c_str());
-            context-&gt;recover();
-        }
-        
-        $$ = context-&gt;intermediate.growAggregate($1.intermAggregate, $3, @$);
-        context-&gt;intermediate.setAggregateOperator($$, EOpFunction, @1);
-        $$-&gt;getAsAggregate()-&gt;setName($1.function-&gt;getMangledName().c_str());
-        $$-&gt;getAsAggregate()-&gt;setType($1.function-&gt;getReturnType());
-        $$-&gt;getAsAggregate()-&gt;setFunctionId($1.function-&gt;getUniqueId());
-
-        // store the pragma information for debug and optimize and other vendor specific
-        // information. This information can be queried from the parse tree
-        $$-&gt;getAsAggregate()-&gt;setOptimize(context-&gt;pragma().optimize);
-        $$-&gt;getAsAggregate()-&gt;setDebug(context-&gt;pragma().debug);
-
-        context-&gt;symbolTable.pop();
</del><ins>+        $$ = context-&gt;addFunctionDefinition(*($1.function), $1.intermAggregate, $3, @1);
</ins><span class="cx">     }
</span><span class="cx">     ;
</span><span class="cx"> 
</span><span class="cx"> %%
</span><span class="cx"> 
</span><span class="cx"> int glslang_parse(TParseContext* context) {
</span><del>-    return yyparse(context, context-&gt;scanner);
</del><ins>+    return yyparse(context, context-&gt;getScanner());
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorglslang_lexcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_lex.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_lex.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_lex.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -400,8 +400,8 @@
</span><span class="cx">         *yy_cp = '\0'; \
</span><span class="cx">         yyg-&gt;yy_c_buf_p = yy_cp;
</span><span class="cx"> 
</span><del>-#define YY_NUM_RULES 239
-#define YY_END_OF_BUFFER 240
</del><ins>+#define YY_NUM_RULES 240
+#define YY_END_OF_BUFFER 241
</ins><span class="cx"> /* This struct is not used in this scanner,
</span><span class="cx">    but its presence is necessary. */
</span><span class="cx"> struct yy_trans_info
</span><span class="lines">@@ -409,98 +409,98 @@
</span><span class="cx">         flex_int32_t yy_verify;
</span><span class="cx">         flex_int32_t yy_nxt;
</span><span class="cx">         };
</span><del>-static yyconst flex_int16_t yy_accept[819] =
</del><ins>+static yyconst flex_int16_t yy_accept[820] =
</ins><span class="cx">     {   0,
</span><del>-        0,    0,    0,    0,  240,  238,  237,  237,  222,  228,
</del><ins>+        0,    0,    0,    0,  241,  239,  238,  238,  222,  228,
</ins><span class="cx">       233,  217,  218,  226,  225,  214,  223,  221,  227,  180,
</span><span class="cx">       180,  215,  211,  229,  216,  230,  234,  177,  219,  220,
</span><span class="cx">       232,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><del>-      177,  212,  231,  213,  224,  236,  239,  235,  208,  194,
-      213,  202,  197,  192,  200,  190,  201,  191,  186,  193,
-      185,  179,  180,    0,  183,    0,  220,  212,  219,  209,
-      205,  207,  206,  210,  177,  198,  204,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,   12,
</del><ins>+      177,  212,  231,  213,  224,  237,  236,  240,  235,  208,
+      194,  213,  202,  197,  192,  200,  190,  201,  191,  186,
+      193,  185,  179,  180,    0,  183,    0,  220,  212,  219,
+      209,  205,  207,  206,  210,  177,  198,  204,  177,  177,
+      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</ins><span class="cx"> 
</span><ins>+       12,  177,  177,  177,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,   15,  177,  177,   23,  177,  177,
</ins><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><del>-      177,  177,  177,   15,  177,  177,   23,  177,  177,  177,
</del><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><ins>+      177,  199,  203,  235,    0,  189,  185,    0,  188,  182,
+        0,  184,  178,  195,  196,  177,  136,  177,  177,  177,
</ins><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><del>-      199,  203,  235,    0,  189,  185,    0,  188,  182,    0,
-      184,  178,  195,  196,  177,  136,  177,  177,  177,  177,
</del><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><del>-      177,  177,  177,  177,  177,  177,  177,  177,  177,   13,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</del><ins>+       13,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</ins><span class="cx"> 
</span><del>-       27,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,   24,  177,  177,  177,  177,  177,  177,  177,
</del><ins>+      177,   27,  177,  177,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,   24,  177,  177,  177,  177,  177,  177,
</ins><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><del>-      177,  177,  177,  177,  177,  177,  177,    0,  186,    0,
-      185,  187,  181,  177,  177,  177,   30,  177,  177,   18,
-      174,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,   16,  139,  177,  177,  177,  177,   21,  177,  177,
-      143,  155,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  152,    4,   35,   36,   37,  177,
</del><ins>+      177,  177,  177,  177,  177,  177,  177,  177,    0,  186,
+        0,  185,  187,  181,  177,  177,  177,   30,  177,  177,
+       18,  174,  177,  177,  177,  177,  177,  177,  177,  177,
+      177,  177,   16,  139,  177,  177,  177,  177,   21,  177,
+      177,  143,  155,  177,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  152,    4,   35,   36,   37,
</ins><span class="cx"> 
</span><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><del>-      177,  177,  177,  142,   31,  177,  177,   28,  177,  177,
-      177,  177,  177,  177,  177,   47,   48,   49,   29,  177,
-      177,  177,  177,  177,  177,   10,   53,   54,   55,  177,
-      137,  177,  177,    7,  177,  177,  177,  177,  164,  165,
-      166,  177,   32,  177,  156,   26,  167,  168,  169,    2,
-      161,  162,  163,  177,  177,  177,   25,  159,  177,  177,
-      177,   50,   51,   52,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,   86,  177,  177,  177,  177,
</del><ins>+      177,  177,  177,  177,  142,   31,  177,  177,   28,  177,
+      177,  177,  177,  177,  177,  177,   47,   48,   49,   29,
+      177,  177,  177,  177,  177,  177,   10,   53,   54,   55,
+      177,  137,  177,  177,    7,  177,  177,  177,  177,  164,
+      165,  166,  177,   32,  177,  156,   26,  167,  168,  169,
+        2,  161,  162,  163,  177,  177,  177,   25,  159,  177,
+      177,  177,   50,   51,   52,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,   86,  177,  177,  177,
</ins><span class="cx"> 
</span><del>-      177,  177,  177,  153,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  138,  177,  177,  176,   56,
-       57,   58,  177,  177,   14,  177,   91,  177,  177,  177,
-      177,   89,  177,  177,  177,  154,  149,   92,  177,  177,
-      177,  177,  177,  177,  144,  177,  177,  177,   78,   38,
-       41,   43,   42,   39,   45,   44,   46,   40,  177,  177,
-      177,  177,  160,  135,  177,  177,  147,  177,  177,  177,
-       34,   87,  173,   22,  148,   77,  177,  158,   17,  177,
</del><ins>+      177,  177,  177,  177,  153,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,  138,  177,  177,  176,
+       56,   57,   58,  177,  177,   14,  177,   91,  177,  177,
+      177,  177,   89,  177,  177,  177,  154,  149,   92,  177,
+      177,  177,  177,  177,  177,  144,  177,  177,  177,   78,
+       38,   41,   43,   42,   39,   45,   44,   46,   40,  177,
+      177,  177,  177,  160,  135,  177,  177,  147,  177,  177,
+      177,   34,   87,  173,   22,  148,   77,  177,  158,   17,
</ins><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><del>-      177,  177,  177,   19,   33,  177,  177,  177,  177,  177,
</del><ins>+      177,  177,  177,  177,   19,   33,  177,  177,  177,  177,
</ins><span class="cx"> 
</span><del>-      177,   93,   94,   95,  177,  177,  177,  177,  177,    3,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  140,  177,  177,  177,  177,  177,    8,  177,  177,
-        9,  177,  177,  177,  177,   20,   79,   11,  150,   97,
-       98,   99,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  145,  177,  177,  177,   81,   83,
-       80,  177,  177,  177,  177,  177,  177,  177,  141,  101,
-      102,  103,  177,  177,  157,  177,  146,  177,  177,    6,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,   96,
-      151,    1,  177,  177,  177,  177,  177,  175,  177,   90,
</del><ins>+      177,  177,   93,   94,   95,  177,  177,  177,  177,  177,
+        3,  177,  177,  177,  177,  177,  177,  177,  177,  177,
+      177,  177,  140,  177,  177,  177,  177,  177,    8,  177,
+      177,    9,  177,  177,  177,  177,   20,   79,   11,  150,
+       97,   98,   99,  177,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  145,  177,  177,  177,   81,
+       83,   80,  177,  177,  177,  177,  177,  177,  177,  141,
+      101,  102,  103,  177,  177,  157,  177,  146,  177,  177,
+        6,  177,  177,  177,  177,  177,  177,  177,  177,  177,
+       96,  151,    1,  177,  177,  177,  177,  177,  175,  177,
</ins><span class="cx"> 
</span><del>-        5,  170,   59,   62,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,   82,  177,  177,
-      177,  177,  100,  177,  177,  177,  177,  177,  120,   66,
-       67,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,   88,  177,  177,  177,  104,  122,
-       70,   71,  177,  177,   84,  177,  177,  177,  177,  177,
-      177,  177,  115,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  129,  177,  177,  177,  177,   60,  177,
</del><ins>+       90,    5,  170,   59,   62,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,  177,  177,   82,  177,
+      177,  177,  177,  100,  177,  177,  177,  177,  177,  120,
+       66,   67,  177,  177,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,   88,  177,  177,  177,  104,
+      122,   70,   71,  177,  177,   84,  177,  177,  177,  177,
+      177,  177,  177,  115,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  129,  177,  177,  177,  177,   60,
</ins><span class="cx">       177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
</span><del>-      177,  116,  105,  177,  106,  177,  177,  177,  130,  177,
</del><ins>+      177,  177,  116,  105,  177,  106,  177,  177,  177,  130,
</ins><span class="cx"> 
</span><del>-      177,   68,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  117,  177,  177,  131,  177,
-      177,   72,  107,  108,  177,  111,  177,  112,  177,  177,
-      177,  177,  177,   85,  177,  177,  177,  177,   64,  177,
-       63,  126,  177,  177,  109,  110,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  124,  127,  118,  177,
-       65,  177,  177,  177,  177,  177,  177,  177,  177,  125,
-      128,  177,  177,  121,   69,  177,  177,  171,  177,  177,
-      177,   74,  177,  177,  123,   73,  177,  177,  177,  177,
-      177,  177,  132,  177,  177,  177,  177,  177,  177,  133,
</del><ins>+      177,  177,   68,  177,  177,  177,  177,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,  117,  177,  177,  131,
+      177,  177,   72,  107,  108,  177,  111,  177,  112,  177,
+      177,  177,  177,  177,   85,  177,  177,  177,  177,   64,
+      177,   63,  126,  177,  177,  109,  110,  177,  177,  177,
+      177,  177,  177,  177,  177,  177,  177,  124,  127,  118,
+      177,   65,  177,  177,  177,  177,  177,  177,  177,  177,
+      125,  128,  177,  177,  121,   69,  177,  177,  171,  177,
+      177,  177,   74,  177,  177,  123,   73,  177,  177,  177,
+      177,  177,  177,  132,  177,  177,  177,  177,  177,  177,
</ins><span class="cx"> 
</span><del>-      177,  177,  177,   75,  177,  134,  113,  114,  177,  177,
-      177,   61,  177,  177,  172,  119,   76,    0
</del><ins>+      133,  177,  177,  177,   75,  177,  134,  113,  114,  177,
+      177,  177,   61,  177,  177,  172,  119,   76,    0
</ins><span class="cx">     } ;
</span><span class="cx"> 
</span><span class="cx"> static yyconst flex_int32_t yy_ec[256] =
</span><span class="lines">@@ -547,194 +547,194 @@
</span><span class="cx">         1,    1
</span><span class="cx">     } ;
</span><span class="cx"> 
</span><del>-static yyconst flex_int16_t yy_base[824] =
</del><ins>+static yyconst flex_int16_t yy_base[825] =
</ins><span class="cx">     {   0,
</span><span class="cx">         0,    0,   72,    0, 1016, 1017, 1017, 1017,  990,  120,
</span><span class="cx">       141, 1017, 1017,  989,  138, 1017,  137,  135,  988,  154,
</span><span class="cx">       208,  986, 1017,  154,  986,  132, 1017,    0, 1017, 1017,
</span><span class="cx">       139,  130,  123,  140,  147,  133,  177,  952,  186,  151,
</span><span class="cx">       139,  116,  161,  946,  173,  959,  193,  199,  208,  215,
</span><del>-      108, 1017,  184, 1017, 1017, 1017, 1017,    0, 1017, 1017,
-     1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017,  230, 1017,
-      235,  235,    0,  271, 1017,    0, 1017, 1017, 1017,  982,
-     1017, 1017, 1017,  981,    0, 1017, 1017,  943,  948,  152,
-      945,  953,  952,  939,  942,  953,  243,  947,  935,  932,
</del><ins>+      108, 1017,  184, 1017, 1017, 1017, 1017, 1017,    0, 1017,
+     1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017,  230,
+     1017,  235,  235,    0,  271, 1017,    0, 1017, 1017, 1017,
+      982, 1017, 1017, 1017,  981,    0, 1017, 1017,  943,  948,
+      152,  945,  953,  952,  939,  942,  953,  243,  947,  935,
</ins><span class="cx"> 
</span><del>-      945,  932,  929,  929,  935,  147,  248,  929,  939,  925,
-      931,  934,  935,    0,  927,  937,  249,  936,  931,  912,
-      177,  916,  929,  920,  184,  913,  250,  925,  927,  257,
-      916,  913,  902,  911,  249,  257,  915,  911,  913,  902,
-      905,  196,  217,  269,  914,  902,  914,  262,  907,  906,
-     1017, 1017,    0,  311, 1017,  292,  328, 1017, 1017,  335,
-      342,  257, 1017, 1017,  905,    0,  901,  896,  900,  909,
-      906,  315,  890,  890,  901,  893,  215,  903,  900,  900,
-      898,  895,  887,  893,  880,  878,  890,  876,  892,    0,
-      889,  877,  884,  881,  885,  886,  879,  876,  865,  864,
</del><ins>+      932,  945,  932,  929,  929,  935,  147,  248,  929,  939,
+      925,  931,  934,  935,    0,  927,  937,  249,  936,  931,
+      912,  177,  916,  929,  920,  184,  913,  250,  925,  927,
+      257,  916,  913,  902,  911,  249,  257,  915,  911,  913,
+      902,  905,  196,  217,  269,  914,  902,  914,  262,  907,
+      906, 1017, 1017,    0,  311, 1017,  292,  328, 1017, 1017,
+      335,  342,  257, 1017, 1017,  905,    0,  901,  896,  900,
+      909,  906,  315,  890,  890,  901,  893,  215,  903,  900,
+      900,  898,  895,  887,  893,  880,  878,  890,  876,  892,
+        0,  889,  877,  884,  881,  885,  886,  879,  876,  865,
</ins><span class="cx"> 
</span><del>-      877,  880,  868,  876,  864,  870,  861,  316,  866,  869,
-      860,  867,  856,  860,  851,  865,  864,  855,  861,  307,
-      845,  848,  846,  856,  846,  841,  839,  841,  851,  837,
-      839,  836,  847,  846,  849,  831,  316,  839,  835,  833,
-      842,  821,  353,  839,  841,  830,  822,  363,  370,  378,
-      389, 1017, 1017,  819,  829,  828,    0,  826,  383,    0,
-        0,  819,  817,  817,  818,  813,  821,  810,  827,  816,
-      394,    0,    0,  810,  820,  819,  819,    0,  804,  397,
-        0,    0,  806,  400,  813,  814,  805,  799,  798,  799,
-      798,  798,  406,  793,    0,    0,  789,  788,  787,  789,
</del><ins>+      864,  877,  880,  868,  876,  864,  870,  861,  316,  866,
+      869,  860,  867,  856,  860,  851,  865,  864,  855,  861,
+      307,  845,  848,  846,  856,  846,  841,  839,  841,  851,
+      837,  839,  836,  847,  846,  849,  831,  316,  839,  835,
+      833,  842,  821,  353,  839,  841,  830,  822,  363,  370,
+      378,  389, 1017, 1017,  819,  829,  828,    0,  826,  383,
+        0,    0,  819,  817,  817,  818,  813,  821,  810,  827,
+      816,  394,    0,    0,  810,  820,  819,  819,    0,  804,
+      397,    0,    0,  806,  400,  813,  814,  805,  799,  798,
+      799,  798,  798,  406,  793,    0,    0,  789,  788,  787,
</ins><span class="cx"> 
</span><del>-      790,  795,  789,  785,  798,  793,  793,  791,  790,  784,
-      778,  780,  779,  783,  775,  778,  773,  781,  786,  774,
-      771,  783,  774,    0,    0,  780,  776,    0,  768,  768,
-      773,  764,  771,  409,  768,    0,    0,    0,    0,  758,
-      770,  769,  768,  769,  769,    0,    0,    0,    0,  756,
-        0,  764,  755,    0,  754,  755,  749,  759,    0,    0,
-        0,  750,    0,  746,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  756,  413,  755,    0,    0,  753,  749,
-      746,    0,    0,    0,  738,  415,  418,  427,  743,  739,
-      744,  735,  733,  746,  731,    0,  731,  744,  733,  729,
</del><ins>+      789,  790,  795,  789,  785,  798,  793,  793,  791,  790,
+      784,  778,  780,  779,  783,  775,  778,  773,  781,  786,
+      774,  771,  783,  774,    0,    0,  780,  776,    0,  768,
+      768,  773,  764,  771,  409,  768,    0,    0,    0,    0,
+      758,  770,  769,  768,  769,  769,    0,    0,    0,    0,
+      756,    0,  764,  755,    0,  754,  755,  749,  759,    0,
+        0,    0,  750,    0,  746,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  756,  413,  755,    0,    0,  753,
+      749,  746,    0,    0,    0,  738,  415,  418,  427,  743,
+      739,  744,  735,  733,  746,  731,    0,  731,  744,  733,
</ins><span class="cx"> 
</span><del>-      735,  730,  737,    0,  735,  732,  736,  720,  718,  721,
-      727,  733,  728,  727,  715,    0,  717,  718,    0,    0,
-        0,    0,  715,  718,    0,  712,    0,  725,  705,  714,
-      709,    0,  702,  702,  715,    0,  717,    0,  431,  730,
-      729,  728,  695,  694,    0,  711,  710,  705,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  694,  707,
-      694,  691,    0,    0,  696,  695,    0,  692,  699,  698,
-        0,  684,    0,    0,    0,    0,  681,    0,    0,  680,
-      691,  434,  684,  690,  689,  686,  681,  678,  671,  671,
-      684,  669,  681,    0,    0,  674,  697,  696,  695,  662,
</del><ins>+      729,  735,  730,  737,    0,  735,  732,  736,  720,  718,
+      721,  727,  733,  728,  727,  715,    0,  717,  718,    0,
+        0,    0,    0,  715,  718,    0,  712,    0,  725,  705,
+      714,  709,    0,  702,  702,  715,    0,  717,    0,  431,
+      730,  729,  728,  695,  694,    0,  711,  710,  705,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  694,
+      707,  694,  691,    0,    0,  696,  695,    0,  692,  699,
+      698,    0,  684,    0,    0,    0,    0,  681,    0,    0,
+      680,  691,  434,  684,  690,  689,  686,  681,  678,  671,
+      671,  684,  669,  681,    0,    0,  674,  697,  696,  695,
</ins><span class="cx"> 
</span><del>-      661,  427,  428,    0,  673,  676,  674,  663,  659,    0,
-      671,  668,  667,  657,  656,  646,  663,  649,  441,  657,
-      660,    0,  677,  676,  675,  642,  641,    0,  655,  642,
-        0,  652,  645,  646,  649,    0,    0,    0,    0,  669,
-      668,    0,  645,  648,  633,  640,  631,  638,  639,  639,
-      638,  624,  451,  636,    0,  637,  626,  625,    0,    0,
-        0,  650,  649,  648,  615,  614,  610,  618,    0,  646,
-      645,    0,  622,  625,    0,  458,    0,  603,  612,    0,
-      608,  607,  616,  616,  604,  618,  602,  616,  611,    0,
-        0,    0,  628,  627,  626,  593,  592,    0,  592,    0,
</del><ins>+      662,  661,  427,  428,    0,  673,  676,  674,  663,  659,
+        0,  671,  668,  667,  657,  656,  646,  663,  649,  441,
+      657,  660,    0,  677,  676,  675,  642,  641,    0,  655,
+      642,    0,  652,  645,  646,  649,    0,    0,    0,    0,
+      669,  668,    0,  645,  648,  633,  640,  631,  638,  639,
+      639,  638,  624,  451,  636,    0,  637,  626,  625,    0,
+        0,    0,  650,  649,  648,  615,  614,  610,  618,    0,
+      646,  645,    0,  622,  625,    0,  458,    0,  603,  612,
+        0,  608,  607,  616,  616,  604,  618,  602,  616,  611,
+        0,    0,    0,  628,  627,  626,  593,  592,    0,  592,
</ins><span class="cx"> 
</span><del>-        0,  434,  454,  616,  602,  605,  588,  600,  588,  587,
-      596,  596,  613,  612,  611,  578,  577,    0,  577,  578,
-      577,  587,    0,  590,  586,  588,  584,  571,  602,  449,
-        0,  579,  582,  574,  566,  573,  564,  585,  573,  569,
-      571,  569,  569,  568,    0,  556,  555,  565,    0,  585,
-      462,    0,  562,  565,    0,  565,  564,  548,  540,  548,
-      538,  546,    0,  543,  542,  563,  551,  549,  549,  533,
-      536,  550,  534,  565,  545,  546,  543,  540,  550,  527,
-      541,  540,  524,  523,  522,  543,  531,  529,  529,  510,
-      509,    0,  537,  509,  535,  507,  511,  510,  541,  521,
</del><ins>+        0,    0,  434,  454,  616,  602,  605,  588,  600,  588,
+      587,  596,  596,  613,  612,  611,  578,  577,    0,  577,
+      578,  577,  587,    0,  590,  586,  588,  584,  571,  602,
+      449,    0,  579,  582,  574,  566,  573,  564,  585,  573,
+      569,  571,  569,  569,  568,    0,  556,  555,  565,    0,
+      585,  462,    0,  562,  565,    0,  565,  564,  548,  540,
+      548,  538,  546,    0,  543,  542,  563,  551,  549,  549,
+      533,  536,  550,  534,  565,  545,  546,  543,  540,  550,
+      527,  541,  540,  524,  523,  522,  543,  531,  529,  529,
+      510,  509,    0,  537,  509,  535,  507,  511,  510,  541,
</ins><span class="cx"> 
</span><del>-      518,    0,  517,  520,  516,  518,  502,  499,  512,  497,
-      498,  505,  499,  488,  487,    0,  493,  492,  523,  503,
-      500,    0,    0,    0,  496,    0,  495,    0,  501,  500,
-      484,  481,  482,    0,  474,  482,  472,  478,  499,  478,
-        0,    0,  490,  489,    0,    0,  488,  487,  471,  468,
-      469,  483,  482,  459,  458,  464,    0,    0,  485,  457,
-      483,  475,  467,  453,  132,  161,  177,  215,  245,    0,
-        0,  288,  289,    0,    0,  294,  315,    0,  316,  306,
-      331,    0,  363,  402,    0,    0,  395,  383,  395,  387,
-      433,  434,    0,  435,  420,  461,  427,  430,  431,    0,
</del><ins>+      521,  518,    0,  517,  520,  516,  518,  502,  499,  512,
+      497,  498,  505,  499,  488,  487,    0,  493,  492,  523,
+      503,  500,    0,    0,    0,  496,    0,  495,    0,  501,
+      500,  484,  481,  482,    0,  474,  482,  472,  478,  499,
+      478,    0,    0,  490,  489,    0,    0,  488,  487,  471,
+      468,  469,  483,  482,  459,  458,  464,    0,    0,  485,
+      457,  483,  475,  467,  453,  132,  161,  177,  215,  245,
+        0,    0,  288,  289,    0,    0,  294,  315,    0,  316,
+      306,  331,    0,  363,  402,    0,    0,  395,  383,  395,
+      387,  433,  434,    0,  435,  420,  461,  427,  430,  431,
</ins><span class="cx"> 
</span><del>-      450,  452,  443,    0,  464,    0,    0,    0,  445,  446,
-      440,    0,  441,  442,    0,    0,    0, 1017,  506,  509,
-      512,  513,  514
</del><ins>+        0,  450,  452,  443,    0,  464,    0,    0,    0,  445,
+      446,  440,    0,  441,  442,    0,    0,    0, 1017,  506,
+      509,  512,  513,  514
</ins><span class="cx">     } ;
</span><span class="cx"> 
</span><del>-static yyconst flex_int16_t yy_def[824] =
</del><ins>+static yyconst flex_int16_t yy_def[825] =
</ins><span class="cx">     {   0,
</span><del>-      818,    1,  818,    3,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  819,  818,  818,
-      818,  819,  819,  819,  819,  819,  819,  819,  819,  819,
</del><ins>+      819,    1,  819,    3,  819,  819,  819,  819,  819,  819,
</ins><span class="cx">       819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
</span><del>-      819,  818,  818,  818,  818,  818,  818,  820,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  821,  818,
-      822,   20,   21,  818,  818,  823,  818,  818,  818,  818,
-      818,  818,  818,  818,  819,  818,  818,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
</del><ins>+      819,  819,  819,  819,  819,  819,  819,  820,  819,  819,
+      819,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  819,  819,  819,  819,  819,  819,  819,  821,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  822,
+      819,  823,   20,   21,  819,  819,  824,  819,  819,  819,
+      819,  819,  819,  819,  819,  820,  819,  819,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
</ins><span class="cx"> 
</span><del>-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      818,  818,  820,  818,  818,  822,  818,  818,  818,  818,
-      818,  823,  818,  818,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
</del><ins>+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  819,  819,  821,  819,  819,  823,  819,  819,  819,
+      819,  819,  824,  819,  819,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
</ins><span class="cx"> 
</span><del>-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  818,  818,  818,
-      818,  818,  818,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
</del><ins>+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  819,  819,
+      819,  819,  819,  819,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
</ins><span class="cx"> 
</span><del>-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
</del><ins>+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
</ins><span class="cx"> 
</span><del>-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
</del><ins>+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
</ins><span class="cx"> 
</span><del>-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
</del><ins>+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
</ins><span class="cx"> 
</span><del>-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
</del><ins>+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
</ins><span class="cx"> 
</span><del>-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
</del><ins>+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
</ins><span class="cx"> 
</span><del>-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,    0,  818,  818,
-      818,  818,  818
</del><ins>+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  820,  820,  820,  820,  820,  820,  820,    0,  819,
+      819,  819,  819,  819
</ins><span class="cx">     } ;
</span><span class="cx"> 
</span><span class="cx"> static yyconst flex_int16_t yy_nxt[1090] =
</span><span class="lines">@@ -746,118 +746,118 @@
</span><span class="cx">        29,   30,   31,   28,   32,   33,   34,   35,   36,   37,
</span><span class="cx">        38,   39,   40,   28,   41,   42,   43,   44,   45,   46,
</span><span class="cx">        47,   48,   49,   50,   51,   28,   28,   28,   52,   53,
</span><del>-       54,   55,    6,   56,   57,    6,    6,    6,    6,    6,
-        6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
-        6,    6,    6,    6,    6,    6,    6,    6,    6,   58,
</del><ins>+       54,   55,   56,   57,   58,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   59,
</ins><span class="cx"> 
</span><del>-       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   58,    6,    6,    6,   58,   58,   58,   58,   58,
-       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-        6,    6,    6,    6,   60,   61,   62,   65,   67,   69,
-       69,   69,   69,   69,   69,   69,   83,   84,   78,  149,
-      122,   68,   66,   86,  123,   63,   71,  150,   72,   72,
-       72,   72,   72,   72,   73,   79,   88,   80,   81,  783,
-       91,   87,   92,  120,   94,   74,   93,  102,   95,  103,
-       89,   90,   75,   76,   96,   98,  121,   97,  104,   99,
</del><ins>+       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
+       59,   59,   56,   56,   56,   59,   59,   59,   59,   59,
+       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
+       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
+       56,   56,   56,   56,   61,   62,   63,   66,   68,   70,
+       70,   70,   70,   70,   70,   70,   84,   85,   79,  150,
+      123,   69,   67,   87,  124,   64,   72,  151,   73,   73,
+       73,   73,   73,   73,   74,   80,   89,   81,   82,  784,
+       92,   88,   93,  121,   95,   75,   94,  103,   96,  104,
+       90,   91,   76,   77,   97,   99,  122,   98,  105,  100,
</ins><span class="cx"> 
</span><del>-      114,  186,   74,  115,  100,  124,  116,  117,  151,  167,
-      101,  118,  187,  168,  119,  784,   75,  127,  125,   76,
-       71,  105,   73,   73,   73,   73,   73,   73,   73,  106,
-      111,  107,  128,  206,  108,  129,  211,  131,  112,   74,
-      109,  207,  212,  785,  132,  133,   75,  138,  134,  113,
-      139,  235,  236,  152,  135,  136,   74,  137,  140,  146,
-      142,  154,  155,  147,  143,  141,  157,  158,  144,  237,
-       75,  145,  148,  159,  818,  266,  267,  238,  154,  155,
-      160,  786,  160,  157,  158,  161,  161,  161,  161,  161,
-      161,  161,  188,  226,  175,  253,  214,  159,  176,  177,
</del><ins>+      115,  187,   75,  116,  101,  125,  117,  118,  152,  168,
+      102,  119,  188,  169,  120,  785,   76,  128,  126,   77,
+       72,  106,   74,   74,   74,   74,   74,   74,   74,  107,
+      112,  108,  129,  207,  109,  130,  212,  132,  113,   75,
+      110,  208,  213,  786,  133,  134,   76,  139,  135,  114,
+      140,  236,  237,  153,  136,  137,   75,  138,  141,  147,
+      143,  155,  156,  148,  144,  142,  158,  159,  145,  238,
+       76,  146,  149,  160,  819,  267,  268,  239,  155,  156,
+      161,  787,  161,  158,  159,  162,  162,  162,  162,  162,
+      162,  162,  189,  227,  176,  254,  215,  160,  177,  178,
</ins><span class="cx"> 
</span><del>-      818,  219,  228,  198,  787,  189,  199,  200,  227,  215,
-      201,  216,  202,  239,  244,  229,  245,  220,  221,  253,
-      248,  240,  248,  157,  158,  249,  249,  249,  249,  249,
-      249,  249,  297,  298,  299,  788,  789,  250,  790,  250,
-      157,  158,  251,  251,  251,  251,  251,  251,  251,  161,
-      161,  161,  161,  161,  161,  161,  161,  161,  161,  161,
-      161,  161,  161,  260,  311,  329,  791,  792,  312,  336,
-      337,  338,  793,  330,  252,  794,  261,  249,  249,  249,
-      249,  249,  249,  249,  249,  249,  249,  249,  249,  249,
-      249,  252,  251,  251,  251,  251,  251,  251,  251,  347,
</del><ins>+      819,  220,  229,  199,  788,  190,  200,  201,  228,  216,
+      202,  217,  203,  240,  245,  230,  246,  221,  222,  254,
+      249,  241,  249,  158,  159,  250,  250,  250,  250,  250,
+      250,  250,  298,  299,  300,  789,  790,  251,  791,  251,
+      158,  159,  252,  252,  252,  252,  252,  252,  252,  162,
+      162,  162,  162,  162,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  261,  312,  330,  792,  793,  313,  337,
+      338,  339,  794,  331,  253,  795,  262,  250,  250,  250,
+      250,  250,  250,  250,  250,  250,  250,  250,  250,  250,
+      250,  253,  252,  252,  252,  252,  252,  252,  252,  348,
</ins><span class="cx"> 
</span><del>-      348,  349,  155,  251,  251,  251,  251,  251,  251,  251,
-      359,  360,  361,  367,  368,  369,  371,  372,  373,  155,
-      795,  158,  382,  383,  384,  420,  421,  422,  440,  441,
-      442,  450,  451,  452,  453,  454,  455,  796,  158,  797,
-      798,  443,  444,  456,  457,  458,  497,  498,  499,  523,
-      524,  525,  799,  800,  545,  547,  562,  563,  564,  500,
-      501,  635,  526,  527,  546,  548,  593,  594,  595,  565,
-      566,  636,  567,  613,  614,  615,  665,  801,  802,  596,
-      597,  637,  803,  666,  804,  667,  616,  617,  638,  685,
-      639,  640,  805,  806,  807,  808,  686,  809,  687,  810,
</del><ins>+      349,  350,  156,  252,  252,  252,  252,  252,  252,  252,
+      360,  361,  362,  368,  369,  370,  372,  373,  374,  156,
+      796,  159,  383,  384,  385,  421,  422,  423,  441,  442,
+      443,  451,  452,  453,  454,  455,  456,  797,  159,  798,
+      799,  444,  445,  457,  458,  459,  498,  499,  500,  524,
+      525,  526,  800,  801,  546,  548,  563,  564,  565,  501,
+      502,  636,  527,  528,  547,  549,  594,  595,  596,  566,
+      567,  637,  568,  614,  615,  616,  666,  802,  803,  597,
+      598,  638,  804,  667,  805,  668,  617,  618,  639,  686,
+      640,  641,  806,  807,  808,  809,  687,  810,  688,  811,
</ins><span class="cx"> 
</span><del>-      811,  812,  813,  814,  815,  816,  817,   85,   85,   85,
-      153,  153,  153,   69,  156,  162,  162,  782,  781,  780,
-      779,  778,  777,  776,  775,  774,  773,  772,  771,  770,
-      769,  768,  767,  766,  765,  764,  763,  762,  761,  760,
-      759,  758,  757,  756,  755,  754,  753,  752,  751,  750,
-      749,  748,  747,  746,  745,  744,  743,  742,  741,  740,
-      739,  738,  737,  736,  735,  734,  733,  732,  731,  730,
-      729,  728,  727,  726,  725,  724,  723,  722,  721,  720,
-      719,  718,  717,  716,  715,  714,  713,  712,  711,  710,
-      709,  708,  707,  706,  705,  704,  703,  702,  701,  700,
</del><ins>+      812,  813,  814,  815,  816,  817,  818,   86,   86,   86,
+      154,  154,  154,   70,  157,  163,  163,  783,  782,  781,
+      780,  779,  778,  777,  776,  775,  774,  773,  772,  771,
+      770,  769,  768,  767,  766,  765,  764,  763,  762,  761,
+      760,  759,  758,  757,  756,  755,  754,  753,  752,  751,
+      750,  749,  748,  747,  746,  745,  744,  743,  742,  741,
+      740,  739,  738,  737,  736,  735,  734,  733,  732,  731,
+      730,  729,  728,  727,  726,  725,  724,  723,  722,  721,
+      720,  719,  718,  717,  716,  715,  714,  713,  712,  711,
+      710,  709,  708,  707,  706,  705,  704,  703,  702,  701,
</ins><span class="cx"> 
</span><del>-      699,  698,  697,  696,  695,  694,  693,  692,  691,  690,
-      689,  688,  684,  683,  682,  681,  680,  679,  678,  677,
-      676,  675,  674,  673,  672,  671,  670,  669,  668,  664,
-      663,  662,  661,  660,  659,  658,  657,  656,  655,  654,
-      653,  652,  651,  650,  649,  648,  647,  646,  645,  644,
-      643,  642,  641,  634,  633,  632,  631,  630,  629,  628,
-      627,  626,  625,  624,  623,  622,  621,  620,  619,  618,
-      612,  611,  610,  609,  608,  607,  606,  605,  604,  603,
-      602,  601,  600,  599,  598,  592,  591,  590,  589,  588,
-      587,  586,  585,  584,  583,  582,  581,  580,  579,  578,
</del><ins>+      700,  699,  698,  697,  696,  695,  694,  693,  692,  691,
+      690,  689,  685,  684,  683,  682,  681,  680,  679,  678,
+      677,  676,  675,  674,  673,  672,  671,  670,  669,  665,
+      664,  663,  662,  661,  660,  659,  658,  657,  656,  655,
+      654,  653,  652,  651,  650,  649,  648,  647,  646,  645,
+      644,  643,  642,  635,  634,  633,  632,  631,  630,  629,
+      628,  627,  626,  625,  624,  623,  622,  621,  620,  619,
+      613,  612,  611,  610,  609,  608,  607,  606,  605,  604,
+      603,  602,  601,  600,  599,  593,  592,  591,  590,  589,
+      588,  587,  586,  585,  584,  583,  582,  581,  580,  579,
</ins><span class="cx"> 
</span><del>-      577,  576,  575,  574,  573,  572,  571,  570,  569,  568,
-      561,  560,  559,  558,  557,  556,  555,  554,  553,  552,
-      551,  550,  549,  544,  543,  542,  541,  540,  539,  538,
-      537,  536,  535,  534,  533,  532,  531,  530,  529,  528,
-      522,  521,  520,  519,  518,  517,  516,  515,  514,  513,
-      512,  511,  510,  509,  508,  507,  506,  505,  504,  503,
-      502,  496,  495,  494,  493,  492,  491,  490,  489,  488,
-      487,  486,  485,  484,  483,  482,  481,  480,  479,  478,
-      477,  476,  475,  474,  473,  472,  471,  470,  469,  468,
-      467,  466,  465,  464,  463,  462,  461,  460,  459,  449,
</del><ins>+      578,  577,  576,  575,  574,  573,  572,  571,  570,  569,
+      562,  561,  560,  559,  558,  557,  556,  555,  554,  553,
+      552,  551,  550,  545,  544,  543,  542,  541,  540,  539,
+      538,  537,  536,  535,  534,  533,  532,  531,  530,  529,
+      523,  522,  521,  520,  519,  518,  517,  516,  515,  514,
+      513,  512,  511,  510,  509,  508,  507,  506,  505,  504,
+      503,  497,  496,  495,  494,  493,  492,  491,  490,  489,
+      488,  487,  486,  485,  484,  483,  482,  481,  480,  479,
+      478,  477,  476,  475,  474,  473,  472,  471,  470,  469,
+      468,  467,  466,  465,  464,  463,  462,  461,  460,  450,
</ins><span class="cx"> 
</span><del>-      448,  447,  446,  445,  439,  438,  437,  436,  435,  434,
-      433,  432,  431,  430,  429,  428,  427,  426,  425,  424,
-      423,  419,  418,  417,  416,  415,  414,  413,  412,  411,
-      410,  409,  408,  407,  406,  405,  404,  403,  402,  401,
-      400,  399,  398,  397,  396,  395,  394,  393,  392,  391,
-      390,  389,  388,  387,  386,  385,  381,  380,  379,  378,
-      377,  376,  375,  374,  370,  366,  365,  364,  363,  362,
-      358,  357,  356,  355,  354,  353,  352,  351,  350,  346,
-      345,  344,  343,  342,  341,  340,  339,  335,  334,  333,
-      332,  331,  328,  327,  326,  325,  324,  323,  322,  321,
</del><ins>+      449,  448,  447,  446,  440,  439,  438,  437,  436,  435,
+      434,  433,  432,  431,  430,  429,  428,  427,  426,  425,
+      424,  420,  419,  418,  417,  416,  415,  414,  413,  412,
+      411,  410,  409,  408,  407,  406,  405,  404,  403,  402,
+      401,  400,  399,  398,  397,  396,  395,  394,  393,  392,
+      391,  390,  389,  388,  387,  386,  382,  381,  380,  379,
+      378,  377,  376,  375,  371,  367,  366,  365,  364,  363,
+      359,  358,  357,  356,  355,  354,  353,  352,  351,  347,
+      346,  345,  344,  343,  342,  341,  340,  336,  335,  334,
+      333,  332,  329,  328,  327,  326,  325,  324,  323,  322,
</ins><span class="cx"> 
</span><del>-      320,  319,  318,  317,  316,  315,  314,  313,  310,  309,
-      308,  307,  306,  305,  304,  303,  302,  301,  300,  296,
-      295,  294,  293,  292,  291,  290,  289,  288,  287,  286,
-      285,  284,  283,  282,  281,  280,  279,  278,  277,  276,
-      275,  274,  273,  272,  271,  270,  269,  268,  265,  264,
-      263,  262,  259,  258,  257,  256,  255,  254,  247,  246,
-      243,  242,  241,  234,  233,  232,  231,  230,  225,  224,
-      223,  222,  218,  217,  213,  210,  209,  208,  205,  204,
-      203,  197,  196,  195,  194,  193,  192,  191,  190,  185,
-      184,  183,  182,  181,  180,  179,  178,  174,  173,  172,
</del><ins>+      321,  320,  319,  318,  317,  316,  315,  314,  311,  310,
+      309,  308,  307,  306,  305,  304,  303,  302,  301,  297,
+      296,  295,  294,  293,  292,  291,  290,  289,  288,  287,
+      286,  285,  284,  283,  282,  281,  280,  279,  278,  277,
+      276,  275,  274,  273,  272,  271,  270,  269,  266,  265,
+      264,  263,  260,  259,  258,  257,  256,  255,  248,  247,
+      244,  243,  242,  235,  234,  233,  232,  231,  226,  225,
+      224,  223,  219,  218,  214,  211,  210,  209,  206,  205,
+      204,  198,  197,  196,  195,  194,  193,  192,  191,  186,
+      185,  184,  183,  182,  181,  180,  179,  175,  174,  173,
</ins><span class="cx"> 
</span><del>-      171,  170,  169,  166,  165,  164,  163,  130,  126,  110,
-       82,   77,   70,   64,   59,  818,    5,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818
</del><ins>+      172,  171,  170,  167,  166,  165,  164,  131,  127,  111,
+       83,   78,   71,   65,   60,  819,    5,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819
</ins><span class="cx">     } ;
</span><span class="cx"> 
</span><span class="cx"> static yyconst flex_int16_t yy_chk[1090] =
</span><span class="lines">@@ -880,111 +880,111 @@
</span><span class="cx">         3,    3,    3,    3,   10,   10,   11,   15,   17,   18,
</span><span class="cx">        18,   18,   18,   18,   18,   18,   26,   26,   24,   51,
</span><span class="cx">        42,   17,   15,   31,   42,   11,   20,   51,   20,   20,
</span><del>-       20,   20,   20,   20,   20,   24,   32,   24,   24,  765,
</del><ins>+       20,   20,   20,   20,   20,   24,   32,   24,   24,  766,
</ins><span class="cx">        33,   31,   33,   41,   34,   20,   33,   36,   34,   36,
</span><span class="cx">        32,   32,   20,   20,   34,   35,   41,   34,   36,   35,
</span><span class="cx"> 
</span><del>-       40,  106,   20,   40,   35,   43,   40,   40,   53,   90,
-       35,   40,  106,   90,   40,  766,   20,   45,   43,   20,
</del><ins>+       40,  107,   20,   40,   35,   43,   40,   40,   53,   91,
+       35,   40,  107,   91,   40,  767,   20,   45,   43,   20,
</ins><span class="cx">        21,   37,   21,   21,   21,   21,   21,   21,   21,   37,
</span><del>-       39,   37,   45,  121,   37,   45,  125,   47,   39,   21,
-       37,  121,  125,  767,   47,   47,   21,   48,   47,   39,
-       48,  142,  142,   53,   47,   47,   21,   47,   48,   50,
-       49,   69,   69,   50,   49,   48,   71,   71,   49,  143,
-       21,   49,   50,   72,   72,  177,  177,  143,   69,   69,
-       74,  768,   74,   71,   71,   74,   74,   74,   74,   74,
-       74,   74,  107,  135,   97,  162,  127,   72,   97,   97,
</del><ins>+       39,   37,   45,  122,   37,   45,  126,   47,   39,   21,
+       37,  122,  126,  768,   47,   47,   21,   48,   47,   39,
+       48,  143,  143,   53,   47,   47,   21,   47,   48,   50,
+       49,   70,   70,   50,   49,   48,   72,   72,   49,  144,
+       21,   49,   50,   73,   73,  178,  178,  144,   70,   70,
+       75,  769,   75,   72,   72,   75,   75,   75,   75,   75,
+       75,   75,  108,  136,   98,  163,  128,   73,   98,   98,
</ins><span class="cx"> 
</span><del>-       72,  130,  136,  117,  769,  107,  117,  117,  135,  127,
-      117,  127,  117,  144,  148,  136,  148,  130,  130,  162,
-      154,  144,  154,  156,  156,  154,  154,  154,  154,  154,
-      154,  154,  208,  208,  208,  772,  773,  157,  776,  157,
-      156,  156,  157,  157,  157,  157,  157,  157,  157,  160,
-      160,  160,  160,  160,  160,  160,  161,  161,  161,  161,
-      161,  161,  161,  172,  220,  237,  777,  779,  220,  243,
-      243,  243,  780,  237,  161,  781,  172,  248,  248,  248,
-      248,  248,  248,  248,  249,  249,  249,  249,  249,  249,
-      249,  161,  250,  250,  250,  250,  250,  250,  250,  259,
</del><ins>+       73,  131,  137,  118,  770,  108,  118,  118,  136,  128,
+      118,  128,  118,  145,  149,  137,  149,  131,  131,  163,
+      155,  145,  155,  157,  157,  155,  155,  155,  155,  155,
+      155,  155,  209,  209,  209,  773,  774,  158,  777,  158,
+      157,  157,  158,  158,  158,  158,  158,  158,  158,  161,
+      161,  161,  161,  161,  161,  161,  162,  162,  162,  162,
+      162,  162,  162,  173,  221,  238,  778,  780,  221,  244,
+      244,  244,  781,  238,  162,  782,  173,  249,  249,  249,
+      249,  249,  249,  249,  250,  250,  250,  250,  250,  250,
+      250,  162,  251,  251,  251,  251,  251,  251,  251,  260,
</ins><span class="cx"> 
</span><del>-      259,  259,  249,  251,  251,  251,  251,  251,  251,  251,
-      271,  271,  271,  280,  280,  280,  284,  284,  284,  249,
-      783,  251,  293,  293,  293,  334,  334,  334,  375,  375,
-      375,  386,  386,  386,  387,  387,  387,  784,  251,  787,
-      788,  375,  375,  388,  388,  388,  439,  439,  439,  482,
-      482,  482,  789,  790,  502,  503,  519,  519,  519,  439,
-      439,  602,  482,  482,  502,  503,  553,  553,  553,  519,
-      519,  602,  519,  576,  576,  576,  630,  791,  792,  553,
-      553,  603,  794,  630,  795,  630,  576,  576,  603,  651,
-      603,  603,  796,  797,  798,  799,  651,  801,  651,  802,
</del><ins>+      260,  260,  250,  252,  252,  252,  252,  252,  252,  252,
+      272,  272,  272,  281,  281,  281,  285,  285,  285,  250,
+      784,  252,  294,  294,  294,  335,  335,  335,  376,  376,
+      376,  387,  387,  387,  388,  388,  388,  785,  252,  788,
+      789,  376,  376,  389,  389,  389,  440,  440,  440,  483,
+      483,  483,  790,  791,  503,  504,  520,  520,  520,  440,
+      440,  603,  483,  483,  503,  504,  554,  554,  554,  520,
+      520,  603,  520,  577,  577,  577,  631,  792,  793,  554,
+      554,  604,  795,  631,  796,  631,  577,  577,  604,  652,
+      604,  604,  797,  798,  799,  800,  652,  802,  652,  803,
</ins><span class="cx"> 
</span><del>-      803,  805,  809,  810,  811,  813,  814,  819,  819,  819,
-      820,  820,  820,  821,  822,  823,  823,  764,  763,  762,
-      761,  760,  759,  756,  755,  754,  753,  752,  751,  750,
-      749,  748,  747,  744,  743,  740,  739,  738,  737,  736,
-      735,  733,  732,  731,  730,  729,  727,  725,  721,  720,
-      719,  718,  717,  715,  714,  713,  712,  711,  710,  709,
-      708,  707,  706,  705,  704,  703,  701,  700,  699,  698,
-      697,  696,  695,  694,  693,  691,  690,  689,  688,  687,
-      686,  685,  684,  683,  682,  681,  680,  679,  678,  677,
-      676,  675,  674,  673,  672,  671,  670,  669,  668,  667,
</del><ins>+      804,  806,  810,  811,  812,  814,  815,  820,  820,  820,
+      821,  821,  821,  822,  823,  824,  824,  765,  764,  763,
+      762,  761,  760,  757,  756,  755,  754,  753,  752,  751,
+      750,  749,  748,  745,  744,  741,  740,  739,  738,  737,
+      736,  734,  733,  732,  731,  730,  728,  726,  722,  721,
+      720,  719,  718,  716,  715,  714,  713,  712,  711,  710,
+      709,  708,  707,  706,  705,  704,  702,  701,  700,  699,
+      698,  697,  696,  695,  694,  692,  691,  690,  689,  688,
+      687,  686,  685,  684,  683,  682,  681,  680,  679,  678,
+      677,  676,  675,  674,  673,  672,  671,  670,  669,  668,
</ins><span class="cx"> 
</span><del>-      666,  665,  664,  662,  661,  660,  659,  658,  657,  656,
-      654,  653,  650,  648,  647,  646,  644,  643,  642,  641,
-      640,  639,  638,  637,  636,  635,  634,  633,  632,  629,
-      628,  627,  626,  625,  624,  622,  621,  620,  619,  617,
-      616,  615,  614,  613,  612,  611,  610,  609,  608,  607,
-      606,  605,  604,  599,  597,  596,  595,  594,  593,  589,
-      588,  587,  586,  585,  584,  583,  582,  581,  579,  578,
-      574,  573,  571,  570,  568,  567,  566,  565,  564,  563,
-      562,  558,  557,  556,  554,  552,  551,  550,  549,  548,
-      547,  546,  545,  544,  543,  541,  540,  535,  534,  533,
</del><ins>+      667,  666,  665,  663,  662,  661,  660,  659,  658,  657,
+      655,  654,  651,  649,  648,  647,  645,  644,  643,  642,
+      641,  640,  639,  638,  637,  636,  635,  634,  633,  630,
+      629,  628,  627,  626,  625,  623,  622,  621,  620,  618,
+      617,  616,  615,  614,  613,  612,  611,  610,  609,  608,
+      607,  606,  605,  600,  598,  597,  596,  595,  594,  590,
+      589,  588,  587,  586,  585,  584,  583,  582,  580,  579,
+      575,  574,  572,  571,  569,  568,  567,  566,  565,  564,
+      563,  559,  558,  557,  555,  553,  552,  551,  550,  549,
+      548,  547,  546,  545,  544,  542,  541,  536,  535,  534,
</ins><span class="cx"> 
</span><del>-      532,  530,  529,  527,  526,  525,  524,  523,  521,  520,
-      518,  517,  516,  515,  514,  513,  512,  511,  509,  508,
-      507,  506,  505,  501,  500,  499,  498,  497,  496,  493,
-      492,  491,  490,  489,  488,  487,  486,  485,  484,  483,
-      481,  480,  477,  472,  470,  469,  468,  466,  465,  462,
-      461,  460,  459,  448,  447,  446,  444,  443,  442,  441,
-      440,  437,  435,  434,  433,  431,  430,  429,  428,  426,
-      424,  423,  418,  417,  415,  414,  413,  412,  411,  410,
-      409,  408,  407,  406,  405,  403,  402,  401,  400,  399,
-      398,  397,  395,  394,  393,  392,  391,  390,  389,  385,
</del><ins>+      533,  531,  530,  528,  527,  526,  525,  524,  522,  521,
+      519,  518,  517,  516,  515,  514,  513,  512,  510,  509,
+      508,  507,  506,  502,  501,  500,  499,  498,  497,  494,
+      493,  492,  491,  490,  489,  488,  487,  486,  485,  484,
+      482,  481,  478,  473,  471,  470,  469,  467,  466,  463,
+      462,  461,  460,  449,  448,  447,  445,  444,  443,  442,
+      441,  438,  436,  435,  434,  432,  431,  430,  429,  427,
+      425,  424,  419,  418,  416,  415,  414,  413,  412,  411,
+      410,  409,  408,  407,  406,  404,  403,  402,  401,  400,
+      399,  398,  396,  395,  394,  393,  392,  391,  390,  386,
</ins><span class="cx"> 
</span><del>-      381,  380,  379,  376,  374,  364,  362,  358,  357,  356,
-      355,  353,  352,  350,  345,  344,  343,  342,  341,  340,
-      335,  333,  332,  331,  330,  329,  327,  326,  323,  322,
-      321,  320,  319,  318,  317,  316,  315,  314,  313,  312,
-      311,  310,  309,  308,  307,  306,  305,  304,  303,  302,
-      301,  300,  299,  298,  297,  294,  292,  291,  290,  289,
-      288,  287,  286,  285,  283,  279,  277,  276,  275,  274,
-      270,  269,  268,  267,  266,  265,  264,  263,  262,  258,
-      256,  255,  254,  247,  246,  245,  244,  242,  241,  240,
-      239,  238,  236,  235,  234,  233,  232,  231,  230,  229,
</del><ins>+      382,  381,  380,  377,  375,  365,  363,  359,  358,  357,
+      356,  354,  353,  351,  346,  345,  344,  343,  342,  341,
+      336,  334,  333,  332,  331,  330,  328,  327,  324,  323,
+      322,  321,  320,  319,  318,  317,  316,  315,  314,  313,
+      312,  311,  310,  309,  308,  307,  306,  305,  304,  303,
+      302,  301,  300,  299,  298,  295,  293,  292,  291,  290,
+      289,  288,  287,  286,  284,  280,  278,  277,  276,  275,
+      271,  270,  269,  268,  267,  266,  265,  264,  263,  259,
+      257,  256,  255,  248,  247,  246,  245,  243,  242,  241,
+      240,  239,  237,  236,  235,  234,  233,  232,  231,  230,
</ins><span class="cx"> 
</span><del>-      228,  227,  226,  225,  224,  223,  222,  221,  219,  218,
-      217,  216,  215,  214,  213,  212,  211,  210,  209,  207,
-      206,  205,  204,  203,  202,  201,  200,  199,  198,  197,
-      196,  195,  194,  193,  192,  191,  189,  188,  187,  186,
-      185,  184,  183,  182,  181,  180,  179,  178,  176,  175,
-      174,  173,  171,  170,  169,  168,  167,  165,  150,  149,
-      147,  146,  145,  141,  140,  139,  138,  137,  134,  133,
-      132,  131,  129,  128,  126,  124,  123,  122,  120,  119,
-      118,  116,  115,  113,  112,  111,  110,  109,  108,  105,
-      104,  103,  102,  101,  100,   99,   98,   96,   95,   94,
</del><ins>+      229,  228,  227,  226,  225,  224,  223,  222,  220,  219,
+      218,  217,  216,  215,  214,  213,  212,  211,  210,  208,
+      207,  206,  205,  204,  203,  202,  201,  200,  199,  198,
+      197,  196,  195,  194,  193,  192,  190,  189,  188,  187,
+      186,  185,  184,  183,  182,  181,  180,  179,  177,  176,
+      175,  174,  172,  171,  170,  169,  168,  166,  151,  150,
+      148,  147,  146,  142,  141,  140,  139,  138,  135,  134,
+      133,  132,  130,  129,  127,  125,  124,  123,  121,  120,
+      119,  117,  116,  114,  113,  112,  111,  110,  109,  106,
+      105,  104,  103,  102,  101,  100,   99,   97,   96,   95,
</ins><span class="cx"> 
</span><del>-       93,   92,   91,   89,   88,   84,   80,   46,   44,   38,
-       25,   22,   19,   14,    9,    5,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
-      818,  818,  818,  818,  818,  818,  818,  818,  818
</del><ins>+       94,   93,   92,   90,   89,   85,   81,   46,   44,   38,
+       25,   22,   19,   14,    9,    5,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819
</ins><span class="cx">     } ;
</span><span class="cx"> 
</span><span class="cx"> /* Table of booleans, true if rule could match eol. */
</span><del>-static yyconst flex_int32_t yy_rule_can_match_eol[240] =
</del><ins>+static yyconst flex_int32_t yy_rule_can_match_eol[241] =
</ins><span class="cx">     {   0,
</span><span class="cx"> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
</span><span class="cx">     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
</span><span class="lines">@@ -997,8 +997,8 @@
</span><span class="cx">     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
</span><span class="cx">     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
</span><span class="cx">     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
</span><del>-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
-        };
</del><ins>+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
+    0,     };
</ins><span class="cx"> 
</span><span class="cx"> /* The intent behind this definition is that it'll catch
</span><span class="cx">  * any uses of REJECT which flex missed.
</span><span class="lines">@@ -1055,7 +1055,7 @@
</span><span class="cx"> static int ES2_keyword_ES3_reserved(TParseContext *context, int token);
</span><span class="cx"> static int ES2_ident_ES3_keyword(TParseContext *context, int token);
</span><span class="cx"> static int uint_constant(TParseContext *context);
</span><del>-static int int_constant(yyscan_t yyscanner);
</del><ins>+static int int_constant(TParseContext *context);
</ins><span class="cx"> static int float_constant(yyscan_t yyscanner);
</span><span class="cx"> static int floatsuffix_check(TParseContext* context);
</span><span class="cx"> 
</span><span class="lines">@@ -1350,13 +1350,13 @@
</span><span class="cx">                         while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
</span><span class="cx">                                 {
</span><span class="cx">                                 yy_current_state = (int) yy_def[yy_current_state];
</span><del>-                                if ( yy_current_state &gt;= 819 )
</del><ins>+                                if ( yy_current_state &gt;= 820 )
</ins><span class="cx">                                         yy_c = yy_meta[(unsigned int) yy_c];
</span><span class="cx">                                 }
</span><span class="cx">                         yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
</span><span class="cx">                         ++yy_cp;
</span><span class="cx">                         }
</span><del>-                while ( yy_current_state != 818 );
</del><ins>+                while ( yy_current_state != 819 );
</ins><span class="cx">                 yy_cp = yyg-&gt;yy_last_accepting_cpos;
</span><span class="cx">                 yy_current_state = yyg-&gt;yy_last_accepting_state;
</span><span class="cx"> 
</span><span class="lines">@@ -1759,7 +1759,7 @@
</span><span class="cx"> case 134:
</span><span class="cx"> YY_RULE_SETUP
</span><span class="cx"> { 
</span><del>-    if (context-&gt;shaderVersion &lt; 300) {
</del><ins>+    if (context-&gt;getShaderVersion() &lt; 300) {
</ins><span class="cx">                 yylval-&gt;lex.string = NewPoolTString(yytext); 
</span><span class="cx">             return check_type(yyscanner); 
</span><span class="cx">         }
</span><span class="lines">@@ -1770,7 +1770,7 @@
</span><span class="cx"> case 135:
</span><span class="cx"> YY_RULE_SETUP
</span><span class="cx"> {
</span><del>-    if (context-&gt;shaderVersion &gt;= 300)
</del><ins>+    if (context-&gt;getShaderVersion() &gt;= 300)
</ins><span class="cx">     {
</span><span class="cx">         yylval-&gt;lex.string = NewPoolTString(yytext);
</span><span class="cx">         return check_type(yyscanner);
</span><span class="lines">@@ -1833,15 +1833,15 @@
</span><span class="cx">         YY_BREAK
</span><span class="cx"> case 178:
</span><span class="cx"> YY_RULE_SETUP
</span><del>-{ return int_constant(yyscanner); }
</del><ins>+{ return int_constant(context); }
</ins><span class="cx">         YY_BREAK
</span><span class="cx"> case 179:
</span><span class="cx"> YY_RULE_SETUP
</span><del>-{ return int_constant(yyscanner); }
</del><ins>+{ return int_constant(context); }
</ins><span class="cx">         YY_BREAK
</span><span class="cx"> case 180:
</span><span class="cx"> YY_RULE_SETUP
</span><del>-{ return int_constant(yyscanner); }
</del><ins>+{ return int_constant(context); }
</ins><span class="cx">         YY_BREAK
</span><span class="cx"> case 181:
</span><span class="cx"> YY_RULE_SETUP
</span><span class="lines">@@ -2072,19 +2072,27 @@
</span><span class="cx"> {}
</span><span class="cx">         YY_BREAK
</span><span class="cx"> case 237:
</span><del>-/* rule 237 can match eol */
</del><span class="cx"> YY_RULE_SETUP
</span><ins>+{
+    yyextra-&gt;error(*yylloc, &quot;Illegal character at fieldname start&quot;, yytext, &quot;&quot;);
+    yyextra-&gt;recover();
+    return 0;
+}
+        YY_BREAK
+case 238:
+/* rule 238 can match eol */
+YY_RULE_SETUP
</ins><span class="cx"> { }
</span><span class="cx">         YY_BREAK
</span><span class="cx"> case YY_STATE_EOF(INITIAL):
</span><span class="cx"> case YY_STATE_EOF(FIELDS):
</span><span class="cx"> { yyterminate(); }
</span><span class="cx">         YY_BREAK
</span><del>-case 238:
</del><ins>+case 239:
</ins><span class="cx"> YY_RULE_SETUP
</span><span class="cx"> { return 0; }
</span><span class="cx">         YY_BREAK
</span><del>-case 239:
</del><ins>+case 240:
</ins><span class="cx"> YY_RULE_SETUP
</span><span class="cx"> ECHO;
</span><span class="cx">         YY_BREAK
</span><span class="lines">@@ -2381,7 +2389,7 @@
</span><span class="cx">                 while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
</span><span class="cx">                         {
</span><span class="cx">                         yy_current_state = (int) yy_def[yy_current_state];
</span><del>-                        if ( yy_current_state &gt;= 819 )
</del><ins>+                        if ( yy_current_state &gt;= 820 )
</ins><span class="cx">                                 yy_c = yy_meta[(unsigned int) yy_c];
</span><span class="cx">                         }
</span><span class="cx">                 yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
</span><span class="lines">@@ -2410,11 +2418,11 @@
</span><span class="cx">         while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
</span><span class="cx">                 {
</span><span class="cx">                 yy_current_state = (int) yy_def[yy_current_state];
</span><del>-                if ( yy_current_state &gt;= 819 )
</del><ins>+                if ( yy_current_state &gt;= 820 )
</ins><span class="cx">                         yy_c = yy_meta[(unsigned int) yy_c];
</span><span class="cx">                 }
</span><span class="cx">         yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
</span><del>-        yy_is_jam = (yy_current_state == 818);
</del><ins>+        yy_is_jam = (yy_current_state == 819);
</ins><span class="cx"> 
</span><span class="cx">         (void)yyg;
</span><span class="cx">         return yy_is_jam ? 0 : yy_current_state;
</span><span class="lines">@@ -3234,7 +3242,7 @@
</span><span class="cx"> 
</span><span class="cx"> yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) {
</span><span class="cx">     pp::Token token;
</span><del>-    yyget_extra(yyscanner)-&gt;preprocessor.lex(&amp;token);
</del><ins>+    yyget_extra(yyscanner)-&gt;getPreprocessor().lex(&amp;token);
</ins><span class="cx">     yy_size_t len = token.type == pp::Token::LAST ? 0 : token.text.size();
</span><span class="cx">     if (len &lt; max_size)
</span><span class="cx">         memcpy(buf, token.text.c_str(), len);
</span><span class="lines">@@ -3252,7 +3260,7 @@
</span><span class="cx">     struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
</span><span class="cx">     
</span><span class="cx">     int token = IDENTIFIER;
</span><del>-    TSymbol* symbol = yyextra-&gt;symbolTable.find(yytext, yyextra-&gt;shaderVersion);
</del><ins>+    TSymbol* symbol = yyextra-&gt;symbolTable.find(yytext, yyextra-&gt;getShaderVersion());
</ins><span class="cx">     if (symbol &amp;&amp; symbol-&gt;isVariable()) {
</span><span class="cx">         TVariable* variable = static_cast&lt;TVariable*&gt;(symbol);
</span><span class="cx">         if (variable-&gt;isUserType()) {
</span><span class="lines">@@ -3273,9 +3281,9 @@
</span><span class="cx"> 
</span><span class="cx"> int ES2_reserved_ES3_keyword(TParseContext *context, int token)
</span><span class="cx"> {
</span><del>-    yyscan_t yyscanner = (yyscan_t) context-&gt;scanner;
</del><ins>+    yyscan_t yyscanner = (yyscan_t) context-&gt;getScanner();
</ins><span class="cx"> 
</span><del>-    if (context-&gt;shaderVersion &lt; 300)
</del><ins>+    if (context-&gt;getShaderVersion() &lt; 300)
</ins><span class="cx">     {
</span><span class="cx">         return reserved_word(yyscanner);
</span><span class="cx">     }
</span><span class="lines">@@ -3285,9 +3293,9 @@
</span><span class="cx"> 
</span><span class="cx"> int ES2_keyword_ES3_reserved(TParseContext *context, int token)
</span><span class="cx"> {
</span><del>-    yyscan_t yyscanner = (yyscan_t) context-&gt;scanner;
</del><ins>+    yyscan_t yyscanner = (yyscan_t) context-&gt;getScanner();
</ins><span class="cx"> 
</span><del>-    if (context-&gt;shaderVersion &gt;= 300)
</del><ins>+    if (context-&gt;getShaderVersion() &gt;= 300)
</ins><span class="cx">     {
</span><span class="cx">         return reserved_word(yyscanner);
</span><span class="cx">     }
</span><span class="lines">@@ -3297,11 +3305,11 @@
</span><span class="cx"> 
</span><span class="cx"> int ES2_ident_ES3_keyword(TParseContext *context, int token)
</span><span class="cx"> {
</span><del>-    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;scanner;
-    yyscan_t yyscanner = (yyscan_t) context-&gt;scanner;
</del><ins>+    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;getScanner();
+    yyscan_t yyscanner = (yyscan_t) context-&gt;getScanner();
</ins><span class="cx"> 
</span><span class="cx">     // not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name
</span><del>-    if (context-&gt;shaderVersion &lt; 300)
</del><ins>+    if (context-&gt;getShaderVersion() &lt; 300)
</ins><span class="cx">     {
</span><span class="cx">         yylval-&gt;lex.string = NewPoolTString(yytext);
</span><span class="cx">         return check_type(yyscanner);
</span><span class="lines">@@ -3312,34 +3320,35 @@
</span><span class="cx"> 
</span><span class="cx"> int uint_constant(TParseContext *context)
</span><span class="cx"> {
</span><del>-    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;scanner;
-    yyscan_t yyscanner = (yyscan_t) context-&gt;scanner;
</del><ins>+    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;getScanner();
</ins><span class="cx"> 
</span><del>-    if (context-&gt;shaderVersion &lt; 300)
</del><ins>+    if (context-&gt;getShaderVersion() &lt; 300)
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;error(*yylloc, &quot;Unsigned integers are unsupported prior to GLSL ES 3.00&quot;, yytext, &quot;&quot;);
</span><span class="cx">         context-&gt;recover();
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!atoi_clamp(yytext, &amp;(yylval-&gt;lex.i)))
-        yyextra-&gt;warning(*yylloc, &quot;Integer overflow&quot;, yytext, &quot;&quot;);
</del><ins>+    if (!atoi_clamp(yytext, &amp;(yylval-&gt;lex.u)))
+        yyextra-&gt;error(*yylloc, &quot;Integer overflow&quot;, yytext, &quot;&quot;);
</ins><span class="cx"> 
</span><span class="cx">     return UINTCONSTANT;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int floatsuffix_check(TParseContext* context)
</span><span class="cx"> {
</span><del>-    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;scanner;
</del><ins>+    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;getScanner();
</ins><span class="cx"> 
</span><del>-    if (context-&gt;shaderVersion &lt; 300)
</del><ins>+    if (context-&gt;getShaderVersion() &lt; 300)
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;error(*yylloc, &quot;Floating-point suffix unsupported prior to GLSL ES 3.00&quot;, yytext);
</span><span class="cx">         context-&gt;recover();
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!atof_clamp(yytext, &amp;(yylval-&gt;lex.f)))
</del><ins>+    std::string text = yytext;
+    text.resize(text.size() - 1);
+    if (!strtof_clamp(text, &amp;(yylval-&gt;lex.f)))
</ins><span class="cx">         yyextra-&gt;warning(*yylloc, &quot;Float overflow&quot;, yytext, &quot;&quot;);
</span><span class="cx"> 
</span><span class="cx">     return(FLOATCONSTANT);
</span><span class="lines">@@ -3350,18 +3359,25 @@
</span><span class="cx">     context-&gt;recover();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-int int_constant(yyscan_t yyscanner) {
-    struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
</del><ins>+int int_constant(TParseContext *context) {
+    struct yyguts_t* yyg = (struct yyguts_t*) context-&gt;getScanner();
</ins><span class="cx"> 
</span><del>-    if (!atoi_clamp(yytext, &amp;(yylval-&gt;lex.i)))
-        yyextra-&gt;warning(*yylloc, &quot;Integer overflow&quot;, yytext, &quot;&quot;);
</del><ins>+    unsigned int u;
+    if (!atoi_clamp(yytext, &amp;u))
+    {
+        if (context-&gt;getShaderVersion() &gt;= 300)
+            yyextra-&gt;error(*yylloc, &quot;Integer overflow&quot;, yytext, &quot;&quot;);
+        else
+            yyextra-&gt;warning(*yylloc, &quot;Integer overflow&quot;, yytext, &quot;&quot;);
+    }
+    yylval-&gt;lex.i = static_cast&lt;int&gt;(u);
</ins><span class="cx">     return INTCONSTANT;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int float_constant(yyscan_t yyscanner) {
</span><span class="cx">     struct yyguts_t* yyg = (struct yyguts_t*) yyscanner;
</span><span class="cx"> 
</span><del>-    if (!atof_clamp(yytext, &amp;(yylval-&gt;lex.f)))
</del><ins>+    if (!strtof_clamp(yytext, &amp;(yylval-&gt;lex.f)))
</ins><span class="cx">         yyextra-&gt;warning(*yylloc, &quot;Float overflow&quot;, yytext, &quot;&quot;);
</span><span class="cx">     return FLOATCONSTANT;
</span><span class="cx"> }
</span><span class="lines">@@ -3371,15 +3387,15 @@
</span><span class="cx">     if (yylex_init_extra(context,&amp;scanner))
</span><span class="cx">         return 1;
</span><span class="cx"> 
</span><del>-    context-&gt;scanner = scanner;
</del><ins>+    context-&gt;setScanner(scanner);
</ins><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int glslang_finalize(TParseContext* context) {
</span><del>-    yyscan_t scanner = context-&gt;scanner;
</del><ins>+    yyscan_t scanner = context-&gt;getScanner();
</ins><span class="cx">     if (scanner == NULL) return 0;
</span><span class="cx">     
</span><del>-    context-&gt;scanner = NULL;
</del><ins>+    context-&gt;setScanner(NULL);
</ins><span class="cx">     yylex_destroy(scanner);
</span><span class="cx"> 
</span><span class="cx">     return 0;
</span><span class="lines">@@ -3387,24 +3403,26 @@
</span><span class="cx"> 
</span><span class="cx"> int glslang_scan(size_t count, const char* const string[], const int length[],
</span><span class="cx">                  TParseContext* context) {
</span><del>-    yyrestart(NULL,context-&gt;scanner);
-    yyset_column(0,context-&gt;scanner);
-    yyset_lineno(1,context-&gt;scanner);
</del><ins>+    yyrestart(NULL,context-&gt;getScanner());
+    yyset_column(0,context-&gt;getScanner());
+    yyset_lineno(1,context-&gt;getScanner());
</ins><span class="cx"> 
</span><span class="cx">     // Initialize preprocessor.
</span><del>-    if (!context-&gt;preprocessor.init(count, string, length))
</del><ins>+    pp::Preprocessor *preprocessor = &amp;context-&gt;getPreprocessor();
+
+    if (!preprocessor-&gt;init(count, string, length))
</ins><span class="cx">         return 1;
</span><span class="cx"> 
</span><span class="cx">     // Define extension macros.
</span><span class="cx">     const TExtensionBehavior&amp; extBehavior = context-&gt;extensionBehavior();
</span><span class="cx">     for (TExtensionBehavior::const_iterator iter = extBehavior.begin();
</span><span class="cx">          iter != extBehavior.end(); ++iter) {
</span><del>-        context-&gt;preprocessor.predefineMacro(iter-&gt;first.c_str(), 1);
</del><ins>+        preprocessor-&gt;predefineMacro(iter-&gt;first.c_str(), 1);
</ins><span class="cx">     }
</span><del>-    if (context-&gt;fragmentPrecisionHigh)
-        context-&gt;preprocessor.predefineMacro(&quot;GL_FRAGMENT_PRECISION_HIGH&quot;, 1);
</del><ins>+    if (context-&gt;getFragmentPrecisionHigh())
+        preprocessor-&gt;predefineMacro(&quot;GL_FRAGMENT_PRECISION_HIGH&quot;, 1);
</ins><span class="cx"> 
</span><del>-    context-&gt;preprocessor.setMaxTokenSize(GetGlobalMaxTokenSize(context-&gt;shaderSpec));
</del><ins>+    preprocessor-&gt;setMaxTokenSize(GetGlobalMaxTokenSize(context-&gt;getShaderSpec()));
</ins><span class="cx"> 
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorglslang_tabcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /* A Bison parser, made by GNU Bison 3.0.4.  */
</span><span class="cx"> 
</span><del>-/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ 
</del><ins>+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */
</ins><span class="cx"> 
</span><span class="cx"> /* Bison implementation for Yacc-like parsers in C
</span><span class="cx"> 
</span><span class="lines">@@ -89,6 +89,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><ins>+#include &quot;compiler/translator/Cache.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/ParseContext.h&quot;
</span><span class="cx"> #include &quot;GLSLANG/ShaderLang.h&quot;
</span><span class="lines">@@ -356,28 +357,28 @@
</span><span class="cx">   } while (0)
</span><span class="cx"> 
</span><span class="cx"> #define VERTEX_ONLY(S, L) {  \
</span><del>-    if (context-&gt;shaderType != GL_VERTEX_SHADER) {  \
</del><ins>+    if (context-&gt;getShaderType() != GL_VERTEX_SHADER) {  \
</ins><span class="cx">         context-&gt;error(L, &quot; supported in vertex shaders only &quot;, S);  \
</span><span class="cx">         context-&gt;recover();  \
</span><span class="cx">     }  \
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #define FRAG_ONLY(S, L) {  \
</span><del>-    if (context-&gt;shaderType != GL_FRAGMENT_SHADER) {  \
</del><ins>+    if (context-&gt;getShaderType() != GL_FRAGMENT_SHADER) {  \
</ins><span class="cx">         context-&gt;error(L, &quot; supported in fragment shaders only &quot;, S);  \
</span><span class="cx">         context-&gt;recover();  \
</span><span class="cx">     }  \
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #define ES2_ONLY(S, L) {  \
</span><del>-    if (context-&gt;shaderVersion != 100) {  \
</del><ins>+    if (context-&gt;getShaderVersion() != 100) {  \
</ins><span class="cx">         context-&gt;error(L, &quot; supported in GLSL ES 1.00 only &quot;, S);  \
</span><span class="cx">         context-&gt;recover();  \
</span><span class="cx">     }  \
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #define ES3_ONLY(TOKEN, LINE, REASON) {  \
</span><del>-    if (context-&gt;shaderVersion != 300) {  \
</del><ins>+    if (context-&gt;getShaderVersion() != 300) {  \
</ins><span class="cx">         context-&gt;error(LINE, REASON &quot; supported in GLSL ES 3.00 only &quot;, TOKEN);  \
</span><span class="cx">         context-&gt;recover();  \
</span><span class="cx">     }  \
</span><span class="lines">@@ -625,18 +626,18 @@
</span><span class="cx"> #endif /* !YYCOPY_NEEDED */
</span><span class="cx"> 
</span><span class="cx"> /* YYFINAL -- State number of the termination state.  */
</span><del>-#define YYFINAL  114
</del><ins>+#define YYFINAL  116
</ins><span class="cx"> /* YYLAST -- Last index in YYTABLE.  */
</span><del>-#define YYLAST   2523
</del><ins>+#define YYLAST   2516
</ins><span class="cx"> 
</span><span class="cx"> /* YYNTOKENS -- Number of terminals.  */
</span><span class="cx"> #define YYNTOKENS  128
</span><span class="cx"> /* YYNNTS -- Number of nonterminals.  */
</span><span class="cx"> #define YYNNTS  94
</span><span class="cx"> /* YYNRULES -- Number of rules.  */
</span><del>-#define YYNRULES  273
</del><ins>+#define YYNRULES  275
</ins><span class="cx"> /* YYNSTATES -- Number of states.  */
</span><del>-#define YYNSTATES  414
</del><ins>+#define YYNSTATES  417
</ins><span class="cx"> 
</span><span class="cx"> /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
</span><span class="cx">    by yylex, with out-of-bounds checking.  */
</span><span class="lines">@@ -695,34 +696,34 @@
</span><span class="cx">   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
</span><span class="cx"> static const yytype_uint16 yyrline[] =
</span><span class="cx"> {
</span><del>-       0,   211,   211,   212,   215,   239,   242,   247,   252,   257,
-     262,   268,   271,   274,   277,   280,   283,   289,   297,   308,
-     312,   320,   323,   329,   333,   340,   346,   355,   363,   369,
-     376,   386,   389,   392,   395,   405,   406,   407,   408,   416,
-     417,   420,   423,   430,   431,   434,   440,   441,   445,   452,
-     453,   456,   459,   462,   468,   469,   472,   478,   479,   486,
-     487,   494,   495,   502,   503,   509,   510,   516,   517,   523,
-     524,   530,   531,   539,   540,   541,   542,   546,   547,   548,
-     552,   556,   560,   564,   571,   574,   585,   593,   601,   629,
-     635,   646,   650,   654,   658,   665,   721,   724,   731,   739,
-     760,   781,   791,   819,   824,   834,   839,   849,   852,   855,
-     858,   864,   871,   874,   878,   882,   887,   892,   899,   903,
-     907,   911,   916,   921,   925,   932,   942,   948,   951,   957,
-     963,   970,   979,   988,   996,   999,  1006,  1010,  1017,  1020,
-    1024,  1028,  1037,  1046,  1054,  1064,  1076,  1079,  1082,  1088,
-    1095,  1098,  1104,  1107,  1110,  1116,  1119,  1124,  1139,  1143,
-    1147,  1151,  1155,  1159,  1164,  1169,  1174,  1179,  1184,  1189,
-    1194,  1199,  1204,  1209,  1214,  1219,  1224,  1229,  1234,  1239,
-    1244,  1249,  1254,  1259,  1264,  1268,  1272,  1276,  1280,  1284,
-    1288,  1292,  1296,  1300,  1304,  1308,  1312,  1316,  1320,  1324,
-    1332,  1340,  1344,  1357,  1357,  1360,  1360,  1366,  1369,  1385,
-    1388,  1397,  1401,  1407,  1414,  1429,  1433,  1437,  1438,  1444,
-    1445,  1446,  1447,  1448,  1449,  1450,  1454,  1455,  1455,  1455,
-    1465,  1466,  1470,  1470,  1471,  1471,  1476,  1479,  1489,  1492,
-    1498,  1499,  1503,  1511,  1515,  1522,  1522,  1529,  1532,  1539,
-    1544,  1559,  1559,  1564,  1564,  1571,  1571,  1579,  1582,  1588,
-    1591,  1597,  1601,  1608,  1611,  1614,  1617,  1620,  1629,  1633,
-    1640,  1643,  1649,  1649
</del><ins>+       0,   212,   212,   213,   216,   226,   229,   234,   239,   244,
+     249,   255,   258,   261,   264,   267,   270,   276,   284,   295,
+     299,   307,   310,   316,   320,   327,   333,   342,   350,   356,
+     363,   373,   376,   379,   382,   392,   393,   394,   395,   403,
+     404,   407,   410,   417,   418,   421,   427,   428,   432,   439,
+     440,   443,   446,   449,   455,   456,   459,   465,   466,   473,
+     474,   481,   482,   489,   490,   496,   497,   503,   504,   510,
+     511,   517,   518,   526,   527,   528,   529,   533,   534,   535,
+     539,   543,   547,   551,   558,   561,   567,   575,   583,   586,
+     592,   603,   607,   611,   615,   622,   628,   631,   638,   646,
+     667,   694,   704,   732,   737,   747,   752,   762,   765,   768,
+     771,   777,   784,   787,   791,   795,   800,   805,   812,   816,
+     820,   824,   829,   834,   838,   845,   855,   861,   864,   870,
+     876,   883,   892,   902,   910,   913,   920,   924,   928,   933,
+     941,   944,   948,   952,   961,   970,   978,   988,  1000,  1003,
+    1006,  1012,  1019,  1022,  1028,  1031,  1034,  1040,  1043,  1048,
+    1063,  1067,  1071,  1075,  1079,  1083,  1088,  1093,  1098,  1103,
+    1108,  1113,  1118,  1123,  1128,  1133,  1138,  1143,  1148,  1153,
+    1158,  1163,  1168,  1173,  1178,  1183,  1188,  1192,  1196,  1200,
+    1204,  1208,  1212,  1216,  1220,  1224,  1228,  1232,  1236,  1240,
+    1244,  1248,  1256,  1264,  1268,  1281,  1281,  1284,  1284,  1290,
+    1293,  1309,  1312,  1321,  1325,  1331,  1338,  1353,  1357,  1361,
+    1362,  1368,  1369,  1370,  1371,  1372,  1373,  1374,  1378,  1379,
+    1379,  1379,  1389,  1390,  1394,  1394,  1395,  1395,  1400,  1403,
+    1413,  1416,  1422,  1423,  1427,  1435,  1439,  1446,  1446,  1453,
+    1456,  1463,  1468,  1483,  1483,  1488,  1488,  1495,  1495,  1503,
+    1506,  1512,  1515,  1521,  1525,  1532,  1535,  1538,  1541,  1544,
+    1553,  1557,  1564,  1567,  1573,  1573
</ins><span class="cx"> };
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -811,12 +812,12 @@
</span><span class="cx"> };
</span><span class="cx"> # endif
</span><span class="cx"> 
</span><del>-#define YYPACT_NINF -347
</del><ins>+#define YYPACT_NINF -361
</ins><span class="cx"> 
</span><span class="cx"> #define yypact_value_is_default(Yystate) \
</span><del>-  (!!((Yystate) == (-347)))
</del><ins>+  (!!((Yystate) == (-361)))
</ins><span class="cx"> 
</span><del>-#define YYTABLE_NINF -233
</del><ins>+#define YYTABLE_NINF -235
</ins><span class="cx"> 
</span><span class="cx"> #define yytable_value_is_error(Yytable_value) \
</span><span class="cx">   0
</span><span class="lines">@@ -825,48 +826,48 @@
</span><span class="cx">      STATE-NUM.  */
</span><span class="cx"> static const yytype_int16 yypact[] =
</span><span class="cx"> {
</span><del>-    2161,    -4,  -347,  -347,  -347,   142,  -347,  -347,  -347,  -347,
-    -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,
-    -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,
-    -347,  -347,  -347,  -347,  -347,  -347,  -347,    -3,  -347,  -347,
-     -58,  -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,
-    -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,   -57,
-    -347,  -347,   -38,   -63,   -55,     3,   -50,  -347,    84,    11,
-    1180,  -347,  -347,  2446,    11,  -347,   -40,  -347,  2086,  -347,
-    -347,  -347,  -347,  2446,  -347,  -347,  -347,  -347,  -347,   -23,
-      31,  -347,    35,  -347,    78,  -347,  -347,  -347,  -347,  -347,
-    2310,   132,   106,  -347,     7,   -27,  -347,    60,  -347,  2236,
-    -347,  -347,  -347,  1250,  -347,  -347,   -33,  2236,  -347,    17,
-     -72,  -347,   408,  -347,  -347,  -347,  -347,   106,  2310,   -24,
-    -347,  1348,  1639,  -347,    79,  2310,   106,  1831,  -347,    71,
-    -347,  -347,  -347,  -347,  -347,  1639,  1639,  1639,  -347,  -347,
-    -347,  -347,  -347,  -347,  -347,    19,  -347,  -347,  -347,    73,
-     -21,  1734,    89,  -347,  1639,    66,    72,   108,   -64,    50,
-      81,    74,    87,   114,   123,   -62,  -347,   110,  -347,  -347,
-    1916,  2236,   116,  -347,    31,   104,   105,  -347,   117,   118,
-     109,  1446,   120,  1639,   113,   122,   111,  -347,  -347,    56,
-    -347,  -347,   -13,  -347,   -38,   125,  -347,  -347,  -347,  -347,
-     524,  -347,  -347,  -347,  -347,  -347,  -347,   124,  -347,  -347,
-    1541,  1639,   119,   127,  -347,  -347,   106,   129,    -8,  -347,
-     -66,  -347,  -347,  -347,    -9,  -347,  -347,  1639,  2378,  -347,
-    -347,  1639,   131,  -347,  -347,  -347,  1639,  1639,  1639,  1639,
-    1639,  1639,  1639,  1639,  1639,  1639,  1639,  1639,  1639,  1639,
-    1639,  1639,  1639,  1639,  1639,  1639,  -347,  -347,  2001,  -347,
-    -347,  -347,  -347,  -347,   133,  -347,  1639,  -347,  -347,    20,
-    1639,   128,  -347,  -347,  -347,   640,  -347,  -347,  -347,  -347,
-    -347,  -347,  -347,  -347,  -347,  -347,  -347,  1639,  1639,  -347,
-    -347,  -347,  1639,   126,   135,  -347,  1639,   130,    22,  1639,
-     106,  -347,   -78,  -347,  -347,   138,   136,  -347,   145,  -347,
-    -347,  -347,  -347,  -347,    66,    66,    72,    72,   108,   108,
-     108,   108,   -64,   -64,    50,    81,    74,    87,   114,   123,
-      86,  -347,   190,    35,   872,   988,     5,  -347,    10,  -347,
-    1085,   640,  -347,  -347,   143,  1639,   139,  -347,  1639,  -347,
-     144,  -347,  1639,  -347,  -347,  1639,   149,  -347,  -347,  -347,
-    -347,  1085,   133,  -347,   136,   106,  2310,   152,   150,  -347,
-    -347,  1639,  -347,  -347,   151,  -347,  1639,  -347,   146,   157,
-     246,  -347,   156,   154,   756,  -347,  -347,   155,    21,  1639,
-     756,   133,  -347,  1639,  -347,  -347,  -347,  -347,   158,   136,
-    -347,  -347,  -347,  -347
</del><ins>+    2154,   224,  -361,  -361,  -361,   130,  -361,  -361,  -361,  -361,
+    -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,
+    -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,
+    -361,  -361,  -361,  -361,  -361,  -361,  -361,   145,  -361,  -361,
+     -46,  -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,
+    -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,   -82,
+    -361,  -361,   -68,   -41,   -45,     9,     7,  -361,   117,    16,
+    1173,  -361,  -361,  2439,    16,  -361,    -9,  -361,  2079,  -361,
+    -361,  -361,  -361,    16,  -361,  2439,  -361,  -361,  -361,  -361,
+    -361,   -31,    23,  -361,    11,  -361,    63,  -361,  -361,  -361,
+    -361,  -361,  2303,   168,   120,  -361,    13,   -66,  -361,    31,
+    -361,  2229,  -361,  -361,  -361,  1243,  -361,  -361,  -361,    56,
+    2229,  -361,    17,   -50,  -361,   401,  -361,  -361,  -361,  -361,
+     120,  2303,   -18,  -361,  1341,  1632,  -361,   179,  2303,   120,
+    1824,  -361,    70,  -361,  -361,  -361,  -361,  -361,  1632,  1632,
+    1632,  -361,  -361,  -361,  -361,  -361,  -361,  -361,    22,  -361,
+    -361,  -361,   101,   -29,  1727,   114,  -361,  1632,    96,   -97,
+     128,   -54,   111,   118,   102,   115,   154,   153,   -69,  -361,
+     140,  -361,  -361,  1909,  2229,   124,  -361,    23,   134,   136,
+    -361,   147,   149,   143,  1439,   155,  1632,   148,   157,   160,
+    -361,  -361,   184,  -361,  -361,    52,  -361,   -68,   158,  -361,
+    -361,  -361,  -361,   517,  -361,  -361,  -361,  -361,  -361,  -361,
+     166,  -361,  -361,  1534,  1632,   150,   159,  -361,  -361,   120,
+     167,    61,  -361,   -62,  -361,  -361,  -361,    -5,  -361,  -361,
+    1632,  2371,  -361,  -361,  1632,   185,  -361,  -361,  -361,  1632,
+    1632,  1632,  1632,  1632,  1632,  1632,  1632,  1632,  1632,  1632,
+    1632,  1632,  1632,  1632,  1632,  1632,  1632,  1632,  1632,  -361,
+    -361,  1994,  -361,  -361,  -361,  -361,  -361,   181,  -361,  1632,
+    -361,  -361,    67,  1632,   180,  -361,  -361,  -361,   633,  -361,
+    -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,
+    1632,  1632,  -361,  -361,  -361,  1632,   178,   186,  -361,  1632,
+     182,    68,  1632,   120,  -361,   -71,  -361,  -361,   187,   188,
+    -361,   192,  -361,  -361,  -361,  -361,  -361,    96,    96,   -97,
+     -97,   128,   128,   128,   128,   -54,   -54,   111,   118,   102,
+     115,   154,   153,   113,  -361,   242,    11,   865,   981,     4,
+    -361,    18,  -361,  1078,   633,  -361,  -361,   194,  1632,   189,
+    -361,  1632,  -361,   196,  -361,  1632,  -361,  -361,  1632,   200,
+    -361,  -361,  -361,  -361,  1078,   181,  -361,   188,   120,  2303,
+     201,   198,  -361,  -361,  1632,  -361,  -361,   202,  -361,  1632,
+    -361,   191,   203,   293,  -361,   204,   205,   749,  -361,  -361,
+     197,    60,  1632,   749,   181,  -361,  1632,  -361,  -361,  -361,
+    -361,   199,   188,  -361,  -361,  -361,  -361
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
</span><span class="lines">@@ -874,78 +875,78 @@
</span><span class="cx">      means the default is an error.  */
</span><span class="cx"> static const yytype_uint16 yydefact[] =
</span><span class="cx"> {
</span><del>-       0,     0,   146,   147,   148,     0,   130,   138,   162,   159,
-     160,   161,   166,   167,   168,   169,   170,   171,   163,   164,
-     165,   172,   173,   174,   175,   176,   177,   139,   140,   143,
-     131,   178,   179,   180,   181,   182,   183,     0,   128,   127,
-       0,   158,   184,   186,   199,   200,   187,   188,   189,   190,
-     191,   192,   193,   194,   195,   185,   196,   197,   198,     0,
-     202,   271,   272,     0,    97,   107,     0,   112,   118,   135,
-       0,   133,   125,     0,   136,   144,   155,   201,     0,   268,
-     270,   132,   124,     0,   141,   142,     2,     3,   205,     0,
-       0,    88,     0,    95,   107,   129,   108,   109,   110,    98,
-       0,   107,     0,    89,     2,   119,   134,     0,    94,     0,
-     126,   145,   137,     0,     1,   269,     0,     0,   203,   152,
-       0,   150,     0,   273,    99,   104,   106,   111,     0,   113,
-     100,     0,     0,    87,     0,     0,     0,     0,   207,     4,
-       8,     6,     7,     9,    30,     0,     0,     0,   156,    37,
-      36,    38,    35,     5,    11,    31,    13,    18,    19,     0,
-       0,    24,     0,    39,     0,    43,    46,    49,    54,    57,
-      59,    61,    63,    65,    67,    69,    86,     0,    28,    90,
-       0,     0,     0,   149,     0,     0,     0,   253,     0,     0,
-       0,     0,     0,     0,     0,     0,   227,   236,   240,    39,
-      71,    84,     0,   216,     0,   144,   219,   238,   218,   217,
-       0,   220,   221,   222,   223,   224,   225,   101,   103,   105,
-       0,     0,     0,     0,   215,   123,     0,   213,     0,   211,
-       0,   208,    32,    33,     0,    15,    16,     0,     0,    22,
-      21,     0,   158,    25,    27,    34,     0,     0,     0,     0,
</del><ins>+       0,     0,   148,   149,   150,     0,   130,   140,   164,   161,
+     162,   163,   168,   169,   170,   171,   172,   173,   165,   166,
+     167,   174,   175,   176,   177,   178,   179,   141,   142,   145,
+     131,   180,   181,   182,   183,   184,   185,     0,   128,   127,
+       0,   160,   186,   188,   201,   202,   189,   190,   191,   192,
+     193,   194,   195,   196,   197,   187,   198,   199,   200,     0,
+     204,   273,   274,     0,    97,   107,     0,   112,   118,   135,
+       0,   133,   125,     0,   136,   146,   157,   203,     0,   270,
+     272,   132,   124,     0,   138,     0,   143,   144,     2,     3,
+     207,     0,     0,    88,     0,    95,   107,   129,   108,   109,
+     110,    98,     0,   107,     0,    89,     2,   119,   134,     0,
+      94,     0,   126,   147,   137,     0,     1,   271,   139,     0,
+       0,   205,   154,     0,   152,     0,   275,    99,   104,   106,
+     111,     0,   113,   100,     0,     0,    87,     0,     0,     0,
+       0,   209,     4,     8,     6,     7,     9,    30,     0,     0,
+       0,   158,    37,    36,    38,    35,     5,    11,    31,    13,
+      18,    19,     0,     0,    24,     0,    39,     0,    43,    46,
+      49,    54,    57,    59,    61,    63,    65,    67,    69,    86,
+       0,    28,    90,     0,     0,     0,   151,     0,     0,     0,
+     255,     0,     0,     0,     0,     0,     0,     0,     0,   229,
+     238,   242,    39,    71,    84,     0,   218,     0,   146,   221,
+     240,   220,   219,     0,   222,   223,   224,   225,   226,   227,
+     101,   103,   105,     0,     0,     0,     0,   217,   123,     0,
+     215,     0,   213,     0,   210,    32,    33,     0,    15,    16,
+       0,     0,    22,    21,     0,   160,    25,    27,    34,     0,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-       0,     0,     0,     0,     0,     0,   157,   206,     0,   153,
-     154,   151,   264,   263,   234,   255,     0,   267,   265,     0,
-       0,     0,   248,   251,   226,     0,    74,    75,    77,    76,
-      79,    80,    81,    82,    83,    78,    73,     0,     0,   241,
-     237,   239,     0,     0,     0,   117,     0,   120,     0,     0,
-       0,   209,     0,    91,    10,     0,    17,    29,    14,    20,
-      26,    40,    41,    42,    45,    44,    47,    48,    52,    53,
-      50,    51,    55,    56,    58,    60,    62,    64,    66,    68,
-       0,   204,     0,     0,     0,     0,     0,   266,     0,   247,
-       0,   228,    72,    85,     0,     0,   114,   121,     0,   210,
-       0,   212,     0,    92,    12,     0,     0,   233,   235,   258,
-     257,   260,   234,   245,   249,     0,     0,     0,     0,   102,
-     115,     0,   122,   214,     0,    70,     0,   259,     0,     0,
-     244,   242,     0,     0,     0,   229,   116,     0,     0,   261,
-       0,   234,   246,     0,   231,   252,   230,    93,     0,   262,
-     256,   243,   250,   254
</del><ins>+       0,     0,     0,     0,     0,     0,     0,     0,     0,   159,
+     208,     0,   155,   156,   153,   266,   265,   236,   257,     0,
+     269,   267,     0,     0,     0,   250,   253,   228,     0,    74,
+      75,    77,    76,    79,    80,    81,    82,    83,    78,    73,
+       0,     0,   243,   239,   241,     0,     0,     0,   117,     0,
+     120,     0,     0,     0,   211,     0,    91,    10,     0,    17,
+      29,    14,    20,    26,    40,    41,    42,    45,    44,    47,
+      48,    52,    53,    50,    51,    55,    56,    58,    60,    62,
+      64,    66,    68,     0,   206,     0,     0,     0,     0,     0,
+     268,     0,   249,     0,   230,    72,    85,     0,     0,   114,
+     121,     0,   212,     0,   214,     0,    92,    12,     0,     0,
+     235,   237,   260,   259,   262,   236,   247,   251,     0,     0,
+       0,     0,   102,   115,     0,   122,   216,     0,    70,     0,
+     261,     0,     0,   246,   244,     0,     0,     0,   231,   116,
+       0,     0,   263,     0,   236,   248,     0,   233,   254,   232,
+      93,     0,   264,   258,   245,   252,   256
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYPGOTO[NTERM-NUM].  */
</span><span class="cx"> static const yytype_int16 yypgoto[] =
</span><span class="cx"> {
</span><del>-    -347,   -39,  -347,  -347,  -347,  -347,  -347,  -347,    32,  -347,
-    -347,  -347,  -347,    63,  -347,   -48,   -37,   -90,   -54,    12,
-      14,    16,    18,    23,     9,  -347,   -96,  -127,  -347,  -138,
-    -125,  -347,    13,    15,  -347,  -347,  -347,   147,   184,   178,
-     153,  -347,  -347,  -325,  -347,  -347,  -106,   -47,   -68,   277,
-    -347,  -347,   100,     0,  -347,  -347,  -347,  -347,  -101,  -123,
-      61,   -22,  -214,   -56,  -202,  -323,  -102,  -347,  -347,  -109,
-    -346,  -347,  -347,   -88,     8,   -53,  -347,  -347,  -347,  -347,
-    -347,   -77,  -347,  -347,  -347,  -347,  -347,  -347,  -347,  -347,
-    -347,   217,  -347,  -347
</del><ins>+    -361,   -39,  -361,  -361,  -361,  -361,  -361,  -361,    73,  -361,
+    -361,  -361,  -361,  -107,  -361,   -15,   -20,   -67,   -19,    53,
+      54,    55,    51,    57,    58,  -361,  -110,  -132,  -361,  -146,
+    -125,  -361,     6,    12,  -361,  -361,  -361,   190,   228,   217,
+     195,  -361,  -361,  -336,    25,  -361,  -104,    27,   -57,   322,
+    -361,  -361,   141,     0,  -361,  -361,  -361,  -361,  -109,  -130,
+     100,    19,  -185,   -17,  -193,  -310,   -65,  -361,  -361,   -70,
+    -360,  -361,  -361,   -92,    46,   -13,  -361,  -361,  -361,  -361,
+    -361,   -38,  -361,  -361,  -361,  -361,  -361,  -361,  -361,  -361,
+    -361,   259,  -361,  -361
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYDEFGOTO[NTERM-NUM].  */
</span><span class="cx"> static const yytype_int16 yydefgoto[] =
</span><span class="cx"> {
</span><del>-      -1,   227,   153,   154,   155,   315,   156,   157,   158,   159,
-     160,   161,   162,   199,   164,   165,   166,   167,   168,   169,
-     170,   171,   172,   173,   174,   175,   200,   201,   297,   202,
-     177,   109,   203,   204,    63,    64,    65,   125,    99,   100,
-     126,    66,    67,    68,    69,   101,    70,    71,    72,    73,
-      74,   120,   121,   178,    76,    77,   181,   117,   137,   138,
-     228,   229,   225,   206,   207,   208,   209,   285,   378,   405,
-     342,   343,   344,   406,   210,   211,   212,   391,   213,   392,
-     214,   377,   215,   350,   274,   345,   371,   388,   389,   216,
-      78,    79,    80,    92
</del><ins>+      -1,   230,   156,   157,   158,   318,   159,   160,   161,   162,
+     163,   164,   165,   202,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,   177,   178,   203,   204,   300,   205,
+     180,   111,   206,   207,    63,    64,    65,   128,   101,   102,
+     129,    66,    67,    68,    69,   103,    70,    71,    72,    73,
+      74,   123,   124,   181,    76,    77,   184,   120,   140,   141,
+     231,   232,   228,   209,   210,   211,   212,   288,   381,   408,
+     345,   346,   347,   409,   213,   214,   215,   394,   216,   395,
+     217,   380,   218,   353,   277,   348,   374,   391,   392,   219,
+      78,    79,    80,    94
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
</span><span class="lines">@@ -953,420 +954,399 @@
</span><span class="cx">      number is the opposite.  If YYTABLE_NINF, syntax error.  */
</span><span class="cx"> static const yytype_int16 yytable[] =
</span><span class="cx"> {
</span><del>-      75,    89,   110,   135,   123,   224,   223,   305,   301,   234,
-     312,   135,    95,    61,   231,    62,   180,   176,    86,    87,
-       7,   368,   106,   253,   254,   375,   390,   112,   362,   105,
-     264,   135,   127,   183,   243,   176,   363,    84,    85,   184,
-      81,   136,    93,    96,    97,    98,   375,    90,   313,   136,
-      88,    27,    28,   279,    29,   411,    94,   231,   255,   256,
-     127,   102,    37,   129,   103,   265,   113,   226,   281,   136,
-      75,   404,    82,   111,   135,   135,    91,   404,    75,   131,
-     268,   179,   220,   116,   240,   118,   132,    95,   217,   221,
-     241,    61,   357,    62,   224,   304,   314,   176,   298,   316,
-      75,   299,   298,   310,   235,   236,   311,   119,   -96,    75,
-     372,   130,   136,   136,   320,   373,   298,    75,    96,    97,
-      98,   298,   205,    81,   176,   237,   408,   340,    75,   238,
-     182,   298,   298,   310,   347,    75,   359,    75,   346,   257,
-     258,   380,   348,   122,   382,   231,     2,     3,     4,   301,
-     286,   287,   288,   289,   290,   291,   292,   293,   294,   295,
-     104,    87,   135,   328,   329,   330,   331,   396,   133,   296,
-     352,   353,    96,    97,    98,   -29,   163,   354,   239,   224,
-      75,    75,    86,    87,   360,   246,   247,   248,   249,   412,
-     250,   251,   252,   244,   163,   269,   270,   298,   365,   260,
-     136,   324,   325,   332,   333,   262,   176,   259,   232,   233,
-     205,   261,   374,   176,   326,   327,   263,   266,   272,   273,
-     284,   275,   276,   277,   280,   282,   283,   245,   224,   -28,
-     302,   224,   306,   374,   307,   309,   -23,   384,   385,   355,
-     349,  -232,   356,   358,   376,   364,   366,   298,   398,   -30,
-     379,   383,   381,   386,   224,   367,   163,   394,   397,   395,
-     399,   409,   400,   401,   196,   376,   176,   403,    75,   407,
-     319,   334,   413,   339,   335,   218,   224,   336,   124,   128,
-     337,   219,    83,   163,   271,   205,   338,   308,   361,   369,
-     402,   410,   370,   351,   387,   115,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   110,   321,
-     322,   323,   163,   163,   163,   163,   163,   163,   163,   163,
-     163,   163,   163,   163,   163,   163,   163,   163,     0,     0,
-       0,     0,     0,     0,     0,     0,   393,     0,     0,     0,
-       0,     0,     0,     0,   205,   205,     0,     0,     0,     0,
-     205,   205,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   163,     0,     0,     0,     0,
-       0,   205,   163,     0,     0,     0,    75,     0,     0,     0,
</del><ins>+      75,    91,   126,   227,   237,   179,    61,   138,   166,   226,
+     234,   183,    62,   112,   315,   393,   138,   378,    97,   252,
+     304,   253,    92,   267,   179,     7,    83,   166,    84,   107,
+      88,    89,   246,   256,   257,   365,   138,   371,   378,   308,
+     134,   235,   236,   366,   414,   130,    93,   135,   282,    98,
+      99,   100,   316,   234,   139,   186,    27,    28,   268,    29,
+     248,   187,    90,   139,    95,   132,    96,    37,   258,   259,
+      75,   284,    97,   113,   130,   271,   243,   121,    75,   138,
+     138,   229,   244,   139,    61,   119,   179,   407,   223,   166,
+      62,   220,   227,   407,   319,   224,   108,   115,   307,   122,
+     317,   114,    75,    98,    99,   100,   301,   238,   239,   375,
+     118,    75,   323,   179,   -96,   301,   166,   133,   104,   125,
+      75,   105,   343,   376,   360,   208,   139,   139,   240,   301,
+     185,    75,   241,   349,     2,     3,     4,   351,    75,   136,
+      75,   234,   324,   325,   326,   166,   166,   166,   166,   166,
+     166,   166,   166,   166,   166,   166,   166,   166,   166,   166,
+     166,   304,    83,   301,    84,   411,   302,   138,   355,   356,
+     182,   301,   313,   383,   -29,   314,   385,   227,   301,   313,
+     357,   350,   362,    75,    75,    86,    87,   363,     7,   331,
+     332,   333,   334,   106,    89,   179,    88,    89,   166,   399,
+     260,   261,   179,   272,   273,   166,   242,   377,    98,    99,
+     100,   254,   255,   208,   139,   249,   250,   251,   247,    27,
+      28,   415,    29,    81,   301,   368,   227,   263,   377,   227,
+      37,    38,    39,     7,   329,   330,   388,   327,   328,   264,
+     387,   335,   336,   401,   262,   265,   266,   269,   275,   379,
+     276,   278,   227,   279,   370,   179,   412,   280,   166,   283,
+     285,   286,   -28,   309,    27,    28,   310,    29,    81,   287,
+     379,    75,   305,   312,   227,    37,    38,    39,   289,   290,
+     291,   292,   293,   294,   295,   296,   297,   298,   208,  -234,
+     -23,   358,   352,   359,   367,   361,   -30,   299,   369,   301,
+      82,   382,   384,   386,   389,   402,   397,   398,   403,   400,
+     404,   410,   199,   416,   322,   337,   340,   338,   406,   339,
+     131,   221,   112,   341,   127,   342,   222,    85,   274,   311,
+     405,   372,   364,   413,   354,   373,   390,   117,     0,   396,
+       0,     0,     0,     0,     0,     0,     0,   208,   208,     0,
+       0,     0,     0,   208,   208,     0,     0,     0,     0,     0,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-       0,     0,     0,     0,   205,     0,     0,     0,     0,     0,
-     205,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,   185,   186,   187,   163,   188,   189,   190,   191,
-     192,   193,   194,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-       0,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,   195,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,     0,
-      56,    57,    58,    59,   139,    60,   140,   141,   142,   143,
-     144,     0,     0,   145,   146,     0,     0,     0,     0,     0,
</del><ins>+       0,     0,     0,     0,   208,     0,     0,     0,     0,    75,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-       0,     0,   147,     0,     0,     0,   196,   197,     0,     0,
-       0,     0,   198,   149,   150,   151,   152,     1,     2,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,   185,   186,
-     187,     0,   188,   189,   190,   191,   192,   193,   194,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,     0,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-     195,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,     0,    56,    57,    58,    59,
-     139,    60,   140,   141,   142,   143,   144,     0,     0,   145,
-     146,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   147,     0,
-       0,     0,   196,   300,     0,     0,     0,     0,   198,   149,
-     150,   151,   152,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,   185,   186,   187,     0,   188,   189,
-     190,   191,   192,   193,   194,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,     0,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,   195,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,     0,    56,    57,    58,    59,   139,    60,   140,   141,
-     142,   143,   144,     0,     0,   145,   146,     0,     0,     0,
</del><ins>+       0,     0,     0,     0,     0,     0,     0,   208,     0,     0,
+       0,     0,     0,   208,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,   188,   189,   190,     0,   191,
+     192,   193,   194,   195,   196,   197,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,   198,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,     0,    56,    57,    58,    59,   142,    60,   143,
+     144,   145,   146,   147,     0,     0,   148,   149,     0,     0,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-       0,     0,     0,     0,   147,     0,     0,     0,   196,     0,
-       0,     0,     0,     0,   198,   149,   150,   151,   152,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-     185,   186,   187,     0,   188,   189,   190,   191,   192,   193,
-     194,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,   195,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
-      58,    59,   139,    60,   140,   141,   142,   143,   144,     0,
-       0,   145,   146,     0,     0,     0,     0,     0,     0,     0,
</del><ins>+       0,     0,     0,     0,     0,   150,     0,     0,     0,   199,
+     200,     0,     0,     0,     0,   201,   152,   153,   154,   155,
+       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,   188,   189,   190,     0,   191,   192,   193,   194,   195,
+     196,   197,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,   198,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
+      57,    58,    59,   142,    60,   143,   144,   145,   146,   147,
+       0,     0,   148,   149,     0,     0,     0,     0,     0,     0,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-     147,     0,     0,     0,   122,     0,     0,     0,     0,     0,
-     198,   149,   150,   151,   152,     1,     2,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,   185,   186,   187,     0,
-     188,   189,   190,   191,   192,   193,   194,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,   195,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,     0,    56,    57,    58,    59,   139,    60,
-     140,   141,   142,   143,   144,     0,     0,   145,   146,     0,
</del><ins>+       0,   150,     0,     0,     0,   199,   303,     0,     0,     0,
+       0,   201,   152,   153,   154,   155,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,   188,   189,   190,
+       0,   191,   192,   193,   194,   195,   196,   197,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,     0,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,   198,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,     0,    56,    57,    58,    59,   142,
+      60,   143,   144,   145,   146,   147,     0,     0,   148,   149,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-       0,     0,     0,     0,     0,     0,   147,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   198,   149,   150,   151,
-     152,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-       0,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,     0,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,     0,
-      56,    57,    58,    59,   139,    60,   140,   141,   142,   143,
-     144,     0,     0,   145,   146,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   134,     2,
-       3,     4,   147,     6,     7,     8,     9,    10,    11,     0,
-       0,     0,   198,   149,   150,   151,   152,     0,     0,     0,
</del><ins>+       0,     0,     0,     0,     0,     0,     0,   150,     0,     0,
+       0,   199,     0,     0,     0,     0,     0,   201,   152,   153,
+     154,   155,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,   188,   189,   190,     0,   191,   192,   193,
+     194,   195,   196,   197,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,     0,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,   198,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+       0,    56,    57,    58,    59,   142,    60,   143,   144,   145,
+     146,   147,     0,     0,   148,   149,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   150,     0,     0,     0,   125,     0,     0,
+       0,     0,     0,   201,   152,   153,   154,   155,     1,     2,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,   188,
+     189,   190,     0,   191,   192,   193,   194,   195,   196,   197,
</ins><span class="cx">       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
</span><span class="cx">       22,    23,    24,    25,    26,    27,    28,     0,    29,    30,
</span><span class="cx">       31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
</span><del>-      41,     0,    42,    43,    44,    45,    46,    47,    48,    49,
</del><ins>+      41,   198,    42,    43,    44,    45,    46,    47,    48,    49,
</ins><span class="cx">       50,    51,    52,    53,    54,    55,     0,    56,    57,    58,
</span><del>-      59,   139,    60,   140,   141,   142,   143,   144,     0,     0,
-     145,   146,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     2,     3,     4,     0,     0,   147,
-       8,     9,    10,    11,     0,     0,     0,     0,     0,     0,
-     149,   150,   151,   152,     0,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-       0,     0,     0,     0,     0,    31,    32,    33,    34,    35,
-      36,     0,     0,     0,    40,    41,     0,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,     0,    56,    57,    58,     0,   107,    60,     0,     0,
-       8,     9,    10,    11,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-       0,     0,     0,     0,   108,    31,    32,    33,    34,    35,
-      36,     0,     0,     0,    40,    41,     0,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,     0,    56,    57,    58,     0,   139,    60,   140,   141,
-     142,   143,   144,     0,     0,   145,   146,     0,     0,     0,
</del><ins>+      59,   142,    60,   143,   144,   145,   146,   147,     0,     0,
+     148,   149,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   150,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   201,
+     152,   153,   154,   155,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,     0,    56,    57,    58,    59,   142,    60,   143,
+     144,   145,   146,   147,     0,     0,   148,   149,     0,     0,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-       0,     0,     0,     0,   147,     0,     0,   148,     8,     9,
-      10,    11,     0,     0,     0,   149,   150,   151,   152,     0,
</del><ins>+       0,   137,     2,     3,     4,   150,     6,     7,     8,     9,
+      10,    11,     0,     0,     0,   201,   152,   153,   154,   155,
</ins><span class="cx">        0,     0,     0,    12,    13,    14,    15,    16,    17,    18,
</span><del>-      19,    20,    21,    22,    23,    24,    25,    26,     0,     0,
-       0,     0,     0,    31,    32,    33,    34,    35,    36,     0,
-       0,     0,    40,    41,     0,    42,    43,    44,    45,    46,
</del><ins>+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+       0,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,     0,    42,    43,    44,    45,    46,
</ins><span class="cx">       47,    48,    49,    50,    51,    52,    53,    54,    55,     0,
</span><del>-      56,    57,    58,     0,   139,    60,   140,   141,   142,   143,
-     144,     0,     0,   145,   146,     0,     0,     0,     0,     0,
</del><ins>+      56,    57,    58,    59,   142,    60,   143,   144,   145,   146,
+     147,     0,     0,   148,   149,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     2,     3,     4,
+       0,     0,   150,     8,     9,    10,    11,     0,     0,     0,
+       0,     0,     0,   152,   153,   154,   155,     0,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,     0,     0,     0,     0,     0,    31,    32,
+      33,    34,    35,    36,     0,     0,     0,    40,    41,     0,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,     0,    56,    57,    58,     0,   109,
+      60,     0,     0,     8,     9,    10,    11,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,     0,     0,     0,     0,   110,    31,    32,
+      33,    34,    35,    36,     0,     0,     0,    40,    41,     0,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,     0,    56,    57,    58,     0,   142,
+      60,   143,   144,   145,   146,   147,     0,     0,   148,   149,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-       0,     0,   147,     0,     0,   222,     8,     9,    10,    11,
-       0,     0,     0,   149,   150,   151,   152,     0,     0,     0,
-       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,     0,     0,     0,     0,
-       0,    31,    32,    33,    34,    35,    36,     0,     0,     0,
-      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
-      58,     0,   139,    60,   140,   141,   142,   143,   144,     0,
-       0,   145,   146,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     147,     8,     9,    10,    11,     0,     0,     0,     0,     0,
-     278,   149,   150,   151,   152,     0,    12,    13,    14,    15,
</del><ins>+       0,     0,     0,     0,     0,     0,     0,   150,     0,     0,
+     151,     8,     9,    10,    11,     0,     0,     0,   152,   153,
+     154,   155,     0,     0,     0,     0,    12,    13,    14,    15,
</ins><span class="cx">       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
</span><span class="cx">       26,     0,     0,     0,     0,     0,    31,    32,    33,    34,
</span><span class="cx">       35,    36,     0,     0,     0,    40,    41,     0,    42,    43,
</span><span class="cx">       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
</span><del>-      54,    55,     0,    56,    57,    58,     0,   139,    60,   140,
-     141,   142,   143,   144,     0,     0,   145,   146,     0,     0,
</del><ins>+      54,    55,     0,    56,    57,    58,     0,   142,    60,   143,
+     144,   145,   146,   147,     0,     0,   148,   149,     0,     0,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-       0,     0,     0,     0,     0,   147,     0,     0,   303,     8,
-       9,    10,    11,     0,     0,     0,   149,   150,   151,   152,
</del><ins>+       0,     0,     0,     0,     0,   150,     0,     0,   225,     8,
+       9,    10,    11,     0,     0,     0,   152,   153,   154,   155,
</ins><span class="cx">        0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
</span><span class="cx">       18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
</span><span class="cx">        0,     0,     0,     0,    31,    32,    33,    34,    35,    36,
</span><span class="cx">        0,     0,     0,    40,    41,     0,    42,    43,    44,    45,
</span><span class="cx">       46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
</span><del>-       0,    56,    57,    58,     0,   139,    60,   140,   141,   142,
-     143,   144,     0,     0,   145,   146,     0,     0,     0,     0,
</del><ins>+       0,    56,    57,    58,     0,   142,    60,   143,   144,   145,
+     146,   147,     0,     0,   148,   149,     0,     0,     0,     0,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-       0,     0,     0,   147,     8,     9,    10,    11,     0,     0,
-       0,     0,     0,     0,   149,   150,   151,   152,     0,    12,
</del><ins>+       0,     0,     0,   150,     8,     9,    10,    11,     0,     0,
+       0,     0,     0,   281,   152,   153,   154,   155,     0,    12,
</ins><span class="cx">       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
</span><span class="cx">       23,    24,    25,    26,     0,     0,     0,     0,     0,    31,
</span><del>-      32,    33,    34,    35,    36,     0,     0,     0,    40,   242,
</del><ins>+      32,    33,    34,    35,    36,     0,     0,     0,    40,    41,
</ins><span class="cx">        0,    42,    43,    44,    45,    46,    47,    48,    49,    50,
</span><span class="cx">       51,    52,    53,    54,    55,     0,    56,    57,    58,     0,
</span><del>-     139,    60,   140,   141,   142,   143,   144,     0,     0,   145,
-     146,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   134,     2,     3,     4,   147,     6,
-       7,     8,     9,    10,    11,     0,     0,     0,     0,   149,
-     150,   151,   152,     0,     0,     0,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,     0,    56,    57,    58,    59,     0,    60,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   134,
-       2,     3,     4,     0,     6,     7,     8,     9,    10,    11,
</del><ins>+     142,    60,   143,   144,   145,   146,   147,     0,     0,   148,
+     149,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   150,     0,
+       0,   306,     8,     9,    10,    11,     0,     0,     0,   152,
+     153,   154,   155,     0,     0,     0,     0,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,     0,     0,     0,     0,     0,    31,    32,    33,
+      34,    35,    36,     0,     0,     0,    40,    41,     0,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,     0,    56,    57,    58,     0,   142,    60,
+     143,   144,   145,   146,   147,     0,     0,   148,   149,     0,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
</span><del>-     230,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
-      58,    59,     0,    60,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   134,     2,     3,     4,     0,     6,
-       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   267,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,     0,    56,    57,    58,    59,     0,    60,     0,
-       0,     0,     0,     0,     0,     0,   114,     0,     0,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     341,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
-      58,    59,     0,    60,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
</del><ins>+       0,     0,     0,     0,     0,     0,   150,     8,     9,    10,
+      11,     0,     0,     0,     0,     0,     0,   152,   153,   154,
+     155,     0,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,     0,     0,     0,
+       0,     0,    31,    32,    33,    34,    35,    36,     0,     0,
+       0,    40,   245,     0,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
+      57,    58,     0,   142,    60,   143,   144,   145,   146,   147,
+       0,     0,   148,   149,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   137,     2,     3,
+       4,   150,     6,     7,     8,     9,    10,    11,     0,     0,
+       0,     0,   152,   153,   154,   155,     0,     0,     0,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,     0,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+       0,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,     0,    56,    57,    58,    59,
+       0,    60,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   137,     2,     3,     4,     0,     6,     7,     8,
+       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   233,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,     0,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,     0,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+       0,    56,    57,    58,    59,     0,    60,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   137,     2,     3,
+       4,     0,     6,     7,     8,     9,    10,    11,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   270,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,     0,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+       0,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,     0,    56,    57,    58,    59,
+       0,    60,     0,     0,     0,     0,     0,     0,     0,   116,
+       0,     0,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   344,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,     0,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,     0,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+       0,    56,    57,    58,    59,     0,    60,     1,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,     0,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+       0,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,     0,    56,    57,    58,    59,
+       0,    60,   137,     2,     3,     4,     0,     6,     7,     8,
+       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,     0,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,     0,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+       0,    56,    57,    58,    59,     0,    60,     2,     3,     4,
+       0,     0,     0,     8,     9,    10,    11,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,     0,     0,     0,     0,     0,    31,    32,
+      33,    34,    35,    36,     0,     0,     0,    40,    41,     0,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,     0,    56,    57,    58,     0,     0,
+      60,     8,     9,    10,    11,     0,     0,     0,     0,     0,
</ins><span class="cx">        0,     0,     0,     0,     0,     0,    12,    13,    14,    15,
</span><span class="cx">       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
</span><del>-      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
</del><ins>+      26,     0,     0,     0,     0,     0,    31,    32,    33,    34,
+      35,    36,     0,     0,     0,    40,    41,     0,    42,    43,
</ins><span class="cx">       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
</span><del>-      54,    55,     0,    56,    57,    58,    59,     0,    60,   134,
-       2,     3,     4,     0,     6,     7,     8,     9,    10,    11,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
-      58,    59,     0,    60,     2,     3,     4,     0,     0,     0,
-       8,     9,    10,    11,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-       0,     0,     0,     0,     0,    31,    32,    33,    34,    35,
-      36,     0,     0,     0,    40,    41,     0,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,     0,    56,    57,    58,     0,     0,    60,     8,     9,
-      10,    11,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,     0,     0,
-       0,     0,     0,    31,    32,    33,    34,    35,    36,     0,
-       0,     0,    40,    41,     0,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,     0,
-      56,    57,    58,     0,   317,    60,     8,     9,    10,    11,
-     318,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,     0,     0,     0,     0,
-       0,    31,    32,    33,    34,    35,    36,     0,     0,     0,
-      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
-      58,     0,     0,    60
</del><ins>+      54,    55,     0,    56,    57,    58,     0,   320,    60,     8,
+       9,    10,    11,   321,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
+       0,     0,     0,     0,    31,    32,    33,    34,    35,    36,
+       0,     0,     0,    40,    41,     0,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+       0,    56,    57,    58,     0,     0,    60
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> static const yytype_int16 yycheck[] =
</span><span class="cx"> {
</span><del>-       0,    40,    70,   109,    92,   132,   131,   221,   210,   147,
-      76,   117,     9,     0,   137,     0,   117,   113,    76,    77,
-       9,   344,    69,    87,    88,   350,   372,    74,   106,    68,
-      92,   137,   100,   105,   161,   131,   114,    40,    41,   111,
-      44,   109,   105,    40,    41,    42,   371,   104,   114,   117,
-     108,    40,    41,   191,    43,   401,   111,   180,   122,   123,
-     128,   111,    51,   102,   114,   127,   106,   135,   193,   137,
-      70,   394,    76,    73,   180,   181,   114,   400,    78,   106,
-     181,   114,   106,    83,   105,   108,   113,     9,   127,   113,
-     111,    78,   306,    78,   221,   220,   105,   193,   111,   237,
-     100,   114,   111,   111,    85,    86,   114,    76,   105,   109,
-     105,   104,   180,   181,   241,   105,   111,   117,    40,    41,
-      42,   111,   122,    44,   220,   106,   105,   265,   128,   110,
-     113,   111,   111,   111,   114,   135,   114,   137,   276,    89,
-      90,   355,   280,   108,   358,   268,     4,     5,     6,   351,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-      76,    77,   268,   253,   254,   255,   256,   381,   108,   113,
-     297,   298,    40,    41,    42,   104,   113,   302,   105,   306,
-     180,   181,    76,    77,   309,   119,   120,   121,   116,   403,
-     118,    83,    84,   104,   131,    79,    80,   111,   112,   125,
-     268,   249,   250,   257,   258,    91,   302,   126,   145,   146,
-     210,   124,   350,   309,   251,   252,    93,   107,   114,   114,
-     109,   104,   104,   114,   104,   112,   104,   164,   355,   104,
-     106,   358,   113,   371,   107,   106,   105,   362,   365,   113,
-     112,   108,   107,   113,   350,   107,    56,   111,   386,   104,
-     107,   107,   113,   104,   381,   343,   193,   105,   107,   109,
-     114,   399,   105,    17,   108,   371,   362,   113,   268,   114,
-     238,   259,   114,   264,   260,   128,   403,   261,    94,   101,
-     262,   128,     5,   220,   184,   285,   263,   226,   310,   345,
-     392,   400,   345,   285,   371,    78,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   376,   246,
-     247,   248,   249,   250,   251,   252,   253,   254,   255,   256,
-     257,   258,   259,   260,   261,   262,   263,   264,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   375,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   344,   345,    -1,    -1,    -1,    -1,
-     350,   351,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   302,    -1,    -1,    -1,    -1,
-      -1,   371,   309,    -1,    -1,    -1,   376,    -1,    -1,    -1,
</del><ins>+       0,    40,    94,   135,   150,   115,     0,   111,   115,   134,
+     140,   120,     0,    70,    76,   375,   120,   353,     9,   116,
+     213,   118,   104,    92,   134,     9,     1,   134,     1,    68,
+      76,    77,   164,    87,    88,   106,   140,   347,   374,   224,
+     106,   148,   149,   114,   404,   102,   114,   113,   194,    40,
+      41,    42,   114,   183,   111,   105,    40,    41,   127,    43,
+     167,   111,   108,   120,   105,   104,   111,    51,   122,   123,
+      70,   196,     9,    73,   131,   184,   105,   108,    78,   183,
+     184,   138,   111,   140,    78,    85,   196,   397,   106,   196,
+      78,   130,   224,   403,   240,   113,    69,   106,   223,    76,
+     105,    74,   102,    40,    41,    42,   111,    85,    86,   105,
+      83,   111,   244,   223,   105,   111,   223,   104,   111,   108,
+     120,   114,   268,   105,   309,   125,   183,   184,   106,   111,
+     113,   131,   110,   279,     4,     5,     6,   283,   138,   108,
+     140,   271,   249,   250,   251,   252,   253,   254,   255,   256,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   354,   137,   111,   137,   105,   114,   271,   300,   301,
+     114,   111,   111,   358,   104,   114,   361,   309,   111,   111,
+     305,   114,   114,   183,   184,    40,    41,   312,     9,   256,
+     257,   258,   259,    76,    77,   305,    76,    77,   305,   384,
+      89,    90,   312,    79,    80,   312,   105,   353,    40,    41,
+      42,    83,    84,   213,   271,   119,   120,   121,   104,    40,
+      41,   406,    43,    44,   111,   112,   358,   125,   374,   361,
+      51,    52,    53,     9,   254,   255,   368,   252,   253,   124,
+     365,   260,   261,   389,   126,    91,    93,   107,   114,   353,
+     114,   104,   384,   104,   346,   365,   402,   114,   365,   104,
+     112,   104,   104,   113,    40,    41,   107,    43,    44,   109,
+     374,   271,   106,   106,   406,    51,    52,    53,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,   288,   108,
+     105,   113,   112,   107,   107,   113,   104,   113,    56,   111,
+      76,   107,   113,   107,   104,   114,   105,   109,   105,   107,
+      17,   114,   108,   114,   241,   262,   265,   263,   113,   264,
+     103,   131,   379,   266,    96,   267,   131,     5,   187,   229,
+     395,   348,   313,   403,   288,   348,   374,    78,    -1,   378,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   347,   348,    -1,
+      -1,    -1,    -1,   353,   354,    -1,    -1,    -1,    -1,    -1,
</ins><span class="cx">       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><del>-      -1,    -1,    -1,    -1,   394,    -1,    -1,    -1,    -1,    -1,
-     400,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,   362,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      -1,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    -1,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,
</del><ins>+      -1,    -1,    -1,    -1,   374,    -1,    -1,    -1,    -1,   379,
</ins><span class="cx">       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><del>-      -1,    -1,   104,    -1,    -1,    -1,   108,   109,    -1,    -1,
-      -1,    -1,   114,   115,   116,   117,   118,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    -1,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    -1,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    -1,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    -1,    -1,    85,
-      86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,
-      -1,    -1,   108,   109,    -1,    -1,    -1,    -1,   114,   115,
-     116,   117,   118,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    -1,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    -1,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    -1,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,
</del><ins>+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   397,    -1,    -1,
+      -1,    -1,    -1,   403,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    -1,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    -1,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,
</ins><span class="cx">       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><del>-      -1,    -1,    -1,    -1,   104,    -1,    -1,    -1,   108,    -1,
-      -1,    -1,    -1,    -1,   114,   115,   116,   117,   118,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    -1,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    -1,
-      -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</del><ins>+      -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,    -1,   108,
+     109,    -1,    -1,    -1,    -1,   114,   115,   116,   117,   118,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    -1,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,
</ins><span class="cx">       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><del>-     104,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,    -1,
-     114,   115,   116,   117,   118,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    -1,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    -1,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    -1,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    -1,    -1,    85,    86,    -1,
</del><ins>+      -1,   104,    -1,    -1,    -1,   108,   109,    -1,    -1,    -1,
+      -1,   114,   115,   116,   117,   118,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      -1,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    -1,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    -1,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    -1,    -1,    85,    86,
</ins><span class="cx">       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><del>-      -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   114,   115,   116,   117,
-     118,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      -1,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    -1,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    -1,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,
-       5,     6,   104,     8,     9,    10,    11,    12,    13,    -1,
-      -1,    -1,   114,   115,   116,   117,   118,    -1,    -1,    -1,
</del><ins>+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,
+      -1,   108,    -1,    -1,    -1,    -1,    -1,   114,   115,   116,
+     117,   118,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    -1,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      -1,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   104,    -1,    -1,    -1,   108,    -1,    -1,
+      -1,    -1,    -1,   114,   115,   116,   117,   118,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    -1,    18,    19,    20,    21,    22,    23,    24,
</ins><span class="cx">       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
</span><span class="cx">       35,    36,    37,    38,    39,    40,    41,    -1,    43,    44,
</span><span class="cx">       45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
</span><del>-      55,    -1,    57,    58,    59,    60,    61,    62,    63,    64,
</del><ins>+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
</ins><span class="cx">       65,    66,    67,    68,    69,    70,    -1,    72,    73,    74,
</span><span class="cx">       75,    76,    77,    78,    79,    80,    81,    82,    -1,    -1,
</span><span class="cx">       85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><del>-      -1,    -1,    -1,    -1,     4,     5,     6,    -1,    -1,   104,
-      10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,
-     115,   116,   117,   118,    -1,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,
-      50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    -1,    72,    73,    74,    -1,    76,    77,    -1,    -1,
-      10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      -1,    -1,    -1,    -1,   114,    45,    46,    47,    48,    49,
-      50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    -1,    72,    73,    74,    -1,    76,    77,    78,    79,
-      80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,
</del><ins>+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   114,
+     115,   116,   117,   118,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    -1,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,
</ins><span class="cx">       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><del>-      -1,    -1,    -1,    -1,   104,    -1,    -1,   107,    10,    11,
-      12,    13,    -1,    -1,    -1,   115,   116,   117,   118,    -1,
</del><ins>+      -1,     3,     4,     5,     6,   104,     8,     9,    10,    11,
+      12,    13,    -1,    -1,    -1,   114,   115,   116,   117,   118,
</ins><span class="cx">       -1,    -1,    -1,    25,    26,    27,    28,    29,    30,    31,
</span><del>-      32,    33,    34,    35,    36,    37,    38,    39,    -1,    -1,
-      -1,    -1,    -1,    45,    46,    47,    48,    49,    50,    -1,
-      -1,    -1,    54,    55,    -1,    57,    58,    59,    60,    61,
</del><ins>+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      -1,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,    -1,    57,    58,    59,    60,    61,
</ins><span class="cx">       62,    63,    64,    65,    66,    67,    68,    69,    70,    -1,
</span><del>-      72,    73,    74,    -1,    76,    77,    78,    79,    80,    81,
</del><ins>+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
</ins><span class="cx">       82,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,
</span><ins>+      -1,    -1,    -1,    -1,    -1,    -1,    -1,     4,     5,     6,
+      -1,    -1,   104,    10,    11,    12,    13,    -1,    -1,    -1,
+      -1,    -1,    -1,   115,   116,   117,   118,    -1,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,
+      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    -1,    72,    73,    74,    -1,    76,
+      77,    -1,    -1,    10,    11,    12,    13,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    -1,    -1,    -1,    -1,   114,    45,    46,
+      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    -1,    72,    73,    74,    -1,    76,
+      77,    78,    79,    80,    81,    82,    -1,    -1,    85,    86,
</ins><span class="cx">       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><del>-      -1,    -1,   104,    -1,    -1,   107,    10,    11,    12,    13,
-      -1,    -1,    -1,   115,   116,   117,   118,    -1,    -1,    -1,
-      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,
-      -1,    45,    46,    47,    48,    49,    50,    -1,    -1,    -1,
-      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    -1,    76,    77,    78,    79,    80,    81,    82,    -1,
-      -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     104,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
-     114,   115,   116,   117,   118,    -1,    25,    26,    27,    28,
</del><ins>+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,
+     107,    10,    11,    12,    13,    -1,    -1,    -1,   115,   116,
+     117,   118,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
</ins><span class="cx">       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
</span><span class="cx">       39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
</span><span class="cx">       49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,
</span><span class="lines">@@ -1385,7 +1365,7 @@
</span><span class="cx">       81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,
</span><span class="cx">       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><span class="cx">       -1,    -1,    -1,   104,    10,    11,    12,    13,    -1,    -1,
</span><del>-      -1,    -1,    -1,    -1,   115,   116,   117,   118,    -1,    25,
</del><ins>+      -1,    -1,    -1,   114,   115,   116,   117,   118,    -1,    25,
</ins><span class="cx">       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
</span><span class="cx">       36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,
</span><span class="cx">       46,    47,    48,    49,    50,    -1,    -1,    -1,    54,    55,
</span><span class="lines">@@ -1393,76 +1373,95 @@
</span><span class="cx">       66,    67,    68,    69,    70,    -1,    72,    73,    74,    -1,
</span><span class="cx">       76,    77,    78,    79,    80,    81,    82,    -1,    -1,    85,
</span><span class="cx">       86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><del>-      -1,    -1,    -1,    -1,     3,     4,     5,     6,   104,     8,
-       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,   115,
-     116,   117,   118,    -1,    -1,    -1,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    75,    -1,    77,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
-       4,     5,     6,    -1,     8,     9,    10,    11,    12,    13,
</del><ins>+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,
+      -1,   107,    10,    11,    12,    13,    -1,    -1,    -1,   115,
+     116,   117,   118,    -1,    -1,    -1,    -1,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,
+      48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    -1,    72,    73,    74,    -1,    76,    77,
+      78,    79,    80,    81,    82,    -1,    -1,    85,    86,    -1,
</ins><span class="cx">       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
</span><del>-     109,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    75,    -1,    77,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,     8,
-       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   109,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    75,    -1,    77,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     0,    -1,    -1,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     109,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    75,    -1,    77,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
</del><ins>+      -1,    -1,    -1,    -1,    -1,    -1,   104,    10,    11,    12,
+      13,    -1,    -1,    -1,    -1,    -1,    -1,   115,   116,   117,
+     118,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    -1,    -1,    -1,
+      -1,    -1,    45,    46,    47,    48,    49,    50,    -1,    -1,
+      -1,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
+      73,    74,    -1,    76,    77,    78,    79,    80,    81,    82,
+      -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,
+       6,   104,     8,     9,    10,    11,    12,    13,    -1,    -1,
+      -1,    -1,   115,   116,   117,   118,    -1,    -1,    -1,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    -1,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      -1,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    -1,    72,    73,    74,    75,
+      -1,    77,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,     3,     4,     5,     6,    -1,     8,     9,    10,
+      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   109,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    -1,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      -1,    72,    73,    74,    75,    -1,    77,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,
+       6,    -1,     8,     9,    10,    11,    12,    13,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    -1,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      -1,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    -1,    72,    73,    74,    75,
+      -1,    77,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     0,
+      -1,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   109,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    -1,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      -1,    72,    73,    74,    75,    -1,    77,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    -1,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      -1,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    -1,    72,    73,    74,    75,
+      -1,    77,     3,     4,     5,     6,    -1,     8,     9,    10,
+      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    -1,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      -1,    72,    73,    74,    75,    -1,    77,     4,     5,     6,
+      -1,    -1,    -1,    10,    11,    12,    13,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,
+      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    -1,    72,    73,    74,    -1,    -1,
+      77,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
</ins><span class="cx">       -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
</span><span class="cx">       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
</span><del>-      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
</del><ins>+      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
+      49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,
</ins><span class="cx">       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
</span><del>-      69,    70,    -1,    72,    73,    74,    75,    -1,    77,     3,
-       4,     5,     6,    -1,     8,     9,    10,    11,    12,    13,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    75,    -1,    77,     4,     5,     6,    -1,    -1,    -1,
-      10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,
-      50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    -1,    72,    73,    74,    -1,    -1,    77,    10,    11,
-      12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    -1,    -1,
-      -1,    -1,    -1,    45,    46,    47,    48,    49,    50,    -1,
-      -1,    -1,    54,    55,    -1,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    -1,
-      72,    73,    74,    -1,    76,    77,    10,    11,    12,    13,
-      82,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,
-      -1,    45,    46,    47,    48,    49,    50,    -1,    -1,    -1,
-      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    -1,    -1,    77
</del><ins>+      69,    70,    -1,    72,    73,    74,    -1,    76,    77,    10,
+      11,    12,    13,    82,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
+      -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,    50,
+      -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      -1,    72,    73,    74,    -1,    -1,    77
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
</span><span class="lines">@@ -1477,40 +1476,40 @@
</span><span class="cx">       65,    66,    67,    68,    69,    70,    72,    73,    74,    75,
</span><span class="cx">       77,   160,   161,   162,   163,   164,   169,   170,   171,   172,
</span><span class="cx">      174,   175,   176,   177,   178,   181,   182,   183,   218,   219,
</span><del>-     220,    44,    76,   177,    40,    41,    76,    77,   108,   129,
-     104,   114,   221,   105,   111,     9,    40,    41,    42,   166,
-     167,   173,   111,   114,    76,   129,   175,    76,   114,   159,
-     176,   181,   175,   106,     0,   219,   181,   185,   108,    76,
-     179,   180,   108,   201,   166,   165,   168,   176,   167,   129,
-     104,   106,   113,   108,     3,   174,   176,   186,   187,    76,
-      78,    79,    80,    81,    82,    85,    86,   104,   107,   115,
-     116,   117,   118,   130,   131,   132,   134,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   158,   181,   114,
-     186,   184,   113,   105,   111,    14,    15,    16,    18,    19,
-      20,    21,    22,    23,    24,    56,   108,   109,   114,   141,
-     154,   155,   157,   160,   161,   181,   191,   192,   193,   194,
-     202,   203,   204,   206,   208,   210,   217,   129,   165,   168,
-     106,   113,   107,   158,   155,   190,   176,   129,   188,   189,
-     109,   187,   141,   141,   157,    85,    86,   106,   110,   105,
-     105,   111,    55,   155,   104,   141,   119,   120,   121,   116,
-     118,    83,    84,    87,    88,   122,   123,    89,    90,   126,
-     125,   124,    91,    93,    92,   127,   107,   109,   186,    79,
-      80,   180,   114,   114,   212,   104,   104,   114,   114,   157,
-     104,   158,   112,   104,   109,   195,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   113,   156,   111,   114,
-     109,   192,   106,   107,   158,   190,   113,   107,   188,   106,
-     111,   114,    76,   114,   105,   133,   157,    76,    82,   136,
-     155,   141,   141,   141,   143,   143,   144,   144,   145,   145,
-     145,   145,   146,   146,   147,   148,   149,   150,   151,   152,
-     157,   109,   198,   199,   200,   213,   157,   114,   157,   112,
-     211,   202,   155,   155,   158,   113,   107,   190,   113,   114,
-     158,   189,   106,   114,   107,   112,    56,   201,   193,   191,
-     203,   214,   105,   105,   157,   171,   174,   209,   196,   107,
-     190,   113,   190,   107,   158,   155,   104,   209,   215,   216,
-     198,   205,   207,   129,   105,   109,   190,   107,   157,   114,
-     105,    17,   194,   113,   193,   197,   201,   114,   105,   157,
-     197,   198,   190,   114
</del><ins>+     220,    44,    76,   172,   175,   177,    40,    41,    76,    77,
+     108,   129,   104,   114,   221,   105,   111,     9,    40,    41,
+      42,   166,   167,   173,   111,   114,    76,   129,   175,    76,
+     114,   159,   176,   181,   175,   106,     0,   219,   175,   181,
+     185,   108,    76,   179,   180,   108,   201,   166,   165,   168,
+     176,   167,   129,   104,   106,   113,   108,     3,   174,   176,
+     186,   187,    76,    78,    79,    80,    81,    82,    85,    86,
+     104,   107,   115,   116,   117,   118,   130,   131,   132,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     158,   181,   114,   186,   184,   113,   105,   111,    14,    15,
+      16,    18,    19,    20,    21,    22,    23,    24,    56,   108,
+     109,   114,   141,   154,   155,   157,   160,   161,   181,   191,
+     192,   193,   194,   202,   203,   204,   206,   208,   210,   217,
+     129,   165,   168,   106,   113,   107,   158,   155,   190,   176,
+     129,   188,   189,   109,   187,   141,   141,   157,    85,    86,
+     106,   110,   105,   105,   111,    55,   155,   104,   141,   119,
+     120,   121,   116,   118,    83,    84,    87,    88,   122,   123,
+      89,    90,   126,   125,   124,    91,    93,    92,   127,   107,
+     109,   186,    79,    80,   180,   114,   114,   212,   104,   104,
+     114,   114,   157,   104,   158,   112,   104,   109,   195,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   113,
+     156,   111,   114,   109,   192,   106,   107,   158,   190,   113,
+     107,   188,   106,   111,   114,    76,   114,   105,   133,   157,
+      76,    82,   136,   155,   141,   141,   141,   143,   143,   144,
+     144,   145,   145,   145,   145,   146,   146,   147,   148,   149,
+     150,   151,   152,   157,   109,   198,   199,   200,   213,   157,
+     114,   157,   112,   211,   202,   155,   155,   158,   113,   107,
+     190,   113,   114,   158,   189,   106,   114,   107,   112,    56,
+     201,   193,   191,   203,   214,   105,   105,   157,   171,   174,
+     209,   196,   107,   190,   113,   190,   107,   158,   155,   104,
+     209,   215,   216,   198,   205,   207,   129,   105,   109,   190,
+     107,   157,   114,   105,    17,   194,   113,   193,   197,   201,
+     114,   105,   157,   197,   198,   190,   114
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
</span><span class="lines">@@ -1529,21 +1528,21 @@
</span><span class="cx">      164,   165,   165,   166,   166,   166,   166,   167,   167,   167,
</span><span class="cx">      167,   168,   169,   169,   169,   169,   169,   169,   170,   170,
</span><span class="cx">      170,   170,   170,   170,   170,   171,   171,   172,   172,   173,
</span><del>-     174,   174,   174,   174,   174,   174,   174,   174,   175,   175,
-     175,   175,   175,   175,   176,   176,   177,   177,   177,   178,
-     179,   179,   180,   180,   180,   181,   181,   181,   182,   182,
</del><ins>+     174,   174,   174,   174,   174,   174,   174,   174,   174,   174,
+     175,   175,   175,   175,   175,   175,   176,   176,   177,   177,
+     177,   178,   179,   179,   180,   180,   180,   181,   181,   181,
</ins><span class="cx">      182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
</span><span class="cx">      182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
</span><span class="cx">      182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
</span><span class="cx">      182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
</span><del>-     182,   182,   182,   184,   183,   185,   183,   186,   186,   187,
-     187,   188,   188,   189,   189,   190,   191,   192,   192,   193,
-     193,   193,   193,   193,   193,   193,   194,   195,   196,   194,
-     197,   197,   199,   198,   200,   198,   201,   201,   202,   202,
-     203,   203,   204,   205,   205,   207,   206,   208,   208,   209,
-     209,   211,   210,   212,   210,   213,   210,   214,   214,   215,
-     215,   216,   216,   217,   217,   217,   217,   217,   218,   218,
-     219,   219,   221,   220
</del><ins>+     182,   182,   182,   182,   182,   184,   183,   185,   183,   186,
+     186,   187,   187,   188,   188,   189,   189,   190,   191,   192,
+     192,   193,   193,   193,   193,   193,   193,   193,   194,   195,
+     196,   194,   197,   197,   199,   198,   200,   198,   201,   201,
+     202,   202,   203,   203,   204,   205,   205,   207,   206,   208,
+     208,   209,   209,   211,   210,   212,   210,   213,   210,   214,
+     214,   215,   215,   216,   216,   217,   217,   217,   217,   217,
+     218,   218,   219,   219,   221,   220
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx">   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
</span><span class="lines">@@ -1562,21 +1561,21 @@
</span><span class="cx">        3,     2,     5,     3,     2,     3,     2,     0,     1,     1,
</span><span class="cx">        1,     1,     1,     3,     6,     7,     8,     5,     1,     2,
</span><span class="cx">        5,     6,     7,     4,     2,     1,     2,     1,     1,     1,
</span><del>-       1,     1,     2,     1,     2,     1,     1,     2,     1,     1,
-       1,     2,     2,     1,     1,     2,     1,     1,     1,     4,
-       1,     3,     1,     3,     3,     1,     3,     4,     1,     1,
</del><ins>+       1,     1,     2,     1,     2,     1,     1,     2,     2,     3,
+       1,     1,     1,     2,     2,     1,     1,     2,     1,     1,
+       1,     4,     1,     3,     1,     3,     3,     1,     3,     4,
</ins><span class="cx">        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
</span><span class="cx">        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
</span><span class="cx">        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
</span><span class="cx">        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
</span><del>-       1,     1,     1,     0,     6,     0,     5,     1,     2,     3,
-       4,     1,     3,     1,     4,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     2,     0,     0,     5,
-       1,     1,     0,     2,     0,     2,     2,     3,     1,     2,
-       1,     2,     5,     3,     1,     0,     6,     3,     2,     1,
-       4,     0,     6,     0,     8,     0,     7,     1,     1,     1,
-       0,     2,     3,     2,     2,     2,     3,     2,     1,     2,
-       1,     1,     0,     3
</del><ins>+       1,     1,     1,     1,     1,     0,     6,     0,     5,     1,
+       2,     3,     4,     1,     3,     1,     4,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     2,     0,
+       0,     5,     1,     1,     0,     2,     0,     2,     2,     3,
+       1,     2,     1,     2,     5,     3,     1,     0,     6,     3,
+       2,     1,     4,     0,     6,     0,     8,     0,     7,     1,
+       1,     1,     0,     2,     3,     2,     2,     2,     3,     2,
+       1,     2,     1,     1,     0,     3
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -2359,22 +2358,8 @@
</span><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         // The symbol table search was done in the lexical phase
</span><del>-        const TVariable *variable = context-&gt;getNamedVariable((yylsp[0]), (yyvsp[0].lex).string, (yyvsp[0].lex).symbol);
</del><ins>+        (yyval.interm.intermTypedNode) = context-&gt;parseVariableIdentifier((yylsp[0]), (yyvsp[0].lex).string, (yyvsp[0].lex).symbol);
</ins><span class="cx"> 
</span><del>-        if (variable-&gt;getType().getQualifier() == EvqConst)
-        {
-            TConstantUnion* constArray = variable-&gt;getConstPointer();
-            TType t(variable-&gt;getType());
-            (yyval.interm.intermTypedNode) = context-&gt;intermediate.addConstantUnion(constArray, t, (yylsp[0]));
-        }
-        else
-        {
-            (yyval.interm.intermTypedNode) = context-&gt;intermediate.addSymbol(variable-&gt;getUniqueId(),
-                                                 variable-&gt;getName(),
-                                                 variable-&gt;getType(),
-                                                 (yylsp[0]));
-        }
-
</del><span class="cx">         // don't delete $1.string, it's used by error recovery, and the pool
</span><span class="cx">         // pop will reclaim the memory
</span><span class="cx">     }
</span><span class="lines">@@ -2564,10 +2549,10 @@
</span><span class="cx">   case 25:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        TParameter param = { 0, new TType((yyvsp[0].interm.intermTypedNode)-&gt;getType()) };
-        (yyvsp[-1].interm.function)-&gt;addParameter(param);
</del><ins>+        const TType *type = new TType((yyvsp[0].interm.intermTypedNode)-&gt;getType());
+        (yyvsp[-1].interm.function)-&gt;addParameter(TConstParameter(type));
</ins><span class="cx">         (yyval.interm).function = (yyvsp[-1].interm.function);
</span><del>-        (yyval.interm).nodePair.node1 = (yyvsp[0].interm.intermTypedNode);
</del><ins>+        (yyval.interm).nodePair.node1 = context-&gt;intermediate.makeAggregate((yyvsp[0].interm.intermTypedNode), (yylsp[0]));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -2575,8 +2560,8 @@
</span><span class="cx">   case 26:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        TParameter param = { 0, new TType((yyvsp[0].interm.intermTypedNode)-&gt;getType()) };
-        (yyvsp[-2].interm).function-&gt;addParameter(param);
</del><ins>+        const TType *type = new TType((yyvsp[0].interm.intermTypedNode)-&gt;getType());
+        (yyvsp[-2].interm).function-&gt;addParameter(TConstParameter(type));
</ins><span class="cx">         (yyval.interm).function = (yyvsp[-2].interm).function;
</span><span class="cx">         (yyval.interm).nodePair.node1 = context-&gt;intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
</span><span class="cx">     }
</span><span class="lines">@@ -2607,7 +2592,7 @@
</span><span class="cx">     {
</span><span class="cx">         if (context-&gt;reservedErrorCheck((yylsp[0]), *(yyvsp[0].lex).string))
</span><span class="cx">             context-&gt;recover();
</span><del>-        TType type(EbtVoid, EbpUndefined);
</del><ins>+        const TType *type = TCache::getType(EbtVoid, EbpUndefined);
</ins><span class="cx">         TFunction *function = new TFunction((yyvsp[0].lex).string, type);
</span><span class="cx">         (yyval.interm.function) = function;
</span><span class="cx">     }
</span><span class="lines">@@ -2619,7 +2604,7 @@
</span><span class="cx">     {
</span><span class="cx">         if (context-&gt;reservedErrorCheck((yylsp[0]), *(yyvsp[0].lex).string))
</span><span class="cx">             context-&gt;recover();
</span><del>-        TType type(EbtVoid, EbpUndefined);
</del><ins>+        const TType *type = TCache::getType(EbtVoid, EbpUndefined);
</ins><span class="cx">         TFunction *function = new TFunction((yyvsp[0].lex).string, type);
</span><span class="cx">         (yyval.interm.function) = function;
</span><span class="cx">     }
</span><span class="lines">@@ -3037,12 +3022,7 @@
</span><span class="cx">   case 85:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval.interm.intermTypedNode) = context-&gt;intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
-        if ((yyval.interm.intermTypedNode) == 0) {
-            context-&gt;binaryOpError((yylsp[-1]), &quot;,&quot;, (yyvsp[-2].interm.intermTypedNode)-&gt;getCompleteString(), (yyvsp[0].interm.intermTypedNode)-&gt;getCompleteString());
-            context-&gt;recover();
-            (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
-        }
</del><ins>+        (yyval.interm.intermTypedNode) = context-&gt;addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -3070,32 +3050,7 @@
</span><span class="cx">   case 88:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        TFunction &amp;function = *((yyvsp[-1].interm).function);
-        
-        TIntermAggregate *prototype = new TIntermAggregate;
-        prototype-&gt;setType(function.getReturnType());
-        prototype-&gt;setName(function.getMangledName());
-        prototype-&gt;setFunctionId(function.getUniqueId());
-        
-        for (size_t i = 0; i &lt; function.getParamCount(); i++)
-        {
-            const TParameter &amp;param = function.getParam(i);
-            if (param.name != 0)
-            {
-                TVariable variable(param.name, *param.type);
-                
-                prototype = context-&gt;intermediate.growAggregate(prototype, context-&gt;intermediate.addSymbol(variable.getUniqueId(), variable.getName(), variable.getType(), (yylsp[-1])), (yylsp[-1]));
-            }
-            else
-            {
-                prototype = context-&gt;intermediate.growAggregate(prototype, context-&gt;intermediate.addSymbol(0, &quot;&quot;, *param.type, (yylsp[-1])), (yylsp[-1]));
-            }
-        }
-        
-        prototype-&gt;setOp(EOpPrototype);
-        (yyval.interm.intermNode) = prototype;
-
-        context-&gt;symbolTable.pop();
</del><ins>+        (yyval.interm.intermNode) = context-&gt;addFunctionPrototypeDeclaration(*((yyvsp[-1].interm).function), (yylsp[-1]));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -3114,7 +3069,7 @@
</span><span class="cx">   case 90:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        if (((yyvsp[-2].interm.precision) == EbpHigh) &amp;&amp; (context-&gt;shaderType == GL_FRAGMENT_SHADER) &amp;&amp; !context-&gt;fragmentPrecisionHigh) {
</del><ins>+        if (((yyvsp[-2].interm.precision) == EbpHigh) &amp;&amp; (context-&gt;getShaderType() == GL_FRAGMENT_SHADER) &amp;&amp; !context-&gt;getFragmentPrecisionHigh()) {
</ins><span class="cx">             context-&gt;error((yylsp[-3]), &quot;precision is not supported in fragment shader&quot;, &quot;highp&quot;);
</span><span class="cx">             context-&gt;recover();
</span><span class="cx">         }
</span><span class="lines">@@ -3166,57 +3121,7 @@
</span><span class="cx">   case 95:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        //
-        // Multiple declarations of the same function are allowed.
-        //
-        // If this is a definition, the definition production code will check for redefinitions
-        // (we don't know at this point if it's a definition or not).
-        //
-        // Redeclarations are allowed.  But, return types and parameter qualifiers must match.
-        //
-        TFunction* prevDec = static_cast&lt;TFunction*&gt;(context-&gt;symbolTable.find((yyvsp[-1].interm.function)-&gt;getMangledName(), context-&gt;shaderVersion));
-        if (prevDec) {
-            if (prevDec-&gt;getReturnType() != (yyvsp[-1].interm.function)-&gt;getReturnType()) {
-                context-&gt;error((yylsp[0]), &quot;overloaded functions must have the same return type&quot;, (yyvsp[-1].interm.function)-&gt;getReturnType().getBasicString());
-                context-&gt;recover();
-            }
-            for (size_t i = 0; i &lt; prevDec-&gt;getParamCount(); ++i) {
-                if (prevDec-&gt;getParam(i).type-&gt;getQualifier() != (yyvsp[-1].interm.function)-&gt;getParam(i).type-&gt;getQualifier()) {
-                    context-&gt;error((yylsp[0]), &quot;overloaded functions must have the same parameter qualifiers&quot;, (yyvsp[-1].interm.function)-&gt;getParam(i).type-&gt;getQualifierString());
-                    context-&gt;recover();
-                }
-            }
-        }
-
-        //
-        // Check for previously declared variables using the same name.
-        //
-        TSymbol *prevSym = context-&gt;symbolTable.find((yyvsp[-1].interm.function)-&gt;getName(), context-&gt;shaderVersion);
-        if (prevSym)
-        {
-            if (!prevSym-&gt;isFunction())
-            {
-                context-&gt;error((yylsp[0]), &quot;redefinition&quot;, (yyvsp[-1].interm.function)-&gt;getName().c_str(), &quot;function&quot;);
-                context-&gt;recover();
-            }
-        }
-        else
-        {
-            // Insert the unmangled name to detect potential future redefinition as a variable.
-            TFunction *function = new TFunction(NewPoolTString((yyvsp[-1].interm.function)-&gt;getName().c_str()), (yyvsp[-1].interm.function)-&gt;getReturnType());
-            context-&gt;symbolTable.getOuterLevel()-&gt;insertUnmangled(function);
-        }
-
-        //
-        // If this is a redeclaration, it could also be a definition,
-        // in which case, we want to use the variable names from this one, and not the one that's
-        // being redeclared.  So, pass back up this declaration, not the one in the symbol table.
-        //
-        (yyval.interm).function = (yyvsp[-1].interm.function);
-
-        // We're at the inner scope level of the function's arguments and body statement.
-        // Add the function prototype to the surrounding scope instead.
-        context-&gt;symbolTable.getOuterLevel()-&gt;insert((yyval.interm).function);
</del><ins>+        (yyval.interm).function = context-&gt;parseFunctionDeclarator((yylsp[0]), (yyvsp[-1].interm.function));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -3243,7 +3148,7 @@
</span><span class="cx">         // Add the parameter
</span><span class="cx">         (yyval.interm.function) = (yyvsp[-1].interm.function);
</span><span class="cx">         if ((yyvsp[0].interm).param.type-&gt;getBasicType() != EbtVoid)
</span><del>-            (yyvsp[-1].interm.function)-&gt;addParameter((yyvsp[0].interm).param);
</del><ins>+            (yyvsp[-1].interm.function)-&gt;addParameter((yyvsp[0].interm).param.turnToConst());
</ins><span class="cx">         else
</span><span class="cx">             delete (yyvsp[0].interm).param.type;
</span><span class="cx">     }
</span><span class="lines">@@ -3267,7 +3172,7 @@
</span><span class="cx">         } else {
</span><span class="cx">             // Add the parameter
</span><span class="cx">             (yyval.interm.function) = (yyvsp[-2].interm.function);
</span><del>-            (yyvsp[-2].interm.function)-&gt;addParameter((yyvsp[0].interm).param);
</del><ins>+            (yyvsp[-2].interm.function)-&gt;addParameter((yyvsp[0].interm).param.turnToConst());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -3276,17 +3181,23 @@
</span><span class="cx">   case 100:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        if ((yyvsp[-2].interm.type).qualifier != EvqGlobal &amp;&amp; (yyvsp[-2].interm.type).qualifier != EvqTemporary) {
</del><ins>+        if ((yyvsp[-2].interm.type).qualifier != EvqGlobal &amp;&amp; (yyvsp[-2].interm.type).qualifier != EvqTemporary)
+        {
</ins><span class="cx">             context-&gt;error((yylsp[-1]), &quot;no qualifiers allowed for function return&quot;, getQualifierString((yyvsp[-2].interm.type).qualifier));
</span><span class="cx">             context-&gt;recover();
</span><span class="cx">         }
</span><ins>+        if (!(yyvsp[-2].interm.type).layoutQualifier.isEmpty())
+        {
+            context-&gt;error((yylsp[-1]), &quot;no qualifiers allowed for function return&quot;, &quot;layout&quot;);
+            context-&gt;recover();
+        }
</ins><span class="cx">         // make sure a sampler is not involved as well...
</span><span class="cx">         if (context-&gt;samplerErrorCheck((yylsp[-1]), (yyvsp[-2].interm.type), &quot;samplers can't be function return values&quot;))
</span><span class="cx">             context-&gt;recover();
</span><span class="cx"> 
</span><span class="cx">         // Add the function as a prototype after parsing it (we do not support recursion)
</span><span class="cx">         TFunction *function;
</span><del>-        TType type((yyvsp[-2].interm.type));
</del><ins>+        const TType *type = new TType((yyvsp[-2].interm.type));
</ins><span class="cx">         function = new TFunction((yyvsp[-1].lex).string, type);
</span><span class="cx">         (yyval.interm.function) = function;
</span><span class="cx">         
</span><span class="lines">@@ -3544,7 +3455,7 @@
</span><span class="cx"> 
</span><span class="cx">         if ((yyvsp[0].interm.type).array) {
</span><span class="cx">             ES3_ONLY(&quot;[]&quot;, (yylsp[0]), &quot;first-class-array&quot;);
</span><del>-            if (context-&gt;shaderVersion != 300) {
</del><ins>+            if (context-&gt;getShaderVersion() != 300) {
</ins><span class="cx">                 (yyvsp[0].interm.type).clearArrayness();
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -3555,7 +3466,7 @@
</span><span class="cx">   case 126:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval.interm.type) = context-&gt;addFullySpecifiedType((yyvsp[-1].interm.type).qualifier, (yyvsp[-1].interm.type).layoutQualifier, (yyvsp[0].interm.type));
</del><ins>+        (yyval.interm.type) = context-&gt;addFullySpecifiedType((yyvsp[-1].interm.type).qualifier, (yyvsp[-1].interm.type).invariant, (yyvsp[-1].interm.type).layoutQualifier, (yyvsp[0].interm.type));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -3602,7 +3513,7 @@
</span><span class="cx">         ES2_ONLY(&quot;varying&quot;, (yylsp[0]));
</span><span class="cx">         if (context-&gt;globalErrorCheck((yylsp[0]), context-&gt;symbolTable.atGlobalLevel(), &quot;varying&quot;))
</span><span class="cx">             context-&gt;recover();
</span><del>-        if (context-&gt;shaderType == GL_VERTEX_SHADER)
</del><ins>+        if (context-&gt;getShaderType() == GL_VERTEX_SHADER)
</ins><span class="cx">             (yyval.interm.type).setBasic(EbtVoid, EvqVaryingOut, (yylsp[0]));
</span><span class="cx">         else
</span><span class="cx">             (yyval.interm.type).setBasic(EbtVoid, EvqVaryingIn, (yylsp[0]));
</span><span class="lines">@@ -3616,10 +3527,11 @@
</span><span class="cx">         ES2_ONLY(&quot;varying&quot;, (yylsp[-1]));
</span><span class="cx">         if (context-&gt;globalErrorCheck((yylsp[-1]), context-&gt;symbolTable.atGlobalLevel(), &quot;invariant varying&quot;))
</span><span class="cx">             context-&gt;recover();
</span><del>-        if (context-&gt;shaderType == GL_VERTEX_SHADER)
-            (yyval.interm.type).setBasic(EbtVoid, EvqInvariantVaryingOut, (yylsp[-1]));
</del><ins>+        if (context-&gt;getShaderType() == GL_VERTEX_SHADER)
+            (yyval.interm.type).setBasic(EbtVoid, EvqVaryingOut, (yylsp[-1]));
</ins><span class="cx">         else
</span><del>-            (yyval.interm.type).setBasic(EbtVoid, EvqInvariantVaryingIn, (yylsp[-1]));
</del><ins>+            (yyval.interm.type).setBasic(EbtVoid, EvqVaryingIn, (yylsp[-1]));
+        (yyval.interm.type).invariant = true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -3627,12 +3539,12 @@
</span><span class="cx">   case 133:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        if ((yyvsp[0].interm.type).qualifier != EvqConst &amp;&amp; !context-&gt;symbolTable.atGlobalLevel()) {
</del><ins>+        if ((yyvsp[0].interm.type).qualifier != EvqConst &amp;&amp; !context-&gt;symbolTable.atGlobalLevel())
+        {
</ins><span class="cx">             context-&gt;error((yylsp[0]), &quot;Local variables can only use the const storage qualifier.&quot;, getQualifierString((yyvsp[0].interm.type).qualifier));
</span><span class="cx">             context-&gt;recover();
</span><del>-        } else {
-            (yyval.interm.type).setBasic(EbtVoid, (yyvsp[0].interm.type).qualifier, (yylsp[0]));
</del><span class="cx">         }
</span><ins>+        (yyval.interm.type).setBasic(EbtVoid, (yyvsp[0].interm.type).qualifier, (yylsp[0]));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -3678,7 +3590,9 @@
</span><span class="cx">   case 138:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval.interm.type).qualifier = EvqConst;
</del><ins>+        context-&gt;es3InvariantErrorCheck((yyvsp[0].interm.type).qualifier, (yylsp[-1]));
+        (yyval.interm.type).setBasic(EbtVoid, (yyvsp[0].interm.type).qualifier, (yylsp[0]));
+        (yyval.interm.type).invariant = true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -3686,8 +3600,9 @@
</span><span class="cx">   case 139:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        ES3_ONLY(&quot;in&quot;, (yylsp[0]), &quot;storage qualifier&quot;);
-        (yyval.interm.type).qualifier = (context-&gt;shaderType == GL_FRAGMENT_SHADER) ? EvqFragmentIn : EvqVertexIn;
</del><ins>+        context-&gt;es3InvariantErrorCheck((yyvsp[0].interm.type).qualifier, (yylsp[-2]));
+        (yyval.interm.type) = context-&gt;joinInterpolationQualifiers((yylsp[-1]), (yyvsp[-1].interm.type).qualifier, (yylsp[0]), (yyvsp[0].interm.type).qualifier);
+        (yyval.interm.type).invariant = true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -3695,8 +3610,7 @@
</span><span class="cx">   case 140:
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        ES3_ONLY(&quot;out&quot;, (yylsp[0]), &quot;storage qualifier&quot;);
-        (yyval.interm.type).qualifier = (context-&gt;shaderType == GL_FRAGMENT_SHADER) ? EvqFragmentOut : EvqVertexOut;
</del><ins>+        (yyval.interm.type).qualifier = EvqConst;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -3704,32 +3618,50 @@
</span><span class="cx">   case 141:
</span><span class="cx"> 
</span><span class="cx">     {
</span><ins>+        ES3_ONLY(&quot;in&quot;, (yylsp[0]), &quot;storage qualifier&quot;);
+        (yyval.interm.type).qualifier = (context-&gt;getShaderType() == GL_FRAGMENT_SHADER) ? EvqFragmentIn : EvqVertexIn;
+    }
+
+    break;
+
+  case 142:
+
+    {
+        ES3_ONLY(&quot;out&quot;, (yylsp[0]), &quot;storage qualifier&quot;);
+        (yyval.interm.type).qualifier = (context-&gt;getShaderType() == GL_FRAGMENT_SHADER) ? EvqFragmentOut : EvqVertexOut;
+    }
+
+    break;
+
+  case 143:
+
+    {
</ins><span class="cx">         ES3_ONLY(&quot;centroid in&quot;, (yylsp[-1]), &quot;storage qualifier&quot;);
</span><del>-        if (context-&gt;shaderType == GL_VERTEX_SHADER)
</del><ins>+        if (context-&gt;getShaderType() == GL_VERTEX_SHADER)
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;error((yylsp[-1]), &quot;invalid storage qualifier&quot;, &quot;it is an error to use 'centroid in' in the vertex shader&quot;);
</span><span class="cx">             context-&gt;recover();
</span><span class="cx">         }
</span><del>-        (yyval.interm.type).qualifier = (context-&gt;shaderType == GL_FRAGMENT_SHADER) ? EvqCentroidIn : EvqVertexIn;
</del><ins>+        (yyval.interm.type).qualifier = (context-&gt;getShaderType() == GL_FRAGMENT_SHADER) ? EvqCentroidIn : EvqVertexIn;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 142:
</del><ins>+  case 144:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         ES3_ONLY(&quot;centroid out&quot;, (yylsp[-1]), &quot;storage qualifier&quot;);
</span><del>-        if (context-&gt;shaderType == GL_FRAGMENT_SHADER)
</del><ins>+        if (context-&gt;getShaderType() == GL_FRAGMENT_SHADER)
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;error((yylsp[-1]), &quot;invalid storage qualifier&quot;, &quot;it is an error to use 'centroid out' in the fragment shader&quot;);
</span><span class="cx">             context-&gt;recover();
</span><span class="cx">         }
</span><del>-        (yyval.interm.type).qualifier = (context-&gt;shaderType == GL_FRAGMENT_SHADER) ? EvqFragmentOut : EvqCentroidOut;
</del><ins>+        (yyval.interm.type).qualifier = (context-&gt;getShaderType() == GL_FRAGMENT_SHADER) ? EvqFragmentOut : EvqCentroidOut;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 143:
</del><ins>+  case 145:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         if (context-&gt;globalErrorCheck((yylsp[0]), context-&gt;symbolTable.atGlobalLevel(), &quot;uniform&quot;))
</span><span class="lines">@@ -3739,7 +3671,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 144:
</del><ins>+  case 146:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.type) = (yyvsp[0].interm.type);
</span><span class="lines">@@ -3754,7 +3686,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 145:
</del><ins>+  case 147:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.type) = (yyvsp[0].interm.type);
</span><span class="lines">@@ -3768,7 +3700,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 146:
</del><ins>+  case 148:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.precision) = EbpHigh;
</span><span class="lines">@@ -3776,7 +3708,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 147:
</del><ins>+  case 149:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.precision) = EbpMedium;
</span><span class="lines">@@ -3784,7 +3716,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 148:
</del><ins>+  case 150:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.precision) = EbpLow;
</span><span class="lines">@@ -3792,7 +3724,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 149:
</del><ins>+  case 151:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         ES3_ONLY(&quot;layout&quot;, (yylsp[-3]), &quot;qualifier&quot;);
</span><span class="lines">@@ -3801,7 +3733,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 150:
</del><ins>+  case 152:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.layoutQualifier) = (yyvsp[0].interm.layoutQualifier);
</span><span class="lines">@@ -3809,7 +3741,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 151:
</del><ins>+  case 153:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.layoutQualifier) = context-&gt;joinLayoutQualifiers((yyvsp[-2].interm.layoutQualifier), (yyvsp[0].interm.layoutQualifier));
</span><span class="lines">@@ -3817,7 +3749,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 152:
</del><ins>+  case 154:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.layoutQualifier) = context-&gt;parseLayoutQualifier(*(yyvsp[0].lex).string, (yylsp[0]));
</span><span class="lines">@@ -3825,7 +3757,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 153:
</del><ins>+  case 155:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.layoutQualifier) = context-&gt;parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), *(yyvsp[0].lex).string, (yyvsp[0].lex).i, (yylsp[0]));
</span><span class="lines">@@ -3833,7 +3765,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 154:
</del><ins>+  case 156:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.layoutQualifier) = context-&gt;parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), *(yyvsp[0].lex).string, (yyvsp[0].lex).i, (yylsp[0]));
</span><span class="lines">@@ -3841,7 +3773,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 155:
</del><ins>+  case 157:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.type) = (yyvsp[0].interm.type);
</span><span class="lines">@@ -3849,7 +3781,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 156:
</del><ins>+  case 158:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         ES3_ONLY(&quot;[]&quot;, (yylsp[-1]), &quot;implicitly sized array&quot;);
</span><span class="lines">@@ -3859,7 +3791,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 157:
</del><ins>+  case 159:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.type) = (yyvsp[-3].interm.type);
</span><span class="lines">@@ -3876,7 +3808,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 158:
</del><ins>+  case 160:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3885,7 +3817,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 159:
</del><ins>+  case 161:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3894,7 +3826,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 160:
</del><ins>+  case 162:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3903,7 +3835,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 161:
</del><ins>+  case 163:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3912,7 +3844,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 162:
</del><ins>+  case 164:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3921,7 +3853,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 163:
</del><ins>+  case 165:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3931,7 +3863,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 164:
</del><ins>+  case 166:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3941,7 +3873,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 165:
</del><ins>+  case 167:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3951,7 +3883,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 166:
</del><ins>+  case 168:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3961,7 +3893,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 167:
</del><ins>+  case 169:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3971,7 +3903,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 168:
</del><ins>+  case 170:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3981,7 +3913,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 169:
</del><ins>+  case 171:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -3991,7 +3923,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 170:
</del><ins>+  case 172:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4001,7 +3933,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 171:
</del><ins>+  case 173:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4011,7 +3943,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 172:
</del><ins>+  case 174:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4021,7 +3953,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 173:
</del><ins>+  case 175:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4031,7 +3963,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 174:
</del><ins>+  case 176:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4041,7 +3973,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 175:
</del><ins>+  case 177:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4051,7 +3983,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 176:
</del><ins>+  case 178:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4061,7 +3993,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 177:
</del><ins>+  case 179:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4071,7 +4003,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 178:
</del><ins>+  case 180:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4081,7 +4013,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 179:
</del><ins>+  case 181:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4091,7 +4023,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 180:
</del><ins>+  case 182:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4101,7 +4033,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 181:
</del><ins>+  case 183:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4111,7 +4043,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 182:
</del><ins>+  case 184:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4121,7 +4053,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 183:
</del><ins>+  case 185:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4131,7 +4063,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 184:
</del><ins>+  case 186:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4140,7 +4072,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 185:
</del><ins>+  case 187:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4149,7 +4081,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 186:
</del><ins>+  case 188:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4158,7 +4090,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 187:
</del><ins>+  case 189:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4167,7 +4099,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 188:
</del><ins>+  case 190:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4176,7 +4108,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 189:
</del><ins>+  case 191:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4185,7 +4117,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 190:
</del><ins>+  case 192:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4194,7 +4126,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 191:
</del><ins>+  case 193:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4203,7 +4135,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 192:
</del><ins>+  case 194:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4212,7 +4144,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 193:
</del><ins>+  case 195:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4221,7 +4153,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 194:
</del><ins>+  case 196:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4230,7 +4162,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 195:
</del><ins>+  case 197:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4239,7 +4171,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 196:
</del><ins>+  case 198:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4248,7 +4180,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 197:
</del><ins>+  case 199:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4257,7 +4189,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 198:
</del><ins>+  case 200:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TQualifier qual = context-&gt;symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
</span><span class="lines">@@ -4266,7 +4198,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 199:
</del><ins>+  case 201:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         if (!context-&gt;supportsExtension(&quot;GL_OES_EGL_image_external&quot;)) {
</span><span class="lines">@@ -4279,7 +4211,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 200:
</del><ins>+  case 202:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         if (!context-&gt;supportsExtension(&quot;GL_ARB_texture_rectangle&quot;)) {
</span><span class="lines">@@ -4292,7 +4224,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 201:
</del><ins>+  case 203:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.type) = (yyvsp[0].interm.type);
</span><span class="lines">@@ -4301,7 +4233,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 202:
</del><ins>+  case 204:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         //
</span><span class="lines">@@ -4316,13 +4248,13 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 203:
</del><ins>+  case 205:
</ins><span class="cx"> 
</span><span class="cx">     { if (context-&gt;enterStructDeclaration((yylsp[-1]), *(yyvsp[-1].lex).string)) context-&gt;recover(); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 204:
</del><ins>+  case 206:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.type) = context-&gt;addStructure((yylsp[-5]), (yylsp[-4]), (yyvsp[-4].lex).string, (yyvsp[-1].interm.fieldList));
</span><span class="lines">@@ -4330,13 +4262,13 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 205:
</del><ins>+  case 207:
</ins><span class="cx"> 
</span><span class="cx">     { if (context-&gt;enterStructDeclaration((yylsp[0]), *(yyvsp[0].lex).string)) context-&gt;recover(); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 206:
</del><ins>+  case 208:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.type) = context-&gt;addStructure((yylsp[-4]), (yyloc), NewPoolTString(&quot;&quot;), (yyvsp[-1].interm.fieldList));
</span><span class="lines">@@ -4344,7 +4276,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 207:
</del><ins>+  case 209:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.fieldList) = (yyvsp[0].interm.fieldList);
</span><span class="lines">@@ -4352,7 +4284,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 208:
</del><ins>+  case 210:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.fieldList) = (yyvsp[-1].interm.fieldList);
</span><span class="lines">@@ -4370,7 +4302,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 209:
</del><ins>+  case 211:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.fieldList) = context-&gt;addStructDeclaratorList((yyvsp[-2].interm.type), (yyvsp[-1].interm.fieldList));
</span><span class="lines">@@ -4378,7 +4310,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 210:
</del><ins>+  case 212:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         // ES3 Only, but errors should be handled elsewhere
</span><span class="lines">@@ -4389,7 +4321,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 211:
</del><ins>+  case 213:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.fieldList) = NewPoolTFieldList();
</span><span class="lines">@@ -4398,7 +4330,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 212:
</del><ins>+  case 214:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.fieldList)-&gt;push_back((yyvsp[0].interm.field));
</span><span class="lines">@@ -4406,7 +4338,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 213:
</del><ins>+  case 215:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         if (context-&gt;reservedErrorCheck((yylsp[0]), *(yyvsp[0].lex).string))
</span><span class="lines">@@ -4418,7 +4350,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 214:
</del><ins>+  case 216:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         if (context-&gt;reservedErrorCheck((yylsp[-3]), *(yyvsp[-3].lex).string))
</span><span class="lines">@@ -4435,91 +4367,91 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 215:
</del><ins>+  case 217:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 216:
</del><ins>+  case 218:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 217:
</del><ins>+  case 219:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 218:
</del><ins>+  case 220:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 219:
</del><ins>+  case 221:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 220:
</del><ins>+  case 222:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 221:
</del><ins>+  case 223:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 222:
</del><ins>+  case 224:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermSwitch); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 223:
</del><ins>+  case 225:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermCase); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 224:
</del><ins>+  case 226:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 225:
</del><ins>+  case 227:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 226:
</del><ins>+  case 228:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermAggregate) = 0; }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 227:
</del><ins>+  case 229:
</ins><span class="cx"> 
</span><span class="cx">     { context-&gt;symbolTable.push(); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 228:
</del><ins>+  case 230:
</ins><span class="cx"> 
</span><span class="cx">     { context-&gt;symbolTable.pop(); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 229:
</del><ins>+  case 231:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         if ((yyvsp[-2].interm.intermAggregate) != 0) {
</span><span class="lines">@@ -4531,63 +4463,63 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 230:
</del><ins>+  case 232:
</ins><span class="cx"> 
</span><del>-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</del><ins>+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
</ins><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 231:
</del><ins>+  case 233:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 232:
</del><ins>+  case 234:
</ins><span class="cx"> 
</span><span class="cx">     { context-&gt;symbolTable.push(); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 233:
</del><ins>+  case 235:
</ins><span class="cx"> 
</span><del>-    { context-&gt;symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</del><ins>+    { context-&gt;symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermAggregate); }
</ins><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 234:
</del><ins>+  case 236:
</ins><span class="cx"> 
</span><span class="cx">     { context-&gt;symbolTable.push(); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 235:
</del><ins>+  case 237:
</ins><span class="cx"> 
</span><span class="cx">     { context-&gt;symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 236:
</del><ins>+  case 238:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><del>-        (yyval.interm.intermNode) = 0;
</del><ins>+        (yyval.interm.intermAggregate) = 0;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 237:
</del><ins>+  case 239:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         if ((yyvsp[-1].interm.intermAggregate)) {
</span><span class="cx">             (yyvsp[-1].interm.intermAggregate)-&gt;setOp(EOpSequence);
</span><span class="cx">             (yyvsp[-1].interm.intermAggregate)-&gt;setLine((yyloc));
</span><span class="cx">         }
</span><del>-        (yyval.interm.intermNode) = (yyvsp[-1].interm.intermAggregate);
</del><ins>+        (yyval.interm.intermAggregate) = (yyvsp[-1].interm.intermAggregate);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 238:
</del><ins>+  case 240:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermAggregate) = context-&gt;intermediate.makeAggregate((yyvsp[0].interm.intermNode), (yyloc));
</span><span class="lines">@@ -4595,7 +4527,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 239:
</del><ins>+  case 241:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermAggregate) = context-&gt;intermediate.growAggregate((yyvsp[-1].interm.intermAggregate), (yyvsp[0].interm.intermNode), (yyloc));
</span><span class="lines">@@ -4603,19 +4535,19 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 240:
</del><ins>+  case 242:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = 0; }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 241:
</del><ins>+  case 243:
</ins><span class="cx"> 
</span><span class="cx">     { (yyval.interm.intermNode) = static_cast&lt;TIntermNode*&gt;((yyvsp[-1].interm.intermTypedNode)); }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 242:
</del><ins>+  case 244:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         if (context-&gt;boolErrorCheck((yylsp[-4]), (yyvsp[-2].interm.intermTypedNode)))
</span><span class="lines">@@ -4625,7 +4557,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 243:
</del><ins>+  case 245:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
</span><span class="lines">@@ -4634,7 +4566,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 244:
</del><ins>+  case 246:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
</span><span class="lines">@@ -4643,22 +4575,22 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 245:
</del><ins>+  case 247:
</ins><span class="cx"> 
</span><del>-    { ++context-&gt;mSwitchNestingLevel; }
</del><ins>+    { context-&gt;incrSwitchNestingLevel(); }
</ins><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 246:
</del><ins>+  case 248:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermSwitch) = context-&gt;addSwitch((yyvsp[-3].interm.intermTypedNode), (yyvsp[0].interm.intermAggregate), (yylsp[-5]));
</span><del>-        --context-&gt;mSwitchNestingLevel;
</del><ins>+        context-&gt;decrSwitchNestingLevel();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 247:
</del><ins>+  case 249:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermCase) = context-&gt;addCase((yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
</span><span class="lines">@@ -4666,7 +4598,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 248:
</del><ins>+  case 250:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermCase) = context-&gt;addDefault((yylsp[-1]));
</span><span class="lines">@@ -4674,7 +4606,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 249:
</del><ins>+  case 251:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
</span><span class="lines">@@ -4684,7 +4616,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 250:
</del><ins>+  case 252:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TIntermNode *intermNode;
</span><span class="lines">@@ -4701,57 +4633,57 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 251:
</del><ins>+  case 253:
</ins><span class="cx"> 
</span><del>-    { context-&gt;symbolTable.push(); ++context-&gt;mLoopNestingLevel; }
</del><ins>+    { context-&gt;symbolTable.push(); context-&gt;incrLoopNestingLevel(); }
</ins><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 252:
</del><ins>+  case 254:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         context-&gt;symbolTable.pop();
</span><span class="cx">         (yyval.interm.intermNode) = context-&gt;intermediate.addLoop(ELoopWhile, 0, (yyvsp[-2].interm.intermTypedNode), 0, (yyvsp[0].interm.intermNode), (yylsp[-5]));
</span><del>-        --context-&gt;mLoopNestingLevel;
</del><ins>+        context-&gt;decrLoopNestingLevel();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 253:
</del><ins>+  case 255:
</ins><span class="cx"> 
</span><del>-    { ++context-&gt;mLoopNestingLevel; }
</del><ins>+    { context-&gt;incrLoopNestingLevel(); }
</ins><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 254:
</del><ins>+  case 256:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         if (context-&gt;boolErrorCheck((yylsp[0]), (yyvsp[-2].interm.intermTypedNode)))
</span><span class="cx">             context-&gt;recover();
</span><span class="cx"> 
</span><span class="cx">         (yyval.interm.intermNode) = context-&gt;intermediate.addLoop(ELoopDoWhile, 0, (yyvsp[-2].interm.intermTypedNode), 0, (yyvsp[-5].interm.intermNode), (yylsp[-4]));
</span><del>-        --context-&gt;mLoopNestingLevel;
</del><ins>+        context-&gt;decrLoopNestingLevel();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 255:
</del><ins>+  case 257:
</ins><span class="cx"> 
</span><del>-    { context-&gt;symbolTable.push(); ++context-&gt;mLoopNestingLevel; }
</del><ins>+    { context-&gt;symbolTable.push(); context-&gt;incrLoopNestingLevel(); }
</ins><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 256:
</del><ins>+  case 258:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         context-&gt;symbolTable.pop();
</span><span class="cx">         (yyval.interm.intermNode) = context-&gt;intermediate.addLoop(ELoopFor, (yyvsp[-3].interm.intermNode), reinterpret_cast&lt;TIntermTyped*&gt;((yyvsp[-2].interm.nodePair).node1), reinterpret_cast&lt;TIntermTyped*&gt;((yyvsp[-2].interm.nodePair).node2), (yyvsp[0].interm.intermNode), (yylsp[-6]));
</span><del>-        --context-&gt;mLoopNestingLevel;
</del><ins>+        context-&gt;decrLoopNestingLevel();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 257:
</del><ins>+  case 259:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
</span><span class="lines">@@ -4759,7 +4691,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 258:
</del><ins>+  case 260:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
</span><span class="lines">@@ -4767,7 +4699,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 259:
</del><ins>+  case 261:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
</span><span class="lines">@@ -4775,7 +4707,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 260:
</del><ins>+  case 262:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermTypedNode) = 0;
</span><span class="lines">@@ -4783,7 +4715,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 261:
</del><ins>+  case 263:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
</span><span class="lines">@@ -4792,7 +4724,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 262:
</del><ins>+  case 264:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
</span><span class="lines">@@ -4801,7 +4733,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 263:
</del><ins>+  case 265:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermNode) = context-&gt;addBranch(EOpContinue, (yylsp[-1]));
</span><span class="lines">@@ -4809,7 +4741,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 264:
</del><ins>+  case 266:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermNode) = context-&gt;addBranch(EOpBreak, (yylsp[-1]));
</span><span class="lines">@@ -4817,7 +4749,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 265:
</del><ins>+  case 267:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermNode) = context-&gt;addBranch(EOpReturn, (yylsp[-1]));
</span><span class="lines">@@ -4825,7 +4757,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 266:
</del><ins>+  case 268:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermNode) = context-&gt;addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
</span><span class="lines">@@ -4833,7 +4765,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 267:
</del><ins>+  case 269:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         FRAG_ONLY(&quot;discard&quot;, (yylsp[-1]));
</span><span class="lines">@@ -4842,25 +4774,25 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 268:
</del><ins>+  case 270:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
</span><del>-        context-&gt;treeRoot = (yyval.interm.intermNode);
</del><ins>+        context-&gt;setTreeRoot((yyval.interm.intermNode));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 269:
</del><ins>+  case 271:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermNode) = context-&gt;intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode), (yyloc));
</span><del>-        context-&gt;treeRoot = (yyval.interm.intermNode);
</del><ins>+        context-&gt;setTreeRoot((yyval.interm.intermNode));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 270:
</del><ins>+  case 272:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
</span><span class="lines">@@ -4868,7 +4800,7 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 271:
</del><ins>+  case 273:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
</span><span class="lines">@@ -4876,124 +4808,18 @@
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 272:
</del><ins>+  case 274:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><del>-        TFunction* function = (yyvsp[0].interm).function;
-        
-        const TSymbol *builtIn = context-&gt;symbolTable.findBuiltIn(function-&gt;getMangledName(), context-&gt;shaderVersion);
-        
-        if (builtIn)
-        {
-            context-&gt;error((yylsp[0]), &quot;built-in functions cannot be redefined&quot;, function-&gt;getName().c_str());
-            context-&gt;recover();
-        }
-        
-        TFunction* prevDec = static_cast&lt;TFunction*&gt;(context-&gt;symbolTable.find(function-&gt;getMangledName(), context-&gt;shaderVersion));
-        //
-        // Note:  'prevDec' could be 'function' if this is the first time we've seen function
-        // as it would have just been put in the symbol table.  Otherwise, we're looking up
-        // an earlier occurance.
-        //
-        if (prevDec-&gt;isDefined()) {
-            //
-            // Then this function already has a body.
-            //
-            context-&gt;error((yylsp[0]), &quot;function already has a body&quot;, function-&gt;getName().c_str());
-            context-&gt;recover();
-        }
-        prevDec-&gt;setDefined();
-        //
-        // Overload the unique ID of the definition to be the same unique ID as the declaration.
-        // Eventually we will probably want to have only a single definition and just swap the
-        // arguments to be the definition's arguments.
-        //
-        function-&gt;setUniqueId(prevDec-&gt;getUniqueId());
-
-        //
-        // Raise error message if main function takes any parameters or return anything other than void
-        //
-        if (function-&gt;getName() == &quot;main&quot;) {
-            if (function-&gt;getParamCount() &gt; 0) {
-                context-&gt;error((yylsp[0]), &quot;function cannot take any parameter(s)&quot;, function-&gt;getName().c_str());
-                context-&gt;recover();
-            }
-            if (function-&gt;getReturnType().getBasicType() != EbtVoid) {
-                context-&gt;error((yylsp[0]), &quot;&quot;, function-&gt;getReturnType().getBasicString(), &quot;main function cannot return a value&quot;);
-                context-&gt;recover();
-            }
-        }
-
-        //
-        // Remember the return type for later checking for RETURN statements.
-        //
-        context-&gt;currentFunctionType = &amp;(prevDec-&gt;getReturnType());
-        context-&gt;mFunctionReturnsValue = false;
-
-        //
-        // Insert parameters into the symbol table.
-        // If the parameter has no name, it's not an error, just don't insert it
-        // (could be used for unused args).
-        //
-        // Also, accumulate the list of parameters into the HIL, so lower level code
-        // knows where to find parameters.
-        //
-        TIntermAggregate* paramNodes = new TIntermAggregate;
-        for (size_t i = 0; i &lt; function-&gt;getParamCount(); i++) {
-            const TParameter&amp; param = function-&gt;getParam(i);
-            if (param.name != 0) {
-                TVariable *variable = new TVariable(param.name, *param.type);
-                //
-                // Insert the parameters with name in the symbol table.
-                //
-                if (! context-&gt;symbolTable.declare(variable)) {
-                    context-&gt;error((yylsp[0]), &quot;redefinition&quot;, variable-&gt;getName().c_str());
-                    context-&gt;recover();
-                    delete variable;
-                }
-
-                //
-                // Add the parameter to the HIL
-                //
-                paramNodes = context-&gt;intermediate.growAggregate(
-                                               paramNodes,
-                                               context-&gt;intermediate.addSymbol(variable-&gt;getUniqueId(),
-                                                                       variable-&gt;getName(),
-                                                                       variable-&gt;getType(), (yylsp[0])),
-                                               (yylsp[0]));
-            } else {
-                paramNodes = context-&gt;intermediate.growAggregate(paramNodes, context-&gt;intermediate.addSymbol(0, &quot;&quot;, *param.type, (yylsp[0])), (yylsp[0]));
-            }
-        }
-        context-&gt;intermediate.setAggregateOperator(paramNodes, EOpParameters, (yylsp[0]));
-        (yyvsp[0].interm).intermAggregate = paramNodes;
-        context-&gt;mLoopNestingLevel = 0;
</del><ins>+        context-&gt;parseFunctionPrototype((yylsp[0]), (yyvsp[0].interm).function, &amp;(yyvsp[0].interm).intermAggregate);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="cx"> 
</span><del>-  case 273:
</del><ins>+  case 275:
</ins><span class="cx"> 
</span><span class="cx">     {
</span><del>-        //?? Check that all paths return a value if return type != void ?
-        //   May be best done as post process phase on intermediate code
-        if (context-&gt;currentFunctionType-&gt;getBasicType() != EbtVoid &amp;&amp; ! context-&gt;mFunctionReturnsValue) {
-            context-&gt;error((yylsp[-2]), &quot;function does not return a value:&quot;, &quot;&quot;, (yyvsp[-2].interm).function-&gt;getName().c_str());
-            context-&gt;recover();
-        }
-        
-        (yyval.interm.intermNode) = context-&gt;intermediate.growAggregate((yyvsp[-2].interm).intermAggregate, (yyvsp[0].interm.intermNode), (yyloc));
-        context-&gt;intermediate.setAggregateOperator((yyval.interm.intermNode), EOpFunction, (yylsp[-2]));
-        (yyval.interm.intermNode)-&gt;getAsAggregate()-&gt;setName((yyvsp[-2].interm).function-&gt;getMangledName().c_str());
-        (yyval.interm.intermNode)-&gt;getAsAggregate()-&gt;setType((yyvsp[-2].interm).function-&gt;getReturnType());
-        (yyval.interm.intermNode)-&gt;getAsAggregate()-&gt;setFunctionId((yyvsp[-2].interm).function-&gt;getUniqueId());
-
-        // store the pragma information for debug and optimize and other vendor specific
-        // information. This information can be queried from the parse tree
-        (yyval.interm.intermNode)-&gt;getAsAggregate()-&gt;setOptimize(context-&gt;pragma().optimize);
-        (yyval.interm.intermNode)-&gt;getAsAggregate()-&gt;setDebug(context-&gt;pragma().debug);
-
-        context-&gt;symbolTable.pop();
</del><ins>+        (yyval.interm.intermNode) = context-&gt;addFunctionDefinition(*((yyvsp[-2].interm).function), (yyvsp[-2].interm).intermAggregate, (yyvsp[0].interm.intermAggregate), (yylsp[-2]));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     break;
</span><span class="lines">@@ -5238,5 +5064,5 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> int glslang_parse(TParseContext* context) {
</span><del>-    return yyparse(context, context-&gt;scanner);
</del><ins>+    return yyparse(context, context-&gt;getScanner());
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorglslang_tabh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/glslang_tab.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,5 +1,7 @@
</span><span class="cx"> /* A Bison parser, made by GNU Bison 3.0.4.  */
</span><span class="cx"> 
</span><ins>+/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */
+
</ins><span class="cx"> /* Bison interface for Yacc-like parsers in C
</span><span class="cx"> 
</span><span class="cx">    Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorintermOutcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/intermOut.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/intermOut.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/intermOut.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -4,12 +4,18 @@
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><span class="cx"> 
</span><del>-#include &quot;compiler/translator/intermediate.h&quot;
</del><ins>+#include &quot;compiler/translator/Intermediate.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+void OutputFunction(TInfoSinkBase &amp;out, const char *str, TIntermAggregate *node)
+{
+    const char *internal = node-&gt;getNameObj().isInternal() ? &quot; (internal function)&quot; : &quot;&quot;;
+    out &lt;&lt; str &lt;&lt; internal &lt;&lt; &quot;: &quot; &lt;&lt; node-&gt;getNameObj().getString();
+}
+
</ins><span class="cx"> //
</span><span class="cx"> // Two purposes:
</span><span class="cx"> // 1.  Show an example of how to iterate tree.  Functions can
</span><span class="lines">@@ -27,18 +33,21 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     TOutputTraverser(TInfoSinkBase &amp;i)
</span><del>-        : sink(i) { }
</del><ins>+        : TIntermTraverser(true, false, false),
+          sink(i)
+    {
+    }
</ins><span class="cx">     TInfoSinkBase&amp; sink;
</span><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    void visitSymbol(TIntermSymbol *);
-    void visitConstantUnion(TIntermConstantUnion *);
-    bool visitBinary(Visit visit, TIntermBinary *);
-    bool visitUnary(Visit visit, TIntermUnary *);
-    bool visitSelection(Visit visit, TIntermSelection *);
-    bool visitAggregate(Visit visit, TIntermAggregate *);
-    bool visitLoop(Visit visit, TIntermLoop *);
-    bool visitBranch(Visit visit, TIntermBranch *);
</del><ins>+    void visitSymbol(TIntermSymbol *) override;
+    void visitConstantUnion(TIntermConstantUnion *) override;
+    bool visitBinary(Visit visit, TIntermBinary *) override;
+    bool visitUnary(Visit visit, TIntermUnary *) override;
+    bool visitSelection(Visit visit, TIntermSelection *) override;
+    bool visitAggregate(Visit visit, TIntermAggregate *) override;
+    bool visitLoop(Visit visit, TIntermLoop *) override;
+    bool visitBranch(Visit visit, TIntermBranch *) override;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> //
</span><span class="lines">@@ -56,26 +65,6 @@
</span><span class="cx"> 
</span><span class="cx"> }  // namespace anonymous
</span><span class="cx"> 
</span><del>-
-TString TType::getCompleteString() const
-{
-    TStringStream stream;
-
-    if (qualifier != EvqTemporary &amp;&amp; qualifier != EvqGlobal)
-        stream &lt;&lt; getQualifierString() &lt;&lt; &quot; &quot;;
-    if (precision != EbpUndefined)
-        stream &lt;&lt; getPrecisionString() &lt;&lt; &quot; &quot;;
-    if (array)
-        stream &lt;&lt; &quot;array[&quot; &lt;&lt; getArraySize() &lt;&lt; &quot;] of &quot;;
-    if (isMatrix())
-        stream &lt;&lt; getCols() &lt;&lt; &quot;X&quot; &lt;&lt; getRows() &lt;&lt; &quot; matrix of &quot;;
-    else if (isVector())
-        stream &lt;&lt; getNominalSize() &lt;&lt; &quot;-component vector of &quot;;
-
-    stream &lt;&lt; getBasicString();
-    return stream.str();
-}
-
</del><span class="cx"> //
</span><span class="cx"> // The rest of the file are the traversal functions.  The last one
</span><span class="cx"> // is the one that starts the traversal.
</span><span class="lines">@@ -390,10 +379,10 @@
</span><span class="cx">     {
</span><span class="cx">       case EOpSequence:      out &lt;&lt; &quot;Sequence\n&quot;; return true;
</span><span class="cx">       case EOpComma:         out &lt;&lt; &quot;Comma\n&quot;; return true;
</span><del>-      case EOpFunction:      out &lt;&lt; &quot;Function Definition: &quot; &lt;&lt; node-&gt;getName(); break;
-      case EOpFunctionCall:  out &lt;&lt; &quot;Function Call: &quot; &lt;&lt; node-&gt;getName(); break;
</del><ins>+      case EOpFunction:      OutputFunction(out, &quot;Function Definition&quot;, node); break;
+      case EOpFunctionCall:  OutputFunction(out, &quot;Function Call&quot;, node); break;
</ins><span class="cx">       case EOpParameters:    out &lt;&lt; &quot;Function Parameters: &quot;;              break;
</span><del>-      case EOpPrototype:     out &lt;&lt; &quot;Function Prototype: &quot; &lt;&lt; node-&gt;getName(); break;
</del><ins>+      case EOpPrototype:     OutputFunction(out, &quot;Function Prototype&quot;, node); break;
</ins><span class="cx"> 
</span><span class="cx">       case EOpConstructFloat: out &lt;&lt; &quot;Construct float&quot;; break;
</span><span class="cx">       case EOpConstructVec2:  out &lt;&lt; &quot;Construct vec2&quot;;  break;
</span><span class="lines">@@ -412,7 +401,13 @@
</span><span class="cx">       case EOpConstructUVec3: out &lt;&lt; &quot;Construct uvec3&quot;; break;
</span><span class="cx">       case EOpConstructUVec4: out &lt;&lt; &quot;Construct uvec4&quot;; break;
</span><span class="cx">       case EOpConstructMat2:  out &lt;&lt; &quot;Construct mat2&quot;;  break;
</span><ins>+      case EOpConstructMat2x3:  out &lt;&lt; &quot;Construct mat2x3&quot;;  break;
+      case EOpConstructMat2x4:  out &lt;&lt; &quot;Construct mat2x4&quot;;  break;
+      case EOpConstructMat3x2:  out &lt;&lt; &quot;Construct mat3x2&quot;;  break;
</ins><span class="cx">       case EOpConstructMat3:  out &lt;&lt; &quot;Construct mat3&quot;;  break;
</span><ins>+      case EOpConstructMat3x4:  out &lt;&lt; &quot;Construct mat3x4&quot;;  break;
+      case EOpConstructMat4x2:  out &lt;&lt; &quot;Construct mat4x2&quot;;  break;
+      case EOpConstructMat4x3:  out &lt;&lt; &quot;Construct mat4x3&quot;;  break;
</ins><span class="cx">       case EOpConstructMat4:  out &lt;&lt; &quot;Construct mat4&quot;;  break;
</span><span class="cx">       case EOpConstructStruct:  out &lt;&lt; &quot;Construct structure&quot;;  break;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorintermediateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/intermediate.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/intermediate.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/intermediate.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx">     TIntermAggregate *growAggregate(
</span><span class="cx">         TIntermNode *left, TIntermNode *right, const TSourceLoc &amp;);
</span><span class="cx">     TIntermAggregate *makeAggregate(TIntermNode *node, const TSourceLoc &amp;);
</span><ins>+    TIntermAggregate *ensureSequence(TIntermNode *node);
</ins><span class="cx">     TIntermAggregate *setAggregateOperator(TIntermNode *, TOperator, const TSourceLoc &amp;);
</span><span class="cx">     TIntermNode *addSelection(TIntermTyped *cond, TIntermNodePair code, const TSourceLoc &amp;);
</span><span class="cx">     TIntermTyped *addSelection(TIntermTyped *cond, TIntermTyped *trueBlock, TIntermTyped *falseBlock,
</span><span class="lines">@@ -47,22 +48,24 @@
</span><span class="cx">         TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &amp;line);
</span><span class="cx">     TIntermCase *addCase(
</span><span class="cx">         TIntermTyped *condition, const TSourceLoc &amp;line);
</span><del>-    TIntermTyped *addComma(
-        TIntermTyped *left, TIntermTyped *right, const TSourceLoc &amp;);
-    TIntermConstantUnion *addConstantUnion(
-        TConstantUnion *constantUnion, const TType &amp;type, const TSourceLoc &amp;line);
-    // TODO(zmo): Get rid of default value.
-    bool parseConstTree(const TSourceLoc &amp;, TIntermNode *, TConstantUnion *,
-                        TOperator, TType, bool singleConstantParam = false);
</del><ins>+    TIntermTyped *addComma(TIntermTyped *left,
+                           TIntermTyped *right,
+                           const TSourceLoc &amp;line,
+                           int shaderVersion);
+    TIntermConstantUnion *addConstantUnion(const TConstantUnion *constantUnion,
+                                           const TType &amp;type,
+                                           const TSourceLoc &amp;line);
</ins><span class="cx">     TIntermNode *addLoop(TLoopType, TIntermNode *, TIntermTyped *, TIntermTyped *,
</span><span class="cx">                          TIntermNode *, const TSourceLoc &amp;);
</span><span class="cx">     TIntermBranch *addBranch(TOperator, const TSourceLoc &amp;);
</span><span class="cx">     TIntermBranch *addBranch(TOperator, TIntermTyped *, const TSourceLoc &amp;);
</span><span class="cx">     TIntermTyped *addSwizzle(TVectorFields &amp;, const TSourceLoc &amp;);
</span><del>-    bool postProcess(TIntermNode *);
</del><ins>+    TIntermAggregate *postProcess(TIntermNode *root);
</ins><span class="cx"> 
</span><span class="cx">     static void outputTree(TIntermNode *, TInfoSinkBase &amp;);
</span><span class="cx"> 
</span><ins>+    TIntermTyped *foldAggregateBuiltIn(TIntermAggregate *aggregate);
+
</ins><span class="cx">   private:
</span><span class="cx">     void operator=(TIntermediate &amp;); // prevent assignments
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorparseConstcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/parseConst.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/parseConst.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/parseConst.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,264 +0,0 @@
</span><del>-//
-// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-#include &quot;compiler/translator/ParseContext.h&quot;
-
-//
-// Use this class to carry along data from node to node in
-// the traversal
-//
-class TConstTraverser : public TIntermTraverser
-{
-  public:
-    TConstTraverser(TConstantUnion *cUnion, bool singleConstParam,
-                    TOperator constructType, TInfoSink &amp;sink, TType &amp;t)
-        : error(false),
-          mIndex(0),
-          mUnionArray(cUnion),
-          mType(t),
-          mConstructorType(constructType),
-          mSingleConstantParam(singleConstParam),
-          mInfoSink(sink),
-          mSize(0),
-          mIsDiagonalMatrixInit(false),
-          mMatrixCols(0),
-          mMatrixRows(0)
-    {
-    }
-
-    bool error;
-
-  protected:
-    void visitSymbol(TIntermSymbol *);
-    void visitConstantUnion(TIntermConstantUnion *);
-    bool visitBinary(Visit visit, TIntermBinary *);
-    bool visitUnary(Visit visit, TIntermUnary *);
-    bool visitSelection(Visit visit, TIntermSelection *);
-    bool visitAggregate(Visit visit, TIntermAggregate *);
-    bool visitLoop(Visit visit, TIntermLoop *);
-    bool visitBranch(Visit visit, TIntermBranch *);
-
-    size_t mIndex;
-    TConstantUnion *mUnionArray;
-    TType mType;
-    TOperator mConstructorType;
-    bool mSingleConstantParam;
-    TInfoSink &amp;mInfoSink;
-    size_t mSize; // size of the constructor ( 4 for vec4)
-    bool mIsDiagonalMatrixInit;
-    int mMatrixCols; // columns of the matrix
-    int mMatrixRows; // rows of the matrix
-};
-
-//
-// The rest of the file are the traversal functions.  The last one
-// is the one that starts the traversal.
-//
-// Return true from interior nodes to have the external traversal
-// continue on to children.  If you process children yourself,
-// return false.
-//
-void TConstTraverser::visitSymbol(TIntermSymbol *node)
-{
-    mInfoSink.info.message(EPrefixInternalError, node-&gt;getLine(),
-                           &quot;Symbol Node found in constant constructor&quot;);
-    return;
-}
-
-bool TConstTraverser::visitBinary(Visit visit, TIntermBinary *node)
-{
-    TQualifier qualifier = node-&gt;getType().getQualifier();
-
-    if (qualifier != EvqConst)
-    {
-        TString buf;
-        buf.append(&quot;'constructor' : assigning non-constant to &quot;);
-        buf.append(mType.getCompleteString());
-        mInfoSink.info.message(EPrefixError, node-&gt;getLine(), buf.c_str());
-        error = true;
-        return false;
-    }
-
-    mInfoSink.info.message(EPrefixInternalError, node-&gt;getLine(),
-                           &quot;Binary Node found in constant constructor&quot;);
-    return false;
-}
-
-bool TConstTraverser::visitUnary(Visit visit, TIntermUnary *node)
-{
-    TString buf;
-    buf.append(&quot;'constructor' : assigning non-constant to &quot;);
-    buf.append(mType.getCompleteString());
-    mInfoSink.info.message(EPrefixError, node-&gt;getLine(), buf.c_str());
-    error = true;
-    return false;
-}
-
-bool TConstTraverser::visitAggregate(Visit visit, TIntermAggregate *node)
-{
-    if (!node-&gt;isConstructor() &amp;&amp; node-&gt;getOp() != EOpComma)
-    {
-        TString buf;
-        buf.append(&quot;'constructor' : assigning non-constant to &quot;);
-        buf.append(mType.getCompleteString());
-        mInfoSink.info.message(EPrefixError, node-&gt;getLine(), buf.c_str());
-        error = true;
-        return false;
-    }
-
-    if (node-&gt;getSequence()-&gt;size() == 0)
-    {
-        error = true;
-        return false;
-    }
-
-    bool flag = node-&gt;getSequence()-&gt;size() == 1 &amp;&amp;
-                (*node-&gt;getSequence())[0]-&gt;getAsTyped()-&gt;getAsConstantUnion();
-    if (flag)
-    {
-        mSingleConstantParam = true;
-        mConstructorType = node-&gt;getOp();
-        mSize = node-&gt;getType().getObjectSize();
-
-        if (node-&gt;getType().isMatrix())
-        {
-            mIsDiagonalMatrixInit = true;
-            mMatrixCols = node-&gt;getType().getCols();
-            mMatrixRows = node-&gt;getType().getRows();
-        }
-    }
-
-    for (TIntermSequence::iterator p = node-&gt;getSequence()-&gt;begin();
-         p != node-&gt;getSequence()-&gt;end(); p++)
-    {
-        if (node-&gt;getOp() == EOpComma)
-            mIndex = 0;
-        (*p)-&gt;traverse(this);
-    }
-    if (flag)
-    {
-        mSingleConstantParam = false;
-        mConstructorType = EOpNull;
-        mSize = 0;
-        mIsDiagonalMatrixInit = false;
-        mMatrixCols = 0;
-        mMatrixRows = 0;
-    }
-    return false;
-}
-
-bool TConstTraverser::visitSelection(Visit visit, TIntermSelection *node)
-{
-    mInfoSink.info.message(EPrefixInternalError, node-&gt;getLine(),
-                           &quot;Selection Node found in constant constructor&quot;);
-    error = true;
-    return false;
-}
-
-void TConstTraverser::visitConstantUnion(TIntermConstantUnion *node)
-{
-    if (!node-&gt;getUnionArrayPointer())
-    {
-        // The constant was not initialized, this should already have been logged
-        ASSERT(mInfoSink.info.size() != 0);
-        return;
-    }
-
-    TConstantUnion *leftUnionArray = mUnionArray;
-    size_t instanceSize = mType.getObjectSize();
-    TBasicType basicType = mType.getBasicType();
-
-    if (mIndex &gt;= instanceSize)
-        return;
-
-    if (!mSingleConstantParam)
-    {
-        size_t objectSize = node-&gt;getType().getObjectSize();
-        const TConstantUnion *rightUnionArray = node-&gt;getUnionArrayPointer();
-        for (size_t i=0; i &lt; objectSize; i++)
-        {
-            if (mIndex &gt;= instanceSize)
-                return;
-            leftUnionArray[mIndex].cast(basicType, rightUnionArray[i]);
-            mIndex++;
-        }
-    }
-    else
-    {
-        size_t totalSize = mIndex + mSize;
-        const TConstantUnion *rightUnionArray = node-&gt;getUnionArrayPointer();
-        if (!mIsDiagonalMatrixInit)
-        {
-            int count = 0;
-            for (size_t i = mIndex; i &lt; totalSize; i++)
-            {
-                if (i &gt;= instanceSize)
-                    return;
-                leftUnionArray[i].cast(basicType, rightUnionArray[count]);
-                mIndex++;
-                if (node-&gt;getType().getObjectSize() &gt; 1)
-                    count++;
-            }
-        }
-        else
-        {
-            // for matrix diagonal constructors from a single scalar
-            for (int i = 0, col = 0; col &lt; mMatrixCols; col++)
-            {
-                for (int row = 0; row &lt; mMatrixRows; row++, i++)
-                {
-                    if (col == row)
-                    {
-                        leftUnionArray[i].cast(basicType, rightUnionArray[0]);
-                    }
-                    else
-                    {
-                        leftUnionArray[i].setFConst(0.0f);
-                    }
-                    mIndex++;
-                }
-            }
-        }
-    }
-}
-
-bool TConstTraverser::visitLoop(Visit visit, TIntermLoop *node)
-{
-    mInfoSink.info.message(EPrefixInternalError, node-&gt;getLine(),
-                           &quot;Loop Node found in constant constructor&quot;);
-    error = true;
-    return false;
-}
-
-bool TConstTraverser::visitBranch(Visit visit, TIntermBranch *node)
-{
-    mInfoSink.info.message(EPrefixInternalError, node-&gt;getLine(),
-                           &quot;Branch Node found in constant constructor&quot;);
-    error = true;
-    return false;
-}
-
-//
-// This function is the one to call externally to start the traversal.
-// Individual functions can be initialized to 0 to skip processing of that
-// type of node.  It's children will still be processed.
-//
-bool TIntermediate::parseConstTree(
-    const TSourceLoc &amp;line, TIntermNode *root, TConstantUnion *unionArray,
-    TOperator constructorType, TType t, bool singleConstantParam)
-{
-    if (root == 0)
-        return false;
-
-    TConstTraverser it(unionArray, singleConstantParam, constructorType,
-                       mInfoSink, t);
-
-    root-&gt;traverse(&amp;it);
-    if (it.error)
-        return true;
-    else
-        return false;
-}
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatortimingRestrictFragmentShaderTimingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/timing/RestrictFragmentShaderTiming.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/timing/RestrictFragmentShaderTiming.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/timing/RestrictFragmentShaderTiming.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -54,11 +54,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Starting from each sampler, traverse the dependency graph and generate an error each time we
</span><span class="cx">     // hit a node where sampler dependent values are not allowed.
</span><del>-    for (TGraphSymbolVector::const_iterator iter = graph.beginSamplerSymbols();
-         iter != graph.endSamplerSymbols();
-         ++iter)
</del><ins>+    for (auto samplerSymbol : graph.samplerSymbols())
</ins><span class="cx">     {
</span><del>-        TGraphSymbol* samplerSymbol = *iter;
</del><span class="cx">         clearVisited();
</span><span class="cx">         samplerSymbol-&gt;traverse(this);
</span><span class="cx">     }
</span><span class="lines">@@ -66,11 +63,8 @@
</span><span class="cx"> 
</span><span class="cx"> void RestrictFragmentShaderTiming::validateUserDefinedFunctionCallUsage(const TDependencyGraph&amp; graph)
</span><span class="cx"> {
</span><del>-    for (TFunctionCallVector::const_iterator iter = graph.beginUserDefinedFunctionCalls();
-         iter != graph.endUserDefinedFunctionCalls();
-         ++iter)
</del><ins>+    for (const auto* functionCall : graph.userDefinedFunctionCalls())
</ins><span class="cx">     {
</span><del>-        TGraphFunctionCall* functionCall = *iter;
</del><span class="cx">         beginError(functionCall-&gt;getIntermFunctionCall());
</span><span class="cx">         mSink &lt;&lt; &quot;A call to a user defined function is not permitted.\n&quot;;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatortimingRestrictVertexShaderTimingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/timing/RestrictVertexShaderTiming.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/timing/RestrictVertexShaderTiming.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/timing/RestrictVertexShaderTiming.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -22,7 +22,8 @@
</span><span class="cx">     void enforceRestrictions(TIntermNode* root) { root-&gt;traverse(this); }
</span><span class="cx">     int numErrors() { return mNumErrors; }
</span><span class="cx"> 
</span><del>-    virtual void visitSymbol(TIntermSymbol*);
</del><ins>+    void visitSymbol(TIntermSymbol *) override;
+
</ins><span class="cx"> private:
</span><span class="cx">     TInfoSinkBase&amp; mSink;
</span><span class="cx">     int mNumErrors;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorutilcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/util.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/util.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/util.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,7 +12,7 @@
</span><span class="cx"> #include &quot;compiler/translator/SymbolTable.h&quot;
</span><span class="cx"> #include &quot;common/utilities.h&quot;
</span><span class="cx"> 
</span><del>-bool atof_clamp(const char *str, float *value)
</del><ins>+bool strtof_clamp(const std::string &amp;str, float *value)
</ins><span class="cx"> {
</span><span class="cx">     bool success = pp::numeric_lex_float(str, value);
</span><span class="cx">     if (!success)
</span><span class="lines">@@ -20,11 +20,11 @@
</span><span class="cx">     return success;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool atoi_clamp(const char *str, int *value)
</del><ins>+bool atoi_clamp(const char *str, unsigned int *value)
</ins><span class="cx"> {
</span><span class="cx">     bool success = pp::numeric_lex_int(str, value);
</span><span class="cx">     if (!success)
</span><del>-        *value = std::numeric_limits&lt;int&gt;::max();
</del><ins>+        *value = std::numeric_limits&lt;unsigned int&gt;::max();
</ins><span class="cx">     return success;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -219,7 +219,6 @@
</span><span class="cx">     switch (qualifier)
</span><span class="cx">     {
</span><span class="cx">       case EvqVaryingOut:
</span><del>-      case EvqInvariantVaryingOut:
</del><span class="cx">       case EvqSmoothOut:
</span><span class="cx">       case EvqFlatOut:
</span><span class="cx">       case EvqCentroidOut:
</span><span class="lines">@@ -237,7 +236,6 @@
</span><span class="cx">     switch (qualifier)
</span><span class="cx">     {
</span><span class="cx">       case EvqVaryingIn:
</span><del>-      case EvqInvariantVaryingIn:
</del><span class="cx">       case EvqSmoothIn:
</span><span class="cx">       case EvqFlatIn:
</span><span class="cx">       case EvqCentroidIn:
</span><span class="lines">@@ -269,8 +267,6 @@
</span><span class="cx">       case EvqFragmentIn:
</span><span class="cx">       case EvqVaryingIn:
</span><span class="cx">       case EvqVaryingOut:
</span><del>-      case EvqInvariantVaryingIn:
-      case EvqInvariantVaryingOut:
</del><span class="cx">         return INTERPOLATION_SMOOTH;
</span><span class="cx"> 
</span><span class="cx">       case EvqCentroidIn:
</span><span class="lines">@@ -301,13 +297,13 @@
</span><span class="cx">     ASSERT(variable);
</span><span class="cx">     switch (type.getQualifier())
</span><span class="cx">     {
</span><del>-      case EvqInvariantVaryingIn:
-      case EvqInvariantVaryingOut:
-        variable-&gt;isInvariant = true;
-        break;
</del><span class="cx">       case EvqVaryingIn:
</span><span class="cx">       case EvqVaryingOut:
</span><del>-        if (mSymbolTable.isVaryingInvariant(std::string(name.c_str())))
</del><ins>+      case EvqVertexOut:
+      case EvqSmoothOut:
+      case EvqFlatOut:
+      case EvqCentroidOut:
+        if (mSymbolTable.isVaryingInvariant(std::string(name.c_str())) || type.isInvariant())
</ins><span class="cx">         {
</span><span class="cx">             variable-&gt;isInvariant = true;
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilertranslatorutilh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler/translator/util.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler/translator/util.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler/translator/util.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,15 +14,15 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;compiler/translator/Types.h&quot;
</span><span class="cx"> 
</span><del>-// atof_clamp is like atof but
</del><ins>+// strtof_clamp is like strtof but
</ins><span class="cx"> //   1. it forces C locale, i.e. forcing '.' as decimal point.
</span><span class="cx"> //   2. it clamps the value to -FLT_MAX or FLT_MAX if overflow happens.
</span><span class="cx"> // Return false if overflow happens.
</span><del>-extern bool atof_clamp(const char *str, float *value);
</del><ins>+bool strtof_clamp(const std::string &amp;str, float *value);
</ins><span class="cx"> 
</span><del>-// If overflow happens, clamp the value to INT_MIN or INT_MAX.
</del><ins>+// If overflow happens, clamp the value to UINT_MIN or UINT_MAX.
</ins><span class="cx"> // Return false if overflow happens.
</span><del>-extern bool atoi_clamp(const char *str, int *value);
</del><ins>+bool atoi_clamp(const char *str, unsigned int *value);
</ins><span class="cx"> 
</span><span class="cx"> class TSymbolTable;
</span><span class="cx"> 
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     GetVariableTraverser(const TSymbolTable &amp;symbolTable);
</span><ins>+    virtual ~GetVariableTraverser() {}
</ins><span class="cx"> 
</span><span class="cx">     template &lt;typename VarT&gt;
</span><span class="cx">     void traverse(const TType &amp;type, const TString &amp;name, std::vector&lt;VarT&gt; *output);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccompilergypi"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/compiler.gypi (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/compiler.gypi        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/compiler.gypi        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,8 +15,9 @@
</span><span class="cx">             '../include/GLES2/gl2ext.h',
</span><span class="cx">             '../include/GLES2/gl2platform.h',
</span><span class="cx">             '../include/GLES3/gl3.h',
</span><del>-            '../include/GLES3/gl3ext.h',
</del><span class="cx">             '../include/GLES3/gl3platform.h',
</span><ins>+            '../include/GLES3/gl31.h',
+            '../include/GLES3/gl32.h',
</ins><span class="cx">             '../include/GLSLANG/ShaderLang.h',
</span><span class="cx">             '../include/GLSLANG/ShaderVars.h',
</span><span class="cx">             '../include/KHR/khrplatform.h',
</span><span class="lines">@@ -24,8 +25,8 @@
</span><span class="cx">             'compiler/translator/BaseTypes.h',
</span><span class="cx">             'compiler/translator/BuiltInFunctionEmulator.cpp',
</span><span class="cx">             'compiler/translator/BuiltInFunctionEmulator.h',
</span><del>-            'compiler/translator/BuiltInFunctionEmulatorGLSL.cpp',
-            'compiler/translator/BuiltInFunctionEmulatorGLSL.h',
</del><ins>+            'compiler/translator/Cache.cpp',
+            'compiler/translator/Cache.h',
</ins><span class="cx">             'compiler/translator/CallDAG.cpp',
</span><span class="cx">             'compiler/translator/CallDAG.h',
</span><span class="cx">             'compiler/translator/CodeGen.cpp',
</span><span class="lines">@@ -33,6 +34,8 @@
</span><span class="cx">             'compiler/translator/Compiler.cpp',
</span><span class="cx">             'compiler/translator/Compiler.h',
</span><span class="cx">             'compiler/translator/ConstantUnion.h',
</span><ins>+            'compiler/translator/DeferGlobalInitializers.cpp',
+            'compiler/translator/DeferGlobalInitializers.h',
</ins><span class="cx">             'compiler/translator/Diagnostics.cpp',
</span><span class="cx">             'compiler/translator/Diagnostics.h',
</span><span class="cx">             'compiler/translator/DirectiveHandler.cpp',
</span><span class="lines">@@ -67,12 +70,6 @@
</span><span class="cx">             'compiler/translator/NodeSearch.h',
</span><span class="cx">             'compiler/translator/Operator.cpp',
</span><span class="cx">             'compiler/translator/Operator.h',
</span><del>-            'compiler/translator/OutputESSL.cpp',
-            'compiler/translator/OutputESSL.h',
-            'compiler/translator/OutputGLSL.cpp',
-            'compiler/translator/OutputGLSL.h',
-            'compiler/translator/OutputGLSLBase.cpp',
-            'compiler/translator/OutputGLSLBase.h',
</del><span class="cx">             'compiler/translator/ParseContext.cpp',
</span><span class="cx">             'compiler/translator/ParseContext.h',
</span><span class="cx">             'compiler/translator/PoolAlloc.cpp',
</span><span class="lines">@@ -80,10 +77,14 @@
</span><span class="cx">             'compiler/translator/Pragma.h',
</span><span class="cx">             'compiler/translator/PruneEmptyDeclarations.cpp',
</span><span class="cx">             'compiler/translator/PruneEmptyDeclarations.h',
</span><del>-            'compiler/translator/QualifierAlive.cpp',
-            'compiler/translator/QualifierAlive.h',
</del><ins>+            'compiler/translator/RecordConstantPrecision.cpp',
+            'compiler/translator/RecordConstantPrecision.h',
</ins><span class="cx">             'compiler/translator/RegenerateStructNames.cpp',
</span><span class="cx">             'compiler/translator/RegenerateStructNames.h',
</span><ins>+            'compiler/translator/RemovePow.cpp',
+            'compiler/translator/RemovePow.h',
+            'compiler/translator/RewriteDoWhile.cpp',
+            'compiler/translator/RewriteDoWhile.h',
</ins><span class="cx">             'compiler/translator/RenameFunction.h',
</span><span class="cx">             'compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp',
</span><span class="cx">             'compiler/translator/ScalarizeVecAndMatConstructorArgs.h',
</span><span class="lines">@@ -91,16 +92,16 @@
</span><span class="cx">             'compiler/translator/SearchSymbol.h',
</span><span class="cx">             'compiler/translator/SymbolTable.cpp',
</span><span class="cx">             'compiler/translator/SymbolTable.h',
</span><del>-            'compiler/translator/TranslatorESSL.cpp',
-            'compiler/translator/TranslatorESSL.h',
-            'compiler/translator/TranslatorGLSL.cpp',
-            'compiler/translator/TranslatorGLSL.h',
</del><span class="cx">             'compiler/translator/Types.cpp',
</span><span class="cx">             'compiler/translator/Types.h',
</span><span class="cx">             'compiler/translator/UnfoldShortCircuitAST.cpp',
</span><span class="cx">             'compiler/translator/UnfoldShortCircuitAST.h',
</span><ins>+            'compiler/translator/ValidateGlobalInitializer.cpp',
+            'compiler/translator/ValidateGlobalInitializer.h',
</ins><span class="cx">             'compiler/translator/ValidateLimitations.cpp',
</span><span class="cx">             'compiler/translator/ValidateLimitations.h',
</span><ins>+            'compiler/translator/ValidateMaxParameters.h',
+            'compiler/translator/ValidateMaxParameters.cpp',
</ins><span class="cx">             'compiler/translator/ValidateOutputs.cpp',
</span><span class="cx">             'compiler/translator/ValidateOutputs.h',
</span><span class="cx">             'compiler/translator/ValidateSwitch.cpp',
</span><span class="lines">@@ -109,8 +110,6 @@
</span><span class="cx">             'compiler/translator/VariableInfo.h',
</span><span class="cx">             'compiler/translator/VariablePacker.cpp',
</span><span class="cx">             'compiler/translator/VariablePacker.h',
</span><del>-            'compiler/translator/VersionGLSL.cpp',
-            'compiler/translator/VersionGLSL.h',
</del><span class="cx">             'compiler/translator/blocklayout.cpp',
</span><span class="cx">             'compiler/translator/blocklayout.h',
</span><span class="cx">             'compiler/translator/depgraph/DependencyGraph.cpp',
</span><span class="lines">@@ -127,9 +126,7 @@
</span><span class="cx">             'compiler/translator/glslang_tab.cpp',
</span><span class="cx">             'compiler/translator/glslang_tab.h',
</span><span class="cx">             'compiler/translator/intermOut.cpp',
</span><del>-            'compiler/translator/intermediate.h',
</del><span class="cx">             'compiler/translator/length_limits.h',
</span><del>-            'compiler/translator/parseConst.cpp',
</del><span class="cx">             'compiler/translator/timing/RestrictFragmentShaderTiming.cpp',
</span><span class="cx">             'compiler/translator/timing/RestrictFragmentShaderTiming.h',
</span><span class="cx">             'compiler/translator/timing/RestrictVertexShaderTiming.cpp',
</span><span class="lines">@@ -139,6 +136,28 @@
</span><span class="cx">             'third_party/compiler/ArrayBoundsClamper.cpp',
</span><span class="cx">             'third_party/compiler/ArrayBoundsClamper.h',
</span><span class="cx">         ],
</span><ins>+        'angle_translator_lib_essl_sources':
+        [
+            'compiler/translator/OutputESSL.cpp',
+            'compiler/translator/OutputESSL.h',
+            'compiler/translator/TranslatorESSL.cpp',
+            'compiler/translator/TranslatorESSL.h',
+        ],
+        'angle_translator_lib_glsl_sources':
+        [
+            'compiler/translator/BuiltInFunctionEmulatorGLSL.cpp',
+            'compiler/translator/BuiltInFunctionEmulatorGLSL.h',
+            'compiler/translator/ExtensionGLSL.cpp',
+            'compiler/translator/ExtensionGLSL.h',
+            'compiler/translator/OutputGLSL.cpp',
+            'compiler/translator/OutputGLSL.h',
+            'compiler/translator/OutputGLSLBase.cpp',
+            'compiler/translator/OutputGLSLBase.h',
+            'compiler/translator/TranslatorGLSL.cpp',
+            'compiler/translator/TranslatorGLSL.h',
+            'compiler/translator/VersionGLSL.cpp',
+            'compiler/translator/VersionGLSL.h',
+        ],
</ins><span class="cx">         'angle_translator_lib_hlsl_sources':
</span><span class="cx">         [
</span><span class="cx">             'compiler/translator/ArrayReturnValueToOutParameter.cpp',
</span><span class="lines">@@ -151,6 +170,8 @@
</span><span class="cx">             'compiler/translator/BuiltInFunctionEmulatorHLSL.h',
</span><span class="cx">             'compiler/translator/OutputHLSL.cpp',
</span><span class="cx">             'compiler/translator/OutputHLSL.h',
</span><ins>+            'compiler/translator/RemoveDynamicIndexing.cpp',
+            'compiler/translator/RemoveDynamicIndexing.h',
</ins><span class="cx">             'compiler/translator/RemoveSwitchFallThrough.cpp',
</span><span class="cx">             'compiler/translator/RemoveSwitchFallThrough.h',
</span><span class="cx">             'compiler/translator/RewriteElseBlocks.cpp',
</span><span class="lines">@@ -159,14 +180,14 @@
</span><span class="cx">             'compiler/translator/SeparateArrayInitialization.h',
</span><span class="cx">             'compiler/translator/SeparateDeclarations.cpp',
</span><span class="cx">             'compiler/translator/SeparateDeclarations.h',
</span><del>-            'compiler/translator/SimplifyArrayAssignment.cpp',
-            'compiler/translator/SimplifyArrayAssignment.h',
</del><ins>+            'compiler/translator/SeparateExpressionsReturningArrays.cpp',
+            'compiler/translator/SeparateExpressionsReturningArrays.h',
</ins><span class="cx">             'compiler/translator/StructureHLSL.cpp',
</span><span class="cx">             'compiler/translator/StructureHLSL.h',
</span><span class="cx">             'compiler/translator/TranslatorHLSL.cpp',
</span><span class="cx">             'compiler/translator/TranslatorHLSL.h',
</span><del>-            'compiler/translator/UnfoldShortCircuit.cpp',
-            'compiler/translator/UnfoldShortCircuit.h',
</del><ins>+            'compiler/translator/UnfoldShortCircuitToIf.cpp',
+            'compiler/translator/UnfoldShortCircuitToIf.h',
</ins><span class="cx">             'compiler/translator/UniformHLSL.cpp',
</span><span class="cx">             'compiler/translator/UniformHLSL.h',
</span><span class="cx">             'compiler/translator/UtilsHLSL.cpp',
</span><span class="lines">@@ -212,17 +233,6 @@
</span><span class="cx">             'type': 'static_library',
</span><span class="cx">             'includes': [ '../build/common_defines.gypi', ],
</span><span class="cx">             'sources': [ '&lt;@(angle_preprocessor_sources)', ],
</span><del>-            'conditions':
-            [
-                ['angle_build_winrt==1',
-                {
-                    'msvs_enable_winrt' : '1',
-                }],
-                ['angle_build_winphone==1',
-                {
-                    'msvs_enable_winphone' : '1',
-                }],
-            ],
</del><span class="cx">         },
</span><span class="cx">         {
</span><span class="cx">             'target_name': 'translator_lib',
</span><span class="lines">@@ -253,13 +263,41 @@
</span><span class="cx">             },
</span><span class="cx">             'conditions':
</span><span class="cx">             [
</span><del>-                ['angle_build_winrt==1',
</del><ins>+                ['angle_enable_essl==1',
</ins><span class="cx">                 {
</span><del>-                    'msvs_enable_winrt' : '1',
</del><ins>+                    'defines':
+                    [
+                        'ANGLE_ENABLE_ESSL',
+                    ],
+                    'direct_dependent_settings':
+                    {
+                        'defines':
+                        [
+                            'ANGLE_ENABLE_ESSL',
+                        ],
+                    },
+                    'sources':
+                    [
+                        '&lt;@(angle_translator_lib_essl_sources)',
+                    ],
</ins><span class="cx">                 }],
</span><del>-                ['angle_build_winphone==1',
</del><ins>+                ['angle_enable_glsl==1',
</ins><span class="cx">                 {
</span><del>-                    'msvs_enable_winphone' : '1',
</del><ins>+                    'defines':
+                    [
+                        'ANGLE_ENABLE_GLSL',
+                    ],
+                    'direct_dependent_settings':
+                    {
+                        'defines':
+                        [
+                            'ANGLE_ENABLE_GLSL',
+                        ],
+                    },
+                    'sources':
+                    [
+                        '&lt;@(angle_translator_lib_glsl_sources)',
+                    ],
</ins><span class="cx">                 }],
</span><span class="cx">                 ['angle_enable_hlsl==1',
</span><span class="cx">                 {
</span><span class="lines">@@ -301,17 +339,6 @@
</span><span class="cx">                 'compiler/translator/ShaderLang.cpp',
</span><span class="cx">                 'compiler/translator/ShaderVars.cpp'
</span><span class="cx">             ],
</span><del>-            'conditions':
-            [
-                ['angle_build_winrt==1',
-                {
-                    'msvs_enable_winrt' : '1',
-                }],
-                ['angle_build_winphone==1',
-                {
-                    'msvs_enable_winphone' : '1',
-                }],
-            ],
</del><span class="cx">         },
</span><span class="cx"> 
</span><span class="cx">         {
</span><span class="lines">@@ -340,17 +367,6 @@
</span><span class="cx">                 'compiler/translator/ShaderLang.cpp',
</span><span class="cx">                 'compiler/translator/ShaderVars.cpp'
</span><span class="cx">             ],
</span><del>-            'conditions':
-            [
-                ['angle_build_winrt==1',
-                {
-                    'msvs_enable_winrt' : '1',
-                }],
-                ['angle_build_winphone==1',
-                {
-                    'msvs_enable_winphone' : '1',
-                }],
-            ],
</del><span class="cx">         },
</span><span class="cx">     ],
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrccopy_compiler_dllbat"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/copy_compiler_dll.bat (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/copy_compiler_dll.bat        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/copy_compiler_dll.bat        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,9 +1,9 @@
</span><del>-@echo off
-set _arch=%1
-set _arch=%_arch:Win32=x86%
-copy %2&quot;\Redist\D3D\&quot;%_arch%&quot;\d3dcompiler_47.dll&quot; %3 &gt; NUL
-:: This is equivalent to `touch', see:
-:: https://technet.microsoft.com/en-us/library/bb490886.aspx
-:: This avoids rerunning because this batch file is also copied to the gen dir,
-:: so it's timestamp would otherwise be newer than the dll.
-copy /b %3\d3dcompiler_47.dll+,, %3\d3dcompiler_47.dll &gt; NUL
</del><ins>+@echo off
+set _arch=%1
+set _arch=%_arch:Win32=x86%
+copy %2&quot;\Redist\D3D\&quot;%_arch%&quot;\d3dcompiler_47.dll&quot; %3 &gt; NUL
+:: This is equivalent to `touch', see:
+:: https://technet.microsoft.com/en-us/library/bb490886.aspx
+:: This avoids rerunning because this batch file is also copied to the gen dir,
+:: so it's timestamp would otherwise be newer than the dll.
+copy /b %3\d3dcompiler_47.dll+,, %3\d3dcompiler_47.dll &gt; NUL
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEAttributeMapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/AttributeMap.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/AttributeMap.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/AttributeMap.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,33 +13,27 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-AttributeMap::AttributeMap(const EGLint *attributes)
</del><ins>+void AttributeMap::insert(EGLAttrib key, EGLAttrib value)
</ins><span class="cx"> {
</span><del>-    if (attributes)
-    {
-        for (const EGLint *curAttrib = attributes; curAttrib[0] != EGL_NONE; curAttrib += 2)
-        {
-            insert(curAttrib[0], curAttrib[1]);
-        }
-    }
-}
-
-void AttributeMap::insert(EGLint key, EGLint value)
-{
</del><span class="cx">     mAttributes[key] = value;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool AttributeMap::contains(EGLint key) const
</del><ins>+bool AttributeMap::contains(EGLAttrib key) const
</ins><span class="cx"> {
</span><span class="cx">     return (mAttributes.find(key) != mAttributes.end());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-EGLint AttributeMap::get(EGLint key, EGLint defaultValue) const
</del><ins>+EGLAttrib AttributeMap::get(EGLAttrib key, EGLAttrib defaultValue) const
</ins><span class="cx"> {
</span><del>-    std::map&lt;EGLint, EGLint&gt;::const_iterator iter = mAttributes.find(key);
</del><ins>+    std::map&lt;EGLAttrib, EGLAttrib&gt;::const_iterator iter = mAttributes.find(key);
</ins><span class="cx">     return (mAttributes.find(key) != mAttributes.end()) ? iter-&gt;second : defaultValue;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool AttributeMap::isEmpty() const
+{
+    return mAttributes.empty();
+}
+
</ins><span class="cx"> AttributeMap::const_iterator AttributeMap::begin() const
</span><span class="cx"> {
</span><span class="cx">     return mAttributes.begin();
</span><span class="lines">@@ -50,4 +44,31 @@
</span><span class="cx">     return mAttributes.end();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// static
+AttributeMap AttributeMap::CreateFromIntArray(const EGLint *attributes)
+{
+    AttributeMap map;
+    if (attributes)
+    {
+        for (const EGLint *curAttrib = attributes; curAttrib[0] != EGL_NONE; curAttrib += 2)
+        {
+            map.insert(static_cast&lt;EGLAttrib&gt;(curAttrib[0]), static_cast&lt;EGLAttrib&gt;(curAttrib[1]));
+        }
+    }
+    return map;
</ins><span class="cx"> }
</span><ins>+
+// static
+AttributeMap AttributeMap::CreateFromAttribArray(const EGLAttrib *attributes)
+{
+    AttributeMap map;
+    if (attributes)
+    {
+        for (const EGLAttrib *curAttrib = attributes; curAttrib[0] != EGL_NONE; curAttrib += 2)
+        {
+            map.insert(curAttrib[0], curAttrib[1]);
+        }
+    }
+    return map;
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEAttributeMaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/AttributeMap.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/AttributeMap.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/AttributeMap.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,23 +15,26 @@
</span><span class="cx"> namespace egl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-class AttributeMap
</del><ins>+class AttributeMap final
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     AttributeMap();
</span><del>-    explicit AttributeMap(const EGLint *attributes);
</del><span class="cx"> 
</span><del>-    virtual void insert(EGLint key, EGLint value);
-    virtual bool contains(EGLint key) const;
-    virtual EGLint get(EGLint key, EGLint defaultValue) const;
</del><ins>+    void insert(EGLAttrib key, EGLAttrib value);
+    bool contains(EGLAttrib key) const;
+    EGLAttrib get(EGLAttrib key, EGLAttrib defaultValue) const;
+    bool isEmpty() const;
</ins><span class="cx"> 
</span><del>-    typedef std::map&lt;EGLint, EGLint&gt;::const_iterator const_iterator;
</del><ins>+    typedef std::map&lt;EGLAttrib, EGLAttrib&gt;::const_iterator const_iterator;
</ins><span class="cx"> 
</span><span class="cx">     const_iterator begin() const;
</span><span class="cx">     const_iterator end() const;
</span><span class="cx"> 
</span><ins>+    static AttributeMap CreateFromIntArray(const EGLint *attributes);
+    static AttributeMap CreateFromAttribArray(const EGLAttrib *attributes);
+
</ins><span class="cx">   private:
</span><del>-    std::map&lt;EGLint, EGLint&gt; mAttributes;
</del><ins>+    std::map&lt;EGLAttrib, EGLAttrib&gt; mAttributes;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEBinaryStreamh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/BinaryStream.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/BinaryStream.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/BinaryStream.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -47,7 +47,7 @@
</span><span class="cx">     template &lt;class IntT&gt;
</span><span class="cx">     IntT readInt()
</span><span class="cx">     {
</span><del>-        int value;
</del><ins>+        int value = 0;
</ins><span class="cx">         read(&amp;value);
</span><span class="cx">         return static_cast&lt;IntT&gt;(value);
</span><span class="cx">     }
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool readBool()
</span><span class="cx">     {
</span><del>-        int value;
</del><ins>+        int value = 0;
</ins><span class="cx">         read(&amp;value);
</span><span class="cx">         return (value &gt; 0);
</span><span class="cx">     }
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (mOffset + length &gt; mLength)
</del><ins>+        if (!rx::IsUnsignedAdditionSafe(mOffset, length) || mOffset + length &gt; mLength)
</ins><span class="cx">         {
</span><span class="cx">             mError = true;
</span><span class="cx">             return;
</span><span class="lines">@@ -104,7 +104,7 @@
</span><span class="cx"> 
</span><span class="cx">     void skip(size_t length)
</span><span class="cx">     {
</span><del>-        if (mOffset + length &gt; mLength)
</del><ins>+        if (!rx::IsUnsignedAdditionSafe(mOffset, length) || mOffset + length &gt; mLength)
</ins><span class="cx">         {
</span><span class="cx">             mError = true;
</span><span class="cx">             return;
</span><span class="lines">@@ -144,9 +144,15 @@
</span><span class="cx">     {
</span><span class="cx">         StaticAssertIsFundamental&lt;T&gt;();
</span><span class="cx"> 
</span><ins>+        if (!rx::IsUnsignedMultiplicationSafe(num, sizeof(T)))
+        {
+            mError = true;
+            return;
+        }
+
</ins><span class="cx">         size_t length = num * sizeof(T);
</span><span class="cx"> 
</span><del>-        if (mOffset + length &gt; mLength)
</del><ins>+        if (!rx::IsUnsignedAdditionSafe(mOffset, length) || mOffset + length &gt; mLength)
</ins><span class="cx">         {
</span><span class="cx">             mError = true;
</span><span class="cx">             return;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEBinaryStream_unittestcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/BinaryStream_unittest.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/BinaryStream_unittest.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/BinaryStream_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,71 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// BinaryStream_unittest.cpp: Unit tests of the binary stream classes.
+
+#include &lt;gtest/gtest.h&gt;
+
+#include &quot;libANGLE/BinaryStream.h&quot;
+
+namespace angle
+{
+
+// Test that errors are properly generated for overflows.
+TEST(BinaryInputStream, Overflow)
+{
+    const uint8_t goodValue = 2;
+    const uint8_t badValue = 255;
+
+    const size_t dataSize = 1024;
+    const size_t slopSize = 1024;
+
+    std::vector&lt;uint8_t&gt; data(dataSize + slopSize);
+    std::fill(data.begin(), data.begin() + dataSize, goodValue);
+    std::fill(data.begin() + dataSize, data.end(), badValue);
+
+    std::vector&lt;uint8_t&gt; outputData(dataSize);
+
+    auto checkDataIsSafe = [=](uint8_t item)
+    {
+        return item == goodValue;
+    };
+
+    {
+        // One large read
+        gl::BinaryInputStream stream(data.data(), dataSize);
+        stream.readBytes(outputData.data(), dataSize);
+        ASSERT_FALSE(stream.error());
+        ASSERT_TRUE(std::all_of(outputData.begin(), outputData.end(), checkDataIsSafe));
+        ASSERT_TRUE(stream.endOfStream());
+    }
+
+    {
+        // Two half-sized reads
+        gl::BinaryInputStream stream(data.data(), dataSize);
+        stream.readBytes(outputData.data(), dataSize / 2);
+        ASSERT_FALSE(stream.error());
+        stream.readBytes(outputData.data() + dataSize / 2, dataSize / 2);
+        ASSERT_FALSE(stream.error());
+        ASSERT_TRUE(std::all_of(outputData.begin(), outputData.end(), checkDataIsSafe));
+        ASSERT_TRUE(stream.endOfStream());
+    }
+
+    {
+        // One large read that is too big
+        gl::BinaryInputStream stream(data.data(), dataSize);
+        stream.readBytes(outputData.data(), dataSize + 1);
+        ASSERT_TRUE(stream.error());
+    }
+
+    {
+        // Two reads, one that overflows the offset
+        gl::BinaryInputStream stream(data.data(), dataSize);
+        stream.readBytes(outputData.data(), dataSize - 1);
+        ASSERT_FALSE(stream.error());
+        stream.readBytes(outputData.data(), std::numeric_limits&lt;size_t&gt;::max() - dataSize - 2);
+    }
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEBuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Buffer.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Buffer.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Buffer.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,6 +18,7 @@
</span><span class="cx"> Buffer::Buffer(rx::BufferImpl *impl, GLuint id)
</span><span class="cx">     : RefCountObject(id),
</span><span class="cx">       mBuffer(impl),
</span><ins>+      mLabel(),
</ins><span class="cx">       mUsage(GL_STATIC_DRAW),
</span><span class="cx">       mSize(0),
</span><span class="cx">       mAccessFlags(0),
</span><span class="lines">@@ -34,6 +35,16 @@
</span><span class="cx">     SafeDelete(mBuffer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Buffer::setLabel(const std::string &amp;label)
+{
+    mLabel = label;
+}
+
+const std::string &amp;Buffer::getLabel() const
+{
+    return mLabel;
+}
+
</ins><span class="cx"> Error Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
</span><span class="cx"> {
</span><span class="cx">     gl::Error error = mBuffer-&gt;setData(data, size, usage);
</span><span class="lines">@@ -93,9 +104,8 @@
</span><span class="cx">     mMapLength = mSize;
</span><span class="cx">     mAccess = access;
</span><span class="cx">     mAccessFlags = GL_MAP_WRITE_BIT;
</span><ins>+    mIndexRangeCache.clear();
</ins><span class="cx"> 
</span><del>-    mIndexRangeCache.invalidateRange(0, static_cast&lt;unsigned int&gt;(mMapLength));
-
</del><span class="cx">     return error;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -151,4 +161,36 @@
</span><span class="cx">     return error;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Buffer::onTransformFeedback()
+{
+    mIndexRangeCache.clear();
</ins><span class="cx"> }
</span><ins>+
+void Buffer::onPixelUnpack()
+{
+    mIndexRangeCache.clear();
+}
+
+Error Buffer::getIndexRange(GLenum type,
+                            size_t offset,
+                            size_t count,
+                            bool primitiveRestartEnabled,
+                            IndexRange *outRange) const
+{
+    if (mIndexRangeCache.findRange(type, offset, count, primitiveRestartEnabled, outRange))
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    Error error = mBuffer-&gt;getIndexRange(type, offset, count, primitiveRestartEnabled, outRange);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    mIndexRangeCache.addRange(type, offset, count, primitiveRestartEnabled, *outRange);
+
+    return Error(GL_NO_ERROR);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEBufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Buffer.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Buffer.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Buffer.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,12 +11,12 @@
</span><span class="cx"> #ifndef LIBANGLE_BUFFER_H_
</span><span class="cx"> #define LIBANGLE_BUFFER_H_
</span><span class="cx"> 
</span><ins>+#include &quot;common/angleutils.h&quot;
+#include &quot;libANGLE/Debug.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><ins>+#include &quot;libANGLE/IndexRangeCache.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/RefCountObject.h&quot;
</span><del>-#include &quot;libANGLE/renderer/IndexRangeCache.h&quot;
</del><span class="cx"> 
</span><del>-#include &quot;common/angleutils.h&quot;
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class BufferImpl;
</span><span class="lines">@@ -25,13 +25,15 @@
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-class Buffer : public RefCountObject
</del><ins>+class Buffer final : public RefCountObject, public LabeledObject
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     Buffer(rx::BufferImpl *impl, GLuint id);
</span><del>-
</del><span class="cx">     virtual ~Buffer();
</span><span class="cx"> 
</span><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
+
</ins><span class="cx">     Error bufferData(const void *data, GLsizeiptr size, GLenum usage);
</span><span class="cx">     Error bufferSubData(const void *data, GLsizeiptr size, GLintptr offset);
</span><span class="cx">     Error copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size);
</span><span class="lines">@@ -39,6 +41,15 @@
</span><span class="cx">     Error mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access);
</span><span class="cx">     Error unmap(GLboolean *result);
</span><span class="cx"> 
</span><ins>+    void onTransformFeedback();
+    void onPixelUnpack();
+
+    Error getIndexRange(GLenum type,
+                        size_t offset,
+                        size_t count,
+                        bool primitiveRestartEnabled,
+                        IndexRange *outRange) const;
+
</ins><span class="cx">     GLenum getUsage() const { return mUsage; }
</span><span class="cx">     GLbitfield getAccessFlags() const { return mAccessFlags; }
</span><span class="cx">     GLenum getAccess() const { return mAccess; }
</span><span class="lines">@@ -50,12 +61,11 @@
</span><span class="cx"> 
</span><span class="cx">     rx::BufferImpl *getImplementation() const { return mBuffer; }
</span><span class="cx"> 
</span><del>-    rx::IndexRangeCache *getIndexRangeCache() { return &amp;mIndexRangeCache; }
-    const rx::IndexRangeCache *getIndexRangeCache() const { return &amp;mIndexRangeCache; }
-
</del><span class="cx">   private:
</span><span class="cx">     rx::BufferImpl *mBuffer;
</span><span class="cx"> 
</span><ins>+    std::string mLabel;
+
</ins><span class="cx">     GLenum mUsage;
</span><span class="cx">     GLint64 mSize;
</span><span class="cx">     GLbitfield mAccessFlags;
</span><span class="lines">@@ -65,7 +75,7 @@
</span><span class="cx">     GLint64 mMapOffset;
</span><span class="cx">     GLint64 mMapLength;
</span><span class="cx"> 
</span><del>-    rx::IndexRangeCache mIndexRangeCache;
</del><ins>+    mutable IndexRangeCache mIndexRangeCache;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLECapscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Caps.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Caps.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Caps.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx"> 
</span><span class="cx"> void TextureCapsMap::insert(GLenum internalFormat, const TextureCaps &amp;caps)
</span><span class="cx"> {
</span><del>-    mCapsMap.insert(std::make_pair(internalFormat, caps));
</del><ins>+    mCapsMap[internalFormat] = caps;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TextureCapsMap::remove(GLenum internalFormat)
</span><span class="lines">@@ -102,6 +102,7 @@
</span><span class="cx">       pixelBufferObject(false),
</span><span class="cx">       mapBuffer(false),
</span><span class="cx">       mapBufferRange(false),
</span><ins>+      colorBufferHalfFloat(false),
</ins><span class="cx">       textureHalfFloat(false),
</span><span class="cx">       textureHalfFloatLinear(false),
</span><span class="cx">       textureFloat(false),
</span><span class="lines">@@ -110,15 +111,22 @@
</span><span class="cx">       textureCompressionDXT1(false),
</span><span class="cx">       textureCompressionDXT3(false),
</span><span class="cx">       textureCompressionDXT5(false),
</span><ins>+      textureCompressionASTCHDR(false),
+      textureCompressionASTCLDR(false),
+      compressedETC1RGB8Texture(false),
</ins><span class="cx">       depthTextures(false),
</span><ins>+      depth32(false),
+      textureStorage(false),
</ins><span class="cx">       textureNPOT(false),
</span><span class="cx">       drawBuffers(false),
</span><del>-      textureStorage(false),
</del><span class="cx">       textureFilterAnisotropic(false),
</span><span class="cx">       maxTextureAnisotropy(false),
</span><span class="cx">       occlusionQueryBoolean(false),
</span><span class="cx">       fence(false),
</span><span class="cx">       timerQuery(false),
</span><ins>+      disjointTimerQuery(false),
+      queryCounterBitsTimeElapsed(0),
+      queryCounterBitsTimestamp(0),
</ins><span class="cx">       robustness(false),
</span><span class="cx">       blendMinMax(false),
</span><span class="cx">       framebufferBlit(false),
</span><span class="lines">@@ -134,6 +142,22 @@
</span><span class="cx">       textureUsage(false),
</span><span class="cx">       translatedShaderSource(false),
</span><span class="cx">       fboRenderMipmap(false),
</span><ins>+      discardFramebuffer(false),
+      debugMarker(false),
+      eglImage(false),
+      eglImageExternal(false),
+      eglImageExternalEssl3(false),
+      eglStreamConsumerExternal(false),
+      unpackSubimage(false),
+      packSubimage(false),
+      vertexArrayObject(false),
+      debug(false),
+      maxDebugMessageLength(0),
+      maxDebugLoggedMessages(0),
+      maxDebugGroupStackDepth(0),
+      maxLabelLength(0),
+      noError(false),
+      lossyETCDecode(false),
</ins><span class="cx">       colorBufferFloat(false)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -142,53 +166,85 @@
</span><span class="cx"> {
</span><span class="cx">     std::vector&lt;std::string&gt; extensionStrings;
</span><span class="cx"> 
</span><del>-    //                   | Extension name                     | Supported flag          | Output vector   |
-    InsertExtensionString(&quot;GL_OES_element_index_uint&quot;,         elementIndexUint,         &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_packed_depth_stencil&quot;,       packedDepthStencil,       &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_get_program_binary&quot;,         getProgramBinary,         &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_rgb8_rgba8&quot;,                 rgb8rgba8,                &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_texture_format_BGRA8888&quot;,    textureFormatBGRA8888,    &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_read_format_bgra&quot;,           readFormatBGRA,           &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_NV_pixel_buffer_object&quot;,         pixelBufferObject,        &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_mapbuffer&quot;,                  mapBuffer,                &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_map_buffer_range&quot;,           mapBufferRange,           &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_texture_half_float&quot;,         textureHalfFloat,         &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_texture_half_float_linear&quot;,  textureHalfFloatLinear,   &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_texture_float&quot;,              textureFloat,             &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_texture_float_linear&quot;,       textureFloatLinear,       &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_texture_rg&quot;,                 textureRG,                &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_texture_compression_dxt1&quot;,   textureCompressionDXT1,   &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ANGLE_texture_compression_dxt3&quot;, textureCompressionDXT3,   &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ANGLE_texture_compression_dxt5&quot;, textureCompressionDXT5,   &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_sRGB&quot;,                       sRGB,                     &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ANGLE_depth_texture&quot;,            depthTextures,            &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_texture_storage&quot;,            textureStorage,           &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_texture_npot&quot;,               textureNPOT,              &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_draw_buffers&quot;,               drawBuffers,              &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_texture_filter_anisotropic&quot;, textureFilterAnisotropic, &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_occlusion_query_boolean&quot;,    occlusionQueryBoolean,    &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_NV_fence&quot;,                       fence,                    &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ANGLE_timer_query&quot;,              timerQuery,               &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_robustness&quot;,                 robustness,               &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_blend_minmax&quot;,               blendMinMax,              &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ANGLE_framebuffer_blit&quot;,         framebufferBlit,          &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ANGLE_framebuffer_multisample&quot;,  framebufferMultisample,   &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ANGLE_instanced_arrays&quot;,         instancedArrays,          &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ANGLE_pack_reverse_row_order&quot;,   packReverseRowOrder,      &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_standard_derivatives&quot;,       standardDerivatives,      &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_shader_texture_lod&quot;,         shaderTextureLOD,         &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_NV_shader_framebuffer_fetch&quot;,    NVshaderFramebufferFetch, &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ARM_shader_framebuffer_fetch&quot;,   ARMshaderFramebufferFetch,&amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_shader_framebuffer_fetch&quot;,   shaderFramebufferFetch,   &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_frag_depth&quot;,                 fragDepth,                &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ANGLE_texture_usage&quot;,            textureUsage,             &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_ANGLE_translated_shader_source&quot;, translatedShaderSource,   &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_OES_fbo_render_mipmap&quot;,          fboRenderMipmap,          &amp;extensionStrings);
-    InsertExtensionString(&quot;GL_EXT_color_buffer_float&quot;,         colorBufferFloat,         &amp;extensionStrings);
</del><ins>+    // clang-format off
+    //                   | Extension name                       | Supported flag           | Output vector   |
+    InsertExtensionString(&quot;GL_OES_element_index_uint&quot;,           elementIndexUint,          &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_packed_depth_stencil&quot;,         packedDepthStencil,        &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_get_program_binary&quot;,           getProgramBinary,          &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_rgb8_rgba8&quot;,                   rgb8rgba8,                 &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_texture_format_BGRA8888&quot;,      textureFormatBGRA8888,     &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_read_format_bgra&quot;,             readFormatBGRA,            &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_NV_pixel_buffer_object&quot;,           pixelBufferObject,         &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_mapbuffer&quot;,                    mapBuffer,                 &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_map_buffer_range&quot;,             mapBufferRange,            &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_color_buffer_half_float&quot;,      colorBufferHalfFloat,      &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_texture_half_float&quot;,           textureHalfFloat,          &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_texture_half_float_linear&quot;,    textureHalfFloatLinear,    &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_texture_float&quot;,                textureFloat,              &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_texture_float_linear&quot;,         textureFloatLinear,        &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_texture_rg&quot;,                   textureRG,                 &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_texture_compression_dxt1&quot;,     textureCompressionDXT1,    &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ANGLE_texture_compression_dxt3&quot;,   textureCompressionDXT3,    &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ANGLE_texture_compression_dxt5&quot;,   textureCompressionDXT5,    &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_KHR_texture_compression_astc_hdr&quot;, textureCompressionASTCHDR, &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_KHR_texture_compression_astc_ldr&quot;, textureCompressionASTCLDR, &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_compressed_ETC1_RGB8_texture&quot;, compressedETC1RGB8Texture, &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_sRGB&quot;,                         sRGB,                      &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ANGLE_depth_texture&quot;,              depthTextures,             &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_depth32&quot;,                      depth32,                   &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_texture_storage&quot;,              textureStorage,            &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_texture_npot&quot;,                 textureNPOT,               &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_draw_buffers&quot;,                 drawBuffers,               &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_texture_filter_anisotropic&quot;,   textureFilterAnisotropic,  &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_occlusion_query_boolean&quot;,      occlusionQueryBoolean,     &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_NV_fence&quot;,                         fence,                     &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ANGLE_timer_query&quot;,                timerQuery,                &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_disjoint_timer_query&quot;,         disjointTimerQuery,        &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_robustness&quot;,                   robustness,                &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_blend_minmax&quot;,                 blendMinMax,               &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ANGLE_framebuffer_blit&quot;,           framebufferBlit,           &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ANGLE_framebuffer_multisample&quot;,    framebufferMultisample,    &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ANGLE_instanced_arrays&quot;,           instancedArrays,           &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ANGLE_pack_reverse_row_order&quot;,     packReverseRowOrder,       &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_standard_derivatives&quot;,         standardDerivatives,       &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_shader_texture_lod&quot;,           shaderTextureLOD,          &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_NV_shader_framebuffer_fetch&quot;,      NVshaderFramebufferFetch,  &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ARM_shader_framebuffer_fetch&quot;,     ARMshaderFramebufferFetch, &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_shader_framebuffer_fetch&quot;,     shaderFramebufferFetch,    &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_frag_depth&quot;,                   fragDepth,                 &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ANGLE_texture_usage&quot;,              textureUsage,              &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_ANGLE_translated_shader_source&quot;,   translatedShaderSource,    &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_fbo_render_mipmap&quot;,            fboRenderMipmap,           &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_discard_framebuffer&quot;,          discardFramebuffer,        &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_debug_marker&quot;,                 debugMarker,               &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_EGL_image&quot;,                    eglImage,                  &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_EGL_image_external&quot;,           eglImageExternal,          &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_EGL_image_external_essl3&quot;,     eglImageExternalEssl3,     &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_NV_EGL_stream_consumer_external&quot;,  eglStreamConsumerExternal, &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_unpack_subimage&quot;,              unpackSubimage,            &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_NV_pack_subimage&quot;,                 packSubimage,              &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_EXT_color_buffer_float&quot;,           colorBufferFloat,          &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_OES_vertex_array_object&quot;,          vertexArrayObject,         &amp;extensionStrings);
+    InsertExtensionString(&quot;GL_KHR_debug&quot;,                        debug,                     &amp;extensionStrings);
+    // TODO(jmadill): Enable this when complete.
+    //InsertExtensionString(&quot;GL_KHR_no_error&quot;,                     noError,                   &amp;extensionStrings);
</ins><span class="cx"> 
</span><ins>+    InsertExtensionString(&quot;GL_ANGLE_lossy_etc_decode&quot;,           lossyETCDecode,            &amp;extensionStrings);
+    // clang-format on
+
</ins><span class="cx">     return extensionStrings;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Limitations::Limitations()
+    : noFrontFacingSupport(false),
+      noSampleAlphaToCoverageSupport(false),
+      attributeZeroRequiresZeroDivisorInEXT(false),
+      noSeparateStencilRefsAndMasks(false),
+      shadersRequireIndexedLoopValidation(false),
+      noSimultaneousConstantColorAndAlphaBlendFunc(false)
+{
+}
+
</ins><span class="cx"> static bool GetFormatSupport(const TextureCapsMap &amp;textureCaps, const std::vector&lt;GLenum&gt; &amp;requiredFormats,
</span><span class="cx">                              bool requiresTexturing, bool requiresFiltering, bool requiresRendering)
</span><span class="cx"> {
</span><span class="lines">@@ -215,6 +271,15 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// Check for GL_OES_packed_depth_stencil
+static bool DeterminePackedDepthStencilSupport(const TextureCapsMap &amp;textureCaps)
+{
+    std::vector&lt;GLenum&gt; requiredFormats;
+    requiredFormats.push_back(GL_DEPTH24_STENCIL8);
+
+    return GetFormatSupport(textureCaps, requiredFormats, false, false, true);
+}
+
</ins><span class="cx"> // Checks for GL_OES_rgb8_rgba8 support
</span><span class="cx"> static bool DetermineRGB8AndRGBA8TextureSupport(const TextureCapsMap &amp;textureCaps)
</span><span class="cx"> {
</span><span class="lines">@@ -234,6 +299,18 @@
</span><span class="cx">     return GetFormatSupport(textureCaps, requiredFormats, true, true, true);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// Checks for GL_OES_color_buffer_half_float support
+static bool DetermineColorBufferHalfFloatSupport(const TextureCapsMap &amp;textureCaps)
+{
+    std::vector&lt;GLenum&gt; requiredFormats;
+    requiredFormats.push_back(GL_RGBA16F);
+    requiredFormats.push_back(GL_RGB16F);
+    requiredFormats.push_back(GL_RG16F);
+    requiredFormats.push_back(GL_R16F);
+
+    return GetFormatSupport(textureCaps, requiredFormats, true, false, true);
+}
+
</ins><span class="cx"> // Checks for GL_OES_texture_half_float support
</span><span class="cx"> static bool DetermineHalfFloatTextureSupport(const TextureCapsMap &amp;textureCaps)
</span><span class="cx"> {
</span><span class="lines">@@ -251,7 +328,8 @@
</span><span class="cx">     requiredFormats.push_back(GL_RGB16F);
</span><span class="cx">     requiredFormats.push_back(GL_RGBA16F);
</span><span class="cx"> 
</span><del>-    return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
</del><ins>+    return DetermineHalfFloatTextureSupport(textureCaps) &amp;&amp;
+           GetFormatSupport(textureCaps, requiredFormats, true, true, false);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Checks for GL_OES_texture_float support
</span><span class="lines">@@ -271,7 +349,8 @@
</span><span class="cx">     requiredFormats.push_back(GL_RGB32F);
</span><span class="cx">     requiredFormats.push_back(GL_RGBA32F);
</span><span class="cx"> 
</span><del>-    return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
</del><ins>+    return DetermineFloatTextureSupport(textureCaps) &amp;&amp;
+           GetFormatSupport(textureCaps, requiredFormats, true, true, false);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Checks for GL_EXT_texture_rg support
</span><span class="lines">@@ -322,6 +401,51 @@
</span><span class="cx">     return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// Check for GL_KHR_texture_compression_astc_hdr and GL_KHR_texture_compression_astc_ldr
+static bool DetermineASTCTextureSupport(const TextureCapsMap &amp;textureCaps)
+{
+    std::vector&lt;GLenum&gt; requiredFormats;
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_4x4_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_5x4_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_5x5_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_6x5_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_6x6_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_8x5_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_8x6_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_8x8_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_10x5_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_10x6_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_10x8_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_10x10_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_12x10_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_RGBA_ASTC_12x12_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR);
+    requiredFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR);
+
+    return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
+}
+
+// Check for GL_ETC1_RGB8_OES
+static bool DetermineETC1RGB8TextureSupport(const TextureCapsMap &amp;textureCaps)
+{
+    std::vector&lt;GLenum&gt; requiredFormats;
+    requiredFormats.push_back(GL_ETC1_RGB8_OES);
+
+    return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
+}
+
</ins><span class="cx"> // Check for GL_ANGLE_texture_compression_dxt5
</span><span class="cx"> static bool DetermineSRGBTextureSupport(const TextureCapsMap &amp;textureCaps)
</span><span class="cx"> {
</span><span class="lines">@@ -347,6 +471,15 @@
</span><span class="cx">     return GetFormatSupport(textureCaps, requiredFormats, true, true, true);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// Check for GL_OES_depth32
+static bool DetermineDepth32Support(const TextureCapsMap &amp;textureCaps)
+{
+    std::vector&lt;GLenum&gt; requiredFormats;
+    requiredFormats.push_back(GL_DEPTH_COMPONENT32_OES);
+
+    return GetFormatSupport(textureCaps, requiredFormats, false, false, true);
+}
+
</ins><span class="cx"> // Check for GL_EXT_color_buffer_float
</span><span class="cx"> static bool DetermineColorBufferFloatSupport(const TextureCapsMap &amp;textureCaps)
</span><span class="cx"> {
</span><span class="lines">@@ -364,8 +497,10 @@
</span><span class="cx"> 
</span><span class="cx"> void Extensions::setTextureExtensionSupport(const TextureCapsMap &amp;textureCaps)
</span><span class="cx"> {
</span><ins>+    packedDepthStencil = DeterminePackedDepthStencilSupport(textureCaps);
</ins><span class="cx">     rgb8rgba8 = DetermineRGB8AndRGBA8TextureSupport(textureCaps);
</span><span class="cx">     textureFormatBGRA8888 = DetermineBGRA8TextureSupport(textureCaps);
</span><ins>+    colorBufferHalfFloat      = DetermineColorBufferHalfFloatSupport(textureCaps);
</ins><span class="cx">     textureHalfFloat = DetermineHalfFloatTextureSupport(textureCaps);
</span><span class="cx">     textureHalfFloatLinear = DetermineHalfFloatTextureFilteringSupport(textureCaps);
</span><span class="cx">     textureFloat = DetermineFloatTextureSupport(textureCaps);
</span><span class="lines">@@ -374,8 +509,12 @@
</span><span class="cx">     textureCompressionDXT1 = DetermineDXT1TextureSupport(textureCaps);
</span><span class="cx">     textureCompressionDXT3 = DetermineDXT3TextureSupport(textureCaps);
</span><span class="cx">     textureCompressionDXT5 = DetermineDXT5TextureSupport(textureCaps);
</span><ins>+    textureCompressionASTCHDR = DetermineASTCTextureSupport(textureCaps);
+    textureCompressionASTCLDR = textureCompressionASTCHDR;
+    compressedETC1RGB8Texture = DetermineETC1RGB8TextureSupport(textureCaps);
</ins><span class="cx">     sRGB = DetermineSRGBTextureSupport(textureCaps);
</span><span class="cx">     depthTextures = DetermineDepthTextureSupport(textureCaps);
</span><ins>+    depth32                   = DetermineDepth32Support(textureCaps);
</ins><span class="cx">     colorBufferFloat = DetermineColorBufferFloatSupport(textureCaps);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -483,9 +622,26 @@
</span><span class="cx">       surfaceD3DTexture2DShareHandle(false),
</span><span class="cx">       querySurfacePointer(false),
</span><span class="cx">       windowFixedSize(false),
</span><ins>+      keyedMutex(false),
+      surfaceOrientation(false),
</ins><span class="cx">       postSubBuffer(false),
</span><span class="cx">       createContext(false),
</span><del>-      deviceQuery(false)
</del><ins>+      deviceQuery(false),
+      image(false),
+      imageBase(false),
+      imagePixmap(false),
+      glTexture2DImage(false),
+      glTextureCubemapImage(false),
+      glTexture3DImage(false),
+      glRenderbufferImage(false),
+      getAllProcAddresses(false),
+      flexibleSurfaceCompatibility(false),
+      directComposition(false),
+      createContextNoError(false),
+      stream(false),
+      streamConsumerGLTexture(false),
+      streamConsumerGLTextureYUV(false),
+      streamProducerD3DTextureNV12(false)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -493,15 +649,34 @@
</span><span class="cx"> {
</span><span class="cx">     std::vector&lt;std::string&gt; extensionStrings;
</span><span class="cx"> 
</span><ins>+    // clang-format off
</ins><span class="cx">     //                   | Extension name                                 | Supported flag                | Output vector   |
</span><span class="cx">     InsertExtensionString(&quot;EGL_EXT_create_context_robustness&quot;,             createContextRobustness,        &amp;extensionStrings);
</span><span class="cx">     InsertExtensionString(&quot;EGL_ANGLE_d3d_share_handle_client_buffer&quot;,      d3dShareHandleClientBuffer,     &amp;extensionStrings);
</span><span class="cx">     InsertExtensionString(&quot;EGL_ANGLE_surface_d3d_texture_2d_share_handle&quot;, surfaceD3DTexture2DShareHandle, &amp;extensionStrings);
</span><span class="cx">     InsertExtensionString(&quot;EGL_ANGLE_query_surface_pointer&quot;,               querySurfacePointer,            &amp;extensionStrings);
</span><span class="cx">     InsertExtensionString(&quot;EGL_ANGLE_window_fixed_size&quot;,                   windowFixedSize,                &amp;extensionStrings);
</span><ins>+    InsertExtensionString(&quot;EGL_ANGLE_keyed_mutex&quot;,                         keyedMutex,                     &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_ANGLE_surface_orientation&quot;,                 surfaceOrientation,             &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_ANGLE_direct_composition&quot;,                  directComposition,              &amp;extensionStrings);
</ins><span class="cx">     InsertExtensionString(&quot;EGL_NV_post_sub_buffer&quot;,                        postSubBuffer,                  &amp;extensionStrings);
</span><span class="cx">     InsertExtensionString(&quot;EGL_KHR_create_context&quot;,                        createContext,                  &amp;extensionStrings);
</span><span class="cx">     InsertExtensionString(&quot;EGL_EXT_device_query&quot;,                          deviceQuery,                    &amp;extensionStrings);
</span><ins>+    InsertExtensionString(&quot;EGL_KHR_image&quot;,                                 image,                          &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_KHR_image_base&quot;,                            imageBase,                      &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_KHR_image_pixmap&quot;,                          imagePixmap,                    &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_KHR_gl_texture_2D_image&quot;,                   glTexture2DImage,               &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_KHR_gl_texture_cubemap_image&quot;,              glTextureCubemapImage,          &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_KHR_gl_texture_3D_image&quot;,                   glTexture3DImage,               &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_KHR_gl_renderbuffer_image&quot;,                 glRenderbufferImage,            &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_KHR_get_all_proc_addresses&quot;,                getAllProcAddresses,            &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_KHR_stream&quot;,                                stream,                         &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_KHR_stream_consumer_gltexture&quot;,             streamConsumerGLTexture,        &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_NV_stream_consumer_gltexture_yuv&quot;,          streamConsumerGLTextureYUV,     &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_ANGLE_flexible_surface_compatibility&quot;,      flexibleSurfaceCompatibility,   &amp;extensionStrings);
+    // TODO(jmadill): Enable this when complete.
+    //InsertExtensionString(&quot;KHR_create_context_no_error&quot;,                   createContextNoError,           &amp;extensionStrings);
+    // clang-format on
</ins><span class="cx"> 
</span><span class="cx">     return extensionStrings;
</span><span class="cx"> }
</span><span class="lines">@@ -524,9 +699,15 @@
</span><span class="cx"> ClientExtensions::ClientExtensions()
</span><span class="cx">     : clientExtensions(false),
</span><span class="cx">       platformBase(false),
</span><ins>+      platformDevice(false),
</ins><span class="cx">       platformANGLE(false),
</span><span class="cx">       platformANGLED3D(false),
</span><del>-      platformANGLEOpenGL(false)
</del><ins>+      platformANGLEOpenGL(false),
+      deviceCreation(false),
+      deviceCreationD3D11(false),
+      x11Visual(false),
+      experimentalPresentPath(false),
+      clientGetAllProcAddresses(false)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -534,12 +715,20 @@
</span><span class="cx"> {
</span><span class="cx">     std::vector&lt;std::string&gt; extensionStrings;
</span><span class="cx"> 
</span><del>-    //                   | Extension name                   | Supported flag     | Output vector   |
-    InsertExtensionString(&quot;EGL_EXT_client_extensions&quot;,       clientExtensions,    &amp;extensionStrings);
-    InsertExtensionString(&quot;EGL_EXT_platform_base&quot;,           platformBase,        &amp;extensionStrings);
-    InsertExtensionString(&quot;EGL_ANGLE_platform_angle&quot;,        platformANGLE,       &amp;extensionStrings);
-    InsertExtensionString(&quot;EGL_ANGLE_platform_angle_d3d&quot;,    platformANGLED3D,    &amp;extensionStrings);
-    InsertExtensionString(&quot;EGL_ANGLE_platform_angle_opengl&quot;, platformANGLEOpenGL, &amp;extensionStrings);
</del><ins>+    // clang-format off
+    //                   | Extension name                         | Supported flag           | Output vector   |
+    InsertExtensionString(&quot;EGL_EXT_client_extensions&quot;,             clientExtensions,          &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_EXT_platform_base&quot;,                 platformBase,              &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_EXT_platform_device&quot;,               platformDevice,            &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_ANGLE_platform_angle&quot;,              platformANGLE,             &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_ANGLE_platform_angle_d3d&quot;,          platformANGLED3D,          &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_ANGLE_platform_angle_opengl&quot;,       platformANGLEOpenGL,       &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_ANGLE_device_creation&quot;,             deviceCreation,            &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_ANGLE_device_creation_d3d11&quot;,       deviceCreationD3D11,       &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_ANGLE_x11_visual&quot;,                  x11Visual,                 &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_ANGLE_experimental_present_path&quot;,   experimentalPresentPath,   &amp;extensionStrings);
+    InsertExtensionString(&quot;EGL_KHR_client_get_all_proc_addresses&quot;, clientGetAllProcAddresses, &amp;extensionStrings);
+    // clang-format on
</ins><span class="cx"> 
</span><span class="cx">     return extensionStrings;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLECapsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Caps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Caps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Caps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -73,14 +73,19 @@
</span><span class="cx"> 
</span><span class="cx">     // Set all texture related extension support based on the supported textures.
</span><span class="cx">     // Determines support for:
</span><ins>+    // GL_OES_packed_depth_stencil
</ins><span class="cx">     // GL_OES_rgb8_rgba8
</span><span class="cx">     // GL_EXT_texture_format_BGRA8888
</span><ins>+    // GL_EXT_color_buffer_half_float,
</ins><span class="cx">     // GL_OES_texture_half_float, GL_OES_texture_half_float_linear
</span><span class="cx">     // GL_OES_texture_float, GL_OES_texture_float_linear
</span><span class="cx">     // GL_EXT_texture_rg
</span><del>-    // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5
</del><ins>+    // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3,
+    // GL_ANGLE_texture_compression_dxt5
+    // GL_KHR_texture_compression_astc_hdr, GL_KHR_texture_compression_astc_ldr
+    // GL_OES_compressed_ETC1_RGB8_texture
</ins><span class="cx">     // GL_EXT_sRGB
</span><del>-    // GL_ANGLE_depth_texture
</del><ins>+    // GL_ANGLE_depth_texture, GL_OES_depth32
</ins><span class="cx">     // GL_EXT_color_buffer_float
</span><span class="cx">     void setTextureExtensionSupport(const TextureCapsMap &amp;textureCaps);
</span><span class="cx"> 
</span><span class="lines">@@ -113,6 +118,11 @@
</span><span class="cx">     bool mapBuffer;
</span><span class="cx">     bool mapBufferRange;
</span><span class="cx"> 
</span><ins>+    // GL_EXT_color_buffer_half_float
+    // Together with GL_OES_texture_half_float in a GLES 2.0 context, implies that half-float
+    // textures are renderable.
+    bool colorBufferHalfFloat;
+
</ins><span class="cx">     // GL_OES_texture_half_float and GL_OES_texture_half_float_linear
</span><span class="cx">     // Implies that TextureCaps for GL_RGB16F, GL_RGBA16F, GL_ALPHA32F_EXT, GL_LUMINANCE32F_EXT and
</span><span class="cx">     // GL_LUMINANCE_ALPHA32F_EXT exist
</span><span class="lines">@@ -137,6 +147,16 @@
</span><span class="cx">     bool textureCompressionDXT3;
</span><span class="cx">     bool textureCompressionDXT5;
</span><span class="cx"> 
</span><ins>+    // GL_KHR_texture_compression_astc_hdr
+    bool textureCompressionASTCHDR;
+
+    // GL_KHR_texture_compression_astc_ldr
+    bool textureCompressionASTCLDR;
+
+    // GL_OES_compressed_ETC1_RGB8_texture
+    // Implies that TextureCaps for GL_ETC1_RGB8_OES exist
+    bool compressedETC1RGB8Texture;
+
</ins><span class="cx">     // GL_EXT_sRGB
</span><span class="cx">     // Implies that TextureCaps for GL_SRGB8_ALPHA8 and GL_SRGB8 exist
</span><span class="cx">     // TODO: Don't advertise this extension in ES3
</span><span class="lines">@@ -145,6 +165,10 @@
</span><span class="cx">     // GL_ANGLE_depth_texture
</span><span class="cx">     bool depthTextures;
</span><span class="cx"> 
</span><ins>+    // GL_OES_depth32
+    // Allows DEPTH_COMPONENT32_OES as a valid Renderbuffer format.
+    bool depth32;
+
</ins><span class="cx">     // GL_EXT_texture_storage
</span><span class="cx">     bool textureStorage;
</span><span class="cx"> 
</span><span class="lines">@@ -167,6 +191,11 @@
</span><span class="cx">     // GL_ANGLE_timer_query
</span><span class="cx">     bool timerQuery;
</span><span class="cx"> 
</span><ins>+    // GL_EXT_disjoint_timer_query
+    bool disjointTimerQuery;
+    GLuint queryCounterBitsTimeElapsed;
+    GLuint queryCounterBitsTimestamp;
+
</ins><span class="cx">     // GL_EXT_robustness
</span><span class="cx">     bool robustness;
</span><span class="cx"> 
</span><span class="lines">@@ -212,12 +241,76 @@
</span><span class="cx">     // GL_OES_fbo_render_mipmap
</span><span class="cx">     bool fboRenderMipmap;
</span><span class="cx"> 
</span><ins>+    // GL_EXT_discard_framebuffer
+    bool discardFramebuffer;
+
+    // EXT_debug_marker
+    bool debugMarker;
+
+    // GL_OES_EGL_image
+    bool eglImage;
+
+    // GL_OES_EGL_image_external
+    bool eglImageExternal;
+
+    // GL_OES_EGL_image_external_essl3
+    bool eglImageExternalEssl3;
+
+    // NV_EGL_stream_consumer_external
+    bool eglStreamConsumerExternal;
+
+    // EXT_unpack_subimage
+    bool unpackSubimage;
+
+    // NV_pack_subimage
+    bool packSubimage;
+
+    // GL_OES_vertex_array_object
+    bool vertexArrayObject;
+
+    // GL_KHR_debug
+    bool debug;
+    GLuint maxDebugMessageLength;
+    GLuint maxDebugLoggedMessages;
+    GLuint maxDebugGroupStackDepth;
+    GLuint maxLabelLength;
+
+    // KHR_no_error
+    bool noError;
+
+    // GL_ANGLE_lossy_etc_decode
+    bool lossyETCDecode;
+
</ins><span class="cx">     // ES3 Extension support
</span><span class="cx"> 
</span><span class="cx">     // GL_EXT_color_buffer_float
</span><span class="cx">     bool colorBufferFloat;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+struct Limitations
+{
+    Limitations();
+
+    // Renderer doesn't support gl_FrontFacing in fragment shaders
+    bool noFrontFacingSupport;
+
+    // Renderer doesn't support GL_SAMPLE_ALPHA_TO_COVERAGE
+    bool noSampleAlphaToCoverageSupport;
+
+    // In glVertexAttribDivisorANGLE, attribute zero must have a zero divisor
+    bool attributeZeroRequiresZeroDivisorInEXT;
+
+    // Unable to support different values for front and back faces for stencil refs and masks
+    bool noSeparateStencilRefsAndMasks;
+
+    // Renderer doesn't support non-constant indexing loops in fragment shader
+    bool shadersRequireIndexedLoopValidation;
+
+    // Renderer doesn't support Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA
+    // and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR blend functions.
+    bool noSimultaneousConstantColorAndAlphaBlendFunc;
+};
+
</ins><span class="cx"> struct TypePrecision
</span><span class="cx"> {
</span><span class="cx">     TypePrecision();
</span><span class="lines">@@ -345,6 +438,12 @@
</span><span class="cx">     // EGL_ANGLE_window_fixed_size
</span><span class="cx">     bool windowFixedSize;
</span><span class="cx"> 
</span><ins>+    // EGL_ANGLE_keyed_mutex
+    bool keyedMutex;
+
+    // EGL_ANGLE_surface_orientation
+    bool surfaceOrientation;
+
</ins><span class="cx">     // EGL_NV_post_sub_buffer
</span><span class="cx">     bool postSubBuffer;
</span><span class="cx"> 
</span><span class="lines">@@ -353,6 +452,51 @@
</span><span class="cx"> 
</span><span class="cx">     // EGL_EXT_device_query
</span><span class="cx">     bool deviceQuery;
</span><ins>+
+    // EGL_KHR_image
+    bool image;
+
+    // EGL_KHR_image_base
+    bool imageBase;
+
+    // EGL_KHR_image_pixmap
+    bool imagePixmap;
+
+    // EGL_KHR_gl_texture_2D_image
+    bool glTexture2DImage;
+
+    // EGL_KHR_gl_texture_cubemap_image
+    bool glTextureCubemapImage;
+
+    // EGL_KHR_gl_texture_3D_image
+    bool glTexture3DImage;
+
+    // EGL_KHR_gl_renderbuffer_image
+    bool glRenderbufferImage;
+
+    // EGL_KHR_get_all_proc_addresses
+    bool getAllProcAddresses;
+
+    // EGL_ANGLE_flexible_surface_compatibility
+    bool flexibleSurfaceCompatibility;
+
+    // EGL_ANGLE_direct_composition
+    bool directComposition;
+
+    // KHR_create_context_no_error
+    bool createContextNoError;
+
+    // EGL_KHR_stream
+    bool stream;
+
+    // EGL_KHR_stream_consumer_gltexture
+    bool streamConsumerGLTexture;
+
+    // EGL_NV_stream_consumer_gltexture_yuv
+    bool streamConsumerGLTextureYUV;
+
+    // EGL_ANGLE_stream_producer_d3d_texture_nv12
+    bool streamProducerD3DTextureNV12;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct DeviceExtensions
</span><span class="lines">@@ -379,6 +523,9 @@
</span><span class="cx">     // EGL_EXT_platform_base
</span><span class="cx">     bool platformBase;
</span><span class="cx"> 
</span><ins>+    // EGL_EXT_platform_device
+    bool platformDevice;
+
</ins><span class="cx">     // EGL_ANGLE_platform_angle
</span><span class="cx">     bool platformANGLE;
</span><span class="cx"> 
</span><span class="lines">@@ -387,6 +534,21 @@
</span><span class="cx"> 
</span><span class="cx">     // EGL_ANGLE_platform_angle_opengl
</span><span class="cx">     bool platformANGLEOpenGL;
</span><ins>+
+    // EGL_ANGLE_device_creation
+    bool deviceCreation;
+
+    // EGL_ANGLE_device_creation_d3d11
+    bool deviceCreationD3D11;
+
+    // EGL_ANGLE_x11_visual
+    bool x11Visual;
+
+    // EGL_ANGLE_experimental_present_path
+    bool experimentalPresentPath;
+
+    // EGL_KHR_client_get_all_proc_addresses
+    bool clientGetAllProcAddresses;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLECompilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,32 +7,128 @@
</span><span class="cx"> // Compiler.cpp: implements the gl::Compiler class.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Compiler.h&quot;
</span><del>-#include &quot;libANGLE/renderer/CompilerImpl.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><ins>+#include &quot;libANGLE/Data.h&quot;
+#include &quot;libANGLE/renderer/CompilerImpl.h&quot;
+#include &quot;libANGLE/renderer/ImplFactory.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-Compiler::Compiler(rx::CompilerImpl *impl)
-    : mCompiler(impl)
</del><ins>+namespace
</ins><span class="cx"> {
</span><del>-    ASSERT(mCompiler);
</del><ins>+
+// Global count of active shader compiler handles. Needed to know when to call ShInitialize and
+// ShFinalize.
+size_t activeCompilerHandles = 0;
+
+}  // anonymous namespace
+
+Compiler::Compiler(rx::ImplFactory *implFactory, const gl::Data &amp;data)
+    : mImplementation(implFactory-&gt;createCompiler()),
+      mSpec(data.clientVersion &gt; 2 ? SH_GLES3_SPEC : SH_GLES2_SPEC),
+      mOutputType(mImplementation-&gt;getTranslatorOutputType()),
+      mResources(),
+      mFragmentCompiler(nullptr),
+      mVertexCompiler(nullptr)
+{
+    ASSERT(data.clientVersion == 2 || data.clientVersion == 3);
+
+    const gl::Caps &amp;caps             = *data.caps;
+    const gl::Extensions &amp;extensions = *data.extensions;
+
+    ShInitBuiltInResources(&amp;mResources);
+    mResources.MaxVertexAttribs             = caps.maxVertexAttributes;
+    mResources.MaxVertexUniformVectors      = caps.maxVertexUniformVectors;
+    mResources.MaxVaryingVectors            = caps.maxVaryingVectors;
+    mResources.MaxVertexTextureImageUnits   = caps.maxVertexTextureImageUnits;
+    mResources.MaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
+    mResources.MaxTextureImageUnits         = caps.maxTextureImageUnits;
+    mResources.MaxFragmentUniformVectors    = caps.maxFragmentUniformVectors;
+    mResources.MaxDrawBuffers               = caps.maxDrawBuffers;
+    mResources.OES_standard_derivatives     = extensions.standardDerivatives;
+    mResources.EXT_draw_buffers             = extensions.drawBuffers;
+    mResources.EXT_shader_texture_lod       = extensions.shaderTextureLOD;
+    // TODO: disabled until the extension is actually supported.
+    mResources.OES_EGL_image_external = 0;
+    // TODO: use shader precision caps to determine if high precision is supported?
+    mResources.FragmentPrecisionHigh = 1;
+    mResources.EXT_frag_depth        = extensions.fragDepth;
+
+    // GLSL ES 3.0 constants
+    mResources.MaxVertexOutputVectors  = caps.maxVertexOutputComponents / 4;
+    mResources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4;
+    mResources.MinProgramTexelOffset   = caps.minProgramTexelOffset;
+    mResources.MaxProgramTexelOffset   = caps.maxProgramTexelOffset;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Compiler::~Compiler()
</span><span class="cx"> {
</span><del>-    SafeDelete(mCompiler);
</del><ins>+    release();
+    SafeDelete(mImplementation);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error Compiler::release()
</span><span class="cx"> {
</span><del>-    return mCompiler-&gt;release();
</del><ins>+    if (mFragmentCompiler)
+    {
+        ShDestruct(mFragmentCompiler);
+        mFragmentCompiler = nullptr;
+
+        ASSERT(activeCompilerHandles &gt; 0);
+        activeCompilerHandles--;
+    }
+
+    if (mVertexCompiler)
+    {
+        ShDestruct(mVertexCompiler);
+        mVertexCompiler = nullptr;
+
+        ASSERT(activeCompilerHandles &gt; 0);
+        activeCompilerHandles--;
+    }
+
+    if (activeCompilerHandles == 0)
+    {
+        ShFinalize();
+    }
+
+    mImplementation-&gt;release();
+
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-rx::CompilerImpl *Compiler::getImplementation()
</del><ins>+ShHandle Compiler::getCompilerHandle(GLenum type)
</ins><span class="cx"> {
</span><del>-    return mCompiler;
</del><ins>+    ShHandle *compiler = nullptr;
+    switch (type)
+    {
+        case GL_VERTEX_SHADER:
+            compiler = &amp;mVertexCompiler;
+            break;
+
+        case GL_FRAGMENT_SHADER:
+            compiler = &amp;mFragmentCompiler;
+            break;
+
+        default:
+            UNREACHABLE();
+            return nullptr;
+    }
+
+    if (!(*compiler))
+    {
+        if (activeCompilerHandles == 0)
+        {
+            ShInitialize();
+        }
+
+        *compiler = ShConstructCompiler(type, mSpec, mOutputType, &amp;mResources);
+        activeCompilerHandles++;
+    }
+
+    return *compiler;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLECompilerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,29 +11,39 @@
</span><span class="cx"> #define LIBANGLE_COMPILER_H_
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><ins>+#include &quot;GLSLANG/ShaderLang.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class CompilerImpl;
</span><ins>+class ImplFactory;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><ins>+struct Data;
</ins><span class="cx"> 
</span><del>-class Compiler final
</del><ins>+class Compiler final : angle::NonCopyable
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    explicit Compiler(rx::CompilerImpl *impl);
</del><ins>+    Compiler(rx::ImplFactory *implFactory, const Data &amp;data);
</ins><span class="cx">     ~Compiler();
</span><span class="cx"> 
</span><span class="cx">     Error release();
</span><span class="cx"> 
</span><del>-    rx::CompilerImpl *getImplementation();
</del><ins>+    ShHandle getCompilerHandle(GLenum type);
+    ShShaderOutput getShaderOutputType() const { return mOutputType; }
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    rx::CompilerImpl *mCompiler;
</del><ins>+    rx::CompilerImpl *mImplementation;
+    ShShaderSpec mSpec;
+    ShShaderOutput mOutputType;
+    ShBuiltInResources mResources;
+
+    ShHandle mFragmentCompiler;
+    ShHandle mVertexCompiler;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace gl
</ins><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_COMPILER_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEConfigcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -57,14 +57,15 @@
</span><span class="cx">       transparentType(EGL_NONE),
</span><span class="cx">       transparentRedValue(0),
</span><span class="cx">       transparentGreenValue(0),
</span><del>-      transparentBlueValue(0)
</del><ins>+      transparentBlueValue(0),
+      optimalOrientation(0)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EGLint ConfigSet::add(const Config &amp;config)
</span><span class="cx"> {
</span><span class="cx">     // Set the config's ID to a small number that starts at 1 ([EGL 1.5] section 3.4)
</span><del>-    EGLint id = static_cast&lt;EGLint&gt;(mConfigs.size() + 1);
</del><ins>+    EGLint id = static_cast&lt;EGLint&gt;(mConfigs.size()) + 1;
</ins><span class="cx"> 
</span><span class="cx">     Config copyConfig(config);
</span><span class="cx">     copyConfig.configID = id;
</span><span class="lines">@@ -166,8 +167,8 @@
</span><span class="cx">         // components that are 0 or don't-care.
</span><span class="cx">         for (auto attribIter = attributeMap.begin(); attribIter != attributeMap.end(); attribIter++)
</span><span class="cx">         {
</span><del>-            EGLint attributeKey = attribIter-&gt;first;
-            EGLint attributeValue = attribIter-&gt;second;
</del><ins>+            EGLAttrib attributeKey   = attribIter-&gt;first;
+            EGLAttrib attributeValue = attribIter-&gt;second;
</ins><span class="cx">             if (attributeKey != 0 &amp;&amp; attributeValue != EGL_DONT_CARE)
</span><span class="cx">             {
</span><span class="cx">                 switch (attributeKey)
</span><span class="lines">@@ -214,8 +215,8 @@
</span><span class="cx"> 
</span><span class="cx">         for (auto attribIter = attributeMap.begin(); attribIter != attributeMap.end(); attribIter++)
</span><span class="cx">         {
</span><del>-            EGLint attributeKey = attribIter-&gt;first;
-            EGLint attributeValue = attribIter-&gt;second;
</del><ins>+            EGLAttrib attributeKey   = attribIter-&gt;first;
+            EGLAttrib attributeValue = attribIter-&gt;second;
</ins><span class="cx"> 
</span><span class="cx">             switch (attributeKey)
</span><span class="cx">             {
</span><span class="lines">@@ -251,6 +252,9 @@
</span><span class="cx">               case EGL_MAX_PBUFFER_WIDTH:         match = config.maxPBufferWidth &gt;= attributeValue;                   break;
</span><span class="cx">               case EGL_MAX_PBUFFER_HEIGHT:        match = config.maxPBufferHeight &gt;= attributeValue;                  break;
</span><span class="cx">               case EGL_MAX_PBUFFER_PIXELS:        match = config.maxPBufferPixels &gt;= attributeValue;                  break;
</span><ins>+              case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
+                  match = config.optimalOrientation == attributeValue;
+                  break;
</ins><span class="cx">               default: UNREACHABLE();
</span><span class="cx">             }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEConfigh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -64,6 +64,7 @@
</span><span class="cx">     EGLint transparentRedValue;     // Transparent red value
</span><span class="cx">     EGLint transparentGreenValue;   // Transparent green value
</span><span class="cx">     EGLint transparentBlueValue;    // Transparent blue value
</span><ins>+    EGLint optimalOrientation;      // Optimal window surface orientation
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class ConfigSet
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEConfig_unittestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config_unittest.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config_unittest.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Config_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx">     for (size_t i = 0; i &lt; count; i++)
</span><span class="cx">     {
</span><span class="cx">         egl::Config config = GenerateGenericConfig();
</span><del>-        config.samples = i;
</del><ins>+        config.samples = static_cast&lt;EGLint&gt;(i);
</ins><span class="cx">         configs.push_back(config);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -147,7 +147,7 @@
</span><span class="cx"> 
</span><span class="cx">             // Set the tested member of this config to i so it ranges from
</span><span class="cx">             // [1, configsPerType]
</span><del>-            config.*(testMembers[i].ConfigMember) = j + 1;
</del><ins>+            config.*(testMembers[i].ConfigMember) = static_cast&lt;EGLint&gt;(j) + 1;
</ins><span class="cx"> 
</span><span class="cx">             set.add(config);
</span><span class="cx">         }
</span><span class="lines">@@ -158,7 +158,7 @@
</span><span class="cx">     for (size_t i = 0; i &lt; ArraySize(testMembers); i++)
</span><span class="cx">     {
</span><span class="cx">         // Start with a filter of 1 to not grab the other members
</span><del>-        for (size_t j = 0; j &lt; configsPerType; j++)
</del><ins>+        for (EGLint j = 0; j &lt; static_cast&lt;EGLint&gt;(configsPerType); j++)
</ins><span class="cx">         {
</span><span class="cx">             egl::AttributeMap filter;
</span><span class="cx">             filter.insert(testMembers[i].Name, j + 1);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Context.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Context.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Context.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -33,23 +33,125 @@
</span><span class="cx"> #include &quot;libANGLE/validationES.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/Renderer.h&quot;
</span><span class="cx"> 
</span><ins>+namespace
+{
+
+template &lt;typename T&gt;
+gl::Error GetQueryObjectParameter(gl::Context *context, GLuint id, GLenum pname, T *params)
+{
+    gl::Query *queryObject = context-&gt;getQuery(id, false, GL_NONE);
+    ASSERT(queryObject != nullptr);
+
+    switch (pname)
+    {
+        case GL_QUERY_RESULT_EXT:
+            return queryObject-&gt;getResult(params);
+        case GL_QUERY_RESULT_AVAILABLE_EXT:
+        {
+            bool available;
+            gl::Error error = queryObject-&gt;isResultAvailable(&amp;available);
+            if (!error.isError())
+            {
+                *params = static_cast&lt;T&gt;(available ? GL_TRUE : GL_FALSE);
+            }
+            return error;
+        }
+        default:
+            UNREACHABLE();
+            return gl::Error(GL_INVALID_OPERATION, &quot;Unreachable Error&quot;);
+    }
+}
+
+void MarkTransformFeedbackBufferUsage(gl::TransformFeedback *transformFeedback)
+{
+    if (transformFeedback &amp;&amp; transformFeedback-&gt;isActive() &amp;&amp; !transformFeedback-&gt;isPaused())
+    {
+        for (size_t tfBufferIndex = 0; tfBufferIndex &lt; transformFeedback-&gt;getIndexedBufferCount();
+             tfBufferIndex++)
+        {
+            const OffsetBindingPointer&lt;gl::Buffer&gt; &amp;buffer =
+                transformFeedback-&gt;getIndexedBuffer(tfBufferIndex);
+            if (buffer.get() != nullptr)
+            {
+                buffer-&gt;onTransformFeedback();
+            }
+        }
+    }
+}
+
+// Attribute map queries.
+EGLint GetClientVersion(const egl::AttributeMap &amp;attribs)
+{
+    return static_cast&lt;EGLint&gt;(attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1));
+}
+
+GLenum GetResetStrategy(const egl::AttributeMap &amp;attribs)
+{
+    EGLAttrib attrib = attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
+                                   EGL_NO_RESET_NOTIFICATION_EXT);
+    switch (attrib)
+    {
+        case EGL_NO_RESET_NOTIFICATION:
+            return GL_NO_RESET_NOTIFICATION_EXT;
+        case EGL_LOSE_CONTEXT_ON_RESET:
+            return GL_LOSE_CONTEXT_ON_RESET_EXT;
+        default:
+            UNREACHABLE();
+            return GL_NONE;
+    }
+}
+
+bool GetRobustAccess(const egl::AttributeMap &amp;attribs)
+{
+    return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE);
+}
+
+bool GetDebug(const egl::AttributeMap &amp;attribs)
+{
+    return (attribs.get(EGL_CONTEXT_OPENGL_DEBUG, EGL_FALSE) == EGL_TRUE);
+}
+
+bool GetNoError(const egl::AttributeMap &amp;attribs)
+{
+    return (attribs.get(EGL_CONTEXT_OPENGL_NO_ERROR_KHR, EGL_FALSE) == EGL_TRUE);
+}
+
+}  // anonymous namespace
+
</ins><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-Context::Context(const egl::Config *config, int clientVersion, const Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess)
-    : mRenderer(renderer),
-      mData(clientVersion, mState, mCaps, mTextureCaps, mExtensions, nullptr)
</del><ins>+Context::Context(const egl::Config *config,
+                 const Context *shareContext,
+                 rx::Renderer *renderer,
+                 const egl::AttributeMap &amp;attribs)
+    : ValidationContext(GetClientVersion(attribs),
+                        mState,
+                        mCaps,
+                        mTextureCaps,
+                        mExtensions,
+                        nullptr,
+                        mLimitations,
+                        GetNoError(attribs)),
+      mCompiler(nullptr),
+      mRenderer(renderer),
+      mClientVersion(GetClientVersion(attribs)),
+      mConfig(config),
+      mClientType(EGL_OPENGL_ES_API),
+      mHasBeenCurrent(false),
+      mContextLost(false),
+      mResetStatus(GL_NO_ERROR),
+      mResetStrategy(GetResetStrategy(attribs)),
+      mRobustAccess(GetRobustAccess(attribs)),
+      mCurrentSurface(nullptr),
+      mResourceManager(nullptr)
</ins><span class="cx"> {
</span><del>-    ASSERT(robustAccess == false);   // Unimplemented
</del><ins>+    ASSERT(!mRobustAccess);  // Unimplemented
</ins><span class="cx"> 
</span><del>-    initCaps(clientVersion);
-    mState.initialize(mCaps, clientVersion);
</del><ins>+    initCaps(mClientVersion);
</ins><span class="cx"> 
</span><del>-    mClientVersion = clientVersion;
</del><ins>+    mState.initialize(mCaps, mExtensions, mClientVersion, GetDebug(attribs));
</ins><span class="cx"> 
</span><del>-    mConfigID = config-&gt;configID;
-    mClientType = EGL_OPENGL_ES_API;
-
</del><span class="cx">     mFenceNVHandleAllocator.setBaseHandle(0);
</span><span class="cx"> 
</span><span class="cx">     if (shareContext != NULL)
</span><span class="lines">@@ -88,15 +190,10 @@
</span><span class="cx"> 
</span><span class="cx">     mState.initializeZeroTextures(mZeroTextures);
</span><span class="cx"> 
</span><del>-    // Allocate default FBO
-    mFramebufferMap[0] = new Framebuffer(mCaps, mRenderer, 0);
-
</del><span class="cx">     bindVertexArray(0);
</span><span class="cx">     bindArrayBuffer(0);
</span><span class="cx">     bindElementArrayBuffer(0);
</span><span class="cx"> 
</span><del>-    bindReadFramebuffer(0);
-    bindDrawFramebuffer(0);
</del><span class="cx">     bindRenderbuffer(0);
</span><span class="cx"> 
</span><span class="cx">     bindGenericUniformBuffer(0);
</span><span class="lines">@@ -110,51 +207,91 @@
</span><span class="cx">     bindPixelPackBuffer(0);
</span><span class="cx">     bindPixelUnpackBuffer(0);
</span><span class="cx"> 
</span><del>-    // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
-    // In the initial state, a default transform feedback object is bound and treated as
-    // a transform feedback object with a name of zero. That object is bound any time
-    // BindTransformFeedback is called with id of zero
-    mTransformFeedbackZero.set(new TransformFeedback(mRenderer-&gt;createTransformFeedback(), 0, mCaps));
-    bindTransformFeedback(0);
</del><ins>+    if (mClientVersion &gt;= 3)
+    {
+        // [OpenGL ES 3.0.2] section 2.14.1 pg 85:
+        // In the initial state, a default transform feedback object is bound and treated as
+        // a transform feedback object with a name of zero. That object is bound any time
+        // BindTransformFeedback is called with id of zero
+        bindTransformFeedback(0);
+    }
</ins><span class="cx"> 
</span><del>-    mHasBeenCurrent = false;
-    mContextLost = false;
-    mResetStatus = GL_NO_ERROR;
-    mResetStrategy = (notifyResets ? GL_LOSE_CONTEXT_ON_RESET_EXT : GL_NO_RESET_NOTIFICATION_EXT);
-    mRobustAccess = robustAccess;
</del><ins>+    mCompiler = new Compiler(mRenderer, getData());
</ins><span class="cx"> 
</span><del>-    mCompiler = new Compiler(mRenderer-&gt;createCompiler(getData()));
</del><ins>+    // Initialize dirty bit masks
+    // TODO(jmadill): additional ES3 state
+    mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ALIGNMENT);
+    mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_ROW_LENGTH);
+    mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
+    mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_IMAGES);
+    mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_ROWS);
+    mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_SKIP_PIXELS);
+    // No dirty objects.
+
+    // Readpixels uses the pack state and read FBO
+    mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ALIGNMENT);
+    mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
+    mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_ROW_LENGTH);
+    mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_ROWS);
+    mReadPixelsDirtyBits.set(State::DIRTY_BIT_PACK_SKIP_PIXELS);
+    mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
+
+    mClearDirtyBits.set(State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
+    mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
+    mClearDirtyBits.set(State::DIRTY_BIT_SCISSOR);
+    mClearDirtyBits.set(State::DIRTY_BIT_VIEWPORT);
+    mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_COLOR);
+    mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_DEPTH);
+    mClearDirtyBits.set(State::DIRTY_BIT_CLEAR_STENCIL);
+    mClearDirtyBits.set(State::DIRTY_BIT_COLOR_MASK);
+    mClearDirtyBits.set(State::DIRTY_BIT_DEPTH_MASK);
+    mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
+    mClearDirtyBits.set(State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
+    mClearDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
+
+    mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
+    mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
+    mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
+    mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Context::~Context()
</span><span class="cx"> {
</span><span class="cx">     mState.reset();
</span><span class="cx"> 
</span><del>-    while (!mFramebufferMap.empty())
</del><ins>+    for (auto framebuffer : mFramebufferMap)
</ins><span class="cx">     {
</span><del>-        // Delete the framebuffer in reverse order to destroy the framebuffer zero last.
-        deleteFramebuffer(mFramebufferMap.rbegin()-&gt;first);
</del><ins>+        // Default framebuffer are owned by their respective Surface
+        if (framebuffer.second != nullptr &amp;&amp; framebuffer.second-&gt;id() != 0)
+        {
+            SafeDelete(framebuffer.second);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    while (!mFenceNVMap.empty())
</del><ins>+    for (auto fence : mFenceNVMap)
</ins><span class="cx">     {
</span><del>-        deleteFenceNV(mFenceNVMap.begin()-&gt;first);
</del><ins>+        SafeDelete(fence.second);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    while (!mQueryMap.empty())
</del><ins>+    for (auto query : mQueryMap)
</ins><span class="cx">     {
</span><del>-        deleteQuery(mQueryMap.begin()-&gt;first);
</del><ins>+        if (query.second != nullptr)
+        {
+            query.second-&gt;release();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    while (!mVertexArrayMap.empty())
</del><ins>+    for (auto vertexArray : mVertexArrayMap)
</ins><span class="cx">     {
</span><del>-        deleteVertexArray(mVertexArrayMap.begin()-&gt;first);
</del><ins>+        SafeDelete(vertexArray.second);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mTransformFeedbackZero.set(NULL);
-    while (!mTransformFeedbackMap.empty())
</del><ins>+    for (auto transformFeedback : mTransformFeedbackMap)
</ins><span class="cx">     {
</span><del>-        deleteTransformFeedback(mTransformFeedbackMap.begin()-&gt;first);
</del><ins>+        if (transformFeedback.second != nullptr)
+        {
+            transformFeedback.second-&gt;release();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (auto &amp;zeroTexture : mZeroTextures)
</span><span class="lines">@@ -163,6 +300,11 @@
</span><span class="cx">     }
</span><span class="cx">     mZeroTextures.clear();
</span><span class="cx"> 
</span><ins>+    if (mCurrentSurface != nullptr)
+    {
+        releaseSurface();
+    }
+
</ins><span class="cx">     if (mResourceManager)
</span><span class="cx">     {
</span><span class="cx">         mResourceManager-&gt;release();
</span><span class="lines">@@ -186,50 +328,55 @@
</span><span class="cx">         mHasBeenCurrent = true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Update default framebuffer
-    Framebuffer *defaultFBO = mFramebufferMap[0];
</del><ins>+    // TODO(jmadill): Rework this when we support ContextImpl
+    mState.setAllDirtyBits();
</ins><span class="cx"> 
</span><del>-    GLenum drawBufferState = GL_BACK;
-    defaultFBO-&gt;setDrawBuffers(1, &amp;drawBufferState);
-    defaultFBO-&gt;setReadBuffer(GL_BACK);
-
-    const FramebufferAttachment *backAttachment = defaultFBO-&gt;getAttachment(GL_BACK);
-
-    if (backAttachment &amp;&amp; backAttachment-&gt;getSurface() == surface)
</del><ins>+    if (mCurrentSurface)
</ins><span class="cx">     {
</span><del>-        // FBO already initialized to the surface.
-        return;
</del><ins>+        releaseSurface();
</ins><span class="cx">     }
</span><ins>+    surface-&gt;setIsCurrent(true);
+    mCurrentSurface = surface;
</ins><span class="cx"> 
</span><del>-    const egl::Config *config = surface-&gt;getConfig();
-
-    defaultFBO-&gt;setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_BACK, ImageIndex::MakeInvalid(), surface);
-
-    if (config-&gt;depthSize &gt; 0)
</del><ins>+    // Update default framebuffer, the binding of the previous default
+    // framebuffer (or lack of) will have a nullptr.
</ins><span class="cx">     {
</span><del>-        defaultFBO-&gt;setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_DEPTH, ImageIndex::MakeInvalid(), surface);
</del><ins>+        Framebuffer *newDefault = surface-&gt;getDefaultFramebuffer();
+        if (mState.getReadFramebuffer() == nullptr)
+        {
+            mState.setReadFramebufferBinding(newDefault);
+        }
+        if (mState.getDrawFramebuffer() == nullptr)
+        {
+            mState.setDrawFramebufferBinding(newDefault);
+        }
+        mFramebufferMap[0] = newDefault;
</ins><span class="cx">     }
</span><del>-    else
-    {
-        defaultFBO-&gt;resetAttachment(GL_DEPTH);
-    }
</del><span class="cx"> 
</span><del>-    if (config-&gt;stencilSize &gt; 0)
-    {
-        defaultFBO-&gt;setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_STENCIL, ImageIndex::MakeInvalid(), surface);
-    }
-    else
-    {
-        defaultFBO-&gt;resetAttachment(GL_STENCIL);
-    }
</del><ins>+    // Notify the renderer of a context switch
+    mRenderer-&gt;onMakeCurrent(getData());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Context::releaseSurface()
</span><span class="cx"> {
</span><del>-    Framebuffer *defaultFBO = mFramebufferMap[0];
-    defaultFBO-&gt;resetAttachment(GL_BACK);
-    defaultFBO-&gt;resetAttachment(GL_DEPTH);
-    defaultFBO-&gt;resetAttachment(GL_STENCIL);
</del><ins>+    ASSERT(mCurrentSurface != nullptr);
+
+    // Remove the default framebuffer
+    {
+        Framebuffer *currentDefault = mCurrentSurface-&gt;getDefaultFramebuffer();
+        if (mState.getReadFramebuffer() == currentDefault)
+        {
+            mState.setReadFramebufferBinding(nullptr);
+        }
+        if (mState.getDrawFramebuffer() == currentDefault)
+        {
+            mState.setDrawFramebufferBinding(nullptr);
+        }
+        mFramebufferMap.erase(0);
+    }
+
+    mCurrentSurface-&gt;setIsCurrent(false);
+    mCurrentSurface = nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // NOTE: this function should not assume that this context is current!
</span><span class="lines">@@ -257,7 +404,7 @@
</span><span class="cx"> 
</span><span class="cx"> GLuint Context::createShader(GLenum type)
</span><span class="cx"> {
</span><del>-    return mResourceManager-&gt;createShader(getData(), type);
</del><ins>+    return mResourceManager-&gt;createShader(mRenderer-&gt;getRendererLimitations(), type);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLuint Context::createTexture()
</span><span class="lines">@@ -279,14 +426,9 @@
</span><span class="cx"> 
</span><span class="cx"> GLuint Context::createVertexArray()
</span><span class="cx"> {
</span><del>-    GLuint handle = mVertexArrayHandleAllocator.allocate();
-
-    // Although the spec states VAO state is not initialized until the object is bound,
-    // we create it immediately. The resulting behaviour is transparent to the application,
-    // since it's not currently possible to access the state until the object is bound.
-    VertexArray *vertexArray = new VertexArray(mRenderer-&gt;createVertexArray(), handle, MAX_VERTEX_ATTRIBS);
-    mVertexArrayMap[handle] = vertexArray;
-    return handle;
</del><ins>+    GLuint vertexArray           = mVertexArrayHandleAllocator.allocate();
+    mVertexArrayMap[vertexArray] = nullptr;
+    return vertexArray;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLuint Context::createSampler()
</span><span class="lines">@@ -296,11 +438,9 @@
</span><span class="cx"> 
</span><span class="cx"> GLuint Context::createTransformFeedback()
</span><span class="cx"> {
</span><del>-    GLuint handle = mTransformFeedbackAllocator.allocate();
-    TransformFeedback *transformFeedback = new TransformFeedback(mRenderer-&gt;createTransformFeedback(), handle, mCaps);
-    transformFeedback-&gt;addRef();
-    mTransformFeedbackMap[handle] = transformFeedback;
-    return handle;
</del><ins>+    GLuint transformFeedback                 = mTransformFeedbackAllocator.allocate();
+    mTransformFeedbackMap[transformFeedback] = nullptr;
+    return transformFeedback;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Returns an unused framebuffer name
</span><span class="lines">@@ -383,15 +523,18 @@
</span><span class="cx"> 
</span><span class="cx"> void Context::deleteVertexArray(GLuint vertexArray)
</span><span class="cx"> {
</span><del>-    auto vertexArrayObject = mVertexArrayMap.find(vertexArray);
-
-    if (vertexArrayObject != mVertexArrayMap.end())
</del><ins>+    auto iter = mVertexArrayMap.find(vertexArray);
+    if (iter != mVertexArrayMap.end())
</ins><span class="cx">     {
</span><del>-        detachVertexArray(vertexArray);
</del><ins>+        VertexArray *vertexArrayObject = iter-&gt;second;
+        if (vertexArrayObject != nullptr)
+        {
+            detachVertexArray(vertexArray);
+            delete vertexArrayObject;
+        }
</ins><span class="cx"> 
</span><del>-        mVertexArrayHandleAllocator.release(vertexArrayObject-&gt;first);
-        delete vertexArrayObject-&gt;second;
-        mVertexArrayMap.erase(vertexArrayObject);
</del><ins>+        mVertexArrayMap.erase(iter);
+        mVertexArrayHandleAllocator.release(vertexArray);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -410,16 +553,21 @@
</span><span class="cx">     auto iter = mTransformFeedbackMap.find(transformFeedback);
</span><span class="cx">     if (iter != mTransformFeedbackMap.end())
</span><span class="cx">     {
</span><del>-        detachTransformFeedback(transformFeedback);
</del><ins>+        TransformFeedback *transformFeedbackObject = iter-&gt;second;
+        if (transformFeedbackObject != nullptr)
+        {
+            detachTransformFeedback(transformFeedback);
+            transformFeedbackObject-&gt;release();
+        }
+
+        mTransformFeedbackMap.erase(iter);
</ins><span class="cx">         mTransformFeedbackAllocator.release(transformFeedback);
</span><del>-        iter-&gt;second-&gt;release();
-        mTransformFeedbackMap.erase(iter);
</del><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Context::deleteFramebuffer(GLuint framebuffer)
</span><span class="cx"> {
</span><del>-    FramebufferMap::iterator framebufferObject = mFramebufferMap.find(framebuffer);
</del><ins>+    auto framebufferObject = mFramebufferMap.find(framebuffer);
</ins><span class="cx"> 
</span><span class="cx">     if (framebufferObject != mFramebufferMap.end())
</span><span class="cx">     {
</span><span class="lines">@@ -433,7 +581,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Context::deleteFenceNV(GLuint fence)
</span><span class="cx"> {
</span><del>-    FenceNVMap::iterator fenceObject = mFenceNVMap.find(fence);
</del><ins>+    auto fenceObject = mFenceNVMap.find(fence);
</ins><span class="cx"> 
</span><span class="cx">     if (fenceObject != mFenceNVMap.end())
</span><span class="cx">     {
</span><span class="lines">@@ -445,7 +593,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Context::deleteQuery(GLuint query)
</span><span class="cx"> {
</span><del>-    QueryMap::iterator queryObject = mQueryMap.find(query);
</del><ins>+    auto queryObject = mQueryMap.find(query);
</ins><span class="cx">     if (queryObject != mQueryMap.end())
</span><span class="cx">     {
</span><span class="cx">         mQueryHandleAllocator.release(queryObject-&gt;first);
</span><span class="lines">@@ -457,7 +605,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Buffer *Context::getBuffer(GLuint handle)
</del><ins>+Buffer *Context::getBuffer(GLuint handle) const
</ins><span class="cx"> {
</span><span class="cx">     return mResourceManager-&gt;getBuffer(handle);
</span><span class="cx"> }
</span><span class="lines">@@ -477,7 +625,7 @@
</span><span class="cx">     return mResourceManager-&gt;getTexture(handle);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Renderbuffer *Context::getRenderbuffer(GLuint handle)
</del><ins>+Renderbuffer *Context::getRenderbuffer(GLuint handle) const
</ins><span class="cx"> {
</span><span class="cx">     return mResourceManager-&gt;getRenderbuffer(handle);
</span><span class="cx"> }
</span><span class="lines">@@ -490,15 +638,7 @@
</span><span class="cx"> VertexArray *Context::getVertexArray(GLuint handle) const
</span><span class="cx"> {
</span><span class="cx">     auto vertexArray = mVertexArrayMap.find(handle);
</span><del>-
-    if (vertexArray == mVertexArrayMap.end())
-    {
-        return NULL;
-    }
-    else
-    {
-        return vertexArray-&gt;second;
-    }
</del><ins>+    return (vertexArray != mVertexArrayMap.end()) ? vertexArray-&gt;second : nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Sampler *Context::getSampler(GLuint handle) const
</span><span class="lines">@@ -508,39 +648,65 @@
</span><span class="cx"> 
</span><span class="cx"> TransformFeedback *Context::getTransformFeedback(GLuint handle) const
</span><span class="cx"> {
</span><del>-    if (handle == 0)
</del><ins>+    auto iter = mTransformFeedbackMap.find(handle);
+    return (iter != mTransformFeedbackMap.end()) ? iter-&gt;second : nullptr;
+}
+
+LabeledObject *Context::getLabeledObject(GLenum identifier, GLuint name) const
+{
+    switch (identifier)
</ins><span class="cx">     {
</span><del>-        return mTransformFeedbackZero.get();
</del><ins>+        case GL_BUFFER:
+            return getBuffer(name);
+        case GL_SHADER:
+            return getShader(name);
+        case GL_PROGRAM:
+            return getProgram(name);
+        case GL_VERTEX_ARRAY:
+            return getVertexArray(name);
+        case GL_QUERY:
+            return getQuery(name);
+        case GL_TRANSFORM_FEEDBACK:
+            return getTransformFeedback(name);
+        case GL_SAMPLER:
+            return getSampler(name);
+        case GL_TEXTURE:
+            return getTexture(name);
+        case GL_RENDERBUFFER:
+            return getRenderbuffer(name);
+        case GL_FRAMEBUFFER:
+            return getFramebuffer(name);
+        default:
+            UNREACHABLE();
+            return nullptr;
</ins><span class="cx">     }
</span><del>-    else
-    {
-        TransformFeedbackMap::const_iterator iter = mTransformFeedbackMap.find(handle);
-        return (iter != mTransformFeedbackMap.end()) ? iter-&gt;second : NULL;
-    }
</del><span class="cx"> }
</span><span class="cx"> 
</span><ins>+LabeledObject *Context::getLabeledObjectFromPtr(const void *ptr) const
+{
+    return getFenceSync(reinterpret_cast&lt;GLsync&gt;(const_cast&lt;void *&gt;(ptr)));
+}
+
</ins><span class="cx"> bool Context::isSampler(GLuint samplerName) const
</span><span class="cx"> {
</span><span class="cx">     return mResourceManager-&gt;isSampler(samplerName);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindArrayBuffer(unsigned int buffer)
</del><ins>+void Context::bindArrayBuffer(GLuint bufferHandle)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkBufferAllocation(buffer);
-
-    mState.setArrayBufferBinding(getBuffer(buffer));
</del><ins>+    Buffer *buffer = mResourceManager-&gt;checkBufferAllocation(bufferHandle);
+    mState.setArrayBufferBinding(buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindElementArrayBuffer(unsigned int buffer)
</del><ins>+void Context::bindElementArrayBuffer(GLuint bufferHandle)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkBufferAllocation(buffer);
-
-    mState.getVertexArray()-&gt;setElementArrayBuffer(getBuffer(buffer));
</del><ins>+    Buffer *buffer = mResourceManager-&gt;checkBufferAllocation(bufferHandle);
+    mState.getVertexArray()-&gt;setElementArrayBuffer(buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Context::bindTexture(GLenum target, GLuint handle)
</span><span class="cx"> {
</span><del>-    Texture *texture = NULL;
</del><ins>+    Texture *texture = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     if (handle == 0)
</span><span class="cx">     {
</span><span class="lines">@@ -548,115 +714,96 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        mResourceManager-&gt;checkTextureAllocation(handle, target);
-        texture = getTexture(handle);
</del><ins>+        texture = mResourceManager-&gt;checkTextureAllocation(handle, target);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT(texture);
</span><del>-
</del><span class="cx">     mState.setSamplerTexture(target, texture);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindReadFramebuffer(GLuint framebuffer)
</del><ins>+void Context::bindReadFramebuffer(GLuint framebufferHandle)
</ins><span class="cx"> {
</span><del>-    if (!getFramebuffer(framebuffer))
-    {
-        mFramebufferMap[framebuffer] = new Framebuffer(mCaps, mRenderer, framebuffer);
-    }
-
-    mState.setReadFramebufferBinding(getFramebuffer(framebuffer));
</del><ins>+    Framebuffer *framebuffer = checkFramebufferAllocation(framebufferHandle);
+    mState.setReadFramebufferBinding(framebuffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindDrawFramebuffer(GLuint framebuffer)
</del><ins>+void Context::bindDrawFramebuffer(GLuint framebufferHandle)
</ins><span class="cx"> {
</span><del>-    if (!getFramebuffer(framebuffer))
-    {
-        mFramebufferMap[framebuffer] = new Framebuffer(mCaps, mRenderer, framebuffer);
-    }
-
-    mState.setDrawFramebufferBinding(getFramebuffer(framebuffer));
</del><ins>+    Framebuffer *framebuffer = checkFramebufferAllocation(framebufferHandle);
+    mState.setDrawFramebufferBinding(framebuffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindRenderbuffer(GLuint renderbuffer)
</del><ins>+void Context::bindRenderbuffer(GLuint renderbufferHandle)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkRenderbufferAllocation(renderbuffer);
-
-    mState.setRenderbufferBinding(getRenderbuffer(renderbuffer));
</del><ins>+    Renderbuffer *renderbuffer = mResourceManager-&gt;checkRenderbufferAllocation(renderbufferHandle);
+    mState.setRenderbufferBinding(renderbuffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindVertexArray(GLuint vertexArray)
</del><ins>+void Context::bindVertexArray(GLuint vertexArrayHandle)
</ins><span class="cx"> {
</span><del>-    if (!getVertexArray(vertexArray))
-    {
-        VertexArray *vertexArrayObject = new VertexArray(mRenderer-&gt;createVertexArray(), vertexArray, MAX_VERTEX_ATTRIBS);
-        mVertexArrayMap[vertexArray] = vertexArrayObject;
-    }
-
-    mState.setVertexArrayBinding(getVertexArray(vertexArray));
</del><ins>+    VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
+    mState.setVertexArrayBinding(vertexArray);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindSampler(GLuint textureUnit, GLuint sampler)
</del><ins>+void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(textureUnit &lt; mCaps.maxCombinedTextureImageUnits);
</span><del>-    mResourceManager-&gt;checkSamplerAllocation(sampler);
-
-    mState.setSamplerBinding(textureUnit, getSampler(sampler));
</del><ins>+    Sampler *sampler = mResourceManager-&gt;checkSamplerAllocation(samplerHandle);
+    mState.setSamplerBinding(textureUnit, sampler);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindGenericUniformBuffer(GLuint buffer)
</del><ins>+void Context::bindGenericUniformBuffer(GLuint bufferHandle)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkBufferAllocation(buffer);
-
-    mState.setGenericUniformBufferBinding(getBuffer(buffer));
</del><ins>+    Buffer *buffer = mResourceManager-&gt;checkBufferAllocation(bufferHandle);
+    mState.setGenericUniformBufferBinding(buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
</del><ins>+void Context::bindIndexedUniformBuffer(GLuint bufferHandle,
+                                       GLuint index,
+                                       GLintptr offset,
+                                       GLsizeiptr size)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkBufferAllocation(buffer);
-
-    mState.setIndexedUniformBufferBinding(index, getBuffer(buffer), offset, size);
</del><ins>+    Buffer *buffer = mResourceManager-&gt;checkBufferAllocation(bufferHandle);
+    mState.setIndexedUniformBufferBinding(index, buffer, offset, size);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindGenericTransformFeedbackBuffer(GLuint buffer)
</del><ins>+void Context::bindGenericTransformFeedbackBuffer(GLuint bufferHandle)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkBufferAllocation(buffer);
-
-    mState.getCurrentTransformFeedback()-&gt;bindGenericBuffer(getBuffer(buffer));
</del><ins>+    Buffer *buffer = mResourceManager-&gt;checkBufferAllocation(bufferHandle);
+    mState.getCurrentTransformFeedback()-&gt;bindGenericBuffer(buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
</del><ins>+void Context::bindIndexedTransformFeedbackBuffer(GLuint bufferHandle,
+                                                 GLuint index,
+                                                 GLintptr offset,
+                                                 GLsizeiptr size)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkBufferAllocation(buffer);
-
-    mState.getCurrentTransformFeedback()-&gt;bindIndexedBuffer(index, getBuffer(buffer), offset, size);
</del><ins>+    Buffer *buffer = mResourceManager-&gt;checkBufferAllocation(bufferHandle);
+    mState.getCurrentTransformFeedback()-&gt;bindIndexedBuffer(index, buffer, offset, size);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindCopyReadBuffer(GLuint buffer)
</del><ins>+void Context::bindCopyReadBuffer(GLuint bufferHandle)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkBufferAllocation(buffer);
-
-    mState.setCopyReadBufferBinding(getBuffer(buffer));
</del><ins>+    Buffer *buffer = mResourceManager-&gt;checkBufferAllocation(bufferHandle);
+    mState.setCopyReadBufferBinding(buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindCopyWriteBuffer(GLuint buffer)
</del><ins>+void Context::bindCopyWriteBuffer(GLuint bufferHandle)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkBufferAllocation(buffer);
-
-    mState.setCopyWriteBufferBinding(getBuffer(buffer));
</del><ins>+    Buffer *buffer = mResourceManager-&gt;checkBufferAllocation(bufferHandle);
+    mState.setCopyWriteBufferBinding(buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindPixelPackBuffer(GLuint buffer)
</del><ins>+void Context::bindPixelPackBuffer(GLuint bufferHandle)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkBufferAllocation(buffer);
-
-    mState.setPixelPackBufferBinding(getBuffer(buffer));
</del><ins>+    Buffer *buffer = mResourceManager-&gt;checkBufferAllocation(bufferHandle);
+    mState.setPixelPackBufferBinding(buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindPixelUnpackBuffer(GLuint buffer)
</del><ins>+void Context::bindPixelUnpackBuffer(GLuint bufferHandle)
</ins><span class="cx"> {
</span><del>-    mResourceManager-&gt;checkBufferAllocation(buffer);
-
-    mState.setPixelUnpackBufferBinding(getBuffer(buffer));
</del><ins>+    Buffer *buffer = mResourceManager-&gt;checkBufferAllocation(bufferHandle);
+    mState.setPixelUnpackBufferBinding(buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Context::useProgram(GLuint program)
</span><span class="lines">@@ -664,9 +811,11 @@
</span><span class="cx">     mState.setProgram(getProgram(program));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Context::bindTransformFeedback(GLuint transformFeedback)
</del><ins>+void Context::bindTransformFeedback(GLuint transformFeedbackHandle)
</ins><span class="cx"> {
</span><del>-    mState.setTransformFeedbackBinding(getTransformFeedback(transformFeedback));
</del><ins>+    TransformFeedback *transformFeedback =
+        checkTransformFeedbackAllocation(transformFeedbackHandle);
+    mState.setTransformFeedbackBinding(transformFeedback);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error Context::beginQuery(GLenum target, GLuint query)
</span><span class="lines">@@ -700,23 +849,73 @@
</span><span class="cx">     return error;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Framebuffer *Context::getFramebuffer(unsigned int handle) const
</del><ins>+Error Context::queryCounter(GLuint id, GLenum target)
</ins><span class="cx"> {
</span><del>-    FramebufferMap::const_iterator framebuffer = mFramebufferMap.find(handle);
</del><ins>+    ASSERT(target == GL_TIMESTAMP_EXT);
</ins><span class="cx"> 
</span><del>-    if (framebuffer == mFramebufferMap.end())
</del><ins>+    Query *queryObject = getQuery(id, true, target);
+    ASSERT(queryObject);
+
+    return queryObject-&gt;queryCounter();
+}
+
+void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+    switch (pname)
</ins><span class="cx">     {
</span><del>-        return NULL;
</del><ins>+        case GL_CURRENT_QUERY_EXT:
+            params[0] = getState().getActiveQueryId(target);
+            break;
+        case GL_QUERY_COUNTER_BITS_EXT:
+            switch (target)
+            {
+                case GL_TIME_ELAPSED_EXT:
+                    params[0] = getExtensions().queryCounterBitsTimeElapsed;
+                    break;
+                case GL_TIMESTAMP_EXT:
+                    params[0] = getExtensions().queryCounterBitsTimestamp;
+                    break;
+                default:
+                    UNREACHABLE();
+                    params[0] = 0;
+                    break;
+            }
+            break;
+        default:
+            UNREACHABLE();
+            return;
</ins><span class="cx">     }
</span><del>-    else
-    {
-        return framebuffer-&gt;second;
-    }
</del><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Error Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+{
+    return GetQueryObjectParameter(this, id, pname, params);
+}
+
+Error Context::getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+    return GetQueryObjectParameter(this, id, pname, params);
+}
+
+Error Context::getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params)
+{
+    return GetQueryObjectParameter(this, id, pname, params);
+}
+
+Error Context::getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params)
+{
+    return GetQueryObjectParameter(this, id, pname, params);
+}
+
+Framebuffer *Context::getFramebuffer(unsigned int handle) const
+{
+    auto framebufferIt = mFramebufferMap.find(handle);
+    return ((framebufferIt == mFramebufferMap.end()) ? nullptr : framebufferIt-&gt;second);
+}
+
</ins><span class="cx"> FenceNV *Context::getFenceNV(unsigned int handle)
</span><span class="cx"> {
</span><del>-    FenceNVMap::iterator fence = mFenceNVMap.find(handle);
</del><ins>+    auto fence = mFenceNVMap.find(handle);
</ins><span class="cx"> 
</span><span class="cx">     if (fence == mFenceNVMap.end())
</span><span class="cx">     {
</span><span class="lines">@@ -730,7 +929,7 @@
</span><span class="cx"> 
</span><span class="cx"> Query *Context::getQuery(unsigned int handle, bool create, GLenum type)
</span><span class="cx"> {
</span><del>-    QueryMap::iterator query = mQueryMap.find(handle);
</del><ins>+    auto query = mQueryMap.find(handle);
</ins><span class="cx"> 
</span><span class="cx">     if (query == mQueryMap.end())
</span><span class="cx">     {
</span><span class="lines">@@ -747,11 +946,16 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Query *Context::getQuery(GLuint handle) const
+{
+    auto iter = mQueryMap.find(handle);
+    return (iter != mQueryMap.end()) ? iter-&gt;second : nullptr;
+}
+
</ins><span class="cx"> Texture *Context::getTargetTexture(GLenum target) const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(ValidTextureTarget(this, target));
</span><del>-
-    return getSamplerTexture(mState.getActiveSampler(), target);
</del><ins>+    return mState.getTargetTexture(target);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Texture *Context::getSamplerTexture(unsigned int sampler, GLenum type) const
</span><span class="lines">@@ -794,6 +998,9 @@
</span><span class="cx">         ASSERT(mExtensions.textureFilterAnisotropic);
</span><span class="cx">         *params = mExtensions.maxTextureAnisotropy;
</span><span class="cx">         break;
</span><ins>+      case GL_MAX_TEXTURE_LOD_BIAS:
+        *params = mCaps.maxLODBias;
+        break;
</ins><span class="cx">       default:
</span><span class="cx">         mState.getFloatv(pname, params);
</span><span class="cx">         break;
</span><span class="lines">@@ -816,7 +1023,7 @@
</span><span class="cx">       case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:           *params = mCaps.maxVertexTextureImageUnits;                     break;
</span><span class="cx">       case GL_MAX_TEXTURE_IMAGE_UNITS:                  *params = mCaps.maxTextureImageUnits;                           break;
</span><span class="cx">       case GL_MAX_FRAGMENT_UNIFORM_VECTORS:             *params = mCaps.maxFragmentUniformVectors;                      break;
</span><del>-      case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:          *params = mCaps.maxFragmentInputComponents;                     break;
</del><ins>+      case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:          *params = mCaps.maxFragmentUniformComponents;                   break;
</ins><span class="cx">       case GL_MAX_RENDERBUFFER_SIZE:                    *params = mCaps.maxRenderbufferSize;                            break;
</span><span class="cx">       case GL_MAX_COLOR_ATTACHMENTS_EXT:                *params = mCaps.maxColorAttachments;                            break;
</span><span class="cx">       case GL_MAX_DRAW_BUFFERS_EXT:                     *params = mCaps.maxDrawBuffers;                                 break;
</span><span class="lines">@@ -831,6 +1038,10 @@
</span><span class="cx">       case GL_MAX_VERTEX_UNIFORM_BLOCKS:                *params = mCaps.maxVertexUniformBlocks;                         break;
</span><span class="cx">       case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:              *params = mCaps.maxFragmentUniformBlocks;                       break;
</span><span class="cx">       case GL_MAX_COMBINED_UNIFORM_BLOCKS:              *params = mCaps.maxCombinedTextureImageUnits;                   break;
</span><ins>+      case GL_MAX_VERTEX_OUTPUT_COMPONENTS:             *params = mCaps.maxVertexOutputComponents;                      break;
+      case GL_MAX_FRAGMENT_INPUT_COMPONENTS:            *params = mCaps.maxFragmentInputComponents;                     break;
+      case GL_MIN_PROGRAM_TEXEL_OFFSET:                 *params = mCaps.minProgramTexelOffset;                          break;
+      case GL_MAX_PROGRAM_TEXEL_OFFSET:                 *params = mCaps.maxProgramTexelOffset;                          break;
</ins><span class="cx">       case GL_MAJOR_VERSION:                            *params = mClientVersion;                                       break;
</span><span class="cx">       case GL_MINOR_VERSION:                            *params = 0;                                                    break;
</span><span class="cx">       case GL_MAX_ELEMENTS_INDICES:                     *params = mCaps.maxElementsIndices;                             break;
</span><span class="lines">@@ -838,7 +1049,9 @@
</span><span class="cx">       case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: *params = mCaps.maxTransformFeedbackInterleavedComponents; break;
</span><span class="cx">       case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:       *params = mCaps.maxTransformFeedbackSeparateAttributes;    break;
</span><span class="cx">       case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:    *params = mCaps.maxTransformFeedbackSeparateComponents;    break;
</span><del>-      case GL_NUM_COMPRESSED_TEXTURE_FORMATS:           *params = static_cast&lt;GLint&gt;(mCaps.compressedTextureFormats.size());  break;
</del><ins>+      case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
+          *params = static_cast&lt;GLint&gt;(mCaps.compressedTextureFormats.size());
+          break;
</ins><span class="cx">       case GL_MAX_SAMPLES_ANGLE:                        *params = mCaps.maxSamples;                                     break;
</span><span class="cx">       case GL_MAX_VIEWPORT_DIMS:
</span><span class="cx">         {
</span><span class="lines">@@ -853,13 +1066,13 @@
</span><span class="cx">         *params = mResetStrategy;
</span><span class="cx">         break;
</span><span class="cx">       case GL_NUM_SHADER_BINARY_FORMATS:
</span><del>-        *params = static_cast&lt;GLint&gt;(mCaps.shaderBinaryFormats.size());
</del><ins>+          *params = static_cast&lt;GLint&gt;(mCaps.shaderBinaryFormats.size());
</ins><span class="cx">         break;
</span><span class="cx">       case GL_SHADER_BINARY_FORMATS:
</span><span class="cx">         std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
</span><span class="cx">         break;
</span><span class="cx">       case GL_NUM_PROGRAM_BINARY_FORMATS:
</span><del>-        *params = static_cast&lt;GLint&gt;(mCaps.programBinaryFormats.size());
</del><ins>+          *params = static_cast&lt;GLint&gt;(mCaps.programBinaryFormats.size());
</ins><span class="cx">         break;
</span><span class="cx">       case GL_PROGRAM_BINARY_FORMATS:
</span><span class="cx">         std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
</span><span class="lines">@@ -867,6 +1080,26 @@
</span><span class="cx">       case GL_NUM_EXTENSIONS:
</span><span class="cx">         *params = static_cast&lt;GLint&gt;(mExtensionStrings.size());
</span><span class="cx">         break;
</span><ins>+
+      // GL_KHR_debug
+      case GL_MAX_DEBUG_MESSAGE_LENGTH:
+          *params = mExtensions.maxDebugMessageLength;
+          break;
+      case GL_MAX_DEBUG_LOGGED_MESSAGES:
+          *params = mExtensions.maxDebugLoggedMessages;
+          break;
+      case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
+          *params = mExtensions.maxDebugGroupStackDepth;
+          break;
+      case GL_MAX_LABEL_LENGTH:
+          *params = mExtensions.maxLabelLength;
+          break;
+
+      // GL_EXT_disjoint_timer_query
+      case GL_GPU_DISJOINT_EXT:
+          *params = mRenderer-&gt;getGPUDisjoint();
+          break;
+
</ins><span class="cx">       default:
</span><span class="cx">         mState.getIntegerv(getData(), pname, params);
</span><span class="cx">         break;
</span><span class="lines">@@ -894,12 +1127,22 @@
</span><span class="cx">       case GL_MAX_SERVER_WAIT_TIMEOUT:
</span><span class="cx">         *params = mCaps.maxServerWaitTimeout;
</span><span class="cx">         break;
</span><ins>+
+      // GL_EXT_disjoint_timer_query
+      case GL_TIMESTAMP_EXT:
+          *params = mRenderer-&gt;getTimestamp();
+          break;
</ins><span class="cx">       default:
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Context::getPointerv(GLenum pname, void **params) const
+{
+    mState.getPointerv(pname, params);
+}
+
</ins><span class="cx"> bool Context::getIndexedIntegerv(GLenum target, GLuint index, GLint *data)
</span><span class="cx"> {
</span><span class="cx">     // Queries about context capabilities and maximums are answered by Context.
</span><span class="lines">@@ -1039,20 +1282,6 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         return true;
</span><del>-      case GL_PIXEL_PACK_BUFFER_BINDING:
-      case GL_PIXEL_UNPACK_BUFFER_BINDING:
-        {
-            if (mExtensions.pixelBufferObject)
-            {
-                *type = GL_INT;
-                *numParams = 1;
-            }
-            else
-            {
-                return false;
-            }
-        }
-        return true;
</del><span class="cx">       case GL_MAX_VIEWPORT_DIMS:
</span><span class="cx">         {
</span><span class="cx">             *type = GL_INT;
</span><span class="lines">@@ -1123,8 +1352,89 @@
</span><span class="cx">         *type = GL_FLOAT;
</span><span class="cx">         *numParams = 1;
</span><span class="cx">         return true;
</span><ins>+      case GL_TIMESTAMP_EXT:
+          if (!mExtensions.disjointTimerQuery)
+          {
+              return false;
+          }
+          *type      = GL_INT_64_ANGLEX;
+          *numParams = 1;
+          return true;
+      case GL_GPU_DISJOINT_EXT:
+          if (!mExtensions.disjointTimerQuery)
+          {
+              return false;
+          }
+          *type      = GL_INT;
+          *numParams = 1;
+          return true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (mExtensions.debug)
+    {
+        switch (pname)
+        {
+            case GL_DEBUG_LOGGED_MESSAGES:
+            case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
+            case GL_DEBUG_GROUP_STACK_DEPTH:
+            case GL_MAX_DEBUG_MESSAGE_LENGTH:
+            case GL_MAX_DEBUG_LOGGED_MESSAGES:
+            case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
+            case GL_MAX_LABEL_LENGTH:
+                *type      = GL_INT;
+                *numParams = 1;
+                return true;
+
+            case GL_DEBUG_OUTPUT_SYNCHRONOUS:
+            case GL_DEBUG_OUTPUT:
+                *type      = GL_BOOL;
+                *numParams = 1;
+                return true;
+        }
+    }
+
+    // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
+    switch (pname)
+    {
+        case GL_PACK_ROW_LENGTH:
+        case GL_PACK_SKIP_ROWS:
+        case GL_PACK_SKIP_PIXELS:
+            if ((mClientVersion &lt; 3) &amp;&amp; !mExtensions.packSubimage)
+            {
+                return false;
+            }
+            *type      = GL_INT;
+            *numParams = 1;
+            return true;
+        case GL_UNPACK_ROW_LENGTH:
+        case GL_UNPACK_SKIP_ROWS:
+        case GL_UNPACK_SKIP_PIXELS:
+            if ((mClientVersion &lt; 3) &amp;&amp; !mExtensions.unpackSubimage)
+            {
+                return false;
+            }
+            *type      = GL_INT;
+            *numParams = 1;
+            return true;
+        case GL_VERTEX_ARRAY_BINDING:
+            if ((mClientVersion &lt; 3) &amp;&amp; !mExtensions.vertexArrayObject)
+            {
+                return false;
+            }
+            *type      = GL_INT;
+            *numParams = 1;
+            return true;
+        case GL_PIXEL_PACK_BUFFER_BINDING:
+        case GL_PIXEL_UNPACK_BUFFER_BINDING:
+            if ((mClientVersion &lt; 3) &amp;&amp; !mExtensions.pixelBufferObject)
+            {
+                return false;
+            }
+            *type      = GL_INT;
+            *numParams = 1;
+            return true;
+    }
+
</ins><span class="cx">     if (mClientVersion &lt; 3)
</span><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="lines">@@ -1140,6 +1450,8 @@
</span><span class="cx">       case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
</span><span class="cx">       case GL_COPY_READ_BUFFER_BINDING:
</span><span class="cx">       case GL_COPY_WRITE_BUFFER_BINDING:
</span><ins>+      case GL_SAMPLER_BINDING:
+      case GL_READ_BUFFER:
</ins><span class="cx">       case GL_TEXTURE_BINDING_3D:
</span><span class="cx">       case GL_TEXTURE_BINDING_2D_ARRAY:
</span><span class="cx">       case GL_MAX_3D_TEXTURE_SIZE:
</span><span class="lines">@@ -1147,10 +1459,13 @@
</span><span class="cx">       case GL_MAX_VERTEX_UNIFORM_BLOCKS:
</span><span class="cx">       case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
</span><span class="cx">       case GL_MAX_COMBINED_UNIFORM_BLOCKS:
</span><ins>+      case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
+      case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
</ins><span class="cx">       case GL_MAX_VARYING_COMPONENTS:
</span><del>-      case GL_VERTEX_ARRAY_BINDING:
</del><span class="cx">       case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
</span><span class="cx">       case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
</span><ins>+      case GL_MIN_PROGRAM_TEXEL_OFFSET:
+      case GL_MAX_PROGRAM_TEXEL_OFFSET:
</ins><span class="cx">       case GL_NUM_EXTENSIONS:
</span><span class="cx">       case GL_MAJOR_VERSION:
</span><span class="cx">       case GL_MINOR_VERSION:
</span><span class="lines">@@ -1159,6 +1474,8 @@
</span><span class="cx">       case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
</span><span class="cx">       case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
</span><span class="cx">       case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
</span><ins>+      case GL_UNPACK_IMAGE_HEIGHT:
+      case GL_UNPACK_SKIP_IMAGES:
</ins><span class="cx">         {
</span><span class="cx">             *type = GL_INT;
</span><span class="cx">             *numParams = 1;
</span><span class="lines">@@ -1178,11 +1495,20 @@
</span><span class="cx"> 
</span><span class="cx">       case GL_TRANSFORM_FEEDBACK_ACTIVE:
</span><span class="cx">       case GL_TRANSFORM_FEEDBACK_PAUSED:
</span><ins>+      case GL_PRIMITIVE_RESTART_FIXED_INDEX:
+      case GL_RASTERIZER_DISCARD:
</ins><span class="cx">         {
</span><span class="cx">             *type = GL_BOOL;
</span><span class="cx">             *numParams = 1;
</span><span class="cx">         }
</span><span class="cx">         return true;
</span><ins>+
+      case GL_MAX_TEXTURE_LOD_BIAS:
+        {
+            *type = GL_FLOAT;
+            *numParams = 1;
+        }
+        return true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return false;
</span><span class="lines">@@ -1217,18 +1543,69 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Context::drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances)
</del><ins>+Error Context::drawArrays(GLenum mode, GLint first, GLsizei count)
</ins><span class="cx"> {
</span><del>-    return mRenderer-&gt;drawArrays(getData(), mode, first, count, instances);
</del><ins>+    syncRendererState();
+    Error error = mRenderer-&gt;drawArrays(getData(), mode, first, count);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    MarkTransformFeedbackBufferUsage(mState.getCurrentTransformFeedback());
+
+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Context::drawElements(GLenum mode, GLsizei count, GLenum type,
-                            const GLvoid *indices, GLsizei instances,
-                            const rx::RangeUI &amp;indexRange)
</del><ins>+Error Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
</ins><span class="cx"> {
</span><del>-    return mRenderer-&gt;drawElements(getData(), mode, count, type, indices, instances, indexRange);
</del><ins>+    syncRendererState();
+    Error error = mRenderer-&gt;drawArraysInstanced(getData(), mode, first, count, instanceCount);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    MarkTransformFeedbackBufferUsage(mState.getCurrentTransformFeedback());
+
+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Error Context::drawElements(GLenum mode,
+                            GLsizei count,
+                            GLenum type,
+                            const GLvoid *indices,
+                            const IndexRange &amp;indexRange)
+{
+    syncRendererState();
+    return mRenderer-&gt;drawElements(getData(), mode, count, type, indices, indexRange);
+}
+
+Error Context::drawElementsInstanced(GLenum mode,
+                                     GLsizei count,
+                                     GLenum type,
+                                     const GLvoid *indices,
+                                     GLsizei instances,
+                                     const IndexRange &amp;indexRange)
+{
+    syncRendererState();
+    return mRenderer-&gt;drawElementsInstanced(getData(), mode, count, type, indices, instances,
+                                            indexRange);
+}
+
+Error Context::drawRangeElements(GLenum mode,
+                                 GLuint start,
+                                 GLuint end,
+                                 GLsizei count,
+                                 GLenum type,
+                                 const GLvoid *indices,
+                                 const IndexRange &amp;indexRange)
+{
+    syncRendererState();
+    return mRenderer-&gt;drawRangeElements(getData(), mode, start, end, count, type, indices,
+                                        indexRange);
+}
+
</ins><span class="cx"> Error Context::flush()
</span><span class="cx"> {
</span><span class="cx">     return mRenderer-&gt;flush();
</span><span class="lines">@@ -1239,11 +1616,36 @@
</span><span class="cx">     return mRenderer-&gt;finish();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Context::insertEventMarker(GLsizei length, const char *marker)
+{
+    ASSERT(mRenderer);
+    mRenderer-&gt;insertEventMarker(length, marker);
+}
+
+void Context::pushGroupMarker(GLsizei length, const char *marker)
+{
+    ASSERT(mRenderer);
+    mRenderer-&gt;pushGroupMarker(length, marker);
+}
+
+void Context::popGroupMarker()
+{
+    ASSERT(mRenderer);
+    mRenderer-&gt;popGroupMarker();
+}
+
</ins><span class="cx"> void Context::recordError(const Error &amp;error)
</span><span class="cx"> {
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         mErrors.insert(error.getCode());
</span><ins>+
+        if (!error.getMessage().empty())
+        {
+            auto &amp;debug = mState.getDebug();
+            debug.insertMessage(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, error.getID(),
+                                GL_DEBUG_SEVERITY_HIGH, error.getMessage());
+        }
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1296,16 +1698,11 @@
</span><span class="cx">     return (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-int Context::getClientVersion() const
</del><ins>+const egl::Config *Context::getConfig() const
</ins><span class="cx"> {
</span><del>-    return mClientVersion;
</del><ins>+    return mConfig;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-EGLint Context::getConfigID() const
-{
-    return mConfigID;
-}
-
</del><span class="cx"> EGLenum Context::getClientType() const
</span><span class="cx"> {
</span><span class="cx">     return mClientType;
</span><span class="lines">@@ -1313,27 +1710,79 @@
</span><span class="cx"> 
</span><span class="cx"> EGLenum Context::getRenderBuffer() const
</span><span class="cx"> {
</span><del>-    ASSERT(mFramebufferMap.count(0) &gt; 0);
-    const Framebuffer *framebuffer = mFramebufferMap.find(0)-&gt;second;
-    const FramebufferAttachment *backAttachment = framebuffer-&gt;getAttachment(GL_BACK);
-    return backAttachment ? backAttachment-&gt;getSurface()-&gt;getRenderBuffer() : EGL_NONE;
</del><ins>+    auto framebufferIt = mFramebufferMap.find(0);
+    if (framebufferIt != mFramebufferMap.end())
+    {
+        const Framebuffer *framebuffer              = framebufferIt-&gt;second;
+        const FramebufferAttachment *backAttachment = framebuffer-&gt;getAttachment(GL_BACK);
+
+        ASSERT(backAttachment != nullptr);
+        return backAttachment-&gt;getSurface()-&gt;getRenderBuffer();
+    }
+    else
+    {
+        return EGL_NONE;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const Caps &amp;Context::getCaps() const
</del><ins>+VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
</ins><span class="cx"> {
</span><del>-    return mCaps;
</del><ins>+    // Only called after a prior call to Gen.
+    VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
+    if (!vertexArray)
+    {
+        vertexArray                        = new VertexArray(mRenderer, vertexArrayHandle, MAX_VERTEX_ATTRIBS);
+        mVertexArrayMap[vertexArrayHandle] = vertexArray;
+    }
+
+    return vertexArray;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const TextureCapsMap &amp;Context::getTextureCaps() const
</del><ins>+TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
</ins><span class="cx"> {
</span><del>-    return mTextureCaps;
</del><ins>+    // Only called after a prior call to Gen.
+    TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
+    if (!transformFeedback)
+    {
+        transformFeedback = new TransformFeedback(mRenderer, transformFeedbackHandle, mCaps);
+        transformFeedback-&gt;addRef();
+        mTransformFeedbackMap[transformFeedbackHandle] = transformFeedback;
+    }
+
+    return transformFeedback;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const Extensions &amp;Context::getExtensions() const
</del><ins>+Framebuffer *Context::checkFramebufferAllocation(GLuint framebuffer)
</ins><span class="cx"> {
</span><del>-    return mExtensions;
</del><ins>+    // Can be called from Bind without a prior call to Gen.
+    auto framebufferIt = mFramebufferMap.find(framebuffer);
+    bool neverCreated = framebufferIt == mFramebufferMap.end();
+    if (neverCreated || framebufferIt-&gt;second == nullptr)
+    {
+        Framebuffer *newFBO = new Framebuffer(mCaps, mRenderer, framebuffer);
+        if (neverCreated)
+        {
+            mFramebufferHandleAllocator.reserve(framebuffer);
+            mFramebufferMap[framebuffer] = newFBO;
+            return newFBO;
+        }
+
+        framebufferIt-&gt;second = newFBO;
+    }
+
+    return framebufferIt-&gt;second;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Context::isVertexArrayGenerated(GLuint vertexArray)
+{
+    return mVertexArrayMap.find(vertexArray) != mVertexArrayMap.end();
+}
+
+bool Context::isTransformFeedbackGenerated(GLuint transformFeedback)
+{
+    return mTransformFeedbackMap.find(transformFeedback) != mTransformFeedbackMap.end();
+}
+
</ins><span class="cx"> void Context::detachTexture(GLuint texture)
</span><span class="cx"> {
</span><span class="cx">     // Simple pass-through to State's detachTexture method, as textures do not require
</span><span class="lines">@@ -1345,20 +1794,15 @@
</span><span class="cx"> 
</span><span class="cx"> void Context::detachBuffer(GLuint buffer)
</span><span class="cx"> {
</span><del>-    // Buffer detachment is handled by Context, because the buffer must also be
-    // attached from any VAOs in existence, and Context holds the VAO map.
</del><ins>+    // Simple pass-through to State's detachBuffer method, since
+    // only buffer attachments to container objects that are bound to the current context
+    // should be detached. And all those are available in State.
</ins><span class="cx"> 
</span><del>-    // [OpenGL ES 2.0.24] section 2.9 page 22:
-    // If a buffer object is deleted while it is bound, all bindings to that object in the current context
-    // (i.e. in the thread that called Delete-Buffers) are reset to zero.
-
-    mState.removeArrayBufferBinding(buffer);
-
-    // mark as freed among the vertex array objects
-    for (auto vaoIt = mVertexArrayMap.begin(); vaoIt != mVertexArrayMap.end(); vaoIt++)
-    {
-        vaoIt-&gt;second-&gt;detachBuffer(buffer);
-    }
</del><ins>+    // [OpenGL ES 3.2] section 5.1.2 page 45:
+    // Attachments to unbound container objects, such as
+    // deletion of a buffer attached to a vertex array object which is not bound to the context,
+    // are not affected and continue to act as references on the deleted object
+    mState.detachBuffer(buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Context::detachFramebuffer(GLuint framebuffer)
</span><span class="lines">@@ -1414,7 +1858,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Context::setVertexAttribDivisor(GLuint index, GLuint divisor)
</span><span class="cx"> {
</span><del>-    mState.getVertexArray()-&gt;setVertexAttribDivisor(index, divisor);
</del><ins>+    mState.setVertexAttribDivisor(index, divisor);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
</span><span class="lines">@@ -1424,19 +1868,22 @@
</span><span class="cx">     Sampler *samplerObject = getSampler(sampler);
</span><span class="cx">     ASSERT(samplerObject);
</span><span class="cx"> 
</span><ins>+    // clang-format off
</ins><span class="cx">     switch (pname)
</span><span class="cx">     {
</span><del>-      case GL_TEXTURE_MIN_FILTER:    samplerObject-&gt;setMinFilter(static_cast&lt;GLenum&gt;(param));       break;
-      case GL_TEXTURE_MAG_FILTER:    samplerObject-&gt;setMagFilter(static_cast&lt;GLenum&gt;(param));       break;
-      case GL_TEXTURE_WRAP_S:        samplerObject-&gt;setWrapS(static_cast&lt;GLenum&gt;(param));           break;
-      case GL_TEXTURE_WRAP_T:        samplerObject-&gt;setWrapT(static_cast&lt;GLenum&gt;(param));           break;
-      case GL_TEXTURE_WRAP_R:        samplerObject-&gt;setWrapR(static_cast&lt;GLenum&gt;(param));           break;
-      case GL_TEXTURE_MIN_LOD:       samplerObject-&gt;setMinLod(static_cast&lt;GLfloat&gt;(param));         break;
-      case GL_TEXTURE_MAX_LOD:       samplerObject-&gt;setMaxLod(static_cast&lt;GLfloat&gt;(param));         break;
-      case GL_TEXTURE_COMPARE_MODE:  samplerObject-&gt;setComparisonMode(static_cast&lt;GLenum&gt;(param));  break;
-      case GL_TEXTURE_COMPARE_FUNC:  samplerObject-&gt;setComparisonFunc(static_cast&lt;GLenum&gt;(param));  break;
-      default:                       UNREACHABLE(); break;
</del><ins>+      case GL_TEXTURE_MIN_FILTER:         samplerObject-&gt;setMinFilter(static_cast&lt;GLenum&gt;(param));    break;
+      case GL_TEXTURE_MAG_FILTER:         samplerObject-&gt;setMagFilter(static_cast&lt;GLenum&gt;(param));    break;
+      case GL_TEXTURE_WRAP_S:             samplerObject-&gt;setWrapS(static_cast&lt;GLenum&gt;(param));        break;
+      case GL_TEXTURE_WRAP_T:             samplerObject-&gt;setWrapT(static_cast&lt;GLenum&gt;(param));        break;
+      case GL_TEXTURE_WRAP_R:             samplerObject-&gt;setWrapR(static_cast&lt;GLenum&gt;(param));        break;
+      case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject-&gt;setMaxAnisotropy(std::min(static_cast&lt;GLfloat&gt;(param), getExtensions().maxTextureAnisotropy)); break;
+      case GL_TEXTURE_MIN_LOD:            samplerObject-&gt;setMinLod(static_cast&lt;GLfloat&gt;(param));      break;
+      case GL_TEXTURE_MAX_LOD:            samplerObject-&gt;setMaxLod(static_cast&lt;GLfloat&gt;(param));      break;
+      case GL_TEXTURE_COMPARE_MODE:       samplerObject-&gt;setCompareMode(static_cast&lt;GLenum&gt;(param));  break;
+      case GL_TEXTURE_COMPARE_FUNC:       samplerObject-&gt;setCompareFunc(static_cast&lt;GLenum&gt;(param));  break;
+      default:                            UNREACHABLE(); break;
</ins><span class="cx">     }
</span><ins>+    // clang-format on
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
</span><span class="lines">@@ -1446,19 +1893,22 @@
</span><span class="cx">     Sampler *samplerObject = getSampler(sampler);
</span><span class="cx">     ASSERT(samplerObject);
</span><span class="cx"> 
</span><ins>+    // clang-format off
</ins><span class="cx">     switch (pname)
</span><span class="cx">     {
</span><del>-      case GL_TEXTURE_MIN_FILTER:    samplerObject-&gt;setMinFilter(uiround&lt;GLenum&gt;(param));       break;
-      case GL_TEXTURE_MAG_FILTER:    samplerObject-&gt;setMagFilter(uiround&lt;GLenum&gt;(param));       break;
-      case GL_TEXTURE_WRAP_S:        samplerObject-&gt;setWrapS(uiround&lt;GLenum&gt;(param));           break;
-      case GL_TEXTURE_WRAP_T:        samplerObject-&gt;setWrapT(uiround&lt;GLenum&gt;(param));           break;
-      case GL_TEXTURE_WRAP_R:        samplerObject-&gt;setWrapR(uiround&lt;GLenum&gt;(param));           break;
-      case GL_TEXTURE_MIN_LOD:       samplerObject-&gt;setMinLod(param);                           break;
-      case GL_TEXTURE_MAX_LOD:       samplerObject-&gt;setMaxLod(param);                           break;
-      case GL_TEXTURE_COMPARE_MODE:  samplerObject-&gt;setComparisonMode(uiround&lt;GLenum&gt;(param));  break;
-      case GL_TEXTURE_COMPARE_FUNC:  samplerObject-&gt;setComparisonFunc(uiround&lt;GLenum&gt;(param));  break;
-      default:                       UNREACHABLE(); break;
</del><ins>+      case GL_TEXTURE_MIN_FILTER:         samplerObject-&gt;setMinFilter(uiround&lt;GLenum&gt;(param));   break;
+      case GL_TEXTURE_MAG_FILTER:         samplerObject-&gt;setMagFilter(uiround&lt;GLenum&gt;(param));   break;
+      case GL_TEXTURE_WRAP_S:             samplerObject-&gt;setWrapS(uiround&lt;GLenum&gt;(param));       break;
+      case GL_TEXTURE_WRAP_T:             samplerObject-&gt;setWrapT(uiround&lt;GLenum&gt;(param));       break;
+      case GL_TEXTURE_WRAP_R:             samplerObject-&gt;setWrapR(uiround&lt;GLenum&gt;(param));       break;
+      case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject-&gt;setMaxAnisotropy(std::min(param, getExtensions().maxTextureAnisotropy)); break;
+      case GL_TEXTURE_MIN_LOD:            samplerObject-&gt;setMinLod(param);                       break;
+      case GL_TEXTURE_MAX_LOD:            samplerObject-&gt;setMaxLod(param);                       break;
+      case GL_TEXTURE_COMPARE_MODE:       samplerObject-&gt;setCompareMode(uiround&lt;GLenum&gt;(param)); break;
+      case GL_TEXTURE_COMPARE_FUNC:       samplerObject-&gt;setCompareFunc(uiround&lt;GLenum&gt;(param)); break;
+      default:                            UNREACHABLE(); break;
</ins><span class="cx">     }
</span><ins>+    // clang-format on
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLint Context::getSamplerParameteri(GLuint sampler, GLenum pname)
</span><span class="lines">@@ -1468,19 +1918,22 @@
</span><span class="cx">     Sampler *samplerObject = getSampler(sampler);
</span><span class="cx">     ASSERT(samplerObject);
</span><span class="cx"> 
</span><ins>+    // clang-format off
</ins><span class="cx">     switch (pname)
</span><span class="cx">     {
</span><del>-      case GL_TEXTURE_MIN_FILTER:    return static_cast&lt;GLint&gt;(samplerObject-&gt;getMinFilter());
-      case GL_TEXTURE_MAG_FILTER:    return static_cast&lt;GLint&gt;(samplerObject-&gt;getMagFilter());
-      case GL_TEXTURE_WRAP_S:        return static_cast&lt;GLint&gt;(samplerObject-&gt;getWrapS());
-      case GL_TEXTURE_WRAP_T:        return static_cast&lt;GLint&gt;(samplerObject-&gt;getWrapT());
-      case GL_TEXTURE_WRAP_R:        return static_cast&lt;GLint&gt;(samplerObject-&gt;getWrapR());
-      case GL_TEXTURE_MIN_LOD:       return uiround&lt;GLint&gt;(samplerObject-&gt;getMinLod());
-      case GL_TEXTURE_MAX_LOD:       return uiround&lt;GLint&gt;(samplerObject-&gt;getMaxLod());
-      case GL_TEXTURE_COMPARE_MODE:  return static_cast&lt;GLint&gt;(samplerObject-&gt;getComparisonMode());
-      case GL_TEXTURE_COMPARE_FUNC:  return static_cast&lt;GLint&gt;(samplerObject-&gt;getComparisonFunc());
-      default:                       UNREACHABLE(); return 0;
</del><ins>+      case GL_TEXTURE_MIN_FILTER:         return static_cast&lt;GLint&gt;(samplerObject-&gt;getMinFilter());
+      case GL_TEXTURE_MAG_FILTER:         return static_cast&lt;GLint&gt;(samplerObject-&gt;getMagFilter());
+      case GL_TEXTURE_WRAP_S:             return static_cast&lt;GLint&gt;(samplerObject-&gt;getWrapS());
+      case GL_TEXTURE_WRAP_T:             return static_cast&lt;GLint&gt;(samplerObject-&gt;getWrapT());
+      case GL_TEXTURE_WRAP_R:             return static_cast&lt;GLint&gt;(samplerObject-&gt;getWrapR());
+      case GL_TEXTURE_MAX_ANISOTROPY_EXT: return static_cast&lt;GLint&gt;(samplerObject-&gt;getMaxAnisotropy());
+      case GL_TEXTURE_MIN_LOD:            return iround&lt;GLint&gt;(samplerObject-&gt;getMinLod());
+      case GL_TEXTURE_MAX_LOD:            return iround&lt;GLint&gt;(samplerObject-&gt;getMaxLod());
+      case GL_TEXTURE_COMPARE_MODE:       return static_cast&lt;GLint&gt;(samplerObject-&gt;getCompareMode());
+      case GL_TEXTURE_COMPARE_FUNC:       return static_cast&lt;GLint&gt;(samplerObject-&gt;getCompareFunc());
+      default:                            UNREACHABLE(); return 0;
</ins><span class="cx">     }
</span><ins>+    // clang-format on
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname)
</span><span class="lines">@@ -1490,21 +1943,33 @@
</span><span class="cx">     Sampler *samplerObject = getSampler(sampler);
</span><span class="cx">     ASSERT(samplerObject);
</span><span class="cx"> 
</span><ins>+    // clang-format off
</ins><span class="cx">     switch (pname)
</span><span class="cx">     {
</span><del>-      case GL_TEXTURE_MIN_FILTER:    return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getMinFilter());
-      case GL_TEXTURE_MAG_FILTER:    return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getMagFilter());
-      case GL_TEXTURE_WRAP_S:        return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getWrapS());
-      case GL_TEXTURE_WRAP_T:        return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getWrapT());
-      case GL_TEXTURE_WRAP_R:        return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getWrapR());
-      case GL_TEXTURE_MIN_LOD:       return samplerObject-&gt;getMinLod();
-      case GL_TEXTURE_MAX_LOD:       return samplerObject-&gt;getMaxLod();
-      case GL_TEXTURE_COMPARE_MODE:  return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getComparisonMode());
-      case GL_TEXTURE_COMPARE_FUNC:  return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getComparisonFunc());
-      default:                       UNREACHABLE(); return 0;
</del><ins>+      case GL_TEXTURE_MIN_FILTER:         return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getMinFilter());
+      case GL_TEXTURE_MAG_FILTER:         return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getMagFilter());
+      case GL_TEXTURE_WRAP_S:             return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getWrapS());
+      case GL_TEXTURE_WRAP_T:             return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getWrapT());
+      case GL_TEXTURE_WRAP_R:             return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getWrapR());
+      case GL_TEXTURE_MAX_ANISOTROPY_EXT: return samplerObject-&gt;getMaxAnisotropy();
+      case GL_TEXTURE_MIN_LOD:            return samplerObject-&gt;getMinLod();
+      case GL_TEXTURE_MAX_LOD:            return samplerObject-&gt;getMaxLod();
+      case GL_TEXTURE_COMPARE_MODE:       return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getCompareMode());
+      case GL_TEXTURE_COMPARE_FUNC:       return static_cast&lt;GLfloat&gt;(samplerObject-&gt;getCompareFunc());
+      default:                            UNREACHABLE(); return 0;
</ins><span class="cx">     }
</span><ins>+    // clang-format on
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Context::programParameteri(GLuint program, GLenum pname, GLint value)
+{
+    gl::Program *programObject = getProgram(program);
+    ASSERT(programObject != nullptr);
+
+    ASSERT(pname == GL_PROGRAM_BINARY_RETRIEVABLE_HINT);
+    programObject-&gt;setBinaryRetrievableHint(value != GL_FALSE);
+}
+
</ins><span class="cx"> void Context::initRendererString()
</span><span class="cx"> {
</span><span class="cx">     std::ostringstream rendererString;
</span><span class="lines">@@ -1544,12 +2009,35 @@
</span><span class="cx">     return mExtensionStrings.size();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Context::beginTransformFeedback(GLenum primitiveMode)
+{
+    TransformFeedback *transformFeedback = getState().getCurrentTransformFeedback();
+    ASSERT(transformFeedback != nullptr);
+    ASSERT(!transformFeedback-&gt;isPaused());
+
+    transformFeedback-&gt;begin(primitiveMode, getState().getProgram());
+}
+
+bool Context::hasActiveTransformFeedback(GLuint program) const
+{
+    for (auto pair : mTransformFeedbackMap)
+    {
+        if (pair.second != nullptr &amp;&amp; pair.second-&gt;hasBoundProgram(program))
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
</ins><span class="cx"> void Context::initCaps(GLuint clientVersion)
</span><span class="cx"> {
</span><span class="cx">     mCaps = mRenderer-&gt;getRendererCaps();
</span><span class="cx"> 
</span><span class="cx">     mExtensions = mRenderer-&gt;getRendererExtensions();
</span><span class="cx"> 
</span><ins>+    mLimitations = mRenderer-&gt;getRendererLimitations();
+
</ins><span class="cx">     if (clientVersion &lt; 3)
</span><span class="cx">     {
</span><span class="cx">         // Disable ES3+ extensions
</span><span class="lines">@@ -1562,6 +2050,13 @@
</span><span class="cx">         //mExtensions.sRGB = false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Explicitly enable GL_KHR_debug
+    mExtensions.debug                   = true;
+    mExtensions.maxDebugMessageLength   = 1024;
+    mExtensions.maxDebugLoggedMessages  = 1024;
+    mExtensions.maxDebugGroupStackDepth = 1024;
+    mExtensions.maxLabelLength          = 1024;
+
</ins><span class="cx">     // Apply implementation limits
</span><span class="cx">     mCaps.maxVertexAttributes = std::min&lt;GLuint&gt;(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
</span><span class="cx">     mCaps.maxVertexUniformBlocks = std::min&lt;GLuint&gt;(mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
</span><span class="lines">@@ -1579,10 +2074,15 @@
</span><span class="cx"> 
</span><span class="cx">         const InternalFormat &amp;formatInfo = GetInternalFormatInfo(format);
</span><span class="cx"> 
</span><del>-        // Update the format caps based on the client version and extensions
-        formatCaps.texturable = formatInfo.textureSupport(clientVersion, mExtensions);
-        formatCaps.renderable = formatInfo.renderSupport(clientVersion, mExtensions);
-        formatCaps.filterable = formatInfo.filterSupport(clientVersion, mExtensions);
</del><ins>+        // Update the format caps based on the client version and extensions.
+        // Caps are AND'd with the renderer caps because some core formats are still unsupported in
+        // ES3.
+        formatCaps.texturable =
+            formatCaps.texturable &amp;&amp; formatInfo.textureSupport(clientVersion, mExtensions);
+        formatCaps.renderable =
+            formatCaps.renderable &amp;&amp; formatInfo.renderSupport(clientVersion, mExtensions);
+        formatCaps.filterable =
+            formatCaps.filterable &amp;&amp; formatInfo.filterSupport(clientVersion, mExtensions);
</ins><span class="cx"> 
</span><span class="cx">         // OpenGL ES does not support multisampling with integer formats
</span><span class="cx">         if (!formatInfo.renderSupport || formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)
</span><span class="lines">@@ -1599,4 +2099,678 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Context::syncRendererState()
+{
+    const State::DirtyBits &amp;dirtyBits = mState.getDirtyBits();
+    mRenderer-&gt;syncState(mState, dirtyBits);
+    mState.clearDirtyBits();
+    mState.syncDirtyObjects();
</ins><span class="cx"> }
</span><ins>+
+void Context::syncRendererState(const State::DirtyBits &amp;bitMask,
+                                const State::DirtyObjects &amp;objectMask)
+{
+    const State::DirtyBits &amp;dirtyBits = (mState.getDirtyBits() &amp; bitMask);
+    mRenderer-&gt;syncState(mState, dirtyBits);
+    mState.clearDirtyBits(dirtyBits);
+
+    mState.syncDirtyObjects(objectMask);
+}
+
+void Context::blitFramebuffer(GLint srcX0,
+                              GLint srcY0,
+                              GLint srcX1,
+                              GLint srcY1,
+                              GLint dstX0,
+                              GLint dstY0,
+                              GLint dstX1,
+                              GLint dstY1,
+                              GLbitfield mask,
+                              GLenum filter)
+{
+    Framebuffer *readFramebuffer = mState.getReadFramebuffer();
+    ASSERT(readFramebuffer);
+
+    Framebuffer *drawFramebuffer = mState.getDrawFramebuffer();
+    ASSERT(drawFramebuffer);
+
+    Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
+    Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
+
+    syncStateForBlit();
+
+    Error error = drawFramebuffer-&gt;blit(mState, srcArea, dstArea, mask, filter, readFramebuffer);
+    if (error.isError())
+    {
+        recordError(error);
+        return;
+    }
+}
+
+void Context::clear(GLbitfield mask)
+{
+    syncStateForClear();
+
+    Error error = mState.getDrawFramebuffer()-&gt;clear(mData, mask);
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
+{
+    syncStateForClear();
+
+    Error error = mState.getDrawFramebuffer()-&gt;clearBufferfv(mData, buffer, drawbuffer, values);
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
+{
+    syncStateForClear();
+
+    Error error = mState.getDrawFramebuffer()-&gt;clearBufferuiv(mData, buffer, drawbuffer, values);
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
+{
+    syncStateForClear();
+
+    Error error = mState.getDrawFramebuffer()-&gt;clearBufferiv(mData, buffer, drawbuffer, values);
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+    Framebuffer *framebufferObject = mState.getDrawFramebuffer();
+    ASSERT(framebufferObject);
+
+    // If a buffer is not present, the clear has no effect
+    if (framebufferObject-&gt;getDepthbuffer() == nullptr &amp;&amp;
+        framebufferObject-&gt;getStencilbuffer() == nullptr)
+    {
+        return;
+    }
+
+    syncStateForClear();
+
+    Error error = framebufferObject-&gt;clearBufferfi(mData, buffer, drawbuffer, depth, stencil);
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::readPixels(GLint x,
+                         GLint y,
+                         GLsizei width,
+                         GLsizei height,
+                         GLenum format,
+                         GLenum type,
+                         GLvoid *pixels)
+{
+    syncStateForReadPixels();
+
+    Framebuffer *framebufferObject = mState.getReadFramebuffer();
+    ASSERT(framebufferObject);
+
+    Rectangle area(x, y, width, height);
+    Error error = framebufferObject-&gt;readPixels(mState, area, format, type, pixels);
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::copyTexImage2D(GLenum target,
+                             GLint level,
+                             GLenum internalformat,
+                             GLint x,
+                             GLint y,
+                             GLsizei width,
+                             GLsizei height,
+                             GLint border)
+{
+    // Only sync the read FBO
+    mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
+
+    Rectangle sourceArea(x, y, width, height);
+
+    const Framebuffer *framebuffer = mState.getReadFramebuffer();
+    Texture *texture =
+        getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
+    Error error = texture-&gt;copyImage(target, level, sourceArea, internalformat, framebuffer);
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::copyTexSubImage2D(GLenum target,
+                                GLint level,
+                                GLint xoffset,
+                                GLint yoffset,
+                                GLint x,
+                                GLint y,
+                                GLsizei width,
+                                GLsizei height)
+{
+    // Only sync the read FBO
+    mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
+
+    Offset destOffset(xoffset, yoffset, 0);
+    Rectangle sourceArea(x, y, width, height);
+
+    const Framebuffer *framebuffer = mState.getReadFramebuffer();
+    Texture *texture =
+        getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
+    Error error = texture-&gt;copySubImage(target, level, destOffset, sourceArea, framebuffer);
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::copyTexSubImage3D(GLenum target,
+                                GLint level,
+                                GLint xoffset,
+                                GLint yoffset,
+                                GLint zoffset,
+                                GLint x,
+                                GLint y,
+                                GLsizei width,
+                                GLsizei height)
+{
+    // Only sync the read FBO
+    mState.syncDirtyObject(GL_READ_FRAMEBUFFER);
+
+    Offset destOffset(xoffset, yoffset, zoffset);
+    Rectangle sourceArea(x, y, width, height);
+
+    const Framebuffer *framebuffer = mState.getReadFramebuffer();
+    Texture *texture               = getTargetTexture(target);
+    Error error = texture-&gt;copySubImage(target, level, destOffset, sourceArea, framebuffer);
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::framebufferTexture2D(GLenum target,
+                                   GLenum attachment,
+                                   GLenum textarget,
+                                   GLuint texture,
+                                   GLint level)
+{
+    Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
+    ASSERT(framebuffer);
+
+    if (texture != 0)
+    {
+        Texture *textureObj = getTexture(texture);
+
+        ImageIndex index = ImageIndex::MakeInvalid();
+
+        if (textarget == GL_TEXTURE_2D)
+        {
+            index = ImageIndex::Make2D(level);
+        }
+        else
+        {
+            ASSERT(IsCubeMapTextureTarget(textarget));
+            index = ImageIndex::MakeCube(textarget, level);
+        }
+
+        framebuffer-&gt;setAttachment(GL_TEXTURE, attachment, index, textureObj);
+    }
+    else
+    {
+        framebuffer-&gt;resetAttachment(attachment);
+    }
+
+    mState.setObjectDirty(target);
+}
+
+void Context::framebufferRenderbuffer(GLenum target,
+                                      GLenum attachment,
+                                      GLenum renderbuffertarget,
+                                      GLuint renderbuffer)
+{
+    Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
+    ASSERT(framebuffer);
+
+    if (renderbuffer != 0)
+    {
+        Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
+        framebuffer-&gt;setAttachment(GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
+                                   renderbufferObject);
+    }
+    else
+    {
+        framebuffer-&gt;resetAttachment(attachment);
+    }
+
+    mState.setObjectDirty(target);
+}
+
+void Context::framebufferTextureLayer(GLenum target,
+                                      GLenum attachment,
+                                      GLuint texture,
+                                      GLint level,
+                                      GLint layer)
+{
+    Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
+    ASSERT(framebuffer);
+
+    if (texture != 0)
+    {
+        Texture *textureObject = getTexture(texture);
+
+        ImageIndex index = ImageIndex::MakeInvalid();
+
+        if (textureObject-&gt;getTarget() == GL_TEXTURE_3D)
+        {
+            index = ImageIndex::Make3D(level, layer);
+        }
+        else
+        {
+            ASSERT(textureObject-&gt;getTarget() == GL_TEXTURE_2D_ARRAY);
+            index = ImageIndex::Make2DArray(level, layer);
+        }
+
+        framebuffer-&gt;setAttachment(GL_TEXTURE, attachment, index, textureObject);
+    }
+    else
+    {
+        framebuffer-&gt;resetAttachment(attachment);
+    }
+
+    mState.setObjectDirty(target);
+}
+
+void Context::drawBuffers(GLsizei n, const GLenum *bufs)
+{
+    Framebuffer *framebuffer = mState.getDrawFramebuffer();
+    ASSERT(framebuffer);
+    framebuffer-&gt;setDrawBuffers(n, bufs);
+    mState.setObjectDirty(GL_DRAW_FRAMEBUFFER);
+}
+
+void Context::readBuffer(GLenum mode)
+{
+    Framebuffer *readFBO = mState.getReadFramebuffer();
+    readFBO-&gt;setReadBuffer(mode);
+    mState.setObjectDirty(GL_READ_FRAMEBUFFER);
+}
+
+void Context::discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+    // Only sync the FBO
+    mState.syncDirtyObject(target);
+
+    Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
+    ASSERT(framebuffer);
+
+    // The specification isn't clear what should be done when the framebuffer isn't complete.
+    // We leave it up to the framebuffer implementation to decide what to do.
+    Error error = framebuffer-&gt;discard(numAttachments, attachments);
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::invalidateFramebuffer(GLenum target,
+                                    GLsizei numAttachments,
+                                    const GLenum *attachments)
+{
+    // Only sync the FBO
+    mState.syncDirtyObject(target);
+
+    Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
+    ASSERT(framebuffer);
+
+    if (framebuffer-&gt;checkStatus(mData) == GL_FRAMEBUFFER_COMPLETE)
+    {
+        Error error = framebuffer-&gt;invalidate(numAttachments, attachments);
+        if (error.isError())
+        {
+            recordError(error);
+            return;
+        }
+    }
+}
+
+void Context::invalidateSubFramebuffer(GLenum target,
+                                       GLsizei numAttachments,
+                                       const GLenum *attachments,
+                                       GLint x,
+                                       GLint y,
+                                       GLsizei width,
+                                       GLsizei height)
+{
+    // Only sync the FBO
+    mState.syncDirtyObject(target);
+
+    Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
+    ASSERT(framebuffer);
+
+    if (framebuffer-&gt;checkStatus(mData) == GL_FRAMEBUFFER_COMPLETE)
+    {
+        Rectangle area(x, y, width, height);
+        Error error = framebuffer-&gt;invalidateSub(numAttachments, attachments, area);
+        if (error.isError())
+        {
+            recordError(error);
+            return;
+        }
+    }
+}
+
+void Context::texImage2D(GLenum target,
+                         GLint level,
+                         GLint internalformat,
+                         GLsizei width,
+                         GLsizei height,
+                         GLint border,
+                         GLenum format,
+                         GLenum type,
+                         const GLvoid *pixels)
+{
+    syncStateForTexImage();
+
+    Extents size(width, height, 1);
+    Texture *texture =
+        getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
+    Error error = texture-&gt;setImage(mState.getUnpackState(), target, level, internalformat, size,
+                                    format, type, reinterpret_cast&lt;const uint8_t *&gt;(pixels));
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::texImage3D(GLenum target,
+                         GLint level,
+                         GLint internalformat,
+                         GLsizei width,
+                         GLsizei height,
+                         GLsizei depth,
+                         GLint border,
+                         GLenum format,
+                         GLenum type,
+                         const GLvoid *pixels)
+{
+    syncStateForTexImage();
+
+    Extents size(width, height, depth);
+    Texture *texture = getTargetTexture(target);
+    Error error = texture-&gt;setImage(mState.getUnpackState(), target, level, internalformat, size,
+                                    format, type, reinterpret_cast&lt;const uint8_t *&gt;(pixels));
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::texSubImage2D(GLenum target,
+                            GLint level,
+                            GLint xoffset,
+                            GLint yoffset,
+                            GLsizei width,
+                            GLsizei height,
+                            GLenum format,
+                            GLenum type,
+                            const GLvoid *pixels)
+{
+    // Zero sized uploads are valid but no-ops
+    if (width == 0 || height == 0)
+    {
+        return;
+    }
+
+    syncStateForTexImage();
+
+    Box area(xoffset, yoffset, 0, width, height, 1);
+    Texture *texture =
+        getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
+    Error error = texture-&gt;setSubImage(mState.getUnpackState(), target, level, area, format, type,
+                                       reinterpret_cast&lt;const uint8_t *&gt;(pixels));
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::texSubImage3D(GLenum target,
+                            GLint level,
+                            GLint xoffset,
+                            GLint yoffset,
+                            GLint zoffset,
+                            GLsizei width,
+                            GLsizei height,
+                            GLsizei depth,
+                            GLenum format,
+                            GLenum type,
+                            const GLvoid *pixels)
+{
+    // Zero sized uploads are valid but no-ops
+    if (width == 0 || height == 0 || depth == 0)
+    {
+        return;
+    }
+
+    syncStateForTexImage();
+
+    Box area(xoffset, yoffset, zoffset, width, height, depth);
+    Texture *texture = getTargetTexture(target);
+    Error error = texture-&gt;setSubImage(mState.getUnpackState(), target, level, area, format, type,
+                                       reinterpret_cast&lt;const uint8_t *&gt;(pixels));
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::compressedTexImage2D(GLenum target,
+                                   GLint level,
+                                   GLenum internalformat,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLint border,
+                                   GLsizei imageSize,
+                                   const GLvoid *data)
+{
+    syncStateForTexImage();
+
+    Extents size(width, height, 1);
+    Texture *texture =
+        getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
+    Error error =
+        texture-&gt;setCompressedImage(mState.getUnpackState(), target, level, internalformat, size,
+                                    imageSize, reinterpret_cast&lt;const uint8_t *&gt;(data));
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::compressedTexImage3D(GLenum target,
+                                   GLint level,
+                                   GLenum internalformat,
+                                   GLsizei width,
+                                   GLsizei height,
+                                   GLsizei depth,
+                                   GLint border,
+                                   GLsizei imageSize,
+                                   const GLvoid *data)
+{
+    syncStateForTexImage();
+
+    Extents size(width, height, depth);
+    Texture *texture = getTargetTexture(target);
+    Error error =
+        texture-&gt;setCompressedImage(mState.getUnpackState(), target, level, internalformat, size,
+                                    imageSize, reinterpret_cast&lt;const uint8_t *&gt;(data));
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::compressedTexSubImage2D(GLenum target,
+                                      GLint level,
+                                      GLint xoffset,
+                                      GLint yoffset,
+                                      GLsizei width,
+                                      GLsizei height,
+                                      GLenum format,
+                                      GLsizei imageSize,
+                                      const GLvoid *data)
+{
+    syncStateForTexImage();
+
+    Box area(xoffset, yoffset, 0, width, height, 1);
+    Texture *texture =
+        getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
+    Error error =
+        texture-&gt;setCompressedSubImage(mState.getUnpackState(), target, level, area, format,
+                                       imageSize, reinterpret_cast&lt;const uint8_t *&gt;(data));
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::compressedTexSubImage3D(GLenum target,
+                                      GLint level,
+                                      GLint xoffset,
+                                      GLint yoffset,
+                                      GLint zoffset,
+                                      GLsizei width,
+                                      GLsizei height,
+                                      GLsizei depth,
+                                      GLenum format,
+                                      GLsizei imageSize,
+                                      const GLvoid *data)
+{
+    // Zero sized uploads are valid but no-ops
+    if (width == 0 || height == 0)
+    {
+        return;
+    }
+
+    syncStateForTexImage();
+
+    Box area(xoffset, yoffset, zoffset, width, height, depth);
+    Texture *texture = getTargetTexture(target);
+    Error error =
+        texture-&gt;setCompressedSubImage(mState.getUnpackState(), target, level, area, format,
+                                       imageSize, reinterpret_cast&lt;const uint8_t *&gt;(data));
+    if (error.isError())
+    {
+        recordError(error);
+    }
+}
+
+void Context::getBufferPointerv(GLenum target, GLenum /*pname*/, void **params)
+{
+    Buffer *buffer = getState().getTargetBuffer(target);
+    ASSERT(buffer);
+
+    if (!buffer-&gt;isMapped())
+    {
+        *params = nullptr;
+    }
+    else
+    {
+        *params = buffer-&gt;getMapPointer();
+    }
+}
+
+GLvoid *Context::mapBuffer(GLenum target, GLenum access)
+{
+    Buffer *buffer = getState().getTargetBuffer(target);
+    ASSERT(buffer);
+
+    Error error = buffer-&gt;map(access);
+    if (error.isError())
+    {
+        recordError(error);
+        return nullptr;
+    }
+
+    return buffer-&gt;getMapPointer();
+}
+
+GLboolean Context::unmapBuffer(GLenum target)
+{
+    Buffer *buffer = getState().getTargetBuffer(target);
+    ASSERT(buffer);
+
+    GLboolean result;
+    Error error = buffer-&gt;unmap(&amp;result);
+    if (error.isError())
+    {
+        recordError(error);
+        return GL_FALSE;
+    }
+
+    return result;
+}
+
+GLvoid *Context::mapBufferRange(GLenum target,
+                                GLintptr offset,
+                                GLsizeiptr length,
+                                GLbitfield access)
+{
+    Buffer *buffer = getState().getTargetBuffer(target);
+    ASSERT(buffer);
+
+    Error error = buffer-&gt;mapRange(offset, length, access);
+    if (error.isError())
+    {
+        recordError(error);
+        return nullptr;
+    }
+
+    return buffer-&gt;getMapPointer();
+}
+
+void Context::flushMappedBufferRange(GLenum /*target*/, GLintptr /*offset*/, GLsizeiptr /*length*/)
+{
+    // We do not currently support a non-trivial implementation of FlushMappedBufferRange
+}
+
+void Context::syncStateForReadPixels()
+{
+    syncRendererState(mReadPixelsDirtyBits, mReadPixelsDirtyObjects);
+}
+
+void Context::syncStateForTexImage()
+{
+    syncRendererState(mTexImageDirtyBits, mTexImageDirtyObjects);
+}
+
+void Context::syncStateForClear()
+{
+    syncRendererState(mClearDirtyBits, mClearDirtyObjects);
+}
+
+void Context::syncStateForBlit()
+{
+    syncRendererState(mBlitDirtyBits, mBlitDirtyObjects);
+}
+
+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Context.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Context.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Context.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,6 +10,10 @@
</span><span class="cx"> #ifndef LIBANGLE_CONTEXT_H_
</span><span class="cx"> #define LIBANGLE_CONTEXT_H_
</span><span class="cx"> 
</span><ins>+#include &lt;set&gt;
+#include &lt;string&gt;
+
+#include &quot;angle_gl.h&quot;
</ins><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/RefCountObject.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Caps.h&quot;
</span><span class="lines">@@ -20,12 +24,6 @@
</span><span class="cx"> #include &quot;libANGLE/VertexAttribute.h&quot;
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;angle_gl.h&quot;
-
-#include &lt;string&gt;
-#include &lt;set&gt;
-#include &lt;map&gt;
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class Renderer;
</span><span class="lines">@@ -33,6 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace egl
</span><span class="cx"> {
</span><ins>+class AttributeMap;
</ins><span class="cx"> class Surface;
</span><span class="cx"> struct Config;
</span><span class="cx"> }
</span><span class="lines">@@ -55,10 +54,13 @@
</span><span class="cx"> class Sampler;
</span><span class="cx"> class TransformFeedback;
</span><span class="cx"> 
</span><del>-class Context final : angle::NonCopyable
</del><ins>+class Context final : public ValidationContext
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    Context(const egl::Config *config, int clientVersion, const Context *shareContext, rx::Renderer *renderer, bool notifyResets, bool robustAccess);
</del><ins>+    Context(const egl::Config *config,
+            const Context *shareContext,
+            rx::Renderer *renderer,
+            const egl::AttributeMap &amp;attribs);
</ins><span class="cx"> 
</span><span class="cx">     virtual ~Context();
</span><span class="cx"> 
</span><span class="lines">@@ -104,27 +106,39 @@
</span><span class="cx">     GLuint createVertexArray();
</span><span class="cx">     void deleteVertexArray(GLuint vertexArray);
</span><span class="cx"> 
</span><del>-    void bindArrayBuffer(GLuint buffer);
-    void bindElementArrayBuffer(GLuint buffer);
</del><ins>+    void bindArrayBuffer(GLuint bufferHandle);
+    void bindElementArrayBuffer(GLuint bufferHandle);
</ins><span class="cx">     void bindTexture(GLenum target, GLuint handle);
</span><del>-    void bindReadFramebuffer(GLuint framebuffer);
-    void bindDrawFramebuffer(GLuint framebuffer);
-    void bindRenderbuffer(GLuint renderbuffer);
-    void bindVertexArray(GLuint vertexArray);
-    void bindSampler(GLuint textureUnit, GLuint sampler);
-    void bindGenericUniformBuffer(GLuint buffer);
-    void bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
-    void bindGenericTransformFeedbackBuffer(GLuint buffer);
-    void bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
-    void bindCopyReadBuffer(GLuint buffer);
-    void bindCopyWriteBuffer(GLuint buffer);
-    void bindPixelPackBuffer(GLuint buffer);
-    void bindPixelUnpackBuffer(GLuint buffer);
</del><ins>+    void bindReadFramebuffer(GLuint framebufferHandle);
+    void bindDrawFramebuffer(GLuint framebufferHandle);
+    void bindRenderbuffer(GLuint renderbufferHandle);
+    void bindVertexArray(GLuint vertexArrayHandle);
+    void bindSampler(GLuint textureUnit, GLuint samplerHandle);
+    void bindGenericUniformBuffer(GLuint bufferHandle);
+    void bindIndexedUniformBuffer(GLuint bufferHandle,
+                                  GLuint index,
+                                  GLintptr offset,
+                                  GLsizeiptr size);
+    void bindGenericTransformFeedbackBuffer(GLuint bufferHandle);
+    void bindIndexedTransformFeedbackBuffer(GLuint bufferHandle,
+                                            GLuint index,
+                                            GLintptr offset,
+                                            GLsizeiptr size);
+    void bindCopyReadBuffer(GLuint bufferHandle);
+    void bindCopyWriteBuffer(GLuint bufferHandle);
+    void bindPixelPackBuffer(GLuint bufferHandle);
+    void bindPixelUnpackBuffer(GLuint bufferHandle);
</ins><span class="cx">     void useProgram(GLuint program);
</span><del>-    void bindTransformFeedback(GLuint transformFeedback);
</del><ins>+    void bindTransformFeedback(GLuint transformFeedbackHandle);
</ins><span class="cx"> 
</span><span class="cx">     Error beginQuery(GLenum target, GLuint query);
</span><span class="cx">     Error endQuery(GLenum target);
</span><ins>+    Error queryCounter(GLuint id, GLenum target);
+    void getQueryiv(GLenum target, GLenum pname, GLint *params);
+    Error getQueryObjectiv(GLuint id, GLenum pname, GLint *params);
+    Error getQueryObjectuiv(GLuint id, GLenum pname, GLuint *params);
+    Error getQueryObjecti64v(GLuint id, GLenum pname, GLint64 *params);
+    Error getQueryObjectui64v(GLuint id, GLenum pname, GLuint64 *params);
</ins><span class="cx"> 
</span><span class="cx">     void setVertexAttribDivisor(GLuint index, GLuint divisor);
</span><span class="cx"> 
</span><span class="lines">@@ -133,18 +147,23 @@
</span><span class="cx">     GLint getSamplerParameteri(GLuint sampler, GLenum pname);
</span><span class="cx">     GLfloat getSamplerParameterf(GLuint sampler, GLenum pname);
</span><span class="cx"> 
</span><del>-    Buffer *getBuffer(GLuint handle);
</del><ins>+    void programParameteri(GLuint program, GLenum pname, GLint value);
+
+    Buffer *getBuffer(GLuint handle) const;
</ins><span class="cx">     FenceNV *getFenceNV(GLuint handle);
</span><span class="cx">     FenceSync *getFenceSync(GLsync handle) const;
</span><span class="cx">     Shader *getShader(GLuint handle) const;
</span><span class="cx">     Program *getProgram(GLuint handle) const;
</span><span class="cx">     Texture *getTexture(GLuint handle) const;
</span><span class="cx">     Framebuffer *getFramebuffer(GLuint handle) const;
</span><del>-    Renderbuffer *getRenderbuffer(GLuint handle);
</del><ins>+    Renderbuffer *getRenderbuffer(GLuint handle) const;
</ins><span class="cx">     VertexArray *getVertexArray(GLuint handle) const;
</span><span class="cx">     Sampler *getSampler(GLuint handle) const;
</span><span class="cx">     Query *getQuery(GLuint handle, bool create, GLenum type);
</span><ins>+    Query *getQuery(GLuint handle) const;
</ins><span class="cx">     TransformFeedback *getTransformFeedback(GLuint handle) const;
</span><ins>+    LabeledObject *getLabeledObject(GLenum identifier, GLuint name) const;
+    LabeledObject *getLabeledObjectFromPtr(const void *ptr) const;
</ins><span class="cx"> 
</span><span class="cx">     Texture *getTargetTexture(GLenum target) const;
</span><span class="cx">     Texture *getSamplerTexture(unsigned int sampler, GLenum type) const;
</span><span class="lines">@@ -153,10 +172,14 @@
</span><span class="cx"> 
</span><span class="cx">     bool isSampler(GLuint samplerName) const;
</span><span class="cx"> 
</span><ins>+    bool isVertexArrayGenerated(GLuint vertexArray);
+    bool isTransformFeedbackGenerated(GLuint vertexArray);
+
</ins><span class="cx">     void getBooleanv(GLenum pname, GLboolean *params);
</span><span class="cx">     void getFloatv(GLenum pname, GLfloat *params);
</span><span class="cx">     void getIntegerv(GLenum pname, GLint *params);
</span><span class="cx">     void getInteger64v(GLenum pname, GLint64 *params);
</span><ins>+    void getPointerv(GLenum pname, void **params) const;
</ins><span class="cx"> 
</span><span class="cx">     bool getIndexedIntegerv(GLenum target, GLuint index, GLint *data);
</span><span class="cx">     bool getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data);
</span><span class="lines">@@ -164,29 +187,215 @@
</span><span class="cx">     bool getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams);
</span><span class="cx">     bool getIndexedQueryParameterInfo(GLenum target, GLenum *type, unsigned int *numParams);
</span><span class="cx"> 
</span><del>-    Error drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instances);
-    Error drawElements(GLenum mode, GLsizei count, GLenum type,
-                       const GLvoid *indices, GLsizei instances,
-                       const rx::RangeUI &amp;indexRange);
</del><ins>+    void clear(GLbitfield mask);
+    void clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values);
+    void clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values);
+    void clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values);
+    void clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+
+    Error drawArrays(GLenum mode, GLint first, GLsizei count);
+    Error drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
+
+    Error drawElements(GLenum mode,
+                       GLsizei count,
+                       GLenum type,
+                       const GLvoid *indices,
+                       const IndexRange &amp;indexRange);
+    Error drawElementsInstanced(GLenum mode,
+                                GLsizei count,
+                                GLenum type,
+                                const GLvoid *indices,
+                                GLsizei instances,
+                                const IndexRange &amp;indexRange);
+    Error drawRangeElements(GLenum mode,
+                            GLuint start,
+                            GLuint end,
+                            GLsizei count,
+                            GLenum type,
+                            const GLvoid *indices,
+                            const IndexRange &amp;indexRange);
+
+    void blitFramebuffer(GLint srcX0,
+                         GLint srcY0,
+                         GLint srcX1,
+                         GLint srcY1,
+                         GLint dstX0,
+                         GLint dstY0,
+                         GLint dstX1,
+                         GLint dstY1,
+                         GLbitfield mask,
+                         GLenum filter);
+
+    void readPixels(GLint x,
+                    GLint y,
+                    GLsizei width,
+                    GLsizei height,
+                    GLenum format,
+                    GLenum type,
+                    GLvoid *pixels);
+
+    void copyTexImage2D(GLenum target,
+                        GLint level,
+                        GLenum internalformat,
+                        GLint x,
+                        GLint y,
+                        GLsizei width,
+                        GLsizei height,
+                        GLint border);
+
+    void copyTexSubImage2D(GLenum target,
+                           GLint level,
+                           GLint xoffset,
+                           GLint yoffset,
+                           GLint x,
+                           GLint y,
+                           GLsizei width,
+                           GLsizei height);
+
+    void copyTexSubImage3D(GLenum target,
+                           GLint level,
+                           GLint xoffset,
+                           GLint yoffset,
+                           GLint zoffset,
+                           GLint x,
+                           GLint y,
+                           GLsizei width,
+                           GLsizei height);
+
+    void framebufferTexture2D(GLenum target,
+                              GLenum attachment,
+                              GLenum textarget,
+                              GLuint texture,
+                              GLint level);
+
+    void framebufferRenderbuffer(GLenum target,
+                                 GLenum attachment,
+                                 GLenum renderbuffertarget,
+                                 GLuint renderbuffer);
+
+    void framebufferTextureLayer(GLenum target,
+                                 GLenum attachment,
+                                 GLuint texture,
+                                 GLint level,
+                                 GLint layer);
+
+    void drawBuffers(GLsizei n, const GLenum *bufs);
+    void readBuffer(GLenum mode);
+
+    void discardFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+    void invalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+    void invalidateSubFramebuffer(GLenum target,
+                                  GLsizei numAttachments,
+                                  const GLenum *attachments,
+                                  GLint x,
+                                  GLint y,
+                                  GLsizei width,
+                                  GLsizei height);
+
+    void texImage2D(GLenum target,
+                    GLint level,
+                    GLint internalformat,
+                    GLsizei width,
+                    GLsizei height,
+                    GLint border,
+                    GLenum format,
+                    GLenum type,
+                    const GLvoid *pixels);
+    void texImage3D(GLenum target,
+                    GLint level,
+                    GLint internalformat,
+                    GLsizei width,
+                    GLsizei height,
+                    GLsizei depth,
+                    GLint border,
+                    GLenum format,
+                    GLenum type,
+                    const GLvoid *pixels);
+    void texSubImage2D(GLenum target,
+                       GLint level,
+                       GLint xoffset,
+                       GLint yoffset,
+                       GLsizei width,
+                       GLsizei height,
+                       GLenum format,
+                       GLenum type,
+                       const GLvoid *pixels);
+    void texSubImage3D(GLenum target,
+                       GLint level,
+                       GLint xoffset,
+                       GLint yoffset,
+                       GLint zoffset,
+                       GLsizei width,
+                       GLsizei height,
+                       GLsizei depth,
+                       GLenum format,
+                       GLenum type,
+                       const GLvoid *pixels);
+    void compressedTexImage2D(GLenum target,
+                              GLint level,
+                              GLenum internalformat,
+                              GLsizei width,
+                              GLsizei height,
+                              GLint border,
+                              GLsizei imageSize,
+                              const GLvoid *data);
+    void compressedTexImage3D(GLenum target,
+                              GLint level,
+                              GLenum internalformat,
+                              GLsizei width,
+                              GLsizei height,
+                              GLsizei depth,
+                              GLint border,
+                              GLsizei imageSize,
+                              const GLvoid *data);
+    void compressedTexSubImage2D(GLenum target,
+                                 GLint level,
+                                 GLint xoffset,
+                                 GLint yoffset,
+                                 GLsizei width,
+                                 GLsizei height,
+                                 GLenum format,
+                                 GLsizei imageSize,
+                                 const GLvoid *data);
+    void compressedTexSubImage3D(GLenum target,
+                                 GLint level,
+                                 GLint xoffset,
+                                 GLint yoffset,
+                                 GLint zoffset,
+                                 GLsizei width,
+                                 GLsizei height,
+                                 GLsizei depth,
+                                 GLenum format,
+                                 GLsizei imageSize,
+                                 const GLvoid *data);
+
</ins><span class="cx">     Error flush();
</span><span class="cx">     Error finish();
</span><span class="cx"> 
</span><del>-    void recordError(const Error &amp;error);
</del><ins>+    void getBufferPointerv(GLenum target, GLenum pname, void **params);
+    GLvoid *mapBuffer(GLenum target, GLenum access);
+    GLboolean unmapBuffer(GLenum target);
+    GLvoid *mapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+    void flushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length);
</ins><span class="cx"> 
</span><ins>+    void beginTransformFeedback(GLenum primitiveMode);
+
+    bool hasActiveTransformFeedback(GLuint program) const;
+
+    void insertEventMarker(GLsizei length, const char *marker);
+    void pushGroupMarker(GLsizei length, const char *marker);
+    void popGroupMarker();
+
+    void recordError(const Error &amp;error) override;
+
</ins><span class="cx">     GLenum getError();
</span><span class="cx">     GLenum getResetStatus();
</span><span class="cx">     virtual bool isResetNotificationEnabled();
</span><span class="cx"> 
</span><del>-    virtual int getClientVersion() const;
-
-    EGLint getConfigID() const;
</del><ins>+    const egl::Config *getConfig() const;
</ins><span class="cx">     EGLenum getClientType() const;
</span><span class="cx">     EGLenum getRenderBuffer() const;
</span><span class="cx"> 
</span><del>-    const Caps &amp;getCaps() const;
-    const TextureCapsMap &amp;getTextureCaps() const;
-    const Extensions &amp;getExtensions() const;
-
</del><span class="cx">     const std::string &amp;getRendererString() const;
</span><span class="cx"> 
</span><span class="cx">     const std::string &amp;getExtensionString() const;
</span><span class="lines">@@ -196,11 +405,18 @@
</span><span class="cx">     rx::Renderer *getRenderer() { return mRenderer; }
</span><span class="cx"> 
</span><span class="cx">     State &amp;getState() { return mState; }
</span><del>-    const State &amp;getState() const { return mState; }
</del><span class="cx"> 
</span><del>-    const Data &amp;getData() const { return mData; }
</del><ins>+  private:
+    void syncRendererState();
+    void syncRendererState(const State::DirtyBits &amp;bitMask, const State::DirtyObjects &amp;objectMask);
+    void syncStateForReadPixels();
+    void syncStateForTexImage();
+    void syncStateForClear();
+    void syncStateForBlit();
+    VertexArray *checkVertexArrayAllocation(GLuint vertexArrayHandle);
+    TransformFeedback *checkTransformFeedbackAllocation(GLuint transformFeedback);
+    Framebuffer *checkFramebufferAllocation(GLuint framebufferHandle);
</ins><span class="cx"> 
</span><del>-  private:
</del><span class="cx">     void detachBuffer(GLuint buffer);
</span><span class="cx">     void detachTexture(GLuint texture);
</span><span class="cx">     void detachFramebuffer(GLuint framebuffer);
</span><span class="lines">@@ -218,6 +434,7 @@
</span><span class="cx">     Caps mCaps;
</span><span class="cx">     TextureCapsMap mTextureCaps;
</span><span class="cx">     Extensions mExtensions;
</span><ins>+    Limitations mLimitations;
</ins><span class="cx"> 
</span><span class="cx">     // Shader compiler
</span><span class="cx">     Compiler *mCompiler;
</span><span class="lines">@@ -227,30 +444,24 @@
</span><span class="cx"> 
</span><span class="cx">     int mClientVersion;
</span><span class="cx"> 
</span><del>-    EGLint mConfigID;
</del><ins>+    const egl::Config *mConfig;
</ins><span class="cx">     EGLenum mClientType;
</span><span class="cx"> 
</span><span class="cx">     TextureMap mZeroTextures;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, Framebuffer*&gt; FramebufferMap;
-    FramebufferMap mFramebufferMap;
</del><ins>+    ResourceMap&lt;Framebuffer&gt; mFramebufferMap;
</ins><span class="cx">     HandleAllocator mFramebufferHandleAllocator;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, FenceNV*&gt; FenceNVMap;
-    FenceNVMap mFenceNVMap;
</del><ins>+    ResourceMap&lt;FenceNV&gt; mFenceNVMap;
</ins><span class="cx">     HandleAllocator mFenceNVHandleAllocator;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, Query*&gt; QueryMap;
-    QueryMap mQueryMap;
</del><ins>+    ResourceMap&lt;Query&gt; mQueryMap;
</ins><span class="cx">     HandleAllocator mQueryHandleAllocator;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, VertexArray*&gt; VertexArrayMap;
-    VertexArrayMap mVertexArrayMap;
</del><ins>+    ResourceMap&lt;VertexArray&gt; mVertexArrayMap;
</ins><span class="cx">     HandleAllocator mVertexArrayHandleAllocator;
</span><span class="cx"> 
</span><del>-    BindingPointer&lt;TransformFeedback&gt; mTransformFeedbackZero;
-    typedef std::map&lt;GLuint, TransformFeedback*&gt; TransformFeedbackMap;
-    TransformFeedbackMap mTransformFeedbackMap;
</del><ins>+    ResourceMap&lt;TransformFeedback&gt; mTransformFeedbackMap;
</ins><span class="cx">     HandleAllocator mTransformFeedbackAllocator;
</span><span class="cx"> 
</span><span class="cx">     std::string mRendererString;
</span><span class="lines">@@ -267,13 +478,20 @@
</span><span class="cx">     GLenum mResetStatus;
</span><span class="cx">     GLenum mResetStrategy;
</span><span class="cx">     bool mRobustAccess;
</span><ins>+    egl::Surface *mCurrentSurface;
</ins><span class="cx"> 
</span><span class="cx">     ResourceManager *mResourceManager;
</span><span class="cx"> 
</span><del>-    // Cache the Data object to avoid re-calling the constructor
-    Data mData;
</del><ins>+    State::DirtyBits mTexImageDirtyBits;
+    State::DirtyObjects mTexImageDirtyObjects;
+    State::DirtyBits mReadPixelsDirtyBits;
+    State::DirtyObjects mReadPixelsDirtyObjects;
+    State::DirtyBits mClearDirtyBits;
+    State::DirtyObjects mClearDirtyObjects;
+    State::DirtyBits mBlitDirtyBits;
+    State::DirtyObjects mBlitDirtyObjects;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace gl
</ins><span class="cx"> 
</span><span class="cx"> #endif   // LIBANGLE_CONTEXT_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Data.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Data.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Data.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,40 +12,45 @@
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-Data::Data(GLint clientVersionIn, const State &amp;stateIn, const Caps &amp;capsIn,
-           const TextureCapsMap &amp;textureCapsIn, const Extensions &amp;extensionsIn,
-           const ResourceManager *resourceManagerIn)
-    : clientVersion(clientVersionIn),
</del><ins>+Data::Data(uintptr_t contextIn,
+           GLint clientVersionIn,
+           const State &amp;stateIn,
+           const Caps &amp;capsIn,
+           const TextureCapsMap &amp;textureCapsIn,
+           const Extensions &amp;extensionsIn,
+           const ResourceManager *resourceManagerIn,
+           const Limitations &amp;limitationsIn)
+    : context(contextIn),
+      clientVersion(clientVersionIn),
</ins><span class="cx">       state(&amp;stateIn),
</span><span class="cx">       caps(&amp;capsIn),
</span><span class="cx">       textureCaps(&amp;textureCapsIn),
</span><span class="cx">       extensions(&amp;extensionsIn),
</span><del>-      resourceManager(resourceManagerIn)
</del><ins>+      resourceManager(resourceManagerIn),
+      limitations(&amp;limitationsIn)
</ins><span class="cx"> {}
</span><span class="cx"> 
</span><span class="cx"> Data::~Data()
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Data::Data(const Data &amp;other)
-    : clientVersion(other.clientVersion),
-      state(other.state),
-      caps(other.caps),
-      textureCaps(other.textureCaps),
-      extensions(other.extensions),
-      resourceManager(other.resourceManager)
</del><ins>+ValidationContext::ValidationContext(GLint clientVersion,
+                                     const State &amp;state,
+                                     const Caps &amp;caps,
+                                     const TextureCapsMap &amp;textureCaps,
+                                     const Extensions &amp;extensions,
+                                     const ResourceManager *resourceManager,
+                                     const Limitations &amp;limitations,
+                                     bool skipValidation)
+    : mData(reinterpret_cast&lt;uintptr_t&gt;(this),
+            clientVersion,
+            state,
+            caps,
+            textureCaps,
+            extensions,
+            resourceManager,
+            limitations),
+      mSkipValidation(skipValidation)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><del>-
-Data &amp;Data::operator=(const Data &amp;other)
-{
-    clientVersion = other.clientVersion;
-    state = other.state;
-    caps = other.caps;
-    textureCaps = other.textureCaps;
-    extensions = other.extensions;
-    resourceManager = other.resourceManager;
-    return *this;
-}
-
-}
</del><ins>+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Data.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Data.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Data.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,30 +9,64 @@
</span><span class="cx"> #ifndef LIBANGLE_DATA_H_
</span><span class="cx"> #define LIBANGLE_DATA_H_
</span><span class="cx"> 
</span><ins>+#include &quot;common/angleutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/State.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-struct Data final
</del><ins>+struct Data final : public angle::NonCopyable
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    Data(GLint clientVersion, const State &amp;state, const Caps &amp;caps,
-         const TextureCapsMap &amp;textureCaps, const Extensions &amp;extensions,
-         const ResourceManager *resourceManager);
</del><ins>+    Data(uintptr_t context,
+         GLint clientVersion,
+         const State &amp;state,
+         const Caps &amp;caps,
+         const TextureCapsMap &amp;textureCaps,
+         const Extensions &amp;extensions,
+         const ResourceManager *resourceManager,
+         const Limitations &amp;limitations);
</ins><span class="cx">     ~Data();
</span><span class="cx"> 
</span><del>-    Data(const Data &amp;other);
-    Data &amp;operator=(const Data &amp;other);
-
</del><ins>+    uintptr_t context;
</ins><span class="cx">     GLint clientVersion;
</span><span class="cx">     const State *state;
</span><span class="cx">     const Caps *caps;
</span><span class="cx">     const TextureCapsMap *textureCaps;
</span><span class="cx">     const Extensions *extensions;
</span><span class="cx">     const ResourceManager *resourceManager;
</span><ins>+    const Limitations *limitations;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+class ValidationContext : angle::NonCopyable
+{
+  public:
+    ValidationContext(GLint clientVersion,
+                      const State &amp;state,
+                      const Caps &amp;caps,
+                      const TextureCapsMap &amp;textureCaps,
+                      const Extensions &amp;extensions,
+                      const ResourceManager *resourceManager,
+                      const Limitations &amp;limitations,
+                      bool skipValidation);
+    virtual ~ValidationContext() {}
+
+    virtual void recordError(const Error &amp;error) = 0;
+
+    const Data &amp;getData() const { return mData; }
+    int getClientVersion() const { return mData.clientVersion; }
+    const State &amp;getState() const { return *mData.state; }
+    const Caps &amp;getCaps() const { return *mData.caps; }
+    const TextureCapsMap &amp;getTextureCaps() const { return *mData.textureCaps; }
+    const Extensions &amp;getExtensions() const { return *mData.extensions; }
+    const Limitations &amp;getLimitations() const { return *mData.limitations; }
+    bool skipValidation() const { return mSkipValidation; }
+
+  protected:
+    Data mData;
+    bool mSkipValidation;
+};
+
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_DATA_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEDebugcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Debug.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Debug.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Debug.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,303 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Debug.cpp: Defines debug state used for GL_KHR_debug
+
+#include &quot;libANGLE/Debug.h&quot;
+
+#include &quot;common/debug.h&quot;
+
+#include &lt;algorithm&gt;
+#include &lt;tuple&gt;
+
+namespace gl
+{
+
+Debug::Debug()
+    : mOutputEnabled(false),
+      mCallbackFunction(nullptr),
+      mCallbackUserParam(nullptr),
+      mMessages(),
+      mMaxLoggedMessages(0),
+      mOutputSynchronous(false),
+      mGroups()
+{
+    pushDefaultGroup();
+}
+
+void Debug::setMaxLoggedMessages(GLuint maxLoggedMessages)
+{
+    mMaxLoggedMessages = maxLoggedMessages;
+}
+
+void Debug::setOutputEnabled(bool enabled)
+{
+    mOutputEnabled = enabled;
+}
+
+bool Debug::isOutputEnabled() const
+{
+    return mOutputEnabled;
+}
+
+void Debug::setOutputSynchronous(bool synchronous)
+{
+    mOutputSynchronous = synchronous;
+}
+
+bool Debug::isOutputSynchronous() const
+{
+    return mOutputSynchronous;
+}
+
+void Debug::setCallback(GLDEBUGPROCKHR callback, const void *userParam)
+{
+    mCallbackFunction  = callback;
+    mCallbackUserParam = userParam;
+}
+
+GLDEBUGPROCKHR Debug::getCallback() const
+{
+    return mCallbackFunction;
+}
+
+const void *Debug::getUserParam() const
+{
+    return mCallbackUserParam;
+}
+
+void Debug::insertMessage(GLenum source,
+                          GLenum type,
+                          GLuint id,
+                          GLenum severity,
+                          const std::string &amp;message)
+{
+    std::string messageCopy(message);
+    insertMessage(source, type, id, severity, std::move(messageCopy));
+}
+
+void Debug::insertMessage(GLenum source,
+                          GLenum type,
+                          GLuint id,
+                          GLenum severity,
+                          std::string &amp;&amp;message)
+{
+    if (!isMessageEnabled(source, type, id, severity))
+    {
+        return;
+    }
+
+    if (mCallbackFunction != nullptr)
+    {
+        // TODO(geofflang) Check the synchronous flag and potentially flush messages from another
+        // thread.
+        mCallbackFunction(source, type, id, severity, static_cast&lt;GLsizei&gt;(message.length()),
+                          message.c_str(), mCallbackUserParam);
+    }
+    else
+    {
+        if (mMessages.size() &gt;= mMaxLoggedMessages)
+        {
+            // Drop messages over the limit
+            return;
+        }
+
+        Message m;
+        m.source   = source;
+        m.type     = type;
+        m.id       = id;
+        m.severity = severity;
+        m.message  = std::move(message);
+
+        mMessages.push_back(std::move(m));
+    }
+}
+
+size_t Debug::getMessages(GLuint count,
+                          GLsizei bufSize,
+                          GLenum *sources,
+                          GLenum *types,
+                          GLuint *ids,
+                          GLenum *severities,
+                          GLsizei *lengths,
+                          GLchar *messageLog)
+{
+    size_t messageCount       = 0;
+    size_t messageStringIndex = 0;
+    while (messageCount &lt;= count &amp;&amp; !mMessages.empty())
+    {
+        const Message &amp;m = mMessages.front();
+
+        if (messageLog != nullptr)
+        {
+            // Check that this message can fit in the message buffer
+            if (messageStringIndex + m.message.length() + 1 &gt; static_cast&lt;size_t&gt;(bufSize))
+            {
+                break;
+            }
+
+            std::copy(m.message.begin(), m.message.end(), messageLog + messageStringIndex);
+            messageStringIndex += m.message.length();
+
+            messageLog[messageStringIndex] = '\0';
+            messageStringIndex += 1;
+        }
+
+        if (sources != nullptr)
+        {
+            sources[messageCount] = m.source;
+        }
+
+        if (types != nullptr)
+        {
+            types[messageCount] = m.type;
+        }
+
+        if (ids != nullptr)
+        {
+            ids[messageCount] = m.id;
+        }
+
+        if (severities != nullptr)
+        {
+            severities[messageCount] = m.severity;
+        }
+
+        if (lengths != nullptr)
+        {
+            lengths[messageCount] = static_cast&lt;GLsizei&gt;(m.message.length());
+        }
+
+        mMessages.pop_front();
+
+        messageCount++;
+    }
+
+    return messageCount;
+}
+
+size_t Debug::getNextMessageLength() const
+{
+    return mMessages.empty() ? 0 : mMessages.front().message.length();
+}
+
+size_t Debug::getMessageCount() const
+{
+    return mMessages.size();
+}
+
+void Debug::setMessageControl(GLenum source,
+                              GLenum type,
+                              GLenum severity,
+                              std::vector&lt;GLuint&gt; &amp;&amp;ids,
+                              bool enabled)
+{
+    Control c;
+    c.source   = source;
+    c.type     = type;
+    c.severity = severity;
+    c.ids      = std::move(ids);
+    c.enabled  = enabled;
+
+    auto &amp;controls = mGroups.back().controls;
+    controls.push_back(std::move(c));
+}
+
+void Debug::pushGroup(GLenum source, GLuint id, std::string &amp;&amp;message)
+{
+    insertMessage(source, GL_DEBUG_TYPE_PUSH_GROUP, id, GL_DEBUG_SEVERITY_NOTIFICATION,
+                  std::string(message));
+
+    Group g;
+    g.source  = source;
+    g.id      = id;
+    g.message = std::move(message);
+    mGroups.push_back(std::move(g));
+}
+
+void Debug::popGroup()
+{
+    // Make sure the default group is not about to be popped
+    ASSERT(mGroups.size() &gt; 1);
+
+    Group g = mGroups.back();
+    mGroups.pop_back();
+
+    insertMessage(g.source, GL_DEBUG_TYPE_POP_GROUP, g.id, GL_DEBUG_SEVERITY_NOTIFICATION,
+                  g.message);
+}
+
+size_t Debug::getGroupStackDepth() const
+{
+    return mGroups.size();
+}
+
+bool Debug::isMessageEnabled(GLenum source, GLenum type, GLuint id, GLenum severity) const
+{
+    if (!mOutputEnabled)
+    {
+        return false;
+    }
+
+    for (auto groupIter = mGroups.rbegin(); groupIter != mGroups.rend(); groupIter++)
+    {
+        const auto &amp;controls = groupIter-&gt;controls;
+        for (auto controlIter = controls.rbegin(); controlIter != controls.rend(); controlIter++)
+        {
+            const auto &amp;control = *controlIter;
+
+            if (control.source != GL_DONT_CARE &amp;&amp; control.source != source)
+            {
+                continue;
+            }
+
+            if (control.type != GL_DONT_CARE &amp;&amp; control.type != type)
+            {
+                continue;
+            }
+
+            if (control.severity != GL_DONT_CARE &amp;&amp; control.severity != severity)
+            {
+                continue;
+            }
+
+            if (!control.ids.empty() &amp;&amp;
+                std::find(control.ids.begin(), control.ids.end(), id) == control.ids.end())
+            {
+                continue;
+            }
+
+            return control.enabled;
+        }
+    }
+
+    return true;
+}
+
+void Debug::pushDefaultGroup()
+{
+    Group g;
+    g.source  = GL_NONE;
+    g.id      = 0;
+    g.message = &quot;&quot;;
+
+    Control c0;
+    c0.source   = GL_DONT_CARE;
+    c0.type     = GL_DONT_CARE;
+    c0.severity = GL_DONT_CARE;
+    c0.enabled = true;
+    g.controls.push_back(std::move(c0));
+
+    Control c1;
+    c1.source   = GL_DONT_CARE;
+    c1.type     = GL_DONT_CARE;
+    c1.severity = GL_DEBUG_SEVERITY_LOW;
+    c1.enabled = false;
+    g.controls.push_back(std::move(c1));
+
+    mGroups.push_back(std::move(g));
+}
+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEDebugh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Debug.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Debug.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Debug.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,120 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Debug.h: Defines debug state used for GL_KHR_debug
+
+#ifndef LIBANGLE_DEBUG_H_
+#define LIBANGLE_DEBUG_H_
+
+#include &quot;angle_gl.h&quot;
+#include &quot;common/angleutils.h&quot;
+
+#include &lt;deque&gt;
+#include &lt;string&gt;
+#include &lt;vector&gt;
+
+namespace gl
+{
+
+class LabeledObject
+{
+  public:
+    virtual ~LabeledObject() {}
+    virtual void setLabel(const std::string &amp;label) = 0;
+    virtual const std::string &amp;getLabel() const = 0;
+};
+
+class Debug : angle::NonCopyable
+{
+  public:
+    Debug();
+
+    void setMaxLoggedMessages(GLuint maxLoggedMessages);
+
+    void setOutputEnabled(bool enabled);
+    bool isOutputEnabled() const;
+
+    void setOutputSynchronous(bool synchronous);
+    bool isOutputSynchronous() const;
+
+    void setCallback(GLDEBUGPROCKHR callback, const void *userParam);
+    GLDEBUGPROCKHR getCallback() const;
+    const void *getUserParam() const;
+
+    void insertMessage(GLenum source,
+                       GLenum type,
+                       GLuint id,
+                       GLenum severity,
+                       const std::string &amp;message);
+    void insertMessage(GLenum source,
+                       GLenum type,
+                       GLuint id,
+                       GLenum severity,
+                       std::string &amp;&amp;message);
+
+    void setMessageControl(GLenum source,
+                           GLenum type,
+                           GLenum severity,
+                           std::vector&lt;GLuint&gt; &amp;&amp;ids,
+                           bool enabled);
+    size_t getMessages(GLuint count,
+                       GLsizei bufSize,
+                       GLenum *sources,
+                       GLenum *types,
+                       GLuint *ids,
+                       GLenum *severities,
+                       GLsizei *lengths,
+                       GLchar *messageLog);
+    size_t getNextMessageLength() const;
+    size_t getMessageCount() const;
+
+    void pushGroup(GLenum source, GLuint id, std::string &amp;&amp;message);
+    void popGroup();
+    size_t getGroupStackDepth() const;
+
+  private:
+    bool isMessageEnabled(GLenum source, GLenum type, GLuint id, GLenum severity) const;
+
+    void pushDefaultGroup();
+
+    struct Message
+    {
+        GLenum source;
+        GLenum type;
+        GLuint id;
+        GLenum severity;
+        std::string message;
+    };
+
+    struct Control
+    {
+        GLenum source;
+        GLenum type;
+        GLenum severity;
+        std::vector&lt;GLuint&gt; ids;
+        bool enabled;
+    };
+
+    struct Group
+    {
+        GLenum source;
+        GLuint id;
+        std::string message;
+
+        std::vector&lt;Control&gt; controls;
+    };
+
+    bool mOutputEnabled;
+    GLDEBUGPROCKHR mCallbackFunction;
+    const void *mCallbackUserParam;
+    std::deque&lt;Message&gt; mMessages;
+    GLuint mMaxLoggedMessages;
+    bool mOutputSynchronous;
+    std::vector&lt;Group&gt; mGroups;
+};
+}  // namespace gl
+
+#endif  // LIBANGLE_DEBUG_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEDevicecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Device.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Device.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Device.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,6 +18,10 @@
</span><span class="cx"> #include &quot;common/platform.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/DeviceImpl.h&quot;
</span><span class="cx"> 
</span><ins>+#if defined(ANGLE_ENABLE_D3D11)
+#include &quot;libANGLE/renderer/d3d/DeviceD3D.h&quot;
+#endif
+
</ins><span class="cx"> namespace egl
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -31,21 +35,75 @@
</span><span class="cx">     return stream.str();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Device::Device(Display *display, rx::DeviceImpl *impl)
-    : mDisplay(display),
-      mImplementation(impl)
</del><ins>+typedef std::set&lt;egl::Device *&gt; DeviceSet;
+static DeviceSet *GetDeviceSet()
</ins><span class="cx"> {
</span><ins>+    static DeviceSet devices;
+    return &amp;devices;
+}
+
+// Static factory methods
+egl::Error Device::CreateDevice(void *devicePointer, EGLint deviceType, Device **outDevice)
+{
+#if defined(ANGLE_ENABLE_D3D11)
+    if (deviceType == EGL_D3D11_DEVICE_ANGLE)
+    {
+        rx::DeviceD3D *deviceD3D = new rx::DeviceD3D();
+        egl::Error error = deviceD3D-&gt;initialize(devicePointer, deviceType, EGL_TRUE);
+        if (error.isError())
+        {
+            *outDevice = nullptr;
+            return error;
+        }
+
+        *outDevice = new Device(nullptr, deviceD3D);
+        GetDeviceSet()-&gt;insert(*outDevice);
+        return egl::Error(EGL_SUCCESS);
+    }
+#endif
+
+    // Note that creating an EGL device from inputted D3D9 parameters isn't currently supported
+    *outDevice = nullptr;
+    return egl::Error(EGL_BAD_ATTRIBUTE);
+}
+
+egl::Error Device::CreateDevice(Display *owningDisplay, rx::DeviceImpl *impl, Device **outDevice)
+{
+    *outDevice = new Device(owningDisplay, impl);
+    GetDeviceSet()-&gt;insert(*outDevice);
+    return egl::Error(EGL_SUCCESS);
+}
+
+bool Device::IsValidDevice(Device *device)
+{
+    const DeviceSet *deviceSet = GetDeviceSet();
+    return deviceSet-&gt;find(device) != deviceSet-&gt;end();
+}
+
+Device::Device(Display *owningDisplay, rx::DeviceImpl *impl)
+    : mOwningDisplay(owningDisplay), mImplementation(impl)
+{
</ins><span class="cx">     initDeviceExtensions();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Device::~Device()
</span><span class="cx"> {
</span><ins>+    ASSERT(GetDeviceSet()-&gt;find(this) != GetDeviceSet()-&gt;end());
+    GetDeviceSet()-&gt;erase(this);
</ins><span class="cx"> 
</span><ins>+    if (mImplementation-&gt;deviceExternallySourced())
+    {
+        // If the device isn't externally sourced then it is up to the renderer to delete the impl
+        SafeDelete(mImplementation);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error Device::getDevice(EGLAttrib *value)
</span><span class="cx"> {
</span><del>-    return getImplementation()-&gt;getDevice(value);
</del><ins>+    void *nativeDevice = nullptr;
+    egl::Error error = getImplementation()-&gt;getDevice(&amp;nativeDevice);
+    *value = reinterpret_cast&lt;EGLAttrib&gt;(nativeDevice);
+    return error;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EGLint Device::getType()
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEDeviceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Device.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Device.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Device.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -24,11 +24,10 @@
</span><span class="cx"> class Device final : angle::NonCopyable
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    Device(Display *display, rx::DeviceImpl *impl);
</del><span class="cx">     virtual ~Device();
</span><span class="cx"> 
</span><span class="cx">     Error getDevice(EGLAttrib *value);
</span><del>-    Display *getDisplay() { return mDisplay; };
</del><ins>+    Display *getOwningDisplay() { return mOwningDisplay; };
</ins><span class="cx">     EGLint getType();
</span><span class="cx"> 
</span><span class="cx">     const DeviceExtensions &amp;getExtensions() const;
</span><span class="lines">@@ -36,10 +35,18 @@
</span><span class="cx"> 
</span><span class="cx">     rx::DeviceImpl *getImplementation() { return mImplementation; }
</span><span class="cx"> 
</span><ins>+    static egl::Error CreateDevice(void *devicePointer, EGLint deviceType, Device **outDevice);
+    static egl::Error CreateDevice(Display *owningDisplay,
+                                   rx::DeviceImpl *impl,
+                                   Device **outDevice);
+
+    static bool IsValidDevice(Device *device);
+
</ins><span class="cx">   private:
</span><ins>+    Device(Display *owningDisplay, rx::DeviceImpl *impl);
</ins><span class="cx">     void initDeviceExtensions();
</span><span class="cx"> 
</span><del>-    Display *mDisplay;
</del><ins>+    Display *mOwningDisplay;
</ins><span class="cx">     rx::DeviceImpl *mImplementation;
</span><span class="cx"> 
</span><span class="cx">     DeviceExtensions mDeviceExtensions;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEDisplaycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -22,10 +22,15 @@
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="cx"> #include &quot;common/mathutil.h&quot;
</span><span class="cx"> #include &quot;common/platform.h&quot;
</span><ins>+#include &quot;common/utilities.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Context.h&quot;
</span><ins>+#include &quot;libANGLE/Device.h&quot;
+#include &quot;libANGLE/histogram_macros.h&quot;
+#include &quot;libANGLE/Image.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><del>-#include &quot;libANGLE/Device.h&quot;
</del><ins>+#include &quot;libANGLE/Stream.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/DisplayImpl.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/ImageImpl.h&quot;
</ins><span class="cx"> #include &quot;third_party/trace_event/trace_event.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
</span><span class="lines">@@ -35,6 +40,10 @@
</span><span class="cx"> #if defined(ANGLE_ENABLE_OPENGL)
</span><span class="cx"> #   if defined(ANGLE_PLATFORM_WINDOWS)
</span><span class="cx"> #       include &quot;libANGLE/renderer/gl/wgl/DisplayWGL.h&quot;
</span><ins>+#   elif defined(ANGLE_USE_X11)
+#       include &quot;libANGLE/renderer/gl/glx/DisplayGLX.h&quot;
+#   elif defined(ANGLE_PLATFORM_APPLE)
+#       include &quot;libANGLE/renderer/gl/cgl/DisplayCGL.h&quot;
</ins><span class="cx"> #   else
</span><span class="cx"> #       error Unsupported OpenGL platform.
</span><span class="cx"> #   endif
</span><span class="lines">@@ -68,19 +77,6 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DeinitDefaultPlatformImpl()
-{
-    if (defaultPlatform != nullptr)
-    {
-        if (ANGLEPlatformCurrent() == defaultPlatform)
-        {
-            ANGLEPlatformShutdown();
-        }
-
-        SafeDelete(defaultPlatform);
-    }
-}
-
</del><span class="cx"> typedef std::map&lt;EGLNativeWindowType, Surface*&gt; WindowSurfaceMap;
</span><span class="cx"> // Get a map of all EGL window surfaces to validate that no window has more than one EGL surface
</span><span class="cx"> // associated with it.
</span><span class="lines">@@ -90,27 +86,72 @@
</span><span class="cx">     return &amp;windowSurfaces;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-typedef std::map&lt;EGLNativeDisplayType, Display*&gt; DisplayMap;
-static DisplayMap *GetDisplayMap()
</del><ins>+typedef std::map&lt;EGLNativeDisplayType, Display *&gt; ANGLEPlatformDisplayMap;
+static ANGLEPlatformDisplayMap *GetANGLEPlatformDisplayMap()
</ins><span class="cx"> {
</span><del>-    static DisplayMap displays;
</del><ins>+    static ANGLEPlatformDisplayMap displays;
</ins><span class="cx">     return &amp;displays;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-rx::DisplayImpl *CreateDisplayImpl(const AttributeMap &amp;attribMap)
</del><ins>+typedef std::map&lt;Device *, Display *&gt; DevicePlatformDisplayMap;
+static DevicePlatformDisplayMap *GetDevicePlatformDisplayMap()
</ins><span class="cx"> {
</span><ins>+    static DevicePlatformDisplayMap displays;
+    return &amp;displays;
+}
+
+rx::DisplayImpl *CreateDisplayFromDevice(Device *eglDevice)
+{
</ins><span class="cx">     rx::DisplayImpl *impl = nullptr;
</span><del>-    EGLint displayType = attribMap.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE);
</del><ins>+
+    switch (eglDevice-&gt;getType())
+    {
+#if defined(ANGLE_ENABLE_D3D11)
+        case EGL_D3D11_DEVICE_ANGLE:
+            impl = new rx::DisplayD3D();
+            break;
+#endif
+#if defined(ANGLE_ENABLE_D3D9)
+        case EGL_D3D9_DEVICE_ANGLE:
+            // Currently the only way to get EGLDeviceEXT representing a D3D9 device
+            // is to retrieve one from an already-existing EGLDisplay.
+            // When eglGetPlatformDisplayEXT is called with a D3D9 EGLDeviceEXT,
+            // the already-existing display should be returned.
+            // Therefore this codepath to create a new display from the device
+            // should never be hit.
+            UNREACHABLE();
+            break;
+#endif
+        default:
+            UNREACHABLE();
+            break;
+    }
+
+    ASSERT(impl != nullptr);
+    return impl;
+}
+
+rx::DisplayImpl *CreateDisplayFromAttribs(const AttributeMap &amp;attribMap)
+{
+    rx::DisplayImpl *impl = nullptr;
+    EGLAttrib displayType =
+        attribMap.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE);
</ins><span class="cx">     switch (displayType)
</span><span class="cx">     {
</span><span class="cx">       case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
</span><ins>+#if defined(ANGLE_ENABLE_OPENGL)
</ins><span class="cx"> #if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
</span><span class="cx">         // Default to D3D displays
</span><span class="cx">         impl = new rx::DisplayD3D();
</span><ins>+#elif defined(ANGLE_USE_X11)
+        impl = new rx::DisplayGLX();
+#elif defined(ANGLE_PLATFORM_APPLE)
+        impl = new rx::DisplayCGL();
</ins><span class="cx"> #else
</span><span class="cx">         // No display available
</span><span class="cx">         UNREACHABLE();
</span><span class="cx"> #endif
</span><ins>+#endif
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">       case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
</span><span class="lines">@@ -127,6 +168,10 @@
</span><span class="cx"> #if defined(ANGLE_ENABLE_OPENGL)
</span><span class="cx"> #if defined(ANGLE_PLATFORM_WINDOWS)
</span><span class="cx">         impl = new rx::DisplayWGL();
</span><ins>+#elif defined(ANGLE_USE_X11)
+        impl = new rx::DisplayGLX();
+#elif defined(ANGLE_PLATFORM_APPLE)
+        impl = new rx::DisplayCGL();
</ins><span class="cx"> #else
</span><span class="cx"> #error Unsupported OpenGL platform.
</span><span class="cx"> #endif
</span><span class="lines">@@ -135,26 +180,40 @@
</span><span class="cx"> #endif
</span><span class="cx">         break;
</span><span class="cx"> 
</span><ins>+#if defined(ANGLE_ENABLE_OPENGL)
+      case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
+#if defined(ANGLE_PLATFORM_WINDOWS)
+          impl = new rx::DisplayWGL();
+#elif defined(ANGLE_USE_X11)
+          impl = new rx::DisplayGLX();
+#else
+          // No GLES support on this platform, fail display creation.
+          impl = nullptr;
+#endif
+          break;
+#endif
+
</ins><span class="cx">       default:
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(impl != nullptr);
</del><span class="cx">     return impl;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Display *Display::getDisplay(EGLNativeDisplayType displayId, const AttributeMap &amp;attribMap)
</del><ins>+Display *Display::GetDisplayFromAttribs(void *native_display, const AttributeMap &amp;attribMap)
</ins><span class="cx"> {
</span><span class="cx">     // Initialize the global platform if not already
</span><span class="cx">     InitDefaultPlatformImpl();
</span><span class="cx"> 
</span><del>-    Display *display = NULL;
</del><ins>+    Display *display = nullptr;
</ins><span class="cx"> 
</span><del>-    DisplayMap *displays = GetDisplayMap();
-    DisplayMap::const_iterator iter = displays-&gt;find(displayId);
</del><ins>+    EGLNativeDisplayType displayId = reinterpret_cast&lt;EGLNativeDisplayType&gt;(native_display);
+
+    ANGLEPlatformDisplayMap *displays            = GetANGLEPlatformDisplayMap();
+    ANGLEPlatformDisplayMap::const_iterator iter = displays-&gt;find(displayId);
</ins><span class="cx">     if (iter != displays-&gt;end())
</span><span class="cx">     {
</span><span class="cx">         display = iter-&gt;second;
</span><span class="lines">@@ -168,32 +227,90 @@
</span><span class="cx">             return NULL;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        display = new Display(displayId);
</del><ins>+        display = new Display(EGL_PLATFORM_ANGLE_ANGLE, displayId, nullptr);
</ins><span class="cx">         displays-&gt;insert(std::make_pair(displayId, display));
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Apply new attributes if the display is not initialized yet.
</span><span class="cx">     if (!display-&gt;isInitialized())
</span><span class="cx">     {
</span><del>-        rx::DisplayImpl* impl = CreateDisplayImpl(attribMap);
</del><ins>+        rx::DisplayImpl *impl = CreateDisplayFromAttribs(attribMap);
+        if (impl == nullptr)
+        {
+            // No valid display implementation for these attributes
+            return nullptr;
+        }
+
</ins><span class="cx">         display-&gt;setAttributes(impl, attribMap);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return display;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Display::Display(EGLNativeDisplayType displayId)
</del><ins>+Display *Display::GetDisplayFromDevice(void *native_display)
+{
+    // Initialize the global platform if not already
+    InitDefaultPlatformImpl();
+
+    Display *display = nullptr;
+
+    Device *eglDevice = reinterpret_cast&lt;Device *&gt;(native_display);
+    ASSERT(Device::IsValidDevice(eglDevice));
+
+    ANGLEPlatformDisplayMap *anglePlatformDisplays   = GetANGLEPlatformDisplayMap();
+    DevicePlatformDisplayMap *devicePlatformDisplays = GetDevicePlatformDisplayMap();
+
+    // First see if this eglDevice is in use by a Display created using ANGLE platform
+    for (auto &amp;displayMapEntry : *anglePlatformDisplays)
+    {
+        egl::Display *iterDisplay = displayMapEntry.second;
+        if (iterDisplay-&gt;getDevice() == eglDevice)
+        {
+            display = iterDisplay;
+        }
+    }
+
+    if (display == nullptr)
+    {
+        // See if the eglDevice is in use by a Display created using the DEVICE platform
+        DevicePlatformDisplayMap::const_iterator iter = devicePlatformDisplays-&gt;find(eglDevice);
+        if (iter != devicePlatformDisplays-&gt;end())
+        {
+            display = iter-&gt;second;
+        }
+    }
+
+    if (display == nullptr)
+    {
+        // Otherwise create a new Display
+        display = new Display(EGL_PLATFORM_DEVICE_EXT, 0, eglDevice);
+        devicePlatformDisplays-&gt;insert(std::make_pair(eglDevice, display));
+    }
+
+    // Apply new attributes if the display is not initialized yet.
+    if (!display-&gt;isInitialized())
+    {
+        rx::DisplayImpl *impl = CreateDisplayFromDevice(eglDevice);
+        display-&gt;setAttributes(impl, egl::AttributeMap());
+    }
+
+    return display;
+}
+
+Display::Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice)
</ins><span class="cx">     : mImplementation(nullptr),
</span><span class="cx">       mDisplayId(displayId),
</span><span class="cx">       mAttributeMap(),
</span><span class="cx">       mConfigSet(),
</span><span class="cx">       mContextSet(),
</span><ins>+      mStreamSet(),
</ins><span class="cx">       mInitialized(false),
</span><span class="cx">       mCaps(),
</span><span class="cx">       mDisplayExtensions(),
</span><span class="cx">       mDisplayExtensionString(),
</span><span class="cx">       mVendorString(),
</span><del>-      mDevice(nullptr)
</del><ins>+      mDevice(eglDevice),
+      mPlatform(platform)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -201,12 +318,28 @@
</span><span class="cx"> {
</span><span class="cx">     terminate();
</span><span class="cx"> 
</span><del>-    DisplayMap *displays = GetDisplayMap();
-    DisplayMap::iterator iter = displays-&gt;find(mDisplayId);
-    if (iter != displays-&gt;end())
</del><ins>+    if (mPlatform == EGL_PLATFORM_ANGLE_ANGLE)
</ins><span class="cx">     {
</span><del>-        displays-&gt;erase(iter);
</del><ins>+        ANGLEPlatformDisplayMap *displays      = GetANGLEPlatformDisplayMap();
+        ANGLEPlatformDisplayMap::iterator iter = displays-&gt;find(mDisplayId);
+        if (iter != displays-&gt;end())
+        {
+            displays-&gt;erase(iter);
+        }
</ins><span class="cx">     }
</span><ins>+    else if (mPlatform == EGL_PLATFORM_DEVICE_EXT)
+    {
+        DevicePlatformDisplayMap *displays      = GetDevicePlatformDisplayMap();
+        DevicePlatformDisplayMap::iterator iter = displays-&gt;find(mDevice);
+        if (iter != displays-&gt;end())
+        {
+            displays-&gt;erase(iter);
+        }
+    }
+    else
+    {
+        UNREACHABLE();
+    }
</ins><span class="cx"> 
</span><span class="cx">     SafeDelete(mDevice);
</span><span class="cx">     SafeDelete(mImplementation);
</span><span class="lines">@@ -225,18 +358,27 @@
</span><span class="cx"> 
</span><span class="cx"> Error Display::initialize()
</span><span class="cx"> {
</span><ins>+    // Re-initialize default platform if it's needed
+    InitDefaultPlatformImpl();
+
+    SCOPED_ANGLE_HISTOGRAM_TIMER(&quot;GPU.ANGLE.DisplayInitializeMS&quot;);
</ins><span class="cx">     TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;egl::Display::initialize&quot;);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(mImplementation != nullptr);
</span><span class="cx"> 
</span><span class="cx">     if (isInitialized())
</span><span class="cx">     {
</span><del>-        return Error(EGL_SUCCESS);
</del><ins>+        return egl::Error(EGL_SUCCESS);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Error error = mImplementation-&gt;initialize(this);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><ins>+        // Log extended error message here
+        std::stringstream errorStream;
+        errorStream &lt;&lt; &quot;ANGLE Display::initialize error &quot; &lt;&lt; error.getID() &lt;&lt; &quot;: &quot;
+                    &lt;&lt; error.getMessage();
+        ANGLEPlatformCurrent()-&gt;logError(errorStream.str().c_str());
</ins><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -252,23 +394,39 @@
</span><span class="cx">     initDisplayExtensions();
</span><span class="cx">     initVendorString();
</span><span class="cx"> 
</span><del>-    if (mDisplayExtensions.deviceQuery)
</del><ins>+    // Populate the Display's EGLDeviceEXT if the Display wasn't created using one
+    if (mPlatform != EGL_PLATFORM_DEVICE_EXT)
</ins><span class="cx">     {
</span><del>-        rx::DeviceImpl *impl = nullptr;
-        error = mImplementation-&gt;getDevice(&amp;impl);
-        if (error.isError())
</del><ins>+        if (mDisplayExtensions.deviceQuery)
</ins><span class="cx">         {
</span><del>-            return error;
</del><ins>+            rx::DeviceImpl *impl = nullptr;
+            error = mImplementation-&gt;getDevice(&amp;impl);
+            if (error.isError())
+            {
+                return error;
+            }
+
+            error = Device::CreateDevice(this, impl, &amp;mDevice);
+            if (error.isError())
+            {
+                return error;
+            }
</ins><span class="cx">         }
</span><del>-        mDevice = new Device(this, impl);
</del><ins>+        else
+        {
+            mDevice = nullptr;
+        }
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        mDevice = nullptr;
</del><ins>+        // For EGL_PLATFORM_DEVICE_EXT, mDevice should always be populated using
+        // an external device
+        ASSERT(mDevice != nullptr);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mInitialized = true;
</span><del>-    return Error(EGL_SUCCESS);
</del><ins>+
+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Display::terminate()
</span><span class="lines">@@ -280,14 +438,35 @@
</span><span class="cx">         destroyContext(*mContextSet.begin());
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    while (!mImageSet.empty())
+    {
+        destroyImage(*mImageSet.begin());
+    }
+
+    while (!mStreamSet.empty())
+    {
+        destroyStream(*mStreamSet.begin());
+    }
+
+    while (!mImplementation-&gt;getSurfaceSet().empty())
+    {
+        destroySurface(*mImplementation-&gt;getSurfaceSet().begin());
+    }
+
</ins><span class="cx">     mConfigSet.clear();
</span><span class="cx"> 
</span><ins>+    if (mDevice != nullptr &amp;&amp; mDevice-&gt;getOwningDisplay() != nullptr)
+    {
+        // Don't delete the device if it was created externally using eglCreateDeviceANGLE
+        // We also shouldn't set it to null in case eglInitialize() is called again later
+        SafeDelete(mDevice);
+    }
+
</ins><span class="cx">     mImplementation-&gt;terminate();
</span><span class="cx"> 
</span><span class="cx">     mInitialized = false;
</span><span class="cx"> 
</span><del>-    // De-init default platform
-    DeinitDefaultPlatformImpl();
</del><ins>+    // Never de-init default platform.. terminate is not that final.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> std::vector&lt;const Config*&gt; Display::getConfigs(const egl::AttributeMap &amp;attribs) const
</span><span class="lines">@@ -310,6 +489,7 @@
</span><span class="cx">       case EGL_CONFIG_ID:                 *value = configuration-&gt;configID;               break;
</span><span class="cx">       case EGL_LEVEL:                     *value = configuration-&gt;level;                  break;
</span><span class="cx">       case EGL_NATIVE_RENDERABLE:         *value = configuration-&gt;nativeRenderable;       break;
</span><ins>+      case EGL_NATIVE_VISUAL_ID:          *value = configuration-&gt;nativeVisualID;         break;
</ins><span class="cx">       case EGL_NATIVE_VISUAL_TYPE:        *value = configuration-&gt;nativeVisualType;       break;
</span><span class="cx">       case EGL_SAMPLES:                   *value = configuration-&gt;samples;                break;
</span><span class="cx">       case EGL_SAMPLE_BUFFERS:            *value = configuration-&gt;sampleBuffers;          break;
</span><span class="lines">@@ -331,6 +511,15 @@
</span><span class="cx">       case EGL_MAX_PBUFFER_WIDTH:         *value = configuration-&gt;maxPBufferWidth;        break;
</span><span class="cx">       case EGL_MAX_PBUFFER_HEIGHT:        *value = configuration-&gt;maxPBufferHeight;       break;
</span><span class="cx">       case EGL_MAX_PBUFFER_PIXELS:        *value = configuration-&gt;maxPBufferPixels;       break;
</span><ins>+
+      case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
+          if (!getExtensions().surfaceOrientation)
+          {
+              return false;
+          }
+          *value = configuration-&gt;optimalOrientation;
+          break;
+
</ins><span class="cx">       default:
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -350,14 +539,16 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    rx::SurfaceImpl *surfaceImpl = nullptr;
-    Error error = mImplementation-&gt;createWindowSurface(configuration, window, attribs, &amp;surfaceImpl);
</del><ins>+    rx::SurfaceImpl *surfaceImpl = mImplementation-&gt;createWindowSurface(configuration, window, attribs);
+    ASSERT(surfaceImpl != nullptr);
+
+    Error error = surfaceImpl-&gt;initialize();
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><ins>+        SafeDelete(surfaceImpl);
</ins><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(surfaceImpl != nullptr);
</del><span class="cx">     Surface *surface = new Surface(surfaceImpl, EGL_WINDOW_BIT, configuration, attribs);
</span><span class="cx">     mImplementation-&gt;getSurfaceSet().insert(surface);
</span><span class="cx"> 
</span><span class="lines">@@ -367,7 +558,7 @@
</span><span class="cx"> 
</span><span class="cx">     ASSERT(outSurface != nullptr);
</span><span class="cx">     *outSurface = surface;
</span><del>-    return Error(EGL_SUCCESS);
</del><ins>+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error Display::createPbufferSurface(const Config *configuration, const AttributeMap &amp;attribs, Surface **outSurface)
</span><span class="lines">@@ -383,20 +574,22 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    rx::SurfaceImpl *surfaceImpl = nullptr;
-    Error error = mImplementation-&gt;createPbufferSurface(configuration, attribs, &amp;surfaceImpl);
</del><ins>+    rx::SurfaceImpl *surfaceImpl = mImplementation-&gt;createPbufferSurface(configuration, attribs);
+    ASSERT(surfaceImpl != nullptr);
+
+    Error error = surfaceImpl-&gt;initialize();
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><ins>+        SafeDelete(surfaceImpl);
</ins><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(surfaceImpl != nullptr);
</del><span class="cx">     Surface *surface = new Surface(surfaceImpl, EGL_PBUFFER_BIT, configuration, attribs);
</span><span class="cx">     mImplementation-&gt;getSurfaceSet().insert(surface);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(outSurface != nullptr);
</span><span class="cx">     *outSurface = surface;
</span><del>-    return Error(EGL_SUCCESS);
</del><ins>+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error Display::createPbufferFromClientBuffer(const Config *configuration, EGLClientBuffer shareHandle,
</span><span class="lines">@@ -413,20 +606,22 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    rx::SurfaceImpl *surfaceImpl = nullptr;
-    Error error = mImplementation-&gt;createPbufferFromClientBuffer(configuration, shareHandle, attribs, &amp;surfaceImpl);
</del><ins>+    rx::SurfaceImpl *surfaceImpl = mImplementation-&gt;createPbufferFromClientBuffer(configuration, shareHandle, attribs);
+    ASSERT(surfaceImpl != nullptr);
+
+    Error error = surfaceImpl-&gt;initialize();
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><ins>+        SafeDelete(surfaceImpl);
</ins><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(surfaceImpl != nullptr);
</del><span class="cx">     Surface *surface = new Surface(surfaceImpl, EGL_PBUFFER_BIT, configuration, attribs);
</span><span class="cx">     mImplementation-&gt;getSurfaceSet().insert(surface);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(outSurface != nullptr);
</span><span class="cx">     *outSurface = surface;
</span><del>-    return Error(EGL_SUCCESS);
</del><ins>+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error Display::createPixmapSurface(const Config *configuration, NativePixmapType nativePixmap, const AttributeMap &amp;attribs,
</span><span class="lines">@@ -443,24 +638,29 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    rx::SurfaceImpl *surfaceImpl = nullptr;
-    Error error = mImplementation-&gt;createPixmapSurface(configuration, nativePixmap, attribs, &amp;surfaceImpl);
</del><ins>+    rx::SurfaceImpl *surfaceImpl = mImplementation-&gt;createPixmapSurface(configuration, nativePixmap, attribs);
+    ASSERT(surfaceImpl != nullptr);
+
+    Error error = surfaceImpl-&gt;initialize();
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><ins>+        SafeDelete(surfaceImpl);
</ins><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(surfaceImpl != nullptr);
</del><span class="cx">     Surface *surface = new Surface(surfaceImpl, EGL_PIXMAP_BIT, configuration, attribs);
</span><span class="cx">     mImplementation-&gt;getSurfaceSet().insert(surface);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(outSurface != nullptr);
</span><span class="cx">     *outSurface = surface;
</span><del>-    return Error(EGL_SUCCESS);
</del><ins>+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Display::createContext(const Config *configuration, gl::Context *shareContext, const AttributeMap &amp;attribs,
-                             gl::Context **outContext)
</del><ins>+Error Display::createImage(gl::Context *context,
+                           EGLenum target,
+                           EGLClientBuffer buffer,
+                           const AttributeMap &amp;attribs,
+                           Image **outImage)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isInitialized());
</span><span class="cx"> 
</span><span class="lines">@@ -473,19 +673,83 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::Context *context = nullptr;
-    Error error = mImplementation-&gt;createContext(configuration, shareContext, attribs, &amp;context);
</del><ins>+    egl::ImageSibling *sibling = nullptr;
+    if (IsTextureTarget(target))
+    {
+        sibling = context-&gt;getTexture(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
+    }
+    else if (IsRenderbufferTarget(target))
+    {
+        sibling = context-&gt;getRenderbuffer(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
+    }
+    else
+    {
+        UNREACHABLE();
+    }
+    ASSERT(sibling != nullptr);
+
+    rx::ImageImpl *imageImpl = mImplementation-&gt;createImage(target, sibling, attribs);
+    ASSERT(imageImpl != nullptr);
+
+    Error error = imageImpl-&gt;initialize();
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    Image *image = new Image(imageImpl, target, sibling, attribs);
+
+    ASSERT(outImage != nullptr);
+    *outImage = image;
+
+    // Add this image to the list of all images and hold a ref to it.
+    image-&gt;addRef();
+    mImageSet.insert(image);
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+Error Display::createStream(const AttributeMap &amp;attribs, Stream **outStream)
+{
+    ASSERT(isInitialized());
+
+    rx::StreamImpl *streamImpl = mImplementation-&gt;createStream(attribs);
+    ASSERT(streamImpl != nullptr);
+
+    Stream *stream = new Stream(streamImpl, attribs);
+
+    ASSERT(stream != nullptr);
+    mStreamSet.insert(stream);
+
+    ASSERT(outStream != nullptr);
+    *outStream = stream;
+
+    return Error(EGL_SUCCESS);
+}
+
+Error Display::createContext(const Config *configuration, gl::Context *shareContext, const AttributeMap &amp;attribs,
+                             gl::Context **outContext)
+{
+    ASSERT(isInitialized());
+
+    if (mImplementation-&gt;testDeviceLost())
+    {
+        Error error = restoreLostDevice();
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+
+    gl::Context *context = *outContext =
+        mImplementation-&gt;createContext(configuration, shareContext, attribs);
+
</ins><span class="cx">     ASSERT(context != nullptr);
</span><span class="cx">     mContextSet.insert(context);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(outContext != nullptr);
</span><span class="cx">     *outContext = context;
</span><del>-    return Error(EGL_SUCCESS);
</del><ins>+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error Display::makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context)
</span><span class="lines">@@ -538,11 +802,26 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         ASSERT(surfaceRemoved);
</span><ins>+        UNUSED_ASSERTION_VARIABLE(surfaceRemoved);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mImplementation-&gt;destroySurface(surface);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Display::destroyImage(egl::Image *image)
+{
+    auto iter = mImageSet.find(image);
+    ASSERT(iter != mImageSet.end());
+    (*iter)-&gt;release();
+    mImageSet.erase(iter);
+}
+
+void Display::destroyStream(egl::Stream *stream)
+{
+    mStreamSet.erase(stream);
+    SafeDelete(stream);
+}
+
</ins><span class="cx"> void Display::destroyContext(gl::Context *context)
</span><span class="cx"> {
</span><span class="cx">     mContextSet.erase(context);
</span><span class="lines">@@ -569,6 +848,16 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Error Display::waitClient() const
+{
+    return mImplementation-&gt;waitClient();
+}
+
+Error Display::waitNative(EGLint engine, egl::Surface *drawSurface, egl::Surface *readSurface) const
+{
+    return mImplementation-&gt;waitNative(engine, drawSurface, readSurface);
+}
+
</ins><span class="cx"> const Caps &amp;Display::getCaps() const
</span><span class="cx"> {
</span><span class="cx">     return mCaps;
</span><span class="lines">@@ -594,6 +883,16 @@
</span><span class="cx">     return mImplementation-&gt;getSurfaceSet().find(surface) != mImplementation-&gt;getSurfaceSet().end();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Display::isValidImage(const Image *image) const
+{
+    return mImageSet.find(const_cast&lt;Image *&gt;(image)) != mImageSet.end();
+}
+
+bool Display::isValidStream(const Stream *stream) const
+{
+    return mStreamSet.find(const_cast&lt;Stream *&gt;(stream)) != mStreamSet.end();
+}
+
</ins><span class="cx"> bool Display::hasExistingWindowSurface(EGLNativeWindowType window)
</span><span class="cx"> {
</span><span class="cx">     WindowSurfaceMap *windowSurfaces = GetWindowSurfaces();
</span><span class="lines">@@ -612,12 +911,25 @@
</span><span class="cx"> 
</span><span class="cx"> #if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
</span><span class="cx">     extensions.platformANGLED3D = true;
</span><ins>+    extensions.platformDevice   = true;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if defined(ANGLE_ENABLE_OPENGL)
</span><span class="cx">     extensions.platformANGLEOpenGL = true;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if defined(ANGLE_ENABLE_D3D11)
+    extensions.deviceCreation      = true;
+    extensions.deviceCreationD3D11 = true;
+    extensions.experimentalPresentPath = true;
+#endif
+
+#if defined(ANGLE_USE_X11)
+    extensions.x11Visual = true;
+#endif
+
+    extensions.clientGetAllProcAddresses = true;
+
</ins><span class="cx">     return extensions;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -646,6 +958,10 @@
</span><span class="cx"> void Display::initDisplayExtensions()
</span><span class="cx"> {
</span><span class="cx">     mDisplayExtensions = mImplementation-&gt;getExtensions();
</span><ins>+
+    // Force EGL_KHR_get_all_proc_addresses on.
+    mDisplayExtensions.getAllProcAddresses = true;
+
</ins><span class="cx">     mDisplayExtensionString = GenerateExtensionsString(mDisplayExtensions);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -654,6 +970,29 @@
</span><span class="cx">     return mImplementation-&gt;isValidNativeWindow(window);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Display::isValidDisplay(const egl::Display *display)
+{
+    const ANGLEPlatformDisplayMap *anglePlatformDisplayMap = GetANGLEPlatformDisplayMap();
+    for (const auto &amp;displayPair : *anglePlatformDisplayMap)
+    {
+        if (displayPair.second == display)
+        {
+            return true;
+        }
+    }
+
+    const DevicePlatformDisplayMap *devicePlatformDisplayMap = GetDevicePlatformDisplayMap();
+    for (const auto &amp;displayPair : *devicePlatformDisplayMap)
+    {
+        if (displayPair.second == display)
+        {
+            return true;
+        }
+    }
+
+    return false;
+}
+
</ins><span class="cx"> bool Display::isValidNativeDisplay(EGLNativeDisplayType display)
</span><span class="cx"> {
</span><span class="cx">     // TODO(jmadill): handle this properly
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEDisplayh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Display.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Display.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Display.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -32,8 +32,10 @@
</span><span class="cx"> 
</span><span class="cx"> namespace egl
</span><span class="cx"> {
</span><ins>+class Device;
+class Image;
</ins><span class="cx"> class Surface;
</span><del>-class Device;
</del><ins>+class Stream;
</ins><span class="cx"> 
</span><span class="cx"> class Display final : angle::NonCopyable
</span><span class="cx"> {
</span><span class="lines">@@ -43,7 +45,8 @@
</span><span class="cx">     Error initialize();
</span><span class="cx">     void terminate();
</span><span class="cx"> 
</span><del>-    static egl::Display *getDisplay(EGLNativeDisplayType displayId, const AttributeMap &amp;attribMap);
</del><ins>+    static egl::Display *GetDisplayFromDevice(void *native_display);
+    static egl::Display *GetDisplayFromAttribs(void *native_display, const AttributeMap &amp;attribMap);
</ins><span class="cx"> 
</span><span class="cx">     static const ClientExtensions &amp;getClientExtensions();
</span><span class="cx">     static const std::string &amp;getClientExtensionString();
</span><span class="lines">@@ -59,20 +62,33 @@
</span><span class="cx">     Error createPixmapSurface(const Config *configuration, NativePixmapType nativePixmap, const AttributeMap &amp;attribs,
</span><span class="cx">                               Surface **outSurface);
</span><span class="cx"> 
</span><ins>+    Error createImage(gl::Context *context,
+                      EGLenum target,
+                      EGLClientBuffer buffer,
+                      const AttributeMap &amp;attribs,
+                      Image **outImage);
+
+    Error createStream(const AttributeMap &amp;attribs, Stream **outStream);
+
</ins><span class="cx">     Error createContext(const Config *configuration, gl::Context *shareContext, const AttributeMap &amp;attribs,
</span><span class="cx">                         gl::Context **outContext);
</span><span class="cx"> 
</span><span class="cx">     Error makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context);
</span><span class="cx"> 
</span><span class="cx">     void destroySurface(egl::Surface *surface);
</span><ins>+    void destroyImage(egl::Image *image);
+    void destroyStream(egl::Stream *stream);
</ins><span class="cx">     void destroyContext(gl::Context *context);
</span><span class="cx"> 
</span><span class="cx">     bool isInitialized() const;
</span><span class="cx">     bool isValidConfig(const Config *config) const;
</span><span class="cx">     bool isValidContext(gl::Context *context) const;
</span><span class="cx">     bool isValidSurface(egl::Surface *surface) const;
</span><ins>+    bool isValidImage(const Image *image) const;
+    bool isValidStream(const Stream *stream) const;
</ins><span class="cx">     bool isValidNativeWindow(EGLNativeWindowType window) const;
</span><span class="cx"> 
</span><ins>+    static bool isValidDisplay(const egl::Display *display);
</ins><span class="cx">     static bool isValidNativeDisplay(EGLNativeDisplayType display);
</span><span class="cx">     static bool hasExistingWindowSurface(EGLNativeWindowType window);
</span><span class="cx"> 
</span><span class="lines">@@ -80,6 +96,9 @@
</span><span class="cx">     bool testDeviceLost();
</span><span class="cx">     void notifyDeviceLost();
</span><span class="cx"> 
</span><ins>+    Error waitClient() const;
+    Error waitNative(EGLint engine, egl::Surface *drawSurface, egl::Surface *readSurface) const;
+
</ins><span class="cx">     const Caps &amp;getCaps() const;
</span><span class="cx"> 
</span><span class="cx">     const DisplayExtensions &amp;getExtensions() const;
</span><span class="lines">@@ -91,9 +110,10 @@
</span><span class="cx"> 
</span><span class="cx">     rx::DisplayImpl *getImplementation() { return mImplementation; }
</span><span class="cx">     Device *getDevice() const;
</span><ins>+    EGLenum getPlatform() const { return mPlatform; }
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    Display(EGLNativeDisplayType displayId);
</del><ins>+    Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice);
</ins><span class="cx"> 
</span><span class="cx">     void setAttributes(rx::DisplayImpl *impl, const AttributeMap &amp;attribMap);
</span><span class="cx"> 
</span><span class="lines">@@ -112,6 +132,12 @@
</span><span class="cx">     typedef std::set&lt;gl::Context*&gt; ContextSet;
</span><span class="cx">     ContextSet mContextSet;
</span><span class="cx"> 
</span><ins>+    typedef std::set&lt;Image *&gt; ImageSet;
+    ImageSet mImageSet;
+
+    typedef std::set&lt;Stream *&gt; StreamSet;
+    StreamSet mStreamSet;
+
</ins><span class="cx">     bool mInitialized;
</span><span class="cx"> 
</span><span class="cx">     Caps mCaps;
</span><span class="lines">@@ -121,7 +147,8 @@
</span><span class="cx"> 
</span><span class="cx">     std::string mVendorString;
</span><span class="cx"> 
</span><del>-    Device* mDevice;
</del><ins>+    Device *mDevice;
+    EGLenum mPlatform;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEErrorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,9 +16,7 @@
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-Error::Error(GLenum errorCode, const char *msg, ...)
-    : mCode(errorCode),
-      mMessage(nullptr)
</del><ins>+Error::Error(GLenum errorCode, const char *msg, ...) : mCode(errorCode), mID(errorCode)
</ins><span class="cx"> {
</span><span class="cx">     va_list vararg;
</span><span class="cx">     va_start(vararg, msg);
</span><span class="lines">@@ -27,11 +25,20 @@
</span><span class="cx">     va_end(vararg);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Error::Error(GLenum errorCode, GLuint id, const char *msg, ...) : mCode(errorCode), mID(id)
+{
+    va_list vararg;
+    va_start(vararg, msg);
+    createMessageString();
+    *mMessage = FormatString(msg, vararg);
+    va_end(vararg);
+}
+
</ins><span class="cx"> void Error::createMessageString() const
</span><span class="cx"> {
</span><del>-    if (mMessage == nullptr)
</del><ins>+    if (!mMessage)
</ins><span class="cx">     {
</span><del>-        mMessage = new std::string();
</del><ins>+        mMessage.reset(new std::string);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -41,15 +48,28 @@
</span><span class="cx">     return *mMessage;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Error::operator==(const Error &amp;other) const
+{
+    if (mCode != other.mCode)
+        return false;
+
+    // TODO(jmadill): Compare extended error codes instead of strings.
+    if ((!mMessage || !other.mMessage) &amp;&amp; (!mMessage != !other.mMessage))
+        return false;
+
+    return (*mMessage == *other.mMessage);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Error::operator!=(const Error &amp;other) const
+{
+    return !(*this == other);
+}
+}
+
</ins><span class="cx"> namespace egl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-Error::Error(EGLint errorCode, const char *msg, ...)
-    : mCode(errorCode),
-      mID(0),
-      mMessage(nullptr)
</del><ins>+Error::Error(EGLint errorCode, const char *msg, ...) : mCode(errorCode), mID(0)
</ins><span class="cx"> {
</span><span class="cx">     va_list vararg;
</span><span class="cx">     va_start(vararg, msg);
</span><span class="lines">@@ -58,10 +78,7 @@
</span><span class="cx">     va_end(vararg);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error::Error(EGLint errorCode, EGLint id, const char *msg, ...)
-    : mCode(errorCode),
-      mID(id),
-      mMessage(nullptr)
</del><ins>+Error::Error(EGLint errorCode, EGLint id, const char *msg, ...) : mCode(errorCode), mID(id)
</ins><span class="cx"> {
</span><span class="cx">     va_list vararg;
</span><span class="cx">     va_start(vararg, msg);
</span><span class="lines">@@ -69,11 +86,12 @@
</span><span class="cx">     *mMessage = FormatString(msg, vararg);
</span><span class="cx">     va_end(vararg);
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> void Error::createMessageString() const
</span><span class="cx"> {
</span><del>-    if (mMessage == nullptr)
</del><ins>+    if (!mMessage)
</ins><span class="cx">     {
</span><del>-        mMessage = new std::string();
</del><ins>+        mMessage.reset(new std::string);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEErrorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,6 +13,7 @@
</span><span class="cx"> #include &lt;EGL/egl.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;string&gt;
</span><ins>+#include &lt;memory&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="lines">@@ -22,28 +23,64 @@
</span><span class="cx">   public:
</span><span class="cx">     explicit inline Error(GLenum errorCode);
</span><span class="cx">     Error(GLenum errorCode, const char *msg, ...);
</span><ins>+    Error(GLenum errorCode, GLuint id, const char *msg, ...);
</ins><span class="cx">     inline Error(const Error &amp;other);
</span><span class="cx">     inline Error(Error &amp;&amp;other);
</span><span class="cx"> 
</span><del>-    inline ~Error();
-
</del><span class="cx">     inline Error &amp;operator=(const Error &amp;other);
</span><span class="cx">     inline Error &amp;operator=(Error &amp;&amp;other);
</span><span class="cx"> 
</span><span class="cx">     inline GLenum getCode() const;
</span><ins>+    inline GLuint getID() const;
</ins><span class="cx">     inline bool isError() const;
</span><span class="cx"> 
</span><span class="cx">     const std::string &amp;getMessage() const;
</span><span class="cx"> 
</span><ins>+    // Useful for mocking and testing
+    bool operator==(const Error &amp;other) const;
+    bool operator!=(const Error &amp;other) const;
+
</ins><span class="cx">   private:
</span><span class="cx">     void createMessageString() const;
</span><span class="cx"> 
</span><span class="cx">     GLenum mCode;
</span><del>-    mutable std::string *mMessage;
</del><ins>+    GLuint mID;
+    mutable std::unique_ptr&lt;std::string&gt; mMessage;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+template &lt;typename T&gt;
+class ErrorOrResult
+{
+  public:
+    ErrorOrResult(const gl::Error &amp;error) : mError(error) {}
+    ErrorOrResult(gl::Error &amp;&amp;error) : mError(std::move(error)) {}
+
+    ErrorOrResult(T &amp;&amp;result)
+        : mError(GL_NO_ERROR), mResult(std::forward&lt;T&gt;(result))
+    {
+    }
+
+    ErrorOrResult(const T &amp;result)
+        : mError(GL_NO_ERROR), mResult(result)
+    {
+    }
+
+    bool isError() const { return mError.isError(); }
+    const gl::Error &amp;getError() const { return mError; }
+    T &amp;&amp;getResult() { return std::move(mResult); }
+
+  private:
+    Error mError;
+    T mResult;
+};
+
+inline Error NoError()
+{
+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}  // namespace gl
+
</ins><span class="cx"> namespace egl
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -56,8 +93,6 @@
</span><span class="cx">     inline Error(const Error &amp;other);
</span><span class="cx">     inline Error(Error &amp;&amp;other);
</span><span class="cx"> 
</span><del>-    inline ~Error();
-
</del><span class="cx">     inline Error &amp;operator=(const Error &amp;other);
</span><span class="cx">     inline Error &amp;operator=(Error &amp;&amp;other);
</span><span class="cx"> 
</span><span class="lines">@@ -72,11 +107,40 @@
</span><span class="cx"> 
</span><span class="cx">     EGLint mCode;
</span><span class="cx">     EGLint mID;
</span><del>-    mutable std::string *mMessage;
</del><ins>+    mutable std::unique_ptr&lt;std::string&gt; mMessage;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace egl
</ins><span class="cx"> 
</span><ins>+#define ANGLE_CONCAT1(x, y) x##y
+#define ANGLE_CONCAT2(x, y) ANGLE_CONCAT1(x, y)
+#define ANGLE_LOCAL_VAR ANGLE_CONCAT2(_localVar, __LINE__)
+
+#define ANGLE_TRY(EXPR)                \
+    {                                  \
+        auto ANGLE_LOCAL_VAR = EXPR;   \
+        if (ANGLE_LOCAL_VAR.isError()) \
+        {                              \
+            return ANGLE_LOCAL_VAR;    \
+        }                              \
+    }                                  \
+    ANGLE_EMPTY_STATEMENT
+
+#define ANGLE_TRY_RESULT(EXPR, RESULT)         \
+    {                                          \
+        auto ANGLE_LOCAL_VAR = EXPR;           \
+        if (ANGLE_LOCAL_VAR.isError())         \
+        {                                      \
+            return ANGLE_LOCAL_VAR.getError(); \
+        }                                      \
+        RESULT = ANGLE_LOCAL_VAR.getResult();  \
+    }                                          \
+    ANGLE_EMPTY_STATEMENT
+
+#undef ANGLE_LOCAL_VAR
+#undef ANGLE_CONCAT2
+#undef ANGLE_CONCAT1
+
</ins><span class="cx"> #include &quot;Error.inl&quot;
</span><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_ERROR_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEErrorinl"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.inl (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.inl        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Error.inl        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,15 +15,15 @@
</span><span class="cx"> 
</span><span class="cx"> Error::Error(GLenum errorCode)
</span><span class="cx">     : mCode(errorCode),
</span><del>-      mMessage(nullptr)
</del><ins>+      mID(errorCode)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error::Error(const Error &amp;other)
</span><span class="cx">     : mCode(other.mCode),
</span><del>-      mMessage(nullptr)
</del><ins>+      mID(other.mID)
</ins><span class="cx"> {
</span><del>-    if (other.mMessage != nullptr)
</del><ins>+    if (other.mMessage)
</ins><span class="cx">     {
</span><span class="cx">         createMessageString();
</span><span class="cx">         *mMessage = *(other.mMessage);
</span><span class="lines">@@ -32,28 +32,24 @@
</span><span class="cx"> 
</span><span class="cx"> Error::Error(Error &amp;&amp;other)
</span><span class="cx">     : mCode(other.mCode),
</span><del>-      mMessage(other.mMessage)
</del><ins>+      mID(other.mID),
+      mMessage(std::move(other.mMessage))
</ins><span class="cx"> {
</span><del>-    other.mMessage = nullptr;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error::~Error()
-{
-    SafeDelete(mMessage);
-}
-
</del><span class="cx"> Error &amp;Error::operator=(const Error &amp;other)
</span><span class="cx"> {
</span><span class="cx">     mCode = other.mCode;
</span><ins>+    mID = other.mID;
</ins><span class="cx"> 
</span><del>-    if (other.mMessage != nullptr)
</del><ins>+    if (other.mMessage)
</ins><span class="cx">     {
</span><span class="cx">         createMessageString();
</span><span class="cx">         *mMessage = *(other.mMessage);
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        SafeDelete(mMessage);
</del><ins>+        mMessage.release();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return *this;
</span><span class="lines">@@ -61,11 +57,13 @@
</span><span class="cx"> 
</span><span class="cx"> Error &amp;Error::operator=(Error &amp;&amp;other)
</span><span class="cx"> {
</span><del>-    mCode = other.mCode;
-    mMessage = other.mMessage;
</del><ins>+    if (this != &amp;other)
+    {
+        mCode = other.mCode;
+        mID = other.mID;
+        mMessage = std::move(other.mMessage);
+    }
</ins><span class="cx"> 
</span><del>-    other.mMessage = nullptr;
-
</del><span class="cx">     return *this;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -74,6 +72,11 @@
</span><span class="cx">     return mCode;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLuint Error::getID() const
+{
+    return mID;
+}
+
</ins><span class="cx"> bool Error::isError() const
</span><span class="cx"> {
</span><span class="cx">     return (mCode != GL_NO_ERROR);
</span><span class="lines">@@ -86,17 +89,15 @@
</span><span class="cx"> 
</span><span class="cx"> Error::Error(EGLint errorCode)
</span><span class="cx">     : mCode(errorCode),
</span><del>-      mID(0),
-      mMessage(nullptr)
</del><ins>+      mID(0)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error::Error(const Error &amp;other)
</span><span class="cx">     : mCode(other.mCode),
</span><del>-      mID(other.mID),
-      mMessage(nullptr)
</del><ins>+      mID(other.mID)
</ins><span class="cx"> {
</span><del>-    if (other.mMessage != nullptr)
</del><ins>+    if (other.mMessage)
</ins><span class="cx">     {
</span><span class="cx">         createMessageString();
</span><span class="cx">         *mMessage = *(other.mMessage);
</span><span class="lines">@@ -106,29 +107,23 @@
</span><span class="cx"> Error::Error(Error &amp;&amp;other)
</span><span class="cx">     : mCode(other.mCode),
</span><span class="cx">       mID(other.mID),
</span><del>-      mMessage(other.mMessage)
</del><ins>+      mMessage(std::move(other.mMessage))
</ins><span class="cx"> {
</span><del>-    other.mMessage = nullptr;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error::~Error()
-{
-    SafeDelete(mMessage);
-}
-
</del><span class="cx"> Error &amp;Error::operator=(const Error &amp;other)
</span><span class="cx"> {
</span><span class="cx">     mCode = other.mCode;
</span><span class="cx">     mID = other.mID;
</span><span class="cx"> 
</span><del>-    if (other.mMessage != nullptr)
</del><ins>+    if (other.mMessage)
</ins><span class="cx">     {
</span><span class="cx">         createMessageString();
</span><span class="cx">         *mMessage = *(other.mMessage);
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        SafeDelete(mMessage);
</del><ins>+        mMessage.release();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return *this;
</span><span class="lines">@@ -136,12 +131,13 @@
</span><span class="cx"> 
</span><span class="cx"> Error &amp;Error::operator=(Error &amp;&amp;other)
</span><span class="cx"> {
</span><del>-    mCode = other.mCode;
-    mID = other.mID;
-    mMessage = other.mMessage;
</del><ins>+    if (this != &amp;other)
+    {
+        mCode = other.mCode;
+        mID = other.mID;
+        mMessage = std::move(other.mMessage);
+    }
</ins><span class="cx"> 
</span><del>-    other.mMessage = nullptr;
-
</del><span class="cx">     return *this;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEFencecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Fence.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Fence.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Fence.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -76,10 +76,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FenceSync::FenceSync(rx::FenceSyncImpl *impl, GLuint id)
</span><del>-    : RefCountObject(id),
-      mFence(impl),
-      mCondition(GL_NONE),
-      mFlags(0)
</del><ins>+    : RefCountObject(id), mFence(impl), mLabel(), mCondition(GL_NONE), mFlags(0)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -88,6 +85,16 @@
</span><span class="cx">     SafeDelete(mFence);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void FenceSync::setLabel(const std::string &amp;label)
+{
+    mLabel = label;
+}
+
+const std::string &amp;FenceSync::getLabel() const
+{
+    return mLabel;
+}
+
</ins><span class="cx"> Error FenceSync::set(GLenum condition, GLbitfield flags)
</span><span class="cx"> {
</span><span class="cx">     Error error = mFence-&gt;set(condition, flags);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEFenceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Fence.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Fence.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Fence.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,6 +10,7 @@
</span><span class="cx"> #ifndef LIBANGLE_FENCE_H_
</span><span class="cx"> #define LIBANGLE_FENCE_H_
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/Debug.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/RefCountObject.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -47,12 +48,15 @@
</span><span class="cx">     GLenum mCondition;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class FenceSync final : public RefCountObject
</del><ins>+class FenceSync final : public RefCountObject, public LabeledObject
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    explicit FenceSync(rx::FenceSyncImpl *impl, GLuint id);
</del><ins>+    FenceSync(rx::FenceSyncImpl *impl, GLuint id);
</ins><span class="cx">     virtual ~FenceSync();
</span><span class="cx"> 
</span><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
+
</ins><span class="cx">     Error set(GLenum condition, GLbitfield flags);
</span><span class="cx">     Error clientWait(GLbitfield flags, GLuint64 timeout, GLenum *outResult);
</span><span class="cx">     Error serverWait(GLbitfield flags, GLuint64 timeout);
</span><span class="lines">@@ -64,6 +68,8 @@
</span><span class="cx">   private:
</span><span class="cx">     rx::FenceSyncImpl *mFence;
</span><span class="cx"> 
</span><ins>+    std::string mLabel;
+
</ins><span class="cx">     GLenum mCondition;
</span><span class="cx">     GLbitfield mFlags;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEFramebuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,6 +9,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/Optional.h&quot;
</ins><span class="cx"> #include &quot;common/utilities.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Config.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Context.h&quot;
</span><span class="lines">@@ -20,7 +21,7 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/FramebufferImpl.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/ImplFactory.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/RenderbufferImpl.h&quot;
</span><del>-#include &quot;libANGLE/renderer/Workarounds.h&quot;
</del><ins>+#include &quot;libANGLE/renderer/SurfaceImpl.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="lines">@@ -38,11 +39,22 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Framebuffer::Data::Data()
+    : mLabel(),
+      mColorAttachments(1),
+      mDrawBufferStates(1, GL_NONE),
+      mReadBufferState(GL_COLOR_ATTACHMENT0_EXT)
+{
+    mDrawBufferStates[0] = GL_COLOR_ATTACHMENT0_EXT;
+}
+
</ins><span class="cx"> Framebuffer::Data::Data(const Caps &amp;caps)
</span><del>-    : mColorAttachments(caps.maxColorAttachments),
</del><ins>+    : mLabel(),
+      mColorAttachments(caps.maxColorAttachments),
</ins><span class="cx">       mDrawBufferStates(caps.maxDrawBuffers, GL_NONE),
</span><span class="cx">       mReadBufferState(GL_COLOR_ATTACHMENT0_EXT)
</span><span class="cx"> {
</span><ins>+    ASSERT(mDrawBufferStates.size() &gt; 0);
</ins><span class="cx">     mDrawBufferStates[0] = GL_COLOR_ATTACHMENT0_EXT;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -50,6 +62,11 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const std::string &amp;Framebuffer::Data::getLabel()
+{
+    return mLabel;
+}
+
</ins><span class="cx"> const FramebufferAttachment *Framebuffer::Data::getReadAttachment() const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(mReadBufferState == GL_BACK || (mReadBufferState &gt;= GL_COLOR_ATTACHMENT0 &amp;&amp; mReadBufferState &lt;= GL_COLOR_ATTACHMENT15));
</span><span class="lines">@@ -84,7 +101,7 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const FramebufferAttachment *Framebuffer::Data::getColorAttachment(unsigned int colorAttachment) const
</del><ins>+const FramebufferAttachment *Framebuffer::Data::getColorAttachment(size_t colorAttachment) const
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(colorAttachment &lt; mColorAttachments.size());
</span><span class="cx">     return mColorAttachments[colorAttachment].isAttached() ?
</span><span class="lines">@@ -116,27 +133,70 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Framebuffer::Framebuffer(const Caps &amp;caps, rx::ImplFactory *factory, GLuint id)
-    : mData(caps),
-      mImpl(nullptr),
-      mId(id)
</del><ins>+bool Framebuffer::Data::attachmentsHaveSameDimensions() const
</ins><span class="cx"> {
</span><del>-    if (mId == 0)
</del><ins>+    Optional&lt;Extents&gt; attachmentSize;
+
+    auto hasMismatchedSize = [&amp;attachmentSize](const FramebufferAttachment &amp;attachment)
</ins><span class="cx">     {
</span><del>-        mImpl = factory-&gt;createDefaultFramebuffer(mData);
</del><ins>+        if (!attachment.isAttached())
+        {
+            return false;
+        }
+
+        if (!attachmentSize.valid())
+        {
+            attachmentSize = attachment.getSize();
+            return false;
+        }
+
+        return (attachment.getSize() != attachmentSize.value());
+    };
+
+    for (const auto &amp;attachment : mColorAttachments)
+    {
+        if (hasMismatchedSize(attachment))
+        {
+            return false;
+        }
</ins><span class="cx">     }
</span><del>-    else
</del><ins>+
+    if (hasMismatchedSize(mDepthAttachment))
</ins><span class="cx">     {
</span><del>-        mImpl = factory-&gt;createFramebuffer(mData);
</del><ins>+        return false;
</ins><span class="cx">     }
</span><ins>+
+    return !hasMismatchedSize(mStencilAttachment);
+}
+
+Framebuffer::Framebuffer(const Caps &amp;caps, rx::ImplFactory *factory, GLuint id)
+    : mData(caps), mImpl(factory-&gt;createFramebuffer(mData)), mId(id)
+{
+    ASSERT(mId != 0);
</ins><span class="cx">     ASSERT(mImpl != nullptr);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Framebuffer::Framebuffer(rx::SurfaceImpl *surface)
+    : mData(), mImpl(surface-&gt;createDefaultFramebuffer(mData)), mId(0)
+{
+    ASSERT(mImpl != nullptr);
+}
+
</ins><span class="cx"> Framebuffer::~Framebuffer()
</span><span class="cx"> {
</span><span class="cx">     SafeDelete(mImpl);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Framebuffer::setLabel(const std::string &amp;label)
+{
+    mData.mLabel = label;
+}
+
+const std::string &amp;Framebuffer::getLabel() const
+{
+    return mData.mLabel;
+}
+
</ins><span class="cx"> void Framebuffer::detachTexture(GLuint textureId)
</span><span class="cx"> {
</span><span class="cx">     detachResourceById(GL_TEXTURE, textureId);
</span><span class="lines">@@ -158,7 +218,7 @@
</span><span class="cx">     DetachMatchingAttachment(&amp;mData.mStencilAttachment, resourceType, resourceId);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const FramebufferAttachment *Framebuffer::getColorbuffer(unsigned int colorAttachment) const
</del><ins>+const FramebufferAttachment *Framebuffer::getColorbuffer(size_t colorAttachment) const
</ins><span class="cx"> {
</span><span class="cx">     return mData.getColorAttachment(colorAttachment);
</span><span class="cx"> }
</span><span class="lines">@@ -228,12 +288,22 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLenum Framebuffer::getDrawBufferState(unsigned int colorAttachment) const
</del><ins>+size_t Framebuffer::getDrawbufferStateCount() const
</ins><span class="cx"> {
</span><del>-    ASSERT(colorAttachment &lt; mData.mDrawBufferStates.size());
-    return mData.mDrawBufferStates[colorAttachment];
</del><ins>+    return mData.mDrawBufferStates.size();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLenum Framebuffer::getDrawBufferState(size_t drawBuffer) const
+{
+    ASSERT(drawBuffer &lt; mData.mDrawBufferStates.size());
+    return mData.mDrawBufferStates[drawBuffer];
+}
+
+const std::vector&lt;GLenum&gt; &amp;Framebuffer::getDrawBufferStates() const
+{
+    return mData.getDrawBufferStates();
+}
+
</ins><span class="cx"> void Framebuffer::setDrawBuffers(size_t count, const GLenum *buffers)
</span><span class="cx"> {
</span><span class="cx">     auto &amp;drawStates = mData.mDrawBufferStates;
</span><span class="lines">@@ -241,9 +311,39 @@
</span><span class="cx">     ASSERT(count &lt;= drawStates.size());
</span><span class="cx">     std::copy(buffers, buffers + count, drawStates.begin());
</span><span class="cx">     std::fill(drawStates.begin() + count, drawStates.end(), GL_NONE);
</span><del>-    mImpl-&gt;setDrawBuffers(count, buffers);
</del><ins>+    mDirtyBits.set(DIRTY_BIT_DRAW_BUFFERS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const FramebufferAttachment *Framebuffer::getDrawBuffer(size_t drawBuffer) const
+{
+    ASSERT(drawBuffer &lt; mData.mDrawBufferStates.size());
+    if (mData.mDrawBufferStates[drawBuffer] != GL_NONE)
+    {
+        // ES3 spec: &quot;If the GL is bound to a draw framebuffer object, the ith buffer listed in bufs
+        // must be COLOR_ATTACHMENTi or NONE&quot;
+        ASSERT(mData.mDrawBufferStates[drawBuffer] == GL_COLOR_ATTACHMENT0 + drawBuffer ||
+               (drawBuffer == 0 &amp;&amp; mData.mDrawBufferStates[drawBuffer] == GL_BACK));
+        return getAttachment(mData.mDrawBufferStates[drawBuffer]);
+    }
+    else
+    {
+        return nullptr;
+    }
+}
+
+bool Framebuffer::hasEnabledDrawBuffer() const
+{
+    for (size_t drawbufferIdx = 0; drawbufferIdx &lt; mData.mDrawBufferStates.size(); ++drawbufferIdx)
+    {
+        if (getDrawBuffer(drawbufferIdx) != nullptr)
+        {
+            return true;
+        }
+    }
+
+    return false;
+}
+
</ins><span class="cx"> GLenum Framebuffer::getReadBufferState() const
</span><span class="cx"> {
</span><span class="cx">     return mData.mReadBufferState;
</span><span class="lines">@@ -255,27 +355,17 @@
</span><span class="cx">            (buffer &gt;= GL_COLOR_ATTACHMENT0 &amp;&amp;
</span><span class="cx">             (buffer - GL_COLOR_ATTACHMENT0) &lt; mData.mColorAttachments.size()));
</span><span class="cx">     mData.mReadBufferState = buffer;
</span><del>-    mImpl-&gt;setReadBuffer(buffer);
</del><ins>+    mDirtyBits.set(DIRTY_BIT_READ_BUFFER);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Framebuffer::isEnabledColorAttachment(unsigned int colorAttachment) const
</del><ins>+size_t Framebuffer::getNumColorBuffers() const
</ins><span class="cx"> {
</span><del>-    ASSERT(colorAttachment &lt; mData.mColorAttachments.size());
-    return (mData.mColorAttachments[colorAttachment].isAttached() &amp;&amp;
-            mData.mDrawBufferStates[colorAttachment] != GL_NONE);
</del><ins>+    return mData.mColorAttachments.size();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Framebuffer::hasEnabledColorAttachment() const
</del><ins>+bool Framebuffer::hasDepth() const
</ins><span class="cx"> {
</span><del>-    for (size_t colorAttachment = 0; colorAttachment &lt; mData.mColorAttachments.size(); ++colorAttachment)
-    {
-        if (isEnabledColorAttachment(static_cast&lt;unsigned int&gt;(colorAttachment)))
-        {
-            return true;
-        }
-    }
-
-    return false;
</del><ins>+    return (mData.mDepthAttachment.isAttached() &amp;&amp; mData.mDepthAttachment.getDepthSize() &gt; 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Framebuffer::hasStencil() const
</span><span class="lines">@@ -285,9 +375,9 @@
</span><span class="cx"> 
</span><span class="cx"> bool Framebuffer::usingExtendedDrawBuffers() const
</span><span class="cx"> {
</span><del>-    for (size_t colorAttachment = 1; colorAttachment &lt; mData.mColorAttachments.size(); ++colorAttachment)
</del><ins>+    for (size_t drawbufferIdx = 1; drawbufferIdx &lt; mData.mDrawBufferStates.size(); ++drawbufferIdx)
</ins><span class="cx">     {
</span><del>-        if (isEnabledColorAttachment(static_cast&lt;unsigned int&gt;(colorAttachment)))
</del><ins>+        if (getDrawBuffer(drawbufferIdx) != nullptr)
</ins><span class="cx">         {
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="lines">@@ -305,8 +395,6 @@
</span><span class="cx">         return GL_FRAMEBUFFER_COMPLETE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    int width = 0;
-    int height = 0;
</del><span class="cx">     unsigned int colorbufferSize = 0;
</span><span class="cx">     int samples = -1;
</span><span class="cx">     bool missingAttachment = true;
</span><span class="lines">@@ -315,7 +403,8 @@
</span><span class="cx">     {
</span><span class="cx">         if (colorAttachment.isAttached())
</span><span class="cx">         {
</span><del>-            if (colorAttachment.getWidth() == 0 || colorAttachment.getHeight() == 0)
</del><ins>+            const Extents &amp;size = colorAttachment.getSize();
+            if (size.width == 0 || size.height == 0)
</ins><span class="cx">             {
</span><span class="cx">                 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
</span><span class="cx">             }
</span><span class="lines">@@ -327,13 +416,29 @@
</span><span class="cx">             {
</span><span class="cx">                 if (!formatCaps.renderable)
</span><span class="cx">                 {
</span><del>-                    return GL_FRAMEBUFFER_UNSUPPORTED;
</del><ins>+                    return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 if (formatInfo.depthBits &gt; 0 || formatInfo.stencilBits &gt; 0)
</span><span class="cx">                 {
</span><span class="cx">                     return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
</span><span class="cx">                 }
</span><ins>+
+                if (colorAttachment.layer() &gt;= size.depth)
+                {
+                    return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+                }
+
+                // ES3 specifies that cube map texture attachments must be cube complete.
+                // This language is missing from the ES2 spec, but we enforce it here because some
+                // desktop OpenGL drivers also enforce this validation.
+                // TODO(jmadill): Check if OpenGL ES2 drivers enforce cube completeness.
+                const Texture *texture = colorAttachment.getTexture();
+                ASSERT(texture);
+                if (texture-&gt;getTarget() == GL_TEXTURE_CUBE_MAP &amp;&amp; !texture-&gt;isCubeComplete())
+                {
+                    return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+                }
</ins><span class="cx">             }
</span><span class="cx">             else if (colorAttachment.type() == GL_RENDERBUFFER)
</span><span class="cx">             {
</span><span class="lines">@@ -345,12 +450,6 @@
</span><span class="cx"> 
</span><span class="cx">             if (!missingAttachment)
</span><span class="cx">             {
</span><del>-                // all color attachments must have the same width and height
-                if (colorAttachment.getWidth() != width || colorAttachment.getHeight() != height)
-                {
-                    return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-                }
-
</del><span class="cx">                 // APPLE_framebuffer_multisample, which EXT_draw_buffers refers to, requires that
</span><span class="cx">                 // all color attachments have the same number of samples for the FBO to be complete.
</span><span class="cx">                 if (colorAttachment.getSamples() != samples)
</span><span class="lines">@@ -370,8 +469,6 @@
</span><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><del>-                width = colorAttachment.getWidth();
-                height = colorAttachment.getHeight();
</del><span class="cx">                 samples = colorAttachment.getSamples();
</span><span class="cx">                 colorbufferSize = formatInfo.pixelBytes;
</span><span class="cx">                 missingAttachment = false;
</span><span class="lines">@@ -382,7 +479,8 @@
</span><span class="cx">     const FramebufferAttachment &amp;depthAttachment = mData.mDepthAttachment;
</span><span class="cx">     if (depthAttachment.isAttached())
</span><span class="cx">     {
</span><del>-        if (depthAttachment.getWidth() == 0 || depthAttachment.getHeight() == 0)
</del><ins>+        const Extents &amp;size = depthAttachment.getSize();
+        if (size.width == 0 || size.height == 0)
</ins><span class="cx">         {
</span><span class="cx">             return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
</span><span class="cx">         }
</span><span class="lines">@@ -400,7 +498,7 @@
</span><span class="cx"> 
</span><span class="cx">             if (!formatCaps.renderable)
</span><span class="cx">             {
</span><del>-                return GL_FRAMEBUFFER_UNSUPPORTED;
</del><ins>+                return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (formatInfo.depthBits == 0)
</span><span class="lines">@@ -418,15 +516,9 @@
</span><span class="cx"> 
</span><span class="cx">         if (missingAttachment)
</span><span class="cx">         {
</span><del>-            width = depthAttachment.getWidth();
-            height = depthAttachment.getHeight();
</del><span class="cx">             samples = depthAttachment.getSamples();
</span><span class="cx">             missingAttachment = false;
</span><span class="cx">         }
</span><del>-        else if (width != depthAttachment.getWidth() || height != depthAttachment.getHeight())
-        {
-            return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-        }
</del><span class="cx">         else if (samples != depthAttachment.getSamples())
</span><span class="cx">         {
</span><span class="cx">             return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE;
</span><span class="lines">@@ -436,7 +528,8 @@
</span><span class="cx">     const FramebufferAttachment &amp;stencilAttachment = mData.mStencilAttachment;
</span><span class="cx">     if (stencilAttachment.isAttached())
</span><span class="cx">     {
</span><del>-        if (stencilAttachment.getWidth() == 0 || stencilAttachment.getHeight() == 0)
</del><ins>+        const Extents &amp;size = stencilAttachment.getSize();
+        if (size.width == 0 || size.height == 0)
</ins><span class="cx">         {
</span><span class="cx">             return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
</span><span class="cx">         }
</span><span class="lines">@@ -455,7 +548,7 @@
</span><span class="cx"> 
</span><span class="cx">             if (!formatCaps.renderable)
</span><span class="cx">             {
</span><del>-                return GL_FRAMEBUFFER_UNSUPPORTED;
</del><ins>+                return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (formatInfo.stencilBits == 0)
</span><span class="lines">@@ -473,37 +566,42 @@
</span><span class="cx"> 
</span><span class="cx">         if (missingAttachment)
</span><span class="cx">         {
</span><del>-            width = stencilAttachment.getWidth();
-            height = stencilAttachment.getHeight();
</del><span class="cx">             samples = stencilAttachment.getSamples();
</span><span class="cx">             missingAttachment = false;
</span><span class="cx">         }
</span><del>-        else if (width != stencilAttachment.getWidth() || height != stencilAttachment.getHeight())
-        {
-            return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-        }
</del><span class="cx">         else if (samples != stencilAttachment.getSamples())
</span><span class="cx">         {
</span><span class="cx">             return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // if we have both a depth and stencil buffer, they must refer to the same object
-    // since we only support packed_depth_stencil and not separate depth and stencil
-    if (depthAttachment.isAttached() &amp;&amp; stencilAttachment.isAttached() &amp;&amp; !hasValidDepthStencil())
-    {
-        return GL_FRAMEBUFFER_UNSUPPORTED;
-    }
-
</del><span class="cx">     // we need to have at least one attachment to be complete
</span><span class="cx">     if (missingAttachment)
</span><span class="cx">     {
</span><span class="cx">         return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return mImpl-&gt;checkStatus();
</del><ins>+    // In ES 2.0, all color attachments must have the same width and height.
+    // In ES 3.0, there is no such restriction.
+    if (data.clientVersion &lt; 3 &amp;&amp; !mData.attachmentsHaveSameDimensions())
+    {
+        return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
+    }
+
+    syncState();
+    if (!mImpl-&gt;checkStatus())
+    {
+        return GL_FRAMEBUFFER_UNSUPPORTED;
+    }
+
+    return GL_FRAMEBUFFER_COMPLETE;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Error Framebuffer::discard(size_t count, const GLenum *attachments)
+{
+    return mImpl-&gt;discard(count, attachments);
+}
+
</ins><span class="cx"> Error Framebuffer::invalidate(size_t count, const GLenum *attachments)
</span><span class="cx"> {
</span><span class="cx">     return mImpl-&gt;invalidate(count, attachments);
</span><span class="lines">@@ -516,27 +614,65 @@
</span><span class="cx"> 
</span><span class="cx"> Error Framebuffer::clear(const gl::Data &amp;data, GLbitfield mask)
</span><span class="cx"> {
</span><ins>+    if (data.state-&gt;isRasterizerDiscardEnabled())
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
</ins><span class="cx">     return mImpl-&gt;clear(data, mask);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Framebuffer::clearBufferfv(const State &amp;state, GLenum buffer, GLint drawbuffer, const GLfloat *values)
</del><ins>+Error Framebuffer::clearBufferfv(const gl::Data &amp;data,
+                                 GLenum buffer,
+                                 GLint drawbuffer,
+                                 const GLfloat *values)
</ins><span class="cx"> {
</span><del>-    return mImpl-&gt;clearBufferfv(state, buffer, drawbuffer, values);
</del><ins>+    if (data.state-&gt;isRasterizerDiscardEnabled())
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    return mImpl-&gt;clearBufferfv(data, buffer, drawbuffer, values);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Framebuffer::clearBufferuiv(const State &amp;state, GLenum buffer, GLint drawbuffer, const GLuint *values)
</del><ins>+Error Framebuffer::clearBufferuiv(const gl::Data &amp;data,
+                                  GLenum buffer,
+                                  GLint drawbuffer,
+                                  const GLuint *values)
</ins><span class="cx"> {
</span><del>-    return mImpl-&gt;clearBufferuiv(state, buffer, drawbuffer, values);
</del><ins>+    if (data.state-&gt;isRasterizerDiscardEnabled())
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    return mImpl-&gt;clearBufferuiv(data, buffer, drawbuffer, values);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Framebuffer::clearBufferiv(const State &amp;state, GLenum buffer, GLint drawbuffer, const GLint *values)
</del><ins>+Error Framebuffer::clearBufferiv(const gl::Data &amp;data,
+                                 GLenum buffer,
+                                 GLint drawbuffer,
+                                 const GLint *values)
</ins><span class="cx"> {
</span><del>-    return mImpl-&gt;clearBufferiv(state, buffer, drawbuffer, values);
</del><ins>+    if (data.state-&gt;isRasterizerDiscardEnabled())
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    return mImpl-&gt;clearBufferiv(data, buffer, drawbuffer, values);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Framebuffer::clearBufferfi(const State &amp;state, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
</del><ins>+Error Framebuffer::clearBufferfi(const gl::Data &amp;data,
+                                 GLenum buffer,
+                                 GLint drawbuffer,
+                                 GLfloat depth,
+                                 GLint stencil)
</ins><span class="cx"> {
</span><del>-    return mImpl-&gt;clearBufferfi(state, buffer, drawbuffer, depth, stencil);
</del><ins>+    if (data.state-&gt;isRasterizerDiscardEnabled())
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    return mImpl-&gt;clearBufferfi(data, buffer, drawbuffer, depth, stencil);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLenum Framebuffer::getImplementationColorReadFormat() const
</span><span class="lines">@@ -549,13 +685,33 @@
</span><span class="cx">     return mImpl-&gt;getImplementationColorReadType();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Framebuffer::readPixels(const gl::State &amp;state, const gl::Rectangle &amp;area, GLenum format, GLenum type, GLvoid *pixels) const
</del><ins>+Error Framebuffer::readPixels(const State &amp;state,
+                              const Rectangle &amp;area,
+                              GLenum format,
+                              GLenum type,
+                              GLvoid *pixels) const
</ins><span class="cx"> {
</span><del>-    return mImpl-&gt;readPixels(state, area, format, type, pixels);
</del><ins>+    Error error = mImpl-&gt;readPixels(state, area, format, type, pixels);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    Buffer *unpackBuffer = state.getUnpackState().pixelBuffer.get();
+    if (unpackBuffer)
+    {
+        unpackBuffer-&gt;onPixelUnpack();
+    }
+
+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Framebuffer::blit(const gl::State &amp;state, const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea,
-                        GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer)
</del><ins>+Error Framebuffer::blit(const State &amp;state,
+                        const Rectangle &amp;sourceArea,
+                        const Rectangle &amp;destArea,
+                        GLbitfield mask,
+                        GLenum filter,
+                        const Framebuffer *sourceFramebuffer)
</ins><span class="cx"> {
</span><span class="cx">     return mImpl-&gt;blit(state, sourceArea, destArea, mask, filter, sourceFramebuffer);
</span><span class="cx"> }
</span><span class="lines">@@ -591,45 +747,48 @@
</span><span class="cx">     if (binding == GL_DEPTH_STENCIL || binding == GL_DEPTH_STENCIL_ATTACHMENT)
</span><span class="cx">     {
</span><span class="cx">         // ensure this is a legitimate depth+stencil format
</span><del>-        FramebufferAttachment::Target target(binding, textureIndex);
-        GLenum internalFormat = resource-&gt;getAttachmentInternalFormat(target);
-        const InternalFormat &amp;formatInfo = GetInternalFormatInfo(internalFormat);
-        if (resource &amp;&amp; formatInfo.depthBits &gt; 0 &amp;&amp; formatInfo.stencilBits &gt; 0)
</del><ins>+        FramebufferAttachmentObject *attachmentObj = resource;
+        if (resource)
</ins><span class="cx">         {
</span><del>-            mData.mDepthAttachment.attach(type, binding, textureIndex, resource);
-            mData.mStencilAttachment.attach(type, binding, textureIndex, resource);
</del><ins>+            FramebufferAttachment::Target target(binding, textureIndex);
+            GLenum internalFormat            = resource-&gt;getAttachmentInternalFormat(target);
+            const InternalFormat &amp;formatInfo = GetInternalFormatInfo(internalFormat);
+            if (formatInfo.depthBits == 0 || formatInfo.stencilBits == 0)
+            {
+                // Attaching nullptr detaches the current attachment.
+                attachmentObj = nullptr;
+            }
</ins><span class="cx">         }
</span><del>-        else
-        {
-            mData.mDepthAttachment.detach();
-            mData.mStencilAttachment.detach();
-        }
-        mImpl-&gt;onUpdateDepthStencilAttachment();
</del><ins>+
+        mData.mDepthAttachment.attach(type, binding, textureIndex, attachmentObj);
+        mData.mStencilAttachment.attach(type, binding, textureIndex, attachmentObj);
+        mDirtyBits.set(DIRTY_BIT_DEPTH_ATTACHMENT);
+        mDirtyBits.set(DIRTY_BIT_STENCIL_ATTACHMENT);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         switch (binding)
</span><span class="cx">         {
</span><del>-          case GL_DEPTH:
-          case GL_DEPTH_ATTACHMENT:
-            mData.mDepthAttachment.attach(type, binding, textureIndex, resource);
-            mImpl-&gt;onUpdateDepthAttachment();
</del><ins>+            case GL_DEPTH:
+            case GL_DEPTH_ATTACHMENT:
+                mData.mDepthAttachment.attach(type, binding, textureIndex, resource);
+                mDirtyBits.set(DIRTY_BIT_DEPTH_ATTACHMENT);
</ins><span class="cx">             break;
</span><del>-          case GL_STENCIL:
-          case GL_STENCIL_ATTACHMENT:
-            mData.mStencilAttachment.attach(type, binding, textureIndex, resource);
-            mImpl-&gt;onUpdateStencilAttachment();
</del><ins>+            case GL_STENCIL:
+            case GL_STENCIL_ATTACHMENT:
+                mData.mStencilAttachment.attach(type, binding, textureIndex, resource);
+                mDirtyBits.set(DIRTY_BIT_STENCIL_ATTACHMENT);
</ins><span class="cx">             break;
</span><del>-          case GL_BACK:
-            mData.mColorAttachments[0].attach(type, binding, textureIndex, resource);
-            mImpl-&gt;onUpdateColorAttachment(0);
</del><ins>+            case GL_BACK:
+                mData.mColorAttachments[0].attach(type, binding, textureIndex, resource);
+                mDirtyBits.set(DIRTY_BIT_COLOR_ATTACHMENT_0);
</ins><span class="cx">             break;
</span><del>-          default:
</del><ins>+            default:
</ins><span class="cx">             {
</span><span class="cx">                 size_t colorIndex = binding - GL_COLOR_ATTACHMENT0;
</span><span class="cx">                 ASSERT(colorIndex &lt; mData.mColorAttachments.size());
</span><span class="cx">                 mData.mColorAttachments[colorIndex].attach(type, binding, textureIndex, resource);
</span><del>-                mImpl-&gt;onUpdateColorAttachment(colorIndex);
</del><ins>+                mDirtyBits.set(DIRTY_BIT_COLOR_ATTACHMENT_0 + colorIndex);
</ins><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -641,4 +800,13 @@
</span><span class="cx">     setAttachment(GL_NONE, binding, ImageIndex::MakeInvalid(), nullptr);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Framebuffer::syncState() const
+{
+    if (mDirtyBits.any())
+    {
+        mImpl-&gt;syncState(mDirtyBits);
+        mDirtyBits.reset();
+    }
</ins><span class="cx"> }
</span><ins>+
+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEFramebufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,6 +14,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Constants.h&quot;
</span><ins>+#include &quot;libANGLE/Debug.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><span class="cx"> #include &quot;libANGLE/RefCountObject.h&quot;
</span><span class="lines">@@ -23,7 +24,7 @@
</span><span class="cx"> class ImplFactory;
</span><span class="cx"> class FramebufferImpl;
</span><span class="cx"> class RenderbufferImpl;
</span><del>-struct Workarounds;
</del><ins>+class SurfaceImpl;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace egl
</span><span class="lines">@@ -33,6 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><ins>+class Context;
</ins><span class="cx"> class Renderbuffer;
</span><span class="cx"> class State;
</span><span class="cx"> class Texture;
</span><span class="lines">@@ -43,30 +45,38 @@
</span><span class="cx"> struct ImageIndex;
</span><span class="cx"> struct Rectangle;
</span><span class="cx"> 
</span><del>-class Framebuffer
</del><ins>+class Framebuffer final : public LabeledObject
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx"> 
</span><span class="cx">     class Data final : angle::NonCopyable
</span><span class="cx">     {
</span><span class="cx">       public:
</span><ins>+        explicit Data();
</ins><span class="cx">         explicit Data(const Caps &amp;caps);
</span><span class="cx">         ~Data();
</span><span class="cx"> 
</span><ins>+        const std::string &amp;getLabel();
+
</ins><span class="cx">         const FramebufferAttachment *getReadAttachment() const;
</span><span class="cx">         const FramebufferAttachment *getFirstColorAttachment() const;
</span><span class="cx">         const FramebufferAttachment *getDepthOrStencilAttachment() const;
</span><del>-        const FramebufferAttachment *getColorAttachment(unsigned int colorAttachment) const;
</del><ins>+        const FramebufferAttachment *getColorAttachment(size_t colorAttachment) const;
</ins><span class="cx">         const FramebufferAttachment *getDepthAttachment() const;
</span><span class="cx">         const FramebufferAttachment *getStencilAttachment() const;
</span><span class="cx">         const FramebufferAttachment *getDepthStencilAttachment() const;
</span><span class="cx"> 
</span><span class="cx">         const std::vector&lt;GLenum&gt; &amp;getDrawBufferStates() const { return mDrawBufferStates; }
</span><ins>+        GLenum getReadBufferState() const { return mReadBufferState; }
</ins><span class="cx">         const std::vector&lt;FramebufferAttachment&gt; &amp;getColorAttachments() const { return mColorAttachments; }
</span><span class="cx"> 
</span><ins>+        bool attachmentsHaveSameDimensions() const;
+
</ins><span class="cx">       private:
</span><span class="cx">         friend class Framebuffer;
</span><span class="cx"> 
</span><ins>+        std::string mLabel;
+
</ins><span class="cx">         std::vector&lt;FramebufferAttachment&gt; mColorAttachments;
</span><span class="cx">         FramebufferAttachment mDepthAttachment;
</span><span class="cx">         FramebufferAttachment mStencilAttachment;
</span><span class="lines">@@ -76,8 +86,12 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     Framebuffer(const Caps &amp;caps, rx::ImplFactory *factory, GLuint id);
</span><ins>+    Framebuffer(rx::SurfaceImpl *surface);
</ins><span class="cx">     virtual ~Framebuffer();
</span><span class="cx"> 
</span><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
+
</ins><span class="cx">     const rx::FramebufferImpl *getImplementation() const { return mImpl; }
</span><span class="cx">     rx::FramebufferImpl *getImplementation() { return mImpl; }
</span><span class="cx"> 
</span><span class="lines">@@ -92,7 +106,7 @@
</span><span class="cx">     void detachTexture(GLuint texture);
</span><span class="cx">     void detachRenderbuffer(GLuint renderbuffer);
</span><span class="cx"> 
</span><del>-    const FramebufferAttachment *getColorbuffer(unsigned int colorAttachment) const;
</del><ins>+    const FramebufferAttachment *getColorbuffer(size_t colorAttachment) const;
</ins><span class="cx">     const FramebufferAttachment *getDepthbuffer() const;
</span><span class="cx">     const FramebufferAttachment *getStencilbuffer() const;
</span><span class="cx">     const FramebufferAttachment *getDepthStencilBuffer() const;
</span><span class="lines">@@ -103,14 +117,18 @@
</span><span class="cx"> 
</span><span class="cx">     const FramebufferAttachment *getAttachment(GLenum attachment) const;
</span><span class="cx"> 
</span><del>-    GLenum getDrawBufferState(unsigned int colorAttachment) const;
</del><ins>+    size_t getDrawbufferStateCount() const;
+    GLenum getDrawBufferState(size_t drawBuffer) const;
+    const std::vector&lt;GLenum&gt; &amp;getDrawBufferStates() const;
</ins><span class="cx">     void setDrawBuffers(size_t count, const GLenum *buffers);
</span><ins>+    const FramebufferAttachment *getDrawBuffer(size_t drawBuffer) const;
+    bool hasEnabledDrawBuffer() const;
</ins><span class="cx"> 
</span><span class="cx">     GLenum getReadBufferState() const;
</span><span class="cx">     void setReadBuffer(GLenum buffer);
</span><span class="cx"> 
</span><del>-    bool isEnabledColorAttachment(unsigned int colorAttachment) const;
-    bool hasEnabledColorAttachment() const;
</del><ins>+    size_t getNumColorBuffers() const;
+    bool hasDepth() const;
</ins><span class="cx">     bool hasStencil() const;
</span><span class="cx">     int getSamples(const gl::Data &amp;data) const;
</span><span class="cx">     bool usingExtendedDrawBuffers() const;
</span><span class="lines">@@ -118,28 +136,68 @@
</span><span class="cx">     GLenum checkStatus(const gl::Data &amp;data) const;
</span><span class="cx">     bool hasValidDepthStencil() const;
</span><span class="cx"> 
</span><ins>+    Error discard(size_t count, const GLenum *attachments);
</ins><span class="cx">     Error invalidate(size_t count, const GLenum *attachments);
</span><span class="cx">     Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &amp;area);
</span><span class="cx"> 
</span><span class="cx">     Error clear(const gl::Data &amp;data, GLbitfield mask);
</span><del>-    Error clearBufferfv(const State &amp;state, GLenum buffer, GLint drawbuffer, const GLfloat *values);
-    Error clearBufferuiv(const State &amp;state, GLenum buffer, GLint drawbuffer, const GLuint *values);
-    Error clearBufferiv(const State &amp;state, GLenum buffer, GLint drawbuffer, const GLint *values);
-    Error clearBufferfi(const State &amp;state, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
</del><ins>+    Error clearBufferfv(const gl::Data &amp;data,
+                        GLenum buffer,
+                        GLint drawbuffer,
+                        const GLfloat *values);
+    Error clearBufferuiv(const gl::Data &amp;data,
+                         GLenum buffer,
+                         GLint drawbuffer,
+                         const GLuint *values);
+    Error clearBufferiv(const gl::Data &amp;data, GLenum buffer, GLint drawbuffer, const GLint *values);
+    Error clearBufferfi(const gl::Data &amp;data,
+                        GLenum buffer,
+                        GLint drawbuffer,
+                        GLfloat depth,
+                        GLint stencil);
</ins><span class="cx"> 
</span><span class="cx">     GLenum getImplementationColorReadFormat() const;
</span><span class="cx">     GLenum getImplementationColorReadType() const;
</span><del>-    Error readPixels(const gl::State &amp;state, const gl::Rectangle &amp;area, GLenum format, GLenum type, GLvoid *pixels) const;
</del><ins>+    Error readPixels(const gl::State &amp;state,
+                     const gl::Rectangle &amp;area,
+                     GLenum format,
+                     GLenum type,
+                     GLvoid *pixels) const;
</ins><span class="cx"> 
</span><del>-    Error blit(const gl::State &amp;state, const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea,
-               GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer);
</del><ins>+    Error blit(const State &amp;state,
+               const Rectangle &amp;sourceArea,
+               const Rectangle &amp;destArea,
+               GLbitfield mask,
+               GLenum filter,
+               const Framebuffer *sourceFramebuffer);
</ins><span class="cx"> 
</span><ins>+    enum DirtyBitType
+    {
+        DIRTY_BIT_COLOR_ATTACHMENT_0,
+        DIRTY_BIT_COLOR_ATTACHMENT_MAX =
+            DIRTY_BIT_COLOR_ATTACHMENT_0 + gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS,
+        DIRTY_BIT_DEPTH_ATTACHMENT = DIRTY_BIT_COLOR_ATTACHMENT_MAX,
+        DIRTY_BIT_STENCIL_ATTACHMENT,
+        DIRTY_BIT_DRAW_BUFFERS,
+        DIRTY_BIT_READ_BUFFER,
+        DIRTY_BIT_UNKNOWN,
+        DIRTY_BIT_MAX = DIRTY_BIT_UNKNOWN,
+    };
+
+    typedef std::bitset&lt;DIRTY_BIT_MAX&gt; DirtyBits;
+    bool hasAnyDirtyBit() const { return mDirtyBits.any(); }
+
+    void syncState() const;
+
</ins><span class="cx">   protected:
</span><span class="cx">     void detachResourceById(GLenum resourceType, GLuint resourceId);
</span><span class="cx"> 
</span><span class="cx">     Data mData;
</span><span class="cx">     rx::FramebufferImpl *mImpl;
</span><span class="cx">     GLuint mId;
</span><ins>+
+    // TODO(jmadill): See if we can make this non-mutable.
+    mutable DirtyBits mDirtyBits;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEFramebufferAttachmentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/FramebufferAttachment.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/FramebufferAttachment.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/FramebufferAttachment.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -22,6 +22,12 @@
</span><span class="cx"> 
</span><span class="cx"> ////// FramebufferAttachment::Target Implementation //////
</span><span class="cx"> 
</span><ins>+FramebufferAttachment::Target::Target()
+    : mBinding(GL_NONE),
+      mTextureIndex(ImageIndex::MakeInvalid())
+{
+}
+
</ins><span class="cx"> FramebufferAttachment::Target::Target(GLenum binding, const ImageIndex &amp;imageIndex)
</span><span class="cx">     : mBinding(binding),
</span><span class="cx">       mTextureIndex(imageIndex)
</span><span class="lines">@@ -44,8 +50,7 @@
</span><span class="cx"> ////// FramebufferAttachment Implementation //////
</span><span class="cx"> 
</span><span class="cx"> FramebufferAttachment::FramebufferAttachment()
</span><del>-    : mType(GL_NONE),
-      mTarget(GL_NONE, ImageIndex::MakeInvalid())
</del><ins>+    : mType(GL_NONE), mResource(nullptr)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -53,19 +58,39 @@
</span><span class="cx">                                              GLenum binding,
</span><span class="cx">                                              const ImageIndex &amp;textureIndex,
</span><span class="cx">                                              FramebufferAttachmentObject *resource)
</span><del>-    : mType(type),
-      mTarget(binding, textureIndex)
</del><ins>+    : mResource(nullptr)
</ins><span class="cx"> {
</span><del>-    mResource.set(resource);
</del><ins>+    attach(type, binding, textureIndex, resource);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+FramebufferAttachment::FramebufferAttachment(const FramebufferAttachment &amp;other)
+    : mResource(nullptr)
+{
+    attach(other.mType, other.mTarget.binding(), other.mTarget.textureIndex(), other.mResource);
+}
+
+FramebufferAttachment &amp;FramebufferAttachment::operator=(const FramebufferAttachment &amp;other)
+{
+    attach(other.mType, other.mTarget.binding(), other.mTarget.textureIndex(), other.mResource);
+    return *this;
+}
+
+FramebufferAttachment::~FramebufferAttachment()
+{
+    detach();
+}
+
</ins><span class="cx"> void FramebufferAttachment::detach()
</span><span class="cx"> {
</span><span class="cx">     mType = GL_NONE;
</span><del>-    mResource.set(nullptr);
</del><ins>+    if (mResource != nullptr)
+    {
+        mResource-&gt;onDetach();
+        mResource = nullptr;
+    }
</ins><span class="cx"> 
</span><span class="cx">     // not technically necessary, could omit for performance
</span><del>-    mTarget = Target(GL_NONE, ImageIndex::MakeInvalid());
</del><ins>+    mTarget = Target();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FramebufferAttachment::attach(GLenum type,
</span><span class="lines">@@ -75,12 +100,16 @@
</span><span class="cx"> {
</span><span class="cx">     mType = type;
</span><span class="cx">     mTarget = Target(binding, textureIndex);
</span><del>-    mResource.set(resource);
-}
</del><span class="cx"> 
</span><del>-FramebufferAttachment::~FramebufferAttachment()
-{
-    mResource.set(nullptr);
</del><ins>+    if (resource)
+    {
+        resource-&gt;onAttach();
+    }
+    if (mResource != nullptr)
+    {
+        mResource-&gt;onDetach();
+    }
+    mResource = resource;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLuint FramebufferAttachment::getRedSize() const
</span><span class="lines">@@ -123,6 +152,11 @@
</span><span class="cx">     return GetInternalFormatInfo(getInternalFormat()).colorEncoding;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLuint FramebufferAttachment::id() const
+{
+    return mResource-&gt;getId();
+}
+
</ins><span class="cx"> const ImageIndex &amp;FramebufferAttachment::getTextureImageIndex() const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(type() == GL_TEXTURE);
</span><span class="lines">@@ -158,17 +192,17 @@
</span><span class="cx"> 
</span><span class="cx"> Texture *FramebufferAttachment::getTexture() const
</span><span class="cx"> {
</span><del>-    return rx::GetAs&lt;Texture&gt;(mResource.get());
</del><ins>+    return rx::GetAs&lt;Texture&gt;(mResource);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Renderbuffer *FramebufferAttachment::getRenderbuffer() const
</span><span class="cx"> {
</span><del>-    return rx::GetAs&lt;Renderbuffer&gt;(mResource.get());
</del><ins>+    return rx::GetAs&lt;Renderbuffer&gt;(mResource);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const egl::Surface *FramebufferAttachment::getSurface() const
</span><span class="cx"> {
</span><del>-    return rx::GetAs&lt;egl::Surface&gt;(mResource.get());
</del><ins>+    return rx::GetAs&lt;egl::Surface&gt;(mResource);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEFramebufferAttachmenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/FramebufferAttachment.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/FramebufferAttachment.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/FramebufferAttachment.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,9 +12,9 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><ins>+#include &quot;libANGLE/angletypes.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/ImageIndex.h&quot;
</span><del>-#include &quot;libANGLE/RefCountObject.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace egl
</span><span class="cx"> {
</span><span class="lines">@@ -57,21 +57,9 @@
</span><span class="cx">                           const ImageIndex &amp;textureIndex,
</span><span class="cx">                           FramebufferAttachmentObject *resource);
</span><span class="cx"> 
</span><del>-    FramebufferAttachment(const FramebufferAttachment &amp;other)
-       : mType(other.mType),
-         mTarget(other.mTarget)
-    {
-        mResource.set(other.mResource.get());
-    }
</del><ins>+    FramebufferAttachment(const FramebufferAttachment &amp;other);
+    FramebufferAttachment &amp;operator=(const FramebufferAttachment &amp;other);
</ins><span class="cx"> 
</span><del>-    FramebufferAttachment &amp;operator=(const FramebufferAttachment &amp;other)
-    {
-        mType = other.mType;
-        mTarget = other.mTarget;
-        mResource.set(other.mResource.get());
-        return *this;
-    }
-
</del><span class="cx">     ~FramebufferAttachment();
</span><span class="cx"> 
</span><span class="cx">     // A framebuffer attachment points to one of three types of resources: Renderbuffers,
</span><span class="lines">@@ -83,6 +71,7 @@
</span><span class="cx">     class Target
</span><span class="cx">     {
</span><span class="cx">       public:
</span><ins>+        Target();
</ins><span class="cx">         Target(GLenum binding, const ImageIndex &amp;imageIndex);
</span><span class="cx">         Target(const Target &amp;other);
</span><span class="cx">         Target &amp;operator=(const Target &amp;other);
</span><span class="lines">@@ -115,7 +104,7 @@
</span><span class="cx">     bool isRenderbufferWithId(GLuint renderbufferId) const { return mType == GL_RENDERBUFFER &amp;&amp; id() == renderbufferId; }
</span><span class="cx"> 
</span><span class="cx">     GLenum getBinding() const { return mTarget.binding(); }
</span><del>-    GLuint id() const { return mResource.id(); }
</del><ins>+    GLuint id() const;
</ins><span class="cx"> 
</span><span class="cx">     // These methods are only legal to call on Texture attachments
</span><span class="cx">     const ImageIndex &amp;getTextureImageIndex() const;
</span><span class="lines">@@ -123,8 +112,10 @@
</span><span class="cx">     GLint mipLevel() const;
</span><span class="cx">     GLint layer() const;
</span><span class="cx"> 
</span><del>-    GLsizei getWidth() const;
-    GLsizei getHeight() const;
</del><ins>+    // The size of the underlying resource the attachment points to. The 'depth' value will
+    // correspond to a 3D texture depth or the layer count of a 2D array texture. For Surfaces and
+    // Renderbuffers, it will always be 1.
+    Extents getSize() const;
</ins><span class="cx">     GLenum getInternalFormat() const;
</span><span class="cx">     GLsizei getSamples() const;
</span><span class="cx">     GLenum type() const { return mType; }
</span><span class="lines">@@ -150,20 +141,24 @@
</span><span class="cx"> 
</span><span class="cx">     GLenum mType;
</span><span class="cx">     Target mTarget;
</span><del>-    BindingPointer&lt;FramebufferAttachmentObject&gt; mResource;
</del><ins>+    FramebufferAttachmentObject *mResource;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // A base class for objects that FBO Attachments may point to.
</span><del>-class FramebufferAttachmentObject : public RefCountObject
</del><ins>+class FramebufferAttachmentObject
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    FramebufferAttachmentObject(GLuint id) : RefCountObject(id) {}
</del><ins>+    FramebufferAttachmentObject() {}
+    virtual ~FramebufferAttachmentObject() {}
</ins><span class="cx"> 
</span><del>-    virtual GLsizei getAttachmentWidth(const FramebufferAttachment::Target &amp;target) const = 0;
-    virtual GLsizei getAttachmentHeight(const FramebufferAttachment::Target &amp;target) const = 0;
</del><ins>+    virtual Extents getAttachmentSize(const FramebufferAttachment::Target &amp;target) const = 0;
</ins><span class="cx">     virtual GLenum getAttachmentInternalFormat(const FramebufferAttachment::Target &amp;target) const = 0;
</span><span class="cx">     virtual GLsizei getAttachmentSamples(const FramebufferAttachment::Target &amp;target) const = 0;
</span><span class="cx"> 
</span><ins>+    virtual void onAttach() = 0;
+    virtual void onDetach() = 0;
+    virtual GLuint getId() const = 0;
+
</ins><span class="cx">     Error getAttachmentRenderTarget(const FramebufferAttachment::Target &amp;target,
</span><span class="cx">                                     rx::FramebufferAttachmentRenderTarget **rtOut) const;
</span><span class="cx"> 
</span><span class="lines">@@ -171,16 +166,11 @@
</span><span class="cx">     virtual rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const = 0;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-inline GLsizei FramebufferAttachment::getWidth() const
</del><ins>+inline Extents FramebufferAttachment::getSize() const
</ins><span class="cx"> {
</span><del>-    return mResource-&gt;getAttachmentWidth(mTarget);
</del><ins>+    return mResource-&gt;getAttachmentSize(mTarget);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline GLsizei FramebufferAttachment::getHeight() const
-{
-    return mResource-&gt;getAttachmentHeight(mTarget);
-}
-
</del><span class="cx"> inline GLenum FramebufferAttachment::getInternalFormat() const
</span><span class="cx"> {
</span><span class="cx">     return mResource-&gt;getAttachmentInternalFormat(mTarget);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEHandleAllocatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -20,13 +20,13 @@
</span><span class="cx"> {
</span><span class="cx">     bool operator()(const HandleRange &amp;range, GLuint handle) const
</span><span class="cx">     {
</span><del>-        return (handle &lt; range.begin);
</del><ins>+        return (range.end &lt; handle);
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> HandleAllocator::HandleAllocator() : mBaseValue(1), mNextValue(1)
</span><span class="cx"> {
</span><del>-    mUnallocatedList.push_back(HandleRange(1, std::numeric_limits&lt;GLuint&gt;::max() - 1));
</del><ins>+    mUnallocatedList.push_back(HandleRange(1, std::numeric_limits&lt;GLuint&gt;::max()));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> HandleAllocator::HandleAllocator(GLuint maximumHandleValue) : mBaseValue(1), mNextValue(1)
</span><span class="lines">@@ -120,14 +120,15 @@
</span><span class="cx">     // need to split the range
</span><span class="cx">     auto placementIt = mUnallocatedList.erase(boundIt);
</span><span class="cx"> 
</span><del>-    if (begin != handle)
</del><ins>+    if (handle + 1 != end)
</ins><span class="cx">     {
</span><del>-        placementIt = mUnallocatedList.insert(placementIt, HandleRange(begin, handle));
</del><ins>+        placementIt = mUnallocatedList.insert(placementIt, HandleRange(handle + 1, end));
</ins><span class="cx">     }
</span><del>-    if (handle + 1 != end)
</del><ins>+    if (begin != handle)
</ins><span class="cx">     {
</span><del>-        mUnallocatedList.insert(placementIt, HandleRange(handle + 1, end));
</del><ins>+        ASSERT(begin &lt; handle);
+        mUnallocatedList.insert(placementIt, HandleRange(begin, handle));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEHandleAllocatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -58,6 +58,6 @@
</span><span class="cx">     std::vector&lt;GLuint&gt; mReleasedList;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace gl
</ins><span class="cx"> 
</span><span class="cx"> #endif   // LIBANGLE_HANDLEALLOCATOR_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEHandleAllocator_unittestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator_unittest.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator_unittest.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/HandleAllocator_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -90,4 +90,37 @@
</span><span class="cx">     EXPECT_EQ(finalResult, 1);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// The following test covers reserving a handle with max uint value.
+// See http://anglebug.com/1052
+TEST(HandleAllocatorTest, ReserveMaxUintHandle)
+{
+    gl::HandleAllocator allocator;
+
+    GLuint maxUintHandle = std::numeric_limits&lt;GLuint&gt;::max();
+    allocator.reserve(maxUintHandle);
+
+    GLuint normalHandle = allocator.allocate();
+    EXPECT_EQ(1u, normalHandle);
</ins><span class="cx"> }
</span><ins>+
+// To test if the allocator keep the handle in a sorted order.
+TEST(HandleAllocatorTest, SortedOrderHandle)
+{
+    gl::HandleAllocator allocator;
+
+    allocator.reserve(3);
+
+    GLuint allocatedList[5];
+    for (GLuint count = 0; count &lt; 5; count++)
+    {
+        allocatedList[count] = allocator.allocate();
+    }
+
+    EXPECT_EQ(1u, allocatedList[0]);
+    EXPECT_EQ(2u, allocatedList[1]);
+    EXPECT_EQ(4u, allocatedList[2]);
+    EXPECT_EQ(5u, allocatedList[3]);
+    EXPECT_EQ(6u, allocatedList[4]);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEImagecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,192 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Image.cpp: Implements the egl::Image class representing the EGLimage object.
+
+#include &quot;libANGLE/Image.h&quot;
+
+#include &quot;common/debug.h&quot;
+#include &quot;common/utilities.h&quot;
+#include &quot;libANGLE/angletypes.h&quot;
+#include &quot;libANGLE/Texture.h&quot;
+#include &quot;libANGLE/Renderbuffer.h&quot;
+#include &quot;libANGLE/renderer/ImageImpl.h&quot;
+
+namespace egl
+{
+ImageSibling::ImageSibling(GLuint id) : RefCountObject(id), mSourcesOf(), mTargetOf()
+{
+}
+
+ImageSibling::~ImageSibling()
+{
+    // EGL images should hold a ref to their targets and siblings, a Texture should not be deletable
+    // while it is attached to an EGL image.
+    ASSERT(mSourcesOf.empty());
+    orphanImages();
+}
+
+void ImageSibling::setTargetImage(egl::Image *imageTarget)
+{
+    ASSERT(imageTarget != nullptr);
+    mTargetOf.set(imageTarget);
+    imageTarget-&gt;addTargetSibling(this);
+}
+
+gl::Error ImageSibling::orphanImages()
+{
+    if (mTargetOf.get() != nullptr)
+    {
+        // Can't be a target and have sources.
+        ASSERT(mSourcesOf.empty());
+
+        gl::Error error = mTargetOf-&gt;orphanSibling(this);
+        if (error.isError())
+        {
+            return error;
+        }
+
+        mTargetOf.set(nullptr);
+    }
+    else
+    {
+        for (auto &amp;sourceImage : mSourcesOf)
+        {
+            gl::Error error = sourceImage-&gt;orphanSibling(this);
+            if (error.isError())
+            {
+                return error;
+            }
+        }
+        mSourcesOf.clear();
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+void ImageSibling::addImageSource(egl::Image *imageSource)
+{
+    ASSERT(imageSource != nullptr);
+    mSourcesOf.insert(imageSource);
+}
+
+void ImageSibling::removeImageSource(egl::Image *imageSource)
+{
+    ASSERT(mSourcesOf.find(imageSource) != mSourcesOf.end());
+    mSourcesOf.erase(imageSource);
+}
+
+Image::Image(rx::ImageImpl *impl, EGLenum target, ImageSibling *buffer, const AttributeMap &amp;attribs)
+    : RefCountObject(0),
+      mImplementation(impl),
+      mInternalFormat(GL_NONE),
+      mWidth(0),
+      mHeight(0),
+      mSamples(0),
+      mSource(),
+      mTargets()
+{
+    ASSERT(mImplementation != nullptr);
+    ASSERT(buffer != nullptr);
+
+    mSource.set(buffer);
+    mSource-&gt;addImageSource(this);
+
+    if (IsTextureTarget(target))
+    {
+        gl::Texture *texture = rx::GetAs&lt;gl::Texture&gt;(mSource.get());
+        GLenum textureTarget = egl_gl::EGLImageTargetToGLTextureTarget(target);
+        size_t level         = attribs.get(EGL_GL_TEXTURE_LEVEL_KHR, 0);
+        mInternalFormat      = texture-&gt;getInternalFormat(textureTarget, level);
+        mWidth               = texture-&gt;getWidth(textureTarget, level);
+        mHeight              = texture-&gt;getHeight(textureTarget, level);
+        mSamples             = 0;
+    }
+    else if (IsRenderbufferTarget(target))
+    {
+        gl::Renderbuffer *renderbuffer = rx::GetAs&lt;gl::Renderbuffer&gt;(mSource.get());
+        mInternalFormat                = renderbuffer-&gt;getInternalFormat();
+        mWidth                         = renderbuffer-&gt;getWidth();
+        mHeight                        = renderbuffer-&gt;getHeight();
+        mSamples                       = renderbuffer-&gt;getSamples();
+    }
+    else
+    {
+        UNREACHABLE();
+    }
+}
+
+Image::~Image()
+{
+    SafeDelete(mImplementation);
+
+    // All targets should hold a ref to the egl image and it should not be deleted until there are
+    // no siblings left.
+    ASSERT(mTargets.empty());
+
+    // Tell the source that it is no longer used by this image
+    if (mSource.get() != nullptr)
+    {
+        mSource-&gt;removeImageSource(this);
+        mSource.set(nullptr);
+    }
+}
+
+void Image::addTargetSibling(ImageSibling *sibling)
+{
+    mTargets.insert(sibling);
+}
+
+gl::Error Image::orphanSibling(ImageSibling *sibling)
+{
+    // notify impl
+    gl::Error error = mImplementation-&gt;orphan(sibling);
+
+    if (mSource.get() == sibling)
+    {
+        // If the sibling is the source, it cannot be a target.
+        ASSERT(mTargets.find(sibling) == mTargets.end());
+
+        mSource.set(nullptr);
+    }
+    else
+    {
+        mTargets.erase(sibling);
+    }
+
+    return error;
+}
+
+GLenum Image::getInternalFormat() const
+{
+    return mInternalFormat;
+}
+
+size_t Image::getWidth() const
+{
+    return mWidth;
+}
+
+size_t Image::getHeight() const
+{
+    return mHeight;
+}
+
+size_t Image::getSamples() const
+{
+    return mSamples;
+}
+
+rx::ImageImpl *Image::getImplementation()
+{
+    return mImplementation;
+}
+
+const rx::ImageImpl *Image::getImplementation() const
+{
+    return mImplementation;
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEImageh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,91 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Image.h: Defines the egl::Image class representing the EGLimage object.
+
+#ifndef LIBANGLE_IMAGE_H_
+#define LIBANGLE_IMAGE_H_
+
+#include &quot;common/angleutils.h&quot;
+#include &quot;libANGLE/AttributeMap.h&quot;
+#include &quot;libANGLE/Error.h&quot;
+#include &quot;libANGLE/RefCountObject.h&quot;
+
+#include &lt;set&gt;
+
+namespace rx
+{
+class ImageImpl;
+}
+
+namespace egl
+{
+class Image;
+
+class ImageSibling : public RefCountObject
+{
+  public:
+    ImageSibling(GLuint id);
+    virtual ~ImageSibling();
+
+  protected:
+    // Set the image target of this sibling
+    void setTargetImage(egl::Image *imageTarget);
+
+    // Orphan all EGL image sources and targets
+    gl::Error orphanImages();
+
+  private:
+    friend class Image;
+
+    // Called from Image only to add a new source image
+    void addImageSource(egl::Image *imageSource);
+
+    // Called from Image only to remove a source image when the Image is being deleted
+    void removeImageSource(egl::Image *imageSource);
+
+    std::set&lt;Image *&gt; mSourcesOf;
+    BindingPointer&lt;Image&gt; mTargetOf;
+};
+
+class Image final : public RefCountObject
+{
+  public:
+    Image(rx::ImageImpl *impl, EGLenum target, ImageSibling *buffer, const AttributeMap &amp;attribs);
+    ~Image();
+
+    GLenum getInternalFormat() const;
+    size_t getWidth() const;
+    size_t getHeight() const;
+    size_t getSamples() const;
+
+    rx::ImageImpl *getImplementation();
+    const rx::ImageImpl *getImplementation() const;
+
+  private:
+    friend class ImageSibling;
+
+    // Called from ImageSibling only notify the image that a new target sibling exists for state
+    // tracking.
+    void addTargetSibling(ImageSibling *sibling);
+
+    // Called from ImageSibling only to notify the image that a sibling (source or target) has
+    // been respecified and state tracking should be updated.
+    gl::Error orphanSibling(ImageSibling *sibling);
+
+    rx::ImageImpl *mImplementation;
+
+    GLenum mInternalFormat;
+    size_t mWidth;
+    size_t mHeight;
+    size_t mSamples;
+
+    BindingPointer&lt;ImageSibling&gt; mSource;
+    std::set&lt;ImageSibling *&gt; mTargets;
+};
+}
+
+#endif  // LIBANGLE_IMAGE_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEImageIndexcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/ImageIndex.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/ImageIndex.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/ImageIndex.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -35,7 +35,8 @@
</span><span class="cx"> ImageIndex ImageIndex::MakeCube(GLenum target, GLint mipIndex)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(gl::IsCubeMapTextureTarget(target));
</span><del>-    return ImageIndex(target, mipIndex, static_cast&lt;int&gt;(CubeMapTextureTargetToLayerIndex(target)));
</del><ins>+    return ImageIndex(target, mipIndex,
+                      static_cast&lt;GLint&gt;(CubeMapTextureTargetToLayerIndex(target)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ImageIndex ImageIndex::Make2DArray(GLint mipIndex, GLint layerIndex)
</span><span class="lines">@@ -50,7 +51,9 @@
</span><span class="cx"> 
</span><span class="cx"> ImageIndex ImageIndex::MakeGeneric(GLenum target, GLint mipIndex)
</span><span class="cx"> {
</span><del>-    GLint layerIndex = IsCubeMapTextureTarget(target) ? static_cast&lt;GLint&gt;(CubeMapTextureTargetToLayerIndex(target)) : ENTIRE_LEVEL;
</del><ins>+    GLint layerIndex = IsCubeMapTextureTarget(target)
+                           ? static_cast&lt;GLint&gt;(CubeMapTextureTargetToLayerIndex(target))
+                           : ENTIRE_LEVEL;
</ins><span class="cx">     return ImageIndex(target, mipIndex, layerIndex);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -83,30 +86,30 @@
</span><span class="cx"> 
</span><span class="cx"> ImageIndexIterator ImageIndexIterator::Make2D(GLint minMip, GLint maxMip)
</span><span class="cx"> {
</span><del>-    return ImageIndexIterator(GL_TEXTURE_2D, rx::Range&lt;GLint&gt;(minMip, maxMip),
-                              rx::Range&lt;GLint&gt;(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL), NULL);
</del><ins>+    return ImageIndexIterator(GL_TEXTURE_2D, Range&lt;GLint&gt;(minMip, maxMip),
+                              Range&lt;GLint&gt;(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL), NULL);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ImageIndexIterator ImageIndexIterator::MakeCube(GLint minMip, GLint maxMip)
</span><span class="cx"> {
</span><del>-    return ImageIndexIterator(GL_TEXTURE_CUBE_MAP, rx::Range&lt;GLint&gt;(minMip, maxMip), rx::Range&lt;GLint&gt;(0, 6), NULL);
</del><ins>+    return ImageIndexIterator(GL_TEXTURE_CUBE_MAP, Range&lt;GLint&gt;(minMip, maxMip), Range&lt;GLint&gt;(0, 6), NULL);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ImageIndexIterator ImageIndexIterator::Make3D(GLint minMip, GLint maxMip,
</span><span class="cx">                                               GLint minLayer, GLint maxLayer)
</span><span class="cx"> {
</span><del>-    return ImageIndexIterator(GL_TEXTURE_3D, rx::Range&lt;GLint&gt;(minMip, maxMip), rx::Range&lt;GLint&gt;(minLayer, maxLayer), NULL);
</del><ins>+    return ImageIndexIterator(GL_TEXTURE_3D, Range&lt;GLint&gt;(minMip, maxMip), Range&lt;GLint&gt;(minLayer, maxLayer), NULL);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ImageIndexIterator ImageIndexIterator::Make2DArray(GLint minMip, GLint maxMip,
</span><span class="cx">                                                    const GLsizei *layerCounts)
</span><span class="cx"> {
</span><del>-    return ImageIndexIterator(GL_TEXTURE_2D_ARRAY, rx::Range&lt;GLint&gt;(minMip, maxMip),
-                              rx::Range&lt;GLint&gt;(0, IMPLEMENTATION_MAX_2D_ARRAY_TEXTURE_LAYERS), layerCounts);
</del><ins>+    return ImageIndexIterator(GL_TEXTURE_2D_ARRAY, Range&lt;GLint&gt;(minMip, maxMip),
+                              Range&lt;GLint&gt;(0, IMPLEMENTATION_MAX_2D_ARRAY_TEXTURE_LAYERS), layerCounts);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ImageIndexIterator::ImageIndexIterator(GLenum type, const rx::Range&lt;GLint&gt; &amp;mipRange,
-                                       const rx::Range&lt;GLint&gt; &amp;layerRange, const GLsizei *layerCounts)
</del><ins>+ImageIndexIterator::ImageIndexIterator(GLenum type, const Range&lt;GLint&gt; &amp;mipRange,
+                                       const Range&lt;GLint&gt; &amp;layerRange, const GLsizei *layerCounts)
</ins><span class="cx">     : mType(type),
</span><span class="cx">       mMipRange(mipRange),
</span><span class="cx">       mLayerRange(layerRange),
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEImageIndexh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/ImageIndex.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/ImageIndex.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/ImageIndex.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -61,14 +61,14 @@
</span><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx"> 
</span><del>-    ImageIndexIterator(GLenum type, const rx::Range&lt;GLint&gt; &amp;mipRange,
-                       const rx::Range&lt;GLint&gt; &amp;layerRange, const GLsizei *layerCounts);
</del><ins>+    ImageIndexIterator(GLenum type, const Range&lt;GLint&gt; &amp;mipRange,
+                       const Range&lt;GLint&gt; &amp;layerRange, const GLsizei *layerCounts);
</ins><span class="cx"> 
</span><span class="cx">     GLint maxLayer() const;
</span><span class="cx"> 
</span><span class="cx">     GLenum mType;
</span><del>-    rx::Range&lt;GLint&gt; mMipRange;
-    rx::Range&lt;GLint&gt; mLayerRange;
</del><ins>+    Range&lt;GLint&gt; mMipRange;
+    Range&lt;GLint&gt; mLayerRange;
</ins><span class="cx">     const GLsizei *mLayerCounts;
</span><span class="cx">     GLint mCurrentMip;
</span><span class="cx">     GLint mCurrentLayer;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEImage_unittestcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image_unittest.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image_unittest.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Image_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,131 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Image_unittest.cpp : Unittets of the Image and ImageSibling classes.
+
+#include &quot;gmock/gmock.h&quot;
+#include &quot;gtest/gtest.h&quot;
+#include &quot;libANGLE/Image.h&quot;
+#include &quot;libANGLE/Texture.h&quot;
+#include &quot;libANGLE/Renderbuffer.h&quot;
+#include &quot;libANGLE/renderer/ImageImpl_mock.h&quot;
+#include &quot;libANGLE/renderer/TextureImpl_mock.h&quot;
+#include &quot;libANGLE/renderer/RenderbufferImpl_mock.h&quot;
+
+using ::testing::_;
+using ::testing::Return;
+
+namespace angle
+{
+// Verify ref counts are maintained between images and their siblings when objects are deleted
+TEST(ImageTest, RefCounting)
+{
+    // Create a texture and an EGL image that uses the texture as its source
+    rx::MockTextureImpl *textureImpl = new rx::MockTextureImpl();
+    gl::Texture *texture = new gl::Texture(textureImpl, 1, GL_TEXTURE_2D);
+    texture-&gt;addRef();
+
+    rx::MockImageImpl *imageImpl = new rx::MockImageImpl();
+    egl::Image *image = new egl::Image(imageImpl, EGL_GL_TEXTURE_2D, texture, egl::AttributeMap());
+    image-&gt;addRef();
+
+    // Verify that the image added a ref to the texture and the texture has not added a ref to the
+    // image
+    EXPECT_EQ(texture-&gt;getRefCount(), 2u);
+    EXPECT_EQ(image-&gt;getRefCount(), 1u);
+
+    // Create a renderbuffer and set it as a target of the EGL image
+    rx::MockRenderbufferImpl *renderbufferImpl = new rx::MockRenderbufferImpl();
+    gl::Renderbuffer *renderbuffer = new gl::Renderbuffer(renderbufferImpl, 1);
+    renderbuffer-&gt;addRef();
+
+    EXPECT_CALL(*renderbufferImpl, setStorageEGLImageTarget(_))
+        .WillOnce(Return(gl::Error(GL_NO_ERROR)))
+        .RetiresOnSaturation();
+    renderbuffer-&gt;setStorageEGLImageTarget(image);
+
+    // Verify that the renderbuffer added a ref to the image and the image did not add a ref to
+    // the renderbuffer
+    EXPECT_EQ(texture-&gt;getRefCount(), 2u);
+    EXPECT_EQ(image-&gt;getRefCount(), 2u);
+    EXPECT_EQ(renderbuffer-&gt;getRefCount(), 1u);
+
+    // Simulate deletion of the texture and verify that it still exists because the image holds a
+    // ref
+    texture-&gt;release();
+    EXPECT_EQ(texture-&gt;getRefCount(), 1u);
+    EXPECT_EQ(image-&gt;getRefCount(), 2u);
+    EXPECT_EQ(renderbuffer-&gt;getRefCount(), 1u);
+
+    // Simulate deletion of the image and verify that it still exists because the renderbuffer holds
+    // a ref
+    image-&gt;release();
+    EXPECT_EQ(texture-&gt;getRefCount(), 1u);
+    EXPECT_EQ(image-&gt;getRefCount(), 1u);
+    EXPECT_EQ(renderbuffer-&gt;getRefCount(), 1u);
+
+    // Simulate deletion of the renderbuffer and verify that the deletion cascades to all objects
+    EXPECT_CALL(*imageImpl, destructor()).Times(1).RetiresOnSaturation();
+    EXPECT_CALL(*imageImpl, orphan(_))
+        .WillOnce(Return(gl::Error(GL_NO_ERROR)))
+        .RetiresOnSaturation();
+
+    EXPECT_CALL(*textureImpl, destructor()).Times(1).RetiresOnSaturation();
+    EXPECT_CALL(*renderbufferImpl, destructor()).Times(1).RetiresOnSaturation();
+
+    renderbuffer-&gt;release();
+}
+
+// Verify that respecifiying textures releases references to the Image.
+TEST(ImageTest, RespecificationReleasesReferences)
+{
+    // Create a texture and an EGL image that uses the texture as its source
+    rx::MockTextureImpl *textureImpl = new rx::MockTextureImpl();
+    gl::Texture *texture = new gl::Texture(textureImpl, 1, GL_TEXTURE_2D);
+    texture-&gt;addRef();
+
+    gl::PixelUnpackState defaultUnpackState;
+
+    EXPECT_CALL(*textureImpl, setImage(_, _, _, _, _, _, _, _))
+        .WillOnce(Return(gl::Error(GL_NO_ERROR)))
+        .RetiresOnSaturation();
+    texture-&gt;setImage(defaultUnpackState, GL_TEXTURE_2D, 0, GL_RGBA8, gl::Extents(1, 1, 1), GL_RGBA,
+                      GL_UNSIGNED_BYTE, nullptr);
+
+    rx::MockImageImpl *imageImpl = new rx::MockImageImpl();
+    egl::Image *image = new egl::Image(imageImpl, EGL_GL_TEXTURE_2D, texture, egl::AttributeMap());
+    image-&gt;addRef();
+
+    // Verify that the image added a ref to the texture and the texture has not added a ref to the
+    // image
+    EXPECT_EQ(texture-&gt;getRefCount(), 2u);
+    EXPECT_EQ(image-&gt;getRefCount(), 1u);
+
+    // Respecify the texture and verify that the image releases its reference
+    EXPECT_CALL(*imageImpl, orphan(_))
+        .WillOnce(Return(gl::Error(GL_NO_ERROR)))
+        .RetiresOnSaturation();
+    EXPECT_CALL(*textureImpl, setImage(_, _, _, _, _, _, _, _))
+        .WillOnce(Return(gl::Error(GL_NO_ERROR)))
+        .RetiresOnSaturation();
+
+    texture-&gt;setImage(defaultUnpackState, GL_TEXTURE_2D, 0, GL_RGBA8, gl::Extents(1, 1, 1), GL_RGBA,
+                      GL_UNSIGNED_BYTE, nullptr);
+
+    EXPECT_EQ(texture-&gt;getRefCount(), 1u);
+    EXPECT_EQ(image-&gt;getRefCount(), 1u);
+
+    // Delete the texture and verify that the image still exists
+    EXPECT_CALL(*textureImpl, destructor()).Times(1).RetiresOnSaturation();
+    texture-&gt;release();
+
+    EXPECT_EQ(image-&gt;getRefCount(), 1u);
+
+    // Delete the image
+    EXPECT_CALL(*imageImpl, destructor()).Times(1).RetiresOnSaturation();
+    image-&gt;release();
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEIndexRangeCachecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/IndexRangeCache.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/IndexRangeCache.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/IndexRangeCache.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,113 @@
</span><ins>+//
+// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// IndexRangeCache.cpp: Defines the gl::IndexRangeCache class which stores information about
+// ranges of indices.
+
+#include &quot;libANGLE/IndexRangeCache.h&quot;
+
+#include &quot;common/debug.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
+
+namespace gl
+{
+
+void IndexRangeCache::addRange(GLenum type,
+                               size_t offset,
+                               size_t count,
+                               bool primitiveRestartEnabled,
+                               const IndexRange &amp;range)
+{
+    mIndexRangeCache[IndexRangeKey(type, offset, count, primitiveRestartEnabled)] = range;
+}
+
+bool IndexRangeCache::findRange(GLenum type,
+                                size_t offset,
+                                size_t count,
+                                bool primitiveRestartEnabled,
+                                IndexRange *outRange) const
+{
+    auto i = mIndexRangeCache.find(IndexRangeKey(type, offset, count, primitiveRestartEnabled));
+    if (i != mIndexRangeCache.end())
+    {
+        if (outRange)
+        {
+            *outRange = i-&gt;second;
+        }
+        return true;
+    }
+    else
+    {
+        if (outRange)
+        {
+            *outRange = IndexRange();
+        }
+        return false;
+    }
+}
+
+void IndexRangeCache::invalidateRange(size_t offset, size_t size)
+{
+    size_t invalidateStart = offset;
+    size_t invalidateEnd   = offset + size;
+
+    auto i = mIndexRangeCache.begin();
+    while (i != mIndexRangeCache.end())
+    {
+        size_t rangeStart = i-&gt;first.offset;
+        size_t rangeEnd   = i-&gt;first.offset + (GetTypeInfo(i-&gt;first.type).bytes * i-&gt;first.count);
+
+        if (invalidateEnd &lt; rangeStart || invalidateStart &gt; rangeEnd)
+        {
+            ++i;
+        }
+        else
+        {
+            mIndexRangeCache.erase(i++);
+        }
+    }
+}
+
+void IndexRangeCache::clear()
+{
+    mIndexRangeCache.clear();
+}
+
+IndexRangeCache::IndexRangeKey::IndexRangeKey()
+    : IndexRangeCache::IndexRangeKey(GL_NONE, 0, 0, false)
+{
+}
+
+IndexRangeCache::IndexRangeKey::IndexRangeKey(GLenum type_,
+                                              size_t offset_,
+                                              size_t count_,
+                                              bool primitiveRestartEnabled_)
+    : type(type_), offset(offset_), count(count_), primitiveRestartEnabled(primitiveRestartEnabled_)
+{
+}
+
+bool IndexRangeCache::IndexRangeKey::operator&lt;(const IndexRangeKey &amp;rhs) const
+{
+    if (type != rhs.type)
+    {
+        return type &lt; rhs.type;
+    }
+    if (offset != rhs.offset)
+    {
+        return offset &lt; rhs.offset;
+    }
+    if (count != rhs.count)
+    {
+        return count &lt; rhs.count;
+    }
+    if (primitiveRestartEnabled != rhs.primitiveRestartEnabled)
+    {
+        return primitiveRestartEnabled;
+    }
+    return false;
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEIndexRangeCacheh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/IndexRangeCache.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/IndexRangeCache.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/IndexRangeCache.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,60 @@
</span><ins>+//
+// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// IndexRangeCache.h: Defines the gl::IndexRangeCache class which stores information about
+// ranges of indices.
+
+#ifndef LIBANGLE_INDEXRANGECACHE_H_
+#define LIBANGLE_INDEXRANGECACHE_H_
+
+#include &quot;common/angleutils.h&quot;
+#include &quot;common/mathutil.h&quot;
+
+#include &quot;angle_gl.h&quot;
+
+#include &lt;map&gt;
+
+namespace gl
+{
+
+class IndexRangeCache
+{
+  public:
+    void addRange(GLenum type,
+                  size_t offset,
+                  size_t count,
+                  bool primitiveRestartEnabled,
+                  const IndexRange &amp;range);
+    bool findRange(GLenum type,
+                   size_t offset,
+                   size_t count,
+                   bool primitiveRestartEnabled,
+                   IndexRange *outRange) const;
+
+    void invalidateRange(size_t offset, size_t size);
+    void clear();
+
+  private:
+    struct IndexRangeKey
+    {
+        IndexRangeKey();
+        IndexRangeKey(GLenum type, size_t offset, size_t count, bool primitiveRestart);
+
+        bool operator&lt;(const IndexRangeKey &amp;rhs) const;
+
+        GLenum type;
+        size_t offset;
+        size_t count;
+        bool primitiveRestartEnabled;
+    };
+
+    typedef std::map&lt;IndexRangeKey, IndexRange&gt; IndexRangeMap;
+    IndexRangeMap mIndexRangeCache;
+};
+
+}
+
+#endif // LIBANGLE_INDEXRANGECACHE_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEPlatformcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Platform.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Platform.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Platform.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,20 +16,20 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // static
</span><del>-ANGLE_EXPORT angle::Platform *ANGLEPlatformCurrent()
</del><ins>+angle::Platform *ANGLE_APIENTRY ANGLEPlatformCurrent()
</ins><span class="cx"> {
</span><span class="cx">     return currentPlatform;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // static
</span><del>-ANGLE_EXPORT void ANGLEPlatformInitialize(angle::Platform *platformImpl)
</del><ins>+void ANGLE_APIENTRY ANGLEPlatformInitialize(angle::Platform *platformImpl)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(platformImpl != nullptr);
</span><span class="cx">     currentPlatform = platformImpl;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // static
</span><del>-ANGLE_EXPORT void ANGLEPlatformShutdown()
</del><ins>+void ANGLE_APIENTRY ANGLEPlatformShutdown()
</ins><span class="cx"> {
</span><span class="cx">     currentPlatform = nullptr;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEProgramcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,6 +11,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;algorithm&gt;
</span><span class="cx"> 
</span><ins>+#include &quot;common/BitSetIterator.h&quot;
</ins><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="cx"> #include &quot;common/platform.h&quot;
</span><span class="cx"> #include &quot;common/utilities.h&quot;
</span><span class="lines">@@ -21,32 +22,122 @@
</span><span class="cx"> #include &quot;libANGLE/features.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/Renderer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/ProgramImpl.h&quot;
</span><ins>+#include &quot;libANGLE/queryconversions.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><del>-const char * const g_fakepath = &quot;C:\\fakepath&quot;;
</del><span class="cx"> 
</span><span class="cx"> namespace
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-unsigned int ParseAndStripArrayIndex(std::string* name)
</del><ins>+void WriteShaderVar(BinaryOutputStream *stream, const sh::ShaderVariable &amp;var)
</ins><span class="cx"> {
</span><del>-    unsigned int subscript = GL_INVALID_INDEX;
</del><ins>+    stream-&gt;writeInt(var.type);
+    stream-&gt;writeInt(var.precision);
+    stream-&gt;writeString(var.name);
+    stream-&gt;writeString(var.mappedName);
+    stream-&gt;writeInt(var.arraySize);
+    stream-&gt;writeInt(var.staticUse);
+    stream-&gt;writeString(var.structName);
+    ASSERT(var.fields.empty());
+}
</ins><span class="cx"> 
</span><del>-    // Strip any trailing array operator and retrieve the subscript
-    size_t open = name-&gt;find_last_of('[');
-    size_t close = name-&gt;find_last_of(']');
-    if (open != std::string::npos &amp;&amp; close == name-&gt;length() - 1)
</del><ins>+void LoadShaderVar(BinaryInputStream *stream, sh::ShaderVariable *var)
+{
+    var-&gt;type       = stream-&gt;readInt&lt;GLenum&gt;();
+    var-&gt;precision  = stream-&gt;readInt&lt;GLenum&gt;();
+    var-&gt;name       = stream-&gt;readString();
+    var-&gt;mappedName = stream-&gt;readString();
+    var-&gt;arraySize  = stream-&gt;readInt&lt;unsigned int&gt;();
+    var-&gt;staticUse  = stream-&gt;readBool();
+    var-&gt;structName = stream-&gt;readString();
+}
+
+// This simplified cast function doesn't need to worry about advanced concepts like
+// depth range values, or casting to bool.
+template &lt;typename DestT, typename SrcT&gt;
+DestT UniformStateQueryCast(SrcT value);
+
+// From-Float-To-Integer Casts
+template &lt;&gt;
+GLint UniformStateQueryCast(GLfloat value)
+{
+    return clampCast&lt;GLint&gt;(roundf(value));
+}
+
+template &lt;&gt;
+GLuint UniformStateQueryCast(GLfloat value)
+{
+    return clampCast&lt;GLuint&gt;(roundf(value));
+}
+
+// From-Integer-to-Integer Casts
+template &lt;&gt;
+GLint UniformStateQueryCast(GLuint value)
+{
+    return clampCast&lt;GLint&gt;(value);
+}
+
+template &lt;&gt;
+GLuint UniformStateQueryCast(GLint value)
+{
+    return clampCast&lt;GLuint&gt;(value);
+}
+
+// From-Boolean-to-Anything Casts
+template &lt;&gt;
+GLfloat UniformStateQueryCast(GLboolean value)
+{
+    return (value == GL_TRUE ? 1.0f : 0.0f);
+}
+
+template &lt;&gt;
+GLint UniformStateQueryCast(GLboolean value)
+{
+    return (value == GL_TRUE ? 1 : 0);
+}
+
+template &lt;&gt;
+GLuint UniformStateQueryCast(GLboolean value)
+{
+    return (value == GL_TRUE ? 1u : 0u);
+}
+
+// Default to static_cast
+template &lt;typename DestT, typename SrcT&gt;
+DestT UniformStateQueryCast(SrcT value)
+{
+    return static_cast&lt;DestT&gt;(value);
+}
+
+template &lt;typename SrcT, typename DestT&gt;
+void UniformStateQueryCastLoop(DestT *dataOut, const uint8_t *srcPointer, int components)
+{
+    for (int comp = 0; comp &lt; components; ++comp)
</ins><span class="cx">     {
</span><del>-        subscript = atoi(name-&gt;substr(open + 1).c_str());
-        name-&gt;erase(open);
</del><ins>+        // We only work with strides of 4 bytes for uniform components. (GLfloat/GLint)
+        // Don't use SrcT stride directly since GLboolean has a stride of 1 byte.
+        size_t offset               = comp * 4;
+        const SrcT *typedSrcPointer = reinterpret_cast&lt;const SrcT *&gt;(&amp;srcPointer[offset]);
+        dataOut[comp]               = UniformStateQueryCast&lt;DestT&gt;(*typedSrcPointer);
</ins><span class="cx">     }
</span><del>-
-    return subscript;
</del><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool UniformInList(const std::vector&lt;LinkedUniform&gt; &amp;list, const std::string &amp;name)
+{
+    for (const LinkedUniform &amp;uniform : list)
+    {
+        if (uniform.name == name)
+            return true;
+    }
+
+    return false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}  // anonymous namespace
+
+const char *const g_fakepath = &quot;C:\\fakepath&quot;;
+
</ins><span class="cx"> AttributeBindings::AttributeBindings()
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -65,10 +156,11 @@
</span><span class="cx"> 
</span><span class="cx"> size_t InfoLog::getLength() const
</span><span class="cx"> {
</span><del>-    return mStream.str().length();
</del><ins>+    const std::string &amp;logString = mStream.str();
+    return logString.empty() ? 0 : logString.length() + 1;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InfoLog::getLog(GLsizei bufSize, GLsizei *length, char *infoLog)
</del><ins>+void InfoLog::getLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
</ins><span class="cx"> {
</span><span class="cx">     size_t index = 0;
</span><span class="cx"> 
</span><span class="lines">@@ -109,24 +201,9 @@
</span><span class="cx">     }
</span><span class="cx">     while (found != std::string::npos);
</span><span class="cx"> 
</span><del>-    mStream &lt;&lt; message &lt;&lt; &quot;\n&quot;;
</del><ins>+    mStream &lt;&lt; message &lt;&lt; std::endl;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InfoLog::append(const char *format, ...)
-{
-    if (!format)
-    {
-        return;
-    }
-
-    va_list vararg;
-    va_start(vararg, format);
-    std::string tempString(FormatString(format, vararg));
-    va_end(vararg);
-
-    mStream &lt;&lt; tempString &lt;&lt; &quot;\n&quot;;
-}
-
</del><span class="cx"> void InfoLog::reset()
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -145,28 +222,104 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-LinkedVarying::LinkedVarying()
</del><ins>+Program::Data::Data()
+    : mLabel(),
+      mAttachedFragmentShader(nullptr),
+      mAttachedVertexShader(nullptr),
+      mTransformFeedbackBufferMode(GL_INTERLEAVED_ATTRIBS),
+      mBinaryRetrieveableHint(false)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-LinkedVarying::LinkedVarying(const std::string &amp;name, GLenum type, GLsizei size, const std::string &amp;semanticName,
-                             unsigned int semanticIndex, unsigned int semanticIndexCount)
-    : name(name), type(type), size(size), semanticName(semanticName), semanticIndex(semanticIndex), semanticIndexCount(semanticIndexCount)
</del><ins>+Program::Data::~Data()
</ins><span class="cx"> {
</span><ins>+    if (mAttachedVertexShader != nullptr)
+    {
+        mAttachedVertexShader-&gt;release();
+    }
+
+    if (mAttachedFragmentShader != nullptr)
+    {
+        mAttachedFragmentShader-&gt;release();
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Program::Program(rx::ProgramImpl *impl, ResourceManager *manager, GLuint handle)
-    : mProgram(impl),
</del><ins>+const std::string &amp;Program::Data::getLabel()
+{
+    return mLabel;
+}
+
+const LinkedUniform *Program::Data::getUniformByName(const std::string &amp;name) const
+{
+    for (const LinkedUniform &amp;linkedUniform : mUniforms)
+    {
+        if (linkedUniform.name == name)
+        {
+            return &amp;linkedUniform;
+        }
+    }
+
+    return nullptr;
+}
+
+GLint Program::Data::getUniformLocation(const std::string &amp;name) const
+{
+    size_t subscript     = GL_INVALID_INDEX;
+    std::string baseName = gl::ParseUniformName(name, &amp;subscript);
+
+    for (size_t location = 0; location &lt; mUniformLocations.size(); ++location)
+    {
+        const VariableLocation &amp;uniformLocation = mUniformLocations[location];
+        const LinkedUniform &amp;uniform            = mUniforms[uniformLocation.index];
+
+        if (uniform.name == baseName)
+        {
+            if ((uniform.isArray() &amp;&amp; uniformLocation.element == subscript) ||
+                (subscript == GL_INVALID_INDEX))
+            {
+                return static_cast&lt;GLint&gt;(location);
+            }
+        }
+    }
+
+    return -1;
+}
+
+GLuint Program::Data::getUniformIndex(const std::string &amp;name) const
+{
+    size_t subscript     = GL_INVALID_INDEX;
+    std::string baseName = gl::ParseUniformName(name, &amp;subscript);
+
+    // The app is not allowed to specify array indices other than 0 for arrays of basic types
+    if (subscript != 0 &amp;&amp; subscript != GL_INVALID_INDEX)
+    {
+        return GL_INVALID_INDEX;
+    }
+
+    for (size_t index = 0; index &lt; mUniforms.size(); index++)
+    {
+        const LinkedUniform &amp;uniform = mUniforms[index];
+        if (uniform.name == baseName)
+        {
+            if (uniform.isArray() || subscript == GL_INVALID_INDEX)
+            {
+                return static_cast&lt;GLuint&gt;(index);
+            }
+        }
+    }
+
+    return GL_INVALID_INDEX;
+}
+
+Program::Program(rx::ImplFactory *factory, ResourceManager *manager, GLuint handle)
+    : mProgram(factory-&gt;createProgram(mData)),
</ins><span class="cx">       mValidated(false),
</span><del>-      mTransformFeedbackVaryings(),
-      mTransformFeedbackBufferMode(GL_NONE),
-      mFragmentShader(nullptr),
-      mVertexShader(nullptr),
</del><span class="cx">       mLinked(false),
</span><span class="cx">       mDeleteStatus(false),
</span><span class="cx">       mRefCount(0),
</span><span class="cx">       mResourceManager(manager),
</span><del>-      mHandle(handle)
</del><ins>+      mHandle(handle),
+      mSamplerUniformRange(0, 0)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mProgram);
</span><span class="cx"> 
</span><span class="lines">@@ -178,40 +331,40 @@
</span><span class="cx"> {
</span><span class="cx">     unlink(true);
</span><span class="cx"> 
</span><del>-    if (mVertexShader != nullptr)
-    {
-        mVertexShader-&gt;release();
-    }
</del><ins>+    SafeDelete(mProgram);
+}
</ins><span class="cx"> 
</span><del>-    if (mFragmentShader != nullptr)
-    {
-        mFragmentShader-&gt;release();
-    }
</del><ins>+void Program::setLabel(const std::string &amp;label)
+{
+    mData.mLabel = label;
+}
</ins><span class="cx"> 
</span><del>-    SafeDelete(mProgram);
</del><ins>+const std::string &amp;Program::getLabel() const
+{
+    return mData.mLabel;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Program::attachShader(Shader *shader)
</span><span class="cx"> {
</span><span class="cx">     if (shader-&gt;getType() == GL_VERTEX_SHADER)
</span><span class="cx">     {
</span><del>-        if (mVertexShader)
</del><ins>+        if (mData.mAttachedVertexShader)
</ins><span class="cx">         {
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        mVertexShader = shader;
-        mVertexShader-&gt;addRef();
</del><ins>+        mData.mAttachedVertexShader = shader;
+        mData.mAttachedVertexShader-&gt;addRef();
</ins><span class="cx">     }
</span><span class="cx">     else if (shader-&gt;getType() == GL_FRAGMENT_SHADER)
</span><span class="cx">     {
</span><del>-        if (mFragmentShader)
</del><ins>+        if (mData.mAttachedFragmentShader)
</ins><span class="cx">         {
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        mFragmentShader = shader;
-        mFragmentShader-&gt;addRef();
</del><ins>+        mData.mAttachedFragmentShader = shader;
+        mData.mAttachedFragmentShader-&gt;addRef();
</ins><span class="cx">     }
</span><span class="cx">     else UNREACHABLE();
</span><span class="cx"> 
</span><span class="lines">@@ -222,23 +375,23 @@
</span><span class="cx"> {
</span><span class="cx">     if (shader-&gt;getType() == GL_VERTEX_SHADER)
</span><span class="cx">     {
</span><del>-        if (mVertexShader != shader)
</del><ins>+        if (mData.mAttachedVertexShader != shader)
</ins><span class="cx">         {
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        mVertexShader-&gt;release();
-        mVertexShader = nullptr;
</del><ins>+        shader-&gt;release();
+        mData.mAttachedVertexShader = nullptr;
</ins><span class="cx">     }
</span><span class="cx">     else if (shader-&gt;getType() == GL_FRAGMENT_SHADER)
</span><span class="cx">     {
</span><del>-        if (mFragmentShader != shader)
</del><ins>+        if (mData.mAttachedFragmentShader != shader)
</ins><span class="cx">         {
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        mFragmentShader-&gt;release();
-        mFragmentShader = nullptr;
</del><ins>+        shader-&gt;release();
+        mData.mAttachedFragmentShader = nullptr;
</ins><span class="cx">     }
</span><span class="cx">     else UNREACHABLE();
</span><span class="cx"> 
</span><span class="lines">@@ -247,7 +400,7 @@
</span><span class="cx"> 
</span><span class="cx"> int Program::getAttachedShadersCount() const
</span><span class="cx"> {
</span><del>-    return (mVertexShader ? 1 : 0) + (mFragmentShader ? 1 : 0);
</del><ins>+    return (mData.mAttachedVertexShader ? 1 : 0) + (mData.mAttachedFragmentShader ? 1 : 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void AttributeBindings::bindAttributeLocation(GLuint index, const char *name)
</span><span class="lines">@@ -271,65 +424,63 @@
</span><span class="cx"> // Links the HLSL code of the vertex and pixel shader by matching up their varyings,
</span><span class="cx"> // compiling them into binaries, determining the attribute mappings, and collecting
</span><span class="cx"> // a list of uniforms
</span><del>-Error Program::link(const Data &amp;data)
</del><ins>+Error Program::link(const gl::Data &amp;data)
</ins><span class="cx"> {
</span><span class="cx">     unlink(false);
</span><span class="cx"> 
</span><span class="cx">     mInfoLog.reset();
</span><span class="cx">     resetUniformBlockBindings();
</span><span class="cx"> 
</span><del>-    if (!mFragmentShader || !mFragmentShader-&gt;isCompiled())
</del><ins>+    if (!mData.mAttachedFragmentShader || !mData.mAttachedFragmentShader-&gt;isCompiled())
</ins><span class="cx">     {
</span><span class="cx">         return Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><del>-    ASSERT(mFragmentShader-&gt;getType() == GL_FRAGMENT_SHADER);
</del><ins>+    ASSERT(mData.mAttachedFragmentShader-&gt;getType() == GL_FRAGMENT_SHADER);
</ins><span class="cx"> 
</span><del>-    if (!mVertexShader || !mVertexShader-&gt;isCompiled())
</del><ins>+    if (!mData.mAttachedVertexShader || !mData.mAttachedVertexShader-&gt;isCompiled())
</ins><span class="cx">     {
</span><span class="cx">         return Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><del>-    ASSERT(mVertexShader-&gt;getType() == GL_VERTEX_SHADER);
</del><ins>+    ASSERT(mData.mAttachedVertexShader-&gt;getType() == GL_VERTEX_SHADER);
</ins><span class="cx"> 
</span><del>-    if (!linkAttributes(data, mInfoLog, mAttributeBindings, mVertexShader))
</del><ins>+    if (!linkAttributes(data, mInfoLog, mAttributeBindings, mData.mAttachedVertexShader))
</ins><span class="cx">     {
</span><span class="cx">         return Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    int registers;
-    std::vector&lt;LinkedVarying&gt; linkedVaryings;
-    rx::LinkResult result = mProgram-&gt;link(data, mInfoLog, mFragmentShader, mVertexShader, mTransformFeedbackVaryings, mTransformFeedbackBufferMode,
-                                           &amp;registers, &amp;linkedVaryings, &amp;mOutputVariables);
-    if (result.error.isError() || !result.linkSuccess)
</del><ins>+    if (!linkVaryings(mInfoLog, mData.mAttachedVertexShader, mData.mAttachedFragmentShader))
</ins><span class="cx">     {
</span><del>-        return result.error;
</del><ins>+        return Error(GL_NO_ERROR);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!mProgram-&gt;linkUniforms(mInfoLog, *mVertexShader, *mFragmentShader, *data.caps))
</del><ins>+    if (!linkUniforms(mInfoLog, *data.caps))
</ins><span class="cx">     {
</span><span class="cx">         return Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!linkUniformBlocks(mInfoLog, *mVertexShader, *mFragmentShader, *data.caps))
</del><ins>+    if (!linkUniformBlocks(mInfoLog, *data.caps))
</ins><span class="cx">     {
</span><span class="cx">         return Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!gatherTransformFeedbackLinkedVaryings(mInfoLog, linkedVaryings, mTransformFeedbackVaryings,
-                                               mTransformFeedbackBufferMode, &amp;mProgram-&gt;getTransformFeedbackLinkedVaryings(), *data.caps))
</del><ins>+    const auto &amp;mergedVaryings = getMergedVaryings();
+
+    if (!linkValidateTransformFeedback(mInfoLog, mergedVaryings, *data.caps))
</ins><span class="cx">     {
</span><span class="cx">         return Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // TODO: The concept of &quot;executables&quot; is D3D only, and as such this belongs in ProgramD3D. It must be called,
-    // however, last in this function, so it can't simply be moved to ProgramD3D::link without further shuffling.
-    result = mProgram-&gt;compileProgramExecutables(mInfoLog, mFragmentShader, mVertexShader, registers);
</del><ins>+    linkOutputVariables();
+
+    rx::LinkResult result = mProgram-&gt;link(data, mInfoLog);
</ins><span class="cx">     if (result.error.isError() || !result.linkSuccess)
</span><span class="cx">     {
</span><del>-        mInfoLog.append(&quot;Failed to create D3D shaders.&quot;);
-        unlink(false);
</del><span class="cx">         return result.error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    gatherTransformFeedbackVaryings(mergedVaryings);
+    gatherInterfaceBlockInfo();
+
</ins><span class="cx">     mLinked = true;
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="lines">@@ -352,30 +503,33 @@
</span><span class="cx"> {
</span><span class="cx">     if (destroy)   // Object being destructed
</span><span class="cx">     {
</span><del>-        if (mFragmentShader)
</del><ins>+        if (mData.mAttachedFragmentShader)
</ins><span class="cx">         {
</span><del>-            mFragmentShader-&gt;release();
-            mFragmentShader = nullptr;
</del><ins>+            mData.mAttachedFragmentShader-&gt;release();
+            mData.mAttachedFragmentShader = nullptr;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (mVertexShader)
</del><ins>+        if (mData.mAttachedVertexShader)
</ins><span class="cx">         {
</span><del>-            mVertexShader-&gt;release();
-            mVertexShader = nullptr;
</del><ins>+            mData.mAttachedVertexShader-&gt;release();
+            mData.mAttachedVertexShader = nullptr;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    std::fill(mLinkedAttribute, mLinkedAttribute + ArraySize(mLinkedAttribute), sh::Attribute());
-    mOutputVariables.clear();
</del><ins>+    mData.mAttributes.clear();
+    mData.mActiveAttribLocationsMask.reset();
+    mData.mTransformFeedbackVaryingVars.clear();
+    mData.mUniforms.clear();
+    mData.mUniformLocations.clear();
+    mData.mUniformBlocks.clear();
+    mData.mOutputVariables.clear();
</ins><span class="cx"> 
</span><del>-    mProgram-&gt;reset();
-
</del><span class="cx">     mValidated = false;
</span><span class="cx"> 
</span><span class="cx">     mLinked = false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Program::isLinked()
</del><ins>+bool Program::isLinked() const
</ins><span class="cx"> {
</span><span class="cx">     return mLinked;
</span><span class="cx"> }
</span><span class="lines">@@ -387,22 +541,20 @@
</span><span class="cx"> #if ANGLE_PROGRAM_BINARY_LOAD != ANGLE_ENABLED
</span><span class="cx">     return Error(GL_NO_ERROR);
</span><span class="cx"> #else
</span><del>-    ASSERT(binaryFormat == mProgram-&gt;getBinaryFormat());
-
-    BinaryInputStream stream(binary, length);
-
-    GLenum format = stream.readInt&lt;GLenum&gt;();
-    if (format != mProgram-&gt;getBinaryFormat())
</del><ins>+    ASSERT(binaryFormat == GL_PROGRAM_BINARY_ANGLE);
+    if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
</ins><span class="cx">     {
</span><del>-        mInfoLog.append(&quot;Invalid program binary format.&quot;);
</del><ins>+        mInfoLog &lt;&lt; &quot;Invalid program binary format.&quot;;
</ins><span class="cx">         return Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    BinaryInputStream stream(binary, length);
+
</ins><span class="cx">     int majorVersion = stream.readInt&lt;int&gt;();
</span><span class="cx">     int minorVersion = stream.readInt&lt;int&gt;();
</span><span class="cx">     if (majorVersion != ANGLE_MAJOR_VERSION || minorVersion != ANGLE_MINOR_VERSION)
</span><span class="cx">     {
</span><del>-        mInfoLog.append(&quot;Invalid program binary version.&quot;);
</del><ins>+        mInfoLog &lt;&lt; &quot;Invalid program binary version.&quot;;
</ins><span class="cx">         return Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -410,29 +562,105 @@
</span><span class="cx">     stream.readBytes(commitString, ANGLE_COMMIT_HASH_SIZE);
</span><span class="cx">     if (memcmp(commitString, ANGLE_COMMIT_HASH, sizeof(unsigned char) * ANGLE_COMMIT_HASH_SIZE) != 0)
</span><span class="cx">     {
</span><del>-        mInfoLog.append(&quot;Invalid program binary version.&quot;);
</del><ins>+        mInfoLog &lt;&lt; &quot;Invalid program binary version.&quot;;
</ins><span class="cx">         return Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // TODO(jmadill): replace MAX_VERTEX_ATTRIBS
-    for (int i = 0; i &lt; MAX_VERTEX_ATTRIBS; ++i)
-    {
-        stream.readInt(&amp;mLinkedAttribute[i].type);
-        stream.readString(&amp;mLinkedAttribute[i].name);
-        stream.readInt(&amp;mProgram-&gt;getSemanticIndexes()[i]);
-    }
</del><ins>+    static_assert(MAX_VERTEX_ATTRIBS &lt;= sizeof(unsigned long) * 8,
+                  &quot;Too many vertex attribs for mask&quot;);
+    mData.mActiveAttribLocationsMask = stream.readInt&lt;unsigned long&gt;();
</ins><span class="cx"> 
</span><span class="cx">     unsigned int attribCount = stream.readInt&lt;unsigned int&gt;();
</span><ins>+    ASSERT(mData.mAttributes.empty());
</ins><span class="cx">     for (unsigned int attribIndex = 0; attribIndex &lt; attribCount; ++attribIndex)
</span><span class="cx">     {
</span><del>-        GLenum type = stream.readInt&lt;GLenum&gt;();
-        GLenum precision = stream.readInt&lt;GLenum&gt;();
-        std::string name = stream.readString();
-        GLint arraySize = stream.readInt&lt;GLint&gt;();
-        int location = stream.readInt&lt;int&gt;();
-        mProgram-&gt;setShaderAttribute(attribIndex, type, precision, name, arraySize, location);
</del><ins>+        sh::Attribute attrib;
+        LoadShaderVar(&amp;stream, &amp;attrib);
+        attrib.location = stream.readInt&lt;int&gt;();
+        mData.mAttributes.push_back(attrib);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    unsigned int uniformCount = stream.readInt&lt;unsigned int&gt;();
+    ASSERT(mData.mUniforms.empty());
+    for (unsigned int uniformIndex = 0; uniformIndex &lt; uniformCount; ++uniformIndex)
+    {
+        LinkedUniform uniform;
+        LoadShaderVar(&amp;stream, &amp;uniform);
+
+        uniform.blockIndex                 = stream.readInt&lt;int&gt;();
+        uniform.blockInfo.offset           = stream.readInt&lt;int&gt;();
+        uniform.blockInfo.arrayStride      = stream.readInt&lt;int&gt;();
+        uniform.blockInfo.matrixStride     = stream.readInt&lt;int&gt;();
+        uniform.blockInfo.isRowMajorMatrix = stream.readBool();
+
+        mData.mUniforms.push_back(uniform);
+    }
+
+    const unsigned int uniformIndexCount = stream.readInt&lt;unsigned int&gt;();
+    ASSERT(mData.mUniformLocations.empty());
+    for (unsigned int uniformIndexIndex = 0; uniformIndexIndex &lt; uniformIndexCount;
+         uniformIndexIndex++)
+    {
+        VariableLocation variable;
+        stream.readString(&amp;variable.name);
+        stream.readInt(&amp;variable.element);
+        stream.readInt(&amp;variable.index);
+
+        mData.mUniformLocations.push_back(variable);
+    }
+
+    unsigned int uniformBlockCount = stream.readInt&lt;unsigned int&gt;();
+    ASSERT(mData.mUniformBlocks.empty());
+    for (unsigned int uniformBlockIndex = 0; uniformBlockIndex &lt; uniformBlockCount;
+         ++uniformBlockIndex)
+    {
+        UniformBlock uniformBlock;
+        stream.readString(&amp;uniformBlock.name);
+        stream.readBool(&amp;uniformBlock.isArray);
+        stream.readInt(&amp;uniformBlock.arrayElement);
+        stream.readInt(&amp;uniformBlock.dataSize);
+        stream.readBool(&amp;uniformBlock.vertexStaticUse);
+        stream.readBool(&amp;uniformBlock.fragmentStaticUse);
+
+        unsigned int numMembers = stream.readInt&lt;unsigned int&gt;();
+        for (unsigned int blockMemberIndex = 0; blockMemberIndex &lt; numMembers; blockMemberIndex++)
+        {
+            uniformBlock.memberUniformIndexes.push_back(stream.readInt&lt;unsigned int&gt;());
+        }
+
+        mData.mUniformBlocks.push_back(uniformBlock);
+    }
+
+    unsigned int transformFeedbackVaryingCount = stream.readInt&lt;unsigned int&gt;();
+    ASSERT(mData.mTransformFeedbackVaryingVars.empty());
+    for (unsigned int transformFeedbackVaryingIndex = 0;
+        transformFeedbackVaryingIndex &lt; transformFeedbackVaryingCount;
+        ++transformFeedbackVaryingIndex)
+    {
+        sh::Varying varying;
+        stream.readInt(&amp;varying.arraySize);
+        stream.readInt(&amp;varying.type);
+        stream.readString(&amp;varying.name);
+
+        mData.mTransformFeedbackVaryingVars.push_back(varying);
+    }
+
+    stream.readInt(&amp;mData.mTransformFeedbackBufferMode);
+
+    unsigned int outputVarCount = stream.readInt&lt;unsigned int&gt;();
+    for (unsigned int outputIndex = 0; outputIndex &lt; outputVarCount; ++outputIndex)
+    {
+        int locationIndex = stream.readInt&lt;int&gt;();
+        VariableLocation locationData;
+        stream.readInt(&amp;locationData.element);
+        stream.readInt(&amp;locationData.index);
+        stream.readString(&amp;locationData.name);
+        mData.mOutputVariables[locationIndex] = locationData;
+    }
+
+    stream.readInt(&amp;mSamplerUniformRange.start);
+    stream.readInt(&amp;mSamplerUniformRange.end);
+
</ins><span class="cx">     rx::LinkResult result = mProgram-&gt;load(mInfoLog, &amp;stream);
</span><span class="cx">     if (result.error.isError() || !result.linkSuccess)
</span><span class="cx">     {
</span><span class="lines">@@ -448,42 +676,93 @@
</span><span class="cx"> {
</span><span class="cx">     if (binaryFormat)
</span><span class="cx">     {
</span><del>-        *binaryFormat = mProgram-&gt;getBinaryFormat();
</del><ins>+        *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     BinaryOutputStream stream;
</span><span class="cx"> 
</span><del>-    stream.writeInt(mProgram-&gt;getBinaryFormat());
</del><span class="cx">     stream.writeInt(ANGLE_MAJOR_VERSION);
</span><span class="cx">     stream.writeInt(ANGLE_MINOR_VERSION);
</span><span class="cx">     stream.writeBytes(reinterpret_cast&lt;const unsigned char*&gt;(ANGLE_COMMIT_HASH), ANGLE_COMMIT_HASH_SIZE);
</span><span class="cx"> 
</span><del>-    // TODO(jmadill): replace MAX_VERTEX_ATTRIBS
-    for (unsigned int i = 0; i &lt; MAX_VERTEX_ATTRIBS; ++i)
</del><ins>+    stream.writeInt(mData.mActiveAttribLocationsMask.to_ulong());
+
+    stream.writeInt(mData.mAttributes.size());
+    for (const sh::Attribute &amp;attrib : mData.mAttributes)
</ins><span class="cx">     {
</span><del>-        stream.writeInt(mLinkedAttribute[i].type);
-        stream.writeString(mLinkedAttribute[i].name);
-        stream.writeInt(mProgram-&gt;getSemanticIndexes()[i]);
</del><ins>+        WriteShaderVar(&amp;stream, attrib);
+        stream.writeInt(attrib.location);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const auto &amp;shaderAttributes = mProgram-&gt;getShaderAttributes();
-    stream.writeInt(shaderAttributes.size());
-    for (const auto &amp;attrib : shaderAttributes)
</del><ins>+    stream.writeInt(mData.mUniforms.size());
+    for (const gl::LinkedUniform &amp;uniform : mData.mUniforms)
</ins><span class="cx">     {
</span><del>-        stream.writeInt(attrib.type);
-        stream.writeInt(attrib.precision);
-        stream.writeString(attrib.name);
-        stream.writeInt(attrib.arraySize);
-        stream.writeInt(attrib.location);
</del><ins>+        WriteShaderVar(&amp;stream, uniform);
+
+        // FIXME: referenced
+
+        stream.writeInt(uniform.blockIndex);
+        stream.writeInt(uniform.blockInfo.offset);
+        stream.writeInt(uniform.blockInfo.arrayStride);
+        stream.writeInt(uniform.blockInfo.matrixStride);
+        stream.writeInt(uniform.blockInfo.isRowMajorMatrix);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    stream.writeInt(mData.mUniformLocations.size());
+    for (const auto &amp;variable : mData.mUniformLocations)
+    {
+        stream.writeString(variable.name);
+        stream.writeInt(variable.element);
+        stream.writeInt(variable.index);
+    }
+
+    stream.writeInt(mData.mUniformBlocks.size());
+    for (const UniformBlock &amp;uniformBlock : mData.mUniformBlocks)
+    {
+        stream.writeString(uniformBlock.name);
+        stream.writeInt(uniformBlock.isArray);
+        stream.writeInt(uniformBlock.arrayElement);
+        stream.writeInt(uniformBlock.dataSize);
+
+        stream.writeInt(uniformBlock.vertexStaticUse);
+        stream.writeInt(uniformBlock.fragmentStaticUse);
+
+        stream.writeInt(uniformBlock.memberUniformIndexes.size());
+        for (unsigned int memberUniformIndex : uniformBlock.memberUniformIndexes)
+        {
+            stream.writeInt(memberUniformIndex);
+        }
+    }
+
+    stream.writeInt(mData.mTransformFeedbackVaryingVars.size());
+    for (const sh::Varying &amp;varying : mData.mTransformFeedbackVaryingVars)
+    {
+        stream.writeInt(varying.arraySize);
+        stream.writeInt(varying.type);
+        stream.writeString(varying.name);
+    }
+
+    stream.writeInt(mData.mTransformFeedbackBufferMode);
+
+    stream.writeInt(mData.mOutputVariables.size());
+    for (const auto &amp;outputPair : mData.mOutputVariables)
+    {
+        stream.writeInt(outputPair.first);
+        stream.writeInt(outputPair.second.element);
+        stream.writeInt(outputPair.second.index);
+        stream.writeString(outputPair.second.name);
+    }
+
+    stream.writeInt(mSamplerUniformRange.start);
+    stream.writeInt(mSamplerUniformRange.end);
+
</ins><span class="cx">     gl::Error error = mProgram-&gt;save(&amp;stream);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    GLsizei streamLength = static_cast&lt;GLsizei&gt;(stream.length());
</del><ins>+    GLsizei streamLength   = static_cast&lt;GLsizei&gt;(stream.length());
</ins><span class="cx">     const void *streamData = stream.data();
</span><span class="cx"> 
</span><span class="cx">     if (streamLength &gt; bufSize)
</span><span class="lines">@@ -529,6 +808,18 @@
</span><span class="cx">     return length;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Program::setBinaryRetrievableHint(bool retrievable)
+{
+    // TODO(jmadill) : replace with dirty bits
+    mProgram-&gt;setBinaryRetrievableHint(retrievable);
+    mData.mBinaryRetrieveableHint = retrievable;
+}
+
+bool Program::getBinaryRetrievableHint() const
+{
+    return mData.mBinaryRetrieveableHint;
+}
+
</ins><span class="cx"> void Program::release()
</span><span class="cx"> {
</span><span class="cx">     mRefCount--;
</span><span class="lines">@@ -554,33 +845,31 @@
</span><span class="cx">     return static_cast&lt;int&gt;(mInfoLog.getLength());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Program::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog)
</del><ins>+void Program::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
</ins><span class="cx"> {
</span><span class="cx">     return mInfoLog.getLog(bufSize, length, infoLog);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Program::getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders)
</del><ins>+void Program::getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders) const
</ins><span class="cx"> {
</span><span class="cx">     int total = 0;
</span><span class="cx"> 
</span><del>-    if (mVertexShader)
</del><ins>+    if (mData.mAttachedVertexShader)
</ins><span class="cx">     {
</span><span class="cx">         if (total &lt; maxCount)
</span><span class="cx">         {
</span><del>-            shaders[total] = mVertexShader-&gt;getHandle();
</del><ins>+            shaders[total] = mData.mAttachedVertexShader-&gt;getHandle();
+            total++;
</ins><span class="cx">         }
</span><del>-
-        total++;
</del><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (mFragmentShader)
</del><ins>+    if (mData.mAttachedFragmentShader)
</ins><span class="cx">     {
</span><span class="cx">         if (total &lt; maxCount)
</span><span class="cx">         {
</span><del>-            shaders[total] = mFragmentShader-&gt;getHandle();
</del><ins>+            shaders[total] = mData.mAttachedFragmentShader-&gt;getHandle();
+            total++;
</ins><span class="cx">         }
</span><del>-
-        total++;
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (count)
</span><span class="lines">@@ -589,74 +878,31 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLuint Program::getAttributeLocation(const std::string &amp;name)
</del><ins>+GLuint Program::getAttributeLocation(const std::string &amp;name) const
</ins><span class="cx"> {
</span><del>-    for (int index = 0; index &lt; MAX_VERTEX_ATTRIBS; index++)
</del><ins>+    for (const sh::Attribute &amp;attribute : mData.mAttributes)
</ins><span class="cx">     {
</span><del>-        if (mLinkedAttribute[index].name == name)
</del><ins>+        if (attribute.name == name &amp;&amp; attribute.staticUse)
</ins><span class="cx">         {
</span><del>-            return index;
</del><ins>+            return attribute.location;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return static_cast&lt;GLuint&gt;(-1);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const int *Program::getSemanticIndexes() const
</del><ins>+bool Program::isAttribLocationActive(size_t attribLocation) const
</ins><span class="cx"> {
</span><del>-    return mProgram-&gt;getSemanticIndexes();
</del><ins>+    ASSERT(attribLocation &lt; mData.mActiveAttribLocationsMask.size());
+    return mData.mActiveAttribLocationsMask[attribLocation];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-int Program::getSemanticIndex(int attributeIndex)
-{
-    ASSERT(attributeIndex &gt;= 0 &amp;&amp; attributeIndex &lt; MAX_VERTEX_ATTRIBS);
-
-    return mProgram-&gt;getSemanticIndexes()[attributeIndex];
-}
-
</del><span class="cx"> void Program::getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
</span><span class="cx"> {
</span><del>-    if (mLinked)
</del><ins>+    if (!mLinked)
</ins><span class="cx">     {
</span><del>-        // Skip over inactive attributes
-        unsigned int activeAttribute = 0;
-        unsigned int attribute;
-        for (attribute = 0; attribute &lt; MAX_VERTEX_ATTRIBS; attribute++)
-        {
-            if (mLinkedAttribute[attribute].name.empty())
-            {
-                continue;
-            }
-
-            if (activeAttribute == index)
-            {
-                break;
-            }
-
-            activeAttribute++;
-        }
-
</del><span class="cx">         if (bufsize &gt; 0)
</span><span class="cx">         {
</span><del>-            const char *string = mLinkedAttribute[attribute].name.c_str();
-
-            strncpy(name, string, bufsize);
-            name[bufsize - 1] = '\0';
-
-            if (length)
-            {
-                *length = static_cast&lt;GLsizei&gt;(strlen(name));
-            }
-        }
-
-        *size = 1;   // Always a single 'type' instance
-
-        *type = mLinkedAttribute[attribute].type;
-    }
-    else
-    {
-        if (bufsize &gt; 0)
-        {
</del><span class="cx">             name[0] = '\0';
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -667,92 +913,114 @@
</span><span class="cx"> 
</span><span class="cx">         *type = GL_NONE;
</span><span class="cx">         *size = 1;
</span><ins>+        return;
</ins><span class="cx">     }
</span><del>-}
</del><span class="cx"> 
</span><del>-GLint Program::getActiveAttributeCount()
-{
-    int count = 0;
</del><ins>+    size_t attributeIndex = 0;
</ins><span class="cx"> 
</span><del>-    if (mLinked)
</del><ins>+    for (const sh::Attribute &amp;attribute : mData.mAttributes)
</ins><span class="cx">     {
</span><del>-        for (int attributeIndex = 0; attributeIndex &lt; MAX_VERTEX_ATTRIBS; attributeIndex++)
</del><ins>+        // Skip over inactive attributes
+        if (attribute.staticUse)
</ins><span class="cx">         {
</span><del>-            if (!mLinkedAttribute[attributeIndex].name.empty())
</del><ins>+            if (static_cast&lt;size_t&gt;(index) == attributeIndex)
</ins><span class="cx">             {
</span><del>-                count++;
</del><ins>+                break;
</ins><span class="cx">             }
</span><ins>+            attributeIndex++;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return count;
-}
</del><ins>+    ASSERT(index == attributeIndex &amp;&amp; attributeIndex &lt; mData.mAttributes.size());
+    const sh::Attribute &amp;attrib = mData.mAttributes[attributeIndex];
</ins><span class="cx"> 
</span><del>-GLint Program::getActiveAttributeMaxLength()
-{
-    int maxLength = 0;
</del><ins>+    if (bufsize &gt; 0)
+    {
+        const char *string = attrib.name.c_str();
</ins><span class="cx"> 
</span><del>-    if (mLinked)
-    {
-        for (int attributeIndex = 0; attributeIndex &lt; MAX_VERTEX_ATTRIBS; attributeIndex++)
</del><ins>+        strncpy(name, string, bufsize);
+        name[bufsize - 1] = '\0';
+
+        if (length)
</ins><span class="cx">         {
</span><del>-            if (!mLinkedAttribute[attributeIndex].name.empty())
-            {
-                maxLength = std::max((int)(mLinkedAttribute[attributeIndex].name.length() + 1), maxLength);
-            }
</del><ins>+            *length = static_cast&lt;GLsizei&gt;(strlen(name));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return maxLength;
</del><ins>+    // Always a single 'type' instance
+    *size = 1;
+    *type = attrib.type;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-// Returns one more than the highest sampler index used.
-GLint Program::getUsedSamplerRange(SamplerType type)
</del><ins>+GLint Program::getActiveAttributeCount() const
</ins><span class="cx"> {
</span><del>-    return mProgram-&gt;getUsedSamplerRange(type);
-}
</del><ins>+    if (!mLinked)
+    {
+        return 0;
+    }
</ins><span class="cx"> 
</span><del>-bool Program::usesPointSize() const
-{
-    return mProgram-&gt;usesPointSize();
</del><ins>+    GLint count = 0;
+
+    for (const sh::Attribute &amp;attrib : mData.mAttributes)
+    {
+        count += (attrib.staticUse ? 1 : 0);
+    }
+
+    return count;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLint Program::getSamplerMapping(SamplerType type, unsigned int samplerIndex, const Caps &amp;caps)
</del><ins>+GLint Program::getActiveAttributeMaxLength() const
</ins><span class="cx"> {
</span><del>-    return mProgram-&gt;getSamplerMapping(type, samplerIndex, caps);
-}
</del><ins>+    if (!mLinked)
+    {
+        return 0;
+    }
</ins><span class="cx"> 
</span><del>-GLenum Program::getSamplerTextureType(SamplerType type, unsigned int samplerIndex)
-{
-    return mProgram-&gt;getSamplerTextureType(type, samplerIndex);
</del><ins>+    size_t maxLength = 0;
+
+    for (const sh::Attribute &amp;attrib : mData.mAttributes)
+    {
+        if (attrib.staticUse)
+        {
+            maxLength = std::max(attrib.name.length() + 1, maxLength);
+        }
+    }
+
+    return static_cast&lt;GLint&gt;(maxLength);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLint Program::getFragDataLocation(const std::string &amp;name) const
</span><span class="cx"> {
</span><span class="cx">     std::string baseName(name);
</span><span class="cx">     unsigned int arrayIndex = ParseAndStripArrayIndex(&amp;baseName);
</span><del>-    for (auto locationIt = mOutputVariables.begin(); locationIt != mOutputVariables.end(); locationIt++)
</del><ins>+    for (auto outputPair : mData.mOutputVariables)
</ins><span class="cx">     {
</span><del>-        const VariableLocation &amp;outputVariable = locationIt-&gt;second;
</del><ins>+        const VariableLocation &amp;outputVariable = outputPair.second;
</ins><span class="cx">         if (outputVariable.name == baseName &amp;&amp; (arrayIndex == GL_INVALID_INDEX || arrayIndex == outputVariable.element))
</span><span class="cx">         {
</span><del>-            return static_cast&lt;GLint&gt;(locationIt-&gt;first);
</del><ins>+            return static_cast&lt;GLint&gt;(outputPair.first);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     return -1;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Program::getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
</del><ins>+void Program::getActiveUniform(GLuint index,
+                               GLsizei bufsize,
+                               GLsizei *length,
+                               GLint *size,
+                               GLenum *type,
+                               GLchar *name) const
</ins><span class="cx"> {
</span><span class="cx">     if (mLinked)
</span><span class="cx">     {
</span><del>-        ASSERT(index &lt; mProgram-&gt;getUniforms().size());   // index must be smaller than getActiveUniformCount()
-        LinkedUniform *uniform = mProgram-&gt;getUniforms()[index];
</del><ins>+        // index must be smaller than getActiveUniformCount()
+        ASSERT(index &lt; mData.mUniforms.size());
+        const LinkedUniform &amp;uniform = mData.mUniforms[index];
</ins><span class="cx"> 
</span><span class="cx">         if (bufsize &gt; 0)
</span><span class="cx">         {
</span><del>-            std::string string = uniform-&gt;name;
-            if (uniform-&gt;isArray())
</del><ins>+            std::string string = uniform.name;
+            if (uniform.isArray())
</ins><span class="cx">             {
</span><span class="cx">                 string += &quot;[0]&quot;;
</span><span class="cx">             }
</span><span class="lines">@@ -766,8 +1034,8 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        *size = uniform-&gt;elementCount();
-        *type = uniform-&gt;type;
</del><ins>+        *size = uniform.elementCount();
+        *type = uniform.type;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -786,11 +1054,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLint Program::getActiveUniformCount()
</del><ins>+GLint Program::getActiveUniformCount() const
</ins><span class="cx"> {
</span><span class="cx">     if (mLinked)
</span><span class="cx">     {
</span><del>-        return static_cast&lt;GLint&gt;(mProgram-&gt;getUniforms().size());
</del><ins>+        return static_cast&lt;GLint&gt;(mData.mUniforms.size());
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -798,19 +1066,18 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLint Program::getActiveUniformMaxLength()
</del><ins>+GLint Program::getActiveUniformMaxLength() const
</ins><span class="cx"> {
</span><del>-    int maxLength = 0;
</del><ins>+    size_t maxLength = 0;
</ins><span class="cx"> 
</span><span class="cx">     if (mLinked)
</span><span class="cx">     {
</span><del>-        unsigned int numUniforms = static_cast&lt;unsigned int&gt;(mProgram-&gt;getUniforms().size());
-        for (unsigned int uniformIndex = 0; uniformIndex &lt; numUniforms; uniformIndex++)
</del><ins>+        for (const LinkedUniform &amp;uniform : mData.mUniforms)
</ins><span class="cx">         {
</span><del>-            if (!mProgram-&gt;getUniforms()[uniformIndex]-&gt;name.empty())
</del><ins>+            if (!uniform.name.empty())
</ins><span class="cx">             {
</span><del>-                int length = (int)(mProgram-&gt;getUniforms()[uniformIndex]-&gt;name.length() + 1);
-                if (mProgram-&gt;getUniforms()[uniformIndex]-&gt;isArray())
</del><ins>+                size_t length = uniform.name.length() + 1u;
+                if (uniform.isArray())
</ins><span class="cx">                 {
</span><span class="cx">                     length += 3;  // Counting in &quot;[0]&quot;.
</span><span class="cx">                 }
</span><span class="lines">@@ -819,12 +1086,13 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return maxLength;
</del><ins>+    return static_cast&lt;GLint&gt;(maxLength);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLint Program::getActiveUniformi(GLuint index, GLenum pname) const
</span><span class="cx"> {
</span><del>-    const gl::LinkedUniform&amp; uniform = *mProgram-&gt;getUniforms()[index];
</del><ins>+    ASSERT(static_cast&lt;size_t&gt;(index) &lt; mData.mUniforms.size());
+    const gl::LinkedUniform &amp;uniform = mData.mUniforms[index];
</ins><span class="cx">     switch (pname)
</span><span class="cx">     {
</span><span class="cx">       case GL_UNIFORM_TYPE:         return static_cast&lt;GLint&gt;(uniform.type);
</span><span class="lines">@@ -844,161 +1112,167 @@
</span><span class="cx"> 
</span><span class="cx"> bool Program::isValidUniformLocation(GLint location) const
</span><span class="cx"> {
</span><del>-    ASSERT(rx::IsIntegerCastSafe&lt;GLint&gt;(mProgram-&gt;getUniformIndices().size()));
-    return (location &gt;= 0 &amp;&amp; location &lt; static_cast&lt;GLint&gt;(mProgram-&gt;getUniformIndices().size()));
</del><ins>+    ASSERT(rx::IsIntegerCastSafe&lt;GLint&gt;(mData.mUniformLocations.size()));
+    return (location &gt;= 0 &amp;&amp; static_cast&lt;size_t&gt;(location) &lt; mData.mUniformLocations.size());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-LinkedUniform *Program::getUniformByLocation(GLint location) const
</del><ins>+const LinkedUniform &amp;Program::getUniformByLocation(GLint location) const
</ins><span class="cx"> {
</span><del>-    return mProgram-&gt;getUniformByLocation(location);
</del><ins>+    ASSERT(location &gt;= 0 &amp;&amp; static_cast&lt;size_t&gt;(location) &lt; mData.mUniformLocations.size());
+    return mData.mUniforms[mData.mUniformLocations[location].index];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-LinkedUniform *Program::getUniformByName(const std::string &amp;name) const
</del><ins>+GLint Program::getUniformLocation(const std::string &amp;name) const
</ins><span class="cx"> {
</span><del>-    return mProgram-&gt;getUniformByName(name);
</del><ins>+    return mData.getUniformLocation(name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLint Program::getUniformLocation(const std::string &amp;name)
</del><ins>+GLuint Program::getUniformIndex(const std::string &amp;name) const
</ins><span class="cx"> {
</span><del>-    return mProgram-&gt;getUniformLocation(name);
</del><ins>+    return mData.getUniformIndex(name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLuint Program::getUniformIndex(const std::string &amp;name)
-{
-    return mProgram-&gt;getUniformIndex(name);
-}
-
</del><span class="cx"> void Program::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 1, v);
</ins><span class="cx">     mProgram-&gt;setUniform1fv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 2, v);
</ins><span class="cx">     mProgram-&gt;setUniform2fv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 3, v);
</ins><span class="cx">     mProgram-&gt;setUniform3fv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 4, v);
</ins><span class="cx">     mProgram-&gt;setUniform4fv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform1iv(GLint location, GLsizei count, const GLint *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 1, v);
</ins><span class="cx">     mProgram-&gt;setUniform1iv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform2iv(GLint location, GLsizei count, const GLint *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 2, v);
</ins><span class="cx">     mProgram-&gt;setUniform2iv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform3iv(GLint location, GLsizei count, const GLint *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 3, v);
</ins><span class="cx">     mProgram-&gt;setUniform3iv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform4iv(GLint location, GLsizei count, const GLint *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 4, v);
</ins><span class="cx">     mProgram-&gt;setUniform4iv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 1, v);
</ins><span class="cx">     mProgram-&gt;setUniform1uiv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 2, v);
</ins><span class="cx">     mProgram-&gt;setUniform2uiv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 3, v);
</ins><span class="cx">     mProgram-&gt;setUniform3uiv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
</span><span class="cx"> {
</span><ins>+    setUniformInternal(location, count * 4, v);
</ins><span class="cx">     mProgram-&gt;setUniform4uiv(location, count, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setMatrixUniformInternal&lt;2, 2&gt;(location, count, transpose, v);
</ins><span class="cx">     mProgram-&gt;setUniformMatrix2fv(location, count, transpose, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setMatrixUniformInternal&lt;3, 3&gt;(location, count, transpose, v);
</ins><span class="cx">     mProgram-&gt;setUniformMatrix3fv(location, count, transpose, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setMatrixUniformInternal&lt;4, 4&gt;(location, count, transpose, v);
</ins><span class="cx">     mProgram-&gt;setUniformMatrix4fv(location, count, transpose, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setMatrixUniformInternal&lt;2, 3&gt;(location, count, transpose, v);
</ins><span class="cx">     mProgram-&gt;setUniformMatrix2x3fv(location, count, transpose, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setMatrixUniformInternal&lt;2, 4&gt;(location, count, transpose, v);
</ins><span class="cx">     mProgram-&gt;setUniformMatrix2x4fv(location, count, transpose, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setMatrixUniformInternal&lt;3, 2&gt;(location, count, transpose, v);
</ins><span class="cx">     mProgram-&gt;setUniformMatrix3x2fv(location, count, transpose, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setMatrixUniformInternal&lt;3, 4&gt;(location, count, transpose, v);
</ins><span class="cx">     mProgram-&gt;setUniformMatrix3x4fv(location, count, transpose, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setMatrixUniformInternal&lt;4, 2&gt;(location, count, transpose, v);
</ins><span class="cx">     mProgram-&gt;setUniformMatrix4x2fv(location, count, transpose, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *v)
</span><span class="cx"> {
</span><ins>+    setMatrixUniformInternal&lt;4, 3&gt;(location, count, transpose, v);
</ins><span class="cx">     mProgram-&gt;setUniformMatrix4x3fv(location, count, transpose, v);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Program::getUniformfv(GLint location, GLfloat *v)
</del><ins>+void Program::getUniformfv(GLint location, GLfloat *v) const
</ins><span class="cx"> {
</span><del>-    mProgram-&gt;getUniformfv(location, v);
</del><ins>+    getUniformInternal(location, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Program::getUniformiv(GLint location, GLint *v)
</del><ins>+void Program::getUniformiv(GLint location, GLint *v) const
</ins><span class="cx"> {
</span><del>-    mProgram-&gt;getUniformiv(location, v);
</del><ins>+    getUniformInternal(location, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Program::getUniformuiv(GLint location, GLuint *v)
</del><ins>+void Program::getUniformuiv(GLint location, GLuint *v) const
</ins><span class="cx"> {
</span><del>-    mProgram-&gt;getUniformuiv(location, v);
</del><ins>+    getUniformInternal(location, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-// Applies all the uniforms set for this program object to the renderer
-Error Program::applyUniforms()
-{
-    return mProgram-&gt;applyUniforms();
-}
-
-Error Program::applyUniformBuffers(const gl::Data &amp;data)
-{
-    return mProgram-&gt;applyUniformBuffers(data, mUniformBlockBindings);
-}
-
</del><span class="cx"> void Program::flagForDeletion()
</span><span class="cx"> {
</span><span class="cx">     mDeleteStatus = true;
</span><span class="lines">@@ -1012,22 +1286,91 @@
</span><span class="cx"> void Program::validate(const Caps &amp;caps)
</span><span class="cx"> {
</span><span class="cx">     mInfoLog.reset();
</span><del>-    mValidated = false;
</del><span class="cx"> 
</span><span class="cx">     if (mLinked)
</span><span class="cx">     {
</span><del>-        applyUniforms();
-        mValidated = mProgram-&gt;validateSamplers(&amp;mInfoLog, caps);
</del><ins>+        mValidated = (mProgram-&gt;validate(caps, &amp;mInfoLog) == GL_TRUE);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        mInfoLog.append(&quot;Program has not been successfully linked.&quot;);
</del><ins>+        mInfoLog &lt;&lt; &quot;Program has not been successfully linked.&quot;;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Program::validateSamplers(InfoLog *infoLog, const Caps &amp;caps)
</span><span class="cx"> {
</span><del>-    return mProgram-&gt;validateSamplers(infoLog, caps);
</del><ins>+    // Skip cache if we're using an infolog, so we get the full error.
+    // Also skip the cache if the sample mapping has changed, or if we haven't ever validated.
+    if (infoLog == nullptr &amp;&amp; mCachedValidateSamplersResult.valid())
+    {
+        return mCachedValidateSamplersResult.value();
+    }
+
+    if (mTextureUnitTypesCache.empty())
+    {
+        mTextureUnitTypesCache.resize(caps.maxCombinedTextureImageUnits, GL_NONE);
+    }
+    else
+    {
+        std::fill(mTextureUnitTypesCache.begin(), mTextureUnitTypesCache.end(), GL_NONE);
+    }
+
+    // if any two active samplers in a program are of different types, but refer to the same
+    // texture image unit, and this is the current program, then ValidateProgram will fail, and
+    // DrawArrays and DrawElements will issue the INVALID_OPERATION error.
+    for (unsigned int samplerIndex = mSamplerUniformRange.start;
+         samplerIndex &lt; mSamplerUniformRange.end; ++samplerIndex)
+    {
+        const LinkedUniform &amp;uniform = mData.mUniforms[samplerIndex];
+        ASSERT(uniform.isSampler());
+
+        if (!uniform.staticUse)
+            continue;
+
+        const GLuint *dataPtr = reinterpret_cast&lt;const GLuint *&gt;(uniform.getDataPtrToElement(0));
+        GLenum textureType    = SamplerTypeToTextureType(uniform.type);
+
+        for (unsigned int arrayElement = 0; arrayElement &lt; uniform.elementCount(); ++arrayElement)
+        {
+            GLuint textureUnit = dataPtr[arrayElement];
+
+            if (textureUnit &gt;= caps.maxCombinedTextureImageUnits)
+            {
+                if (infoLog)
+                {
+                    (*infoLog) &lt;&lt; &quot;Sampler uniform (&quot; &lt;&lt; textureUnit
+                               &lt;&lt; &quot;) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (&quot;
+                               &lt;&lt; caps.maxCombinedTextureImageUnits &lt;&lt; &quot;)&quot;;
+                }
+
+                mCachedValidateSamplersResult = false;
+                return false;
+            }
+
+            if (mTextureUnitTypesCache[textureUnit] != GL_NONE)
+            {
+                if (textureType != mTextureUnitTypesCache[textureUnit])
+                {
+                    if (infoLog)
+                    {
+                        (*infoLog) &lt;&lt; &quot;Samplers of conflicting types refer to the same texture &quot;
+                                      &quot;image unit (&quot;
+                                   &lt;&lt; textureUnit &lt;&lt; &quot;).&quot;;
+                    }
+
+                    mCachedValidateSamplersResult = false;
+                    return false;
+                }
+            }
+            else
+            {
+                mTextureUnitTypesCache[textureUnit] = textureType;
+            }
+        }
+    }
+
+    mCachedValidateSamplersResult = true;
+    return true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Program::isValidated() const
</span><span class="lines">@@ -1035,29 +1378,25 @@
</span><span class="cx">     return mValidated;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Program::updateSamplerMapping()
</del><ins>+GLuint Program::getActiveUniformBlockCount() const
</ins><span class="cx"> {
</span><del>-    return mProgram-&gt;updateSamplerMapping();
</del><ins>+    return static_cast&lt;GLuint&gt;(mData.mUniformBlocks.size());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLuint Program::getActiveUniformBlockCount()
-{
-    return static_cast&lt;GLuint&gt;(mProgram-&gt;getUniformBlocks().size());
-}
-
</del><span class="cx"> void Program::getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const
</span><span class="cx"> {
</span><del>-    ASSERT(uniformBlockIndex &lt; mProgram-&gt;getUniformBlocks().size());   // index must be smaller than getActiveUniformBlockCount()
</del><ins>+    ASSERT(uniformBlockIndex &lt;
+           mData.mUniformBlocks.size());  // index must be smaller than getActiveUniformBlockCount()
</ins><span class="cx"> 
</span><del>-    const UniformBlock &amp;uniformBlock = *mProgram-&gt;getUniformBlocks()[uniformBlockIndex];
</del><ins>+    const UniformBlock &amp;uniformBlock = mData.mUniformBlocks[uniformBlockIndex];
</ins><span class="cx"> 
</span><span class="cx">     if (bufSize &gt; 0)
</span><span class="cx">     {
</span><span class="cx">         std::string string = uniformBlock.name;
</span><span class="cx"> 
</span><del>-        if (uniformBlock.isArrayElement())
</del><ins>+        if (uniformBlock.isArray)
</ins><span class="cx">         {
</span><del>-            string += ArrayString(uniformBlock.elementIndex);
</del><ins>+            string += ArrayString(uniformBlock.arrayElement);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         strncpy(uniformBlockName, string.c_str(), bufSize);
</span><span class="lines">@@ -1072,9 +1411,10 @@
</span><span class="cx"> 
</span><span class="cx"> void Program::getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const
</span><span class="cx"> {
</span><del>-    ASSERT(uniformBlockIndex &lt; mProgram-&gt;getUniformBlocks().size());   // index must be smaller than getActiveUniformBlockCount()
</del><ins>+    ASSERT(uniformBlockIndex &lt;
+           mData.mUniformBlocks.size());  // index must be smaller than getActiveUniformBlockCount()
</ins><span class="cx"> 
</span><del>-    const UniformBlock &amp;uniformBlock = *mProgram-&gt;getUniformBlocks()[uniformBlockIndex];
</del><ins>+    const UniformBlock &amp;uniformBlock = mData.mUniformBlocks[uniformBlockIndex];
</ins><span class="cx"> 
</span><span class="cx">     switch (pname)
</span><span class="cx">     {
</span><span class="lines">@@ -1082,7 +1422,8 @@
</span><span class="cx">         *params = static_cast&lt;GLint&gt;(uniformBlock.dataSize);
</span><span class="cx">         break;
</span><span class="cx">       case GL_UNIFORM_BLOCK_NAME_LENGTH:
</span><del>-        *params = static_cast&lt;GLint&gt;(uniformBlock.name.size() + 1 + (uniformBlock.isArrayElement() ? 3 : 0));
</del><ins>+          *params =
+              static_cast&lt;GLint&gt;(uniformBlock.name.size() + 1 + (uniformBlock.isArray ? 3 : 0));
</ins><span class="cx">         break;
</span><span class="cx">       case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
</span><span class="cx">         *params = static_cast&lt;GLint&gt;(uniformBlock.memberUniformIndexes.size());
</span><span class="lines">@@ -1096,31 +1437,31 @@
</span><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">       case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
</span><del>-        *params = static_cast&lt;GLint&gt;(uniformBlock.isReferencedByVertexShader());
</del><ins>+          *params = static_cast&lt;GLint&gt;(uniformBlock.vertexStaticUse);
</ins><span class="cx">         break;
</span><span class="cx">       case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
</span><del>-        *params = static_cast&lt;GLint&gt;(uniformBlock.isReferencedByFragmentShader());
</del><ins>+          *params = static_cast&lt;GLint&gt;(uniformBlock.fragmentStaticUse);
</ins><span class="cx">         break;
</span><span class="cx">       default: UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLint Program::getActiveUniformBlockMaxLength()
</del><ins>+GLint Program::getActiveUniformBlockMaxLength() const
</ins><span class="cx"> {
</span><span class="cx">     int maxLength = 0;
</span><span class="cx"> 
</span><span class="cx">     if (mLinked)
</span><span class="cx">     {
</span><del>-        unsigned int numUniformBlocks = static_cast&lt;unsigned int&gt;(mProgram-&gt;getUniformBlocks().size());
</del><ins>+        unsigned int numUniformBlocks = static_cast&lt;unsigned int&gt;(mData.mUniformBlocks.size());
</ins><span class="cx">         for (unsigned int uniformBlockIndex = 0; uniformBlockIndex &lt; numUniformBlocks; uniformBlockIndex++)
</span><span class="cx">         {
</span><del>-            const UniformBlock &amp;uniformBlock = *mProgram-&gt;getUniformBlocks()[uniformBlockIndex];
</del><ins>+            const UniformBlock &amp;uniformBlock = mData.mUniformBlocks[uniformBlockIndex];
</ins><span class="cx">             if (!uniformBlock.name.empty())
</span><span class="cx">             {
</span><del>-                const int length = static_cast&lt;int&gt;(uniformBlock.name.length() + 1);
</del><ins>+                const int length = static_cast&lt;int&gt;(uniformBlock.name.length()) + 1;
</ins><span class="cx"> 
</span><span class="cx">                 // Counting in &quot;[0]&quot;.
</span><del>-                const int arrayLength = (uniformBlock.isArrayElement() ? 3 : 0);
</del><ins>+                const int arrayLength = (uniformBlock.isArray ? 3 : 0);
</ins><span class="cx"> 
</span><span class="cx">                 maxLength = std::max(length + arrayLength, maxLength);
</span><span class="cx">             }
</span><span class="lines">@@ -1130,51 +1471,73 @@
</span><span class="cx">     return maxLength;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLuint Program::getUniformBlockIndex(const std::string &amp;name)
</del><ins>+GLuint Program::getUniformBlockIndex(const std::string &amp;name) const
</ins><span class="cx"> {
</span><del>-    return mProgram-&gt;getUniformBlockIndex(name);
</del><ins>+    size_t subscript     = GL_INVALID_INDEX;
+    std::string baseName = gl::ParseUniformName(name, &amp;subscript);
+
+    unsigned int numUniformBlocks = static_cast&lt;unsigned int&gt;(mData.mUniformBlocks.size());
+    for (unsigned int blockIndex = 0; blockIndex &lt; numUniformBlocks; blockIndex++)
+    {
+        const gl::UniformBlock &amp;uniformBlock = mData.mUniformBlocks[blockIndex];
+        if (uniformBlock.name == baseName)
+        {
+            const bool arrayElementZero =
+                (subscript == GL_INVALID_INDEX &amp;&amp;
+                 (!uniformBlock.isArray || uniformBlock.arrayElement == 0));
+            if (subscript == uniformBlock.arrayElement || arrayElementZero)
+            {
+                return blockIndex;
+            }
+        }
+    }
+
+    return GL_INVALID_INDEX;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const UniformBlock *Program::getUniformBlockByIndex(GLuint index) const
</del><ins>+const UniformBlock &amp;Program::getUniformBlockByIndex(GLuint index) const
</ins><span class="cx"> {
</span><del>-    return mProgram-&gt;getUniformBlockByIndex(index);
</del><ins>+    ASSERT(index &lt; static_cast&lt;GLuint&gt;(mData.mUniformBlocks.size()));
+    return mData.mUniformBlocks[index];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
</span><span class="cx"> {
</span><del>-    mUniformBlockBindings[uniformBlockIndex] = uniformBlockBinding;
</del><ins>+    mData.mUniformBlockBindings[uniformBlockIndex] = uniformBlockBinding;
+    mProgram-&gt;setUniformBlockBinding(uniformBlockIndex, uniformBlockBinding);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLuint Program::getUniformBlockBinding(GLuint uniformBlockIndex) const
</span><span class="cx"> {
</span><del>-    return mUniformBlockBindings[uniformBlockIndex];
</del><ins>+    return mData.getUniformBlockBinding(uniformBlockIndex);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::resetUniformBlockBindings()
</span><span class="cx"> {
</span><span class="cx">     for (unsigned int blockId = 0; blockId &lt; IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS; blockId++)
</span><span class="cx">     {
</span><del>-        mUniformBlockBindings[blockId] = 0;
</del><ins>+        mData.mUniformBlockBindings[blockId] = 0;
</ins><span class="cx">     }
</span><ins>+    mData.mActiveUniformBlockBindings.reset();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::setTransformFeedbackVaryings(GLsizei count, const GLchar *const *varyings, GLenum bufferMode)
</span><span class="cx"> {
</span><del>-    mTransformFeedbackVaryings.resize(count);
</del><ins>+    mData.mTransformFeedbackVaryingNames.resize(count);
</ins><span class="cx">     for (GLsizei i = 0; i &lt; count; i++)
</span><span class="cx">     {
</span><del>-        mTransformFeedbackVaryings[i] = varyings[i];
</del><ins>+        mData.mTransformFeedbackVaryingNames[i] = varyings[i];
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mTransformFeedbackBufferMode = bufferMode;
</del><ins>+    mData.mTransformFeedbackBufferMode = bufferMode;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Program::getTransformFeedbackVarying(GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) const
</span><span class="cx"> {
</span><span class="cx">     if (mLinked)
</span><span class="cx">     {
</span><del>-        ASSERT(index &lt; mProgram-&gt;getTransformFeedbackLinkedVaryings().size());
-        const LinkedVarying &amp;varying = mProgram-&gt;getTransformFeedbackLinkedVaryings()[index];
</del><ins>+        ASSERT(index &lt; mData.mTransformFeedbackVaryingVars.size());
+        const sh::Varying &amp;varying = mData.mTransformFeedbackVaryingVars[index];
</ins><span class="cx">         GLsizei lastNameIdx = std::min(bufSize - 1, static_cast&lt;GLsizei&gt;(varying.name.length()));
</span><span class="cx">         if (length)
</span><span class="cx">         {
</span><span class="lines">@@ -1182,7 +1545,7 @@
</span><span class="cx">         }
</span><span class="cx">         if (size)
</span><span class="cx">         {
</span><del>-            *size = varying.size;
</del><ins>+            *size = varying.elementCount();
</ins><span class="cx">         }
</span><span class="cx">         if (type)
</span><span class="cx">         {
</span><span class="lines">@@ -1200,7 +1563,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (mLinked)
</span><span class="cx">     {
</span><del>-        return static_cast&lt;GLsizei&gt;(mProgram-&gt;getTransformFeedbackLinkedVaryings().size());
</del><ins>+        return static_cast&lt;GLsizei&gt;(mData.mTransformFeedbackVaryingVars.size());
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -1213,9 +1576,8 @@
</span><span class="cx">     if (mLinked)
</span><span class="cx">     {
</span><span class="cx">         GLsizei maxSize = 0;
</span><del>-        for (size_t i = 0; i &lt; mProgram-&gt;getTransformFeedbackLinkedVaryings().size(); i++)
</del><ins>+        for (const sh::Varying &amp;varying : mData.mTransformFeedbackVaryingVars)
</ins><span class="cx">         {
</span><del>-            const LinkedVarying &amp;varying = mProgram-&gt;getTransformFeedbackLinkedVaryings()[i];
</del><span class="cx">             maxSize = std::max(maxSize, static_cast&lt;GLsizei&gt;(varying.name.length() + 1));
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1229,64 +1591,123 @@
</span><span class="cx"> 
</span><span class="cx"> GLenum Program::getTransformFeedbackBufferMode() const
</span><span class="cx"> {
</span><del>-    return mTransformFeedbackBufferMode;
</del><ins>+    return mData.mTransformFeedbackBufferMode;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Program::linkVaryings(InfoLog &amp;infoLog, Shader *fragmentShader, Shader *vertexShader)
</del><ins>+// static
+bool Program::linkVaryings(InfoLog &amp;infoLog,
+                           const Shader *vertexShader,
+                           const Shader *fragmentShader)
</ins><span class="cx"> {
</span><del>-    std::vector&lt;PackedVarying&gt; &amp;fragmentVaryings = fragmentShader-&gt;getVaryings();
-    std::vector&lt;PackedVarying&gt; &amp;vertexVaryings = vertexShader-&gt;getVaryings();
</del><ins>+    const std::vector&lt;sh::Varying&gt; &amp;vertexVaryings   = vertexShader-&gt;getVaryings();
+    const std::vector&lt;sh::Varying&gt; &amp;fragmentVaryings = fragmentShader-&gt;getVaryings();
</ins><span class="cx"> 
</span><del>-    for (size_t fragVaryingIndex = 0; fragVaryingIndex &lt; fragmentVaryings.size(); fragVaryingIndex++)
</del><ins>+    for (const sh::Varying &amp;output : fragmentVaryings)
</ins><span class="cx">     {
</span><del>-        PackedVarying *input = &amp;fragmentVaryings[fragVaryingIndex];
</del><span class="cx">         bool matched = false;
</span><span class="cx"> 
</span><span class="cx">         // Built-in varyings obey special rules
</span><del>-        if (input-&gt;isBuiltIn())
</del><ins>+        if (output.isBuiltIn())
</ins><span class="cx">         {
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        for (size_t vertVaryingIndex = 0; vertVaryingIndex &lt; vertexVaryings.size(); vertVaryingIndex++)
</del><ins>+        for (const sh::Varying &amp;input : vertexVaryings)
</ins><span class="cx">         {
</span><del>-            PackedVarying *output = &amp;vertexVaryings[vertVaryingIndex];
-            if (output-&gt;name == input-&gt;name)
</del><ins>+            if (output.name == input.name)
</ins><span class="cx">             {
</span><del>-                if (!linkValidateVaryings(infoLog, output-&gt;name, *input, *output))
</del><ins>+                ASSERT(!input.isBuiltIn());
+                if (!linkValidateVaryings(infoLog, output.name, input, output))
</ins><span class="cx">                 {
</span><span class="cx">                     return false;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                output-&gt;registerIndex = input-&gt;registerIndex;
-                output-&gt;columnIndex = input-&gt;columnIndex;
-
</del><span class="cx">                 matched = true;
</span><span class="cx">                 break;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // We permit unmatched, unreferenced varyings
</span><del>-        if (!matched &amp;&amp; input-&gt;staticUse)
</del><ins>+        if (!matched &amp;&amp; output.staticUse)
</ins><span class="cx">         {
</span><del>-            infoLog.append(&quot;Fragment varying %s does not match any vertex varying&quot;, input-&gt;name.c_str());
</del><ins>+            infoLog &lt;&lt; &quot;Fragment varying &quot; &lt;&lt; output.name &lt;&lt; &quot; does not match any vertex varying&quot;;
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // TODO(jmadill): verify no unmatched vertex varyings?
+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Program::linkUniforms(gl::InfoLog &amp;infoLog, const gl::Caps &amp;caps)
+{
+    const std::vector&lt;sh::Uniform&gt; &amp;vertexUniforms   = mData.mAttachedVertexShader-&gt;getUniforms();
+    const std::vector&lt;sh::Uniform&gt; &amp;fragmentUniforms = mData.mAttachedFragmentShader-&gt;getUniforms();
+
+    // Check that uniforms defined in the vertex and fragment shaders are identical
+    std::map&lt;std::string, LinkedUniform&gt; linkedUniforms;
+
+    for (const sh::Uniform &amp;vertexUniform : vertexUniforms)
+    {
+        linkedUniforms[vertexUniform.name] = LinkedUniform(vertexUniform);
+    }
+
+    for (const sh::Uniform &amp;fragmentUniform : fragmentUniforms)
+    {
+        auto entry = linkedUniforms.find(fragmentUniform.name);
+        if (entry != linkedUniforms.end())
+        {
+            LinkedUniform *vertexUniform   = &amp;entry-&gt;second;
+            const std::string &amp;uniformName = &quot;uniform '&quot; + vertexUniform-&gt;name + &quot;'&quot;;
+            if (!linkValidateUniforms(infoLog, uniformName, *vertexUniform, fragmentUniform))
+            {
+                return false;
+            }
+        }
+    }
+
+    // Flatten the uniforms list (nested fields) into a simple list (no nesting).
+    // Also check the maximum uniform vector and sampler counts.
+    if (!flattenUniformsAndCheckCaps(caps, infoLog))
+    {
+        return false;
+    }
+
+    indexUniforms();
+
+    return true;
+}
+
+void Program::indexUniforms()
+{
+    for (size_t uniformIndex = 0; uniformIndex &lt; mData.mUniforms.size(); uniformIndex++)
+    {
+        const gl::LinkedUniform &amp;uniform = mData.mUniforms[uniformIndex];
+
+        for (unsigned int arrayIndex = 0; arrayIndex &lt; uniform.elementCount(); arrayIndex++)
+        {
+            if (!uniform.isBuiltIn())
+            {
+                // Assign in-order uniform locations
+                mData.mUniformLocations.push_back(gl::VariableLocation(
+                    uniform.name, arrayIndex, static_cast&lt;unsigned int&gt;(uniformIndex)));
+            }
+        }
+    }
+}
+
</ins><span class="cx"> bool Program::linkValidateInterfaceBlockFields(InfoLog &amp;infoLog, const std::string &amp;uniformName, const sh::InterfaceBlockField &amp;vertexUniform, const sh::InterfaceBlockField &amp;fragmentUniform)
</span><span class="cx"> {
</span><del>-    if (!linkValidateVariablesBase(infoLog, uniformName, vertexUniform, fragmentUniform, true))
</del><ins>+    // We don't validate precision on UBO fields. See resolution of Khronos bug 10287.
+    if (!linkValidateVariablesBase(infoLog, uniformName, vertexUniform, fragmentUniform, false))
</ins><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (vertexUniform.isRowMajorLayout != fragmentUniform.isRowMajorLayout)
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Matrix packings for %s differ between vertex and fragment shaders&quot;, uniformName.c_str());
</del><ins>+        infoLog &lt;&lt; &quot;Matrix packings for &quot; &lt;&lt; uniformName &lt;&lt; &quot; differ between vertex and fragment shaders&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1294,155 +1715,168 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Determines the mapping between GL attributes and Direct3D 9 vertex stream usage indices
</span><del>-bool Program::linkAttributes(const Data &amp;data,
</del><ins>+bool Program::linkAttributes(const gl::Data &amp;data,
</ins><span class="cx">                              InfoLog &amp;infoLog,
</span><span class="cx">                              const AttributeBindings &amp;attributeBindings,
</span><span class="cx">                              const Shader *vertexShader)
</span><span class="cx"> {
</span><span class="cx">     unsigned int usedLocations = 0;
</span><del>-    const std::vector&lt;sh::Attribute&gt; &amp;shaderAttributes = vertexShader-&gt;getActiveAttributes();
</del><ins>+    mData.mAttributes          = vertexShader-&gt;getActiveAttributes();
</ins><span class="cx">     GLuint maxAttribs = data.caps-&gt;maxVertexAttributes;
</span><span class="cx"> 
</span><span class="cx">     // TODO(jmadill): handle aliasing robustly
</span><del>-    if (shaderAttributes.size() &gt;= maxAttribs)
</del><ins>+    if (mData.mAttributes.size() &gt; maxAttribs)
</ins><span class="cx">     {
</span><del>-        infoLog.append(&quot;Too many vertex attributes.&quot;);
</del><ins>+        infoLog &lt;&lt; &quot;Too many vertex attributes.&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    std::vector&lt;sh::Attribute *&gt; usedAttribMap(data.caps-&gt;maxVertexAttributes, nullptr);
+
</ins><span class="cx">     // Link attributes that have a binding location
</span><del>-    for (unsigned int attributeIndex = 0; attributeIndex &lt; shaderAttributes.size(); attributeIndex++)
</del><ins>+    for (sh::Attribute &amp;attribute : mData.mAttributes)
</ins><span class="cx">     {
</span><del>-        const sh::Attribute &amp;attribute = shaderAttributes[attributeIndex];
-
</del><ins>+        // TODO(jmadill): do staticUse filtering step here, or not at all
</ins><span class="cx">         ASSERT(attribute.staticUse);
</span><span class="cx"> 
</span><del>-        const int location = attribute.location == -1 ? attributeBindings.getAttributeBinding(attribute.name) : attribute.location;
</del><ins>+        int bindingLocation = attributeBindings.getAttributeBinding(attribute.name);
+        if (attribute.location == -1 &amp;&amp; bindingLocation != -1)
+        {
+            attribute.location = bindingLocation;
+        }
</ins><span class="cx"> 
</span><del>-        mProgram-&gt;setShaderAttribute(attributeIndex, attribute);
-
-        if (location != -1)   // Set by glBindAttribLocation or by location layout qualifier
</del><ins>+        if (attribute.location != -1)
</ins><span class="cx">         {
</span><del>-            const int rows = VariableRegisterCount(attribute.type);
</del><ins>+            // Location is set by glBindAttribLocation or by location layout qualifier
+            const int regs = VariableRegisterCount(attribute.type);
</ins><span class="cx"> 
</span><del>-            if (static_cast&lt;GLuint&gt;(rows + location) &gt; maxAttribs)
</del><ins>+            if (static_cast&lt;GLuint&gt;(regs + attribute.location) &gt; maxAttribs)
</ins><span class="cx">             {
</span><del>-                infoLog.append(&quot;Active attribute (%s) at location %d is too big to fit&quot;, attribute.name.c_str(), location);
</del><ins>+                infoLog &lt;&lt; &quot;Active attribute (&quot; &lt;&lt; attribute.name &lt;&lt; &quot;) at location &quot;
+                        &lt;&lt; attribute.location &lt;&lt; &quot; is too big to fit&quot;;
</ins><span class="cx"> 
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            for (int row = 0; row &lt; rows; row++)
</del><ins>+            for (int reg = 0; reg &lt; regs; reg++)
</ins><span class="cx">             {
</span><del>-                const int rowLocation = location + row;
-                sh::ShaderVariable &amp;linkedAttribute = mLinkedAttribute[rowLocation];
</del><ins>+                const int regLocation               = attribute.location + reg;
+                sh::ShaderVariable *linkedAttribute = usedAttribMap[regLocation];
</ins><span class="cx"> 
</span><span class="cx">                 // In GLSL 3.00, attribute aliasing produces a link error
</span><span class="cx">                 // In GLSL 1.00, attribute aliasing is allowed, but ANGLE currently has a bug
</span><del>-                // TODO(jmadill): fix aliasing on ES2
-                // if (mProgram-&gt;getShaderVersion() &gt;= 300)
</del><ins>+                if (linkedAttribute)
</ins><span class="cx">                 {
</span><del>-                    if (!linkedAttribute.name.empty())
</del><ins>+                    // TODO(jmadill): fix aliasing on ES2
+                    // if (mProgram-&gt;getShaderVersion() &gt;= 300)
</ins><span class="cx">                     {
</span><del>-                        infoLog.append(&quot;Attribute '%s' aliases attribute '%s' at location %d&quot;, attribute.name.c_str(), linkedAttribute.name.c_str(), rowLocation);
</del><ins>+                        infoLog &lt;&lt; &quot;Attribute '&quot; &lt;&lt; attribute.name &lt;&lt; &quot;' aliases attribute '&quot;
+                                &lt;&lt; linkedAttribute-&gt;name &lt;&lt; &quot;' at location &quot; &lt;&lt; regLocation;
</ins><span class="cx">                         return false;
</span><span class="cx">                     }
</span><span class="cx">                 }
</span><ins>+                else
+                {
+                    usedAttribMap[regLocation] = &amp;attribute;
+                }
</ins><span class="cx"> 
</span><del>-                linkedAttribute = attribute;
-                usedLocations |= 1 &lt;&lt; rowLocation;
</del><ins>+                usedLocations |= 1 &lt;&lt; regLocation;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Link attributes that don't have a binding location
</span><del>-    for (unsigned int attributeIndex = 0; attributeIndex &lt; shaderAttributes.size(); attributeIndex++)
</del><ins>+    for (sh::Attribute &amp;attribute : mData.mAttributes)
</ins><span class="cx">     {
</span><del>-        const sh::Attribute &amp;attribute = shaderAttributes[attributeIndex];
-
</del><span class="cx">         ASSERT(attribute.staticUse);
</span><span class="cx"> 
</span><del>-        const int location = attribute.location == -1 ? attributeBindings.getAttributeBinding(attribute.name) : attribute.location;
-
-        if (location == -1)   // Not set by glBindAttribLocation or by location layout qualifier
</del><ins>+        // Not set by glBindAttribLocation or by location layout qualifier
+        if (attribute.location == -1)
</ins><span class="cx">         {
</span><del>-            int rows = VariableRegisterCount(attribute.type);
-            int availableIndex = AllocateFirstFreeBits(&amp;usedLocations, rows, maxAttribs);
</del><ins>+            int regs           = VariableRegisterCount(attribute.type);
+            int availableIndex = AllocateFirstFreeBits(&amp;usedLocations, regs, maxAttribs);
</ins><span class="cx"> 
</span><del>-            if (availableIndex == -1 || static_cast&lt;GLuint&gt;(availableIndex + rows) &gt; maxAttribs)
</del><ins>+            if (availableIndex == -1 || static_cast&lt;GLuint&gt;(availableIndex + regs) &gt; maxAttribs)
</ins><span class="cx">             {
</span><del>-                infoLog.append(&quot;Too many active attributes (%s)&quot;, attribute.name.c_str());
-
-                return false;   // Fail to link
</del><ins>+                infoLog &lt;&lt; &quot;Too many active attributes (&quot; &lt;&lt; attribute.name &lt;&lt; &quot;)&quot;;
+                return false;
</ins><span class="cx">             }
</span><span class="cx"> 
</span><del>-            mLinkedAttribute[availableIndex] = attribute;
</del><ins>+            attribute.location = availableIndex;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (GLuint attributeIndex = 0; attributeIndex &lt; maxAttribs;)
</del><ins>+    for (const sh::Attribute &amp;attribute : mData.mAttributes)
</ins><span class="cx">     {
</span><del>-        int index = vertexShader-&gt;getSemanticIndex(mLinkedAttribute[attributeIndex].name);
-        int rows = VariableRegisterCount(mLinkedAttribute[attributeIndex].type);
</del><ins>+        ASSERT(attribute.staticUse);
+        ASSERT(attribute.location != -1);
+        int regs = VariableRegisterCount(attribute.type);
</ins><span class="cx"> 
</span><del>-        for (int r = 0; r &lt; rows; r++)
</del><ins>+        for (int r = 0; r &lt; regs; r++)
</ins><span class="cx">         {
</span><del>-            mProgram-&gt;getSemanticIndexes()[attributeIndex++] = index++;
</del><ins>+            mData.mActiveAttribLocationsMask.set(attribute.location + r);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Program::linkUniformBlocks(InfoLog &amp;infoLog, const Shader &amp;vertexShader, const Shader &amp;fragmentShader, const Caps &amp;caps)
</del><ins>+bool Program::linkUniformBlocks(InfoLog &amp;infoLog, const Caps &amp;caps)
</ins><span class="cx"> {
</span><ins>+    const Shader &amp;vertexShader   = *mData.mAttachedVertexShader;
+    const Shader &amp;fragmentShader = *mData.mAttachedFragmentShader;
+
</ins><span class="cx">     const std::vector&lt;sh::InterfaceBlock&gt; &amp;vertexInterfaceBlocks = vertexShader.getInterfaceBlocks();
</span><span class="cx">     const std::vector&lt;sh::InterfaceBlock&gt; &amp;fragmentInterfaceBlocks = fragmentShader.getInterfaceBlocks();
</span><ins>+
</ins><span class="cx">     // Check that interface blocks defined in the vertex and fragment shaders are identical
</span><span class="cx">     typedef std::map&lt;std::string, const sh::InterfaceBlock*&gt; UniformBlockMap;
</span><span class="cx">     UniformBlockMap linkedUniformBlocks;
</span><del>-    for (unsigned int blockIndex = 0; blockIndex &lt; vertexInterfaceBlocks.size(); blockIndex++)
</del><ins>+
+    GLuint vertexBlockCount = 0;
+    for (const sh::InterfaceBlock &amp;vertexInterfaceBlock : vertexInterfaceBlocks)
</ins><span class="cx">     {
</span><del>-        const sh::InterfaceBlock &amp;vertexInterfaceBlock = vertexInterfaceBlocks[blockIndex];
</del><span class="cx">         linkedUniformBlocks[vertexInterfaceBlock.name] = &amp;vertexInterfaceBlock;
</span><del>-    }
-    for (unsigned int blockIndex = 0; blockIndex &lt; fragmentInterfaceBlocks.size(); blockIndex++)
-    {
-        const sh::InterfaceBlock &amp;fragmentInterfaceBlock = fragmentInterfaceBlocks[blockIndex];
-        UniformBlockMap::const_iterator entry = linkedUniformBlocks.find(fragmentInterfaceBlock.name);
-        if (entry != linkedUniformBlocks.end())
</del><ins>+
+        // Note: shared and std140 layouts are always considered active
+        if (vertexInterfaceBlock.staticUse || vertexInterfaceBlock.layout != sh::BLOCKLAYOUT_PACKED)
</ins><span class="cx">         {
</span><del>-            const sh::InterfaceBlock &amp;vertexInterfaceBlock = *entry-&gt;second;
-            if (!areMatchingInterfaceBlocks(infoLog, vertexInterfaceBlock, fragmentInterfaceBlock))
</del><ins>+            if (++vertexBlockCount &gt; caps.maxVertexUniformBlocks)
</ins><span class="cx">             {
</span><ins>+                infoLog &lt;&lt; &quot;Vertex shader uniform block count exceed GL_MAX_VERTEX_UNIFORM_BLOCKS (&quot;
+                        &lt;&lt; caps.maxVertexUniformBlocks &lt;&lt; &quot;)&quot;;
</ins><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    for (unsigned int blockIndex = 0; blockIndex &lt; vertexInterfaceBlocks.size(); blockIndex++)
</del><ins>+
+    GLuint fragmentBlockCount = 0;
+    for (const sh::InterfaceBlock &amp;fragmentInterfaceBlock : fragmentInterfaceBlocks)
</ins><span class="cx">     {
</span><del>-        const sh::InterfaceBlock &amp;interfaceBlock = vertexInterfaceBlocks[blockIndex];
-        // Note: shared and std140 layouts are always considered active
-        if (interfaceBlock.staticUse || interfaceBlock.layout != sh::BLOCKLAYOUT_PACKED)
</del><ins>+        auto entry = linkedUniformBlocks.find(fragmentInterfaceBlock.name);
+        if (entry != linkedUniformBlocks.end())
</ins><span class="cx">         {
</span><del>-            if (!mProgram-&gt;defineUniformBlock(infoLog, vertexShader, interfaceBlock, caps))
</del><ins>+            const sh::InterfaceBlock &amp;vertexInterfaceBlock = *entry-&gt;second;
+            if (!areMatchingInterfaceBlocks(infoLog, vertexInterfaceBlock, fragmentInterfaceBlock))
</ins><span class="cx">             {
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx">         }
</span><del>-    }
-    for (unsigned int blockIndex = 0; blockIndex &lt; fragmentInterfaceBlocks.size(); blockIndex++)
-    {
-        const sh::InterfaceBlock &amp;interfaceBlock = fragmentInterfaceBlocks[blockIndex];
</del><ins>+
</ins><span class="cx">         // Note: shared and std140 layouts are always considered active
</span><del>-        if (interfaceBlock.staticUse || interfaceBlock.layout != sh::BLOCKLAYOUT_PACKED)
</del><ins>+        if (fragmentInterfaceBlock.staticUse ||
+            fragmentInterfaceBlock.layout != sh::BLOCKLAYOUT_PACKED)
</ins><span class="cx">         {
</span><del>-            if (!mProgram-&gt;defineUniformBlock(infoLog, fragmentShader, interfaceBlock, caps))
</del><ins>+            if (++fragmentBlockCount &gt; caps.maxFragmentUniformBlocks)
</ins><span class="cx">             {
</span><ins>+                infoLog
+                    &lt;&lt; &quot;Fragment shader uniform block count exceed GL_MAX_FRAGMENT_UNIFORM_BLOCKS (&quot;
+                    &lt;&lt; caps.maxFragmentUniformBlocks &lt;&lt; &quot;)&quot;;
</ins><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1453,28 +1887,34 @@
</span><span class="cx">     // validate blocks for the same member types
</span><span class="cx">     if (vertexInterfaceBlock.fields.size() != fragmentInterfaceBlock.fields.size())
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Types for interface block '%s' differ between vertex and fragment shaders&quot;, blockName);
</del><ins>+        infoLog &lt;&lt; &quot;Types for interface block '&quot; &lt;&lt; blockName
+                &lt;&lt; &quot;' differ between vertex and fragment shaders&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx">     if (vertexInterfaceBlock.arraySize != fragmentInterfaceBlock.arraySize)
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Array sizes differ for interface block '%s' between vertex and fragment shaders&quot;, blockName);
</del><ins>+        infoLog &lt;&lt; &quot;Array sizes differ for interface block '&quot; &lt;&lt; blockName
+                &lt;&lt; &quot;' between vertex and fragment shaders&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx">     if (vertexInterfaceBlock.layout != fragmentInterfaceBlock.layout || vertexInterfaceBlock.isRowMajorLayout != fragmentInterfaceBlock.isRowMajorLayout)
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Layout qualifiers differ for interface block '%s' between vertex and fragment shaders&quot;, blockName);
</del><ins>+        infoLog &lt;&lt; &quot;Layout qualifiers differ for interface block '&quot; &lt;&lt; blockName
+                &lt;&lt; &quot;' between vertex and fragment shaders&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><del>-    const unsigned int numBlockMembers = static_cast&lt;unsigned int&gt;(vertexInterfaceBlock.fields.size());
</del><ins>+    const unsigned int numBlockMembers =
+        static_cast&lt;unsigned int&gt;(vertexInterfaceBlock.fields.size());
</ins><span class="cx">     for (unsigned int blockMemberIndex = 0; blockMemberIndex &lt; numBlockMembers; blockMemberIndex++)
</span><span class="cx">     {
</span><span class="cx">         const sh::InterfaceBlockField &amp;vertexMember = vertexInterfaceBlock.fields[blockMemberIndex];
</span><span class="cx">         const sh::InterfaceBlockField &amp;fragmentMember = fragmentInterfaceBlock.fields[blockMemberIndex];
</span><span class="cx">         if (vertexMember.name != fragmentMember.name)
</span><span class="cx">         {
</span><del>-            infoLog.append(&quot;Name mismatch for field %d of interface block '%s': (in vertex: '%s', in fragment: '%s')&quot;,
-                           blockMemberIndex, blockName, vertexMember.name.c_str(), fragmentMember.name.c_str());
</del><ins>+            infoLog &lt;&lt; &quot;Name mismatch for field &quot; &lt;&lt; blockMemberIndex
+                    &lt;&lt; &quot; of interface block '&quot; &lt;&lt; blockName
+                    &lt;&lt; &quot;': (in vertex: '&quot; &lt;&lt; vertexMember.name
+                    &lt;&lt; &quot;', in fragment: '&quot; &lt;&lt; fragmentMember.name &lt;&lt; &quot;')&quot;;
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx">         std::string memberName = &quot;interface block '&quot; + vertexInterfaceBlock.name + &quot;' member '&quot; + vertexMember.name + &quot;'&quot;;
</span><span class="lines">@@ -1491,23 +1931,23 @@
</span><span class="cx"> {
</span><span class="cx">     if (vertexVariable.type != fragmentVariable.type)
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Types for %s differ between vertex and fragment shaders&quot;, variableName.c_str());
</del><ins>+        infoLog &lt;&lt; &quot;Types for &quot; &lt;&lt; variableName &lt;&lt; &quot; differ between vertex and fragment shaders&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx">     if (vertexVariable.arraySize != fragmentVariable.arraySize)
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Array sizes for %s differ between vertex and fragment shaders&quot;, variableName.c_str());
</del><ins>+        infoLog &lt;&lt; &quot;Array sizes for &quot; &lt;&lt; variableName &lt;&lt; &quot; differ between vertex and fragment shaders&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx">     if (validatePrecision &amp;&amp; vertexVariable.precision != fragmentVariable.precision)
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Precisions for %s differ between vertex and fragment shaders&quot;, variableName.c_str());
</del><ins>+        infoLog &lt;&lt; &quot;Precisions for &quot; &lt;&lt; variableName &lt;&lt; &quot; differ between vertex and fragment shaders&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (vertexVariable.fields.size() != fragmentVariable.fields.size())
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Structure lengths for %s differ between vertex and fragment shaders&quot;, variableName.c_str());
</del><ins>+        infoLog &lt;&lt; &quot;Structure lengths for &quot; &lt;&lt; variableName &lt;&lt; &quot; differ between vertex and fragment shaders&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx">     const unsigned int numMembers = static_cast&lt;unsigned int&gt;(vertexVariable.fields.size());
</span><span class="lines">@@ -1518,9 +1958,10 @@
</span><span class="cx"> 
</span><span class="cx">         if (vertexMember.name != fragmentMember.name)
</span><span class="cx">         {
</span><del>-            infoLog.append(&quot;Name mismatch for field '%d' of %s: (in vertex: '%s', in fragment: '%s')&quot;,
-                           memberIndex, variableName.c_str(),
-                           vertexMember.name.c_str(), fragmentMember.name.c_str());
</del><ins>+            infoLog &lt;&lt; &quot;Name mismatch for field '&quot; &lt;&lt; memberIndex
+                    &lt;&lt; &quot;' of &quot; &lt;&lt; variableName
+                    &lt;&lt; &quot;: (in vertex: '&quot; &lt;&lt; vertexMember.name
+                    &lt;&lt; &quot;', in fragment: '&quot; &lt;&lt; fragmentMember.name &lt;&lt; &quot;')&quot;;
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1538,7 +1979,13 @@
</span><span class="cx"> 
</span><span class="cx"> bool Program::linkValidateUniforms(InfoLog &amp;infoLog, const std::string &amp;uniformName, const sh::Uniform &amp;vertexUniform, const sh::Uniform &amp;fragmentUniform)
</span><span class="cx"> {
</span><del>-    if (!linkValidateVariablesBase(infoLog, uniformName, vertexUniform, fragmentUniform, true))
</del><ins>+#if ANGLE_PROGRAM_LINK_VALIDATE_UNIFORM_PRECISION == ANGLE_ENABLED
+    const bool validatePrecision = true;
+#else
+    const bool validatePrecision = false;
+#endif
+
+    if (!linkValidateVariablesBase(infoLog, uniformName, vertexUniform, fragmentUniform, validatePrecision))
</ins><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -1555,68 +2002,530 @@
</span><span class="cx"> 
</span><span class="cx">     if (!sh::InterpolationTypesMatch(vertexVarying.interpolation, fragmentVarying.interpolation))
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Interpolation types for %s differ between vertex and fragment shaders&quot;, varyingName.c_str());
</del><ins>+        infoLog &lt;&lt; &quot;Interpolation types for &quot; &lt;&lt; varyingName &lt;&lt; &quot; differ between vertex and fragment shaders&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Program::gatherTransformFeedbackLinkedVaryings(InfoLog &amp;infoLog, const std::vector&lt;LinkedVarying&gt; &amp;linkedVaryings,
-                                                    const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryingNames,
-                                                    GLenum transformFeedbackBufferMode,
-                                                    std::vector&lt;LinkedVarying&gt; *outTransformFeedbackLinkedVaryings,
-                                                    const Caps &amp;caps) const
</del><ins>+bool Program::linkValidateTransformFeedback(InfoLog &amp;infoLog,
+                                            const std::vector&lt;const sh::Varying *&gt; &amp;varyings,
+                                            const Caps &amp;caps) const
</ins><span class="cx"> {
</span><span class="cx">     size_t totalComponents = 0;
</span><span class="cx"> 
</span><del>-    // Gather the linked varyings that are used for transform feedback, they should all exist.
-    outTransformFeedbackLinkedVaryings-&gt;clear();
-    for (size_t i = 0; i &lt; transformFeedbackVaryingNames.size(); i++)
</del><ins>+    std::set&lt;std::string&gt; uniqueNames;
+
+    for (const std::string &amp;tfVaryingName : mData.mTransformFeedbackVaryingNames)
</ins><span class="cx">     {
</span><span class="cx">         bool found = false;
</span><del>-        for (size_t j = 0; j &lt; linkedVaryings.size(); j++)
</del><ins>+        for (const sh::Varying *varying : varyings)
</ins><span class="cx">         {
</span><del>-            if (transformFeedbackVaryingNames[i] == linkedVaryings[j].name)
</del><ins>+            if (tfVaryingName == varying-&gt;name)
</ins><span class="cx">             {
</span><del>-                for (size_t k = 0; k &lt; outTransformFeedbackLinkedVaryings-&gt;size(); k++)
</del><ins>+                if (uniqueNames.count(tfVaryingName) &gt; 0)
</ins><span class="cx">                 {
</span><del>-                    if (outTransformFeedbackLinkedVaryings-&gt;at(k).name == linkedVaryings[j].name)
-                    {
-                        infoLog.append(&quot;Two transform feedback varyings specify the same output variable (%s).&quot;, linkedVaryings[j].name.c_str());
-                        return false;
-                    }
</del><ins>+                    infoLog &lt;&lt; &quot;Two transform feedback varyings specify the same output variable (&quot;
+                            &lt;&lt; tfVaryingName &lt;&lt; &quot;).&quot;;
+                    return false;
</ins><span class="cx">                 }
</span><ins>+                uniqueNames.insert(tfVaryingName);
</ins><span class="cx"> 
</span><del>-                size_t componentCount = linkedVaryings[j].semanticIndexCount * 4;
-                if (transformFeedbackBufferMode == GL_SEPARATE_ATTRIBS &amp;&amp;
</del><ins>+                if (varying-&gt;isArray())
+                {
+                    infoLog &lt;&lt; &quot;Capture of arrays is undefined and not supported.&quot;;
+                    return false;
+                }
+
+                // TODO(jmadill): Investigate implementation limits on D3D11
+                size_t componentCount = gl::VariableComponentCount(varying-&gt;type);
+                if (mData.mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS &amp;&amp;
</ins><span class="cx">                     componentCount &gt; caps.maxTransformFeedbackSeparateComponents)
</span><span class="cx">                 {
</span><del>-                    infoLog.append(&quot;Transform feedback varying's %s components (%u) exceed the maximum separate components (%u).&quot;,
-                                   linkedVaryings[j].name.c_str(), componentCount, caps.maxTransformFeedbackSeparateComponents);
</del><ins>+                    infoLog &lt;&lt; &quot;Transform feedback varying's &quot; &lt;&lt; varying-&gt;name &lt;&lt; &quot; components (&quot;
+                            &lt;&lt; componentCount &lt;&lt; &quot;) exceed the maximum separate components (&quot;
+                            &lt;&lt; caps.maxTransformFeedbackSeparateComponents &lt;&lt; &quot;).&quot;;
</ins><span class="cx">                     return false;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 totalComponents += componentCount;
</span><del>-
-                outTransformFeedbackLinkedVaryings-&gt;push_back(linkedVaryings[j]);
</del><span class="cx">                 found = true;
</span><span class="cx">                 break;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        if (tfVaryingName.find('[') != std::string::npos)
+        {
+            infoLog &lt;&lt; &quot;Capture of array elements is undefined and not supported.&quot;;
+            return false;
+        }
+
</ins><span class="cx">         // All transform feedback varyings are expected to exist since packVaryings checks for them.
</span><span class="cx">         ASSERT(found);
</span><ins>+        UNUSED_ASSERTION_VARIABLE(found);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (transformFeedbackBufferMode == GL_INTERLEAVED_ATTRIBS &amp;&amp; totalComponents &gt; caps.maxTransformFeedbackInterleavedComponents)
</del><ins>+    if (mData.mTransformFeedbackBufferMode == GL_INTERLEAVED_ATTRIBS &amp;&amp;
+        totalComponents &gt; caps.maxTransformFeedbackInterleavedComponents)
</ins><span class="cx">     {
</span><del>-        infoLog.append(&quot;Transform feedback varying total components (%u) exceed the maximum interleaved components (%u).&quot;,
-                       totalComponents, caps.maxTransformFeedbackInterleavedComponents);
</del><ins>+        infoLog &lt;&lt; &quot;Transform feedback varying total components (&quot; &lt;&lt; totalComponents
+                &lt;&lt; &quot;) exceed the maximum interleaved components (&quot;
+                &lt;&lt; caps.maxTransformFeedbackInterleavedComponents &lt;&lt; &quot;).&quot;;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Program::gatherTransformFeedbackVaryings(const std::vector&lt;const sh::Varying *&gt; &amp;varyings)
+{
+    // Gather the linked varyings that are used for transform feedback, they should all exist.
+    mData.mTransformFeedbackVaryingVars.clear();
+    for (const std::string &amp;tfVaryingName : mData.mTransformFeedbackVaryingNames)
+    {
+        for (const sh::Varying *varying : varyings)
+        {
+            if (tfVaryingName == varying-&gt;name)
+            {
+                mData.mTransformFeedbackVaryingVars.push_back(*varying);
+                break;
+            }
+        }
+    }
</ins><span class="cx"> }
</span><ins>+
+std::vector&lt;const sh::Varying *&gt; Program::getMergedVaryings() const
+{
+    std::set&lt;std::string&gt; uniqueNames;
+    std::vector&lt;const sh::Varying *&gt; varyings;
+
+    for (const sh::Varying &amp;varying : mData.mAttachedVertexShader-&gt;getVaryings())
+    {
+        if (uniqueNames.count(varying.name) == 0)
+        {
+            uniqueNames.insert(varying.name);
+            varyings.push_back(&amp;varying);
+        }
+    }
+
+    for (const sh::Varying &amp;varying : mData.mAttachedFragmentShader-&gt;getVaryings())
+    {
+        if (uniqueNames.count(varying.name) == 0)
+        {
+            uniqueNames.insert(varying.name);
+            varyings.push_back(&amp;varying);
+        }
+    }
+
+    return varyings;
+}
+
+void Program::linkOutputVariables()
+{
+    const Shader *fragmentShader = mData.mAttachedFragmentShader;
+    ASSERT(fragmentShader != nullptr);
+
+    // Skip this step for GLES2 shaders.
+    if (fragmentShader-&gt;getShaderVersion() == 100)
+        return;
+
+    const auto &amp;shaderOutputVars = fragmentShader-&gt;getActiveOutputVariables();
+
+    // TODO(jmadill): any caps validation here?
+
+    for (unsigned int outputVariableIndex = 0; outputVariableIndex &lt; shaderOutputVars.size();
+         outputVariableIndex++)
+    {
+        const sh::OutputVariable &amp;outputVariable = shaderOutputVars[outputVariableIndex];
+
+        // Don't store outputs for gl_FragDepth, gl_FragColor, etc.
+        if (outputVariable.isBuiltIn())
+            continue;
+
+        // Since multiple output locations must be specified, use 0 for non-specified locations.
+        int baseLocation = (outputVariable.location == -1 ? 0 : outputVariable.location);
+
+        ASSERT(outputVariable.staticUse);
+
+        for (unsigned int elementIndex = 0; elementIndex &lt; outputVariable.elementCount();
+             elementIndex++)
+        {
+            const int location = baseLocation + elementIndex;
+            ASSERT(mData.mOutputVariables.count(location) == 0);
+            unsigned int element = outputVariable.isArray() ? elementIndex : GL_INVALID_INDEX;
+            mData.mOutputVariables[location] =
+                VariableLocation(outputVariable.name, element, outputVariableIndex);
+        }
+    }
+}
+
+bool Program::flattenUniformsAndCheckCaps(const Caps &amp;caps, InfoLog &amp;infoLog)
+{
+    const gl::Shader *vertexShader = mData.getAttachedVertexShader();
+    VectorAndSamplerCount vsCounts;
+
+    std::vector&lt;LinkedUniform&gt; samplerUniforms;
+
+    for (const sh::Uniform &amp;uniform : vertexShader-&gt;getUniforms())
+    {
+        if (uniform.staticUse)
+        {
+            vsCounts += flattenUniform(uniform, uniform.name, &amp;samplerUniforms);
+        }
+    }
+
+    if (vsCounts.vectorCount &gt; caps.maxVertexUniformVectors)
+    {
+        infoLog &lt;&lt; &quot;Vertex shader active uniforms exceed MAX_VERTEX_UNIFORM_VECTORS (&quot;
+                &lt;&lt; caps.maxVertexUniformVectors &lt;&lt; &quot;).&quot;;
+        return false;
+    }
+
+    if (vsCounts.samplerCount &gt; caps.maxVertexTextureImageUnits)
+    {
+        infoLog &lt;&lt; &quot;Vertex shader sampler count exceeds MAX_VERTEX_TEXTURE_IMAGE_UNITS (&quot;
+                &lt;&lt; caps.maxVertexTextureImageUnits &lt;&lt; &quot;).&quot;;
+        return false;
+    }
+
+    const gl::Shader *fragmentShader = mData.getAttachedFragmentShader();
+    VectorAndSamplerCount fsCounts;
+
+    for (const sh::Uniform &amp;uniform : fragmentShader-&gt;getUniforms())
+    {
+        if (uniform.staticUse)
+        {
+            fsCounts += flattenUniform(uniform, uniform.name, &amp;samplerUniforms);
+        }
+    }
+
+    if (fsCounts.vectorCount &gt; caps.maxFragmentUniformVectors)
+    {
+        infoLog &lt;&lt; &quot;Fragment shader active uniforms exceed MAX_FRAGMENT_UNIFORM_VECTORS (&quot;
+                &lt;&lt; caps.maxFragmentUniformVectors &lt;&lt; &quot;).&quot;;
+        return false;
+    }
+
+    if (fsCounts.samplerCount &gt; caps.maxTextureImageUnits)
+    {
+        infoLog &lt;&lt; &quot;Fragment shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (&quot;
+                &lt;&lt; caps.maxTextureImageUnits &lt;&lt; &quot;).&quot;;
+        return false;
+    }
+
+    mSamplerUniformRange.start = static_cast&lt;unsigned int&gt;(mData.mUniforms.size());
+    mSamplerUniformRange.end =
+        mSamplerUniformRange.start + static_cast&lt;unsigned int&gt;(samplerUniforms.size());
+
+    mData.mUniforms.insert(mData.mUniforms.end(), samplerUniforms.begin(), samplerUniforms.end());
+
+    return true;
+}
+
+Program::VectorAndSamplerCount Program::flattenUniform(const sh::ShaderVariable &amp;uniform,
+                                                       const std::string &amp;fullName,
+                                                       std::vector&lt;LinkedUniform&gt; *samplerUniforms)
+{
+    VectorAndSamplerCount vectorAndSamplerCount;
+
+    if (uniform.isStruct())
+    {
+        for (unsigned int elementIndex = 0; elementIndex &lt; uniform.elementCount(); elementIndex++)
+        {
+            const std::string &amp;elementString = (uniform.isArray() ? ArrayString(elementIndex) : &quot;&quot;);
+
+            for (size_t fieldIndex = 0; fieldIndex &lt; uniform.fields.size(); fieldIndex++)
+            {
+                const sh::ShaderVariable &amp;field  = uniform.fields[fieldIndex];
+                const std::string &amp;fieldFullName = (fullName + elementString + &quot;.&quot; + field.name);
+
+                vectorAndSamplerCount += flattenUniform(field, fieldFullName, samplerUniforms);
+            }
+        }
+
+        return vectorAndSamplerCount;
+    }
+
+    // Not a struct
+    bool isSampler = IsSamplerType(uniform.type);
+    if (!UniformInList(mData.getUniforms(), fullName) &amp;&amp; !UniformInList(*samplerUniforms, fullName))
+    {
+        gl::LinkedUniform linkedUniform(uniform.type, uniform.precision, fullName,
+                                        uniform.arraySize, -1,
+                                        sh::BlockMemberInfo::getDefaultBlockInfo());
+        linkedUniform.staticUse = true;
+
+        // Store sampler uniforms separately, so we'll append them to the end of the list.
+        if (isSampler)
+        {
+            samplerUniforms-&gt;push_back(linkedUniform);
+        }
+        else
+        {
+            mData.mUniforms.push_back(linkedUniform);
+        }
+    }
+
+    unsigned int elementCount          = uniform.elementCount();
+
+    // Samplers aren't &quot;real&quot; uniforms, so they don't count towards register usage.
+    // Likewise, don't count &quot;real&quot; uniforms towards sampler count.
+    vectorAndSamplerCount.vectorCount =
+        (isSampler ? 0 : (VariableRegisterCount(uniform.type) * elementCount));
+    vectorAndSamplerCount.samplerCount = (isSampler ? elementCount : 0);
+
+    return vectorAndSamplerCount;
+}
+
+void Program::gatherInterfaceBlockInfo()
+{
+    std::set&lt;std::string&gt; visitedList;
+
+    const gl::Shader *vertexShader = mData.getAttachedVertexShader();
+
+    ASSERT(mData.mUniformBlocks.empty());
+    for (const sh::InterfaceBlock &amp;vertexBlock : vertexShader-&gt;getInterfaceBlocks())
+    {
+        // Only 'packed' blocks are allowed to be considered inacive.
+        if (!vertexBlock.staticUse &amp;&amp; vertexBlock.layout == sh::BLOCKLAYOUT_PACKED)
+            continue;
+
+        if (visitedList.count(vertexBlock.name) &gt; 0)
+            continue;
+
+        defineUniformBlock(vertexBlock, GL_VERTEX_SHADER);
+        visitedList.insert(vertexBlock.name);
+    }
+
+    const gl::Shader *fragmentShader = mData.getAttachedFragmentShader();
+
+    for (const sh::InterfaceBlock &amp;fragmentBlock : fragmentShader-&gt;getInterfaceBlocks())
+    {
+        // Only 'packed' blocks are allowed to be considered inacive.
+        if (!fragmentBlock.staticUse &amp;&amp; fragmentBlock.layout == sh::BLOCKLAYOUT_PACKED)
+            continue;
+
+        if (visitedList.count(fragmentBlock.name) &gt; 0)
+        {
+            for (gl::UniformBlock &amp;block : mData.mUniformBlocks)
+            {
+                if (block.name == fragmentBlock.name)
+                {
+                    block.fragmentStaticUse = fragmentBlock.staticUse;
+                }
+            }
+
+            continue;
+        }
+
+        defineUniformBlock(fragmentBlock, GL_FRAGMENT_SHADER);
+        visitedList.insert(fragmentBlock.name);
+    }
+}
+
+template &lt;typename VarT&gt;
+void Program::defineUniformBlockMembers(const std::vector&lt;VarT&gt; &amp;fields,
+                                        const std::string &amp;prefix,
+                                        int blockIndex)
+{
+    for (const VarT &amp;field : fields)
+    {
+        const std::string &amp;fullName = (prefix.empty() ? field.name : prefix + &quot;.&quot; + field.name);
+
+        if (field.isStruct())
+        {
+            for (unsigned int arrayElement = 0; arrayElement &lt; field.elementCount(); arrayElement++)
+            {
+                const std::string uniformElementName =
+                    fullName + (field.isArray() ? ArrayString(arrayElement) : &quot;&quot;);
+                defineUniformBlockMembers(field.fields, uniformElementName, blockIndex);
+            }
+        }
+        else
+        {
+            // If getBlockMemberInfo returns false, the uniform is optimized out.
+            sh::BlockMemberInfo memberInfo;
+            if (!mProgram-&gt;getUniformBlockMemberInfo(fullName, &amp;memberInfo))
+            {
+                continue;
+            }
+
+            LinkedUniform newUniform(field.type, field.precision, fullName, field.arraySize,
+                                     blockIndex, memberInfo);
+
+            // Since block uniforms have no location, we don't need to store them in the uniform
+            // locations list.
+            mData.mUniforms.push_back(newUniform);
+        }
+    }
+}
+
+void Program::defineUniformBlock(const sh::InterfaceBlock &amp;interfaceBlock, GLenum shaderType)
+{
+    int blockIndex   = static_cast&lt;int&gt;(mData.mUniformBlocks.size());
+    size_t blockSize = 0;
+
+    // Don't define this block at all if it's not active in the implementation.
+    if (!mProgram-&gt;getUniformBlockSize(interfaceBlock.name, &amp;blockSize))
+    {
+        return;
+    }
+
+    // Track the first and last uniform index to determine the range of active uniforms in the
+    // block.
+    size_t firstBlockUniformIndex = mData.mUniforms.size();
+    defineUniformBlockMembers(interfaceBlock.fields, interfaceBlock.fieldPrefix(), blockIndex);
+    size_t lastBlockUniformIndex = mData.mUniforms.size();
+
+    std::vector&lt;unsigned int&gt; blockUniformIndexes;
+    for (size_t blockUniformIndex = firstBlockUniformIndex;
+         blockUniformIndex &lt; lastBlockUniformIndex; ++blockUniformIndex)
+    {
+        blockUniformIndexes.push_back(static_cast&lt;unsigned int&gt;(blockUniformIndex));
+    }
+
+    if (interfaceBlock.arraySize &gt; 0)
+    {
+        for (unsigned int arrayElement = 0; arrayElement &lt; interfaceBlock.arraySize; ++arrayElement)
+        {
+            UniformBlock block(interfaceBlock.name, true, arrayElement);
+            block.memberUniformIndexes = blockUniformIndexes;
+
+            if (shaderType == GL_VERTEX_SHADER)
+            {
+                block.vertexStaticUse = interfaceBlock.staticUse;
+            }
+            else
+            {
+                ASSERT(shaderType == GL_FRAGMENT_SHADER);
+                block.fragmentStaticUse = interfaceBlock.staticUse;
+            }
+
+            // TODO(jmadill): Determine if we can ever have an inactive array element block.
+            size_t blockElementSize = 0;
+            if (!mProgram-&gt;getUniformBlockSize(block.nameWithArrayIndex(), &amp;blockElementSize))
+            {
+                continue;
+            }
+
+            ASSERT(blockElementSize == blockSize);
+            block.dataSize = static_cast&lt;unsigned int&gt;(blockElementSize);
+            mData.mUniformBlocks.push_back(block);
+        }
+    }
+    else
+    {
+        UniformBlock block(interfaceBlock.name, false, 0);
+        block.memberUniformIndexes = blockUniformIndexes;
+
+        if (shaderType == GL_VERTEX_SHADER)
+        {
+            block.vertexStaticUse = interfaceBlock.staticUse;
+        }
+        else
+        {
+            ASSERT(shaderType == GL_FRAGMENT_SHADER);
+            block.fragmentStaticUse = interfaceBlock.staticUse;
+        }
+
+        block.dataSize = static_cast&lt;unsigned int&gt;(blockSize);
+        mData.mUniformBlocks.push_back(block);
+    }
+}
+
+template &lt;typename T&gt;
+void Program::setUniformInternal(GLint location, GLsizei count, const T *v)
+{
+    const VariableLocation &amp;locationInfo = mData.mUniformLocations[location];
+    LinkedUniform *linkedUniform         = &amp;mData.mUniforms[locationInfo.index];
+    uint8_t *destPointer                 = linkedUniform-&gt;getDataPtrToElement(locationInfo.element);
+
+    if (VariableComponentType(linkedUniform-&gt;type) == GL_BOOL)
+    {
+        // Do a cast conversion for boolean types. From the spec:
+        // &quot;The uniform is set to FALSE if the input value is 0 or 0.0f, and set to TRUE otherwise.&quot;
+        GLint *destAsInt = reinterpret_cast&lt;GLint *&gt;(destPointer);
+        for (GLsizei component = 0; component &lt; count; ++component)
+        {
+            destAsInt[component] = (v[component] != static_cast&lt;T&gt;(0) ? GL_TRUE : GL_FALSE);
+        }
+    }
+    else
+    {
+        // Invalide the validation cache if we modify the sampler data.
+        if (linkedUniform-&gt;isSampler() &amp;&amp; memcmp(destPointer, v, sizeof(T) * count) != 0)
+        {
+            mCachedValidateSamplersResult.reset();
+        }
+
+        memcpy(destPointer, v, sizeof(T) * count);
+    }
+}
+
+template &lt;size_t cols, size_t rows, typename T&gt;
+void Program::setMatrixUniformInternal(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const T *v)
+{
+    if (!transpose)
+    {
+        setUniformInternal(location, count * cols * rows, v);
+        return;
+    }
+
+    // Perform a transposing copy.
+    const VariableLocation &amp;locationInfo = mData.mUniformLocations[location];
+    LinkedUniform *linkedUniform         = &amp;mData.mUniforms[locationInfo.index];
+    T *destPtr = reinterpret_cast&lt;T *&gt;(linkedUniform-&gt;getDataPtrToElement(locationInfo.element));
+    for (GLsizei element = 0; element &lt; count; ++element)
+    {
+        size_t elementOffset = element * rows * cols;
+
+        for (size_t row = 0; row &lt; rows; ++row)
+        {
+            for (size_t col = 0; col &lt; cols; ++col)
+            {
+                destPtr[col * rows + row + elementOffset] = v[row * cols + col + elementOffset];
+            }
+        }
+    }
+}
+
+template &lt;typename DestT&gt;
+void Program::getUniformInternal(GLint location, DestT *dataOut) const
+{
+    const VariableLocation &amp;locationInfo = mData.mUniformLocations[location];
+    const LinkedUniform &amp;uniform         = mData.mUniforms[locationInfo.index];
+
+    const uint8_t *srcPointer = uniform.getDataPtrToElement(locationInfo.element);
+
+    GLenum componentType = VariableComponentType(uniform.type);
+    if (componentType == GLTypeToGLenum&lt;DestT&gt;::value)
+    {
+        memcpy(dataOut, srcPointer, uniform.getElementSize());
+        return;
+    }
+
+    int components = VariableComponentCount(uniform.type);
+
+    switch (componentType)
+    {
+        case GL_INT:
+            UniformStateQueryCastLoop&lt;GLint&gt;(dataOut, srcPointer, components);
+            break;
+        case GL_UNSIGNED_INT:
+            UniformStateQueryCastLoop&lt;GLuint&gt;(dataOut, srcPointer, components);
+            break;
+        case GL_BOOL:
+            UniformStateQueryCastLoop&lt;GLboolean&gt;(dataOut, srcPointer, components);
+            break;
+        case GL_FLOAT:
+            UniformStateQueryCastLoop&lt;GLfloat&gt;(dataOut, srcPointer, components);
+            break;
+        default:
+            UNREACHABLE();
+    }
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEProgramh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,27 +10,29 @@
</span><span class="cx"> #ifndef LIBANGLE_PROGRAM_H_
</span><span class="cx"> #define LIBANGLE_PROGRAM_H_
</span><span class="cx"> 
</span><del>-#include &quot;libANGLE/angletypes.h&quot;
-#include &quot;libANGLE/Constants.h&quot;
-#include &quot;libANGLE/Error.h&quot;
-#include &quot;libANGLE/RefCountObject.h&quot;
-
-#include &quot;common/angleutils.h&quot;
-
</del><span class="cx"> #include &lt;GLES2/gl2.h&gt;
</span><span class="cx"> #include &lt;GLSLANG/ShaderLang.h&gt;
</span><span class="cx"> 
</span><del>-#include &lt;vector&gt;
</del><ins>+#include &lt;set&gt;
</ins><span class="cx"> #include &lt;sstream&gt;
</span><span class="cx"> #include &lt;string&gt;
</span><del>-#include &lt;set&gt;
</del><ins>+#include &lt;vector&gt;
</ins><span class="cx"> 
</span><ins>+#include &quot;common/angleutils.h&quot;
+#include &quot;common/mathutil.h&quot;
+#include &quot;common/Optional.h&quot;
+
+#include &quot;libANGLE/angletypes.h&quot;
+#include &quot;libANGLE/Constants.h&quot;
+#include &quot;libANGLE/Debug.h&quot;
+#include &quot;libANGLE/Error.h&quot;
+#include &quot;libANGLE/RefCountObject.h&quot;
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><del>-class Renderer;
-class Renderer;
</del><ins>+class ImplFactory;
+class ProgramImpl;
</ins><span class="cx"> struct TranslatedAttribute;
</span><del>-class ProgramImpl;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="lines">@@ -68,11 +70,65 @@
</span><span class="cx">     ~InfoLog();
</span><span class="cx"> 
</span><span class="cx">     size_t getLength() const;
</span><del>-    void getLog(GLsizei bufSize, GLsizei *length, char *infoLog);
</del><ins>+    void getLog(GLsizei bufSize, GLsizei *length, char *infoLog) const;
</ins><span class="cx"> 
</span><span class="cx">     void appendSanitized(const char *message);
</span><del>-    void append(const char *info, ...);
</del><span class="cx">     void reset();
</span><ins>+
+    // This helper class ensures we append a newline after writing a line.
+    class StreamHelper : angle::NonCopyable
+    {
+      public:
+        StreamHelper(StreamHelper &amp;&amp;rhs)
+            : mStream(rhs.mStream)
+        {
+            rhs.mStream = nullptr;
+        }
+
+        StreamHelper &amp;operator=(StreamHelper &amp;&amp;rhs)
+        {
+            std::swap(mStream, rhs.mStream);
+            return *this;
+        }
+
+        ~StreamHelper()
+        {
+            // Write newline when destroyed on the stack
+            if (mStream)
+            {
+                (*mStream) &lt;&lt; std::endl;
+            }
+        }
+
+        template &lt;typename T&gt;
+        StreamHelper &amp;operator&lt;&lt;(const T &amp;value)
+        {
+            (*mStream) &lt;&lt; value;
+            return *this;
+        }
+
+      private:
+        friend class InfoLog;
+
+        StreamHelper(std::stringstream *stream)
+            : mStream(stream)
+        {
+            ASSERT(stream);
+        }
+
+        std::stringstream *mStream;
+    };
+
+    template &lt;typename T&gt;
+    StreamHelper operator&lt;&lt;(const T &amp;value)
+    {
+        StreamHelper helper(&amp;mStream);
+        helper &lt;&lt; value;
+        return helper;
+    }
+
+    std::string str() const { return mStream.str(); }
+
</ins><span class="cx">   private:
</span><span class="cx">     std::stringstream mStream;
</span><span class="cx"> };
</span><span class="lines">@@ -88,32 +144,94 @@
</span><span class="cx">     unsigned int index;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-struct LinkedVarying
</del><ins>+class Program final : angle::NonCopyable, public LabeledObject
</ins><span class="cx"> {
</span><del>-    LinkedVarying();
-    LinkedVarying(const std::string &amp;name, GLenum type, GLsizei size, const std::string &amp;semanticName,
-        unsigned int semanticIndex, unsigned int semanticIndexCount);
</del><ins>+  public:
+    class Data final : angle::NonCopyable
+    {
+      public:
+        Data();
+        ~Data();
</ins><span class="cx"> 
</span><del>-    // Original GL name
-    std::string name;
</del><ins>+        const std::string &amp;getLabel();
</ins><span class="cx"> 
</span><del>-    GLenum type;
-    GLsizei size;
</del><ins>+        const Shader *getAttachedVertexShader() const { return mAttachedVertexShader; }
+        const Shader *getAttachedFragmentShader() const { return mAttachedFragmentShader; }
+        const std::vector&lt;std::string&gt; &amp;getTransformFeedbackVaryingNames() const
+        {
+            return mTransformFeedbackVaryingNames;
+        }
+        GLint getTransformFeedbackBufferMode() const { return mTransformFeedbackBufferMode; }
+        GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const
+        {
+            ASSERT(uniformBlockIndex &lt; IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS);
+            return mUniformBlockBindings[uniformBlockIndex];
+        }
+        const UniformBlockBindingMask &amp;getActiveUniformBlockBindingsMask() const
+        {
+            return mActiveUniformBlockBindings;
+        }
+        const std::vector&lt;sh::Attribute&gt; &amp;getAttributes() const { return mAttributes; }
+        const AttributesMask &amp;getActiveAttribLocationsMask() const
+        {
+            return mActiveAttribLocationsMask;
+        }
+        const std::map&lt;int, VariableLocation&gt; &amp;getOutputVariables() const
+        {
+            return mOutputVariables;
+        }
+        const std::vector&lt;LinkedUniform&gt; &amp;getUniforms() const { return mUniforms; }
+        const std::vector&lt;VariableLocation&gt; &amp;getUniformLocations() const
+        {
+            return mUniformLocations;
+        }
+        const std::vector&lt;UniformBlock&gt; &amp;getUniformBlocks() const { return mUniformBlocks; }
</ins><span class="cx"> 
</span><del>-    // DirectX semantic information
-    std::string semanticName;
-    unsigned int semanticIndex;
-    unsigned int semanticIndexCount;
-};
</del><ins>+        const LinkedUniform *getUniformByName(const std::string &amp;name) const;
+        GLint getUniformLocation(const std::string &amp;name) const;
+        GLuint getUniformIndex(const std::string &amp;name) const;
</ins><span class="cx"> 
</span><del>-class Program : angle::NonCopyable
-{
-  public:
-    Program(rx::ProgramImpl *impl, ResourceManager *manager, GLuint handle);
</del><ins>+      private:
+        friend class Program;
+
+        std::string mLabel;
+
+        Shader *mAttachedFragmentShader;
+        Shader *mAttachedVertexShader;
+
+        std::vector&lt;std::string&gt; mTransformFeedbackVaryingNames;
+        std::vector&lt;sh::Varying&gt; mTransformFeedbackVaryingVars;
+        GLenum mTransformFeedbackBufferMode;
+
+        GLuint mUniformBlockBindings[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS];
+        UniformBlockBindingMask mActiveUniformBlockBindings;
+
+        std::vector&lt;sh::Attribute&gt; mAttributes;
+        std::bitset&lt;MAX_VERTEX_ATTRIBS&gt; mActiveAttribLocationsMask;
+
+        // Uniforms are sorted in order:
+        //  1. Non-sampler uniforms
+        //  2. Sampler uniforms
+        //  3. Uniform block uniforms
+        // This makes sampler validation easier, since we don't need a separate list.
+        std::vector&lt;LinkedUniform&gt; mUniforms;
+        std::vector&lt;VariableLocation&gt; mUniformLocations;
+        std::vector&lt;UniformBlock&gt; mUniformBlocks;
+
+        // TODO(jmadill): use unordered/hash map when available
+        std::map&lt;int, VariableLocation&gt; mOutputVariables;
+
+        bool mBinaryRetrieveableHint;
+    };
+
+    Program(rx::ImplFactory *factory, ResourceManager *manager, GLuint handle);
</ins><span class="cx">     ~Program();
</span><span class="cx"> 
</span><span class="cx">     GLuint id() const { return mHandle; }
</span><span class="cx"> 
</span><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
+
</ins><span class="cx">     rx::ProgramImpl *getImplementation() { return mProgram; }
</span><span class="cx">     const rx::ProgramImpl *getImplementation() const { return mProgram; }
</span><span class="cx"> 
</span><span class="lines">@@ -123,42 +241,43 @@
</span><span class="cx"> 
</span><span class="cx">     void bindAttributeLocation(GLuint index, const char *name);
</span><span class="cx"> 
</span><del>-    Error link(const Data &amp;data);
-    bool isLinked();
</del><ins>+    Error link(const gl::Data &amp;data);
+    bool isLinked() const;
</ins><span class="cx"> 
</span><span class="cx">     Error loadBinary(GLenum binaryFormat, const void *binary, GLsizei length);
</span><span class="cx">     Error saveBinary(GLenum *binaryFormat, void *binary, GLsizei bufSize, GLsizei *length) const;
</span><span class="cx">     GLint getBinaryLength() const;
</span><ins>+    void setBinaryRetrievableHint(bool retrievable);
+    bool getBinaryRetrievableHint() const;
</ins><span class="cx"> 
</span><span class="cx">     int getInfoLogLength() const;
</span><del>-    void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
-    void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
</del><ins>+    void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const;
+    void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders) const;
</ins><span class="cx"> 
</span><del>-    GLuint getAttributeLocation(const std::string &amp;name);
-    int getSemanticIndex(int attributeIndex);
-    const int *getSemanticIndexes() const;
</del><ins>+    GLuint getAttributeLocation(const std::string &amp;name) const;
+    bool isAttribLocationActive(size_t attribLocation) const;
</ins><span class="cx"> 
</span><span class="cx">     void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
</span><del>-    GLint getActiveAttributeCount();
-    GLint getActiveAttributeMaxLength();
</del><ins>+    GLint getActiveAttributeCount() const;
+    GLint getActiveAttributeMaxLength() const;
+    const std::vector&lt;sh::Attribute&gt; &amp;getAttributes() const { return mData.mAttributes; }
</ins><span class="cx"> 
</span><del>-    GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex, const Caps &amp;caps);
-    GLenum getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
-    GLint getUsedSamplerRange(SamplerType type);
-    bool usesPointSize() const;
-
</del><span class="cx">     GLint getFragDataLocation(const std::string &amp;name) const;
</span><span class="cx"> 
</span><del>-    void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
-    GLint getActiveUniformCount();
-    GLint getActiveUniformMaxLength();
</del><ins>+    void getActiveUniform(GLuint index,
+                          GLsizei bufsize,
+                          GLsizei *length,
+                          GLint *size,
+                          GLenum *type,
+                          GLchar *name) const;
+    GLint getActiveUniformCount() const;
+    GLint getActiveUniformMaxLength() const;
</ins><span class="cx">     GLint getActiveUniformi(GLuint index, GLenum pname) const;
</span><span class="cx">     bool isValidUniformLocation(GLint location) const;
</span><del>-    LinkedUniform *getUniformByLocation(GLint location) const;
-    LinkedUniform *getUniformByName(const std::string &amp;name) const;
</del><ins>+    const LinkedUniform &amp;getUniformByLocation(GLint location) const;
</ins><span class="cx"> 
</span><del>-    GLint getUniformLocation(const std::string &amp;name);
-    GLuint getUniformIndex(const std::string &amp;name);
</del><ins>+    GLint getUniformLocation(const std::string &amp;name) const;
+    GLuint getUniformIndex(const std::string &amp;name) const;
</ins><span class="cx">     void setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
</span><span class="cx">     void setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
</span><span class="cx">     void setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
</span><span class="lines">@@ -181,24 +300,21 @@
</span><span class="cx">     void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
</span><span class="cx">     void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
</span><span class="cx"> 
</span><del>-    void getUniformfv(GLint location, GLfloat *params);
-    void getUniformiv(GLint location, GLint *params);
-    void getUniformuiv(GLint location, GLuint *params);
</del><ins>+    void getUniformfv(GLint location, GLfloat *params) const;
+    void getUniformiv(GLint location, GLint *params) const;
+    void getUniformuiv(GLint location, GLuint *params) const;
</ins><span class="cx"> 
</span><del>-    Error applyUniforms();
-    Error applyUniformBuffers(const gl::Data &amp;data);
-
</del><span class="cx">     void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const;
</span><span class="cx">     void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const;
</span><del>-    GLuint getActiveUniformBlockCount();
-    GLint getActiveUniformBlockMaxLength();
</del><ins>+    GLuint getActiveUniformBlockCount() const;
+    GLint getActiveUniformBlockMaxLength() const;
</ins><span class="cx"> 
</span><del>-    GLuint getUniformBlockIndex(const std::string &amp;name);
</del><ins>+    GLuint getUniformBlockIndex(const std::string &amp;name) const;
</ins><span class="cx"> 
</span><span class="cx">     void bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding);
</span><span class="cx">     GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const;
</span><span class="cx"> 
</span><del>-    const UniformBlock *getUniformBlockByIndex(GLuint index) const;
</del><ins>+    const UniformBlock &amp;getUniformBlockByIndex(GLuint index) const;
</ins><span class="cx"> 
</span><span class="cx">     void setTransformFeedbackVaryings(GLsizei count, const GLchar *const *varyings, GLenum bufferMode);
</span><span class="cx">     void getTransformFeedbackVarying(GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) const;
</span><span class="lines">@@ -206,7 +322,6 @@
</span><span class="cx">     GLsizei getTransformFeedbackVaryingMaxLength() const;
</span><span class="cx">     GLenum getTransformFeedbackBufferMode() const;
</span><span class="cx"> 
</span><del>-    static bool linkVaryings(InfoLog &amp;infoLog, Shader *fragmentShader, Shader *vertexShader);
</del><span class="cx">     static bool linkValidateUniforms(InfoLog &amp;infoLog, const std::string &amp;uniformName, const sh::Uniform &amp;vertexUniform, const sh::Uniform &amp;fragmentUniform);
</span><span class="cx">     static bool linkValidateInterfaceBlockFields(InfoLog &amp;infoLog, const std::string &amp;uniformName, const sh::InterfaceBlockField &amp;vertexUniform, const sh::InterfaceBlockField &amp;fragmentUniform);
</span><span class="cx"> 
</span><span class="lines">@@ -219,17 +334,26 @@
</span><span class="cx">     void validate(const Caps &amp;caps);
</span><span class="cx">     bool validateSamplers(InfoLog *infoLog, const Caps &amp;caps);
</span><span class="cx">     bool isValidated() const;
</span><del>-    void updateSamplerMapping();
</del><span class="cx"> 
</span><ins>+    const AttributesMask &amp;getActiveAttribLocationsMask() const
+    {
+        return mData.mActiveAttribLocationsMask;
+    }
+
</ins><span class="cx">   private:
</span><span class="cx">     void unlink(bool destroy = false);
</span><span class="cx">     void resetUniformBlockBindings();
</span><span class="cx"> 
</span><del>-    bool linkAttributes(const Data &amp;data,
</del><ins>+    bool linkAttributes(const gl::Data &amp;data,
</ins><span class="cx">                         InfoLog &amp;infoLog,
</span><span class="cx">                         const AttributeBindings &amp;attributeBindings,
</span><span class="cx">                         const Shader *vertexShader);
</span><del>-    bool linkUniformBlocks(InfoLog &amp;infoLog, const Shader &amp;vertexShader, const Shader &amp;fragmentShader, const Caps &amp;caps);
</del><ins>+    bool linkUniformBlocks(InfoLog &amp;infoLog, const Caps &amp;caps);
+    static bool linkVaryings(InfoLog &amp;infoLog,
+                             const Shader *vertexShader,
+                             const Shader *fragmentShader);
+    bool linkUniforms(gl::InfoLog &amp;infoLog, const gl::Caps &amp;caps);
+    void indexUniforms();
</ins><span class="cx">     bool areMatchingInterfaceBlocks(gl::InfoLog &amp;infoLog, const sh::InterfaceBlock &amp;vertexInterfaceBlock,
</span><span class="cx">                                     const sh::InterfaceBlock &amp;fragmentInterfaceBlock);
</span><span class="cx"> 
</span><span class="lines">@@ -240,32 +364,64 @@
</span><span class="cx">                                           bool validatePrecision);
</span><span class="cx"> 
</span><span class="cx">     static bool linkValidateVaryings(InfoLog &amp;infoLog, const std::string &amp;varyingName, const sh::Varying &amp;vertexVarying, const sh::Varying &amp;fragmentVarying);
</span><del>-    bool gatherTransformFeedbackLinkedVaryings(InfoLog &amp;infoLog, const std::vector&lt;LinkedVarying&gt; &amp;linkedVaryings,
-                                               const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryingNames,
-                                               GLenum transformFeedbackBufferMode,
-                                               std::vector&lt;LinkedVarying&gt; *outTransformFeedbackLinkedVaryings,
-                                               const Caps &amp;caps) const;
</del><ins>+    bool linkValidateTransformFeedback(InfoLog &amp;infoLog,
+                                       const std::vector&lt;const sh::Varying *&gt; &amp;linkedVaryings,
+                                       const Caps &amp;caps) const;
+
+    void gatherTransformFeedbackVaryings(const std::vector&lt;const sh::Varying *&gt; &amp;varyings);
</ins><span class="cx">     bool assignUniformBlockRegister(InfoLog &amp;infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex, const Caps &amp;caps);
</span><span class="cx">     void defineOutputVariables(Shader *fragmentShader);
</span><span class="cx"> 
</span><del>-    rx::ProgramImpl *mProgram;
</del><ins>+    std::vector&lt;const sh::Varying *&gt; getMergedVaryings() const;
+    void linkOutputVariables();
</ins><span class="cx"> 
</span><del>-    sh::Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
</del><ins>+    bool flattenUniformsAndCheckCaps(const Caps &amp;caps, InfoLog &amp;infoLog);
</ins><span class="cx"> 
</span><del>-    std::map&lt;int, VariableLocation&gt; mOutputVariables;
</del><ins>+    struct VectorAndSamplerCount
+    {
+        VectorAndSamplerCount() : vectorCount(0), samplerCount(0) {}
+        VectorAndSamplerCount(const VectorAndSamplerCount &amp;other) = default;
+        VectorAndSamplerCount &amp;operator=(const VectorAndSamplerCount &amp;other) = default;
</ins><span class="cx"> 
</span><del>-    bool mValidated;
</del><ins>+        VectorAndSamplerCount &amp;operator+=(const VectorAndSamplerCount &amp;other)
+        {
+            vectorCount += other.vectorCount;
+            samplerCount += other.samplerCount;
+            return *this;
+        }
</ins><span class="cx"> 
</span><del>-    Shader *mFragmentShader;
-    Shader *mVertexShader;
</del><ins>+        unsigned int vectorCount;
+        unsigned int samplerCount;
+    };
</ins><span class="cx"> 
</span><del>-    AttributeBindings mAttributeBindings;
</del><ins>+    VectorAndSamplerCount flattenUniform(const sh::ShaderVariable &amp;uniform,
+                                         const std::string &amp;fullName,
+                                         std::vector&lt;LinkedUniform&gt; *samplerUniforms);
</ins><span class="cx"> 
</span><del>-    GLuint mUniformBlockBindings[IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS];
</del><ins>+    void gatherInterfaceBlockInfo();
+    template &lt;typename VarT&gt;
+    void defineUniformBlockMembers(const std::vector&lt;VarT&gt; &amp;fields,
+                                   const std::string &amp;prefix,
+                                   int blockIndex);
</ins><span class="cx"> 
</span><del>-    std::vector&lt;std::string&gt; mTransformFeedbackVaryings;
-    GLenum mTransformFeedbackBufferMode;
</del><ins>+    void defineUniformBlock(const sh::InterfaceBlock &amp;interfaceBlock, GLenum shaderType);
</ins><span class="cx"> 
</span><ins>+    template &lt;typename T&gt;
+    void setUniformInternal(GLint location, GLsizei count, const T *v);
+
+    template &lt;size_t cols, size_t rows, typename T&gt;
+    void setMatrixUniformInternal(GLint location, GLsizei count, GLboolean transpose, const T *v);
+
+    template &lt;typename DestT&gt;
+    void getUniformInternal(GLint location, DestT *dataOut) const;
+
+    Data mData;
+    rx::ProgramImpl *mProgram;
+
+    bool mValidated;
+
+    AttributeBindings mAttributeBindings;
+
</ins><span class="cx">     bool mLinked;
</span><span class="cx">     bool mDeleteStatus;   // Flag to indicate that the program can be deleted when no longer in use
</span><span class="cx"> 
</span><span class="lines">@@ -275,6 +431,11 @@
</span><span class="cx">     const GLuint mHandle;
</span><span class="cx"> 
</span><span class="cx">     InfoLog mInfoLog;
</span><ins>+
+    // Cache for sampler validation
+    Optional&lt;bool&gt; mCachedValidateSamplersResult;
+    std::vector&lt;GLenum&gt; mTextureUnitTypesCache;
+    RangeUI mSamplerUniformRange;
</ins><span class="cx"> };
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEProgram_unittestcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program_unittest.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program_unittest.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Program_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Unit tests for Program and related classes.
+//
+
+#include &lt;gtest/gtest.h&gt;
+
+#include &quot;tests/angle_unittests_utils.h&quot;
+#include &quot;libANGLE/Program.h&quot;
+
+using namespace gl;
+
+namespace
+{
+
+// Tests that the log length properly counts the terminating \0.
+TEST(InfoLogTest, LogLengthCountsTerminator)
+{
+    InfoLog infoLog;
+    EXPECT_EQ(0u, infoLog.getLength());
+    infoLog &lt;&lt; &quot; &quot;;
+
+    // &quot; \n\0&quot; = 3 characters
+    EXPECT_EQ(3u, infoLog.getLength());
+}
+
+// Tests that newlines get appended to the info log properly.
+TEST(InfoLogTest, AppendingNewline)
+{
+    InfoLog infoLog;
+
+    infoLog &lt;&lt; &quot;First&quot; &lt;&lt; 1 &lt;&lt; 'x';
+    infoLog &lt;&lt; &quot;Second&quot; &lt;&lt; 2 &lt;&lt; 'y';
+
+    std::string expected = &quot;First1x\nSecond2y\n&quot;;
+
+    EXPECT_EQ(expected, infoLog.str());
+}
+
+} // namespace
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEQuerycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Query.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Query.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Query.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,9 +11,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><del>-Query::Query(rx::QueryImpl *impl, GLuint id)
-    : RefCountObject(id),
-      mQuery(impl)
</del><ins>+Query::Query(rx::QueryImpl *impl, GLuint id) : RefCountObject(id), mQuery(impl), mLabel()
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -22,6 +20,16 @@
</span><span class="cx">     SafeDelete(mQuery);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Query::setLabel(const std::string &amp;label)
+{
+    mLabel = label;
+}
+
+const std::string &amp;Query::getLabel() const
+{
+    return mLabel;
+}
+
</ins><span class="cx"> Error Query::begin()
</span><span class="cx"> {
</span><span class="cx">     return mQuery-&gt;begin();
</span><span class="lines">@@ -32,13 +40,33 @@
</span><span class="cx">     return mQuery-&gt;end();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Error Query::queryCounter()
+{
+    return mQuery-&gt;queryCounter();
+}
+
+Error Query::getResult(GLint *params)
+{
+    return mQuery-&gt;getResult(params);
+}
+
</ins><span class="cx"> Error Query::getResult(GLuint *params)
</span><span class="cx"> {
</span><span class="cx">     return mQuery-&gt;getResult(params);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Query::isResultAvailable(GLuint *available)
</del><ins>+Error Query::getResult(GLint64 *params)
</ins><span class="cx"> {
</span><ins>+    return mQuery-&gt;getResult(params);
+}
+
+Error Query::getResult(GLuint64 *params)
+{
+    return mQuery-&gt;getResult(params);
+}
+
+Error Query::isResultAvailable(bool *available)
+{
</ins><span class="cx">     return mQuery-&gt;isResultAvailable(available);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -47,4 +75,13 @@
</span><span class="cx">     return mQuery-&gt;getType();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+rx::QueryImpl *Query::getImplementation()
+{
+    return mQuery;
</ins><span class="cx"> }
</span><ins>+
+const rx::QueryImpl *Query::getImplementation() const
+{
+    return mQuery;
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEQueryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Query.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Query.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Query.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,6 +9,7 @@
</span><span class="cx"> #ifndef LIBANGLE_QUERY_H_
</span><span class="cx"> #define LIBANGLE_QUERY_H_
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/Debug.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/RefCountObject.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -24,22 +25,33 @@
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-class Query : public RefCountObject
</del><ins>+class Query final : public RefCountObject, public LabeledObject
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     Query(rx::QueryImpl *impl, GLuint id);
</span><span class="cx">     virtual ~Query();
</span><span class="cx"> 
</span><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
+
</ins><span class="cx">     Error begin();
</span><span class="cx">     Error end();
</span><del>-
</del><ins>+    Error queryCounter();
+    Error getResult(GLint *params);
</ins><span class="cx">     Error getResult(GLuint *params);
</span><del>-    Error isResultAvailable(GLuint *available);
</del><ins>+    Error getResult(GLint64 *params);
+    Error getResult(GLuint64 *params);
+    Error isResultAvailable(bool *available);
</ins><span class="cx"> 
</span><span class="cx">     GLenum getType() const;
</span><span class="cx"> 
</span><ins>+    rx::QueryImpl *getImplementation();
+    const rx::QueryImpl *getImplementation() const;
+
</ins><span class="cx">   private:
</span><span class="cx">     rx::QueryImpl *mQuery;
</span><ins>+
+    std::string mLabel;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLERefCountObjectcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/ThirdParty/ANGLE/src/libANGLE/RefCountObject.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/RefCountObject.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/RefCountObject.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,39 +0,0 @@
</span><del>-//
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// RefCountObject.cpp: Defines the gl::RefCountObject base class that provides
-// lifecycle support for GL objects using the traditional BindObject scheme, but
-// that need to be reference counted for correct cross-context deletion.
-// (Concretely, textures, buffers and renderbuffers.)
-
-#include &quot;RefCountObject.h&quot;
-
-RefCountObject::RefCountObject(GLuint id)
-    : mId(id),
-      mRefCount(0)
-{
-}
-
-RefCountObject::~RefCountObject()
-{
-    ASSERT(mRefCount == 0);
-}
-
-void RefCountObject::addRef() const
-{
-    mRefCount++;
-}
-
-void RefCountObject::release() const
-{
-    ASSERT(mRefCount &gt; 0);
-
-    if (--mRefCount == 0)
-    {
-        delete this;
-    }
-}
-
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLERefCountObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/RefCountObject.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/RefCountObject.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/RefCountObject.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,14 +21,27 @@
</span><span class="cx"> class RefCountObject : angle::NonCopyable
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    explicit RefCountObject(GLuint id);
-    virtual ~RefCountObject();
</del><ins>+    explicit RefCountObject(GLuint id) : mId(id), mRefCount(0) {}
</ins><span class="cx"> 
</span><del>-    virtual void addRef() const;
-    virtual void release() const;
</del><ins>+    void addRef() const { ++mRefCount; }
</ins><span class="cx"> 
</span><ins>+    void release() const
+    {
+        ASSERT(mRefCount &gt; 0);
+
+        if (--mRefCount == 0)
+        {
+            delete this;
+        }
+    }
+
</ins><span class="cx">     GLuint id() const { return mId; }
</span><span class="cx"> 
</span><ins>+    size_t getRefCount() const { return mRefCount; }
+
+  protected:
+    virtual ~RefCountObject() { ASSERT(mRefCount == 0); }
+
</ins><span class="cx">   private:
</span><span class="cx">     GLuint mId;
</span><span class="cx"> 
</span><span class="lines">@@ -38,7 +51,7 @@
</span><span class="cx"> template &lt;class ObjectType&gt;
</span><span class="cx"> class BindingPointer
</span><span class="cx"> {
</span><del>-public:
</del><ins>+  public:
</ins><span class="cx">     BindingPointer()
</span><span class="cx">         : mObject(nullptr)
</span><span class="cx">     {
</span><span class="lines">@@ -74,6 +87,13 @@
</span><span class="cx"> 
</span><span class="cx">     GLuint id() const { return (mObject != nullptr) ? mObject-&gt;id() : 0; }
</span><span class="cx"> 
</span><ins>+    bool operator==(const BindingPointer&lt;ObjectType&gt; &amp;other) const
+    {
+        return mObject == other.mObject;
+    }
+
+    bool operator!=(const BindingPointer&lt;ObjectType&gt; &amp;other) const { return !(*this == other); }
+
</ins><span class="cx">   private:
</span><span class="cx">     ObjectType *mObject;
</span><span class="cx"> };
</span><span class="lines">@@ -101,6 +121,16 @@
</span><span class="cx">     GLintptr getOffset() const { return mOffset; }
</span><span class="cx">     GLsizeiptr getSize() const { return mSize; }
</span><span class="cx"> 
</span><ins>+    bool operator==(const OffsetBindingPointer&lt;ObjectType&gt; &amp;other) const
+    {
+        return this-&gt;get() == other.get() &amp;&amp; mOffset == other.mOffset &amp;&amp; mSize == other.mSize;
+    }
+
+    bool operator!=(const OffsetBindingPointer&lt;ObjectType&gt; &amp;other) const
+    {
+        return !(*this == other);
+    }
+
</ins><span class="cx">   private:
</span><span class="cx">     GLintptr mOffset;
</span><span class="cx">     GLsizeiptr mSize;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLERenderbuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Renderbuffer.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Renderbuffer.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Renderbuffer.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,20 +12,21 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/utilities.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><ins>+#include &quot;libANGLE/Image.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Texture.h&quot;
</span><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RenderTargetD3D.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><del>-
</del><span class="cx"> Renderbuffer::Renderbuffer(rx::RenderbufferImpl *impl, GLuint id)
</span><del>-  : FramebufferAttachmentObject(id),
-    mRenderbuffer(impl),
-    mWidth(0),
-    mHeight(0),
-    mInternalFormat(GL_RGBA4),
-    mSamples(0)
</del><ins>+    : egl::ImageSibling(id),
+      mRenderbuffer(impl),
+      mLabel(),
+      mWidth(0),
+      mHeight(0),
+      mInternalFormat(GL_RGBA4),
+      mSamples(0)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -34,16 +35,28 @@
</span><span class="cx">     SafeDelete(mRenderbuffer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Renderbuffer::setLabel(const std::string &amp;label)
+{
+    mLabel = label;
+}
+
+const std::string &amp;Renderbuffer::getLabel() const
+{
+    return mLabel;
+}
+
</ins><span class="cx"> Error Renderbuffer::setStorage(GLenum internalformat, size_t width, size_t height)
</span><span class="cx"> {
</span><ins>+    orphanImages();
+
</ins><span class="cx">     Error error = mRenderbuffer-&gt;setStorage(internalformat, width, height);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mWidth = static_cast&lt;GLsizei&gt;(width);
-    mHeight = static_cast&lt;GLsizei&gt;(height);
</del><ins>+    mWidth          = static_cast&lt;GLsizei&gt;(width);
+    mHeight         = static_cast&lt;GLsizei&gt;(height);
</ins><span class="cx">     mInternalFormat = internalformat;
</span><span class="cx">     mSamples = 0;
</span><span class="cx"> 
</span><span class="lines">@@ -52,20 +65,42 @@
</span><span class="cx"> 
</span><span class="cx"> Error Renderbuffer::setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height)
</span><span class="cx"> {
</span><ins>+    orphanImages();
+
</ins><span class="cx">     Error error = mRenderbuffer-&gt;setStorageMultisample(samples, internalformat, width, height);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mWidth = static_cast&lt;GLsizei&gt;(width);
-    mHeight = static_cast&lt;GLsizei&gt;(height);
</del><ins>+    mWidth          = static_cast&lt;GLsizei&gt;(width);
+    mHeight         = static_cast&lt;GLsizei&gt;(height);
</ins><span class="cx">     mInternalFormat = internalformat;
</span><del>-    mSamples = static_cast&lt;GLsizei&gt;(samples);
</del><ins>+    mSamples        = static_cast&lt;GLsizei&gt;(samples);
</ins><span class="cx"> 
</span><span class="cx">     return Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Error Renderbuffer::setStorageEGLImageTarget(egl::Image *image)
+{
+    orphanImages();
+
+    Error error = mRenderbuffer-&gt;setStorageEGLImageTarget(image);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    setTargetImage(image);
+
+    mWidth          = static_cast&lt;GLsizei&gt;(image-&gt;getWidth());
+    mHeight         = static_cast&lt;GLsizei&gt;(image-&gt;getHeight());
+    mInternalFormat = image-&gt;getInternalFormat();
+    mSamples        = 0;
+
+    return Error(GL_NO_ERROR);
+}
+
</ins><span class="cx"> rx::RenderbufferImpl *Renderbuffer::getImplementation()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(mRenderbuffer);
</span><span class="lines">@@ -127,4 +162,23 @@
</span><span class="cx">     return GetInternalFormatInfo(mInternalFormat).stencilBits;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Renderbuffer::onAttach()
+{
+    addRef();
</ins><span class="cx"> }
</span><ins>+
+void Renderbuffer::onDetach()
+{
+    release();
+}
+
+GLuint Renderbuffer::getId() const
+{
+    return id();
+}
+
+Extents Renderbuffer::getAttachmentSize(const FramebufferAttachment::Target &amp; /*target*/) const
+{
+    return Extents(mWidth, mHeight, 1);
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLERenderbufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Renderbuffer.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Renderbuffer.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Renderbuffer.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,8 +13,10 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><ins>+#include &quot;libANGLE/Debug.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><ins>+#include &quot;libANGLE/Image.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/RenderbufferImpl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="lines">@@ -24,14 +26,20 @@
</span><span class="cx"> // FramebufferAttachment and Framebuffer for how they are applied to an FBO via an
</span><span class="cx"> // attachment point.
</span><span class="cx"> 
</span><del>-class Renderbuffer : public FramebufferAttachmentObject
</del><ins>+class Renderbuffer final : public egl::ImageSibling,
+                           public gl::FramebufferAttachmentObject,
+                           public LabeledObject
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     Renderbuffer(rx::RenderbufferImpl *impl, GLuint id);
</span><span class="cx">     virtual ~Renderbuffer();
</span><span class="cx"> 
</span><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
+
</ins><span class="cx">     Error setStorage(GLenum internalformat, size_t width, size_t height);
</span><span class="cx">     Error setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height);
</span><ins>+    Error setStorageEGLImageTarget(egl::Image *imageTarget);
</ins><span class="cx"> 
</span><span class="cx">     rx::RenderbufferImpl *getImplementation();
</span><span class="cx">     const rx::RenderbufferImpl *getImplementation() const;
</span><span class="lines">@@ -48,16 +56,21 @@
</span><span class="cx">     GLuint getStencilSize() const;
</span><span class="cx"> 
</span><span class="cx">     // FramebufferAttachmentObject Impl
</span><del>-    GLsizei getAttachmentWidth(const FramebufferAttachment::Target &amp;/*target*/) const override { return getWidth(); }
-    GLsizei getAttachmentHeight(const FramebufferAttachment::Target &amp;/*target*/) const override { return getHeight(); }
</del><ins>+    Extents getAttachmentSize(const FramebufferAttachment::Target &amp;target) const override;
</ins><span class="cx">     GLenum getAttachmentInternalFormat(const FramebufferAttachment::Target &amp;/*target*/) const override { return getInternalFormat(); }
</span><span class="cx">     GLsizei getAttachmentSamples(const FramebufferAttachment::Target &amp;/*target*/) const override { return getSamples(); }
</span><span class="cx"> 
</span><ins>+    void onAttach() override;
+    void onDetach() override;
+    GLuint getId() const override;
+
</ins><span class="cx">   private:
</span><span class="cx">     rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override { return mRenderbuffer; }
</span><span class="cx"> 
</span><span class="cx">     rx::RenderbufferImpl *mRenderbuffer;
</span><span class="cx"> 
</span><ins>+    std::string mLabel;
+
</ins><span class="cx">     GLsizei mWidth;
</span><span class="cx">     GLsizei mHeight;
</span><span class="cx">     GLenum mInternalFormat;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEResourceManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -82,19 +82,19 @@
</span><span class="cx"> {
</span><span class="cx">     GLuint handle = mBufferHandleAllocator.allocate();
</span><span class="cx"> 
</span><del>-    mBufferMap[handle] = NULL;
</del><ins>+    mBufferMap[handle] = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     return handle;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Returns an unused shader/program name
</span><del>-GLuint ResourceManager::createShader(const gl::Data &amp;data, GLenum type)
</del><ins>+GLuint ResourceManager::createShader(const gl::Limitations &amp;rendererLimitations, GLenum type)
</ins><span class="cx"> {
</span><span class="cx">     GLuint handle = mProgramShaderHandleAllocator.allocate();
</span><span class="cx"> 
</span><span class="cx">     if (type == GL_VERTEX_SHADER || type == GL_FRAGMENT_SHADER)
</span><span class="cx">     {
</span><del>-        mShaderMap[handle] = new Shader(this, mFactory-&gt;createShader(type), type, handle);
</del><ins>+        mShaderMap[handle] = new Shader(this, mFactory, rendererLimitations, type, handle);
</ins><span class="cx">     }
</span><span class="cx">     else UNREACHABLE();
</span><span class="cx"> 
</span><span class="lines">@@ -106,7 +106,7 @@
</span><span class="cx"> {
</span><span class="cx">     GLuint handle = mProgramShaderHandleAllocator.allocate();
</span><span class="cx"> 
</span><del>-    mProgramMap[handle] = new Program(mFactory-&gt;createProgram(), this, handle);
</del><ins>+    mProgramMap[handle] = new Program(mFactory, this, handle);
</ins><span class="cx"> 
</span><span class="cx">     return handle;
</span><span class="cx"> }
</span><span class="lines">@@ -116,7 +116,7 @@
</span><span class="cx"> {
</span><span class="cx">     GLuint handle = mTextureHandleAllocator.allocate();
</span><span class="cx"> 
</span><del>-    mTextureMap[handle] = NULL;
</del><ins>+    mTextureMap[handle] = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     return handle;
</span><span class="cx"> }
</span><span class="lines">@@ -126,7 +126,7 @@
</span><span class="cx"> {
</span><span class="cx">     GLuint handle = mRenderbufferHandleAllocator.allocate();
</span><span class="cx"> 
</span><del>-    mRenderbufferMap[handle] = NULL;
</del><ins>+    mRenderbufferMap[handle] = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     return handle;
</span><span class="cx"> }
</span><span class="lines">@@ -136,7 +136,7 @@
</span><span class="cx"> {
</span><span class="cx">     GLuint handle = mSamplerHandleAllocator.allocate();
</span><span class="cx"> 
</span><del>-    mSamplerMap[handle] = NULL;
</del><ins>+    mSamplerMap[handle] = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     return handle;
</span><span class="cx"> }
</span><span class="lines">@@ -155,7 +155,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ResourceManager::deleteBuffer(GLuint buffer)
</span><span class="cx"> {
</span><del>-    BufferMap::iterator bufferObject = mBufferMap.find(buffer);
</del><ins>+    auto bufferObject = mBufferMap.find(buffer);
</ins><span class="cx"> 
</span><span class="cx">     if (bufferObject != mBufferMap.end())
</span><span class="cx">     {
</span><span class="lines">@@ -167,7 +167,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ResourceManager::deleteShader(GLuint shader)
</span><span class="cx"> {
</span><del>-    ShaderMap::iterator shaderObject = mShaderMap.find(shader);
</del><ins>+    auto shaderObject = mShaderMap.find(shader);
</ins><span class="cx"> 
</span><span class="cx">     if (shaderObject != mShaderMap.end())
</span><span class="cx">     {
</span><span class="lines">@@ -186,7 +186,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ResourceManager::deleteProgram(GLuint program)
</span><span class="cx"> {
</span><del>-    ProgramMap::iterator programObject = mProgramMap.find(program);
</del><ins>+    auto programObject = mProgramMap.find(program);
</ins><span class="cx"> 
</span><span class="cx">     if (programObject != mProgramMap.end())
</span><span class="cx">     {
</span><span class="lines">@@ -205,7 +205,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ResourceManager::deleteTexture(GLuint texture)
</span><span class="cx"> {
</span><del>-    TextureMap::iterator textureObject = mTextureMap.find(texture);
</del><ins>+    auto textureObject = mTextureMap.find(texture);
</ins><span class="cx"> 
</span><span class="cx">     if (textureObject != mTextureMap.end())
</span><span class="cx">     {
</span><span class="lines">@@ -217,7 +217,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
</span><span class="cx"> {
</span><del>-    RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
</del><ins>+    auto renderbufferObject = mRenderbufferMap.find(renderbuffer);
</ins><span class="cx"> 
</span><span class="cx">     if (renderbufferObject != mRenderbufferMap.end())
</span><span class="cx">     {
</span><span class="lines">@@ -253,11 +253,11 @@
</span><span class="cx"> 
</span><span class="cx"> Buffer *ResourceManager::getBuffer(unsigned int handle)
</span><span class="cx"> {
</span><del>-    BufferMap::iterator buffer = mBufferMap.find(handle);
</del><ins>+    auto buffer = mBufferMap.find(handle);
</ins><span class="cx"> 
</span><span class="cx">     if (buffer == mBufferMap.end())
</span><span class="cx">     {
</span><del>-        return NULL;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -267,11 +267,11 @@
</span><span class="cx"> 
</span><span class="cx"> Shader *ResourceManager::getShader(unsigned int handle)
</span><span class="cx"> {
</span><del>-    ShaderMap::iterator shader = mShaderMap.find(handle);
</del><ins>+    auto shader = mShaderMap.find(handle);
</ins><span class="cx"> 
</span><span class="cx">     if (shader == mShaderMap.end())
</span><span class="cx">     {
</span><del>-        return NULL;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -281,13 +281,14 @@
</span><span class="cx"> 
</span><span class="cx"> Texture *ResourceManager::getTexture(unsigned int handle)
</span><span class="cx"> {
</span><del>-    if (handle == 0) return NULL;
</del><ins>+    if (handle == 0)
+        return nullptr;
</ins><span class="cx"> 
</span><del>-    TextureMap::iterator texture = mTextureMap.find(handle);
</del><ins>+    auto texture = mTextureMap.find(handle);
</ins><span class="cx"> 
</span><span class="cx">     if (texture == mTextureMap.end())
</span><span class="cx">     {
</span><del>-        return NULL;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -297,11 +298,11 @@
</span><span class="cx"> 
</span><span class="cx"> Program *ResourceManager::getProgram(unsigned int handle) const
</span><span class="cx"> {
</span><del>-    ProgramMap::const_iterator program = mProgramMap.find(handle);
</del><ins>+    auto program = mProgramMap.find(handle);
</ins><span class="cx"> 
</span><span class="cx">     if (program == mProgramMap.end())
</span><span class="cx">     {
</span><del>-        return NULL;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -311,11 +312,11 @@
</span><span class="cx"> 
</span><span class="cx"> Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
</span><span class="cx"> {
</span><del>-    RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
</del><ins>+    auto renderbuffer = mRenderbufferMap.find(handle);
</ins><span class="cx"> 
</span><span class="cx">     if (renderbuffer == mRenderbufferMap.end())
</span><span class="cx">     {
</span><del>-        return NULL;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -329,7 +330,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (sampler == mSamplerMap.end())
</span><span class="cx">     {
</span><del>-        return NULL;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -343,7 +344,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (fenceObjectIt == mFenceSyncMap.end())
</span><span class="cx">     {
</span><del>-        return NULL;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -356,96 +357,117 @@
</span><span class="cx">     mRenderbufferMap[handle] = buffer;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceManager::checkBufferAllocation(GLuint handle)
</del><ins>+Buffer *ResourceManager::checkBufferAllocation(GLuint handle)
</ins><span class="cx"> {
</span><del>-    if (handle != 0)
</del><ins>+    if (handle == 0)
</ins><span class="cx">     {
</span><del>-        auto bufferMapIt = mBufferMap.find(handle);
-        bool handleAllocated = (bufferMapIt != mBufferMap.end());
</del><ins>+        return nullptr;
+    }
</ins><span class="cx"> 
</span><del>-        if (handleAllocated &amp;&amp; bufferMapIt-&gt;second != nullptr)
-        {
-            return;
-        }
</del><ins>+    auto bufferMapIt     = mBufferMap.find(handle);
+    bool handleAllocated = (bufferMapIt != mBufferMap.end());
</ins><span class="cx"> 
</span><del>-        Buffer *buffer = new Buffer(mFactory-&gt;createBuffer(), handle);
-        buffer-&gt;addRef();
</del><ins>+    if (handleAllocated &amp;&amp; bufferMapIt-&gt;second != nullptr)
+    {
+        return bufferMapIt-&gt;second;
+    }
</ins><span class="cx"> 
</span><del>-        if (handleAllocated)
-        {
-            bufferMapIt-&gt;second = buffer;
-        }
-        else
-        {
-            mBufferHandleAllocator.reserve(handle);
-            mBufferMap[handle] = buffer;
-        }
</del><ins>+    Buffer *buffer = new Buffer(mFactory-&gt;createBuffer(), handle);
+    buffer-&gt;addRef();
+
+    if (handleAllocated)
+    {
+        bufferMapIt-&gt;second = buffer;
</ins><span class="cx">     }
</span><ins>+    else
+    {
+        mBufferHandleAllocator.reserve(handle);
+        mBufferMap[handle] = buffer;
+    }
+
+    return buffer;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceManager::checkTextureAllocation(GLuint handle, GLenum type)
</del><ins>+Texture *ResourceManager::checkTextureAllocation(GLuint handle, GLenum type)
</ins><span class="cx"> {
</span><del>-    if (handle != 0)
</del><ins>+    if (handle == 0)
</ins><span class="cx">     {
</span><del>-        auto textureMapIt = mTextureMap.find(handle);
-        bool handleAllocated = (textureMapIt != mTextureMap.end());
</del><ins>+        return nullptr;
+    }
</ins><span class="cx"> 
</span><del>-        if (handleAllocated &amp;&amp; textureMapIt-&gt;second != nullptr)
-        {
-            return;
-        }
</del><ins>+    auto textureMapIt    = mTextureMap.find(handle);
+    bool handleAllocated = (textureMapIt != mTextureMap.end());
</ins><span class="cx"> 
</span><del>-        Texture *texture = new Texture(mFactory-&gt;createTexture(type), handle, type);
-        texture-&gt;addRef();
</del><ins>+    if (handleAllocated &amp;&amp; textureMapIt-&gt;second != nullptr)
+    {
+        return textureMapIt-&gt;second;
+    }
</ins><span class="cx"> 
</span><del>-        if (handleAllocated)
-        {
-            textureMapIt-&gt;second = texture;
-        }
-        else
-        {
-            mTextureHandleAllocator.reserve(handle);
-            mTextureMap[handle] = texture;
-        }
</del><ins>+    Texture *texture = new Texture(mFactory-&gt;createTexture(type), handle, type);
+    texture-&gt;addRef();
+
+    if (handleAllocated)
+    {
+        textureMapIt-&gt;second = texture;
</ins><span class="cx">     }
</span><ins>+    else
+    {
+        mTextureHandleAllocator.reserve(handle);
+        mTextureMap[handle] = texture;
+    }
+
+    return texture;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceManager::checkRenderbufferAllocation(GLuint handle)
</del><ins>+Renderbuffer *ResourceManager::checkRenderbufferAllocation(GLuint handle)
</ins><span class="cx"> {
</span><del>-    if (handle != 0)
</del><ins>+    if (handle == 0)
</ins><span class="cx">     {
</span><del>-        auto renderbufferMapIt = mRenderbufferMap.find(handle);
-        bool handleAllocated = (renderbufferMapIt != mRenderbufferMap.end());
</del><ins>+        return nullptr;
+    }
</ins><span class="cx"> 
</span><del>-        if (handleAllocated &amp;&amp; renderbufferMapIt-&gt;second != nullptr)
-        {
-            return;
-        }
</del><ins>+    auto renderbufferMapIt = mRenderbufferMap.find(handle);
+    bool handleAllocated   = (renderbufferMapIt != mRenderbufferMap.end());
</ins><span class="cx"> 
</span><del>-        Renderbuffer *renderbuffer = new Renderbuffer(mFactory-&gt;createRenderbuffer(), handle);
-        renderbuffer-&gt;addRef();
</del><ins>+    if (handleAllocated &amp;&amp; renderbufferMapIt-&gt;second != nullptr)
+    {
+        return renderbufferMapIt-&gt;second;
+    }
</ins><span class="cx"> 
</span><del>-        if (handleAllocated)
-        {
-            renderbufferMapIt-&gt;second = renderbuffer;
-        }
-        else
-        {
-            mRenderbufferHandleAllocator.reserve(handle);
-            mRenderbufferMap[handle] = renderbuffer;
-        }
</del><ins>+    Renderbuffer *renderbuffer = new Renderbuffer(mFactory-&gt;createRenderbuffer(), handle);
+    renderbuffer-&gt;addRef();
+
+    if (handleAllocated)
+    {
+        renderbufferMapIt-&gt;second = renderbuffer;
</ins><span class="cx">     }
</span><ins>+    else
+    {
+        mRenderbufferHandleAllocator.reserve(handle);
+        mRenderbufferMap[handle] = renderbuffer;
+    }
+
+    return renderbuffer;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ResourceManager::checkSamplerAllocation(GLuint sampler)
</del><ins>+Sampler *ResourceManager::checkSamplerAllocation(GLuint samplerHandle)
</ins><span class="cx"> {
</span><del>-    if (sampler != 0 &amp;&amp; !getSampler(sampler))
</del><ins>+    // Samplers cannot be created via Bind
+    if (samplerHandle == 0)
</ins><span class="cx">     {
</span><del>-        Sampler *samplerObject = new Sampler(sampler);
-        mSamplerMap[sampler] = samplerObject;
-        samplerObject-&gt;addRef();
-        // Samplers cannot be created via Bind
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><ins>+
+    Sampler *sampler = getSampler(samplerHandle);
+
+    if (!sampler)
+    {
+        sampler                    = new Sampler(mFactory, samplerHandle);
+        mSamplerMap[samplerHandle] = sampler;
+        sampler-&gt;addRef();
+    }
+
+    return sampler;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool ResourceManager::isSampler(GLuint sampler)
</span><span class="lines">@@ -453,4 +475,4 @@
</span><span class="cx">     return mSamplerMap.find(sampler) != mSamplerMap.end();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEResourceManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,8 +15,6 @@
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/HandleAllocator.h&quot;
</span><span class="cx"> 
</span><del>-#include &lt;map&gt;
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class ImplFactory;
</span><span class="lines">@@ -25,13 +23,14 @@
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> class Buffer;
</span><del>-class Shader;
</del><ins>+struct Data;
+class FenceSync;
+struct Limitations;
</ins><span class="cx"> class Program;
</span><del>-class Texture;
</del><span class="cx"> class Renderbuffer;
</span><span class="cx"> class Sampler;
</span><del>-class FenceSync;
-struct Data;
</del><ins>+class Shader;
+class Texture;
</ins><span class="cx"> 
</span><span class="cx"> class ResourceManager : angle::NonCopyable
</span><span class="cx"> {
</span><span class="lines">@@ -43,7 +42,7 @@
</span><span class="cx">     void release();
</span><span class="cx"> 
</span><span class="cx">     GLuint createBuffer();
</span><del>-    GLuint createShader(const gl::Data &amp;data, GLenum type);
</del><ins>+    GLuint createShader(const gl::Limitations &amp;rendererLimitations, GLenum type);
</ins><span class="cx">     GLuint createProgram();
</span><span class="cx">     GLuint createTexture();
</span><span class="cx">     GLuint createRenderbuffer();
</span><span class="lines">@@ -68,10 +67,10 @@
</span><span class="cx"> 
</span><span class="cx">     void setRenderbuffer(GLuint handle, Renderbuffer *renderbuffer);
</span><span class="cx"> 
</span><del>-    void checkBufferAllocation(GLuint handle);
-    void checkTextureAllocation(GLuint handle, GLenum type);
-    void checkRenderbufferAllocation(GLuint handle);
-    void checkSamplerAllocation(GLuint sampler);
</del><ins>+    Buffer *checkBufferAllocation(GLuint handle);
+    Texture *checkTextureAllocation(GLuint handle, GLenum type);
+    Renderbuffer *checkRenderbufferAllocation(GLuint handle);
+    Sampler *checkSamplerAllocation(GLuint samplerHandle);
</ins><span class="cx"> 
</span><span class="cx">     bool isSampler(GLuint sampler);
</span><span class="cx"> 
</span><span class="lines">@@ -81,34 +80,27 @@
</span><span class="cx">     rx::ImplFactory *mFactory;
</span><span class="cx">     std::size_t mRefCount;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, Buffer*&gt; BufferMap;
-    BufferMap mBufferMap;
</del><ins>+    ResourceMap&lt;Buffer&gt; mBufferMap;
</ins><span class="cx">     HandleAllocator mBufferHandleAllocator;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, Shader*&gt; ShaderMap;
-    ShaderMap mShaderMap;
</del><ins>+    ResourceMap&lt;Shader&gt; mShaderMap;
</ins><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, Program*&gt; ProgramMap;
-    ProgramMap mProgramMap;
</del><ins>+    ResourceMap&lt;Program&gt; mProgramMap;
</ins><span class="cx">     HandleAllocator mProgramShaderHandleAllocator;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, Texture*&gt; TextureMap;
-    TextureMap mTextureMap;
</del><ins>+    ResourceMap&lt;Texture&gt; mTextureMap;
</ins><span class="cx">     HandleAllocator mTextureHandleAllocator;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, Renderbuffer*&gt; RenderbufferMap;
-    RenderbufferMap mRenderbufferMap;
</del><ins>+    ResourceMap&lt;Renderbuffer&gt; mRenderbufferMap;
</ins><span class="cx">     HandleAllocator mRenderbufferHandleAllocator;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, Sampler*&gt; SamplerMap;
-    SamplerMap mSamplerMap;
</del><ins>+    ResourceMap&lt;Sampler&gt; mSamplerMap;
</ins><span class="cx">     HandleAllocator mSamplerHandleAllocator;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt;GLuint, FenceSync*&gt; FenceMap;
-    FenceMap mFenceSyncMap;
</del><ins>+    ResourceMap&lt;FenceSync&gt; mFenceSyncMap;
</ins><span class="cx">     HandleAllocator mFenceSyncHandleAllocator;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace gl
</ins><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RESOURCEMANAGER_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEResourceManager_unittestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager_unittest.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager_unittest.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/ResourceManager_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,7 +9,7 @@
</span><span class="cx"> #include &lt;gmock/gmock.h&gt;
</span><span class="cx"> #include &lt;gtest/gtest.h&gt;
</span><span class="cx"> 
</span><del>-#include &quot;angle_unittests_utils.h&quot;
</del><ins>+#include &quot;tests/angle_unittests_utils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/ResourceManager.h&quot;
</span><span class="cx"> 
</span><span class="cx"> using namespace rx;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLESamplercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Sampler.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Sampler.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Sampler.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,35 +9,144 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Sampler.h&quot;
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/ImplFactory.h&quot;
+#include &quot;libANGLE/renderer/SamplerImpl.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-Sampler::Sampler(GLuint id)
-    : RefCountObject(id),
-      mMinFilter(GL_NEAREST_MIPMAP_LINEAR),
-      mMagFilter(GL_LINEAR),
-      mWrapS(GL_REPEAT),
-      mWrapT(GL_REPEAT),
-      mWrapR(GL_REPEAT),
-      mMinLod(-1000.0f),
-      mMaxLod(1000.0f),
-      mComparisonMode(GL_NONE),
-      mComparisonFunc(GL_LEQUAL)
</del><ins>+Sampler::Sampler(rx::ImplFactory *factory, GLuint id)
+    : RefCountObject(id), mImpl(factory-&gt;createSampler()), mLabel(), mSamplerState()
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Sampler::getState(SamplerState *samplerState) const
</del><ins>+Sampler::~Sampler()
</ins><span class="cx"> {
</span><del>-    samplerState-&gt;minFilter   = mMinFilter;
-    samplerState-&gt;magFilter   = mMagFilter;
-    samplerState-&gt;wrapS       = mWrapS;
-    samplerState-&gt;wrapT       = mWrapT;
-    samplerState-&gt;wrapR       = mWrapR;
-    samplerState-&gt;minLod      = mMinLod;
-    samplerState-&gt;maxLod      = mMaxLod;
-    samplerState-&gt;compareMode = mComparisonMode;
-    samplerState-&gt;compareFunc = mComparisonFunc;
</del><ins>+    SafeDelete(mImpl);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Sampler::setLabel(const std::string &amp;label)
+{
+    mLabel = label;
</ins><span class="cx"> }
</span><ins>+
+const std::string &amp;Sampler::getLabel() const
+{
+    return mLabel;
+}
+
+void Sampler::setMinFilter(GLenum minFilter)
+{
+    mSamplerState.minFilter = minFilter;
+}
+
+GLenum Sampler::getMinFilter() const
+{
+    return mSamplerState.minFilter;
+}
+
+void Sampler::setMagFilter(GLenum magFilter)
+{
+    mSamplerState.magFilter = magFilter;
+}
+
+GLenum Sampler::getMagFilter() const
+{
+    return mSamplerState.magFilter;
+}
+
+void Sampler::setWrapS(GLenum wrapS)
+{
+    mSamplerState.wrapS = wrapS;
+}
+
+GLenum Sampler::getWrapS() const
+{
+    return mSamplerState.wrapS;
+}
+
+void Sampler::setWrapT(GLenum wrapT)
+{
+    mSamplerState.wrapT = wrapT;
+}
+
+GLenum Sampler::getWrapT() const
+{
+    return mSamplerState.wrapT;
+}
+
+void Sampler::setWrapR(GLenum wrapR)
+{
+    mSamplerState.wrapR = wrapR;
+}
+
+GLenum Sampler::getWrapR() const
+{
+    return mSamplerState.wrapR;
+}
+
+void Sampler::setMaxAnisotropy(float maxAnisotropy)
+{
+    mSamplerState.maxAnisotropy = maxAnisotropy;
+}
+
+float Sampler::getMaxAnisotropy() const
+{
+    return mSamplerState.maxAnisotropy;
+}
+
+void Sampler::setMinLod(GLfloat minLod)
+{
+    mSamplerState.minLod = minLod;
+}
+
+GLfloat Sampler::getMinLod() const
+{
+    return mSamplerState.minLod;
+}
+
+void Sampler::setMaxLod(GLfloat maxLod)
+{
+    mSamplerState.maxLod = maxLod;
+}
+
+GLfloat Sampler::getMaxLod() const
+{
+    return mSamplerState.maxLod;
+}
+
+void Sampler::setCompareMode(GLenum compareMode)
+{
+    mSamplerState.compareMode = compareMode;
+}
+
+GLenum Sampler::getCompareMode() const
+{
+    return mSamplerState.compareMode;
+}
+
+void Sampler::setCompareFunc(GLenum compareFunc)
+{
+    mSamplerState.compareFunc = compareFunc;
+}
+
+GLenum Sampler::getCompareFunc() const
+{
+    return mSamplerState.compareFunc;
+}
+
+const SamplerState &amp;Sampler::getSamplerState() const
+{
+    return mSamplerState;
+}
+
+const rx::SamplerImpl *Sampler::getImplementation() const
+{
+    return mImpl;
+}
+
+rx::SamplerImpl *Sampler::getImplementation()
+{
+    return mImpl;
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLESamplerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Sampler.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Sampler.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Sampler.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,49 +10,69 @@
</span><span class="cx"> #ifndef LIBANGLE_SAMPLER_H_
</span><span class="cx"> #define LIBANGLE_SAMPLER_H_
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/angletypes.h&quot;
+#include &quot;libANGLE/Debug.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/RefCountObject.h&quot;
</span><span class="cx"> 
</span><ins>+namespace rx
+{
+class ImplFactory;
+class SamplerImpl;
+}
+
</ins><span class="cx"> namespace gl
</span><span class="cx"> {
</span><del>-struct SamplerState;
</del><span class="cx"> 
</span><del>-class Sampler : public RefCountObject
</del><ins>+class Sampler final : public RefCountObject, public LabeledObject
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    Sampler(GLuint id);
</del><ins>+    Sampler(rx::ImplFactory *factory, GLuint id);
+    ~Sampler() override;
</ins><span class="cx"> 
</span><del>-    void setMinFilter(GLenum minFilter) { mMinFilter = minFilter; }
-    void setMagFilter(GLenum magFilter) { mMagFilter = magFilter; }
-    void setWrapS(GLenum wrapS) { mWrapS = wrapS; }
-    void setWrapT(GLenum wrapT) { mWrapT = wrapT; }
-    void setWrapR(GLenum wrapR) { mWrapR = wrapR; }
-    void setMinLod(GLfloat minLod) { mMinLod = minLod; }
-    void setMaxLod(GLfloat maxLod) { mMaxLod = maxLod; }
-    void setComparisonMode(GLenum comparisonMode) { mComparisonMode = comparisonMode; }
-    void setComparisonFunc(GLenum comparisonFunc) { mComparisonFunc = comparisonFunc; }
</del><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
</ins><span class="cx"> 
</span><del>-    GLenum getMinFilter() const { return mMinFilter; }
-    GLenum getMagFilter() const { return mMagFilter; }
-    GLenum getWrapS() const { return mWrapS; }
-    GLenum getWrapT() const { return mWrapT; }
-    GLenum getWrapR() const { return mWrapR; }
-    GLfloat getMinLod() const { return mMinLod; }
-    GLfloat getMaxLod() const { return mMaxLod; }
-    GLenum getComparisonMode() const { return mComparisonMode; }
-    GLenum getComparisonFunc() const { return mComparisonFunc; }
</del><ins>+    void setMinFilter(GLenum minFilter);
+    GLenum getMinFilter() const;
</ins><span class="cx"> 
</span><del>-    void getState(SamplerState *samplerState) const;
</del><ins>+    void setMagFilter(GLenum magFilter);
+    GLenum getMagFilter() const;
</ins><span class="cx"> 
</span><ins>+    void setWrapS(GLenum wrapS);
+    GLenum getWrapS() const;
+
+    void setWrapT(GLenum wrapT);
+    GLenum getWrapT() const;
+
+    void setWrapR(GLenum wrapR);
+    GLenum getWrapR() const;
+
+    void setMaxAnisotropy(float maxAnisotropy);
+    float getMaxAnisotropy() const;
+
+    void setMinLod(GLfloat minLod);
+    GLfloat getMinLod() const;
+
+    void setMaxLod(GLfloat maxLod);
+    GLfloat getMaxLod() const;
+
+    void setCompareMode(GLenum compareMode);
+    GLenum getCompareMode() const;
+
+    void setCompareFunc(GLenum compareFunc);
+    GLenum getCompareFunc() const;
+
+    const SamplerState &amp;getSamplerState() const;
+
+    const rx::SamplerImpl *getImplementation() const;
+    rx::SamplerImpl *getImplementation();
+
</ins><span class="cx">   private:
</span><del>-    GLenum mMinFilter;
-    GLenum mMagFilter;
-    GLenum mWrapS;
-    GLenum mWrapT;
-    GLenum mWrapR;
-    GLfloat mMinLod;
-    GLfloat mMaxLod;
-    GLenum mComparisonMode;
-    GLenum mComparisonFunc;
</del><ins>+    rx::SamplerImpl *mImpl;
+
+    std::string mLabel;
+
+    SamplerState mSamplerState;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEShadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Shader.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Shader.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Shader.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,37 +9,110 @@
</span><span class="cx"> // functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section 3.8 page 84.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Shader.h&quot;
</span><ins>+
+#include &lt;sstream&gt;
+
+#include &quot;common/utilities.h&quot;
+#include &quot;GLSLANG/ShaderLang.h&quot;
+#include &quot;libANGLE/Compiler.h&quot;
+#include &quot;libANGLE/Constants.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/Renderer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/ShaderImpl.h&quot;
</span><del>-#include &quot;libANGLE/Constants.h&quot;
</del><span class="cx"> #include &quot;libANGLE/ResourceManager.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;common/utilities.h&quot;
</del><ins>+namespace gl
+{
</ins><span class="cx"> 
</span><del>-#include &quot;GLSLANG/ShaderLang.h&quot;
</del><ins>+namespace
+{
+template &lt;typename VarT&gt;
+std::vector&lt;VarT&gt; GetActiveShaderVariables(const std::vector&lt;VarT&gt; *variableList)
+{
+    ASSERT(variableList);
+    std::vector&lt;VarT&gt; result;
+    for (size_t varIndex = 0; varIndex &lt; variableList-&gt;size(); varIndex++)
+    {
+        const VarT &amp;var = variableList-&gt;at(varIndex);
+        if (var.staticUse)
+        {
+            result.push_back(var);
+        }
+    }
+    return result;
+}
</ins><span class="cx"> 
</span><del>-#include &lt;sstream&gt;
</del><ins>+template &lt;typename VarT&gt;
+const std::vector&lt;VarT&gt; &amp;GetShaderVariables(const std::vector&lt;VarT&gt; *variableList)
+{
+    ASSERT(variableList);
+    return *variableList;
+}
</ins><span class="cx"> 
</span><del>-namespace gl
</del><ins>+}  // anonymous namespace
+
+// true if varying x has a higher priority in packing than y
+bool CompareShaderVar(const sh::ShaderVariable &amp;x, const sh::ShaderVariable &amp;y)
</ins><span class="cx"> {
</span><ins>+    if (x.type == y.type)
+    {
+        return x.arraySize &gt; y.arraySize;
+    }
</ins><span class="cx"> 
</span><del>-Shader::Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle)
-    : mShader(impl),
</del><ins>+    // Special case for handling structs: we sort these to the end of the list
+    if (x.type == GL_STRUCT_ANGLEX)
+    {
+        return false;
+    }
+
+    if (y.type == GL_STRUCT_ANGLEX)
+    {
+        return true;
+    }
+
+    return gl::VariableSortOrder(x.type) &lt; gl::VariableSortOrder(y.type);
+}
+
+Shader::Data::Data(GLenum shaderType) : mLabel(), mShaderType(shaderType), mShaderVersion(100)
+{
+}
+
+Shader::Data::~Data()
+{
+}
+
+Shader::Shader(ResourceManager *manager,
+               rx::ImplFactory *implFactory,
+               const gl::Limitations &amp;rendererLimitations,
+               GLenum type,
+               GLuint handle)
+    : mData(type),
+      mImplementation(implFactory-&gt;createShader(mData)),
+      mRendererLimitations(rendererLimitations),
+      mHandle(handle),
</ins><span class="cx">       mType(type),
</span><del>-      mHandle(handle),
-      mResourceManager(manager),
</del><span class="cx">       mRefCount(0),
</span><span class="cx">       mDeleteStatus(false),
</span><del>-      mCompiled(false)
</del><ins>+      mCompiled(false),
+      mResourceManager(manager)
</ins><span class="cx"> {
</span><del>-    ASSERT(impl);
</del><ins>+    ASSERT(mImplementation);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Shader::~Shader()
</span><span class="cx"> {
</span><del>-    SafeDelete(mShader);
</del><ins>+    SafeDelete(mImplementation);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Shader::setLabel(const std::string &amp;label)
+{
+    mData.mLabel = label;
+}
+
+const std::string &amp;Shader::getLabel() const
+{
+    return mData.mLabel;
+}
+
</ins><span class="cx"> GLuint Shader::getHandle() const
</span><span class="cx"> {
</span><span class="cx">     return mHandle;
</span><span class="lines">@@ -61,12 +134,17 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mSource = stream.str();
</del><ins>+    mData.mSource = stream.str();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int Shader::getInfoLogLength() const
</span><span class="cx"> {
</span><del>-    return  mShader-&gt;getInfoLog().empty() ? 0 : static_cast&lt;int&gt;(mShader-&gt;getInfoLog().length() + 1);
</del><ins>+    if (mInfoLog.empty())
+    {
+        return 0;
+    }
+
+    return (static_cast&lt;int&gt;(mInfoLog.length()) + 1);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Shader::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
</span><span class="lines">@@ -75,8 +153,8 @@
</span><span class="cx"> 
</span><span class="cx">     if (bufSize &gt; 0)
</span><span class="cx">     {
</span><del>-        index = std::min(bufSize - 1, static_cast&lt;GLsizei&gt;(mShader-&gt;getInfoLog().length()));
-        memcpy(infoLog, mShader-&gt;getInfoLog().c_str(), index);
</del><ins>+        index = std::min(bufSize - 1, static_cast&lt;GLsizei&gt;(mInfoLog.length()));
+        memcpy(infoLog, mInfoLog.c_str(), index);
</ins><span class="cx"> 
</span><span class="cx">         infoLog[index] = '\0';
</span><span class="cx">     }
</span><span class="lines">@@ -89,14 +167,30 @@
</span><span class="cx"> 
</span><span class="cx"> int Shader::getSourceLength() const
</span><span class="cx"> {
</span><del>-    return mSource.empty() ? 0 : static_cast&lt;int&gt;(mSource.length() + 1);
</del><ins>+    return mData.mSource.empty() ? 0 : (static_cast&lt;int&gt;(mData.mSource.length()) + 1);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int Shader::getTranslatedSourceLength() const
</span><span class="cx"> {
</span><del>-    return mShader-&gt;getTranslatedSource().empty() ? 0 : static_cast&lt;int&gt;(mShader-&gt;getTranslatedSource().length() + 1);
</del><ins>+    if (mData.mTranslatedSource.empty())
+    {
+        return 0;
+    }
+
+    return (static_cast&lt;int&gt;(mData.mTranslatedSource.length()) + 1);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+int Shader::getTranslatedSourceWithDebugInfoLength() const
+{
+    const std::string &amp;debugInfo = mImplementation-&gt;getDebugInfo();
+    if (debugInfo.empty())
+    {
+        return 0;
+    }
+
+    return (static_cast&lt;int&gt;(debugInfo.length()) + 1);
+}
+
</ins><span class="cx"> void Shader::getSourceImpl(const std::string &amp;source, GLsizei bufSize, GLsizei *length, char *buffer)
</span><span class="cx"> {
</span><span class="cx">     int index = 0;
</span><span class="lines">@@ -117,23 +211,117 @@
</span><span class="cx"> 
</span><span class="cx"> void Shader::getSource(GLsizei bufSize, GLsizei *length, char *buffer) const
</span><span class="cx"> {
</span><del>-    getSourceImpl(mSource, bufSize, length, buffer);
</del><ins>+    getSourceImpl(mData.mSource, bufSize, length, buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Shader::getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const
</span><span class="cx"> {
</span><del>-    getSourceImpl(mShader-&gt;getTranslatedSource(), bufSize, length, buffer);
</del><ins>+    getSourceImpl(mData.mTranslatedSource, bufSize, length, buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Shader::getTranslatedSourceWithDebugInfo(GLsizei bufSize, GLsizei *length, char *buffer) const
</span><span class="cx"> {
</span><del>-    std::string debugInfo(mShader-&gt;getDebugInfo());
</del><ins>+    const std::string &amp;debugInfo = mImplementation-&gt;getDebugInfo();
</ins><span class="cx">     getSourceImpl(debugInfo, bufSize, length, buffer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Shader::compile(Compiler *compiler)
</span><span class="cx"> {
</span><del>-    mCompiled = mShader-&gt;compile(compiler, mSource);
</del><ins>+    mData.mTranslatedSource.clear();
+    mInfoLog.clear();
+    mData.mShaderVersion = 100;
+    mData.mVaryings.clear();
+    mData.mUniforms.clear();
+    mData.mInterfaceBlocks.clear();
+    mData.mActiveAttributes.clear();
+    mData.mActiveOutputVariables.clear();
+
+    ShHandle compilerHandle = compiler-&gt;getCompilerHandle(mData.mShaderType);
+
+    std::stringstream sourceStream;
+
+    std::string sourcePath;
+    int additionalOptions =
+        mImplementation-&gt;prepareSourceAndReturnOptions(&amp;sourceStream, &amp;sourcePath);
+    int compileOptions    = (SH_OBJECT_CODE | SH_VARIABLES | additionalOptions);
+
+    // Some targets (eg D3D11 Feature Level 9_3 and below) do not support non-constant loop indexes
+    // in fragment shaders. Shader compilation will fail. To provide a better error message we can
+    // instruct the compiler to pre-validate.
+    if (mRendererLimitations.shadersRequireIndexedLoopValidation)
+    {
+        compileOptions |= SH_VALIDATE_LOOP_INDEXING;
+    }
+
+    std::string sourceString  = sourceStream.str();
+    std::vector&lt;const char *&gt; sourceCStrings;
+
+    if (!sourcePath.empty())
+    {
+        sourceCStrings.push_back(sourcePath.c_str());
+    }
+
+    sourceCStrings.push_back(sourceString.c_str());
+
+    bool result =
+        ShCompile(compilerHandle, &amp;sourceCStrings[0], sourceCStrings.size(), compileOptions);
+
+    if (!result)
+    {
+        mInfoLog = ShGetInfoLog(compilerHandle);
+        TRACE(&quot;\n%s&quot;, mInfoLog.c_str());
+        mCompiled = false;
+        return;
+    }
+
+    mData.mTranslatedSource = ShGetObjectCode(compilerHandle);
+
+#ifndef NDEBUG
+    // Prefix translated shader with commented out un-translated shader.
+    // Useful in diagnostics tools which capture the shader source.
+    std::ostringstream shaderStream;
+    shaderStream &lt;&lt; &quot;// GLSL\n&quot;;
+    shaderStream &lt;&lt; &quot;//\n&quot;;
+
+    size_t curPos = 0;
+    while (curPos != std::string::npos)
+    {
+        size_t nextLine = mData.mSource.find(&quot;\n&quot;, curPos);
+        size_t len      = (nextLine == std::string::npos) ? std::string::npos : (nextLine - curPos + 1);
+
+        shaderStream &lt;&lt; &quot;// &quot; &lt;&lt; mData.mSource.substr(curPos, len);
+
+        curPos = (nextLine == std::string::npos) ? std::string::npos : (nextLine + 1);
+    }
+    shaderStream &lt;&lt; &quot;\n\n&quot;;
+    shaderStream &lt;&lt; mData.mTranslatedSource;
+    mData.mTranslatedSource = shaderStream.str();
+#endif
+
+    // Gather the shader information
+    mData.mShaderVersion = ShGetShaderVersion(compilerHandle);
+
+    mData.mVaryings        = GetShaderVariables(ShGetVaryings(compilerHandle));
+    mData.mUniforms        = GetShaderVariables(ShGetUniforms(compilerHandle));
+    mData.mInterfaceBlocks = GetShaderVariables(ShGetInterfaceBlocks(compilerHandle));
+
+    if (mData.mShaderType == GL_VERTEX_SHADER)
+    {
+        mData.mActiveAttributes = GetActiveShaderVariables(ShGetAttributes(compilerHandle));
+    }
+    else
+    {
+        ASSERT(mData.mShaderType == GL_FRAGMENT_SHADER);
+
+        // TODO(jmadill): Figure out why we only sort in the FS, and if we need to.
+        std::sort(mData.mVaryings.begin(), mData.mVaryings.end(), CompareShaderVar);
+        mData.mActiveOutputVariables =
+            GetActiveShaderVariables(ShGetOutputVariables(compilerHandle));
+    }
+
+    ASSERT(!mData.mTranslatedSource.empty());
+
+    mCompiled = mImplementation-&gt;postTranslateCompile(compiler, &amp;mInfoLog);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Shader::addRef()
</span><span class="lines">@@ -166,62 +354,41 @@
</span><span class="cx">     mDeleteStatus = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const std::vector&lt;gl::PackedVarying&gt; &amp;Shader::getVaryings() const
</del><ins>+int Shader::getShaderVersion() const
</ins><span class="cx"> {
</span><del>-    return mShader-&gt;getVaryings();
</del><ins>+    return mData.mShaderVersion;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const std::vector&lt;sh::Varying&gt; &amp;Shader::getVaryings() const
+{
+    return mData.getVaryings();
+}
+
</ins><span class="cx"> const std::vector&lt;sh::Uniform&gt; &amp;Shader::getUniforms() const
</span><span class="cx"> {
</span><del>-    return mShader-&gt;getUniforms();
</del><ins>+    return mData.getUniforms();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const std::vector&lt;sh::InterfaceBlock&gt; &amp;Shader::getInterfaceBlocks() const
</span><span class="cx"> {
</span><del>-    return mShader-&gt;getInterfaceBlocks();
</del><ins>+    return mData.getInterfaceBlocks();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const std::vector&lt;sh::Attribute&gt; &amp;Shader::getActiveAttributes() const
</span><span class="cx"> {
</span><del>-    return mShader-&gt;getActiveAttributes();
</del><ins>+    return mData.getActiveAttributes();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const std::vector&lt;sh::Attribute&gt; &amp;Shader::getActiveOutputVariables() const
</del><ins>+const std::vector&lt;sh::OutputVariable&gt; &amp;Shader::getActiveOutputVariables() const
</ins><span class="cx"> {
</span><del>-    return mShader-&gt;getActiveOutputVariables();
</del><ins>+    return mData.getActiveOutputVariables();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::vector&lt;gl::PackedVarying&gt; &amp;Shader::getVaryings()
-{
-    return mShader-&gt;getVaryings();
-}
-
-std::vector&lt;sh::Uniform&gt; &amp;Shader::getUniforms()
-{
-    return mShader-&gt;getUniforms();
-}
-
-std::vector&lt;sh::InterfaceBlock&gt; &amp;Shader::getInterfaceBlocks()
-{
-    return mShader-&gt;getInterfaceBlocks();
-}
-
-std::vector&lt;sh::Attribute&gt; &amp;Shader::getActiveAttributes()
-{
-    return mShader-&gt;getActiveAttributes();
-}
-
-std::vector&lt;sh::Attribute&gt; &amp;Shader::getActiveOutputVariables()
-{
-    return mShader-&gt;getActiveOutputVariables();
-}
-
-
</del><span class="cx"> int Shader::getSemanticIndex(const std::string &amp;attributeName) const
</span><span class="cx"> {
</span><span class="cx">     if (!attributeName.empty())
</span><span class="cx">     {
</span><del>-        const auto &amp;activeAttributes = mShader-&gt;getActiveAttributes();
</del><ins>+        const auto &amp;activeAttributes = mData.getActiveAttributes();
</ins><span class="cx"> 
</span><span class="cx">         int semanticIndex = 0;
</span><span class="cx">         for (size_t attributeIndex = 0; attributeIndex &lt; activeAttributes.size(); attributeIndex++)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEShaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Shader.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Shader.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Shader.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,49 +21,83 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><ins>+#include &quot;libANGLE/Debug.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+class ImplFactory;
</ins><span class="cx"> class ShaderImpl;
</span><ins>+class ShaderSh;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> class Compiler;
</span><ins>+struct Limitations;
</ins><span class="cx"> class ResourceManager;
</span><span class="cx"> struct Data;
</span><span class="cx"> 
</span><del>-struct PackedVarying : public sh::Varying
</del><ins>+class Shader final : angle::NonCopyable, public LabeledObject
</ins><span class="cx"> {
</span><del>-    unsigned int registerIndex; // Assigned during link
-    unsigned int columnIndex; // Assigned during link, defaults to 0
</del><ins>+  public:
+    class Data final : angle::NonCopyable
+    {
+      public:
+        Data(GLenum shaderType);
+        ~Data();
</ins><span class="cx"> 
</span><del>-    PackedVarying(const sh::Varying &amp;varying)
-      : sh::Varying(varying),
-        registerIndex(GL_INVALID_INDEX),
-        columnIndex(0)
-    {}
</del><ins>+        const std::string &amp;getLabel() const { return mLabel; }
</ins><span class="cx"> 
</span><del>-    bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; }
</del><ins>+        const std::string &amp;getSource() const { return mSource; }
+        const std::string &amp;getTranslatedSource() const { return mTranslatedSource; }
</ins><span class="cx"> 
</span><del>-    void resetRegisterAssignment()
-    {
-        registerIndex = GL_INVALID_INDEX;
-    }
-};
</del><ins>+        GLenum getShaderType() const { return mShaderType; }
+        int getShaderVersion() const { return mShaderVersion; }
</ins><span class="cx"> 
</span><del>-class Shader : angle::NonCopyable
-{
-  public:
-    Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle);
</del><ins>+        const std::vector&lt;sh::Varying&gt; &amp;getVaryings() const { return mVaryings; }
+        const std::vector&lt;sh::Uniform&gt; &amp;getUniforms() const { return mUniforms; }
+        const std::vector&lt;sh::InterfaceBlock&gt; &amp;getInterfaceBlocks() const
+        {
+            return mInterfaceBlocks;
+        }
+        const std::vector&lt;sh::Attribute&gt; &amp;getActiveAttributes() const { return mActiveAttributes; }
+        const std::vector&lt;sh::OutputVariable&gt; &amp;getActiveOutputVariables() const
+        {
+            return mActiveOutputVariables;
+        }
</ins><span class="cx"> 
</span><ins>+      private:
+        friend class Shader;
+
+        std::string mLabel;
+
+        GLenum mShaderType;
+        int mShaderVersion;
+        std::string mTranslatedSource;
+        std::string mSource;
+
+        std::vector&lt;sh::Varying&gt; mVaryings;
+        std::vector&lt;sh::Uniform&gt; mUniforms;
+        std::vector&lt;sh::InterfaceBlock&gt; mInterfaceBlocks;
+        std::vector&lt;sh::Attribute&gt; mActiveAttributes;
+        std::vector&lt;sh::OutputVariable&gt; mActiveOutputVariables;
+    };
+
+    Shader(ResourceManager *manager,
+           rx::ImplFactory *implFactory,
+           const gl::Limitations &amp;rendererLimitations,
+           GLenum type,
+           GLuint handle);
+
</ins><span class="cx">     virtual ~Shader();
</span><span class="cx"> 
</span><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
+
</ins><span class="cx">     GLenum getType() const { return mType; }
</span><span class="cx">     GLuint getHandle() const;
</span><span class="cx"> 
</span><del>-    rx::ShaderImpl *getImplementation() { return mShader; }
-    const rx::ShaderImpl *getImplementation() const { return mShader; }
</del><ins>+    const rx::ShaderImpl *getImplementation() const { return mImplementation; }
</ins><span class="cx"> 
</span><span class="cx">     void deleteSource();
</span><span class="cx">     void setSource(GLsizei count, const char *const *string, const GLint *length);
</span><span class="lines">@@ -72,6 +106,8 @@
</span><span class="cx">     int getSourceLength() const;
</span><span class="cx">     void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
</span><span class="cx">     int getTranslatedSourceLength() const;
</span><ins>+    int getTranslatedSourceWithDebugInfoLength() const;
+    const std::string &amp;getTranslatedSource() const { return mData.getTranslatedSource(); }
</ins><span class="cx">     void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
</span><span class="cx">     void getTranslatedSourceWithDebugInfo(GLsizei bufSize, GLsizei *length, char *buffer) const;
</span><span class="cx"> 
</span><span class="lines">@@ -84,34 +120,33 @@
</span><span class="cx">     bool isFlaggedForDeletion() const;
</span><span class="cx">     void flagForDeletion();
</span><span class="cx"> 
</span><del>-    const std::vector&lt;gl::PackedVarying&gt; &amp;getVaryings() const;
</del><ins>+    int getShaderVersion() const;
+
+    const std::vector&lt;sh::Varying&gt; &amp;getVaryings() const;
</ins><span class="cx">     const std::vector&lt;sh::Uniform&gt; &amp;getUniforms() const;
</span><span class="cx">     const std::vector&lt;sh::InterfaceBlock&gt; &amp;getInterfaceBlocks() const;
</span><span class="cx">     const std::vector&lt;sh::Attribute&gt; &amp;getActiveAttributes() const;
</span><del>-    const std::vector&lt;sh::Attribute&gt; &amp;getActiveOutputVariables() const;
</del><ins>+    const std::vector&lt;sh::OutputVariable&gt; &amp;getActiveOutputVariables() const;
</ins><span class="cx"> 
</span><del>-    std::vector&lt;gl::PackedVarying&gt; &amp;getVaryings();
-    std::vector&lt;sh::Uniform&gt; &amp;getUniforms();
-    std::vector&lt;sh::InterfaceBlock&gt; &amp;getInterfaceBlocks();
-    std::vector&lt;sh::Attribute&gt; &amp;getActiveAttributes();
-    std::vector&lt;sh::Attribute&gt; &amp;getActiveOutputVariables();
-
</del><span class="cx">     int getSemanticIndex(const std::string &amp;attributeName) const;
</span><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     static void getSourceImpl(const std::string &amp;source, GLsizei bufSize, GLsizei *length, char *buffer);
</span><span class="cx"> 
</span><del>-    rx::ShaderImpl *mShader;
</del><ins>+    Data mData;
+    rx::ShaderImpl *mImplementation;
+    const gl::Limitations &amp;mRendererLimitations;
</ins><span class="cx">     const GLuint mHandle;
</span><span class="cx">     const GLenum mType;
</span><del>-    std::string mSource;
</del><span class="cx">     unsigned int mRefCount;     // Number of program objects this shader is attached to
</span><span class="cx">     bool mDeleteStatus;         // Flag to indicate that the shader can be deleted when no longer in use
</span><span class="cx">     bool mCompiled;             // Indicates if this shader has been successfully compiled
</span><ins>+    std::string mInfoLog;
</ins><span class="cx"> 
</span><span class="cx">     ResourceManager *mResourceManager;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+bool CompareShaderVar(const sh::ShaderVariable &amp;x, const sh::ShaderVariable &amp;y);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif   // LIBANGLE_SHADER_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEStatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/State.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/State.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/State.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,8 +8,10 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/State.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/BitSetIterator.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Context.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Caps.h&quot;
</span><ins>+#include &quot;libANGLE/Debug.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Query.h&quot;
</span><span class="lines">@@ -20,9 +22,28 @@
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> State::State()
</span><ins>+    : mMaxDrawBuffers(0),
+      mMaxCombinedTextureImageUnits(0),
+      mDepthClearValue(0),
+      mStencilClearValue(0),
+      mScissorTest(false),
+      mSampleCoverage(false),
+      mSampleCoverageValue(0),
+      mSampleCoverageInvert(false),
+      mStencilRef(0),
+      mStencilBackRef(0),
+      mLineWidth(0),
+      mGenerateMipmapHint(GL_NONE),
+      mFragmentShaderDerivativeHint(GL_NONE),
+      mNearZ(0),
+      mFarZ(0),
+      mReadFramebuffer(nullptr),
+      mDrawFramebuffer(nullptr),
+      mProgram(nullptr),
+      mVertexArray(nullptr),
+      mActiveSampler(0),
+      mPrimitiveRestart(false)
</ins><span class="cx"> {
</span><del>-    mMaxDrawBuffers = 0;
-    mMaxCombinedTextureImageUnits = 0;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> State::~State()
</span><span class="lines">@@ -30,7 +51,10 @@
</span><span class="cx">     reset();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void State::initialize(const Caps &amp;caps, GLuint clientVersion)
</del><ins>+void State::initialize(const Caps &amp;caps,
+                       const Extensions &amp;extensions,
+                       GLuint clientVersion,
+                       bool debug)
</ins><span class="cx"> {
</span><span class="cx">     mMaxDrawBuffers = caps.maxDrawBuffers;
</span><span class="cx">     mMaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
</span><span class="lines">@@ -112,12 +136,7 @@
</span><span class="cx"> 
</span><span class="cx">     mActiveSampler = 0;
</span><span class="cx"> 
</span><del>-    const GLfloat defaultFloatValues[] = { 0.0f, 0.0f, 0.0f, 1.0f };
</del><span class="cx">     mVertexAttribCurrentValues.resize(caps.maxVertexAttributes);
</span><del>-    for (size_t attribIndex = 0; attribIndex &lt; mVertexAttribCurrentValues.size(); ++attribIndex)
-    {
-        mVertexAttribCurrentValues[attribIndex].setFloatValues(defaultFloatValues);
-    }
</del><span class="cx"> 
</span><span class="cx">     mUniformBuffers.resize(caps.maxCombinedUniformBlocks);
</span><span class="cx"> 
</span><span class="lines">@@ -132,16 +151,20 @@
</span><span class="cx"> 
</span><span class="cx">     mSamplers.resize(caps.maxCombinedTextureImageUnits);
</span><span class="cx"> 
</span><del>-    mActiveQueries[GL_ANY_SAMPLES_PASSED].set(NULL);
-    mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(NULL);
-    mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(NULL);
</del><ins>+    mActiveQueries[GL_ANY_SAMPLES_PASSED].set(nullptr);
+    mActiveQueries[GL_ANY_SAMPLES_PASSED_CONSERVATIVE].set(nullptr);
+    mActiveQueries[GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN].set(nullptr);
+    mActiveQueries[GL_TIME_ELAPSED_EXT].set(nullptr);
</ins><span class="cx"> 
</span><del>-    mProgram = NULL;
</del><ins>+    mProgram = nullptr;
</ins><span class="cx"> 
</span><del>-    mReadFramebuffer = NULL;
-    mDrawFramebuffer = NULL;
</del><ins>+    mReadFramebuffer = nullptr;
+    mDrawFramebuffer = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     mPrimitiveRestart = false;
</span><ins>+
+    mDebug.setOutputEnabled(debug);
+    mDebug.setMaxLoggedMessages(extensions.maxDebugLoggedMessages);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::reset()
</span><span class="lines">@@ -188,6 +211,9 @@
</span><span class="cx">     mUnpack.pixelBuffer.set(NULL);
</span><span class="cx"> 
</span><span class="cx">     mProgram = NULL;
</span><ins>+
+    // TODO(jmadill): Is this necessary?
+    setAllDirtyBits();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const RasterizerState &amp;State::getRasterizerState() const
</span><span class="lines">@@ -211,16 +237,19 @@
</span><span class="cx">     mColorClearValue.green = green;
</span><span class="cx">     mColorClearValue.blue = blue;
</span><span class="cx">     mColorClearValue.alpha = alpha;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_CLEAR_COLOR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setDepthClearValue(float depth)
</span><span class="cx"> {
</span><span class="cx">     mDepthClearValue = depth;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_CLEAR_DEPTH);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setStencilClearValue(int stencil)
</span><span class="cx"> {
</span><span class="cx">     mStencilClearValue = stencil;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_CLEAR_STENCIL);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setColorMask(bool red, bool green, bool blue, bool alpha)
</span><span class="lines">@@ -229,11 +258,13 @@
</span><span class="cx">     mBlend.colorMaskGreen = green;
</span><span class="cx">     mBlend.colorMaskBlue = blue;
</span><span class="cx">     mBlend.colorMaskAlpha = alpha;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setDepthMask(bool mask)
</span><span class="cx"> {
</span><span class="cx">     mDepthStencil.depthMask = mask;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_DEPTH_MASK);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool State::isRasterizerDiscardEnabled() const
</span><span class="lines">@@ -244,6 +275,7 @@
</span><span class="cx"> void State::setRasterizerDiscard(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     mRasterizer.rasterizerDiscard = enabled;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool State::isCullFaceEnabled() const
</span><span class="lines">@@ -254,16 +286,19 @@
</span><span class="cx"> void State::setCullFace(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     mRasterizer.cullFace = enabled;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_CULL_FACE_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setCullMode(GLenum mode)
</span><span class="cx"> {
</span><span class="cx">     mRasterizer.cullMode = mode;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_CULL_FACE);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setFrontFace(GLenum front)
</span><span class="cx"> {
</span><span class="cx">     mRasterizer.frontFace = front;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_FRONT_FACE);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool State::isDepthTestEnabled() const
</span><span class="lines">@@ -274,17 +309,20 @@
</span><span class="cx"> void State::setDepthTest(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     mDepthStencil.depthTest = enabled;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_DEPTH_TEST_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setDepthFunc(GLenum depthFunc)
</span><span class="cx"> {
</span><span class="cx">      mDepthStencil.depthFunc = depthFunc;
</span><ins>+     mDirtyBits.set(DIRTY_BIT_DEPTH_FUNC);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setDepthRange(float zNear, float zFar)
</span><span class="cx"> {
</span><span class="cx">     mNearZ = zNear;
</span><span class="cx">     mFarZ = zFar;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_DEPTH_RANGE);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> float State::getNearPlane() const
</span><span class="lines">@@ -305,6 +343,7 @@
</span><span class="cx"> void State::setBlend(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     mBlend.blend = enabled;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha)
</span><span class="lines">@@ -313,6 +352,7 @@
</span><span class="cx">     mBlend.destBlendRGB = destRGB;
</span><span class="cx">     mBlend.sourceBlendAlpha = sourceAlpha;
</span><span class="cx">     mBlend.destBlendAlpha = destAlpha;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setBlendColor(float red, float green, float blue, float alpha)
</span><span class="lines">@@ -321,12 +361,14 @@
</span><span class="cx">     mBlendColor.green = green;
</span><span class="cx">     mBlendColor.blue = blue;
</span><span class="cx">     mBlendColor.alpha = alpha;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setBlendEquation(GLenum rgbEquation, GLenum alphaEquation)
</span><span class="cx"> {
</span><span class="cx">     mBlend.blendEquationRGB = rgbEquation;
</span><span class="cx">     mBlend.blendEquationAlpha = alphaEquation;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_BLEND_EQUATIONS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const ColorF &amp;State::getBlendColor() const
</span><span class="lines">@@ -342,6 +384,7 @@
</span><span class="cx"> void State::setStencilTest(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     mDepthStencil.stencilTest = enabled;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
</span><span class="lines">@@ -349,6 +392,7 @@
</span><span class="cx">     mDepthStencil.stencilFunc = stencilFunc;
</span><span class="cx">     mStencilRef = (stencilRef &gt; 0) ? stencilRef : 0;
</span><span class="cx">     mDepthStencil.stencilMask = stencilMask;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setStencilBackParams(GLenum stencilBackFunc, GLint stencilBackRef, GLuint stencilBackMask)
</span><span class="lines">@@ -356,16 +400,19 @@
</span><span class="cx">     mDepthStencil.stencilBackFunc = stencilBackFunc;
</span><span class="cx">     mStencilBackRef = (stencilBackRef &gt; 0) ? stencilBackRef : 0;
</span><span class="cx">     mDepthStencil.stencilBackMask = stencilBackMask;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setStencilWritemask(GLuint stencilWritemask)
</span><span class="cx"> {
</span><span class="cx">     mDepthStencil.stencilWritemask = stencilWritemask;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setStencilBackWritemask(GLuint stencilBackWritemask)
</span><span class="cx"> {
</span><span class="cx">     mDepthStencil.stencilBackWritemask = stencilBackWritemask;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setStencilOperations(GLenum stencilFail, GLenum stencilPassDepthFail, GLenum stencilPassDepthPass)
</span><span class="lines">@@ -373,6 +420,7 @@
</span><span class="cx">     mDepthStencil.stencilFail = stencilFail;
</span><span class="cx">     mDepthStencil.stencilPassDepthFail = stencilPassDepthFail;
</span><span class="cx">     mDepthStencil.stencilPassDepthPass = stencilPassDepthPass;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setStencilBackOperations(GLenum stencilBackFail, GLenum stencilBackPassDepthFail, GLenum stencilBackPassDepthPass)
</span><span class="lines">@@ -380,6 +428,7 @@
</span><span class="cx">     mDepthStencil.stencilBackFail = stencilBackFail;
</span><span class="cx">     mDepthStencil.stencilBackPassDepthFail = stencilBackPassDepthFail;
</span><span class="cx">     mDepthStencil.stencilBackPassDepthPass = stencilBackPassDepthPass;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLint State::getStencilRef() const
</span><span class="lines">@@ -399,7 +448,8 @@
</span><span class="cx"> 
</span><span class="cx"> void State::setPolygonOffsetFill(bool enabled)
</span><span class="cx"> {
</span><del>-     mRasterizer.polygonOffsetFill = enabled;
</del><ins>+    mRasterizer.polygonOffsetFill = enabled;
+    mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setPolygonOffsetParams(GLfloat factor, GLfloat units)
</span><span class="lines">@@ -407,6 +457,7 @@
</span><span class="cx">     // An application can pass NaN values here, so handle this gracefully
</span><span class="cx">     mRasterizer.polygonOffsetFactor = factor != factor ? 0.0f : factor;
</span><span class="cx">     mRasterizer.polygonOffsetUnits = units != units ? 0.0f : units;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_POLYGON_OFFSET);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool State::isSampleAlphaToCoverageEnabled() const
</span><span class="lines">@@ -417,6 +468,7 @@
</span><span class="cx"> void State::setSampleAlphaToCoverage(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     mBlend.sampleAlphaToCoverage = enabled;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool State::isSampleCoverageEnabled() const
</span><span class="lines">@@ -427,12 +479,14 @@
</span><span class="cx"> void State::setSampleCoverage(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     mSampleCoverage = enabled;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setSampleCoverageParams(GLclampf value, bool invert)
</span><span class="cx"> {
</span><span class="cx">     mSampleCoverageValue = value;
</span><span class="cx">     mSampleCoverageInvert = invert;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_SAMPLE_COVERAGE);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLclampf State::getSampleCoverageValue() const
</span><span class="lines">@@ -453,6 +507,7 @@
</span><span class="cx"> void State::setScissorTest(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     mScissorTest = enabled;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setScissorParams(GLint x, GLint y, GLsizei width, GLsizei height)
</span><span class="lines">@@ -461,6 +516,7 @@
</span><span class="cx">     mScissor.y = y;
</span><span class="cx">     mScissor.width = width;
</span><span class="cx">     mScissor.height = height;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_SCISSOR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const Rectangle &amp;State::getScissor() const
</span><span class="lines">@@ -476,6 +532,7 @@
</span><span class="cx"> void State::setDither(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     mBlend.dither = enabled;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_DITHER_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool State::isPrimitiveRestartEnabled() const
</span><span class="lines">@@ -486,6 +543,7 @@
</span><span class="cx"> void State::setPrimitiveRestart(bool enabled)
</span><span class="cx"> {
</span><span class="cx">     mPrimitiveRestart = enabled;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setEnableFeature(GLenum feature, bool enabled)
</span><span class="lines">@@ -503,6 +561,12 @@
</span><span class="cx">       case GL_DITHER:                        setDither(enabled);                break;
</span><span class="cx">       case GL_PRIMITIVE_RESTART_FIXED_INDEX: setPrimitiveRestart(enabled);      break;
</span><span class="cx">       case GL_RASTERIZER_DISCARD:            setRasterizerDiscard(enabled);     break;
</span><ins>+      case GL_DEBUG_OUTPUT_SYNCHRONOUS:
+          mDebug.setOutputSynchronous(enabled);
+          break;
+      case GL_DEBUG_OUTPUT:
+          mDebug.setOutputEnabled(enabled);
+          break;
</ins><span class="cx">       default:                               UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -522,6 +586,10 @@
</span><span class="cx">       case GL_DITHER:                        return isDitherEnabled();
</span><span class="cx">       case GL_PRIMITIVE_RESTART_FIXED_INDEX: return isPrimitiveRestartEnabled();
</span><span class="cx">       case GL_RASTERIZER_DISCARD:            return isRasterizerDiscardEnabled();
</span><ins>+      case GL_DEBUG_OUTPUT_SYNCHRONOUS:
+          return mDebug.isOutputSynchronous();
+      case GL_DEBUG_OUTPUT:
+          return mDebug.isOutputEnabled();
</ins><span class="cx">       default:                               UNREACHABLE(); return false;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -529,6 +597,7 @@
</span><span class="cx"> void State::setLineWidth(GLfloat width)
</span><span class="cx"> {
</span><span class="cx">     mLineWidth = width;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_LINE_WIDTH);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> float State::getLineWidth() const
</span><span class="lines">@@ -539,11 +608,13 @@
</span><span class="cx"> void State::setGenerateMipmapHint(GLenum hint)
</span><span class="cx"> {
</span><span class="cx">     mGenerateMipmapHint = hint;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_GENERATE_MIPMAP_HINT);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setFragmentShaderDerivativeHint(GLenum hint)
</span><span class="cx"> {
</span><span class="cx">     mFragmentShaderDerivativeHint = hint;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_SHADER_DERIVATIVE_HINT);
</ins><span class="cx">     // TODO: Propagate the hint to shader translator so we can write
</span><span class="cx">     // ddx, ddx_coarse, or ddx_fine depending on the hint.
</span><span class="cx">     // Ignore for now. It is valid for implementations to ignore hint.
</span><span class="lines">@@ -555,6 +626,7 @@
</span><span class="cx">     mViewport.y = y;
</span><span class="cx">     mViewport.width = width;
</span><span class="cx">     mViewport.height = height;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_VIEWPORT);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const Rectangle &amp;State::getViewport() const
</span><span class="lines">@@ -577,10 +649,16 @@
</span><span class="cx">     mSamplerTextures[type][mActiveSampler].set(texture);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Texture *State::getTargetTexture(GLenum target) const
+{
+    return getSamplerTexture(static_cast&lt;unsigned int&gt;(mActiveSampler), target);
+}
+
</ins><span class="cx"> Texture *State::getSamplerTexture(unsigned int sampler, GLenum type) const
</span><span class="cx"> {
</span><span class="cx">     const auto it = mSamplerTextures.find(type);
</span><span class="cx">     ASSERT(it != mSamplerTextures.end());
</span><ins>+    ASSERT(sampler &lt; it-&gt;second.size());
</ins><span class="cx">     return it-&gt;second[sampler].get();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -588,6 +666,7 @@
</span><span class="cx"> {
</span><span class="cx">     const auto it = mSamplerTextures.find(type);
</span><span class="cx">     ASSERT(it != mSamplerTextures.end());
</span><ins>+    ASSERT(sampler &lt; it-&gt;second.size());
</ins><span class="cx">     return it-&gt;second[sampler].id();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -728,22 +807,44 @@
</span><span class="cx"> 
</span><span class="cx"> void State::setReadFramebufferBinding(Framebuffer *framebuffer)
</span><span class="cx"> {
</span><ins>+    if (mReadFramebuffer == framebuffer)
+        return;
+
</ins><span class="cx">     mReadFramebuffer = framebuffer;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
+
+    if (mReadFramebuffer &amp;&amp; mReadFramebuffer-&gt;hasAnyDirtyBit())
+    {
+        mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setDrawFramebufferBinding(Framebuffer *framebuffer)
</span><span class="cx"> {
</span><ins>+    if (mDrawFramebuffer == framebuffer)
+        return;
+
</ins><span class="cx">     mDrawFramebuffer = framebuffer;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING);
+
+    if (mDrawFramebuffer &amp;&amp; mDrawFramebuffer-&gt;hasAnyDirtyBit())
+    {
+        mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Framebuffer *State::getTargetFramebuffer(GLenum target) const
</span><span class="cx"> {
</span><span class="cx">     switch (target)
</span><span class="cx">     {
</span><del>-    case GL_READ_FRAMEBUFFER_ANGLE:  return mReadFramebuffer;
-    case GL_DRAW_FRAMEBUFFER_ANGLE:
-    case GL_FRAMEBUFFER:             return mDrawFramebuffer;
-    default:                         UNREACHABLE(); return NULL;
</del><ins>+        case GL_READ_FRAMEBUFFER_ANGLE:
+            return mReadFramebuffer;
+        case GL_DRAW_FRAMEBUFFER_ANGLE:
+        case GL_FRAMEBUFFER:
+            return mDrawFramebuffer;
+        default:
+            UNREACHABLE();
+            return NULL;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -772,7 +873,7 @@
</span><span class="cx">     if (mReadFramebuffer != nullptr &amp;&amp;
</span><span class="cx">         mReadFramebuffer-&gt;id() == framebuffer)
</span><span class="cx">     {
</span><del>-        mReadFramebuffer = NULL;
</del><ins>+        setReadFramebufferBinding(nullptr);
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -784,7 +885,7 @@
</span><span class="cx">     if (mReadFramebuffer != nullptr &amp;&amp;
</span><span class="cx">         mDrawFramebuffer-&gt;id() == framebuffer)
</span><span class="cx">     {
</span><del>-        mDrawFramebuffer = NULL;
</del><ins>+        setDrawFramebufferBinding(nullptr);
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -794,6 +895,12 @@
</span><span class="cx"> void State::setVertexArrayBinding(VertexArray *vertexArray)
</span><span class="cx"> {
</span><span class="cx">     mVertexArray = vertexArray;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
+
+    if (mVertexArray &amp;&amp; mVertexArray-&gt;hasAnyDirtyBit())
+    {
+        mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLuint State::getVertexArrayId() const
</span><span class="lines">@@ -813,6 +920,8 @@
</span><span class="cx">     if (mVertexArray-&gt;id() == vertexArray)
</span><span class="cx">     {
</span><span class="cx">         mVertexArray = NULL;
</span><ins>+        mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
+        mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -868,10 +977,9 @@
</span><span class="cx"> 
</span><span class="cx"> bool State::isQueryActive() const
</span><span class="cx"> {
</span><del>-    for (State::ActiveQueryMap::const_iterator i = mActiveQueries.begin();
-        i != mActiveQueries.end(); i++)
</del><ins>+    for (auto &amp;iter : mActiveQueries)
</ins><span class="cx">     {
</span><del>-        if (i-&gt;second.get() != NULL)
</del><ins>+        if (iter.second.get() != NULL)
</ins><span class="cx">         {
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="lines">@@ -880,6 +988,19 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool State::isQueryActive(Query *query) const
+{
+    for (auto &amp;iter : mActiveQueries)
+    {
+        if (iter.second.get() == query)
+        {
+            return true;
+        }
+    }
+
+    return false;
+}
+
</ins><span class="cx"> void State::setActiveQuery(GLenum target, Query *query)
</span><span class="cx"> {
</span><span class="cx">     mActiveQueries[target].set(query);
</span><span class="lines">@@ -911,17 +1032,6 @@
</span><span class="cx">     return mArrayBuffer.id();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool State::removeArrayBufferBinding(GLuint buffer)
-{
-    if (mArrayBuffer.id() == buffer)
-    {
-        mArrayBuffer.set(NULL);
-        return true;
-    }
-
-    return false;
-}
-
</del><span class="cx"> void State::setGenericUniformBufferBinding(Buffer *buffer)
</span><span class="cx"> {
</span><span class="cx">     mGenericUniformBuffer.set(buffer);
</span><span class="lines">@@ -932,34 +1042,12 @@
</span><span class="cx">     mUniformBuffers[index].set(buffer, offset, size);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLuint State::getIndexedUniformBufferId(GLuint index) const
</del><ins>+const OffsetBindingPointer&lt;Buffer&gt; &amp;State::getIndexedUniformBuffer(size_t index) const
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(static_cast&lt;size_t&gt;(index) &lt; mUniformBuffers.size());
</span><del>-
-    return mUniformBuffers[index].id();
</del><ins>+    return mUniformBuffers[index];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Buffer *State::getIndexedUniformBuffer(GLuint index) const
-{
-    ASSERT(static_cast&lt;size_t&gt;(index) &lt; mUniformBuffers.size());
-
-    return mUniformBuffers[index].get();
-}
-
-GLintptr State::getIndexedUniformBufferOffset(GLuint index) const
-{
-    ASSERT(static_cast&lt;size_t&gt;(index) &lt; mUniformBuffers.size());
-
-    return mUniformBuffers[index].getOffset();
-}
-
-GLsizeiptr State::getIndexedUniformBufferSize(GLuint index) const
-{
-    ASSERT(static_cast&lt;size_t&gt;(index) &lt; mUniformBuffers.size());
-
-    return mUniformBuffers[index].getSize();
-}
-
</del><span class="cx"> void State::setCopyReadBufferBinding(Buffer *buffer)
</span><span class="cx"> {
</span><span class="cx">     mCopyReadBuffer.set(buffer);
</span><span class="lines">@@ -987,7 +1075,7 @@
</span><span class="cx">       case GL_ARRAY_BUFFER:              return mArrayBuffer.get();
</span><span class="cx">       case GL_COPY_READ_BUFFER:          return mCopyReadBuffer.get();
</span><span class="cx">       case GL_COPY_WRITE_BUFFER:         return mCopyWriteBuffer.get();
</span><del>-      case GL_ELEMENT_ARRAY_BUFFER:      return getVertexArray()-&gt;getElementArrayBuffer();
</del><ins>+      case GL_ELEMENT_ARRAY_BUFFER:      return getVertexArray()-&gt;getElementArrayBuffer().get();
</ins><span class="cx">       case GL_PIXEL_PACK_BUFFER:         return mPack.pixelBuffer.get();
</span><span class="cx">       case GL_PIXEL_UNPACK_BUFFER:       return mUnpack.pixelBuffer.get();
</span><span class="cx">       case GL_TRANSFORM_FEEDBACK_BUFFER: return mTransformFeedback-&gt;getGenericBuffer().get();
</span><span class="lines">@@ -996,35 +1084,74 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void State::detachBuffer(GLuint bufferName)
+{
+    BindingPointer&lt;Buffer&gt; *buffers[] = {&amp;mArrayBuffer,        &amp;mCopyReadBuffer,
+                                         &amp;mCopyWriteBuffer,    &amp;mPack.pixelBuffer,
+                                         &amp;mUnpack.pixelBuffer, &amp;mGenericUniformBuffer};
+    for (auto buffer : buffers)
+    {
+        if (buffer-&gt;id() == bufferName)
+        {
+            buffer-&gt;set(nullptr);
+        }
+    }
+
+    TransformFeedback *curTransformFeedback = getCurrentTransformFeedback();
+    if (curTransformFeedback)
+    {
+        curTransformFeedback-&gt;detachBuffer(bufferName);
+    }
+
+    getVertexArray()-&gt;detachBuffer(bufferName);
+}
+
</ins><span class="cx"> void State::setEnableVertexAttribArray(unsigned int attribNum, bool enabled)
</span><span class="cx"> {
</span><span class="cx">     getVertexArray()-&gt;enableAttribute(attribNum, enabled);
</span><ins>+    mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setVertexAttribf(GLuint index, const GLfloat values[4])
</span><span class="cx"> {
</span><span class="cx">     ASSERT(static_cast&lt;size_t&gt;(index) &lt; mVertexAttribCurrentValues.size());
</span><span class="cx">     mVertexAttribCurrentValues[index].setFloatValues(values);
</span><ins>+    mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setVertexAttribu(GLuint index, const GLuint values[4])
</span><span class="cx"> {
</span><span class="cx">     ASSERT(static_cast&lt;size_t&gt;(index) &lt; mVertexAttribCurrentValues.size());
</span><span class="cx">     mVertexAttribCurrentValues[index].setUnsignedIntValues(values);
</span><ins>+    mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void State::setVertexAttribi(GLuint index, const GLint values[4])
</span><span class="cx"> {
</span><span class="cx">     ASSERT(static_cast&lt;size_t&gt;(index) &lt; mVertexAttribCurrentValues.size());
</span><span class="cx">     mVertexAttribCurrentValues[index].setIntValues(values);
</span><ins>+    mDirtyBits.set(DIRTY_BIT_CURRENT_VALUE_0 + index);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void State::setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type, bool normalized,
-    bool pureInteger, GLsizei stride, const void *pointer)
</del><ins>+void State::setVertexAttribState(unsigned int attribNum,
+                                 Buffer *boundBuffer,
+                                 GLint size,
+                                 GLenum type,
+                                 bool normalized,
+                                 bool pureInteger,
+                                 GLsizei stride,
+                                 const void *pointer)
</ins><span class="cx"> {
</span><span class="cx">     getVertexArray()-&gt;setAttributeState(attribNum, boundBuffer, size, type, normalized, pureInteger, stride, pointer);
</span><ins>+    mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void State::setVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+    getVertexArray()-&gt;setVertexAttribDivisor(index, divisor);
+    mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
+}
+
</ins><span class="cx"> const VertexAttribCurrentValueData &amp;State::getVertexAttribCurrentValue(unsigned int attribNum) const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(static_cast&lt;size_t&gt;(attribNum) &lt; mVertexAttribCurrentValues.size());
</span><span class="lines">@@ -1039,6 +1166,7 @@
</span><span class="cx"> void State::setPackAlignment(GLint alignment)
</span><span class="cx"> {
</span><span class="cx">     mPack.alignment = alignment;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_PACK_ALIGNMENT);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLint State::getPackAlignment() const
</span><span class="lines">@@ -1049,6 +1177,7 @@
</span><span class="cx"> void State::setPackReverseRowOrder(bool reverseRowOrder)
</span><span class="cx"> {
</span><span class="cx">     mPack.reverseRowOrder = reverseRowOrder;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool State::getPackReverseRowOrder() const
</span><span class="lines">@@ -1056,6 +1185,39 @@
</span><span class="cx">     return mPack.reverseRowOrder;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void State::setPackRowLength(GLint rowLength)
+{
+    mPack.rowLength = rowLength;
+    mDirtyBits.set(DIRTY_BIT_PACK_ROW_LENGTH);
+}
+
+GLint State::getPackRowLength() const
+{
+    return mPack.rowLength;
+}
+
+void State::setPackSkipRows(GLint skipRows)
+{
+    mPack.skipRows = skipRows;
+    mDirtyBits.set(DIRTY_BIT_PACK_SKIP_ROWS);
+}
+
+GLint State::getPackSkipRows() const
+{
+    return mPack.skipRows;
+}
+
+void State::setPackSkipPixels(GLint skipPixels)
+{
+    mPack.skipPixels = skipPixels;
+    mDirtyBits.set(DIRTY_BIT_PACK_SKIP_PIXELS);
+}
+
+GLint State::getPackSkipPixels() const
+{
+    return mPack.skipPixels;
+}
+
</ins><span class="cx"> const PixelPackState &amp;State::getPackState() const
</span><span class="cx"> {
</span><span class="cx">     return mPack;
</span><span class="lines">@@ -1069,6 +1231,7 @@
</span><span class="cx"> void State::setUnpackAlignment(GLint alignment)
</span><span class="cx"> {
</span><span class="cx">     mUnpack.alignment = alignment;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_UNPACK_ALIGNMENT);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLint State::getUnpackAlignment() const
</span><span class="lines">@@ -1079,6 +1242,7 @@
</span><span class="cx"> void State::setUnpackRowLength(GLint rowLength)
</span><span class="cx"> {
</span><span class="cx">     mUnpack.rowLength = rowLength;
</span><ins>+    mDirtyBits.set(DIRTY_BIT_UNPACK_ROW_LENGTH);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLint State::getUnpackRowLength() const
</span><span class="lines">@@ -1086,6 +1250,50 @@
</span><span class="cx">     return mUnpack.rowLength;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void State::setUnpackImageHeight(GLint imageHeight)
+{
+    mUnpack.imageHeight = imageHeight;
+    mDirtyBits.set(DIRTY_BIT_UNPACK_IMAGE_HEIGHT);
+}
+
+GLint State::getUnpackImageHeight() const
+{
+    return mUnpack.imageHeight;
+}
+
+void State::setUnpackSkipImages(GLint skipImages)
+{
+    mUnpack.skipImages = skipImages;
+    mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_IMAGES);
+}
+
+GLint State::getUnpackSkipImages() const
+{
+    return mUnpack.skipImages;
+}
+
+void State::setUnpackSkipRows(GLint skipRows)
+{
+    mUnpack.skipRows = skipRows;
+    mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_ROWS);
+}
+
+GLint State::getUnpackSkipRows() const
+{
+    return mUnpack.skipRows;
+}
+
+void State::setUnpackSkipPixels(GLint skipPixels)
+{
+    mUnpack.skipPixels = skipPixels;
+    mDirtyBits.set(DIRTY_BIT_UNPACK_SKIP_PIXELS);
+}
+
+GLint State::getUnpackSkipPixels() const
+{
+    return mUnpack.skipPixels;
+}
+
</ins><span class="cx"> const PixelUnpackState &amp;State::getUnpackState() const
</span><span class="cx"> {
</span><span class="cx">     return mUnpack;
</span><span class="lines">@@ -1096,6 +1304,16 @@
</span><span class="cx">     return mUnpack;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const Debug &amp;State::getDebug() const
+{
+    return mDebug;
+}
+
+Debug &amp;State::getDebug()
+{
+    return mDebug;
+}
+
</ins><span class="cx"> void State::getBooleanv(GLenum pname, GLboolean *params)
</span><span class="cx"> {
</span><span class="cx">     switch (pname)
</span><span class="lines">@@ -1119,6 +1337,18 @@
</span><span class="cx">       case GL_DITHER:                    *params = mBlend.dither;                 break;
</span><span class="cx">       case GL_TRANSFORM_FEEDBACK_ACTIVE: *params = getCurrentTransformFeedback()-&gt;isActive() ? GL_TRUE : GL_FALSE; break;
</span><span class="cx">       case GL_TRANSFORM_FEEDBACK_PAUSED: *params = getCurrentTransformFeedback()-&gt;isPaused() ? GL_TRUE : GL_FALSE; break;
</span><ins>+      case GL_PRIMITIVE_RESTART_FIXED_INDEX:
+          *params = mPrimitiveRestart;
+          break;
+      case GL_RASTERIZER_DISCARD:
+          *params = isRasterizerDiscardEnabled() ? GL_TRUE : GL_FALSE;
+          break;
+      case GL_DEBUG_OUTPUT_SYNCHRONOUS:
+          *params = mDebug.isOutputSynchronous() ? GL_TRUE : GL_FALSE;
+          break;
+      case GL_DEBUG_OUTPUT:
+          *params = mDebug.isOutputEnabled() ? GL_TRUE : GL_FALSE;
+          break;
</ins><span class="cx">       default:
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">         break;
</span><span class="lines">@@ -1179,7 +1409,7 @@
</span><span class="cx">     switch (pname)
</span><span class="cx">     {
</span><span class="cx">       case GL_ARRAY_BUFFER_BINDING:                     *params = mArrayBuffer.id();                              break;
</span><del>-      case GL_ELEMENT_ARRAY_BUFFER_BINDING:             *params = getVertexArray()-&gt;getElementArrayBufferId();    break;
</del><ins>+      case GL_ELEMENT_ARRAY_BUFFER_BINDING:             *params = getVertexArray()-&gt;getElementArrayBuffer().id(); break;
</ins><span class="cx">         //case GL_FRAMEBUFFER_BINDING:                    // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
</span><span class="cx">       case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:           *params = mDrawFramebuffer-&gt;id();                         break;
</span><span class="cx">       case GL_READ_FRAMEBUFFER_BINDING_ANGLE:           *params = mReadFramebuffer-&gt;id();                         break;
</span><span class="lines">@@ -1188,11 +1418,34 @@
</span><span class="cx">       case GL_CURRENT_PROGRAM:                          *params = mProgram ? mProgram-&gt;id() : 0;                  break;
</span><span class="cx">       case GL_PACK_ALIGNMENT:                           *params = mPack.alignment;                                break;
</span><span class="cx">       case GL_PACK_REVERSE_ROW_ORDER_ANGLE:             *params = mPack.reverseRowOrder;                          break;
</span><ins>+      case GL_PACK_ROW_LENGTH:
+          *params = mPack.rowLength;
+          break;
+      case GL_PACK_SKIP_ROWS:
+          *params = mPack.skipRows;
+          break;
+      case GL_PACK_SKIP_PIXELS:
+          *params = mPack.skipPixels;
+          break;
</ins><span class="cx">       case GL_UNPACK_ALIGNMENT:                         *params = mUnpack.alignment;                              break;
</span><span class="cx">       case GL_UNPACK_ROW_LENGTH:                        *params = mUnpack.rowLength;                              break;
</span><ins>+      case GL_UNPACK_IMAGE_HEIGHT:
+          *params = mUnpack.imageHeight;
+          break;
+      case GL_UNPACK_SKIP_IMAGES:
+          *params = mUnpack.skipImages;
+          break;
+      case GL_UNPACK_SKIP_ROWS:
+          *params = mUnpack.skipRows;
+          break;
+      case GL_UNPACK_SKIP_PIXELS:
+          *params = mUnpack.skipPixels;
+          break;
</ins><span class="cx">       case GL_GENERATE_MIPMAP_HINT:                     *params = mGenerateMipmapHint;                            break;
</span><span class="cx">       case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:      *params = mFragmentShaderDerivativeHint;                  break;
</span><del>-      case GL_ACTIVE_TEXTURE:                           *params = static_cast&lt;GLint&gt;(mActiveSampler + GL_TEXTURE0);     break;
</del><ins>+      case GL_ACTIVE_TEXTURE:
+          *params = (static_cast&lt;GLint&gt;(mActiveSampler) + GL_TEXTURE0);
+          break;
</ins><span class="cx">       case GL_STENCIL_FUNC:                             *params = mDepthStencil.stencilFunc;                      break;
</span><span class="cx">       case GL_STENCIL_REF:                              *params = mStencilRef;                                    break;
</span><span class="cx">       case GL_STENCIL_VALUE_MASK:                       *params = clampToInt(mDepthStencil.stencilMask);          break;
</span><span class="lines">@@ -1316,11 +1569,12 @@
</span><span class="cx">         break;
</span><span class="cx">       case GL_TEXTURE_BINDING_2D:
</span><span class="cx">         ASSERT(mActiveSampler &lt; mMaxCombinedTextureImageUnits);
</span><del>-        *params = getSamplerTextureId(static_cast&lt;unsigned int&gt;(mActiveSampler), GL_TEXTURE_2D) ;
</del><ins>+        *params = getSamplerTextureId(static_cast&lt;unsigned int&gt;(mActiveSampler), GL_TEXTURE_2D);
</ins><span class="cx">         break;
</span><span class="cx">       case GL_TEXTURE_BINDING_CUBE_MAP:
</span><span class="cx">         ASSERT(mActiveSampler &lt; mMaxCombinedTextureImageUnits);
</span><del>-        *params = getSamplerTextureId(static_cast&lt;unsigned int&gt;(mActiveSampler), GL_TEXTURE_CUBE_MAP);
</del><ins>+        *params =
+            getSamplerTextureId(static_cast&lt;unsigned int&gt;(mActiveSampler), GL_TEXTURE_CUBE_MAP);
</ins><span class="cx">         break;
</span><span class="cx">       case GL_TEXTURE_BINDING_3D:
</span><span class="cx">         ASSERT(mActiveSampler &lt; mMaxCombinedTextureImageUnits);
</span><span class="lines">@@ -1328,11 +1582,15 @@
</span><span class="cx">         break;
</span><span class="cx">       case GL_TEXTURE_BINDING_2D_ARRAY:
</span><span class="cx">         ASSERT(mActiveSampler &lt; mMaxCombinedTextureImageUnits);
</span><del>-        *params = getSamplerTextureId(static_cast&lt;unsigned int&gt;(mActiveSampler), GL_TEXTURE_2D_ARRAY);
</del><ins>+        *params =
+            getSamplerTextureId(static_cast&lt;unsigned int&gt;(mActiveSampler), GL_TEXTURE_2D_ARRAY);
</ins><span class="cx">         break;
</span><span class="cx">       case GL_UNIFORM_BUFFER_BINDING:
</span><span class="cx">         *params = mGenericUniformBuffer.id();
</span><span class="cx">         break;
</span><ins>+      case GL_TRANSFORM_FEEDBACK_BINDING:
+        *params = mTransformFeedback.id();
+        break;
</ins><span class="cx">       case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
</span><span class="cx">         *params = mTransformFeedback-&gt;getGenericBuffer().id();
</span><span class="cx">         break;
</span><span class="lines">@@ -1348,12 +1606,44 @@
</span><span class="cx">       case GL_PIXEL_UNPACK_BUFFER_BINDING:
</span><span class="cx">         *params = mUnpack.pixelBuffer.id();
</span><span class="cx">         break;
</span><ins>+      case GL_READ_BUFFER:
+          *params = mReadFramebuffer-&gt;getReadBufferState();
+          break;
+      case GL_SAMPLER_BINDING:
+          ASSERT(mActiveSampler &lt; mMaxCombinedTextureImageUnits);
+          *params = getSamplerId(static_cast&lt;GLuint&gt;(mActiveSampler));
+          break;
+      case GL_DEBUG_LOGGED_MESSAGES:
+          *params = static_cast&lt;GLint&gt;(mDebug.getMessageCount());
+          break;
+      case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
+          *params = static_cast&lt;GLint&gt;(mDebug.getNextMessageLength());
+          break;
+      case GL_DEBUG_GROUP_STACK_DEPTH:
+          *params = static_cast&lt;GLint&gt;(mDebug.getGroupStackDepth());
+          break;
</ins><span class="cx">       default:
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void State::getPointerv(GLenum pname, void **params) const
+{
+    switch (pname)
+    {
+        case GL_DEBUG_CALLBACK_FUNCTION:
+            *params = reinterpret_cast&lt;void *&gt;(mDebug.getCallback());
+            break;
+        case GL_DEBUG_CALLBACK_USER_PARAM:
+            *params = const_cast&lt;void *&gt;(mDebug.getUserParam());
+            break;
+        default:
+            UNREACHABLE();
+            break;
+    }
+}
+
</ins><span class="cx"> bool State::getIndexedIntegerv(GLenum target, GLuint index, GLint *data)
</span><span class="cx"> {
</span><span class="cx">     switch (target)
</span><span class="lines">@@ -1418,7 +1708,7 @@
</span><span class="cx">     {
</span><span class="cx">         const VertexArray *vao = getVertexArray();
</span><span class="cx">         const auto &amp;vertexAttribs = vao-&gt;getVertexAttributes();
</span><del>-        unsigned int maxEnabledAttrib = vao-&gt;getMaxEnabledAttribute();
</del><ins>+        size_t maxEnabledAttrib = vao-&gt;getMaxEnabledAttribute();
</ins><span class="cx">         for (size_t attribIndex = 0; attribIndex &lt; maxEnabledAttrib; attribIndex++)
</span><span class="cx">         {
</span><span class="cx">             const gl::VertexAttribute &amp;vertexAttrib = vertexAttribs[attribIndex];
</span><span class="lines">@@ -1438,4 +1728,92 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void State::syncDirtyObjects()
+{
+    if (!mDirtyObjects.any())
+        return;
+
+    syncDirtyObjects(mDirtyObjects);
</ins><span class="cx"> }
</span><ins>+
+void State::syncDirtyObjects(const DirtyObjects &amp;bitset)
+{
+    for (auto dirtyObject : angle::IterateBitSet(bitset))
+    {
+        switch (dirtyObject)
+        {
+            case DIRTY_OBJECT_READ_FRAMEBUFFER:
+                ASSERT(mReadFramebuffer);
+                mReadFramebuffer-&gt;syncState();
+                break;
+            case DIRTY_OBJECT_DRAW_FRAMEBUFFER:
+                ASSERT(mDrawFramebuffer);
+                mDrawFramebuffer-&gt;syncState();
+                break;
+            case DIRTY_OBJECT_VERTEX_ARRAY:
+                ASSERT(mVertexArray);
+                mVertexArray-&gt;syncImplState();
+                break;
+            case DIRTY_OBJECT_PROGRAM:
+                // TODO(jmadill): implement this
+                break;
+            default:
+                UNREACHABLE();
+                break;
+        }
+    }
+
+    mDirtyObjects &amp;= ~bitset;
+}
+
+void State::syncDirtyObject(GLenum target)
+{
+    DirtyObjects localSet;
+
+    switch (target)
+    {
+        case GL_READ_FRAMEBUFFER:
+            localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
+            break;
+        case GL_DRAW_FRAMEBUFFER:
+            localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
+            break;
+        case GL_FRAMEBUFFER:
+            localSet.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
+            localSet.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
+            break;
+        case GL_VERTEX_ARRAY:
+            localSet.set(DIRTY_OBJECT_VERTEX_ARRAY);
+            break;
+        case GL_PROGRAM:
+            localSet.set(DIRTY_OBJECT_PROGRAM);
+            break;
+    }
+
+    syncDirtyObjects(localSet);
+}
+
+void State::setObjectDirty(GLenum target)
+{
+    switch (target)
+    {
+        case GL_READ_FRAMEBUFFER:
+            mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
+            break;
+        case GL_DRAW_FRAMEBUFFER:
+            mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
+            break;
+        case GL_FRAMEBUFFER:
+            mDirtyObjects.set(DIRTY_OBJECT_READ_FRAMEBUFFER);
+            mDirtyObjects.set(DIRTY_OBJECT_DRAW_FRAMEBUFFER);
+            break;
+        case GL_VERTEX_ARRAY:
+            mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
+            break;
+        case GL_PROGRAM:
+            mDirtyObjects.set(DIRTY_OBJECT_PROGRAM);
+            break;
+    }
+}
+
+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEStateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/State.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/State.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/State.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,15 +9,19 @@
</span><span class="cx"> #ifndef LIBANGLE_STATE_H_
</span><span class="cx"> #define LIBANGLE_STATE_H_
</span><span class="cx"> 
</span><ins>+#include &lt;bitset&gt;
+#include &lt;memory&gt;
+
</ins><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><ins>+#include &quot;libANGLE/Debug.h&quot;
+#include &quot;libANGLE/Program.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/RefCountObject.h&quot;
</span><del>-#include &quot;libANGLE/angletypes.h&quot;
-#include &quot;libANGLE/VertexAttribute.h&quot;
</del><span class="cx"> #include &quot;libANGLE/Renderbuffer.h&quot;
</span><ins>+#include &quot;libANGLE/Sampler.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Texture.h&quot;
</span><span class="cx"> #include &quot;libANGLE/TransformFeedback.h&quot;
</span><del>-#include &quot;libANGLE/Program.h&quot;
-#include &quot;libANGLE/Sampler.h&quot;
</del><ins>+#include &quot;libANGLE/VertexAttribute.h&quot;
+#include &quot;libANGLE/angletypes.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="lines">@@ -27,7 +31,7 @@
</span><span class="cx"> struct Caps;
</span><span class="cx"> struct Data;
</span><span class="cx"> 
</span><del>-typedef std::map&lt; GLenum, BindingPointer&lt;Texture&gt; &gt; TextureMap;
</del><ins>+typedef std::map&lt;GLenum, BindingPointer&lt;Texture&gt;&gt; TextureMap;
</ins><span class="cx"> 
</span><span class="cx"> class State : angle::NonCopyable
</span><span class="cx"> {
</span><span class="lines">@@ -35,7 +39,10 @@
</span><span class="cx">     State();
</span><span class="cx">     ~State();
</span><span class="cx"> 
</span><del>-    void initialize(const Caps&amp; caps, GLuint clientVersion);
</del><ins>+    void initialize(const Caps &amp;caps,
+                    const Extensions &amp;extensions,
+                    GLuint clientVersion,
+                    bool debug);
</ins><span class="cx">     void reset();
</span><span class="cx"> 
</span><span class="cx">     // State chunk getters
</span><span class="lines">@@ -142,6 +149,7 @@
</span><span class="cx">     void setActiveSampler(unsigned int active);
</span><span class="cx">     unsigned int getActiveSampler() const;
</span><span class="cx">     void setSamplerTexture(GLenum type, Texture *texture);
</span><ins>+    Texture *getTargetTexture(GLenum target) const;
</ins><span class="cx">     Texture *getSamplerTexture(unsigned int sampler, GLenum type) const;
</span><span class="cx">     GLuint getSamplerTextureId(unsigned int sampler, GLenum type) const;
</span><span class="cx">     void detachTexture(const TextureMap &amp;zeroTextures, GLuint texture);
</span><span class="lines">@@ -188,6 +196,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Query binding manipulation
</span><span class="cx">     bool isQueryActive() const;
</span><ins>+    bool isQueryActive(Query *query) const;
</ins><span class="cx">     void setActiveQuery(GLenum target, Query *query);
</span><span class="cx">     GLuint getActiveQueryId(GLenum target) const;
</span><span class="cx">     Query *getActiveQuery(GLenum target) const;
</span><span class="lines">@@ -196,15 +205,11 @@
</span><span class="cx">     // GL_ARRAY_BUFFER
</span><span class="cx">     void setArrayBufferBinding(Buffer *buffer);
</span><span class="cx">     GLuint getArrayBufferId() const;
</span><del>-    bool removeArrayBufferBinding(GLuint buffer);
</del><span class="cx"> 
</span><span class="cx">     // GL_UNIFORM_BUFFER - Both indexed and generic targets
</span><span class="cx">     void setGenericUniformBufferBinding(Buffer *buffer);
</span><span class="cx">     void setIndexedUniformBufferBinding(GLuint index, Buffer *buffer, GLintptr offset, GLsizeiptr size);
</span><del>-    GLuint getIndexedUniformBufferId(GLuint index) const;
-    Buffer *getIndexedUniformBuffer(GLuint index) const;
-    GLintptr getIndexedUniformBufferOffset(GLuint index) const;
-    GLsizeiptr getIndexedUniformBufferSize(GLuint index) const;
</del><ins>+    const OffsetBindingPointer&lt;Buffer&gt; &amp;getIndexedUniformBuffer(size_t index) const;
</ins><span class="cx"> 
</span><span class="cx">     // GL_COPY_[READ/WRITE]_BUFFER
</span><span class="cx">     void setCopyReadBufferBinding(Buffer *buffer);
</span><span class="lines">@@ -216,6 +221,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Retrieve typed buffer by target (non-indexed)
</span><span class="cx">     Buffer *getTargetBuffer(GLenum target) const;
</span><ins>+    // Detach a buffer from all bindings
+    void detachBuffer(GLuint bufferName);
</ins><span class="cx"> 
</span><span class="cx">     // Vertex attrib manipulation
</span><span class="cx">     void setEnableVertexAttribArray(unsigned int attribNum, bool enabled);
</span><span class="lines">@@ -224,6 +231,7 @@
</span><span class="cx">     void setVertexAttribi(GLuint index, const GLint values[4]);
</span><span class="cx">     void setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type,
</span><span class="cx">                               bool normalized, bool pureInteger, GLsizei stride, const void *pointer);
</span><ins>+    void setVertexAttribDivisor(GLuint index, GLuint divisor);
</ins><span class="cx">     const VertexAttribCurrentValueData &amp;getVertexAttribCurrentValue(unsigned int attribNum) const;
</span><span class="cx">     const void *getVertexAttribPointer(unsigned int attribNum) const;
</span><span class="cx"> 
</span><span class="lines">@@ -232,6 +240,12 @@
</span><span class="cx">     GLint getPackAlignment() const;
</span><span class="cx">     void setPackReverseRowOrder(bool reverseRowOrder);
</span><span class="cx">     bool getPackReverseRowOrder() const;
</span><ins>+    void setPackRowLength(GLint rowLength);
+    GLint getPackRowLength() const;
+    void setPackSkipRows(GLint skipRows);
+    GLint getPackSkipRows() const;
+    void setPackSkipPixels(GLint skipPixels);
+    GLint getPackSkipPixels() const;
</ins><span class="cx">     const PixelPackState &amp;getPackState() const;
</span><span class="cx">     PixelPackState &amp;getPackState();
</span><span class="cx"> 
</span><span class="lines">@@ -240,18 +254,116 @@
</span><span class="cx">     GLint getUnpackAlignment() const;
</span><span class="cx">     void setUnpackRowLength(GLint rowLength);
</span><span class="cx">     GLint getUnpackRowLength() const;
</span><ins>+    void setUnpackImageHeight(GLint imageHeight);
+    GLint getUnpackImageHeight() const;
+    void setUnpackSkipImages(GLint skipImages);
+    GLint getUnpackSkipImages() const;
+    void setUnpackSkipRows(GLint skipRows);
+    GLint getUnpackSkipRows() const;
+    void setUnpackSkipPixels(GLint skipPixels);
+    GLint getUnpackSkipPixels() const;
</ins><span class="cx">     const PixelUnpackState &amp;getUnpackState() const;
</span><span class="cx">     PixelUnpackState &amp;getUnpackState();
</span><span class="cx"> 
</span><ins>+    // Debug state
+    const Debug &amp;getDebug() const;
+    Debug &amp;getDebug();
+
</ins><span class="cx">     // State query functions
</span><span class="cx">     void getBooleanv(GLenum pname, GLboolean *params);
</span><span class="cx">     void getFloatv(GLenum pname, GLfloat *params);
</span><span class="cx">     void getIntegerv(const gl::Data &amp;data, GLenum pname, GLint *params);
</span><ins>+    void getPointerv(GLenum pname, void **params) const;
</ins><span class="cx">     bool getIndexedIntegerv(GLenum target, GLuint index, GLint *data);
</span><span class="cx">     bool getIndexedInteger64v(GLenum target, GLuint index, GLint64 *data);
</span><span class="cx"> 
</span><span class="cx">     bool hasMappedBuffer(GLenum target) const;
</span><span class="cx"> 
</span><ins>+    enum DirtyBitType
+    {
+        DIRTY_BIT_SCISSOR_TEST_ENABLED,
+        DIRTY_BIT_SCISSOR,
+        DIRTY_BIT_VIEWPORT,
+        DIRTY_BIT_DEPTH_RANGE,
+        DIRTY_BIT_BLEND_ENABLED,
+        DIRTY_BIT_BLEND_COLOR,
+        DIRTY_BIT_BLEND_FUNCS,
+        DIRTY_BIT_BLEND_EQUATIONS,
+        DIRTY_BIT_COLOR_MASK,
+        DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED,
+        DIRTY_BIT_SAMPLE_COVERAGE_ENABLED,
+        DIRTY_BIT_SAMPLE_COVERAGE,
+        DIRTY_BIT_DEPTH_TEST_ENABLED,
+        DIRTY_BIT_DEPTH_FUNC,
+        DIRTY_BIT_DEPTH_MASK,
+        DIRTY_BIT_STENCIL_TEST_ENABLED,
+        DIRTY_BIT_STENCIL_FUNCS_FRONT,
+        DIRTY_BIT_STENCIL_FUNCS_BACK,
+        DIRTY_BIT_STENCIL_OPS_FRONT,
+        DIRTY_BIT_STENCIL_OPS_BACK,
+        DIRTY_BIT_STENCIL_WRITEMASK_FRONT,
+        DIRTY_BIT_STENCIL_WRITEMASK_BACK,
+        DIRTY_BIT_CULL_FACE_ENABLED,
+        DIRTY_BIT_CULL_FACE,
+        DIRTY_BIT_FRONT_FACE,
+        DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED,
+        DIRTY_BIT_POLYGON_OFFSET,
+        DIRTY_BIT_RASTERIZER_DISCARD_ENABLED,
+        DIRTY_BIT_LINE_WIDTH,
+        DIRTY_BIT_PRIMITIVE_RESTART_ENABLED,
+        DIRTY_BIT_CLEAR_COLOR,
+        DIRTY_BIT_CLEAR_DEPTH,
+        DIRTY_BIT_CLEAR_STENCIL,
+        DIRTY_BIT_UNPACK_ALIGNMENT,
+        DIRTY_BIT_UNPACK_ROW_LENGTH,
+        DIRTY_BIT_UNPACK_IMAGE_HEIGHT,
+        DIRTY_BIT_UNPACK_SKIP_IMAGES,
+        DIRTY_BIT_UNPACK_SKIP_ROWS,
+        DIRTY_BIT_UNPACK_SKIP_PIXELS,
+        DIRTY_BIT_PACK_ALIGNMENT,
+        DIRTY_BIT_PACK_REVERSE_ROW_ORDER,
+        DIRTY_BIT_PACK_ROW_LENGTH,
+        DIRTY_BIT_PACK_SKIP_ROWS,
+        DIRTY_BIT_PACK_SKIP_PIXELS,
+        DIRTY_BIT_DITHER_ENABLED,
+        DIRTY_BIT_GENERATE_MIPMAP_HINT,
+        DIRTY_BIT_SHADER_DERIVATIVE_HINT,
+        DIRTY_BIT_READ_FRAMEBUFFER_BINDING,
+        DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING,
+        DIRTY_BIT_RENDERBUFFER_BINDING,
+        DIRTY_BIT_VERTEX_ARRAY_BINDING,
+        DIRTY_BIT_PROGRAM_BINDING,
+        DIRTY_BIT_CURRENT_VALUE_0,
+        DIRTY_BIT_CURRENT_VALUE_MAX = DIRTY_BIT_CURRENT_VALUE_0 + MAX_VERTEX_ATTRIBS,
+        DIRTY_BIT_INVALID           = DIRTY_BIT_CURRENT_VALUE_MAX,
+        DIRTY_BIT_MAX               = DIRTY_BIT_INVALID,
+    };
+
+    // TODO(jmadill): Consider storing dirty objects in a list instead of by binding.
+    enum DirtyObjectType
+    {
+        DIRTY_OBJECT_READ_FRAMEBUFFER,
+        DIRTY_OBJECT_DRAW_FRAMEBUFFER,
+        DIRTY_OBJECT_VERTEX_ARRAY,
+        DIRTY_OBJECT_PROGRAM,
+        DIRTY_OBJECT_UNKNOWN,
+        DIRTY_OBJECT_MAX = DIRTY_OBJECT_UNKNOWN,
+    };
+
+    typedef std::bitset&lt;DIRTY_BIT_MAX&gt; DirtyBits;
+    const DirtyBits &amp;getDirtyBits() const { return mDirtyBits; }
+    void clearDirtyBits() { mDirtyBits.reset(); }
+    void clearDirtyBits(const DirtyBits &amp;bitset) { mDirtyBits &amp;= ~bitset; }
+    void setAllDirtyBits() { mDirtyBits.set(); }
+
+    typedef std::bitset&lt;DIRTY_OBJECT_MAX&gt; DirtyObjects;
+    void clearDirtyObjects() { mDirtyObjects.reset(); }
+    void setAllDirtyObjects() { mDirtyObjects.set(); }
+    void syncDirtyObjects();
+    void syncDirtyObjects(const DirtyObjects &amp;bitset);
+    void syncDirtyObject(GLenum target);
+    void setObjectDirty(GLenum target);
+
</ins><span class="cx">   private:
</span><span class="cx">     // Cached values from Context's caps
</span><span class="cx">     GLuint mMaxDrawBuffers;
</span><span class="lines">@@ -297,18 +409,18 @@
</span><span class="cx">     // Texture and sampler bindings
</span><span class="cx">     size_t mActiveSampler;   // Active texture unit selector - GL_TEXTURE0
</span><span class="cx"> 
</span><del>-    typedef std::vector&lt; BindingPointer&lt;Texture&gt; &gt; TextureBindingVector;
</del><ins>+    typedef std::vector&lt;BindingPointer&lt;Texture&gt;&gt; TextureBindingVector;
</ins><span class="cx">     typedef std::map&lt;GLenum, TextureBindingVector&gt; TextureBindingMap;
</span><span class="cx">     TextureBindingMap mSamplerTextures;
</span><span class="cx"> 
</span><del>-    typedef std::vector&lt; BindingPointer&lt;Sampler&gt; &gt; SamplerBindingVector;
</del><ins>+    typedef std::vector&lt;BindingPointer&lt;Sampler&gt;&gt; SamplerBindingVector;
</ins><span class="cx">     SamplerBindingVector mSamplers;
</span><span class="cx"> 
</span><del>-    typedef std::map&lt; GLenum, BindingPointer&lt;Query&gt; &gt; ActiveQueryMap;
</del><ins>+    typedef std::map&lt;GLenum, BindingPointer&lt;Query&gt;&gt; ActiveQueryMap;
</ins><span class="cx">     ActiveQueryMap mActiveQueries;
</span><span class="cx"> 
</span><span class="cx">     BindingPointer&lt;Buffer&gt; mGenericUniformBuffer;
</span><del>-    typedef std::vector&lt; OffsetBindingPointer&lt;Buffer&gt; &gt; BufferVector;
</del><ins>+    typedef std::vector&lt;OffsetBindingPointer&lt;Buffer&gt;&gt; BufferVector;
</ins><span class="cx">     BufferVector mUniformBuffers;
</span><span class="cx"> 
</span><span class="cx">     BindingPointer&lt;TransformFeedback&gt; mTransformFeedback;
</span><span class="lines">@@ -320,9 +432,14 @@
</span><span class="cx">     PixelPackState mPack;
</span><span class="cx"> 
</span><span class="cx">     bool mPrimitiveRestart;
</span><ins>+
+    Debug mDebug;
+
+    DirtyBits mDirtyBits;
+    DirtyObjects mDirtyObjects;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace gl
</ins><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_STATE_H_
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEStreamcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Stream.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Stream.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Stream.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,76 @@
</span><ins>+//
+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Stream.cpp: Implements the egl::Stream class, representing the stream
+// where frames are streamed in. Implements EGLStreanKHR.
+
+#include &quot;libANGLE/Stream.h&quot;
+
+#include &lt;platform/Platform.h&gt;
+#include &lt;EGL/eglext.h&gt;
+
+#include &quot;common/debug.h&quot;
+#include &quot;common/mathutil.h&quot;
+#include &quot;common/platform.h&quot;
+#include &quot;common/utilities.h&quot;
+#include &quot;libANGLE/Context.h&quot;
+#include &quot;libANGLE/renderer/StreamImpl.h&quot;
+
+namespace egl
+{
+
+Stream::Stream(rx::StreamImpl *impl, const AttributeMap &amp;attribs)
+    : mImplementation(impl),
+      mState(EGL_STREAM_STATE_CREATED_KHR),
+      mProducerFrame(0),
+      mConsumerFrame(0),
+      mConsumerLatency(static_cast&lt;EGLint&gt;(attribs.get(EGL_CONSUMER_LATENCY_USEC_KHR, 0))),
+      mConsumerAcquireTimeout(
+          static_cast&lt;EGLint&gt;(attribs.get(EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR, 0)))
+{
+}
+
+Stream::~Stream()
+{
+    SafeDelete(mImplementation);
+}
+
+void Stream::setConsumerLatency(EGLint latency)
+{
+    mConsumerLatency = latency;
+}
+
+EGLint Stream::getConsumerLatency() const
+{
+    return mConsumerLatency;
+}
+
+EGLuint64KHR Stream::getProducerFrame() const
+{
+    return mProducerFrame;
+}
+
+EGLuint64KHR Stream::getConsumerFrame() const
+{
+    return mConsumerFrame;
+}
+
+EGLenum Stream::getState() const
+{
+    return mState;
+}
+
+void Stream::setConsumerAcquireTimeout(EGLint timeout)
+{
+    mConsumerAcquireTimeout = timeout;
+}
+
+EGLint Stream::getConsumerAcquireTimeout() const
+{
+    return mConsumerAcquireTimeout;
+}
+
+}  // namespace egl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEStreamh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Stream.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Stream.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Stream.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,59 @@
</span><ins>+//
+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Stream.h: Defines the egl::Stream class, representing the stream
+// where frames are streamed in. Implements EGLStreanKHR.
+
+#ifndef LIBANGLE_STREAM_H_
+#define LIBANGLE_STREAM_H_
+
+#include &lt;EGL/egl.h&gt;
+#include &lt;EGL/eglext.h&gt;
+
+#include &quot;common/angleutils.h&quot;
+#include &quot;libANGLE/AttributeMap.h&quot;
+
+namespace rx
+{
+class StreamImpl;
+}
+
+namespace egl
+{
+
+class Stream final : angle::NonCopyable
+{
+  public:
+    Stream(rx::StreamImpl *impl, const AttributeMap &amp;attribs);
+    ~Stream();
+
+    EGLenum getState() const;
+
+    void setConsumerLatency(EGLint latency);
+    EGLint getConsumerLatency() const;
+
+    EGLuint64KHR getProducerFrame() const;
+    EGLuint64KHR getConsumerFrame() const;
+
+    void setConsumerAcquireTimeout(EGLint timeout);
+    EGLint getConsumerAcquireTimeout() const;
+
+  private:
+    // Implementation
+    rx::StreamImpl *mImplementation;
+
+    // EGL defined attributes
+    EGLint mState;
+    EGLuint64KHR mProducerFrame;
+    EGLuint64KHR mConsumerFrame;
+    EGLint mConsumerLatency;
+
+    // EGL gltexture consumer attributes
+    EGLint mConsumerAcquireTimeout;
+};
+}  // namespace egl
+
+#endif  // LIBANGLE_STREAM_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLESurfacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,16 +11,25 @@
</span><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Config.h&quot;
</span><ins>+#include &quot;libANGLE/Framebuffer.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Texture.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;EGL/eglext.h&gt;
</span><span class="cx"> 
</span><ins>+#include &lt;iostream&gt;
+
</ins><span class="cx"> namespace egl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-Surface::Surface(rx::SurfaceImpl *impl, EGLint surfaceType, const egl::Config *config, const AttributeMap &amp;attributes)
-    : FramebufferAttachmentObject(0), // id unused
</del><ins>+Surface::Surface(rx::SurfaceImpl *impl,
+                 EGLint surfaceType,
+                 const egl::Config *config,
+                 const AttributeMap &amp;attributes)
+    : FramebufferAttachmentObject(),
</ins><span class="cx">       mImplementation(impl),
</span><ins>+      mDefaultFramebuffer(nullptr),
+      mCurrentCount(0),
+      mDestroyed(false),
</ins><span class="cx">       mType(surfaceType),
</span><span class="cx">       mConfig(config),
</span><span class="cx">       mPostSubBufferRequested(false),
</span><span class="lines">@@ -32,42 +41,77 @@
</span><span class="cx">       // FIXME: Determine actual pixel aspect ratio
</span><span class="cx">       mPixelAspectRatio(static_cast&lt;EGLint&gt;(1.0 * EGL_DISPLAY_SCALING)),
</span><span class="cx">       mRenderBuffer(EGL_BACK_BUFFER),
</span><del>-      mSwapBehavior(EGL_BUFFER_PRESERVED),
-      mTexture(NULL)
</del><ins>+      mSwapBehavior(impl-&gt;getSwapBehavior()),
+      mOrientation(0),
+      mTexture()
</ins><span class="cx"> {
</span><del>-    addRef();
-
</del><span class="cx">     mPostSubBufferRequested = (attributes.get(EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_FALSE) == EGL_TRUE);
</span><ins>+    mFlexibleSurfaceCompatibilityRequested =
+        (attributes.get(EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE, EGL_FALSE) == EGL_TRUE);
</ins><span class="cx"> 
</span><ins>+    mDirectComposition = (attributes.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE);
+
</ins><span class="cx">     mFixedSize = (attributes.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE);
</span><span class="cx">     if (mFixedSize)
</span><span class="cx">     {
</span><del>-        mFixedWidth = attributes.get(EGL_WIDTH, 0);
-        mFixedHeight = attributes.get(EGL_HEIGHT, 0);
</del><ins>+        mFixedWidth  = static_cast&lt;size_t&gt;(attributes.get(EGL_WIDTH, 0));
+        mFixedHeight = static_cast&lt;size_t&gt;(attributes.get(EGL_HEIGHT, 0));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (mType != EGL_WINDOW_BIT)
</span><span class="cx">     {
</span><del>-        mTextureFormat = attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
-        mTextureTarget = attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
</del><ins>+        mTextureFormat = static_cast&lt;EGLenum&gt;(attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE));
+        mTextureTarget = static_cast&lt;EGLenum&gt;(attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE));
</ins><span class="cx">     }
</span><ins>+
+    mOrientation = static_cast&lt;EGLint&gt;(attributes.get(EGL_SURFACE_ORIENTATION_ANGLE, 0));
+
+    mDefaultFramebuffer = createDefaultFramebuffer();
+    ASSERT(mDefaultFramebuffer != nullptr);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Surface::~Surface()
</span><span class="cx"> {
</span><del>-    if (mTexture)
</del><ins>+    if (mTexture.get())
</ins><span class="cx">     {
</span><span class="cx">         if (mImplementation)
</span><span class="cx">         {
</span><span class="cx">             mImplementation-&gt;releaseTexImage(EGL_BACK_BUFFER);
</span><span class="cx">         }
</span><del>-        mTexture-&gt;releaseTexImage();
-        mTexture = NULL;
</del><ins>+        mTexture-&gt;releaseTexImageFromSurface();
+        mTexture.set(nullptr);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    SafeDelete(mDefaultFramebuffer);
</ins><span class="cx">     SafeDelete(mImplementation);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Surface::setIsCurrent(bool isCurrent)
+{
+    if (isCurrent)
+    {
+        mCurrentCount++;
+    }
+    else
+    {
+        ASSERT(mCurrentCount &gt; 0);
+        mCurrentCount--;
+        if (mCurrentCount == 0 &amp;&amp; mDestroyed)
+        {
+            delete this;
+        }
+    }
+}
+
+void Surface::onDestroy()
+{
+    mDestroyed = true;
+    if (mCurrentCount == 0)
+    {
+        delete this;
+    }
+}
+
</ins><span class="cx"> EGLint Surface::getType() const
</span><span class="cx"> {
</span><span class="cx">     return mType;
</span><span class="lines">@@ -145,23 +189,33 @@
</span><span class="cx"> 
</span><span class="cx"> Error Surface::bindTexImage(gl::Texture *texture, EGLint buffer)
</span><span class="cx"> {
</span><del>-    ASSERT(!mTexture);
</del><ins>+    ASSERT(!mTexture.get());
</ins><span class="cx"> 
</span><del>-    texture-&gt;bindTexImage(this);
-    mTexture = texture;
-    return mImplementation-&gt;bindTexImage(buffer);
</del><ins>+    texture-&gt;bindTexImageFromSurface(this);
+    mTexture.set(texture);
+    return mImplementation-&gt;bindTexImage(texture, buffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error Surface::releaseTexImage(EGLint buffer)
</span><span class="cx"> {
</span><del>-    ASSERT(mTexture);
-    gl::Texture *boundTexture = mTexture;
-    mTexture = NULL;
</del><ins>+    ASSERT(mTexture.get());
+    mTexture-&gt;releaseTexImageFromSurface();
+    mTexture.set(nullptr);
</ins><span class="cx"> 
</span><del>-    boundTexture-&gt;releaseTexImage();
</del><span class="cx">     return mImplementation-&gt;releaseTexImage(buffer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Surface::releaseTexImageFromTexture()
+{
+    ASSERT(mTexture.get());
+    mTexture.set(nullptr);
+}
+
+gl::Extents Surface::getAttachmentSize(const gl::FramebufferAttachment::Target &amp; /*target*/) const
+{
+    return gl::Extents(getWidth(), getHeight(), 1);
+}
+
</ins><span class="cx"> GLenum Surface::getAttachmentInternalFormat(const gl::FramebufferAttachment::Target &amp;target) const
</span><span class="cx"> {
</span><span class="cx">     const egl::Config *config = getConfig();
</span><span class="lines">@@ -173,4 +227,35 @@
</span><span class="cx">     return getConfig()-&gt;samples;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLuint Surface::getId() const
+{
+    UNREACHABLE();
+    return 0;
</ins><span class="cx"> }
</span><ins>+
+gl::Framebuffer *Surface::createDefaultFramebuffer()
+{
+    gl::Framebuffer *framebuffer = new gl::Framebuffer(mImplementation);
+
+    GLenum drawBufferState = GL_BACK;
+    framebuffer-&gt;setDrawBuffers(1, &amp;drawBufferState);
+    framebuffer-&gt;setReadBuffer(GL_BACK);
+
+    framebuffer-&gt;setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_BACK, gl::ImageIndex::MakeInvalid(),
+                               this);
+
+    if (mConfig-&gt;depthSize &gt; 0)
+    {
+        framebuffer-&gt;setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_DEPTH, gl::ImageIndex::MakeInvalid(),
+                                   this);
+    }
+
+    if (mConfig-&gt;stencilSize &gt; 0)
+    {
+        framebuffer-&gt;setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_STENCIL,
+                                   gl::ImageIndex::MakeInvalid(), this);
+    }
+
+    return framebuffer;
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLESurfaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,10 +16,12 @@
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><ins>+#include &quot;libANGLE/RefCountObject.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/SurfaceImpl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><ins>+class Framebuffer;
</ins><span class="cx"> class Texture;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -48,6 +50,8 @@
</span><span class="cx">     EGLint isPostSubBufferSupported() const;
</span><span class="cx"> 
</span><span class="cx">     void setSwapInterval(EGLint interval);
</span><ins>+    void setIsCurrent(bool isCurrent);
+    void onDestroy();
</ins><span class="cx"> 
</span><span class="cx">     const Config *getConfig() const;
</span><span class="cx"> 
</span><span class="lines">@@ -60,32 +64,56 @@
</span><span class="cx">     EGLenum getTextureFormat() const;
</span><span class="cx">     EGLenum getTextureTarget() const;
</span><span class="cx"> 
</span><del>-    gl::Texture *getBoundTexture() const { return mTexture; }
</del><ins>+    gl::Texture *getBoundTexture() const { return mTexture.get(); }
+    gl::Framebuffer *getDefaultFramebuffer() { return mDefaultFramebuffer; }
</ins><span class="cx"> 
</span><span class="cx">     EGLint isFixedSize() const;
</span><span class="cx"> 
</span><span class="cx">     // FramebufferAttachmentObject implementation
</span><del>-    GLsizei getAttachmentWidth(const gl::FramebufferAttachment::Target &amp;/*target*/) const override { return getWidth(); }
-    GLsizei getAttachmentHeight(const gl::FramebufferAttachment::Target &amp;/*target*/) const override { return getHeight(); }
</del><ins>+    gl::Extents getAttachmentSize(const gl::FramebufferAttachment::Target &amp;target) const override;
</ins><span class="cx">     GLenum getAttachmentInternalFormat(const gl::FramebufferAttachment::Target &amp;target) const override;
</span><span class="cx">     GLsizei getAttachmentSamples(const gl::FramebufferAttachment::Target &amp;target) const override;
</span><span class="cx"> 
</span><ins>+    void onAttach() override {}
+    void onDetach() override {}
+    GLuint getId() const override;
+
+    bool flexibleSurfaceCompatibilityRequested() const
+    {
+        return mFlexibleSurfaceCompatibilityRequested;
+    }
+    EGLint getOrientation() const { return mOrientation; }
+
+    bool directComposition() const { return mDirectComposition; }
+
</ins><span class="cx">   private:
</span><span class="cx">     virtual ~Surface();
</span><span class="cx">     rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override { return mImplementation; }
</span><span class="cx"> 
</span><ins>+    gl::Framebuffer *createDefaultFramebuffer();
+
+    // ANGLE-only method, used internally
+    friend class gl::Texture;
+    void releaseTexImageFromTexture();
+
</ins><span class="cx">     rx::SurfaceImpl *mImplementation;
</span><ins>+    gl::Framebuffer *mDefaultFramebuffer;
+    int mCurrentCount;
+    bool mDestroyed;
</ins><span class="cx"> 
</span><span class="cx">     EGLint mType;
</span><span class="cx"> 
</span><span class="cx">     const egl::Config *mConfig;
</span><span class="cx"> 
</span><span class="cx">     bool mPostSubBufferRequested;
</span><ins>+    bool mFlexibleSurfaceCompatibilityRequested;
</ins><span class="cx"> 
</span><span class="cx">     bool mFixedSize;
</span><span class="cx">     size_t mFixedWidth;
</span><span class="cx">     size_t mFixedHeight;
</span><span class="cx"> 
</span><ins>+    bool mDirectComposition;
+
</ins><span class="cx">     EGLenum mTextureFormat;
</span><span class="cx">     EGLenum mTextureTarget;
</span><span class="cx"> 
</span><span class="lines">@@ -93,7 +121,9 @@
</span><span class="cx">     EGLenum mRenderBuffer;         // Render buffer
</span><span class="cx">     EGLenum mSwapBehavior;         // Buffer swap behavior
</span><span class="cx"> 
</span><del>-    gl::Texture *mTexture;
</del><ins>+    EGLint mOrientation;
+
+    BindingPointer&lt;gl::Texture&gt; mTexture;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLESurface_unittestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface_unittest.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface_unittest.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Surface_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,11 +6,17 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;gmock/gmock.h&quot;
</span><span class="cx"> #include &quot;gtest/gtest.h&quot;
</span><ins>+#include &quot;libANGLE/angletypes.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/AttributeMap.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Config.h&quot;
</span><ins>+#include &quot;libANGLE/Data.h&quot;
+#include &quot;libANGLE/State.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/FramebufferImpl_mock.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/SurfaceImpl.h&quot;
</span><span class="cx"> 
</span><ins>+using namespace rx;
+
</ins><span class="cx"> namespace
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -20,47 +26,38 @@
</span><span class="cx">     virtual ~MockSurfaceImpl() { destroy(); }
</span><span class="cx"> 
</span><span class="cx">     MOCK_METHOD0(initialize, egl::Error());
</span><ins>+    MOCK_METHOD1(createDefaultFramebuffer,
+                 rx::FramebufferImpl *(const gl::Framebuffer::Data &amp;data));
</ins><span class="cx">     MOCK_METHOD0(swap, egl::Error());
</span><span class="cx">     MOCK_METHOD4(postSubBuffer, egl::Error(EGLint, EGLint, EGLint, EGLint));
</span><span class="cx">     MOCK_METHOD2(querySurfacePointerANGLE, egl::Error(EGLint, void**));
</span><del>-    MOCK_METHOD1(bindTexImage, egl::Error(EGLint));
</del><ins>+    MOCK_METHOD2(bindTexImage, egl::Error(gl::Texture*, EGLint));
</ins><span class="cx">     MOCK_METHOD1(releaseTexImage, egl::Error(EGLint));
</span><span class="cx">     MOCK_METHOD1(setSwapInterval, void(EGLint));
</span><span class="cx">     MOCK_CONST_METHOD0(getWidth, EGLint());
</span><span class="cx">     MOCK_CONST_METHOD0(getHeight, EGLint());
</span><span class="cx">     MOCK_CONST_METHOD0(isPostSubBufferSupported, EGLint(void));
</span><ins>+    MOCK_CONST_METHOD0(getSwapBehavior, EGLint(void));
</ins><span class="cx">     MOCK_METHOD2(getAttachmentRenderTarget, gl::Error(const gl::FramebufferAttachment::Target &amp;, rx::FramebufferAttachmentRenderTarget **));
</span><span class="cx"> 
</span><span class="cx">     MOCK_METHOD0(destroy, void());
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class SurfaceTest : public testing::Test
</del><ins>+TEST(SurfaceTest, DestructionDeletesImpl)
</ins><span class="cx"> {
</span><del>-  protected:
-    virtual void SetUp()
-    {
-        mImpl = new MockSurfaceImpl;
-        EXPECT_CALL(*mImpl, destroy());
-        mSurface = new egl::Surface(mImpl, EGL_WINDOW_BIT, &amp;mConfig, egl::AttributeMap());
-    }
</del><ins>+    MockFramebufferImpl *framebuffer = new MockFramebufferImpl;
</ins><span class="cx"> 
</span><del>-    virtual void TearDown()
-    {
-        mSurface-&gt;release();
-    }
</del><ins>+    MockSurfaceImpl *impl = new MockSurfaceImpl;
+    EXPECT_CALL(*impl, getSwapBehavior());
+    EXPECT_CALL(*impl, createDefaultFramebuffer(testing::_)).WillOnce(testing::Return(framebuffer));
</ins><span class="cx"> 
</span><del>-    MockSurfaceImpl *mImpl;
-    egl::Surface *mSurface;
-    egl::Config mConfig;
-};
</del><ins>+    egl::Config config;
+    egl::Surface *surface = new egl::Surface(impl, EGL_WINDOW_BIT, &amp;config, egl::AttributeMap());
</ins><span class="cx"> 
</span><del>-TEST_F(SurfaceTest, DestructionDeletesImpl)
-{
-    MockSurfaceImpl *impl = new MockSurfaceImpl;
</del><ins>+    EXPECT_CALL(*framebuffer, destroy()).Times(1).RetiresOnSaturation();
</ins><span class="cx">     EXPECT_CALL(*impl, destroy()).Times(1).RetiresOnSaturation();
</span><span class="cx"> 
</span><del>-    egl::Surface *surface = new egl::Surface(impl, EGL_WINDOW_BIT, &amp;mConfig, egl::AttributeMap());
-    surface-&gt;release();
</del><ins>+    surface-&gt;onDestroy();
</ins><span class="cx"> 
</span><span class="cx">     // Only needed because the mock is leaked if bugs are present,
</span><span class="cx">     // which logs an error, but does not cause the test to fail.
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLETexturecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Texture.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Texture.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Texture.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,7 +11,9 @@
</span><span class="cx"> #include &quot;common/mathutil.h&quot;
</span><span class="cx"> #include &quot;common/utilities.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Config.h&quot;
</span><ins>+#include &quot;libANGLE/Context.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Data.h&quot;
</span><ins>+#include &quot;libANGLE/Image.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -45,14 +47,11 @@
</span><span class="cx">     return IsCubeMapTextureTarget(target) ? ((level * 6) + CubeMapTextureTargetToLayerIndex(target)) : level;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int Texture::mCurrentTextureSerial = 1;
-
</del><span class="cx"> Texture::Texture(rx::TextureImpl *impl, GLuint id, GLenum target)
</span><del>-    : FramebufferAttachmentObject(id),
</del><ins>+    : egl::ImageSibling(id),
</ins><span class="cx">       mTexture(impl),
</span><del>-      mTextureSerial(issueTextureSerial()),
-      mUsage(GL_NONE),
-      mImmutableLevelCount(0),
</del><ins>+      mLabel(),
+      mTextureState(),
</ins><span class="cx">       mTarget(target),
</span><span class="cx">       mImageDescs(IMPLEMENTATION_MAX_TEXTURE_LEVELS * (target == GL_TEXTURE_CUBE_MAP ? 6 : 1)),
</span><span class="cx">       mCompletenessCache(),
</span><span class="lines">@@ -70,22 +69,212 @@
</span><span class="cx">     SafeDelete(mTexture);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Texture::setLabel(const std::string &amp;label)
+{
+    mLabel = label;
+}
+
+const std::string &amp;Texture::getLabel() const
+{
+    return mLabel;
+}
+
</ins><span class="cx"> GLenum Texture::getTarget() const
</span><span class="cx"> {
</span><span class="cx">     return mTarget;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Texture::setSwizzleRed(GLenum swizzleRed)
+{
+    mTextureState.swizzleRed = swizzleRed;
+}
+
+GLenum Texture::getSwizzleRed() const
+{
+    return mTextureState.swizzleRed;
+}
+
+void Texture::setSwizzleGreen(GLenum swizzleGreen)
+{
+    mTextureState.swizzleGreen = swizzleGreen;
+}
+
+GLenum Texture::getSwizzleGreen() const
+{
+    return mTextureState.swizzleGreen;
+}
+
+void Texture::setSwizzleBlue(GLenum swizzleBlue)
+{
+    mTextureState.swizzleBlue = swizzleBlue;
+}
+
+GLenum Texture::getSwizzleBlue() const
+{
+    return mTextureState.swizzleBlue;
+}
+
+void Texture::setSwizzleAlpha(GLenum swizzleAlpha)
+{
+    mTextureState.swizzleAlpha = swizzleAlpha;
+}
+
+GLenum Texture::getSwizzleAlpha() const
+{
+    return mTextureState.swizzleAlpha;
+}
+
+void Texture::setMinFilter(GLenum minFilter)
+{
+    mTextureState.samplerState.minFilter = minFilter;
+}
+
+GLenum Texture::getMinFilter() const
+{
+    return mTextureState.samplerState.minFilter;
+}
+
+void Texture::setMagFilter(GLenum magFilter)
+{
+    mTextureState.samplerState.magFilter = magFilter;
+}
+
+GLenum Texture::getMagFilter() const
+{
+    return mTextureState.samplerState.magFilter;
+}
+
+void Texture::setWrapS(GLenum wrapS)
+{
+    mTextureState.samplerState.wrapS = wrapS;
+}
+
+GLenum Texture::getWrapS() const
+{
+    return mTextureState.samplerState.wrapS;
+}
+
+void Texture::setWrapT(GLenum wrapT)
+{
+    mTextureState.samplerState.wrapT = wrapT;
+}
+
+GLenum Texture::getWrapT() const
+{
+    return mTextureState.samplerState.wrapT;
+}
+
+void Texture::setWrapR(GLenum wrapR)
+{
+    mTextureState.samplerState.wrapR = wrapR;
+}
+
+GLenum Texture::getWrapR() const
+{
+    return mTextureState.samplerState.wrapR;
+}
+
+void Texture::setMaxAnisotropy(float maxAnisotropy)
+{
+    mTextureState.samplerState.maxAnisotropy = maxAnisotropy;
+}
+
+float Texture::getMaxAnisotropy() const
+{
+    return mTextureState.samplerState.maxAnisotropy;
+}
+
+void Texture::setMinLod(GLfloat minLod)
+{
+    mTextureState.samplerState.minLod = minLod;
+}
+
+GLfloat Texture::getMinLod() const
+{
+    return mTextureState.samplerState.minLod;
+}
+
+void Texture::setMaxLod(GLfloat maxLod)
+{
+    mTextureState.samplerState.maxLod = maxLod;
+}
+
+GLfloat Texture::getMaxLod() const
+{
+    return mTextureState.samplerState.maxLod;
+}
+
+void Texture::setCompareMode(GLenum compareMode)
+{
+    mTextureState.samplerState.compareMode = compareMode;
+}
+
+GLenum Texture::getCompareMode() const
+{
+    return mTextureState.samplerState.compareMode;
+}
+
+void Texture::setCompareFunc(GLenum compareFunc)
+{
+    mTextureState.samplerState.compareFunc = compareFunc;
+}
+
+GLenum Texture::getCompareFunc() const
+{
+    return mTextureState.samplerState.compareFunc;
+}
+
+const SamplerState &amp;Texture::getSamplerState() const
+{
+    return mTextureState.samplerState;
+}
+
+void Texture::setBaseLevel(GLuint baseLevel)
+{
+    mTextureState.baseLevel = baseLevel;
+}
+
+GLuint Texture::getBaseLevel() const
+{
+    return mTextureState.baseLevel;
+}
+
+void Texture::setMaxLevel(GLuint maxLevel)
+{
+    mTextureState.maxLevel = maxLevel;
+}
+
+GLuint Texture::getMaxLevel() const
+{
+    return mTextureState.maxLevel;
+}
+
+bool Texture::getImmutableFormat() const
+{
+    return mTextureState.immutableFormat;
+}
+
+GLuint Texture::getImmutableLevels() const
+{
+    return mTextureState.immutableLevels;
+}
+
</ins><span class="cx"> void Texture::setUsage(GLenum usage)
</span><span class="cx"> {
</span><del>-    mUsage = usage;
</del><ins>+    mTextureState.usage = usage;
</ins><span class="cx">     getImplementation()-&gt;setUsage(usage);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLenum Texture::getUsage() const
</span><span class="cx"> {
</span><del>-    return mUsage;
</del><ins>+    return mTextureState.usage;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const TextureState &amp;Texture::getTextureState() const
+{
+    return mTextureState;
+}
+
</ins><span class="cx"> size_t Texture::getWidth(GLenum target, size_t level) const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP &amp;&amp; IsCubeMapTextureTarget(target)));
</span><span class="lines">@@ -112,7 +301,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool Texture::isSamplerComplete(const SamplerState &amp;samplerState, const Data &amp;data) const
</span><span class="cx"> {
</span><del>-    const ImageDesc &amp;baseImageDesc = getImageDesc(getBaseImageTarget(), samplerState.baseLevel);
</del><ins>+    const ImageDesc &amp;baseImageDesc = getImageDesc(getBaseImageTarget(), mTextureState.baseLevel);
</ins><span class="cx">     const TextureCaps &amp;textureCaps = data.textureCaps-&gt;get(baseImageDesc.internalFormat);
</span><span class="cx">     if (!mCompletenessCache.cacheValid ||
</span><span class="cx">         mCompletenessCache.samplerState != samplerState ||
</span><span class="lines">@@ -130,6 +319,11 @@
</span><span class="cx">     return mCompletenessCache.samplerComplete;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Texture::isMipmapComplete() const
+{
+    return computeMipmapCompleteness();
+}
+
</ins><span class="cx"> // Tests for cube texture completeness. [OpenGL ES 2.0.24] section 3.7.10 page 81.
</span><span class="cx"> bool Texture::isCubeComplete() const
</span><span class="cx"> {
</span><span class="lines">@@ -155,76 +349,103 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int Texture::getTextureSerial() const
</del><ins>+size_t Texture::getMipCompleteLevels() const
</ins><span class="cx"> {
</span><del>-    return mTextureSerial;
</del><ins>+    const ImageDesc &amp;baseImageDesc = getImageDesc(getBaseImageTarget(), 0);
+    if (mTarget == GL_TEXTURE_3D)
+    {
+        const int maxDim = std::max(std::max(baseImageDesc.size.width, baseImageDesc.size.height),
+                                    baseImageDesc.size.depth);
+        return log2(maxDim) + 1;
+    }
+    else
+    {
+        return log2(std::max(baseImageDesc.size.width, baseImageDesc.size.height)) + 1;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int Texture::issueTextureSerial()
</del><ins>+egl::Surface *Texture::getBoundSurface() const
</ins><span class="cx"> {
</span><del>-    return mCurrentTextureSerial++;
</del><ins>+    return mBoundSurface;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Texture::isImmutable() const
</del><ins>+Error Texture::setImage(const PixelUnpackState &amp;unpackState,
+                        GLenum target,
+                        size_t level,
+                        GLenum internalFormat,
+                        const Extents &amp;size,
+                        GLenum format,
+                        GLenum type,
+                        const uint8_t *pixels)
</ins><span class="cx"> {
</span><del>-    return (mImmutableLevelCount &gt; 0);
-}
</del><ins>+    ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP &amp;&amp; IsCubeMapTextureTarget(target)));
</ins><span class="cx"> 
</span><del>-int Texture::immutableLevelCount()
-{
-    return mImmutableLevelCount;
-}
</del><ins>+    // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
+    releaseTexImageInternal();
+    orphanImages();
</ins><span class="cx"> 
</span><del>-Error Texture::setImage(GLenum target, size_t level, GLenum internalFormat, const Extents &amp;size, GLenum format, GLenum type,
-                        const PixelUnpackState &amp;unpack, const uint8_t *pixels)
-{
-    ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP &amp;&amp; IsCubeMapTextureTarget(target)));
-
-    Error error = mTexture-&gt;setImage(target, level, internalFormat, size, format, type, unpack, pixels);
</del><ins>+    Error error =
+        mTexture-&gt;setImage(target, level, internalFormat, size, format, type, unpackState, pixels);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    releaseTexImage();
-
</del><span class="cx">     setImageDesc(target, level, ImageDesc(size, GetSizedInternalFormat(internalFormat, type)));
</span><span class="cx"> 
</span><span class="cx">     return Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Texture::setSubImage(GLenum target, size_t level, const Box &amp;area, GLenum format, GLenum type,
-                           const PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+Error Texture::setSubImage(const PixelUnpackState &amp;unpackState,
+                           GLenum target,
+                           size_t level,
+                           const Box &amp;area,
+                           GLenum format,
+                           GLenum type,
+                           const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP &amp;&amp; IsCubeMapTextureTarget(target)));
</span><del>-
-    return mTexture-&gt;setSubImage(target, level, area, format, type, unpack, pixels);
</del><ins>+    return mTexture-&gt;setSubImage(target, level, area, format, type, unpackState, pixels);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Texture::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const Extents &amp;size,
-                                  const PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+Error Texture::setCompressedImage(const PixelUnpackState &amp;unpackState,
+                                  GLenum target,
+                                  size_t level,
+                                  GLenum internalFormat,
+                                  const Extents &amp;size,
+                                  size_t imageSize,
+                                  const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP &amp;&amp; IsCubeMapTextureTarget(target)));
</span><span class="cx"> 
</span><del>-    Error error = mTexture-&gt;setCompressedImage(target, level, internalFormat, size, unpack, pixels);
</del><ins>+    // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
+    releaseTexImageInternal();
+    orphanImages();
+
+    Error error = mTexture-&gt;setCompressedImage(target, level, internalFormat, size, unpackState,
+                                               imageSize, pixels);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    releaseTexImage();
-
</del><span class="cx">     setImageDesc(target, level, ImageDesc(size, GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE)));
</span><span class="cx"> 
</span><span class="cx">     return Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Error Texture::setCompressedSubImage(GLenum target, size_t level, const Box &amp;area, GLenum format,
-                                     const PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+Error Texture::setCompressedSubImage(const PixelUnpackState &amp;unpackState,
+                                     GLenum target,
+                                     size_t level,
+                                     const Box &amp;area,
+                                     GLenum format,
+                                     size_t imageSize,
+                                     const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP &amp;&amp; IsCubeMapTextureTarget(target)));
</span><span class="cx"> 
</span><del>-    return mTexture-&gt;setCompressedSubImage(target, level, area, format, unpack, pixels);
</del><ins>+    return mTexture-&gt;setCompressedSubImage(target, level, area, format, unpackState, imageSize,
+                                           pixels);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Error Texture::copyImage(GLenum target, size_t level, const Rectangle &amp;sourceArea, GLenum internalFormat,
</span><span class="lines">@@ -232,14 +453,16 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(target == mTarget || (mTarget == GL_TEXTURE_CUBE_MAP &amp;&amp; IsCubeMapTextureTarget(target)));
</span><span class="cx"> 
</span><ins>+    // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
+    releaseTexImageInternal();
+    orphanImages();
+
</ins><span class="cx">     Error error = mTexture-&gt;copyImage(target, level, sourceArea, internalFormat, source);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    releaseTexImage();
-
</del><span class="cx">     setImageDesc(target, level, ImageDesc(Extents(sourceArea.width, sourceArea.height, 1),
</span><span class="cx">                                           GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE)));
</span><span class="cx"> 
</span><span class="lines">@@ -258,32 +481,42 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(target == mTarget);
</span><span class="cx"> 
</span><ins>+    // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
+    releaseTexImageInternal();
+    orphanImages();
+
</ins><span class="cx">     Error error = mTexture-&gt;setStorage(target, levels, internalFormat, size);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    releaseTexImage();
-
-    mImmutableLevelCount = static_cast&lt;GLsizei&gt;(levels);
</del><ins>+    mTextureState.immutableFormat = true;
+    mTextureState.immutableLevels = static_cast&lt;GLuint&gt;(levels);
</ins><span class="cx">     clearImageDescs();
</span><span class="cx">     setImageDescChain(levels, size, internalFormat);
</span><span class="cx"> 
</span><span class="cx">     return Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> Error Texture::generateMipmaps()
</span><span class="cx"> {
</span><del>-    Error error = mTexture-&gt;generateMipmaps(getSamplerState());
</del><ins>+    // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
+    releaseTexImageInternal();
+
+    // EGL_KHR_gl_image states that images are only orphaned when generating mipmaps if the texture
+    // is not mip complete.
+    if (!isMipmapComplete())
+    {
+        orphanImages();
+    }
+
+    Error error = mTexture-&gt;generateMipmaps(mTextureState);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    releaseTexImage();
-
</del><span class="cx">     const ImageDesc &amp;baseImageInfo = getImageDesc(getBaseImageTarget(), 0);
</span><span class="cx">     size_t mipLevels = log2(std::max(std::max(baseImageInfo.size.width, baseImageInfo.size.height), baseImageInfo.size.depth)) + 1;
</span><span class="cx">     setImageDescChain(mipLevels, baseImageInfo.size, baseImageInfo.internalFormat);
</span><span class="lines">@@ -293,18 +526,19 @@
</span><span class="cx"> 
</span><span class="cx"> void Texture::setImageDescChain(size_t levels, Extents baseSize, GLenum sizedInternalFormat)
</span><span class="cx"> {
</span><del>-    for (size_t level = 0; level &lt; levels; level++)
</del><ins>+    for (int level = 0; level &lt; static_cast&lt;int&gt;(levels); level++)
</ins><span class="cx">     {
</span><del>-        Extents levelSize(std::max&lt;int&gt;(baseSize.width &gt;&gt; level, 1),
-                          std::max&lt;int&gt;(baseSize.height &gt;&gt; level, 1),
-                          (mTarget == GL_TEXTURE_2D_ARRAY) ? baseSize.depth : std::max&lt;int&gt;(baseSize.depth &gt;&gt; level, 1));
</del><ins>+        Extents levelSize(
+            std::max&lt;int&gt;(baseSize.width &gt;&gt; level, 1), std::max&lt;int&gt;(baseSize.height &gt;&gt; level, 1),
+            (mTarget == GL_TEXTURE_2D_ARRAY) ? baseSize.depth
+                                             : std::max&lt;int&gt;(baseSize.depth &gt;&gt; level, 1));
</ins><span class="cx">         ImageDesc levelInfo(levelSize, sizedInternalFormat);
</span><span class="cx"> 
</span><span class="cx">         if (mTarget == GL_TEXTURE_CUBE_MAP)
</span><span class="cx">         {
</span><del>-            for (size_t face = FirstCubeMapTextureTarget; face &lt;= LastCubeMapTextureTarget; face++)
</del><ins>+            for (GLenum face = FirstCubeMapTextureTarget; face &lt;= LastCubeMapTextureTarget; face++)
</ins><span class="cx">             {
</span><del>-                setImageDesc(static_cast&lt;GLenum&gt;(face), level, levelInfo);
</del><ins>+                setImageDesc(face, level, levelInfo);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="lines">@@ -354,11 +588,15 @@
</span><span class="cx">     mCompletenessCache.cacheValid = false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Texture::bindTexImage(egl::Surface *surface)
</del><ins>+void Texture::bindTexImageFromSurface(egl::Surface *surface)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(surface);
</span><span class="cx"> 
</span><del>-    releaseTexImage();
</del><ins>+    if (mBoundSurface)
+    {
+        releaseTexImageFromSurface();
+    }
+
</ins><span class="cx">     mTexture-&gt;bindTexImage(surface);
</span><span class="cx">     mBoundSurface = surface;
</span><span class="cx"> 
</span><span class="lines">@@ -369,40 +607,65 @@
</span><span class="cx">     setImageDesc(mTarget, 0, desc);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Texture::releaseTexImage()
</del><ins>+void Texture::releaseTexImageFromSurface()
</ins><span class="cx"> {
</span><ins>+    ASSERT(mBoundSurface);
+    mBoundSurface = nullptr;
+    mTexture-&gt;releaseTexImage();
+
+    // Erase the image info for level 0
+    ASSERT(mTarget == GL_TEXTURE_2D);
+    clearImageDesc(mTarget, 0);
+}
+
+void Texture::releaseTexImageInternal()
+{
</ins><span class="cx">     if (mBoundSurface)
</span><span class="cx">     {
</span><del>-        mBoundSurface = NULL;
-        mTexture-&gt;releaseTexImage();
</del><ins>+        // Notify the surface
+        mBoundSurface-&gt;releaseTexImageFromTexture();
</ins><span class="cx"> 
</span><del>-        // Erase the image info for level 0
-        ASSERT(mTarget == GL_TEXTURE_2D);
-        clearImageDesc(mTarget, 0);
</del><ins>+        // Then, call the same method as from the surface
+        releaseTexImageFromSurface();
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLenum Texture::getBaseImageTarget() const
</del><ins>+Error Texture::setEGLImageTarget(GLenum target, egl::Image *imageTarget)
</ins><span class="cx"> {
</span><del>-    return mTarget == GL_TEXTURE_CUBE_MAP ? FirstCubeMapTextureTarget : mTarget;
-}
</del><ins>+    ASSERT(target == mTarget);
+    ASSERT(target == GL_TEXTURE_2D);
</ins><span class="cx"> 
</span><del>-size_t Texture::getExpectedMipLevels() const
-{
-    const ImageDesc &amp;baseImageDesc = getImageDesc(getBaseImageTarget(), 0);
-    if (mTarget == GL_TEXTURE_3D)
</del><ins>+    // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
+    releaseTexImageInternal();
+    orphanImages();
+
+    Error error = mTexture-&gt;setEGLImageTarget(target, imageTarget);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        return log2(std::max(std::max(baseImageDesc.size.width, baseImageDesc.size.height), baseImageDesc.size.depth)) + 1;
</del><ins>+        return error;
</ins><span class="cx">     }
</span><del>-    else
-    {
-        return log2(std::max(baseImageDesc.size.width, baseImageDesc.size.height)) + 1;
-    }
</del><ins>+
+    setTargetImage(imageTarget);
+
+    Extents size(static_cast&lt;int&gt;(imageTarget-&gt;getWidth()),
+                 static_cast&lt;int&gt;(imageTarget-&gt;getHeight()), 1);
+    GLenum internalFormat = imageTarget-&gt;getInternalFormat();
+    GLenum type           = GetInternalFormatInfo(internalFormat).type;
+
+    clearImageDescs();
+    setImageDesc(target, 0, ImageDesc(size, GetSizedInternalFormat(internalFormat, type)));
+
+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLenum Texture::getBaseImageTarget() const
+{
+    return mTarget == GL_TEXTURE_CUBE_MAP ? FirstCubeMapTextureTarget : mTarget;
+}
+
</ins><span class="cx"> bool Texture::computeSamplerCompleteness(const SamplerState &amp;samplerState, const Data &amp;data) const
</span><span class="cx"> {
</span><del>-    const ImageDesc &amp;baseImageDesc = getImageDesc(getBaseImageTarget(), samplerState.baseLevel);
</del><ins>+    const ImageDesc &amp;baseImageDesc = getImageDesc(getBaseImageTarget(), mTextureState.baseLevel);
</ins><span class="cx">     if (baseImageDesc.size.width == 0 || baseImageDesc.size.height == 0 || baseImageDesc.size.depth == 0)
</span><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="lines">@@ -439,7 +702,7 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!computeMipmapCompleteness(samplerState))
</del><ins>+        if (!computeMipmapCompleteness())
</ins><span class="cx">         {
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="lines">@@ -473,19 +736,19 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Texture::computeMipmapCompleteness(const gl::SamplerState &amp;samplerState) const
</del><ins>+bool Texture::computeMipmapCompleteness() const
</ins><span class="cx"> {
</span><del>-    size_t expectedMipLevels = getExpectedMipLevels();
</del><ins>+    size_t expectedMipLevels = getMipCompleteLevels();
</ins><span class="cx"> 
</span><del>-    size_t maxLevel = std::min&lt;size_t&gt;(expectedMipLevels, samplerState.maxLevel + 1);
</del><ins>+    size_t maxLevel = std::min&lt;size_t&gt;(expectedMipLevels, mTextureState.maxLevel + 1);
</ins><span class="cx"> 
</span><del>-    for (size_t level = samplerState.baseLevel; level &lt; maxLevel; level++)
</del><ins>+    for (size_t level = mTextureState.baseLevel; level &lt; maxLevel; level++)
</ins><span class="cx">     {
</span><span class="cx">         if (mTarget == GL_TEXTURE_CUBE_MAP)
</span><span class="cx">         {
</span><span class="cx">             for (GLenum face = FirstCubeMapTextureTarget; face &lt;= LastCubeMapTextureTarget; face++)
</span><span class="cx">             {
</span><del>-                if (!computeLevelCompleteness(face, level, samplerState))
</del><ins>+                if (!computeLevelCompleteness(face, level))
</ins><span class="cx">                 {
</span><span class="cx">                     return false;
</span><span class="cx">                 }
</span><span class="lines">@@ -493,7 +756,7 @@
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            if (!computeLevelCompleteness(mTarget, level, samplerState))
</del><ins>+            if (!computeLevelCompleteness(mTarget, level))
</ins><span class="cx">             {
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="lines">@@ -503,47 +766,48 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
-bool Texture::computeLevelCompleteness(GLenum target, size_t level, const gl::SamplerState &amp;samplerState) const
</del><ins>+bool Texture::computeLevelCompleteness(GLenum target, size_t level) const
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(level &lt; IMPLEMENTATION_MAX_TEXTURE_LEVELS);
</span><span class="cx"> 
</span><del>-    if (isImmutable())
</del><ins>+    if (mTextureState.immutableFormat)
</ins><span class="cx">     {
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const ImageDesc &amp;baseImageDesc = getImageDesc(getBaseImageTarget(), samplerState.baseLevel);
</del><ins>+    const ImageDesc &amp;baseImageDesc = getImageDesc(getBaseImageTarget(), mTextureState.baseLevel);
</ins><span class="cx">     if (baseImageDesc.size.width == 0 || baseImageDesc.size.height == 0 || baseImageDesc.size.depth == 0)
</span><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // The base image level is complete if the width and height are positive
-    if (level == 0)
</del><ins>+    const ImageDesc &amp;levelImageDesc = getImageDesc(target, level);
+    if (levelImageDesc.size.width == 0 || levelImageDesc.size.height == 0 ||
+        levelImageDesc.size.depth == 0)
</ins><span class="cx">     {
</span><del>-        return true;
</del><ins>+        return false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const ImageDesc &amp;levelImageDesc = getImageDesc(target, level);
</del><span class="cx">     if (levelImageDesc.internalFormat != baseImageDesc.internalFormat)
</span><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (levelImageDesc.size.width != std::max(1, baseImageDesc.size.width &gt;&gt; level))
</del><ins>+    ASSERT(level &gt;= mTextureState.baseLevel);
+    const size_t relativeLevel = level - mTextureState.baseLevel;
+    if (levelImageDesc.size.width != std::max(1, baseImageDesc.size.width &gt;&gt; relativeLevel))
</ins><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (levelImageDesc.size.height != std::max(1, baseImageDesc.size.height &gt;&gt; level))
</del><ins>+    if (levelImageDesc.size.height != std::max(1, baseImageDesc.size.height &gt;&gt; relativeLevel))
</ins><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (mTarget == GL_TEXTURE_3D)
</span><span class="cx">     {
</span><del>-        if (levelImageDesc.size.depth != std::max(1, baseImageDesc.size.depth &gt;&gt; level))
</del><ins>+        if (levelImageDesc.size.depth != std::max(1, baseImageDesc.size.depth &gt;&gt; relativeLevel))
</ins><span class="cx">         {
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="lines">@@ -569,16 +833,11 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLsizei Texture::getAttachmentWidth(const gl::FramebufferAttachment::Target &amp;target) const
</del><ins>+Extents Texture::getAttachmentSize(const gl::FramebufferAttachment::Target &amp;target) const
</ins><span class="cx"> {
</span><del>-    return static_cast&lt;GLsizei&gt;(getWidth(target.textureIndex().type, target.textureIndex().mipIndex));
</del><ins>+    return getImageDesc(target.textureIndex().type, target.textureIndex().mipIndex).size;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLsizei Texture::getAttachmentHeight(const gl::FramebufferAttachment::Target &amp;target) const
-{
-    return static_cast&lt;GLsizei&gt;(getHeight(target.textureIndex().type, target.textureIndex().mipIndex));
-}
-
</del><span class="cx"> GLenum Texture::getAttachmentInternalFormat(const gl::FramebufferAttachment::Target &amp;target) const
</span><span class="cx"> {
</span><span class="cx">     return getInternalFormat(target.textureIndex().type, target.textureIndex().mipIndex);
</span><span class="lines">@@ -590,4 +849,18 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Texture::onAttach()
+{
+    addRef();
</ins><span class="cx"> }
</span><ins>+
+void Texture::onDetach()
+{
+    release();
+}
+
+GLuint Texture::getId() const
+{
+    return id();
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLETextureh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Texture.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Texture.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Texture.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,9 +15,11 @@
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Caps.h&quot;
</span><ins>+#include &quot;libANGLE/Debug.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Constants.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><ins>+#include &quot;libANGLE/Image.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/TextureImpl.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -31,85 +33,168 @@
</span><span class="cx"> class Framebuffer;
</span><span class="cx"> struct Data;
</span><span class="cx"> 
</span><del>-bool IsMipmapFiltered(const gl::SamplerState &amp;samplerState);
</del><ins>+bool IsMipmapFiltered(const SamplerState &amp;samplerState);
</ins><span class="cx"> 
</span><del>-class Texture final : public FramebufferAttachmentObject
</del><ins>+class Texture final : public egl::ImageSibling,
+                      public FramebufferAttachmentObject,
+                      public LabeledObject
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     Texture(rx::TextureImpl *impl, GLuint id, GLenum target);
</span><ins>+    ~Texture() override;
</ins><span class="cx"> 
</span><del>-    virtual ~Texture();
</del><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
</ins><span class="cx"> 
</span><span class="cx">     GLenum getTarget() const;
</span><span class="cx"> 
</span><del>-    const SamplerState &amp;getSamplerState() const { return mSamplerState; }
-    SamplerState &amp;getSamplerState() { return mSamplerState; }
</del><ins>+    void setSwizzleRed(GLenum swizzleRed);
+    GLenum getSwizzleRed() const;
</ins><span class="cx"> 
</span><ins>+    void setSwizzleGreen(GLenum swizzleGreen);
+    GLenum getSwizzleGreen() const;
+
+    void setSwizzleBlue(GLenum swizzleBlue);
+    GLenum getSwizzleBlue() const;
+
+    void setSwizzleAlpha(GLenum swizzleAlpha);
+    GLenum getSwizzleAlpha() const;
+
+    void setMinFilter(GLenum minFilter);
+    GLenum getMinFilter() const;
+
+    void setMagFilter(GLenum magFilter);
+    GLenum getMagFilter() const;
+
+    void setWrapS(GLenum wrapS);
+    GLenum getWrapS() const;
+
+    void setWrapT(GLenum wrapT);
+    GLenum getWrapT() const;
+
+    void setWrapR(GLenum wrapR);
+    GLenum getWrapR() const;
+
+    void setMaxAnisotropy(float maxAnisotropy);
+    float getMaxAnisotropy() const;
+
+    void setMinLod(GLfloat minLod);
+    GLfloat getMinLod() const;
+
+    void setMaxLod(GLfloat maxLod);
+    GLfloat getMaxLod() const;
+
+    void setCompareMode(GLenum compareMode);
+    GLenum getCompareMode() const;
+
+    void setCompareFunc(GLenum compareFunc);
+    GLenum getCompareFunc() const;
+
+    const SamplerState &amp;getSamplerState() const;
+
+    void setBaseLevel(GLuint baseLevel);
+    GLuint getBaseLevel() const;
+
+    void setMaxLevel(GLuint maxLevel);
+    GLuint getMaxLevel() const;
+
+    bool getImmutableFormat() const;
+
+    GLuint getImmutableLevels() const;
+
</ins><span class="cx">     void setUsage(GLenum usage);
</span><span class="cx">     GLenum getUsage() const;
</span><span class="cx"> 
</span><ins>+    const TextureState &amp;getTextureState() const;
+
</ins><span class="cx">     size_t getWidth(GLenum target, size_t level) const;
</span><span class="cx">     size_t getHeight(GLenum target, size_t level) const;
</span><span class="cx">     size_t getDepth(GLenum target, size_t level) const;
</span><span class="cx">     GLenum getInternalFormat(GLenum target, size_t level) const;
</span><span class="cx"> 
</span><span class="cx">     bool isSamplerComplete(const SamplerState &amp;samplerState, const Data &amp;data) const;
</span><ins>+    bool isMipmapComplete() const;
</ins><span class="cx">     bool isCubeComplete() const;
</span><ins>+    size_t getMipCompleteLevels() const;
</ins><span class="cx"> 
</span><del>-    virtual Error setImage(GLenum target, size_t level, GLenum internalFormat, const Extents &amp;size, GLenum format, GLenum type,
-                           const PixelUnpackState &amp;unpack, const uint8_t *pixels);
-    virtual Error setSubImage(GLenum target, size_t level, const Box &amp;area, GLenum format, GLenum type,
-                              const PixelUnpackState &amp;unpack, const uint8_t *pixels);
</del><ins>+    Error setImage(const PixelUnpackState &amp;unpackState,
+                   GLenum target,
+                   size_t level,
+                   GLenum internalFormat,
+                   const Extents &amp;size,
+                   GLenum format,
+                   GLenum type,
+                   const uint8_t *pixels);
+    Error setSubImage(const PixelUnpackState &amp;unpackState,
+                      GLenum target,
+                      size_t level,
+                      const Box &amp;area,
+                      GLenum format,
+                      GLenum type,
+                      const uint8_t *pixels);
</ins><span class="cx"> 
</span><del>-    virtual Error setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const Extents &amp;size,
-                                     const PixelUnpackState &amp;unpack, const uint8_t *pixels);
-    virtual Error setCompressedSubImage(GLenum target, size_t level, const Box &amp;area, GLenum format,
-                                        const PixelUnpackState &amp;unpack, const uint8_t *pixels);
</del><ins>+    Error setCompressedImage(const PixelUnpackState &amp;unpackState,
+                             GLenum target,
+                             size_t level,
+                             GLenum internalFormat,
+                             const Extents &amp;size,
+                             size_t imageSize,
+                             const uint8_t *pixels);
+    Error setCompressedSubImage(const PixelUnpackState &amp;unpackState,
+                                GLenum target,
+                                size_t level,
+                                const Box &amp;area,
+                                GLenum format,
+                                size_t imageSize,
+                                const uint8_t *pixels);
</ins><span class="cx"> 
</span><del>-    virtual Error copyImage(GLenum target, size_t level, const Rectangle &amp;sourceArea, GLenum internalFormat,
-                            const Framebuffer *source);
-    virtual Error copySubImage(GLenum target, size_t level, const Offset &amp;destOffset, const Rectangle &amp;sourceArea,
-                              const Framebuffer *source);
</del><ins>+    Error copyImage(GLenum target,
+                    size_t level,
+                    const Rectangle &amp;sourceArea,
+                    GLenum internalFormat,
+                    const Framebuffer *source);
+    Error copySubImage(GLenum target,
+                       size_t level,
+                       const Offset &amp;destOffset,
+                       const Rectangle &amp;sourceArea,
+                       const Framebuffer *source);
</ins><span class="cx"> 
</span><del>-    virtual Error setStorage(GLenum target, size_t levels, GLenum internalFormat, const Extents &amp;size);
</del><ins>+    Error setStorage(GLenum target, size_t levels, GLenum internalFormat, const Extents &amp;size);
</ins><span class="cx"> 
</span><del>-    virtual Error generateMipmaps();
</del><ins>+    Error setEGLImageTarget(GLenum target, egl::Image *imageTarget);
</ins><span class="cx"> 
</span><del>-    // Texture serials provide a unique way of identifying a Texture that isn't a raw pointer.
-    // &quot;id&quot; is not good enough, as Textures can be deleted, then re-allocated with the same id.
-    unsigned int getTextureSerial() const;
</del><ins>+    Error generateMipmaps();
</ins><span class="cx"> 
</span><del>-    bool isImmutable() const;
-    GLsizei immutableLevelCount();
</del><ins>+    egl::Surface *getBoundSurface() const;
</ins><span class="cx"> 
</span><del>-    void bindTexImage(egl::Surface *surface);
-    void releaseTexImage();
-
</del><span class="cx">     rx::TextureImpl *getImplementation() { return mTexture; }
</span><span class="cx">     const rx::TextureImpl *getImplementation() const { return mTexture; }
</span><span class="cx"> 
</span><del>-    static const GLuint INCOMPLETE_TEXTURE_ID = static_cast&lt;GLuint&gt;(-1);   // Every texture takes an id at creation time. The value is arbitrary because it is never registered with the resource manager.
-
</del><span class="cx">     // FramebufferAttachmentObject implementation
</span><del>-    GLsizei getAttachmentWidth(const FramebufferAttachment::Target &amp;target) const override;
-    GLsizei getAttachmentHeight(const FramebufferAttachment::Target &amp;target) const override;
</del><ins>+    Extents getAttachmentSize(const FramebufferAttachment::Target &amp;target) const override;
</ins><span class="cx">     GLenum getAttachmentInternalFormat(const FramebufferAttachment::Target &amp;target) const override;
</span><span class="cx">     GLsizei getAttachmentSamples(const FramebufferAttachment::Target &amp;target) const override;
</span><span class="cx"> 
</span><ins>+    void onAttach() override;
+    void onDetach() override;
+    GLuint getId() const override;
+
</ins><span class="cx">   private:
</span><span class="cx">     rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override { return mTexture; }
</span><del>-    static unsigned int issueTextureSerial();
</del><span class="cx"> 
</span><ins>+    // ANGLE-only method, used internally
+    friend class egl::Surface;
+    void bindTexImageFromSurface(egl::Surface *surface);
+    void releaseTexImageFromSurface();
+
</ins><span class="cx">     rx::TextureImpl *mTexture;
</span><span class="cx"> 
</span><del>-    SamplerState mSamplerState;
-    GLenum mUsage;
</del><ins>+    std::string mLabel;
</ins><span class="cx"> 
</span><del>-    GLsizei mImmutableLevelCount;
</del><ins>+    TextureState mTextureState;
</ins><span class="cx"> 
</span><span class="cx">     GLenum mTarget;
</span><span class="cx"> 
</span><del>-
</del><span class="cx">     struct ImageDesc
</span><span class="cx">     {
</span><span class="cx">         Extents size;
</span><span class="lines">@@ -119,21 +204,18 @@
</span><span class="cx">         ImageDesc(const Extents &amp;size, GLenum internalFormat);
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    const unsigned int mTextureSerial;
-    static unsigned int mCurrentTextureSerial;
-
</del><span class="cx">     GLenum getBaseImageTarget() const;
</span><del>-    size_t getExpectedMipLevels() const;
</del><span class="cx"> 
</span><span class="cx">     bool computeSamplerCompleteness(const SamplerState &amp;samplerState, const Data &amp;data) const;
</span><del>-    bool computeMipmapCompleteness(const gl::SamplerState &amp;samplerState) const;
-    bool computeLevelCompleteness(GLenum target, size_t level, const gl::SamplerState &amp;samplerState) const;
</del><ins>+    bool computeMipmapCompleteness() const;
+    bool computeLevelCompleteness(GLenum target, size_t level) const;
</ins><span class="cx"> 
</span><span class="cx">     const ImageDesc &amp;getImageDesc(GLenum target, size_t level) const;
</span><span class="cx">     void setImageDesc(GLenum target, size_t level, const ImageDesc &amp;desc);
</span><span class="cx">     void setImageDescChain(size_t levels, Extents baseSize, GLenum sizedInternalFormat);
</span><span class="cx">     void clearImageDesc(GLenum target, size_t level);
</span><span class="cx">     void clearImageDescs();
</span><ins>+    void releaseTexImageInternal();
</ins><span class="cx"> 
</span><span class="cx">     std::vector&lt;ImageDesc&gt; mImageDescs;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLETransformFeedbackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,25 +8,34 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Buffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Caps.h&quot;
</span><ins>+#include &quot;libANGLE/Program.h&quot;
+#include &quot;libANGLE/renderer/ImplFactory.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/TransformFeedbackImpl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-TransformFeedback::TransformFeedback(rx::TransformFeedbackImpl* impl, GLuint id, const Caps &amp;caps)
</del><ins>+TransformFeedback::TransformFeedback(rx::ImplFactory *implFactory, GLuint id, const Caps &amp;caps)
</ins><span class="cx">     : RefCountObject(id),
</span><del>-      mImplementation(impl),
</del><ins>+      mImplementation(implFactory-&gt;createTransformFeedback()),
+      mLabel(),
</ins><span class="cx">       mActive(false),
</span><span class="cx">       mPrimitiveMode(GL_NONE),
</span><span class="cx">       mPaused(false),
</span><ins>+      mProgram(nullptr),
</ins><span class="cx">       mGenericBuffer(),
</span><span class="cx">       mIndexedBuffers(caps.maxTransformFeedbackSeparateAttributes)
</span><span class="cx"> {
</span><del>-    ASSERT(impl != NULL);
</del><ins>+    ASSERT(mImplementation != nullptr);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TransformFeedback::~TransformFeedback()
</span><span class="cx"> {
</span><ins>+    if (mProgram)
+    {
+        mProgram-&gt;release();
+        mProgram = nullptr;
+    }
</ins><span class="cx">     mGenericBuffer.set(nullptr);
</span><span class="cx">     for (size_t i = 0; i &lt; mIndexedBuffers.size(); i++)
</span><span class="cx">     {
</span><span class="lines">@@ -36,12 +45,23 @@
</span><span class="cx">     SafeDelete(mImplementation);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TransformFeedback::begin(GLenum primitiveMode)
</del><ins>+void TransformFeedback::setLabel(const std::string &amp;label)
</ins><span class="cx"> {
</span><ins>+    mLabel = label;
+}
+
+const std::string &amp;TransformFeedback::getLabel() const
+{
+    return mLabel;
+}
+
+void TransformFeedback::begin(GLenum primitiveMode, Program *program)
+{
</ins><span class="cx">     mActive = true;
</span><span class="cx">     mPrimitiveMode = primitiveMode;
</span><span class="cx">     mPaused = false;
</span><span class="cx">     mImplementation-&gt;begin(primitiveMode);
</span><ins>+    bindProgram(program);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TransformFeedback::end()
</span><span class="lines">@@ -50,6 +70,11 @@
</span><span class="cx">     mPrimitiveMode = GL_NONE;
</span><span class="cx">     mPaused = false;
</span><span class="cx">     mImplementation-&gt;end();
</span><ins>+    if (mProgram)
+    {
+        mProgram-&gt;release();
+        mProgram = nullptr;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TransformFeedback::pause()
</span><span class="lines">@@ -79,12 +104,51 @@
</span><span class="cx">     return mPrimitiveMode;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TransformFeedback::bindProgram(Program *program)
+{
+    if (mProgram != program)
+    {
+        if (mProgram != nullptr)
+        {
+            mProgram-&gt;release();
+        }
+        mProgram = program;
+        if (mProgram != nullptr)
+        {
+            mProgram-&gt;addRef();
+        }
+    }
+}
+
+bool TransformFeedback::hasBoundProgram(GLuint program) const
+{
+    return mProgram != nullptr &amp;&amp; mProgram-&gt;id() == program;
+}
+
</ins><span class="cx"> void TransformFeedback::bindGenericBuffer(Buffer *buffer)
</span><span class="cx"> {
</span><span class="cx">     mGenericBuffer.set(buffer);
</span><span class="cx">     mImplementation-&gt;bindGenericBuffer(mGenericBuffer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TransformFeedback::detachBuffer(GLuint bufferName)
+{
+    for (size_t index = 0; index &lt; mIndexedBuffers.size(); index++)
+    {
+        if (mIndexedBuffers[index].id() == bufferName)
+        {
+            mIndexedBuffers[index].set(nullptr);
+            mImplementation-&gt;bindIndexedBuffer(index, mIndexedBuffers[index]);
+        }
+    }
+
+    if (mGenericBuffer.id() == bufferName)
+    {
+        mGenericBuffer.set(nullptr);
+        mImplementation-&gt;bindGenericBuffer(mGenericBuffer);
+    }
+}
+
</ins><span class="cx"> const BindingPointer&lt;Buffer&gt; &amp;TransformFeedback::getGenericBuffer() const
</span><span class="cx"> {
</span><span class="cx">     return mGenericBuffer;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLETransformFeedbackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,11 +10,13 @@
</span><span class="cx"> #include &quot;libANGLE/RefCountObject.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><ins>+#include &quot;libANGLE/Debug.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+class ImplFactory;
</ins><span class="cx"> class TransformFeedbackImpl;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -22,14 +24,18 @@
</span><span class="cx"> {
</span><span class="cx"> class Buffer;
</span><span class="cx"> struct Caps;
</span><ins>+class Program;
</ins><span class="cx"> 
</span><del>-class TransformFeedback : public RefCountObject
</del><ins>+class TransformFeedback final : public RefCountObject, public LabeledObject
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    TransformFeedback(rx::TransformFeedbackImpl* impl, GLuint id, const Caps &amp;caps);
</del><ins>+    TransformFeedback(rx::ImplFactory *implFactory, GLuint id, const Caps &amp;caps);
</ins><span class="cx">     virtual ~TransformFeedback();
</span><span class="cx"> 
</span><del>-    void begin(GLenum primitiveMode);
</del><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
+
+    void begin(GLenum primitiveMode, Program *program);
</ins><span class="cx">     void end();
</span><span class="cx">     void pause();
</span><span class="cx">     void resume();
</span><span class="lines">@@ -38,6 +44,8 @@
</span><span class="cx">     bool isPaused() const;
</span><span class="cx">     GLenum getPrimitiveMode() const;
</span><span class="cx"> 
</span><ins>+    bool hasBoundProgram(GLuint program) const;
+
</ins><span class="cx">     void bindGenericBuffer(Buffer *buffer);
</span><span class="cx">     const BindingPointer&lt;Buffer&gt; &amp;getGenericBuffer() const;
</span><span class="cx"> 
</span><span class="lines">@@ -45,16 +53,24 @@
</span><span class="cx">     const OffsetBindingPointer&lt;Buffer&gt; &amp;getIndexedBuffer(size_t index) const;
</span><span class="cx">     size_t getIndexedBufferCount() const;
</span><span class="cx"> 
</span><ins>+    void detachBuffer(GLuint bufferName);
+
</ins><span class="cx">     rx::TransformFeedbackImpl *getImplementation();
</span><span class="cx">     const rx::TransformFeedbackImpl *getImplementation() const;
</span><span class="cx"> 
</span><span class="cx">   private:
</span><ins>+    void bindProgram(Program *program);
+
</ins><span class="cx">     rx::TransformFeedbackImpl* mImplementation;
</span><span class="cx"> 
</span><ins>+    std::string mLabel;
+
</ins><span class="cx">     bool mActive;
</span><span class="cx">     GLenum mPrimitiveMode;
</span><span class="cx">     bool mPaused;
</span><span class="cx"> 
</span><ins>+    Program *mProgram;
+
</ins><span class="cx">     BindingPointer&lt;Buffer&gt; mGenericBuffer;
</span><span class="cx">     std::vector&lt;OffsetBindingPointer&lt;Buffer&gt;&gt; mIndexedBuffers;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLETransformFeedback_unittestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback_unittest.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback_unittest.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/TransformFeedback_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,10 +6,12 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;gmock/gmock.h&quot;
</span><span class="cx"> #include &quot;gtest/gtest.h&quot;
</span><ins>+#include &quot;libANGLE/Buffer.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Caps.h&quot;
</span><span class="cx"> #include &quot;libANGLE/TransformFeedback.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/BufferImpl_mock.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/TransformFeedbackImpl_mock.h&quot;
</span><ins>+#include &quot;tests/angle_unittests_utils.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> using ::testing::_;
</span><span class="cx"> using ::testing::Return;
</span><span class="lines">@@ -18,52 +20,58 @@
</span><span class="cx"> namespace
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+class MockFactory : public rx::NullFactory
+{
+  public:
+    MOCK_METHOD0(createTransformFeedback, rx::TransformFeedbackImpl *());
+};
+
</ins><span class="cx"> class TransformFeedbackTest : public testing::Test
</span><span class="cx"> {
</span><span class="cx">   protected:
</span><del>-    virtual void SetUp()
</del><ins>+    TransformFeedbackTest() : mImpl(nullptr), mFeedback(nullptr) {}
+
+    void SetUp() override
</ins><span class="cx">     {
</span><ins>+        mImpl = new rx::MockTransformFeedbackImpl;
+        EXPECT_CALL(mMockFactory, createTransformFeedback())
+            .WillOnce(Return(mImpl))
+            .RetiresOnSaturation();
+
</ins><span class="cx">         // Set a reasonable number of tf attributes
</span><span class="cx">         mCaps.maxTransformFeedbackSeparateAttributes = 8;
</span><span class="cx"> 
</span><del>-        mImpl = new rx::MockTransformFeedbackImpl;
</del><span class="cx">         EXPECT_CALL(*mImpl, destructor());
</span><del>-        mFeedback = new gl::TransformFeedback(mImpl, 1, mCaps);
</del><ins>+        mFeedback = new gl::TransformFeedback(&amp;mMockFactory, 1, mCaps);
</ins><span class="cx">         mFeedback-&gt;addRef();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual void TearDown()
</del><ins>+    void TearDown() override
</ins><span class="cx">     {
</span><del>-        mFeedback-&gt;release();
</del><ins>+        if (mFeedback)
+        {
+            mFeedback-&gt;release();
+        }
+
+        // Only needed because the mock is leaked if bugs are present,
+        // which logs an error, but does not cause the test to fail.
+        // Ordinarily mocks are verified when destroyed.
+        testing::Mock::VerifyAndClear(mImpl);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    MockFactory mMockFactory;
</ins><span class="cx">     rx::MockTransformFeedbackImpl* mImpl;
</span><span class="cx">     gl::TransformFeedback* mFeedback;
</span><span class="cx">     gl::Caps mCaps;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-TEST_F(TransformFeedbackTest, DestructionDeletesImpl)
-{
-    rx::MockTransformFeedbackImpl* impl = new rx::MockTransformFeedbackImpl;
-    EXPECT_CALL(*impl, destructor()).Times(1).RetiresOnSaturation();
-
-    gl::TransformFeedback* feedback = new gl::TransformFeedback(impl, 1, mCaps);
-    feedback-&gt;addRef();
-    feedback-&gt;release();
-
-    // Only needed because the mock is leaked if bugs are present,
-    // which logs an error, but does not cause the test to fail.
-    // Ordinarily mocks are verified when destroyed.
-    testing::Mock::VerifyAndClear(impl);
-}
-
</del><span class="cx"> TEST_F(TransformFeedbackTest, SideEffectsOfStartAndStop)
</span><span class="cx"> {
</span><span class="cx">     testing::InSequence seq;
</span><span class="cx"> 
</span><span class="cx">     EXPECT_FALSE(mFeedback-&gt;isActive());
</span><span class="cx">     EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
</span><del>-    mFeedback-&gt;begin(GL_TRIANGLES);
</del><ins>+    mFeedback-&gt;begin(GL_TRIANGLES, nullptr);
</ins><span class="cx">     EXPECT_TRUE(mFeedback-&gt;isActive());
</span><span class="cx">     EXPECT_EQ(static_cast&lt;GLenum&gt;(GL_TRIANGLES), mFeedback-&gt;getPrimitiveMode());
</span><span class="cx">     EXPECT_CALL(*mImpl, end());
</span><span class="lines">@@ -77,7 +85,7 @@
</span><span class="cx"> 
</span><span class="cx">     EXPECT_FALSE(mFeedback-&gt;isActive());
</span><span class="cx">     EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
</span><del>-    mFeedback-&gt;begin(GL_TRIANGLES);
</del><ins>+    mFeedback-&gt;begin(GL_TRIANGLES, nullptr);
</ins><span class="cx">     EXPECT_FALSE(mFeedback-&gt;isPaused());
</span><span class="cx">     EXPECT_CALL(*mImpl, pause());
</span><span class="cx">     mFeedback-&gt;pause();
</span><span class="lines">@@ -97,35 +105,36 @@
</span><span class="cx"> 
</span><span class="cx">     static const size_t bindIndex = 0;
</span><span class="cx"> 
</span><del>-    rx::MockTransformFeedbackImpl *feedbackImpl = new rx::MockTransformFeedbackImpl;
-    EXPECT_CALL(*feedbackImpl, destructor()).Times(1).RetiresOnSaturation();
</del><ins>+    EXPECT_EQ(mFeedback-&gt;getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
</ins><span class="cx"> 
</span><del>-    gl::TransformFeedback *feedback = new gl::TransformFeedback(feedbackImpl, 1, mCaps);
</del><ins>+    EXPECT_CALL(*mImpl, bindGenericBuffer(_));
+    mFeedback-&gt;bindGenericBuffer(buffer);
+    EXPECT_EQ(mFeedback-&gt;getGenericBuffer().get(), buffer);
</ins><span class="cx"> 
</span><del>-    EXPECT_EQ(feedback-&gt;getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
-
-    EXPECT_CALL(*feedbackImpl, bindGenericBuffer(_));
-    feedback-&gt;bindGenericBuffer(buffer);
-    EXPECT_EQ(feedback-&gt;getGenericBuffer().get(), buffer);
-
-    EXPECT_CALL(*feedbackImpl, bindIndexedBuffer(_, _));
-    feedback-&gt;bindIndexedBuffer(bindIndex, buffer, 0, 1);
-    for (size_t i = 0; i &lt; feedback-&gt;getIndexedBufferCount(); i++)
</del><ins>+    EXPECT_CALL(*mImpl, bindIndexedBuffer(_, _));
+    mFeedback-&gt;bindIndexedBuffer(bindIndex, buffer, 0, 1);
+    for (size_t i = 0; i &lt; mFeedback-&gt;getIndexedBufferCount(); i++)
</ins><span class="cx">     {
</span><span class="cx">         if (i == bindIndex)
</span><span class="cx">         {
</span><del>-            EXPECT_EQ(feedback-&gt;getIndexedBuffer(i).get(), buffer);
</del><ins>+            EXPECT_EQ(mFeedback-&gt;getIndexedBuffer(i).get(), buffer);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            EXPECT_EQ(feedback-&gt;getIndexedBuffer(i).get(), nullptr);
</del><ins>+            EXPECT_EQ(mFeedback-&gt;getIndexedBuffer(i).get(), nullptr);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    feedback-&gt;addRef();
-    feedback-&gt;release();
</del><ins>+    // force-release the feedback object to ensure the buffer is released.
+    const size_t releaseCount = mFeedback-&gt;getRefCount();
+    for (size_t count = 0; count &lt; releaseCount; ++count)
+    {
+        mFeedback-&gt;release();
+    }
</ins><span class="cx"> 
</span><ins>+    mFeedback = nullptr;
+
</ins><span class="cx">     testing::Mock::VerifyAndClear(bufferImpl);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-} // namespace
</del><ins>+}  // anonymous namespace
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEUniformcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Uniform.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Uniform.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Uniform.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,55 +13,51 @@
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-LinkedUniform::LinkedUniform(GLenum type, GLenum precision, const std::string &amp;name, unsigned int arraySize,
-                             const int blockIndex, const sh::BlockMemberInfo &amp;blockInfo)
-    : type(type),
-      precision(precision),
-      name(name),
-      arraySize(arraySize),
-      blockIndex(blockIndex),
-      blockInfo(blockInfo),
-      data(NULL),
-      dirty(true),
-      psRegisterIndex(GL_INVALID_INDEX),
-      vsRegisterIndex(GL_INVALID_INDEX),
-      registerCount(0),
-      registerElement(0)
</del><ins>+LinkedUniform::LinkedUniform()
+    : blockIndex(-1), blockInfo(sh::BlockMemberInfo::getDefaultBlockInfo())
</ins><span class="cx"> {
</span><del>-    // We use data storage for default block uniforms to cache values that are sent to D3D during rendering
-    // Uniform blocks/buffers are treated separately by the Renderer (ES3 path only)
-    if (isInDefaultBlock())
-    {
-        size_t bytes = dataSize();
-        data = new unsigned char[bytes];
-        memset(data, 0, bytes);
-        registerCount = VariableRowCount(type) * elementCount();
-    }
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-LinkedUniform::~LinkedUniform()
</del><ins>+LinkedUniform::LinkedUniform(GLenum typeIn,
+                             GLenum precisionIn,
+                             const std::string &amp;nameIn,
+                             unsigned int arraySizeIn,
+                             const int blockIndexIn,
+                             const sh::BlockMemberInfo &amp;blockInfoIn)
+    : blockIndex(blockIndexIn), blockInfo(blockInfoIn)
</ins><span class="cx"> {
</span><del>-    delete[] data;
</del><ins>+    type      = typeIn;
+    precision = precisionIn;
+    name      = nameIn;
+    arraySize = arraySizeIn;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool LinkedUniform::isArray() const
</del><ins>+LinkedUniform::LinkedUniform(const sh::Uniform &amp;uniform)
+    : sh::Uniform(uniform), blockIndex(-1), blockInfo(sh::BlockMemberInfo::getDefaultBlockInfo())
</ins><span class="cx"> {
</span><del>-    return arraySize &gt; 0;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int LinkedUniform::elementCount() const
</del><ins>+LinkedUniform::LinkedUniform(const LinkedUniform &amp;uniform)
+    : sh::Uniform(uniform), blockIndex(uniform.blockIndex), blockInfo(uniform.blockInfo)
</ins><span class="cx"> {
</span><del>-    return arraySize &gt; 0 ? arraySize : 1;
</del><ins>+    // This function is not intended to be called during runtime.
+    ASSERT(uniform.mLazyData.empty());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool LinkedUniform::isReferencedByVertexShader() const
</del><ins>+LinkedUniform &amp;LinkedUniform::operator=(const LinkedUniform &amp;uniform)
</ins><span class="cx"> {
</span><del>-    return vsRegisterIndex != GL_INVALID_INDEX;
</del><ins>+    // This function is not intended to be called during runtime.
+    ASSERT(uniform.mLazyData.empty());
+
+    sh::Uniform::operator=(uniform);
+    blockIndex           = uniform.blockIndex;
+    blockInfo            = uniform.blockInfo;
+
+    return *this;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool LinkedUniform::isReferencedByFragmentShader() const
</del><ins>+LinkedUniform::~LinkedUniform()
</ins><span class="cx"> {
</span><del>-    return psRegisterIndex != GL_INVALID_INDEX;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool LinkedUniform::isInDefaultBlock() const
</span><span class="lines">@@ -72,41 +68,82 @@
</span><span class="cx"> size_t LinkedUniform::dataSize() const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(type != GL_STRUCT_ANGLEX);
</span><del>-    return VariableInternalSize(type) * elementCount();
</del><ins>+    if (mLazyData.empty())
+    {
+        mLazyData.resize(VariableExternalSize(type) * elementCount());
+        ASSERT(!mLazyData.empty());
+    }
+
+    return mLazyData.size();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+uint8_t *LinkedUniform::data()
+{
+    if (mLazyData.empty())
+    {
+        // dataSize() will init the data store.
+        size_t size = dataSize();
+        memset(mLazyData.data(), 0, size);
+    }
+
+    return mLazyData.data();
+}
+
+const uint8_t *LinkedUniform::data() const
+{
+    return const_cast&lt;LinkedUniform *&gt;(this)-&gt;data();
+}
+
</ins><span class="cx"> bool LinkedUniform::isSampler() const
</span><span class="cx"> {
</span><span class="cx">     return IsSamplerType(type);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool LinkedUniform::isBuiltIn() const
</del><ins>+bool LinkedUniform::isField() const
</ins><span class="cx"> {
</span><del>-    return name.compare(0, 3, &quot;gl_&quot;) == 0;
</del><ins>+    return name.find('.') != std::string::npos;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-UniformBlock::UniformBlock(const std::string &amp;name, unsigned int elementIndex, unsigned int dataSize)
-    : name(name),
-      elementIndex(elementIndex),
-      dataSize(dataSize),
-      psRegisterIndex(GL_INVALID_INDEX),
-      vsRegisterIndex(GL_INVALID_INDEX)
</del><ins>+size_t LinkedUniform::getElementSize() const
</ins><span class="cx"> {
</span><ins>+    return VariableExternalSize(type);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool UniformBlock::isArrayElement() const
</del><ins>+uint8_t *LinkedUniform::getDataPtrToElement(size_t elementIndex)
</ins><span class="cx"> {
</span><del>-    return elementIndex != GL_INVALID_INDEX;
</del><ins>+    ASSERT((!isArray() &amp;&amp; elementIndex == 0) || (isArray() &amp;&amp; elementIndex &lt; arraySize));
+    return data() + getElementSize() * elementIndex;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool UniformBlock::isReferencedByVertexShader() const
</del><ins>+const uint8_t *LinkedUniform::getDataPtrToElement(size_t elementIndex) const
</ins><span class="cx"> {
</span><del>-    return vsRegisterIndex != GL_INVALID_INDEX;
</del><ins>+    return const_cast&lt;LinkedUniform *&gt;(this)-&gt;getDataPtrToElement(elementIndex);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool UniformBlock::isReferencedByFragmentShader() const
</del><ins>+UniformBlock::UniformBlock()
+    : isArray(false), arrayElement(0), dataSize(0), vertexStaticUse(false), fragmentStaticUse(false)
</ins><span class="cx"> {
</span><del>-    return psRegisterIndex != GL_INVALID_INDEX;
</del><span class="cx"> }
</span><span class="cx"> 
</span><ins>+UniformBlock::UniformBlock(const std::string &amp;nameIn, bool isArrayIn, unsigned int arrayElementIn)
+    : name(nameIn),
+      isArray(isArrayIn),
+      arrayElement(arrayElementIn),
+      dataSize(0),
+      vertexStaticUse(false),
+      fragmentStaticUse(false)
+{
</ins><span class="cx"> }
</span><ins>+
+std::string UniformBlock::nameWithArrayIndex() const
+{
+    std::stringstream fullNameStr;
+    fullNameStr &lt;&lt; name;
+    if (isArray)
+    {
+        fullNameStr &lt;&lt; &quot;[&quot; &lt;&lt; arrayElement &lt;&lt; &quot;]&quot;;
+    }
+
+    return fullNameStr.str();
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEUniformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Uniform.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Uniform.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Uniform.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,6 +12,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><ins>+#include &quot;common/MemoryBuffer.h&quot;
</ins><span class="cx"> #include &quot;compiler/translator/blocklayout.h&quot;
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -19,58 +20,51 @@
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> // Helper struct representing a single shader uniform
</span><del>-struct LinkedUniform : angle::NonCopyable
</del><ins>+struct LinkedUniform : public sh::Uniform
</ins><span class="cx"> {
</span><ins>+    LinkedUniform();
</ins><span class="cx">     LinkedUniform(GLenum type, GLenum precision, const std::string &amp;name, unsigned int arraySize, const int blockIndex, const sh::BlockMemberInfo &amp;blockInfo);
</span><del>-
</del><ins>+    LinkedUniform(const sh::Uniform &amp;uniform);
+    LinkedUniform(const LinkedUniform &amp;uniform);
+    LinkedUniform &amp;operator=(const LinkedUniform &amp;uniform);
</ins><span class="cx">     ~LinkedUniform();
</span><span class="cx"> 
</span><del>-    bool isArray() const;
-    unsigned int elementCount() const;
-    bool isReferencedByVertexShader() const;
-    bool isReferencedByFragmentShader() const;
-    bool isInDefaultBlock() const;
</del><span class="cx">     size_t dataSize() const;
</span><ins>+    uint8_t *data();
+    const uint8_t *data() const;
</ins><span class="cx">     bool isSampler() const;
</span><del>-    bool isBuiltIn() const;
</del><ins>+    bool isInDefaultBlock() const;
+    bool isField() const;
+    size_t getElementSize() const;
+    uint8_t *getDataPtrToElement(size_t elementIndex);
+    const uint8_t *getDataPtrToElement(size_t elementIndex) const;
</ins><span class="cx"> 
</span><del>-    const GLenum type;
-    const GLenum precision;
-    const std::string name;
-    const unsigned int arraySize;
-    const int blockIndex;
-    const sh::BlockMemberInfo blockInfo;
</del><ins>+    int blockIndex;
+    sh::BlockMemberInfo blockInfo;
</ins><span class="cx"> 
</span><del>-    unsigned char *data;
-    bool dirty;
-
-    unsigned int psRegisterIndex;
-    unsigned int vsRegisterIndex;
-    unsigned int registerCount;
-
-    // Register &quot;elements&quot; are used for uniform structs in ES3, to appropriately identify single uniforms
-    // inside aggregate types, which are packed according C-like structure rules.
-    unsigned int registerElement;
</del><ins>+  private:
+    mutable rx::MemoryBuffer mLazyData;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // Helper struct representing a single shader uniform block
</span><del>-struct UniformBlock : angle::NonCopyable
</del><ins>+struct UniformBlock
</ins><span class="cx"> {
</span><del>-    // use GL_INVALID_INDEX for non-array elements
-    UniformBlock(const std::string &amp;name, unsigned int elementIndex, unsigned int dataSize);
</del><ins>+    UniformBlock();
+    UniformBlock(const std::string &amp;nameIn, bool isArrayIn, unsigned int arrayElementIn);
+    UniformBlock(const UniformBlock &amp;other) = default;
+    UniformBlock &amp;operator=(const UniformBlock &amp;other) = default;
</ins><span class="cx"> 
</span><del>-    bool isArrayElement() const;
-    bool isReferencedByVertexShader() const;
-    bool isReferencedByFragmentShader() const;
</del><ins>+    std::string nameWithArrayIndex() const;
</ins><span class="cx"> 
</span><del>-    const std::string name;
-    const unsigned int elementIndex;
-    const unsigned int dataSize;
</del><ins>+    std::string name;
+    bool isArray;
+    unsigned int arrayElement;
+    unsigned int dataSize;
</ins><span class="cx"> 
</span><del>-    std::vector&lt;unsigned int&gt; memberUniformIndexes;
</del><ins>+    bool vertexStaticUse;
+    bool fragmentStaticUse;
</ins><span class="cx"> 
</span><del>-    unsigned int psRegisterIndex;
-    unsigned int vsRegisterIndex;
</del><ins>+    std::vector&lt;unsigned int&gt; memberUniformIndexes;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEVersionh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Version.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Version.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Version.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Version.h: Encapsulation of a GL version.
+
+#ifndef LIBANGLE_VERSION_H_
+#define LIBANGLE_VERSION_H_
+
+#include &lt;angle_gl.h&gt;
+
+namespace gl
+{
+
+struct Version
+{
+    Version();
+    Version(GLuint major, GLuint minor);
+
+    GLuint major;
+    GLuint minor;
+};
+
+bool operator&gt;=(const Version &amp;a, const Version &amp;b);
+bool operator&lt;(const Version &amp;a, const Version &amp;b);
+
+}
+
+#include &quot;Version.inl&quot;
+
+#endif // LIBANGLE_VERSION_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEVersioninl"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/Version.inl (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/Version.inl                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/Version.inl        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Version.inl: Encapsulation of a GL version.
+
+namespace gl
+{
+
+inline Version::Version()
+    : Version(0, 0)
+{
+}
+
+inline Version::Version(GLuint major_, GLuint minor_)
+{
+    major = major_;
+    minor = minor_;
+}
+
+inline bool operator&gt;=(const Version &amp;a, const Version &amp;b)
+{
+    return a.major &gt; b.major || (a.major == b.major &amp;&amp; a.minor &gt;= b.minor);
+}
+
+inline bool operator&lt;(const Version &amp;a, const Version &amp;b)
+{
+    return !(a &gt;= b);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEVertexArraycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexArray.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexArray.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexArray.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,108 +8,131 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/VertexArray.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Buffer.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/ImplFactory.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/VertexArrayImpl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-VertexArray::VertexArray(rx::VertexArrayImpl *impl, GLuint id, size_t maxAttribs)
-    : mId(id),
-      mVertexArray(impl),
-      mVertexAttributes(maxAttribs),
-      mMaxEnabledAttribute(0)
</del><ins>+VertexArray::Data::Data(size_t maxAttribs)
+    : mLabel(), mVertexAttributes(maxAttribs), mMaxEnabledAttribute(0)
</ins><span class="cx"> {
</span><del>-    ASSERT(impl != NULL);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-VertexArray::~VertexArray()
</del><ins>+VertexArray::Data::~Data()
</ins><span class="cx"> {
</span><del>-    SafeDelete(mVertexArray);
-
</del><span class="cx">     for (size_t i = 0; i &lt; getMaxAttribs(); i++)
</span><span class="cx">     {
</span><del>-        mVertexAttributes[i].buffer.set(NULL);
</del><ins>+        mVertexAttributes[i].buffer.set(nullptr);
</ins><span class="cx">     }
</span><del>-    mElementArrayBuffer.set(NULL);
</del><ins>+    mElementArrayBuffer.set(nullptr);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+VertexArray::VertexArray(rx::ImplFactory *factory, GLuint id, size_t maxAttribs)
+    : mId(id), mData(maxAttribs), mVertexArray(factory-&gt;createVertexArray(mData))
+{
+}
+
+VertexArray::~VertexArray()
+{
+    SafeDelete(mVertexArray);
+}
+
</ins><span class="cx"> GLuint VertexArray::id() const
</span><span class="cx"> {
</span><span class="cx">     return mId;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void VertexArray::setLabel(const std::string &amp;label)
+{
+    mData.mLabel = label;
+}
+
+const std::string &amp;VertexArray::getLabel() const
+{
+    return mData.mLabel;
+}
+
</ins><span class="cx"> void VertexArray::detachBuffer(GLuint bufferName)
</span><span class="cx"> {
</span><span class="cx">     for (size_t attribute = 0; attribute &lt; getMaxAttribs(); attribute++)
</span><span class="cx">     {
</span><del>-        if (mVertexAttributes[attribute].buffer.id() == bufferName)
</del><ins>+        if (mData.mVertexAttributes[attribute].buffer.id() == bufferName)
</ins><span class="cx">         {
</span><del>-            mVertexAttributes[attribute].buffer.set(NULL);
</del><ins>+            mData.mVertexAttributes[attribute].buffer.set(nullptr);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (mElementArrayBuffer.id() == bufferName)
</del><ins>+    if (mData.mElementArrayBuffer.id() == bufferName)
</ins><span class="cx">     {
</span><del>-        mElementArrayBuffer.set(NULL);
</del><ins>+        mData.mElementArrayBuffer.set(nullptr);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const VertexAttribute&amp; VertexArray::getVertexAttribute(size_t attributeIndex) const
</del><ins>+const VertexAttribute &amp;VertexArray::getVertexAttribute(size_t attributeIndex) const
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(attributeIndex &lt; getMaxAttribs());
</span><del>-    return mVertexAttributes[attributeIndex];
</del><ins>+    return mData.mVertexAttributes[attributeIndex];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const std::vector&lt;VertexAttribute&gt; &amp;VertexArray::getVertexAttributes() const
</del><ins>+void VertexArray::setVertexAttribDivisor(size_t index, GLuint divisor)
</ins><span class="cx"> {
</span><del>-    return mVertexAttributes;
-}
-
-void VertexArray::setVertexAttribDivisor(GLuint index, GLuint divisor)
-{
</del><span class="cx">     ASSERT(index &lt; getMaxAttribs());
</span><del>-    mVertexAttributes[index].divisor = divisor;
-    mVertexArray-&gt;setAttributeDivisor(index, divisor);
</del><ins>+    mData.mVertexAttributes[index].divisor = divisor;
+    mDirtyBits.set(DIRTY_BIT_ATTRIB_0_DIVISOR + index);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void VertexArray::enableAttribute(unsigned int attributeIndex, bool enabledState)
</del><ins>+void VertexArray::enableAttribute(size_t attributeIndex, bool enabledState)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(attributeIndex &lt; getMaxAttribs());
</span><del>-    mVertexAttributes[attributeIndex].enabled = enabledState;
-    mVertexArray-&gt;enableAttribute(attributeIndex, enabledState);
</del><ins>+    mData.mVertexAttributes[attributeIndex].enabled = enabledState;
+    mDirtyBits.set(DIRTY_BIT_ATTRIB_0_ENABLED + attributeIndex);
</ins><span class="cx"> 
</span><span class="cx">     // Update state cache
</span><span class="cx">     if (enabledState)
</span><span class="cx">     {
</span><del>-        mMaxEnabledAttribute = std::max(attributeIndex, mMaxEnabledAttribute);
</del><ins>+        mData.mMaxEnabledAttribute = std::max(attributeIndex + 1, mData.mMaxEnabledAttribute);
</ins><span class="cx">     }
</span><del>-    else if (mMaxEnabledAttribute == attributeIndex)
</del><ins>+    else if (mData.mMaxEnabledAttribute == attributeIndex + 1)
</ins><span class="cx">     {
</span><del>-        while (mMaxEnabledAttribute &gt; 0 &amp;&amp; !mVertexAttributes[mMaxEnabledAttribute].enabled)
</del><ins>+        while (mData.mMaxEnabledAttribute &gt; 0 &amp;&amp;
+               !mData.mVertexAttributes[mData.mMaxEnabledAttribute - 1].enabled)
</ins><span class="cx">         {
</span><del>-            --mMaxEnabledAttribute;
</del><ins>+            --mData.mMaxEnabledAttribute;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void VertexArray::setAttributeState(unsigned int attributeIndex, gl::Buffer *boundBuffer, GLint size, GLenum type,
</del><ins>+void VertexArray::setAttributeState(size_t attributeIndex, gl::Buffer *boundBuffer, GLint size, GLenum type,
</ins><span class="cx">                                     bool normalized, bool pureInteger, GLsizei stride, const void *pointer)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(attributeIndex &lt; getMaxAttribs());
</span><del>-    mVertexAttributes[attributeIndex].buffer.set(boundBuffer);
-    mVertexAttributes[attributeIndex].size = size;
-    mVertexAttributes[attributeIndex].type = type;
-    mVertexAttributes[attributeIndex].normalized = normalized;
-    mVertexAttributes[attributeIndex].pureInteger = pureInteger;
-    mVertexAttributes[attributeIndex].stride = stride;
-    mVertexAttributes[attributeIndex].pointer = pointer;
-    mVertexArray-&gt;setAttribute(attributeIndex, mVertexAttributes[attributeIndex]);
</del><ins>+
+    VertexAttribute *attrib = &amp;mData.mVertexAttributes[attributeIndex];
+
+    attrib-&gt;buffer.set(boundBuffer);
+    attrib-&gt;size = size;
+    attrib-&gt;type = type;
+    attrib-&gt;normalized = normalized;
+    attrib-&gt;pureInteger = pureInteger;
+    attrib-&gt;stride = stride;
+    attrib-&gt;pointer = pointer;
+    mDirtyBits.set(DIRTY_BIT_ATTRIB_0_POINTER + attributeIndex);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void VertexArray::setElementArrayBuffer(Buffer *buffer)
</span><span class="cx"> {
</span><del>-    mElementArrayBuffer.set(buffer);
-    mVertexArray-&gt;setElementArrayBuffer(buffer);
</del><ins>+    mData.mElementArrayBuffer.set(buffer);
+    mDirtyBits.set(DIRTY_BIT_ELEMENT_ARRAY_BUFFER);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void VertexArray::syncImplState()
+{
+    if (mDirtyBits.any())
+    {
+        mVertexArray-&gt;syncState(mDirtyBits);
+        mDirtyBits.reset();
+    }
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEVertexArrayh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexArray.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexArray.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexArray.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,12 +15,15 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/RefCountObject.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Constants.h&quot;
</span><ins>+#include &quot;libANGLE/Debug.h&quot;
+#include &quot;libANGLE/State.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/VertexAttribute.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;vector&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+class ImplFactory;
</ins><span class="cx"> class VertexArrayImpl;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -28,40 +31,93 @@
</span><span class="cx"> {
</span><span class="cx"> class Buffer;
</span><span class="cx"> 
</span><del>-class VertexArray
</del><ins>+class VertexArray final : public LabeledObject
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    VertexArray(rx::VertexArrayImpl *impl, GLuint id, size_t maxAttribs);
</del><ins>+    VertexArray(rx::ImplFactory *factory, GLuint id, size_t maxAttribs);
</ins><span class="cx">     ~VertexArray();
</span><span class="cx"> 
</span><span class="cx">     GLuint id() const;
</span><span class="cx"> 
</span><del>-    const VertexAttribute&amp; getVertexAttribute(size_t attributeIndex) const;
-    const std::vector&lt;VertexAttribute&gt; &amp;getVertexAttributes() const;
</del><ins>+    void setLabel(const std::string &amp;label) override;
+    const std::string &amp;getLabel() const override;
</ins><span class="cx"> 
</span><ins>+    const VertexAttribute &amp;getVertexAttribute(size_t attributeIndex) const;
+
</ins><span class="cx">     void detachBuffer(GLuint bufferName);
</span><del>-    void setVertexAttribDivisor(GLuint index, GLuint divisor);
-    void enableAttribute(unsigned int attributeIndex, bool enabledState);
-    void setAttributeState(unsigned int attributeIndex, gl::Buffer *boundBuffer, GLint size, GLenum type,
</del><ins>+    void setVertexAttribDivisor(size_t index, GLuint divisor);
+    void enableAttribute(size_t attributeIndex, bool enabledState);
+    void setAttributeState(size_t attributeIndex, gl::Buffer *boundBuffer, GLint size, GLenum type,
</ins><span class="cx">                            bool normalized, bool pureInteger, GLsizei stride, const void *pointer);
</span><span class="cx"> 
</span><del>-    Buffer *getElementArrayBuffer() const { return mElementArrayBuffer.get(); }
</del><span class="cx">     void setElementArrayBuffer(Buffer *buffer);
</span><del>-    GLuint getElementArrayBufferId() const { return mElementArrayBuffer.id(); }
-    size_t getMaxAttribs() const { return mVertexAttributes.size(); }
</del><span class="cx"> 
</span><ins>+    const BindingPointer&lt;Buffer&gt; &amp;getElementArrayBuffer() const { return mData.getElementArrayBuffer(); }
+    size_t getMaxAttribs() const { return mData.getVertexAttributes().size(); }
+    const std::vector&lt;VertexAttribute&gt; &amp;getVertexAttributes() const { return mData.getVertexAttributes(); }
+
</ins><span class="cx">     rx::VertexArrayImpl *getImplementation() { return mVertexArray; }
</span><span class="cx">     const rx::VertexArrayImpl *getImplementation() const { return mVertexArray; }
</span><span class="cx"> 
</span><del>-    unsigned int getMaxEnabledAttribute() const { return mMaxEnabledAttribute; }
</del><ins>+    size_t getMaxEnabledAttribute() const { return mData.getMaxEnabledAttribute(); }
</ins><span class="cx"> 
</span><ins>+    class Data final : public angle::NonCopyable
+    {
+      public:
+        explicit Data(size_t maxAttribs);
+        ~Data();
+
+        const std::string &amp;getLabel() const { return mLabel; }
+
+        const BindingPointer&lt;Buffer&gt; &amp;getElementArrayBuffer() const { return mElementArrayBuffer; }
+        size_t getMaxAttribs() const { return mVertexAttributes.size(); }
+        size_t getMaxEnabledAttribute() const { return mMaxEnabledAttribute; }
+        const std::vector&lt;VertexAttribute&gt; &amp;getVertexAttributes() const { return mVertexAttributes; }
+        const VertexAttribute &amp;getVertexAttribute(size_t index) const
+        {
+            return mVertexAttributes[index];
+        }
+
+      private:
+        friend class VertexArray;
+        std::string mLabel;
+        std::vector&lt;VertexAttribute&gt; mVertexAttributes;
+        BindingPointer&lt;Buffer&gt; mElementArrayBuffer;
+        size_t mMaxEnabledAttribute;
+    };
+
+    enum DirtyBitType
+    {
+        DIRTY_BIT_ELEMENT_ARRAY_BUFFER,
+
+        // Reserve bits for enabled flags
+        DIRTY_BIT_ATTRIB_0_ENABLED,
+        DIRTY_BIT_ATTRIB_MAX_ENABLED = DIRTY_BIT_ATTRIB_0_ENABLED + gl::MAX_VERTEX_ATTRIBS,
+
+        // Reserve bits for attrib pointers
+        DIRTY_BIT_ATTRIB_0_POINTER   = DIRTY_BIT_ATTRIB_MAX_ENABLED,
+        DIRTY_BIT_ATTRIB_MAX_POINTER = DIRTY_BIT_ATTRIB_0_POINTER + gl::MAX_VERTEX_ATTRIBS,
+
+        // Reserve bits for divisors
+        DIRTY_BIT_ATTRIB_0_DIVISOR   = DIRTY_BIT_ATTRIB_MAX_POINTER,
+        DIRTY_BIT_ATTRIB_MAX_DIVISOR = DIRTY_BIT_ATTRIB_0_DIVISOR + gl::MAX_VERTEX_ATTRIBS,
+
+        DIRTY_BIT_UNKNOWN = DIRTY_BIT_ATTRIB_MAX_DIVISOR,
+        DIRTY_BIT_MAX     = DIRTY_BIT_UNKNOWN,
+    };
+
+    typedef std::bitset&lt;DIRTY_BIT_MAX&gt; DirtyBits;
+
+    void syncImplState();
+    bool hasAnyDirtyBit() const { return mDirtyBits.any(); }
+
</ins><span class="cx">   private:
</span><span class="cx">     GLuint mId;
</span><span class="cx"> 
</span><ins>+    Data mData;
+    DirtyBits mDirtyBits;
+
</ins><span class="cx">     rx::VertexArrayImpl *mVertexArray;
</span><del>-    std::vector&lt;VertexAttribute&gt; mVertexAttributes;
-    BindingPointer&lt;Buffer&gt; mElementArrayBuffer;
-    unsigned int mMaxEnabledAttribute;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEVertexAttributecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -23,24 +23,6 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool operator==(const VertexAttribute &amp;a, const VertexAttribute &amp;b)
-{
-    return a.enabled == b.enabled &amp;&amp;
-           a.type == b.type &amp;&amp;
-           a.size == b.size &amp;&amp;
-           a.normalized == b.normalized &amp;&amp;
-           a.pureInteger == b.pureInteger &amp;&amp;
-           a.stride == b.stride &amp;&amp;
-           a.pointer == b.pointer &amp;&amp;
-           a.buffer.get() == b.buffer.get() &amp;&amp;
-           a.divisor == b.divisor;
-}
-
-bool operator!=(const VertexAttribute &amp;a, const VertexAttribute &amp;b)
-{
-    return !(a == b);
-}
-
</del><span class="cx"> size_t ComputeVertexAttributeTypeSize(const VertexAttribute&amp; attrib)
</span><span class="cx"> {
</span><span class="cx">     GLuint size = attrib.size;
</span><span class="lines">@@ -70,4 +52,23 @@
</span><span class="cx">     return attrib.stride ? attrib.stride : ComputeVertexAttributeTypeSize(attrib);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+size_t ComputeVertexAttributeElementCount(const VertexAttribute &amp;attrib,
+                                          size_t drawCount,
+                                          size_t instanceCount)
+{
+    // For instanced rendering, we draw &quot;instanceDrawCount&quot; sets of &quot;vertexDrawCount&quot; vertices.
+    //
+    // A vertex attribute with a positive divisor loads one instanced vertex for every set of
+    // non-instanced vertices, and the instanced vertex index advances once every &quot;mDivisor&quot;
+    // instances.
+    if (instanceCount &gt; 0 &amp;&amp; attrib.divisor &gt; 0)
+    {
+        // When instanceDrawCount is not a multiple attrib.divisor, the division must round up.
+        // For instance, with 5 non-instanced vertices and a divisor equal to 3, we need 2 instanced
+        // vertices.
+        return (instanceCount + attrib.divisor - 1u) / attrib.divisor;
+    }
+
+    return drawCount;
</ins><span class="cx"> }
</span><ins>+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEVertexAttributeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -40,34 +40,13 @@
</span><span class="cx"> bool operator!=(const VertexAttribute &amp;a, const VertexAttribute &amp;b);
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename T&gt;
</span><del>-T QuerySingleVertexAttributeParameter(const VertexAttribute&amp; attrib, GLenum pname)
-{
-  switch (pname)
-  {
-    case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
-      return static_cast&lt;T&gt;(attrib.enabled ? GL_TRUE : GL_FALSE);
-    case GL_VERTEX_ATTRIB_ARRAY_SIZE:
-      return static_cast&lt;T&gt;(attrib.size);
-    case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
-      return static_cast&lt;T&gt;(attrib.stride);
-    case GL_VERTEX_ATTRIB_ARRAY_TYPE:
-      return static_cast&lt;T&gt;(attrib.type);
-    case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
-      return static_cast&lt;T&gt;(attrib.normalized ? GL_TRUE : GL_FALSE);
-    case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
-      return static_cast&lt;T&gt;(attrib.buffer.id());
-    case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
-      return static_cast&lt;T&gt;(attrib.divisor);
-    case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
-      return static_cast&lt;T&gt;(attrib.pureInteger ? GL_TRUE : GL_FALSE);
-    default:
-      UNREACHABLE();
-      return static_cast&lt;T&gt;(0);
-  }
-}
</del><ins>+T QuerySingleVertexAttributeParameter(const VertexAttribute&amp; attrib, GLenum pname);
</ins><span class="cx"> 
</span><span class="cx"> size_t ComputeVertexAttributeTypeSize(const VertexAttribute&amp; attrib);
</span><span class="cx"> size_t ComputeVertexAttributeStride(const VertexAttribute&amp; attrib);
</span><ins>+size_t ComputeVertexAttributeElementCount(const VertexAttribute &amp;attrib,
+                                          size_t drawCount,
+                                          size_t instanceCount);
</ins><span class="cx"> 
</span><span class="cx"> struct VertexAttribCurrentValueData
</span><span class="cx"> {
</span><span class="lines">@@ -79,44 +58,18 @@
</span><span class="cx">     };
</span><span class="cx">     GLenum Type;
</span><span class="cx"> 
</span><del>-    void setFloatValues(const GLfloat floatValues[4])
-    {
-        for (unsigned int valueIndex = 0; valueIndex &lt; 4; valueIndex++)
-        {
-            FloatValues[valueIndex] = floatValues[valueIndex];
-        }
-        Type = GL_FLOAT;
-    }
</del><ins>+    VertexAttribCurrentValueData();
</ins><span class="cx"> 
</span><del>-    void setIntValues(const GLint intValues[4])
-    {
-        for (unsigned int valueIndex = 0; valueIndex &lt; 4; valueIndex++)
-        {
-            IntValues[valueIndex] = intValues[valueIndex];
-        }
-        Type = GL_INT;
-    }
-
-    void setUnsignedIntValues(const GLuint unsignedIntValues[4])
-    {
-        for (unsigned int valueIndex = 0; valueIndex &lt; 4; valueIndex++)
-        {
-            UnsignedIntValues[valueIndex] = unsignedIntValues[valueIndex];
-        }
-        Type = GL_UNSIGNED_INT;
-    }
-
-    bool operator==(const VertexAttribCurrentValueData &amp;other)
-    {
-        return (Type == other.Type &amp;&amp; memcmp(FloatValues, other.FloatValues, sizeof(float) * 4) == 0);
-    }
-
-    bool operator!=(const VertexAttribCurrentValueData &amp;other)
-    {
-        return !(*this == other);
-    }
</del><ins>+    void setFloatValues(const GLfloat floatValues[4]);
+    void setIntValues(const GLint intValues[4]);
+    void setUnsignedIntValues(const GLuint unsignedIntValues[4]);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+bool operator==(const VertexAttribCurrentValueData &amp;a, const VertexAttribCurrentValueData &amp;b);
+bool operator!=(const VertexAttribCurrentValueData &amp;a, const VertexAttribCurrentValueData &amp;b);
+
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#include &quot;VertexAttribute.inl&quot;
+
</ins><span class="cx"> #endif // LIBANGLE_VERTEXATTRIBUTE_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEVertexAttributeinl"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.inl (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.inl                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/VertexAttribute.inl        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,103 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// VertexAttribute.inl: Inline vertex attribute methods
+//
+
+namespace gl
+{
+
+inline bool operator==(const VertexAttribute &amp;a, const VertexAttribute &amp;b)
+{
+    return a.enabled == b.enabled &amp;&amp;
+           a.type == b.type &amp;&amp;
+           a.size == b.size &amp;&amp;
+           a.normalized == b.normalized &amp;&amp;
+           a.pureInteger == b.pureInteger &amp;&amp;
+           a.stride == b.stride &amp;&amp;
+           a.pointer == b.pointer &amp;&amp;
+           a.buffer.get() == b.buffer.get() &amp;&amp;
+           a.divisor == b.divisor;
+}
+
+inline bool operator!=(const VertexAttribute &amp;a, const VertexAttribute &amp;b)
+{
+    return !(a == b);
+}
+
+template &lt;typename T&gt;
+T QuerySingleVertexAttributeParameter(const VertexAttribute&amp; attrib, GLenum pname)
+{
+  switch (pname)
+  {
+    case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
+      return static_cast&lt;T&gt;(attrib.enabled ? GL_TRUE : GL_FALSE);
+    case GL_VERTEX_ATTRIB_ARRAY_SIZE:
+      return static_cast&lt;T&gt;(attrib.size);
+    case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
+      return static_cast&lt;T&gt;(attrib.stride);
+    case GL_VERTEX_ATTRIB_ARRAY_TYPE:
+      return static_cast&lt;T&gt;(attrib.type);
+    case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
+      return static_cast&lt;T&gt;(attrib.normalized ? GL_TRUE : GL_FALSE);
+    case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
+      return static_cast&lt;T&gt;(attrib.buffer.id());
+    case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
+      return static_cast&lt;T&gt;(attrib.divisor);
+    case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
+      return static_cast&lt;T&gt;(attrib.pureInteger ? GL_TRUE : GL_FALSE);
+    default:
+      UNREACHABLE();
+      return static_cast&lt;T&gt;(0);
+  }
+}
+
+inline VertexAttribCurrentValueData::VertexAttribCurrentValueData()
+    : Type(GL_FLOAT)
+{
+    FloatValues[0] = 0.0f;
+    FloatValues[1] = 0.0f;
+    FloatValues[2] = 0.0f;
+    FloatValues[3] = 1.0f;
+}
+
+inline void VertexAttribCurrentValueData::setFloatValues(const GLfloat floatValues[4])
+{
+    for (unsigned int valueIndex = 0; valueIndex &lt; 4; valueIndex++)
+    {
+        FloatValues[valueIndex] = floatValues[valueIndex];
+    }
+    Type = GL_FLOAT;
+}
+
+inline void VertexAttribCurrentValueData::setIntValues(const GLint intValues[4])
+{
+    for (unsigned int valueIndex = 0; valueIndex &lt; 4; valueIndex++)
+    {
+        IntValues[valueIndex] = intValues[valueIndex];
+    }
+    Type = GL_INT;
+}
+
+inline void VertexAttribCurrentValueData::setUnsignedIntValues(const GLuint unsignedIntValues[4])
+{
+    for (unsigned int valueIndex = 0; valueIndex &lt; 4; valueIndex++)
+    {
+        UnsignedIntValues[valueIndex] = unsignedIntValues[valueIndex];
+    }
+    Type = GL_UNSIGNED_INT;
+}
+
+inline bool operator==(const VertexAttribCurrentValueData &amp;a, const VertexAttribCurrentValueData &amp;b)
+{
+    return (a.Type == b.Type &amp;&amp; memcmp(a.FloatValues, b.FloatValues, sizeof(float) * 4) == 0);
+}
+
+inline bool operator!=(const VertexAttribCurrentValueData &amp;a, const VertexAttribCurrentValueData &amp;b)
+{
+    return !(a == b);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEangletypescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,19 +15,30 @@
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-bool operator==(const Rectangle &amp;a, const Rectangle &amp;b)
</del><ins>+PrimitiveType GetPrimitiveType(GLenum drawMode)
</ins><span class="cx"> {
</span><del>-    return a.x == b.x &amp;&amp;
-           a.y == b.y &amp;&amp;
-           a.width == b.width &amp;&amp;
-           a.height == b.height;
</del><ins>+    switch (drawMode)
+    {
+        case GL_POINTS:
+            return PRIMITIVE_POINTS;
+        case GL_LINES:
+            return PRIMITIVE_LINES;
+        case GL_LINE_STRIP:
+            return PRIMITIVE_LINE_STRIP;
+        case GL_LINE_LOOP:
+            return PRIMITIVE_LINE_LOOP;
+        case GL_TRIANGLES:
+            return PRIMITIVE_TRIANGLES;
+        case GL_TRIANGLE_STRIP:
+            return PRIMITIVE_TRIANGLE_STRIP;
+        case GL_TRIANGLE_FAN:
+            return PRIMITIVE_TRIANGLE_FAN;
+        default:
+            UNREACHABLE();
+            return PRIMITIVE_TYPE_MAX;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool operator!=(const Rectangle &amp;a, const Rectangle &amp;b)
-{
-    return !(a == b);
-}
-
</del><span class="cx"> SamplerState::SamplerState()
</span><span class="cx">     : minFilter(GL_NEAREST_MIPMAP_LINEAR),
</span><span class="cx">       magFilter(GL_LINEAR),
</span><span class="lines">@@ -35,47 +46,31 @@
</span><span class="cx">       wrapT(GL_REPEAT),
</span><span class="cx">       wrapR(GL_REPEAT),
</span><span class="cx">       maxAnisotropy(1.0f),
</span><del>-      baseLevel(0),
-      maxLevel(1000),
</del><span class="cx">       minLod(-1000.0f),
</span><span class="cx">       maxLod(1000.0f),
</span><span class="cx">       compareMode(GL_NONE),
</span><del>-      compareFunc(GL_LEQUAL),
-      swizzleRed(GL_RED),
-      swizzleGreen(GL_GREEN),
-      swizzleBlue(GL_BLUE),
-      swizzleAlpha(GL_ALPHA)
-{}
-
-bool SamplerState::swizzleRequired() const
</del><ins>+      compareFunc(GL_LEQUAL)
</ins><span class="cx"> {
</span><del>-    return swizzleRed != GL_RED || swizzleGreen != GL_GREEN ||
-           swizzleBlue != GL_BLUE || swizzleAlpha != GL_ALPHA;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool SamplerState::operator==(const SamplerState &amp;other) const
</del><ins>+TextureState::TextureState()
+    : swizzleRed(GL_RED),
+      swizzleGreen(GL_GREEN),
+      swizzleBlue(GL_BLUE),
+      swizzleAlpha(GL_ALPHA),
+      samplerState(),
+      baseLevel(0),
+      maxLevel(1000),
+      immutableFormat(false),
+      immutableLevels(0),
+      usage(GL_NONE)
</ins><span class="cx"> {
</span><del>-    return minFilter == other.minFilter &amp;&amp;
-           magFilter == other.magFilter &amp;&amp;
-           wrapS == other.wrapS &amp;&amp;
-           wrapT == other.wrapT &amp;&amp;
-           wrapR == other.wrapR &amp;&amp;
-           maxAnisotropy == other.maxAnisotropy &amp;&amp;
-           baseLevel == other.baseLevel &amp;&amp;
-           maxLevel == other.maxLevel &amp;&amp;
-           minLod == other.minLod &amp;&amp;
-           maxLod == other.maxLod &amp;&amp;
-           compareMode == other.compareMode &amp;&amp;
-           compareFunc == other.compareFunc &amp;&amp;
-           swizzleRed == other.swizzleRed &amp;&amp;
-           swizzleGreen == other.swizzleGreen &amp;&amp;
-           swizzleBlue == other.swizzleBlue &amp;&amp;
-           swizzleAlpha == other.swizzleAlpha;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool SamplerState::operator!=(const SamplerState &amp;other) const
</del><ins>+bool TextureState::swizzleRequired() const
</ins><span class="cx"> {
</span><del>-    return !(*this == other);
</del><ins>+    return swizzleRed != GL_RED || swizzleGreen != GL_GREEN ||
+           swizzleBlue != GL_BLUE || swizzleAlpha != GL_ALPHA;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void MinMax(int a, int b, int *minimum, int *maximum)
</span><span class="lines">@@ -128,119 +123,24 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-VertexFormat::VertexFormat()
-    : mType(GL_NONE),
-      mNormalized(GL_FALSE),
-      mComponents(0),
-      mPureInteger(false)
-{}
-
-VertexFormat::VertexFormat(GLenum type, GLboolean normalized, GLuint components, bool pureInteger)
-    : mType(type),
-      mNormalized(normalized),
-      mComponents(components),
-      mPureInteger(pureInteger)
</del><ins>+bool Box::operator==(const Box &amp;other) const
</ins><span class="cx"> {
</span><del>-    // Float data can not be normalized, so ignore the user setting
-    if (mType == GL_FLOAT || mType == GL_HALF_FLOAT || mType == GL_FIXED)
-    {
-        mNormalized = GL_FALSE;
-    }
</del><ins>+    return (x == other.x &amp;&amp; y == other.y &amp;&amp; z == other.z &amp;&amp;
+            width == other.width &amp;&amp; height == other.height &amp;&amp; depth == other.depth);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-VertexFormat::VertexFormat(const VertexAttribute &amp;attrib)
-    : mType(attrib.type),
-      mNormalized(attrib.normalized ? GL_TRUE : GL_FALSE),
-      mComponents(attrib.size),
-      mPureInteger(attrib.pureInteger)
</del><ins>+bool Box::operator!=(const Box &amp;other) const
</ins><span class="cx"> {
</span><del>-    // Ensure we aren't initializing a vertex format which should be using
-    // the current-value type
-    ASSERT(attrib.enabled);
-
-    // Float data can not be normalized, so ignore the user setting
-    if (mType == GL_FLOAT || mType == GL_HALF_FLOAT || mType == GL_FIXED)
-    {
-        mNormalized = GL_FALSE;
-    }
-}
-
-VertexFormat::VertexFormat(const VertexAttribute &amp;attrib, GLenum currentValueType)
-    : mType(attrib.type),
-      mNormalized(attrib.normalized ? GL_TRUE : GL_FALSE),
-      mComponents(attrib.size),
-      mPureInteger(attrib.pureInteger)
-{
-    if (!attrib.enabled)
-    {
-        mType = currentValueType;
-        mNormalized = GL_FALSE;
-        mComponents = 4;
-        mPureInteger = (currentValueType != GL_FLOAT);
-    }
-
-    // Float data can not be normalized, so ignore the user setting
-    if (mType == GL_FLOAT || mType == GL_HALF_FLOAT || mType == GL_FIXED)
-    {
-        mNormalized = GL_FALSE;
-    }
-}
-
-void VertexFormat::GetInputLayout(VertexFormat *inputLayout,
-                                  Program *program,
-                                  const State &amp;state)
-{
-    const std::vector&lt;VertexAttribute&gt; &amp;vertexAttributes = state.getVertexArray()-&gt;getVertexAttributes();
-    for (unsigned int attributeIndex = 0; attributeIndex &lt; vertexAttributes.size(); attributeIndex++)
-    {
-        int semanticIndex = program-&gt;getSemanticIndex(attributeIndex);
-
-        if (semanticIndex != -1)
-        {
-            inputLayout[semanticIndex] = VertexFormat(vertexAttributes[attributeIndex], state.getVertexAttribCurrentValue(attributeIndex).Type);
-        }
-    }
-}
-
-bool VertexFormat::operator==(const VertexFormat &amp;other) const
-{
-    return (mType == other.mType                &amp;&amp;
-            mComponents == other.mComponents    &amp;&amp;
-            mNormalized == other.mNormalized    &amp;&amp;
-            mPureInteger == other.mPureInteger  );
-}
-
-bool VertexFormat::operator!=(const VertexFormat &amp;other) const
-{
</del><span class="cx">     return !(*this == other);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool VertexFormat::operator&lt;(const VertexFormat&amp; other) const
</del><ins>+bool operator==(const Extents &amp;lhs, const Extents &amp;rhs)
</ins><span class="cx"> {
</span><del>-    if (mType != other.mType)
-    {
-        return mType &lt; other.mType;
-    }
-    if (mNormalized != other.mNormalized)
-    {
-        return mNormalized &lt; other.mNormalized;
-    }
-    if (mComponents != other.mComponents)
-    {
-        return mComponents &lt; other.mComponents;
-    }
-    return mPureInteger &lt; other.mPureInteger;
</del><ins>+    return lhs.width == rhs.width &amp;&amp; lhs.height == rhs.height &amp;&amp; lhs.depth == rhs.depth;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Box::operator==(const Box &amp;other) const
</del><ins>+bool operator!=(const Extents &amp;lhs, const Extents &amp;rhs)
</ins><span class="cx"> {
</span><del>-    return (x == other.x &amp;&amp; y == other.y &amp;&amp; z == other.z &amp;&amp;
-            width == other.width &amp;&amp; height == other.height &amp;&amp; depth == other.depth);
</del><ins>+    return !(lhs == rhs);
</ins><span class="cx"> }
</span><del>-
-bool Box::operator!=(const Box &amp;other) const
-{
-    return !(*this == other);
</del><span class="cx"> }
</span><del>-
-}
</del></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEangletypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,6 +14,9 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;stdint.h&gt;
</span><span class="cx"> 
</span><ins>+#include &lt;bitset&gt;
+#include &lt;unordered_map&gt;
+
</ins><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> class Buffer;
</span><span class="lines">@@ -22,6 +25,20 @@
</span><span class="cx"> struct VertexAttribute;
</span><span class="cx"> struct VertexAttribCurrentValueData;
</span><span class="cx"> 
</span><ins>+enum PrimitiveType
+{
+    PRIMITIVE_POINTS,
+    PRIMITIVE_LINES,
+    PRIMITIVE_LINE_STRIP,
+    PRIMITIVE_LINE_LOOP,
+    PRIMITIVE_TRIANGLES,
+    PRIMITIVE_TRIANGLE_STRIP,
+    PRIMITIVE_TRIANGLE_FAN,
+    PRIMITIVE_TYPE_MAX,
+};
+
+PrimitiveType GetPrimitiveType(GLenum drawMode);
+
</ins><span class="cx"> enum SamplerType
</span><span class="cx"> {
</span><span class="cx">     SAMPLER_PIXEL,
</span><span class="lines">@@ -41,19 +58,10 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename T&gt;
</span><del>-bool operator==(const Color&lt;T&gt; &amp;a, const Color&lt;T&gt; &amp;b)
-{
-    return a.red == b.red &amp;&amp;
-           a.green == b.green &amp;&amp;
-           a.blue == b.blue &amp;&amp;
-           a.alpha == b.alpha;
-}
</del><ins>+bool operator==(const Color&lt;T&gt; &amp;a, const Color&lt;T&gt; &amp;b);
</ins><span class="cx"> 
</span><span class="cx"> template &lt;typename T&gt;
</span><del>-bool operator!=(const Color&lt;T&gt; &amp;a, const Color&lt;T&gt; &amp;b)
-{
-    return !(a == b);
-}
</del><ins>+bool operator!=(const Color&lt;T&gt; &amp;a, const Color&lt;T&gt; &amp;b);
</ins><span class="cx"> 
</span><span class="cx"> typedef Color&lt;float&gt; ColorF;
</span><span class="cx"> typedef Color&lt;int&gt; ColorI;
</span><span class="lines">@@ -61,13 +69,21 @@
</span><span class="cx"> 
</span><span class="cx"> struct Rectangle
</span><span class="cx"> {
</span><ins>+    Rectangle() : x(0), y(0), width(0), height(0) {}
+    Rectangle(int x_in, int y_in, int width_in, int height_in)
+        : x(x_in), y(y_in), width(width_in), height(height_in)
+    {
+    }
+
+    int x0() const { return x; }
+    int y0() const { return y; }
+    int x1() const { return x + width; }
+    int y1() const { return y + height; }
+
</ins><span class="cx">     int x;
</span><span class="cx">     int y;
</span><span class="cx">     int width;
</span><span class="cx">     int height;
</span><del>-
-    Rectangle() : x(0), y(0), width(0), height(0) { }
-    Rectangle(int x_in, int y_in, int width_in, int height_in) : x(x_in), y(y_in), width(width_in), height(height_in) { }
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> bool operator==(const Rectangle &amp;a, const Rectangle &amp;b);
</span><span class="lines">@@ -97,6 +113,9 @@
</span><span class="cx">     bool empty() const { return (width * height * depth) == 0; }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+bool operator==(const Extents &amp;lhs, const Extents &amp;rhs);
+bool operator!=(const Extents &amp;lhs, const Extents &amp;rhs);
+
</ins><span class="cx"> struct Box
</span><span class="cx"> {
</span><span class="cx">     int x;
</span><span class="lines">@@ -171,36 +190,58 @@
</span><span class="cx">     GLuint stencilBackWritemask;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+// State from Table 6.10 (state per sampler object)
</ins><span class="cx"> struct SamplerState
</span><span class="cx"> {
</span><span class="cx">     SamplerState();
</span><span class="cx"> 
</span><span class="cx">     GLenum minFilter;
</span><span class="cx">     GLenum magFilter;
</span><ins>+
</ins><span class="cx">     GLenum wrapS;
</span><span class="cx">     GLenum wrapT;
</span><span class="cx">     GLenum wrapR;
</span><ins>+
+    // From EXT_texture_filter_anisotropic
</ins><span class="cx">     float maxAnisotropy;
</span><span class="cx"> 
</span><del>-    GLint baseLevel;
-    GLint maxLevel;
</del><span class="cx">     GLfloat minLod;
</span><span class="cx">     GLfloat maxLod;
</span><span class="cx"> 
</span><span class="cx">     GLenum compareMode;
</span><span class="cx">     GLenum compareFunc;
</span><ins>+};
</ins><span class="cx"> 
</span><ins>+bool operator==(const SamplerState &amp;a, const SamplerState &amp;b);
+bool operator!=(const SamplerState &amp;a, const SamplerState &amp;b);
+
+// State from Table 6.9 (state per texture object) in the OpenGL ES 3.0.2 spec.
+struct TextureState
+{
+    TextureState();
+
</ins><span class="cx">     GLenum swizzleRed;
</span><span class="cx">     GLenum swizzleGreen;
</span><span class="cx">     GLenum swizzleBlue;
</span><span class="cx">     GLenum swizzleAlpha;
</span><span class="cx"> 
</span><ins>+    SamplerState samplerState;
+
+    GLuint baseLevel;
+    GLuint maxLevel;
+
+    bool immutableFormat;
+    GLuint immutableLevels;
+
+    // From GL_ANGLE_texture_usage
+    GLenum usage;
+
</ins><span class="cx">     bool swizzleRequired() const;
</span><del>-
-    bool operator==(const SamplerState &amp;other) const;
-    bool operator!=(const SamplerState &amp;other) const;
</del><span class="cx"> };
</span><span class="cx"> 
</span><ins>+bool operator==(const TextureState &amp;a, const TextureState &amp;b);
+bool operator!=(const TextureState &amp;a, const TextureState &amp;b);
+
</ins><span class="cx"> struct PixelUnpackState
</span><span class="cx"> {
</span><span class="cx">     BindingPointer&lt;Buffer&gt; pixelBuffer;
</span><span class="lines">@@ -256,37 +297,26 @@
</span><span class="cx">     {}
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-struct VertexFormat
-{
-    GLenum      mType;
-    GLboolean   mNormalized;
-    GLuint      mComponents;
-    bool        mPureInteger;
</del><ins>+// Used in Program and VertexArray.
+typedef std::bitset&lt;MAX_VERTEX_ATTRIBS&gt; AttributesMask;
</ins><span class="cx"> 
</span><del>-    VertexFormat();
-    VertexFormat(GLenum type, GLboolean normalized, GLuint components, bool pureInteger);
-    explicit VertexFormat(const VertexAttribute &amp;attribute);
-    VertexFormat(const VertexAttribute &amp;attribute, GLenum currentValueType);
</del><ins>+// Use in Program
+typedef std::bitset&lt;IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS&gt; UniformBlockBindingMask;
</ins><span class="cx"> 
</span><del>-    static void GetInputLayout(VertexFormat *inputLayout,
-                               Program *program,
-                               const State&amp; currentValues);
-
-    bool operator==(const VertexFormat &amp;other) const;
-    bool operator!=(const VertexFormat &amp;other) const;
-    bool operator&lt;(const VertexFormat&amp; other) const;
-};
-
</del><ins>+// A map of GL objects indexed by object ID. The specific map implementation may change.
+// Client code should treat it as a std::map.
+template &lt;class ResourceT&gt;
+using ResourceMap = std::unordered_map&lt;GLuint, ResourceT *&gt;;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><del>-
</del><span class="cx"> enum VendorID : uint32_t
</span><span class="cx"> {
</span><del>-    VENDOR_ID_AMD = 0x1002,
-    VENDOR_ID_INTEL = 0x8086,
-    VENDOR_ID_NVIDIA = 0x10DE,
</del><ins>+    VENDOR_ID_UNKNOWN = 0x0,
+    VENDOR_ID_AMD     = 0x1002,
+    VENDOR_ID_INTEL   = 0x8086,
+    VENDOR_ID_NVIDIA  = 0x10DE,
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // A macro that determines whether an object has a given runtime type.
</span><span class="lines">@@ -337,4 +367,52 @@
</span><span class="cx"> 
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#include &quot;angletypes.inl&quot;
+
+namespace angle
+{
+// Zero-based for better array indexing
+enum FramebufferBinding
+{
+    FramebufferBindingRead = 0,
+    FramebufferBindingDraw,
+    FramebufferBindingSingletonMax,
+    FramebufferBindingBoth = FramebufferBindingSingletonMax,
+    FramebufferBindingMax,
+    FramebufferBindingUnknown = FramebufferBindingMax,
+};
+
+inline FramebufferBinding EnumToFramebufferBinding(GLenum enumValue)
+{
+    switch (enumValue)
+    {
+        case GL_READ_FRAMEBUFFER:
+            return FramebufferBindingRead;
+        case GL_DRAW_FRAMEBUFFER:
+            return FramebufferBindingDraw;
+        case GL_FRAMEBUFFER:
+            return FramebufferBindingBoth;
+        default:
+            UNREACHABLE();
+            return FramebufferBindingUnknown;
+    }
+}
+
+inline GLenum FramebufferBindingToEnum(FramebufferBinding binding)
+{
+    switch (binding)
+    {
+        case FramebufferBindingRead:
+            return GL_READ_FRAMEBUFFER;
+        case FramebufferBindingDraw:
+            return GL_DRAW_FRAMEBUFFER;
+        case FramebufferBindingBoth:
+            return GL_FRAMEBUFFER;
+        default:
+            UNREACHABLE();
+            return GL_NONE;
+    }
+}
+}
+
</ins><span class="cx"> #endif // LIBANGLE_ANGLETYPES_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEangletypesinl"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.inl (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.inl                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/angletypes.inl        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,78 @@
</span><ins>+//
+// Copyright (c) 2012-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// angletypes.inl : Inline definitions of some functions from angletypes.h
+
+namespace gl
+{
+
+template &lt;typename T&gt;
+bool operator==(const Color&lt;T&gt; &amp;a, const Color&lt;T&gt; &amp;b)
+{
+    return a.red == b.red &amp;&amp;
+           a.green == b.green &amp;&amp;
+           a.blue == b.blue &amp;&amp;
+           a.alpha == b.alpha;
+}
+
+template &lt;typename T&gt;
+bool operator!=(const Color&lt;T&gt; &amp;a, const Color&lt;T&gt; &amp;b)
+{
+    return !(a == b);
+}
+
+inline bool operator==(const Rectangle &amp;a, const Rectangle &amp;b)
+{
+    return a.x == b.x &amp;&amp;
+           a.y == b.y &amp;&amp;
+           a.width == b.width &amp;&amp;
+           a.height == b.height;
+}
+
+inline bool operator!=(const Rectangle &amp;a, const Rectangle &amp;b)
+{
+    return !(a == b);
+}
+
+inline bool operator==(const SamplerState &amp;a, const SamplerState &amp;b)
+{
+    return a.minFilter == b.minFilter &amp;&amp;
+           a.magFilter == b.magFilter &amp;&amp;
+           a.wrapS == b.wrapS &amp;&amp;
+           a.wrapT == b.wrapT &amp;&amp;
+           a.wrapR == b.wrapR &amp;&amp;
+           a.maxAnisotropy == b.maxAnisotropy &amp;&amp;
+           a.minLod == b.minLod &amp;&amp;
+           a.maxLod == b.maxLod &amp;&amp;
+           a.compareMode == b.compareMode &amp;&amp;
+           a.compareFunc == b.compareFunc;
+}
+
+inline bool operator!=(const SamplerState &amp;a, const SamplerState &amp;b)
+{
+    return !(a == b);
+}
+
+inline bool operator==(const TextureState &amp;a, const TextureState &amp;b)
+{
+    return a.swizzleRed == b.swizzleRed &amp;&amp;
+           a.swizzleGreen == b.swizzleGreen &amp;&amp;
+           a.swizzleBlue == b.swizzleBlue &amp;&amp;
+           a.swizzleAlpha == b.swizzleAlpha &amp;&amp;
+           a.samplerState == b.samplerState &amp;&amp;
+           a.baseLevel == b.baseLevel &amp;&amp;
+           a.maxLevel == b.maxLevel &amp;&amp;
+           a.immutableFormat == b.immutableFormat &amp;&amp;
+           a.immutableLevels == b.immutableLevels &amp;&amp;
+           a.usage == b.usage;
+}
+
+inline bool operator!=(const TextureState &amp;a, const TextureState &amp;b)
+{
+    return !(a == b);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEfeaturesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/features.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/features.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/features.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -32,9 +32,22 @@
</span><span class="cx"> #define ANGLE_PROGRAM_BINARY_LOAD ANGLE_ENABLED
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-// Shader debug info
-#if !defined(ANGLE_SHADER_DEBUG_INFO)
-#define ANGLE_SHADER_DEBUG_INFO ANGLE_DISABLED
</del><ins>+// Append HLSL assembly to shader debug info. Defaults to enabled in Debug and off in Release.
+#if !defined(ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO)
+#if !defined(NDEBUG)
+#define ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO ANGLE_ENABLED
+#else
+#define ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO ANGLE_DISABLED
+#endif  // !defined(NDEBUG)
+#endif  // !defined(ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO)
+
+// Program link validation of precisions for uniforms. This feature was
+// requested by developers to allow non-conformant shaders to be used which
+// contain mismatched precisions.
+// ENABLED validate that precision for uniforms match between vertex and fragment shaders
+// DISABLED allow precision for uniforms to differ between vertex and fragment shaders
+#if !defined(ANGLE_PROGRAM_LINK_VALIDATE_UNIFORM_PRECISION)
+#define ANGLE_PROGRAM_LINK_VALIDATE_UNIFORM_PRECISION ANGLE_ENABLED
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_FEATURES_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEformatutilscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -163,11 +163,6 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool UnimplementedSupport(GLuint, const Extensions &amp;)
-{
-    return false;
-}
-
</del><span class="cx"> static bool NeverSupported(GLuint, const Extensions &amp;)
</span><span class="cx"> {
</span><span class="cx">     return false;
</span><span class="lines">@@ -217,6 +212,61 @@
</span><span class="cx">     return extensions.*bool1 &amp;&amp; extensions.*bool2;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// Check support for either of two extensions
+template &lt;ExtensionBool bool1, ExtensionBool bool2&gt;
+static bool RequireExtOrExt(GLuint, const Extensions &amp;extensions)
+{
+    return extensions.*bool1 || extensions.*bool2;
+}
+
+// Special function for half float formats with three or four channels.
+static bool HalfFloatSupport(GLuint clientVersion, const Extensions &amp;extensions)
+{
+    return clientVersion &gt;= 3 || extensions.textureHalfFloat;
+}
+
+static bool HalfFloatRenderableSupport(GLuint clientVersion, const Extensions &amp;extensions)
+{
+    return HalfFloatSupport(clientVersion, extensions) &amp;&amp; extensions.colorBufferHalfFloat;
+}
+
+// Special function for half float formats with one or two channels.
+static bool HalfFloatSupportRG(GLuint clientVersion, const Extensions &amp;extensions)
+{
+    return clientVersion &gt;= 3 || (extensions.textureHalfFloat &amp;&amp; extensions.textureRG);
+}
+
+static bool HalfFloatRenderableSupportRG(GLuint clientVersion, const Extensions &amp;extensions)
+{
+    return HalfFloatSupportRG(clientVersion, extensions) &amp;&amp; extensions.colorBufferHalfFloat;
+}
+
+// Special function for float formats with three or four channels.
+static bool FloatSupport(GLuint clientVersion, const Extensions &amp;extensions)
+{
+    return clientVersion &gt;= 3 || extensions.textureFloat;
+}
+
+static bool FloatRenderableSupport(GLuint clientVersion, const Extensions &amp;extensions)
+{
+    // We don't expose colorBufferFloat in ES2, but we silently support rendering to float.
+    return FloatSupport(clientVersion, extensions) &amp;&amp;
+           (extensions.colorBufferFloat || clientVersion == 2);
+}
+
+// Special function for float formats with one or two channels.
+static bool FloatSupportRG(GLuint clientVersion, const Extensions &amp;extensions)
+{
+    return clientVersion &gt;= 3 || (extensions.textureFloat &amp;&amp; extensions.textureRG);
+}
+
+static bool FloatRenderableSupportRG(GLuint clientVersion, const Extensions &amp;extensions)
+{
+    // We don't expose colorBufferFloat in ES2, but we silently support rendering to float.
+    return FloatSupportRG(clientVersion, extensions) &amp;&amp;
+           (extensions.colorBufferFloat || clientVersion == 2);
+}
+
</ins><span class="cx"> InternalFormat::InternalFormat()
</span><span class="cx">     : redBits(0),
</span><span class="cx">       greenBits(0),
</span><span class="lines">@@ -228,13 +278,13 @@
</span><span class="cx">       stencilBits(0),
</span><span class="cx">       pixelBytes(0),
</span><span class="cx">       componentCount(0),
</span><ins>+      compressed(false),
</ins><span class="cx">       compressedBlockWidth(0),
</span><span class="cx">       compressedBlockHeight(0),
</span><span class="cx">       format(GL_NONE),
</span><span class="cx">       type(GL_NONE),
</span><span class="cx">       componentType(GL_NONE),
</span><span class="cx">       colorEncoding(GL_NONE),
</span><del>-      compressed(false),
</del><span class="cx">       textureSupport(NeverSupported),
</span><span class="cx">       renderSupport(NeverSupported),
</span><span class="cx">       filterSupport(NeverSupported)
</span><span class="lines">@@ -346,6 +396,7 @@
</span><span class="cx"> {
</span><span class="cx">     InternalFormatInfoMap map;
</span><span class="cx"> 
</span><ins>+    // clang-format off
</ins><span class="cx">     // From ES 3.0.1 spec, table 3.12
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_NONE,              InternalFormat()));
</span><span class="cx"> 
</span><span class="lines">@@ -362,7 +413,7 @@
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_RGBA8,             RGBAFormat( 8,  8,  8,  8, 0, GL_RGBA,         GL_UNSIGNED_BYTE,                GL_UNSIGNED_NORMALIZED, false, RequireESOrExt&lt;3, &amp;Extensions::rgb8rgba8&gt;, RequireESOrExt&lt;3, &amp;Extensions::rgb8rgba8&gt;, AlwaysSupported)));
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_RGBA8_SNORM,       RGBAFormat( 8,  8,  8,  8, 0, GL_RGBA,         GL_BYTE,                         GL_SIGNED_NORMALIZED,   false, RequireES&lt;3&gt;,                              NeverSupported,                            AlwaysSupported)));
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_RGB10_A2,          RGBAFormat(10, 10, 10,  2, 0, GL_RGBA,         GL_UNSIGNED_INT_2_10_10_10_REV,  GL_UNSIGNED_NORMALIZED, false, RequireES&lt;3&gt;,                              RequireES&lt;3&gt;,                              AlwaysSupported)));
</span><del>-    map.insert(InternalFormatInfoPair(GL_RGB10_A2UI,        RGBAFormat(10, 10, 10,  2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV,  GL_UNSIGNED_INT,        false, RequireES&lt;3&gt;,                              NeverSupported,                            NeverSupported)));
</del><ins>+    map.insert(InternalFormatInfoPair(GL_RGB10_A2UI,        RGBAFormat(10, 10, 10,  2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV,  GL_UNSIGNED_INT,        false, RequireES&lt;3&gt;,                              RequireES&lt;3&gt;,                              NeverSupported)));
</ins><span class="cx">     map.insert(InternalFormatInfoPair(GL_SRGB8,             RGBAFormat( 8,  8,  8,  0, 0, GL_RGB,          GL_UNSIGNED_BYTE,                GL_UNSIGNED_NORMALIZED, true,  RequireESOrExt&lt;3, &amp;Extensions::sRGB&gt;,      NeverSupported,                            AlwaysSupported)));
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_SRGB8_ALPHA8,      RGBAFormat( 8,  8,  8,  8, 0, GL_RGBA,         GL_UNSIGNED_BYTE,                GL_UNSIGNED_NORMALIZED, true,  RequireESOrExt&lt;3, &amp;Extensions::sRGB&gt;,      RequireESOrExt&lt;3, &amp;Extensions::sRGB&gt;,      AlwaysSupported)));
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_R11F_G11F_B10F,    RGBAFormat(11, 11, 10,  0, 0, GL_RGB,          GL_UNSIGNED_INT_10F_11F_11F_REV, GL_FLOAT,               false, RequireES&lt;3&gt;,                              RequireExt&lt;&amp;Extensions::colorBufferFloat&gt;, AlwaysSupported)));
</span><span class="lines">@@ -397,23 +448,23 @@
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_BGR5_A1_ANGLEX,    RGBAFormat( 5,  5,  5,  1, 0, GL_BGRA_EXT,     GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, GL_UNSIGNED_NORMALIZED, false, RequireExt&lt;&amp;Extensions::textureFormatBGRA8888&gt;, RequireExt&lt;&amp;Extensions::textureFormatBGRA8888&gt;, AlwaysSupported)));
</span><span class="cx"> 
</span><span class="cx">     // Floating point renderability and filtering is provided by OES_texture_float and OES_texture_half_float
</span><del>-    //                               | Internal format     |          | D |S | Format             | Type                                   | Comp   | SRGB |  Texture supported                                                             | Renderable                                                                    | Filterable                                    |
-    //                               |                     |          |   |  |                    |                                        | type   |      |                                                                                |                                                                               |                                               |
-    map.insert(InternalFormatInfoPair(GL_R16F,              RGBAFormat(16,  0,  0,  0, 0, GL_RED,          GL_HALF_FLOAT,                   GL_FLOAT, false, RequireESOrExtAndExt&lt;3, &amp;Extensions::textureHalfFloat, &amp;Extensions::textureRG&gt;, RequireESOrExtAndExt&lt;3, &amp;Extensions::textureHalfFloat, &amp;Extensions::textureRG&gt;, RequireExt&lt;&amp;Extensions::textureHalfFloatLinear&gt;)));
-    map.insert(InternalFormatInfoPair(GL_RG16F,             RGBAFormat(16, 16,  0,  0, 0, GL_RG,           GL_HALF_FLOAT,                   GL_FLOAT, false, RequireESOrExtAndExt&lt;3, &amp;Extensions::textureHalfFloat, &amp;Extensions::textureRG&gt;, RequireESOrExtAndExt&lt;3, &amp;Extensions::textureHalfFloat, &amp;Extensions::textureRG&gt;, RequireExt&lt;&amp;Extensions::textureHalfFloatLinear&gt;)));
-    map.insert(InternalFormatInfoPair(GL_RGB16F,            RGBAFormat(16, 16, 16,  0, 0, GL_RGB,          GL_HALF_FLOAT,                   GL_FLOAT, false, RequireESOrExt&lt;3, &amp;Extensions::textureHalfFloat&gt;,                               RequireESOrExt&lt;3, &amp;Extensions::textureHalfFloat&gt;,                               RequireExt&lt;&amp;Extensions::textureHalfFloatLinear&gt;)));
-    map.insert(InternalFormatInfoPair(GL_RGBA16F,           RGBAFormat(16, 16, 16, 16, 0, GL_RGBA,         GL_HALF_FLOAT,                   GL_FLOAT, false, RequireESOrExt&lt;3, &amp;Extensions::textureHalfFloat&gt;,                               RequireESOrExt&lt;3, &amp;Extensions::textureHalfFloat&gt;,                               RequireExt&lt;&amp;Extensions::textureHalfFloatLinear&gt;)));
-    map.insert(InternalFormatInfoPair(GL_R32F,              RGBAFormat(32,  0,  0,  0, 0, GL_RED,          GL_FLOAT,                        GL_FLOAT, false, RequireESOrExtAndExt&lt;3, &amp;Extensions::textureFloat, &amp;Extensions::textureRG&gt;,     RequireESOrExtAndExt&lt;3, &amp;Extensions::textureFloat, &amp;Extensions::textureRG&gt;,     RequireExt&lt;&amp;Extensions::textureFloatLinear&gt;    )));
-    map.insert(InternalFormatInfoPair(GL_RG32F,             RGBAFormat(32, 32,  0,  0, 0, GL_RG,           GL_FLOAT,                        GL_FLOAT, false, RequireESOrExtAndExt&lt;3, &amp;Extensions::textureFloat, &amp;Extensions::textureRG&gt;,     RequireESOrExtAndExt&lt;3, &amp;Extensions::textureFloat, &amp;Extensions::textureRG&gt;,     RequireExt&lt;&amp;Extensions::textureFloatLinear&gt;    )));
-    map.insert(InternalFormatInfoPair(GL_RGB32F,            RGBAFormat(32, 32, 32,  0, 0, GL_RGB,          GL_FLOAT,                        GL_FLOAT, false, RequireESOrExt&lt;3, &amp;Extensions::textureFloat&gt;,                                   RequireESOrExt&lt;3, &amp;Extensions::textureFloat&gt;,                                   RequireExt&lt;&amp;Extensions::textureFloatLinear&gt;    )));
-    map.insert(InternalFormatInfoPair(GL_RGBA32F,           RGBAFormat(32, 32, 32, 32, 0, GL_RGBA,         GL_FLOAT,                        GL_FLOAT, false, RequireESOrExt&lt;3, &amp;Extensions::textureFloat&gt;,                                   RequireESOrExt&lt;3, &amp;Extensions::textureFloat&gt;,                                   RequireExt&lt;&amp;Extensions::textureFloatLinear&gt;    )));
</del><ins>+    //                               | Internal format     |          | D |S | Format             | Type                                   | Comp   | SRGB |  Texture supported | Renderable                  | Filterable                                    |
+    //                               |                     |          |   |  |                    |                                        | type   |      |                    |                             |                                               |
+    map.insert(InternalFormatInfoPair(GL_R16F,              RGBAFormat(16,  0,  0,  0, 0, GL_RED,          GL_HALF_FLOAT,                   GL_FLOAT, false, HalfFloatSupportRG, HalfFloatRenderableSupportRG, RequireExt&lt;&amp;Extensions::textureHalfFloatLinear&gt;)));
+    map.insert(InternalFormatInfoPair(GL_RG16F,             RGBAFormat(16, 16,  0,  0, 0, GL_RG,           GL_HALF_FLOAT,                   GL_FLOAT, false, HalfFloatSupportRG, HalfFloatRenderableSupportRG, RequireExt&lt;&amp;Extensions::textureHalfFloatLinear&gt;)));
+    map.insert(InternalFormatInfoPair(GL_RGB16F,            RGBAFormat(16, 16, 16,  0, 0, GL_RGB,          GL_HALF_FLOAT,                   GL_FLOAT, false, HalfFloatSupport,   HalfFloatRenderableSupport,   RequireExt&lt;&amp;Extensions::textureHalfFloatLinear&gt;)));
+    map.insert(InternalFormatInfoPair(GL_RGBA16F,           RGBAFormat(16, 16, 16, 16, 0, GL_RGBA,         GL_HALF_FLOAT,                   GL_FLOAT, false, HalfFloatSupport,   HalfFloatRenderableSupport,   RequireExt&lt;&amp;Extensions::textureHalfFloatLinear&gt;)));
+    map.insert(InternalFormatInfoPair(GL_R32F,              RGBAFormat(32,  0,  0,  0, 0, GL_RED,          GL_FLOAT,                        GL_FLOAT, false, FloatSupportRG,     FloatRenderableSupportRG,     RequireExt&lt;&amp;Extensions::textureFloatLinear&gt;    )));
+    map.insert(InternalFormatInfoPair(GL_RG32F,             RGBAFormat(32, 32,  0,  0, 0, GL_RG,           GL_FLOAT,                        GL_FLOAT, false, FloatSupportRG,     FloatRenderableSupportRG,     RequireExt&lt;&amp;Extensions::textureFloatLinear&gt;    )));
+    map.insert(InternalFormatInfoPair(GL_RGB32F,            RGBAFormat(32, 32, 32,  0, 0, GL_RGB,          GL_FLOAT,                        GL_FLOAT, false, FloatSupport,       FloatRenderableSupport,       RequireExt&lt;&amp;Extensions::textureFloatLinear&gt;    )));
+    map.insert(InternalFormatInfoPair(GL_RGBA32F,           RGBAFormat(32, 32, 32, 32, 0, GL_RGBA,         GL_FLOAT,                        GL_FLOAT, false, FloatSupport,       FloatRenderableSupport,       RequireExt&lt;&amp;Extensions::textureFloatLinear&gt;    )));
</ins><span class="cx"> 
</span><span class="cx">     // Depth stencil formats
</span><span class="cx">     //                               | Internal format         |                  | D |S | X | Format            | Type                             | Component type        | Supported                                    | Renderable                                                                         | Filterable                                  |
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_DEPTH_COMPONENT16,     DepthStencilFormat(16, 0,  0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,                 GL_UNSIGNED_NORMALIZED, RequireES&lt;2&gt;,                                  RequireES&lt;2&gt;,                                                                        RequireESOrExt&lt;3, &amp;Extensions::depthTextures&gt;)));
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_DEPTH_COMPONENT24,     DepthStencilFormat(24, 0,  0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,                   GL_UNSIGNED_NORMALIZED, RequireES&lt;3&gt;,                                  RequireES&lt;3&gt;,                                                                        RequireESOrExt&lt;3, &amp;Extensions::depthTextures&gt;)));
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_DEPTH_COMPONENT32F,    DepthStencilFormat(32, 0,  0, GL_DEPTH_COMPONENT, GL_FLOAT,                          GL_FLOAT,               RequireES&lt;3&gt;,                                  RequireES&lt;3&gt;,                                                                        RequireESOrExt&lt;3, &amp;Extensions::depthTextures&gt;)));
</span><del>-    map.insert(InternalFormatInfoPair(GL_DEPTH_COMPONENT32_OES, DepthStencilFormat(32, 0,  0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,                   GL_UNSIGNED_NORMALIZED, RequireExt&lt;&amp;Extensions::depthTextures&gt;,        RequireExt&lt;&amp;Extensions::depthTextures&gt;,                                              AlwaysSupported                              )));
</del><ins>+    map.insert(InternalFormatInfoPair(GL_DEPTH_COMPONENT32_OES, DepthStencilFormat(32, 0,  0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,                   GL_UNSIGNED_NORMALIZED, RequireExtOrExt&lt;&amp;Extensions::depthTextures, &amp;Extensions::depth32&gt;, RequireExtOrExt&lt;&amp;Extensions::depthTextures, &amp;Extensions::depth32&gt;, AlwaysSupported                            )));
</ins><span class="cx">     map.insert(InternalFormatInfoPair(GL_DEPTH24_STENCIL8,      DepthStencilFormat(24, 8,  0, GL_DEPTH_STENCIL,   GL_UNSIGNED_INT_24_8,              GL_UNSIGNED_NORMALIZED, RequireESOrExt&lt;3, &amp;Extensions::depthTextures&gt;, RequireESOrExtOrExt&lt;3, &amp;Extensions::depthTextures, &amp;Extensions::packedDepthStencil&gt;, AlwaysSupported                              )));
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_DEPTH32F_STENCIL8,     DepthStencilFormat(32, 8, 24, GL_DEPTH_STENCIL,   GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_FLOAT,               RequireES&lt;3&gt;,                                  RequireES&lt;3&gt;,                                                                        AlwaysSupported                              )));
</span><span class="cx">     // STENCIL_INDEX8 is special-cased, see around the bottom of the list.
</span><span class="lines">@@ -450,29 +501,64 @@
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_SRGB_ALPHA_EXT,  UnsizedFormat(GL_RGBA,            RequireESOrExt&lt;3, &amp;Extensions::sRGB&gt;,               RequireESOrExt&lt;3, &amp;Extensions::sRGB&gt;,               AlwaysSupported)));
</span><span class="cx"> 
</span><span class="cx">     // Compressed formats, From ES 3.0.1 spec, table 3.16
</span><del>-    //                               | Internal format                             |                |W |H | BS |CC| Format                                      | Type            | SRGB | Supported          | Renderable           | Filterable         |
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_R11_EAC,                        CompressedFormat(4, 4,  64, 1, GL_COMPRESSED_R11_EAC,                        GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SIGNED_R11_EAC,                 CompressedFormat(4, 4,  64, 1, GL_COMPRESSED_SIGNED_R11_EAC,                 GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RG11_EAC,                       CompressedFormat(4, 4, 128, 2, GL_COMPRESSED_RG11_EAC,                       GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SIGNED_RG11_EAC,                CompressedFormat(4, 4, 128, 2, GL_COMPRESSED_SIGNED_RG11_EAC,                GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGB8_ETC2,                      CompressedFormat(4, 4,  64, 3, GL_COMPRESSED_RGB8_ETC2,                      GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ETC2,                     CompressedFormat(4, 4,  64, 3, GL_COMPRESSED_SRGB8_ETC2,                     GL_UNSIGNED_BYTE, true,  UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  CompressedFormat(4, 4,  64, 3, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, CompressedFormat(4, 4,  64, 3, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE, true,  UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA8_ETC2_EAC,                 CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_RGBA8_ETC2_EAC,                 GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          GL_UNSIGNED_BYTE, true,  UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
</del><ins>+    //                               | Internal format                             |                |W |H | BS |CC| Format                                      | Type            | SRGB | Supported   | Renderable    | Filterable    |
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_R11_EAC,                        CompressedFormat(4, 4,  64, 1, GL_COMPRESSED_R11_EAC,                        GL_UNSIGNED_BYTE, false, RequireES&lt;3&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SIGNED_R11_EAC,                 CompressedFormat(4, 4,  64, 1, GL_COMPRESSED_SIGNED_R11_EAC,                 GL_UNSIGNED_BYTE, false, RequireES&lt;3&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RG11_EAC,                       CompressedFormat(4, 4, 128, 2, GL_COMPRESSED_RG11_EAC,                       GL_UNSIGNED_BYTE, false, RequireES&lt;3&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SIGNED_RG11_EAC,                CompressedFormat(4, 4, 128, 2, GL_COMPRESSED_SIGNED_RG11_EAC,                GL_UNSIGNED_BYTE, false, RequireES&lt;3&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGB8_ETC2,                      CompressedFormat(4, 4,  64, 3, GL_COMPRESSED_RGB8_ETC2,                      GL_UNSIGNED_BYTE, false, RequireES&lt;3&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ETC2,                     CompressedFormat(4, 4,  64, 3, GL_COMPRESSED_SRGB8_ETC2,                     GL_UNSIGNED_BYTE, true,  RequireES&lt;3&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  CompressedFormat(4, 4,  64, 3, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  GL_UNSIGNED_BYTE, false, RequireES&lt;3&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, CompressedFormat(4, 4,  64, 3, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE, true,  RequireES&lt;3&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA8_ETC2_EAC,                 CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_RGBA8_ETC2_EAC,                 GL_UNSIGNED_BYTE, false, RequireES&lt;3&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          GL_UNSIGNED_BYTE, true,  RequireES&lt;3&gt;, NeverSupported, AlwaysSupported)));
</ins><span class="cx"> 
</span><span class="cx">     // From GL_EXT_texture_compression_dxt1
</span><del>-    //                               | Internal format                   |                |W |H | BS |CC| Format                            | Type            | SRGB | Supported                                      | Renderable    | Filterable    |
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGB_S3TC_DXT1_EXT,    CompressedFormat(4, 4,  64, 3, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,    GL_UNSIGNED_BYTE, false, RequireExt&lt;&amp;Extensions::textureCompressionDXT1&gt;, NeverSupported, AlwaysSupported)));
-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,   CompressedFormat(4, 4,  64, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,   GL_UNSIGNED_BYTE, false, RequireExt&lt;&amp;Extensions::textureCompressionDXT1&gt;, NeverSupported, AlwaysSupported)));
</del><ins>+    //                               | Internal format                   |                |W |H | BS |CC| Format                            | Type            | SRGB | Supported                                         | Renderable    | Filterable    |
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGB_S3TC_DXT1_EXT,    CompressedFormat(4, 4,  64, 3, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,    GL_UNSIGNED_BYTE, false, RequireExt&lt;&amp;Extensions::textureCompressionDXT1&gt;,    NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,   CompressedFormat(4, 4,  64, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,   GL_UNSIGNED_BYTE, false, RequireExt&lt;&amp;Extensions::textureCompressionDXT1&gt;,    NeverSupported, AlwaysSupported)));
</ins><span class="cx"> 
</span><span class="cx">     // From GL_ANGLE_texture_compression_dxt3
</span><del>-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_UNSIGNED_BYTE, false, RequireExt&lt;&amp;Extensions::textureCompressionDXT5&gt;, NeverSupported, AlwaysSupported)));
</del><ins>+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_UNSIGNED_BYTE, false, RequireExt&lt;&amp;Extensions::textureCompressionDXT5&gt;,    NeverSupported, AlwaysSupported)));
</ins><span class="cx"> 
</span><span class="cx">     // From GL_ANGLE_texture_compression_dxt5
</span><del>-    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_UNSIGNED_BYTE, false, RequireExt&lt;&amp;Extensions::textureCompressionDXT5&gt;, NeverSupported, AlwaysSupported)));
</del><ins>+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_UNSIGNED_BYTE, false, RequireExt&lt;&amp;Extensions::textureCompressionDXT5&gt;,    NeverSupported, AlwaysSupported)));
</ins><span class="cx"> 
</span><ins>+    // From GL_OES_compressed_ETC1_RGB8_texture
+    map.insert(InternalFormatInfoPair(GL_ETC1_RGB8_OES,                   CompressedFormat(4, 4,  64, 3, GL_ETC1_RGB8_OES,                   GL_UNSIGNED_BYTE, false, RequireExt&lt;&amp;Extensions::compressedETC1RGB8Texture&gt;, NeverSupported, AlwaysSupported)));
+
+    // From KHR_texture_compression_astc_hdr
+    //                               | Internal format                          |                | W | H | BS |CC| Format                                   | Type            | SRGB | Supported                                                                                     | Renderable     | Filterable    |
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_4x4_KHR,           CompressedFormat( 4,  4, 128, 4, GL_COMPRESSED_RGBA_ASTC_4x4_KHR,           GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_5x4_KHR,           CompressedFormat( 5,  4, 128, 4, GL_COMPRESSED_RGBA_ASTC_5x4_KHR,           GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_5x5_KHR,           CompressedFormat( 5,  5, 128, 4, GL_COMPRESSED_RGBA_ASTC_5x5_KHR,           GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_6x5_KHR,           CompressedFormat( 6,  5, 128, 4, GL_COMPRESSED_RGBA_ASTC_6x5_KHR,           GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_6x6_KHR,           CompressedFormat( 6,  6, 128, 4, GL_COMPRESSED_RGBA_ASTC_6x6_KHR,           GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_8x5_KHR,           CompressedFormat( 8,  5, 128, 4, GL_COMPRESSED_RGBA_ASTC_8x5_KHR,           GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_8x6_KHR,           CompressedFormat( 8,  6, 128, 4, GL_COMPRESSED_RGBA_ASTC_8x6_KHR,           GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_8x8_KHR,           CompressedFormat( 8,  8, 128, 4, GL_COMPRESSED_RGBA_ASTC_8x8_KHR,           GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_10x5_KHR,          CompressedFormat(10,  5, 128, 4, GL_COMPRESSED_RGBA_ASTC_10x5_KHR,          GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_10x6_KHR,          CompressedFormat(10,  6, 128, 4, GL_COMPRESSED_RGBA_ASTC_10x6_KHR,          GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_10x8_KHR,          CompressedFormat(10,  8, 128, 4, GL_COMPRESSED_RGBA_ASTC_10x8_KHR,          GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_10x10_KHR,         CompressedFormat(10, 10, 128, 4, GL_COMPRESSED_RGBA_ASTC_10x10_KHR,         GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_12x10_KHR,         CompressedFormat(12, 10, 128, 4, GL_COMPRESSED_RGBA_ASTC_12x10_KHR,         GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_ASTC_12x12_KHR,         CompressedFormat(12, 12, 128, 4, GL_COMPRESSED_RGBA_ASTC_12x12_KHR,         GL_UNSIGNED_BYTE, false, RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,   CompressedFormat( 4,  4, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,   GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,   CompressedFormat( 5,  4, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,   GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,   CompressedFormat( 5,  5, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,   GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,   CompressedFormat( 6,  5, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,   GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,   CompressedFormat( 6,  6, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,   GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,   CompressedFormat( 8,  5, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,   GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,   CompressedFormat( 8,  6, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,   GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,   CompressedFormat( 8,  8, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,   GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,  CompressedFormat(10,  5, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,  GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,  CompressedFormat(10,  6, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,  GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,  CompressedFormat(10,  8, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,  GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, CompressedFormat(10, 10, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, CompressedFormat(12, 10, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+    map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, CompressedFormat(12, 12, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, GL_UNSIGNED_BYTE, true,  RequireExtOrExt&lt;&amp;Extensions::textureCompressionASTCHDR, &amp;Extensions::textureCompressionASTCLDR&gt;, NeverSupported, AlwaysSupported)));
+
</ins><span class="cx">     // For STENCIL_INDEX8 we chose a normalized component type for the following reasons:
</span><span class="cx">     // - Multisampled buffer are disallowed for non-normalized integer component types and we want to support it for STENCIL_INDEX8
</span><span class="cx">     // - All other stencil formats (all depth-stencil) are either float or normalized
</span><span class="lines">@@ -480,6 +566,11 @@
</span><span class="cx">     //                               | Internal format  |                  |D |S |X | Format          | Type            | Component type        | Supported   | Renderable  | Filterable   |
</span><span class="cx">     map.insert(InternalFormatInfoPair(GL_STENCIL_INDEX8, DepthStencilFormat(0, 8, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES&lt;2&gt;, RequireES&lt;2&gt;, NeverSupported)));
</span><span class="cx"> 
</span><ins>+    // From GL_ANGLE_lossy_etc_decode
+    map.insert(InternalFormatInfoPair(GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, CompressedFormat(4, 4, 64, 3, GL_ETC1_RGB8_OES, GL_UNSIGNED_BYTE, false, RequireExt&lt;&amp;Extensions::lossyETCDecode&gt;, NeverSupported, AlwaysSupported)));
+
+    // clang-format on
+
</ins><span class="cx">     return map;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -592,9 +683,23 @@
</span><span class="cx">     return rx::roundUp(rowBytes, static_cast&lt;GLuint&gt;(alignment));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLuint InternalFormat::computeDepthPitch(GLenum formatType, GLsizei width, GLsizei height, GLint alignment, GLint rowLength) const
</del><ins>+GLuint InternalFormat::computeDepthPitch(GLenum formatType,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLint alignment,
+                                         GLint rowLength,
+                                         GLint imageHeight) const
</ins><span class="cx"> {
</span><del>-    return computeRowPitch(formatType, width, alignment, rowLength) * height;
</del><ins>+    GLuint rows;
+    if (imageHeight &gt; 0)
+    {
+        rows = imageHeight;
+    }
+    else
+    {
+        rows = height;
+    }
+    return computeRowPitch(formatType, width, alignment, rowLength) * rows;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLuint InternalFormat::computeBlockSize(GLenum formatType, GLsizei width, GLsizei height) const
</span><span class="lines">@@ -619,6 +724,15 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLuint InternalFormat::computeSkipPixels(GLint rowPitch,
+                                         GLint depthPitch,
+                                         GLint skipImages,
+                                         GLint skipRows,
+                                         GLint skipPixels) const
+{
+    return skipImages * depthPitch + skipRows * rowPitch + skipPixels * pixelBytes;
+}
+
</ins><span class="cx"> GLenum GetSizedInternalFormat(GLenum internalFormat, GLenum type)
</span><span class="cx"> {
</span><span class="cx">     const InternalFormat&amp; formatInfo = GetInternalFormatInfo(internalFormat);
</span><span class="lines">@@ -647,4 +761,796 @@
</span><span class="cx">     return formatSet;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+AttributeType GetAttributeType(GLenum enumValue)
+{
+    switch (enumValue)
+    {
+        case GL_FLOAT:
+            return ATTRIBUTE_FLOAT;
+        case GL_FLOAT_VEC2:
+            return ATTRIBUTE_VEC2;
+        case GL_FLOAT_VEC3:
+            return ATTRIBUTE_VEC3;
+        case GL_FLOAT_VEC4:
+            return ATTRIBUTE_VEC4;
+        case GL_INT:
+            return ATTRIBUTE_INT;
+        case GL_INT_VEC2:
+            return ATTRIBUTE_IVEC2;
+        case GL_INT_VEC3:
+            return ATTRIBUTE_IVEC3;
+        case GL_INT_VEC4:
+            return ATTRIBUTE_IVEC4;
+        case GL_UNSIGNED_INT:
+            return ATTRIBUTE_UINT;
+        case GL_UNSIGNED_INT_VEC2:
+            return ATTRIBUTE_UVEC2;
+        case GL_UNSIGNED_INT_VEC3:
+            return ATTRIBUTE_UVEC3;
+        case GL_UNSIGNED_INT_VEC4:
+            return ATTRIBUTE_UVEC4;
+        case GL_FLOAT_MAT2:
+            return ATTRIBUTE_MAT2;
+        case GL_FLOAT_MAT3:
+            return ATTRIBUTE_MAT3;
+        case GL_FLOAT_MAT4:
+            return ATTRIBUTE_MAT4;
+        case GL_FLOAT_MAT2x3:
+            return ATTRIBUTE_MAT2x3;
+        case GL_FLOAT_MAT2x4:
+            return ATTRIBUTE_MAT2x4;
+        case GL_FLOAT_MAT3x2:
+            return ATTRIBUTE_MAT3x2;
+        case GL_FLOAT_MAT3x4:
+            return ATTRIBUTE_MAT3x4;
+        case GL_FLOAT_MAT4x2:
+            return ATTRIBUTE_MAT4x2;
+        case GL_FLOAT_MAT4x3:
+            return ATTRIBUTE_MAT4x3;
+        default:
+            UNREACHABLE();
+            return ATTRIBUTE_FLOAT;
+    }
</ins><span class="cx"> }
</span><ins>+
+VertexFormatType GetVertexFormatType(GLenum type, GLboolean normalized, GLuint components, bool pureInteger)
+{
+    switch (type)
+    {
+        case GL_BYTE:
+            switch (components)
+            {
+                case 1:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SBYTE1_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SBYTE1_NORM;
+                    return VERTEX_FORMAT_SBYTE1;
+                case 2:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SBYTE2_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SBYTE2_NORM;
+                    return VERTEX_FORMAT_SBYTE2;
+                case 3:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SBYTE3_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SBYTE3_NORM;
+                    return VERTEX_FORMAT_SBYTE3;
+                case 4:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SBYTE4_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SBYTE4_NORM;
+                    return VERTEX_FORMAT_SBYTE4;
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        case GL_UNSIGNED_BYTE:
+            switch (components)
+            {
+                case 1:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_UBYTE1_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_UBYTE1_NORM;
+                    return VERTEX_FORMAT_UBYTE1;
+                case 2:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_UBYTE2_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_UBYTE2_NORM;
+                    return VERTEX_FORMAT_UBYTE2;
+                case 3:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_UBYTE3_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_UBYTE3_NORM;
+                    return VERTEX_FORMAT_UBYTE3;
+                case 4:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_UBYTE4_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_UBYTE4_NORM;
+                    return VERTEX_FORMAT_UBYTE4;
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        case GL_SHORT:
+            switch (components)
+            {
+                case 1:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SSHORT1_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SSHORT1_NORM;
+                    return VERTEX_FORMAT_SSHORT1;
+                case 2:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SSHORT2_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SSHORT2_NORM;
+                    return VERTEX_FORMAT_SSHORT2;
+                case 3:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SSHORT3_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SSHORT3_NORM;
+                    return VERTEX_FORMAT_SSHORT3;
+                case 4:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SSHORT4_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SSHORT4_NORM;
+                    return VERTEX_FORMAT_SSHORT4;
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        case GL_UNSIGNED_SHORT:
+            switch (components)
+            {
+                case 1:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_USHORT1_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_USHORT1_NORM;
+                    return VERTEX_FORMAT_USHORT1;
+                case 2:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_USHORT2_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_USHORT2_NORM;
+                    return VERTEX_FORMAT_USHORT2;
+                case 3:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_USHORT3_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_USHORT3_NORM;
+                    return VERTEX_FORMAT_USHORT3;
+                case 4:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_USHORT4_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_USHORT4_NORM;
+                    return VERTEX_FORMAT_USHORT4;
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        case GL_INT:
+            switch (components)
+            {
+                case 1:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SINT1_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SINT1_NORM;
+                    return VERTEX_FORMAT_SINT1;
+                case 2:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SINT2_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SINT2_NORM;
+                    return VERTEX_FORMAT_SINT2;
+                case 3:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SINT3_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SINT3_NORM;
+                    return VERTEX_FORMAT_SINT3;
+                case 4:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_SINT4_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_SINT4_NORM;
+                    return VERTEX_FORMAT_SINT4;
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        case GL_UNSIGNED_INT:
+            switch (components)
+            {
+                case 1:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_UINT1_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_UINT1_NORM;
+                    return VERTEX_FORMAT_UINT1;
+                case 2:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_UINT2_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_UINT2_NORM;
+                    return VERTEX_FORMAT_UINT2;
+                case 3:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_UINT3_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_UINT3_NORM;
+                    return VERTEX_FORMAT_UINT3;
+                case 4:
+                    if (pureInteger)
+                        return VERTEX_FORMAT_UINT4_INT;
+                    if (normalized)
+                        return VERTEX_FORMAT_UINT4_NORM;
+                    return VERTEX_FORMAT_UINT4;
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        case GL_FLOAT:
+            switch (components)
+            {
+                case 1:
+                    return VERTEX_FORMAT_FLOAT1;
+                case 2:
+                    return VERTEX_FORMAT_FLOAT2;
+                case 3:
+                    return VERTEX_FORMAT_FLOAT3;
+                case 4:
+                    return VERTEX_FORMAT_FLOAT4;
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        case GL_HALF_FLOAT:
+            switch (components)
+            {
+                case 1:
+                    return VERTEX_FORMAT_HALF1;
+                case 2:
+                    return VERTEX_FORMAT_HALF2;
+                case 3:
+                    return VERTEX_FORMAT_HALF3;
+                case 4:
+                    return VERTEX_FORMAT_HALF4;
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        case GL_FIXED:
+            switch (components)
+            {
+                case 1:
+                    return VERTEX_FORMAT_FIXED1;
+                case 2:
+                    return VERTEX_FORMAT_FIXED2;
+                case 3:
+                    return VERTEX_FORMAT_FIXED3;
+                case 4:
+                    return VERTEX_FORMAT_FIXED4;
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        case GL_INT_2_10_10_10_REV:
+            if (pureInteger)
+                return VERTEX_FORMAT_SINT210_INT;
+            if (normalized)
+                return VERTEX_FORMAT_SINT210_NORM;
+            return VERTEX_FORMAT_SINT210;
+        case GL_UNSIGNED_INT_2_10_10_10_REV:
+            if (pureInteger)
+                return VERTEX_FORMAT_UINT210_INT;
+            if (normalized)
+                return VERTEX_FORMAT_UINT210_NORM;
+            return VERTEX_FORMAT_UINT210;
+        default:
+            UNREACHABLE();
+            break;
+    }
+    return VERTEX_FORMAT_UBYTE1;
+}
+
+VertexFormatType GetVertexFormatType(const VertexAttribute &amp;attrib)
+{
+    return GetVertexFormatType(attrib.type, attrib.normalized, attrib.size, attrib.pureInteger);
+}
+
+VertexFormatType GetVertexFormatType(const VertexAttribute &amp;attrib, GLenum currentValueType)
+{
+    if (!attrib.enabled)
+    {
+        return GetVertexFormatType(currentValueType, GL_FALSE, 4, (currentValueType != GL_FLOAT));
+    }
+    return GetVertexFormatType(attrib);
+}
+
+const VertexFormat &amp;GetVertexFormatFromType(VertexFormatType vertexFormatType)
+{
+    switch (vertexFormatType)
+    {
+        case VERTEX_FORMAT_SBYTE1:
+        {
+            static const VertexFormat format(GL_BYTE, GL_FALSE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE1_NORM:
+        {
+            static const VertexFormat format(GL_BYTE, GL_TRUE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE2:
+        {
+            static const VertexFormat format(GL_BYTE, GL_FALSE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE2_NORM:
+        {
+            static const VertexFormat format(GL_BYTE, GL_TRUE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE3:
+        {
+            static const VertexFormat format(GL_BYTE, GL_FALSE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE3_NORM:
+        {
+            static const VertexFormat format(GL_BYTE, GL_TRUE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE4:
+        {
+            static const VertexFormat format(GL_BYTE, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE4_NORM:
+        {
+            static const VertexFormat format(GL_BYTE, GL_TRUE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE1:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE1_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE2:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE2_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE3:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE3_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE4:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE4_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT1:
+        {
+            static const VertexFormat format(GL_SHORT, GL_FALSE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT1_NORM:
+        {
+            static const VertexFormat format(GL_SHORT, GL_TRUE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT2:
+        {
+            static const VertexFormat format(GL_SHORT, GL_FALSE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT2_NORM:
+        {
+            static const VertexFormat format(GL_SHORT, GL_TRUE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT3:
+        {
+            static const VertexFormat format(GL_SHORT, GL_FALSE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT3_NORM:
+        {
+            static const VertexFormat format(GL_SHORT, GL_TRUE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT4:
+        {
+            static const VertexFormat format(GL_SHORT, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT4_NORM:
+        {
+            static const VertexFormat format(GL_SHORT, GL_TRUE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT1:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT1_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT2:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT2_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT3:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT3_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT4:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT4_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT1:
+        {
+            static const VertexFormat format(GL_INT, GL_FALSE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT1_NORM:
+        {
+            static const VertexFormat format(GL_INT, GL_TRUE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT2:
+        {
+            static const VertexFormat format(GL_INT, GL_FALSE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT2_NORM:
+        {
+            static const VertexFormat format(GL_INT, GL_TRUE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT3:
+        {
+            static const VertexFormat format(GL_INT, GL_FALSE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT3_NORM:
+        {
+            static const VertexFormat format(GL_INT, GL_TRUE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT4:
+        {
+            static const VertexFormat format(GL_INT, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT4_NORM:
+        {
+            static const VertexFormat format(GL_INT, GL_TRUE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT1:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT1_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT2:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT2_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT3:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT3_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT4:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT4_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE1_INT:
+        {
+            static const VertexFormat format(GL_BYTE, GL_FALSE, 1, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE2_INT:
+        {
+            static const VertexFormat format(GL_BYTE, GL_FALSE, 2, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE3_INT:
+        {
+            static const VertexFormat format(GL_BYTE, GL_FALSE, 3, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SBYTE4_INT:
+        {
+            static const VertexFormat format(GL_BYTE, GL_FALSE, 4, true);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE1_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 1, true);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE2_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 2, true);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE3_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 3, true);
+            return format;
+        }
+        case VERTEX_FORMAT_UBYTE4_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 4, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT1_INT:
+        {
+            static const VertexFormat format(GL_SHORT, GL_FALSE, 1, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT2_INT:
+        {
+            static const VertexFormat format(GL_SHORT, GL_FALSE, 2, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT3_INT:
+        {
+            static const VertexFormat format(GL_SHORT, GL_FALSE, 3, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SSHORT4_INT:
+        {
+            static const VertexFormat format(GL_SHORT, GL_FALSE, 4, true);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT1_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 1, true);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT2_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 2, true);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT3_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 3, true);
+            return format;
+        }
+        case VERTEX_FORMAT_USHORT4_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 4, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT1_INT:
+        {
+            static const VertexFormat format(GL_INT, GL_FALSE, 1, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT2_INT:
+        {
+            static const VertexFormat format(GL_INT, GL_FALSE, 2, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT3_INT:
+        {
+            static const VertexFormat format(GL_INT, GL_FALSE, 3, true);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT4_INT:
+        {
+            static const VertexFormat format(GL_INT, GL_FALSE, 4, true);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT1_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 1, true);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT2_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 2, true);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT3_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 3, true);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT4_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 4, true);
+            return format;
+        }
+        case VERTEX_FORMAT_FIXED1:
+        {
+            static const VertexFormat format(GL_FIXED, GL_FALSE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_FIXED2:
+        {
+            static const VertexFormat format(GL_FIXED, GL_FALSE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_FIXED3:
+        {
+            static const VertexFormat format(GL_FIXED, GL_FALSE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_FIXED4:
+        {
+            static const VertexFormat format(GL_FIXED, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_HALF1:
+        {
+            static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_HALF2:
+        {
+            static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_HALF3:
+        {
+            static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_HALF4:
+        {
+            static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_FLOAT1:
+        {
+            static const VertexFormat format(GL_FLOAT, GL_FALSE, 1, false);
+            return format;
+        }
+        case VERTEX_FORMAT_FLOAT2:
+        {
+            static const VertexFormat format(GL_FLOAT, GL_FALSE, 2, false);
+            return format;
+        }
+        case VERTEX_FORMAT_FLOAT3:
+        {
+            static const VertexFormat format(GL_FLOAT, GL_FALSE, 3, false);
+            return format;
+        }
+        case VERTEX_FORMAT_FLOAT4:
+        {
+            static const VertexFormat format(GL_FLOAT, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT210:
+        {
+            static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT210:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT210_NORM:
+        {
+            static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_TRUE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT210_NORM:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 4, false);
+            return format;
+        }
+        case VERTEX_FORMAT_SINT210_INT:
+        {
+            static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_FALSE, 4, true);
+            return format;
+        }
+        case VERTEX_FORMAT_UINT210_INT:
+        {
+            static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, true);
+            return format;
+        }
+        default:
+        {
+            static const VertexFormat format(GL_NONE, GL_FALSE, 0, false);
+            return format;
+        }
+    }
+}
+
+VertexFormat::VertexFormat(GLenum typeIn, GLboolean normalizedIn, GLuint componentsIn, bool pureIntegerIn)
+    : type(typeIn),
+      normalized(normalizedIn),
+      components(componentsIn),
+      pureInteger(pureIntegerIn)
+{
+    // float -&gt; !normalized
+    ASSERT(!(type == GL_FLOAT || type == GL_HALF_FLOAT || type == GL_FIXED) || normalized == GL_FALSE);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEformatutilsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -66,8 +66,18 @@
</span><span class="cx">     SupportCheckFunction filterSupport;
</span><span class="cx"> 
</span><span class="cx">     GLuint computeRowPitch(GLenum formatType, GLsizei width, GLint alignment, GLint rowLength) const;
</span><del>-    GLuint computeDepthPitch(GLenum formatType, GLsizei width, GLsizei height, GLint alignment, GLint rowLength) const;
</del><ins>+    GLuint computeDepthPitch(GLenum formatType,
+                             GLsizei width,
+                             GLsizei height,
+                             GLint alignment,
+                             GLint rowLength,
+                             GLint imageHeight) const;
</ins><span class="cx">     GLuint computeBlockSize(GLenum formatType, GLsizei width, GLsizei height) const;
</span><ins>+    GLuint computeSkipPixels(GLint rowPitch,
+                             GLint depthPitch,
+                             GLint skipImages,
+                             GLint skipRows,
+                             GLint skipPixels) const;
</ins><span class="cx"> };
</span><span class="cx"> const InternalFormat &amp;GetInternalFormatInfo(GLenum internalFormat);
</span><span class="cx"> 
</span><span class="lines">@@ -76,6 +86,149 @@
</span><span class="cx"> typedef std::set&lt;GLenum&gt; FormatSet;
</span><span class="cx"> const FormatSet &amp;GetAllSizedInternalFormats();
</span><span class="cx"> 
</span><del>-}
</del><ins>+// From the ESSL 3.00.4 spec:
+// Vertex shader inputs can only be float, floating-point vectors, matrices, signed and unsigned
+// integers and integer vectors. Vertex shader inputs cannot be arrays or structures.
</ins><span class="cx"> 
</span><ins>+enum AttributeType
+{
+    ATTRIBUTE_FLOAT,
+    ATTRIBUTE_VEC2,
+    ATTRIBUTE_VEC3,
+    ATTRIBUTE_VEC4,
+    ATTRIBUTE_INT,
+    ATTRIBUTE_IVEC2,
+    ATTRIBUTE_IVEC3,
+    ATTRIBUTE_IVEC4,
+    ATTRIBUTE_UINT,
+    ATTRIBUTE_UVEC2,
+    ATTRIBUTE_UVEC3,
+    ATTRIBUTE_UVEC4,
+    ATTRIBUTE_MAT2,
+    ATTRIBUTE_MAT3,
+    ATTRIBUTE_MAT4,
+    ATTRIBUTE_MAT2x3,
+    ATTRIBUTE_MAT2x4,
+    ATTRIBUTE_MAT3x2,
+    ATTRIBUTE_MAT3x4,
+    ATTRIBUTE_MAT4x2,
+    ATTRIBUTE_MAT4x3,
+};
+
+AttributeType GetAttributeType(GLenum enumValue);
+
+enum VertexFormatType
+{
+    VERTEX_FORMAT_INVALID,
+    VERTEX_FORMAT_SBYTE1,
+    VERTEX_FORMAT_SBYTE1_NORM,
+    VERTEX_FORMAT_SBYTE2,
+    VERTEX_FORMAT_SBYTE2_NORM,
+    VERTEX_FORMAT_SBYTE3,
+    VERTEX_FORMAT_SBYTE3_NORM,
+    VERTEX_FORMAT_SBYTE4,
+    VERTEX_FORMAT_SBYTE4_NORM,
+    VERTEX_FORMAT_UBYTE1,
+    VERTEX_FORMAT_UBYTE1_NORM,
+    VERTEX_FORMAT_UBYTE2,
+    VERTEX_FORMAT_UBYTE2_NORM,
+    VERTEX_FORMAT_UBYTE3,
+    VERTEX_FORMAT_UBYTE3_NORM,
+    VERTEX_FORMAT_UBYTE4,
+    VERTEX_FORMAT_UBYTE4_NORM,
+    VERTEX_FORMAT_SSHORT1,
+    VERTEX_FORMAT_SSHORT1_NORM,
+    VERTEX_FORMAT_SSHORT2,
+    VERTEX_FORMAT_SSHORT2_NORM,
+    VERTEX_FORMAT_SSHORT3,
+    VERTEX_FORMAT_SSHORT3_NORM,
+    VERTEX_FORMAT_SSHORT4,
+    VERTEX_FORMAT_SSHORT4_NORM,
+    VERTEX_FORMAT_USHORT1,
+    VERTEX_FORMAT_USHORT1_NORM,
+    VERTEX_FORMAT_USHORT2,
+    VERTEX_FORMAT_USHORT2_NORM,
+    VERTEX_FORMAT_USHORT3,
+    VERTEX_FORMAT_USHORT3_NORM,
+    VERTEX_FORMAT_USHORT4,
+    VERTEX_FORMAT_USHORT4_NORM,
+    VERTEX_FORMAT_SINT1,
+    VERTEX_FORMAT_SINT1_NORM,
+    VERTEX_FORMAT_SINT2,
+    VERTEX_FORMAT_SINT2_NORM,
+    VERTEX_FORMAT_SINT3,
+    VERTEX_FORMAT_SINT3_NORM,
+    VERTEX_FORMAT_SINT4,
+    VERTEX_FORMAT_SINT4_NORM,
+    VERTEX_FORMAT_UINT1,
+    VERTEX_FORMAT_UINT1_NORM,
+    VERTEX_FORMAT_UINT2,
+    VERTEX_FORMAT_UINT2_NORM,
+    VERTEX_FORMAT_UINT3,
+    VERTEX_FORMAT_UINT3_NORM,
+    VERTEX_FORMAT_UINT4,
+    VERTEX_FORMAT_UINT4_NORM,
+    VERTEX_FORMAT_SBYTE1_INT,
+    VERTEX_FORMAT_SBYTE2_INT,
+    VERTEX_FORMAT_SBYTE3_INT,
+    VERTEX_FORMAT_SBYTE4_INT,
+    VERTEX_FORMAT_UBYTE1_INT,
+    VERTEX_FORMAT_UBYTE2_INT,
+    VERTEX_FORMAT_UBYTE3_INT,
+    VERTEX_FORMAT_UBYTE4_INT,
+    VERTEX_FORMAT_SSHORT1_INT,
+    VERTEX_FORMAT_SSHORT2_INT,
+    VERTEX_FORMAT_SSHORT3_INT,
+    VERTEX_FORMAT_SSHORT4_INT,
+    VERTEX_FORMAT_USHORT1_INT,
+    VERTEX_FORMAT_USHORT2_INT,
+    VERTEX_FORMAT_USHORT3_INT,
+    VERTEX_FORMAT_USHORT4_INT,
+    VERTEX_FORMAT_SINT1_INT,
+    VERTEX_FORMAT_SINT2_INT,
+    VERTEX_FORMAT_SINT3_INT,
+    VERTEX_FORMAT_SINT4_INT,
+    VERTEX_FORMAT_UINT1_INT,
+    VERTEX_FORMAT_UINT2_INT,
+    VERTEX_FORMAT_UINT3_INT,
+    VERTEX_FORMAT_UINT4_INT,
+    VERTEX_FORMAT_FIXED1,
+    VERTEX_FORMAT_FIXED2,
+    VERTEX_FORMAT_FIXED3,
+    VERTEX_FORMAT_FIXED4,
+    VERTEX_FORMAT_HALF1,
+    VERTEX_FORMAT_HALF2,
+    VERTEX_FORMAT_HALF3,
+    VERTEX_FORMAT_HALF4,
+    VERTEX_FORMAT_FLOAT1,
+    VERTEX_FORMAT_FLOAT2,
+    VERTEX_FORMAT_FLOAT3,
+    VERTEX_FORMAT_FLOAT4,
+    VERTEX_FORMAT_SINT210,
+    VERTEX_FORMAT_UINT210,
+    VERTEX_FORMAT_SINT210_NORM,
+    VERTEX_FORMAT_UINT210_NORM,
+    VERTEX_FORMAT_SINT210_INT,
+    VERTEX_FORMAT_UINT210_INT,
+};
+
+typedef std::vector&lt;gl::VertexFormatType&gt; InputLayout;
+
+struct VertexFormat : angle::NonCopyable
+{
+    VertexFormat(GLenum typeIn, GLboolean normalizedIn, GLuint componentsIn, bool pureIntegerIn);
+
+    GLenum type;
+    GLboolean normalized;
+    GLuint components;
+    bool pureInteger;
+};
+
+VertexFormatType GetVertexFormatType(GLenum type, GLboolean normalized, GLuint components, bool pureInteger);
+VertexFormatType GetVertexFormatType(const VertexAttribute &amp;attrib);
+VertexFormatType GetVertexFormatType(const VertexAttribute &amp;attrib, GLenum currentValueType);
+const VertexFormat &amp;GetVertexFormatFromType(VertexFormatType vertexFormatType);
+
+}  // namespace gl
+
</ins><span class="cx"> #endif // LIBANGLE_FORMATUTILS_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEhistogram_macrosh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/histogram_macros.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/histogram_macros.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/histogram_macros.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -48,6 +48,9 @@
</span><span class="cx"> #define ANGLE_HISTOGRAM_PERCENTAGE(name, under_one_hundred) \
</span><span class="cx">     ANGLE_HISTOGRAM_ENUMERATION(name, under_one_hundred, 101)
</span><span class="cx"> 
</span><ins>+#define ANGLE_HISTOGRAM_BOOLEAN(name, sample) \
+    ANGLEPlatformCurrent()-&gt;histogramBoolean(name, sample)
+
</ins><span class="cx"> #define ANGLE_HISTOGRAM_ENUMERATION(name, sample, boundary_value) \
</span><span class="cx">     ANGLEPlatformCurrent()-&gt;histogramEnumeration(name, sample, boundary_value)
</span><span class="cx"> 
</span><span class="lines">@@ -57,4 +60,48 @@
</span><span class="cx"> #define ANGLE_HISTOGRAM_MEMORY_MB(name, sample) ANGLE_HISTOGRAM_CUSTOM_COUNTS( \
</span><span class="cx">     name, sample, 1, 1000, 50)
</span><span class="cx"> 
</span><ins>+#define ANGLE_HISTOGRAM_SPARSE_SLOWLY(name, sample) \
+    ANGLEPlatformCurrent()-&gt;histogramSparse(name, sample)
+
+// Scoped class which logs its time on this earth as a UMA statistic. This is
+// recommended for when you want a histogram which measures the time it takes
+// for a method to execute. This measures up to 10 seconds.
+#define SCOPED_ANGLE_HISTOGRAM_TIMER(name) \
+    SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, false, __COUNTER__)
+
+// Similar scoped histogram timer, but this uses ANGLE_HISTOGRAM_LONG_TIMES_100,
+// which measures up to an hour, and uses 100 buckets. This is more expensive
+// to store, so only use if this often takes &gt;10 seconds.
+#define SCOPED_ANGLE_HISTOGRAM_LONG_TIMER(name) \
+    SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, true, __COUNTER__)
+
+// This nested macro is necessary to expand __COUNTER__ to an actual value.
+#define SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, is_long, key) \
+    SCOPED_ANGLE_HISTOGRAM_TIMER_UNIQUE(name, is_long, key)
+
+#define SCOPED_ANGLE_HISTOGRAM_TIMER_UNIQUE(name, is_long, key)                              \
+    class ScopedHistogramTimer##key                                                          \
+    {                                                                                        \
+      public:                                                                                \
+        ScopedHistogramTimer##key() : constructed_(ANGLEPlatformCurrent()-&gt;currentTime()) {} \
+        ~ScopedHistogramTimer##key()                                                         \
+        {                                                                                    \
+            if (constructed_ == 0)                                                           \
+                return;                                                                      \
+            double elapsed = ANGLEPlatformCurrent()-&gt;currentTime() - constructed_;           \
+            int elapsedMS = static_cast&lt;int&gt;(elapsed * 1000.0);                              \
+            if (is_long)                                                                     \
+            {                                                                                \
+                ANGLE_HISTOGRAM_LONG_TIMES_100(name, elapsedMS);                             \
+            }                                                                                \
+            else                                                                             \
+            {                                                                                \
+                ANGLE_HISTOGRAM_TIMES(name, elapsedMS);                                      \
+            }                                                                                \
+        }                                                                                    \
+                                                                                             \
+      private:                                                                               \
+        double constructed_;                                                                 \
+    } scoped_histogram_timer_##key
+
</ins><span class="cx"> #endif  // BASE_METRICS_HISTOGRAM_MACROS_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEqueryconversionscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/queryconversions.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/queryconversions.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/queryconversions.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,37 +6,44 @@
</span><span class="cx"> 
</span><span class="cx"> // queryconversions.cpp: Implementation of state query cast conversions
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/queryconversions.h&quot;
+
+#include &lt;vector&gt;
+
</ins><span class="cx"> #include &quot;libANGLE/Context.h&quot;
</span><span class="cx"> #include &quot;common/utilities.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-// Helper class for converting a GL type to a GLenum:
-// We can't use CastStateValueEnum generally, because of GLboolean + GLubyte overlap.
-// We restrict our use to CastStateValue, where it eliminates duplicate parameters.
</del><ins>+namespace
+{
</ins><span class="cx"> 
</span><del>-template &lt;typename GLType&gt;
-struct CastStateValueEnum { static GLenum mEnumForType; };
</del><ins>+GLint64 ExpandFloatToInteger(GLfloat value)
+{
+    return static_cast&lt;GLint64&gt;((static_cast&lt;double&gt;(0xFFFFFFFFULL) * value - 1.0) / 2.0);
+}
</ins><span class="cx"> 
</span><del>-template &lt;&gt; GLenum CastStateValueEnum&lt;GLint&gt;::mEnumForType      = GL_INT;
-template &lt;&gt; GLenum CastStateValueEnum&lt;GLuint&gt;::mEnumForType     = GL_UNSIGNED_INT;
-template &lt;&gt; GLenum CastStateValueEnum&lt;GLboolean&gt;::mEnumForType  = GL_BOOL;
-template &lt;&gt; GLenum CastStateValueEnum&lt;GLint64&gt;::mEnumForType    = GL_INT_64_ANGLEX;
-template &lt;&gt; GLenum CastStateValueEnum&lt;GLfloat&gt;::mEnumForType    = GL_FLOAT;
</del><ins>+template &lt;typename QueryT&gt;
+QueryT ClampToQueryRange(GLint64 value)
+{
+    const GLint64 min = static_cast&lt;GLint64&gt;(std::numeric_limits&lt;QueryT&gt;::min());
+    const GLint64 max = static_cast&lt;GLint64&gt;(std::numeric_limits&lt;QueryT&gt;::max());
+    return static_cast&lt;QueryT&gt;(clamp(value, min, max));
+}
</ins><span class="cx"> 
</span><span class="cx"> template &lt;typename QueryT, typename NativeT&gt;
</span><span class="cx"> QueryT CastStateValueToInt(GLenum pname, NativeT value)
</span><span class="cx"> {
</span><del>-    GLenum queryType = CastStateValueEnum&lt;QueryT&gt;::mEnumForType;
-    GLenum nativeType = CastStateValueEnum&lt;NativeT&gt;::mEnumForType;
</del><ins>+    GLenum queryType  = GLTypeToGLenum&lt;QueryT&gt;::value;
+    GLenum nativeType = GLTypeToGLenum&lt;NativeT&gt;::value;
</ins><span class="cx"> 
</span><span class="cx">     if (nativeType == GL_FLOAT)
</span><span class="cx">     {
</span><span class="cx">         // RGBA color values and DepthRangeF values are converted to integer using Equation 2.4 from Table 4.5
</span><span class="cx">         if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
</span><span class="cx">         {
</span><del>-            return static_cast&lt;QueryT&gt;((static_cast&lt;GLfloat&gt;(0xFFFFFFFF) * value - 1.0f) / 2.0f);
</del><ins>+            return ClampToQueryRange&lt;QueryT&gt;(ExpandFloatToInteger(static_cast&lt;GLfloat&gt;(value)));
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="lines">@@ -59,77 +66,80 @@
</span><span class="cx"> template &lt;typename QueryT, typename NativeT&gt;
</span><span class="cx"> QueryT CastStateValue(GLenum pname, NativeT value)
</span><span class="cx"> {
</span><del>-    GLenum queryType = CastStateValueEnum&lt;QueryT&gt;::mEnumForType;
</del><ins>+    GLenum queryType = GLTypeToGLenum&lt;QueryT&gt;::value;
</ins><span class="cx"> 
</span><span class="cx">     switch (queryType)
</span><span class="cx">     {
</span><del>-      case GL_INT:              return CastStateValueToInt&lt;QueryT, NativeT&gt;(pname, value);
-      case GL_INT_64_ANGLEX:    return CastStateValueToInt&lt;QueryT, NativeT&gt;(pname, value);
-      case GL_FLOAT:            return static_cast&lt;QueryT&gt;(value);
-      case GL_BOOL:             return static_cast&lt;QueryT&gt;(value == static_cast&lt;NativeT&gt;(0) ? GL_FALSE : GL_TRUE);
-      default: UNREACHABLE();   return 0;
</del><ins>+        case GL_INT:
+            return CastStateValueToInt&lt;QueryT, NativeT&gt;(pname, value);
+        case GL_INT_64_ANGLEX:
+            return CastStateValueToInt&lt;QueryT, NativeT&gt;(pname, value);
+        case GL_FLOAT:
+            return static_cast&lt;QueryT&gt;(value);
+        case GL_BOOL:
+            return static_cast&lt;QueryT&gt;(value == static_cast&lt;NativeT&gt;(0) ? GL_FALSE : GL_TRUE);
+        default:
+            UNREACHABLE();
+            return 0;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}  // anonymous namespace
+
+template &lt;&gt;
+GLenum GLTypeToGLenum&lt;GLint&gt;::value = GL_INT;
+template &lt;&gt;
+GLenum GLTypeToGLenum&lt;GLuint&gt;::value = GL_UNSIGNED_INT;
+template &lt;&gt;
+GLenum GLTypeToGLenum&lt;GLboolean&gt;::value = GL_BOOL;
+template &lt;&gt;
+GLenum GLTypeToGLenum&lt;GLint64&gt;::value = GL_INT_64_ANGLEX;
+template &lt;&gt;
+GLenum GLTypeToGLenum&lt;GLfloat&gt;::value = GL_FLOAT;
+
</ins><span class="cx"> template &lt;typename QueryT&gt;
</span><span class="cx"> void CastStateValues(Context *context, GLenum nativeType, GLenum pname,
</span><span class="cx">                      unsigned int numParams, QueryT *outParams)
</span><span class="cx"> {
</span><span class="cx">     if (nativeType == GL_INT)
</span><span class="cx">     {
</span><del>-        GLint *intParams = NULL;
-        intParams = new GLint[numParams];
</del><ins>+        std::vector&lt;GLint&gt; intParams(numParams, 0);
+        context-&gt;getIntegerv(pname, intParams.data());
</ins><span class="cx"> 
</span><del>-        context-&gt;getIntegerv(pname, intParams);
-
</del><span class="cx">         for (unsigned int i = 0; i &lt; numParams; ++i)
</span><span class="cx">         {
</span><span class="cx">             outParams[i] = CastStateValue&lt;QueryT&gt;(pname, intParams[i]);
</span><span class="cx">         }
</span><del>-
-        delete [] intParams;
</del><span class="cx">     }
</span><span class="cx">     else if (nativeType == GL_BOOL)
</span><span class="cx">     {
</span><del>-        GLboolean *boolParams = NULL;
-        boolParams = new GLboolean[numParams];
</del><ins>+        std::vector&lt;GLboolean&gt; boolParams(numParams, GL_FALSE);
+        context-&gt;getBooleanv(pname, boolParams.data());
</ins><span class="cx"> 
</span><del>-        context-&gt;getBooleanv(pname, boolParams);
-
</del><span class="cx">         for (unsigned int i = 0; i &lt; numParams; ++i)
</span><span class="cx">         {
</span><span class="cx">             outParams[i] = (boolParams[i] == GL_FALSE ? static_cast&lt;QueryT&gt;(0) : static_cast&lt;QueryT&gt;(1));
</span><span class="cx">         }
</span><del>-
-        delete [] boolParams;
</del><span class="cx">     }
</span><span class="cx">     else if (nativeType == GL_FLOAT)
</span><span class="cx">     {
</span><del>-        GLfloat *floatParams = NULL;
-        floatParams = new GLfloat[numParams];
</del><ins>+        std::vector&lt;GLfloat&gt; floatParams(numParams, 0.0f);
+        context-&gt;getFloatv(pname, floatParams.data());
</ins><span class="cx"> 
</span><del>-        context-&gt;getFloatv(pname, floatParams);
-
</del><span class="cx">         for (unsigned int i = 0; i &lt; numParams; ++i)
</span><span class="cx">         {
</span><span class="cx">             outParams[i] = CastStateValue&lt;QueryT&gt;(pname, floatParams[i]);
</span><span class="cx">         }
</span><del>-
-        delete [] floatParams;
</del><span class="cx">     }
</span><span class="cx">     else if (nativeType == GL_INT_64_ANGLEX)
</span><span class="cx">     {
</span><del>-        GLint64 *int64Params = NULL;
-        int64Params = new GLint64[numParams];
</del><ins>+        std::vector&lt;GLint64&gt; int64Params(numParams, 0);
+        context-&gt;getInteger64v(pname, int64Params.data());
</ins><span class="cx"> 
</span><del>-        context-&gt;getInteger64v(pname, int64Params);
-
</del><span class="cx">         for (unsigned int i = 0; i &lt; numParams; ++i)
</span><span class="cx">         {
</span><span class="cx">             outParams[i] = CastStateValue&lt;QueryT&gt;(pname, int64Params[i]);
</span><span class="cx">         }
</span><del>-
-        delete [] int64Params;
</del><span class="cx">     }
</span><span class="cx">     else UNREACHABLE();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEqueryconversionsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/queryconversions.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/queryconversions.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/queryconversions.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,12 +6,31 @@
</span><span class="cx"> 
</span><span class="cx"> // queryconversions.h: Declaration of state query cast conversions
</span><span class="cx"> 
</span><ins>+#ifndef LIBANGLE_QUERY_CONVERSIONS_H_
+#define LIBANGLE_QUERY_CONVERSIONS_H_
+
+#include &quot;angle_gl.h&quot;
+#include &quot;common/angleutils.h&quot;
+
</ins><span class="cx"> namespace gl
</span><span class="cx"> {
</span><ins>+class Context;
</ins><span class="cx"> 
</span><ins>+// Helper class for converting a GL type to a GLenum:
+// We can't use CastStateValueEnum generally, because of GLboolean + GLubyte overlap.
+// We restrict our use to CastStateValue, where it eliminates duplicate parameters.
+
+template &lt;typename GLType&gt;
+struct GLTypeToGLenum
+{
+    static GLenum value;
+};
+
</ins><span class="cx"> // The GL state query API types are: bool, int, uint, float, int64
</span><span class="cx"> template &lt;typename QueryT&gt;
</span><span class="cx"> void CastStateValues(Context *context, GLenum nativeType, GLenum pname,
</span><span class="cx">                      unsigned int numParams, QueryT *outParams);
</span><span class="cx"> 
</span><span class="cx"> }
</span><ins>+
+#endif  // LIBANGLE_QUERY_CONVERSIONS_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererBufferImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/BufferImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/BufferImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/BufferImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,7 +10,8 @@
</span><span class="cx"> #define LIBANGLE_RENDERER_BUFFERIMPL_H_
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><del>-#include &quot;libANGLE/Buffer.h&quot;
</del><ins>+#include &quot;common/mathutil.h&quot;
+#include &quot;libANGLE/Error.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #include &lt;stdint.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -29,9 +30,11 @@
</span><span class="cx">     virtual gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) = 0;
</span><span class="cx">     virtual gl::Error unmap(GLboolean *result) = 0;
</span><span class="cx"> 
</span><del>-    // This method may not have a corresponding GL-backed function. It is necessary
-    // for validation, for certain indexed draw calls.
-    virtual gl::Error getData(const uint8_t **outData) = 0;
</del><ins>+    virtual gl::Error getIndexRange(GLenum type,
+                                    size_t offset,
+                                    size_t count,
+                                    bool primitiveRestartEnabled,
+                                    gl::IndexRange *outRange) = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererBufferImpl_mockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/BufferImpl_mock.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/BufferImpl_mock.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/BufferImpl_mock.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -19,7 +19,7 @@
</span><span class="cx"> class MockBufferImpl : public BufferImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    ~MockBufferImpl() override { destructor(); }
</del><ins>+    ~MockBufferImpl() { destructor(); }
</ins><span class="cx"> 
</span><span class="cx">     MOCK_METHOD3(setData, gl::Error(const void*, size_t, GLenum));
</span><span class="cx">     MOCK_METHOD3(setSubData, gl::Error(const void*, size_t, size_t));
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx">     MOCK_METHOD4(mapRange, gl::Error(size_t, size_t, GLbitfield, GLvoid **));
</span><span class="cx">     MOCK_METHOD1(unmap, gl::Error(GLboolean *result));
</span><span class="cx"> 
</span><del>-    MOCK_METHOD1(getData, gl::Error(const uint8_t **));
</del><ins>+    MOCK_METHOD5(getIndexRange, gl::Error(GLenum, size_t, size_t, bool, gl::IndexRange *));
</ins><span class="cx"> 
</span><span class="cx">     MOCK_METHOD0(destructor, void());
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererCompilerImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/CompilerImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/CompilerImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/CompilerImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,6 +8,7 @@
</span><span class="cx"> //                 for the gl::Compiler object.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><ins>+#include &quot;GLSLANG/ShaderLang.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_COMPILERIMPL_H_
</span><span class="lines">@@ -23,6 +24,9 @@
</span><span class="cx">     virtual ~CompilerImpl() {}
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error release() = 0;
</span><ins>+
+    // TODO(jmadill): Expose translator built-in resources init method.
+    virtual ShShaderOutput getTranslatorOutputType() const = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererDeviceImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DeviceImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DeviceImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DeviceImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -26,9 +26,10 @@
</span><span class="cx">     DeviceImpl();
</span><span class="cx">     virtual ~DeviceImpl();
</span><span class="cx"> 
</span><del>-    virtual egl::Error getDevice(EGLAttrib *value) = 0;
</del><ins>+    virtual egl::Error getDevice(void **outValue) = 0;
</ins><span class="cx">     virtual EGLint getType() = 0;
</span><span class="cx">     virtual void generateExtensions(egl::DeviceExtensions *outExtensions) const = 0;
</span><ins>+    virtual bool deviceExternallySourced() = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererDisplayImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DisplayImpl.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DisplayImpl.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DisplayImpl.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,16 +21,13 @@
</span><span class="cx"> 
</span><span class="cx"> DisplayImpl::~DisplayImpl()
</span><span class="cx"> {
</span><del>-    while (!mSurfaceSet.empty())
-    {
-        destroySurface(*mSurfaceSet.begin());
-    }
</del><ins>+    ASSERT(mSurfaceSet.empty());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DisplayImpl::destroySurface(egl::Surface *surface)
</span><span class="cx"> {
</span><span class="cx">     mSurfaceSet.erase(surface);
</span><del>-    surface-&gt;release();
</del><ins>+    surface-&gt;onDestroy();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const egl::DisplayExtensions &amp;DisplayImpl::getExtensions() const
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererDisplayImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DisplayImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DisplayImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/DisplayImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -24,6 +24,7 @@
</span><span class="cx"> class Display;
</span><span class="cx"> struct Config;
</span><span class="cx"> class Surface;
</span><ins>+class ImageSibling;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="lines">@@ -34,8 +35,10 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class SurfaceImpl;
</span><ins>+class ImageImpl;
</ins><span class="cx"> struct ConfigDesc;
</span><span class="cx"> class DeviceImpl;
</span><ins>+class StreamImpl;
</ins><span class="cx"> 
</span><span class="cx"> class DisplayImpl : angle::NonCopyable
</span><span class="cx"> {
</span><span class="lines">@@ -46,17 +49,28 @@
</span><span class="cx">     virtual egl::Error initialize(egl::Display *display) = 0;
</span><span class="cx">     virtual void terminate() = 0;
</span><span class="cx"> 
</span><del>-    virtual egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &amp;attribs,
-                                           SurfaceImpl **outSurface) = 0;
-    virtual egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &amp;attribs,
-                                            SurfaceImpl **outSurface) = 0;
-    virtual egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
-                                                     const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface) = 0;
-    virtual egl::Error createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap,
-                                           const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface) = 0;
-    virtual egl::Error createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &amp;attribs,
-                                     gl::Context **outContext) = 0;
</del><ins>+    virtual SurfaceImpl *createWindowSurface(const egl::Config *configuration,
+                                             EGLNativeWindowType window,
+                                             const egl::AttributeMap &amp;attribs) = 0;
+    virtual SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
+                                              const egl::AttributeMap &amp;attribs) = 0;
+    virtual SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
+                                                       EGLClientBuffer shareHandle,
+                                                       const egl::AttributeMap &amp;attribs) = 0;
+    virtual SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
+                                             NativePixmapType nativePixmap,
+                                             const egl::AttributeMap &amp;attribs) = 0;
</ins><span class="cx"> 
</span><ins>+    virtual ImageImpl *createImage(EGLenum target,
+                                   egl::ImageSibling *buffer,
+                                   const egl::AttributeMap &amp;attribs) = 0;
+
+    virtual gl::Context *createContext(const egl::Config *config,
+                                       const gl::Context *shareContext,
+                                       const egl::AttributeMap &amp;attribs) = 0;
+
+    virtual StreamImpl *createStream(const egl::AttributeMap &amp;attribs) = 0;
+
</ins><span class="cx">     virtual egl::Error makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual egl::ConfigSet generateConfigs() const = 0;
</span><span class="lines">@@ -71,6 +85,11 @@
</span><span class="cx"> 
</span><span class="cx">     virtual egl::Error getDevice(DeviceImpl **device) = 0;
</span><span class="cx"> 
</span><ins>+    virtual egl::Error waitClient() const = 0;
+    virtual egl::Error waitNative(EGLint engine,
+                                  egl::Surface *drawSurface,
+                                  egl::Surface *readSurface) const = 0;
+
</ins><span class="cx">     const egl::Caps &amp;getCaps() const;
</span><span class="cx"> 
</span><span class="cx">     typedef std::set&lt;egl::Surface*&gt; SurfaceSet;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererFramebufferImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/FramebufferImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/FramebufferImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/FramebufferImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -31,22 +31,28 @@
</span><span class="cx">     explicit FramebufferImpl(const gl::Framebuffer::Data &amp;data) : mData(data) { }
</span><span class="cx">     virtual ~FramebufferImpl() { }
</span><span class="cx"> 
</span><del>-    virtual void onUpdateColorAttachment(size_t index) = 0;
-    virtual void onUpdateDepthAttachment() = 0;
-    virtual void onUpdateStencilAttachment() = 0;
-    virtual void onUpdateDepthStencilAttachment() = 0;
-
-    virtual void setDrawBuffers(size_t count, const GLenum *buffers) = 0;
-    virtual void setReadBuffer(GLenum buffer) = 0;
-
</del><ins>+    virtual gl::Error discard(size_t count, const GLenum *attachments) = 0;
</ins><span class="cx">     virtual gl::Error invalidate(size_t count, const GLenum *attachments) = 0;
</span><span class="cx">     virtual gl::Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &amp;area) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error clear(const gl::Data &amp;data, GLbitfield mask) = 0;
</span><del>-    virtual gl::Error clearBufferfv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLfloat *values) = 0;
-    virtual gl::Error clearBufferuiv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLuint *values) = 0;
-    virtual gl::Error clearBufferiv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLint *values) = 0;
-    virtual gl::Error clearBufferfi(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) = 0;
</del><ins>+    virtual gl::Error clearBufferfv(const gl::Data &amp;data,
+                                    GLenum buffer,
+                                    GLint drawbuffer,
+                                    const GLfloat *values) = 0;
+    virtual gl::Error clearBufferuiv(const gl::Data &amp;data,
+                                     GLenum buffer,
+                                     GLint drawbuffer,
+                                     const GLuint *values) = 0;
+    virtual gl::Error clearBufferiv(const gl::Data &amp;data,
+                                    GLenum buffer,
+                                    GLint drawbuffer,
+                                    const GLint *values) = 0;
+    virtual gl::Error clearBufferfi(const gl::Data &amp;data,
+                                    GLenum buffer,
+                                    GLint drawbuffer,
+                                    GLfloat depth,
+                                    GLint stencil) = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual GLenum getImplementationColorReadFormat() const = 0;
</span><span class="cx">     virtual GLenum getImplementationColorReadType() const = 0;
</span><span class="lines">@@ -55,8 +61,10 @@
</span><span class="cx">     virtual gl::Error blit(const gl::State &amp;state, const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea,
</span><span class="cx">                            GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer) = 0;
</span><span class="cx"> 
</span><del>-    virtual GLenum checkStatus() const = 0;
</del><ins>+    virtual bool checkStatus() const = 0;
</ins><span class="cx"> 
</span><ins>+    virtual void syncState(const gl::Framebuffer::DirtyBits &amp;dirtyBits) = 0;
+
</ins><span class="cx">     const gl::Framebuffer::Data &amp;getData() const { return mData; }
</span><span class="cx"> 
</span><span class="cx">   protected:
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererFramebufferImpl_mockh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/FramebufferImpl_mock.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/FramebufferImpl_mock.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/FramebufferImpl_mock.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,72 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// FramebufferImpl_mock.h:
+//   Defines a mock of the FramebufferImpl class.
+//
+
+#ifndef LIBANGLE_RENDERER_FRAMEBUFFERIMPLMOCK_H_
+#define LIBANGLE_RENDERER_FRAMEBUFFERIMPLMOCK_H_
+
+#include &quot;gmock/gmock.h&quot;
+
+#include &quot;libANGLE/renderer/FramebufferImpl.h&quot;
+
+namespace rx
+{
+
+class MockFramebufferImpl : public rx::FramebufferImpl
+{
+  public:
+    MockFramebufferImpl() : rx::FramebufferImpl(gl::Framebuffer::Data()) {}
+    virtual ~MockFramebufferImpl() { destroy(); }
+
+    MOCK_METHOD2(discard, gl::Error(size_t, const GLenum *));
+    MOCK_METHOD2(invalidate, gl::Error(size_t, const GLenum *));
+    MOCK_METHOD3(invalidateSub, gl::Error(size_t, const GLenum *, const gl::Rectangle &amp;));
+
+    MOCK_METHOD2(clear, gl::Error(const gl::Data &amp;, GLbitfield));
+    MOCK_METHOD4(clearBufferfv, gl::Error(const gl::Data &amp;, GLenum, GLint, const GLfloat *));
+    MOCK_METHOD4(clearBufferuiv, gl::Error(const gl::Data &amp;, GLenum, GLint, const GLuint *));
+    MOCK_METHOD4(clearBufferiv, gl::Error(const gl::Data &amp;, GLenum, GLint, const GLint *));
+    MOCK_METHOD5(clearBufferfi, gl::Error(const gl::Data &amp;, GLenum, GLint, GLfloat, GLint));
+
+    MOCK_CONST_METHOD0(getImplementationColorReadFormat, GLenum());
+    MOCK_CONST_METHOD0(getImplementationColorReadType, GLenum());
+    MOCK_CONST_METHOD5(
+        readPixels,
+        gl::Error(const gl::State &amp;, const gl::Rectangle &amp;, GLenum, GLenum, GLvoid *));
+
+    MOCK_METHOD6(blit,
+                 gl::Error(const gl::State &amp;,
+                           const gl::Rectangle &amp;,
+                           const gl::Rectangle &amp;,
+                           GLbitfield,
+                           GLenum,
+                           const gl::Framebuffer *));
+
+    MOCK_CONST_METHOD0(checkStatus, bool());
+
+    MOCK_METHOD1(syncState, void(const gl::Framebuffer::DirtyBits &amp;));
+
+    MOCK_METHOD0(destroy, void());
+};
+
+inline ::testing::NiceMock&lt;MockFramebufferImpl&gt; *MakeFramebufferMock()
+{
+    ::testing::NiceMock&lt;MockFramebufferImpl&gt; *framebufferImpl =
+        new ::testing::NiceMock&lt;MockFramebufferImpl&gt;();
+    // TODO(jmadill): add ON_CALLS for other returning methods
+    ON_CALL(*framebufferImpl, checkStatus()).WillByDefault(::testing::Return(true));
+
+    // We must mock the destructor since NiceMock doesn't work for destructors.
+    EXPECT_CALL(*framebufferImpl, destroy()).Times(1).RetiresOnSaturation();
+
+    return framebufferImpl;
+}
+
+}  // namespace rx
+
+#endif  // LIBANGLE_RENDERER_FRAMEBUFFERIMPLMOCK_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererImageImplh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImageImpl.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImageImpl.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImageImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// ImageImpl.h: Defines the rx::ImageImpl class representing the EGLimage object.
+
+#ifndef LIBANGLE_RENDERER_IMAGEIMPL_H_
+#define LIBANGLE_RENDERER_IMAGEIMPL_H_
+
+#include &quot;common/angleutils.h&quot;
+#include &quot;libANGLE/Error.h&quot;
+
+namespace egl
+{
+class ImageSibling;
+}
+
+namespace rx
+{
+class ImageImpl : angle::NonCopyable
+{
+  public:
+    virtual ~ImageImpl() {}
+    virtual egl::Error initialize() = 0;
+
+    virtual gl::Error orphan(egl::ImageSibling *sibling) = 0;
+};
+}
+
+#endif  // LIBANGLE_RENDERER_IMAGEIMPL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererImageImpl_mockh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImageImpl_mock.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImageImpl_mock.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImageImpl_mock.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// ImageImpl_mock.h: Defines a mock of the ImageImpl class.
+
+#ifndef LIBANGLE_RENDERER_IMAGEIMPLMOCK_H_
+#define LIBANGLE_RENDERER_IMAGEIMPLMOCK_H_
+
+#include &quot;gmock/gmock.h&quot;
+
+#include &quot;libANGLE/renderer/ImageImpl.h&quot;
+
+namespace rx
+{
+class MockImageImpl : public ImageImpl
+{
+  public:
+    virtual ~MockImageImpl() { destructor(); }
+    MOCK_METHOD0(initialize, egl::Error(void));
+    MOCK_METHOD1(orphan, gl::Error(egl::ImageSibling *));
+    MOCK_METHOD0(destructor, void());
+};
+}
+
+#endif  // LIBANGLE_RENDERER_IMAGEIMPLMOCK_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererImplFactoryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImplFactory.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImplFactory.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ImplFactory.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,6 +11,9 @@
</span><span class="cx"> #define LIBANGLE_RENDERER_IMPLFACTORY_H_
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><ins>+#include &quot;libANGLE/Program.h&quot;
+#include &quot;libANGLE/Shader.h&quot;
+#include &quot;libANGLE/VertexArray.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -22,10 +25,12 @@
</span><span class="cx"> class ProgramImpl;
</span><span class="cx"> class QueryImpl;
</span><span class="cx"> class RenderbufferImpl;
</span><ins>+class SamplerImpl;
</ins><span class="cx"> class ShaderImpl;
</span><span class="cx"> class TextureImpl;
</span><span class="cx"> class TransformFeedbackImpl;
</span><span class="cx"> class VertexArrayImpl;
</span><ins>+class StreamImpl;
</ins><span class="cx"> 
</span><span class="cx"> class ImplFactory : angle::NonCopyable
</span><span class="cx"> {
</span><span class="lines">@@ -34,12 +39,11 @@
</span><span class="cx">     virtual ~ImplFactory() {}
</span><span class="cx"> 
</span><span class="cx">     // Shader creation
</span><del>-    virtual CompilerImpl *createCompiler(const gl::Data &amp;data) = 0;
-    virtual ShaderImpl *createShader(GLenum type) = 0;
-    virtual ProgramImpl *createProgram() = 0;
</del><ins>+    virtual CompilerImpl *createCompiler() = 0;
+    virtual ShaderImpl *createShader(const gl::Shader::Data &amp;data) = 0;
+    virtual ProgramImpl *createProgram(const gl::Program::Data &amp;data) = 0;
</ins><span class="cx"> 
</span><span class="cx">     // Framebuffer creation
</span><del>-    virtual FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data) = 0;
</del><span class="cx">     virtual FramebufferImpl *createFramebuffer(const gl::Framebuffer::Data &amp;data) = 0;
</span><span class="cx"> 
</span><span class="cx">     // Texture creation
</span><span class="lines">@@ -52,7 +56,7 @@
</span><span class="cx">     virtual BufferImpl *createBuffer() = 0;
</span><span class="cx"> 
</span><span class="cx">     // Vertex Array creation
</span><del>-    virtual VertexArrayImpl *createVertexArray() = 0;
</del><ins>+    virtual VertexArrayImpl *createVertexArray(const gl::VertexArray::Data &amp;data) = 0;
</ins><span class="cx"> 
</span><span class="cx">     // Query and Fence creation
</span><span class="cx">     virtual QueryImpl *createQuery(GLenum type) = 0;
</span><span class="lines">@@ -61,6 +65,9 @@
</span><span class="cx"> 
</span><span class="cx">     // Transform Feedback creation
</span><span class="cx">     virtual TransformFeedbackImpl *createTransformFeedback() = 0;
</span><ins>+
+    // Sampler object creation
+    virtual SamplerImpl *createSampler() = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererProgramImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -23,33 +23,24 @@
</span><span class="cx"> 
</span><span class="cx"> struct LinkResult
</span><span class="cx"> {
</span><ins>+    LinkResult(bool linkSuccess, const gl::Error &amp;error) : linkSuccess(linkSuccess), error(error) {}
+
</ins><span class="cx">     bool linkSuccess;
</span><span class="cx">     gl::Error error;
</span><del>-    LinkResult(bool linkSuccess, const gl::Error &amp;error);
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class ProgramImpl : angle::NonCopyable
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    typedef int SemanticIndexArray[gl::MAX_VERTEX_ATTRIBS];
</del><ins>+    ProgramImpl(const gl::Program::Data &amp;data) : mData(data) {}
+    virtual ~ProgramImpl() {}
</ins><span class="cx"> 
</span><del>-    ProgramImpl() { }
-    virtual ~ProgramImpl();
-
-    virtual bool usesPointSize() const = 0;
-    virtual int getShaderVersion() const = 0;
-    virtual GLenum getTransformFeedbackBufferMode() const = 0;
-
-    virtual GLenum getBinaryFormat() = 0;
</del><span class="cx">     virtual LinkResult load(gl::InfoLog &amp;infoLog, gl::BinaryInputStream *stream) = 0;
</span><span class="cx">     virtual gl::Error save(gl::BinaryOutputStream *stream) = 0;
</span><ins>+    virtual void setBinaryRetrievableHint(bool retrievable) = 0;
</ins><span class="cx"> 
</span><del>-    virtual LinkResult link(const gl::Data &amp;data, gl::InfoLog &amp;infoLog,
-                            gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                            const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings,
-                            GLenum transformFeedbackBufferMode,
-                            int *registers, std::vector&lt;gl::LinkedVarying&gt; *linkedVaryings,
-                            std::map&lt;int, gl::VariableLocation&gt; *outputVariables) = 0;
</del><ins>+    virtual LinkResult link(const gl::Data &amp;data, gl::InfoLog &amp;infoLog) = 0;
+    virtual GLboolean validate(const gl::Caps &amp;caps, gl::InfoLog *infoLog) = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) = 0;
</span><span class="cx">     virtual void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) = 0;
</span><span class="lines">@@ -73,67 +64,20 @@
</span><span class="cx">     virtual void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
</span><span class="cx">     virtual void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) = 0;
</span><span class="cx"> 
</span><del>-    virtual void getUniformfv(GLint location, GLfloat *params) = 0;
-    virtual void getUniformiv(GLint location, GLint *params) = 0;
-    virtual void getUniformuiv(GLint location, GLuint *params) = 0;
</del><ins>+    // TODO: synchronize in syncState when dirty bits exist.
+    virtual void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) = 0;
</ins><span class="cx"> 
</span><del>-    // TODO: The following functions are possibly only applicable to D3D backends. The should be carefully evaluated to
-    // determine if they can be removed from this interface.
-    virtual GLint getSamplerMapping(gl::SamplerType type, unsigned int samplerIndex, const gl::Caps &amp;caps) const = 0;
-    virtual GLenum getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const = 0;
-    virtual GLint getUsedSamplerRange(gl::SamplerType type) const = 0;
-    virtual void updateSamplerMapping() = 0;
-    virtual bool validateSamplers(gl::InfoLog *infoLog, const gl::Caps &amp;caps) = 0;
</del><ins>+    // May only be called after a successful link operation.
+    // Return false for inactive blocks.
+    virtual bool getUniformBlockSize(const std::string &amp;blockName, size_t *sizeOut) const = 0;
</ins><span class="cx"> 
</span><del>-    virtual LinkResult compileProgramExecutables(gl::InfoLog &amp;infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                                                 int registers) = 0;
</del><ins>+    // May only be called after a successful link operation.
+    // Returns false for inactive members.
+    virtual bool getUniformBlockMemberInfo(const std::string &amp;memberUniformName,
+                                           sh::BlockMemberInfo *memberInfoOut) const = 0;
</ins><span class="cx"> 
</span><del>-    virtual bool linkUniforms(gl::InfoLog &amp;infoLog, const gl::Shader &amp;vertexShader, const gl::Shader &amp;fragmentShader,
-                              const gl::Caps &amp;caps) = 0;
-    virtual bool defineUniformBlock(gl::InfoLog &amp;infoLog, const gl::Shader &amp;shader, const sh::InterfaceBlock &amp;interfaceBlock,
-                                    const gl::Caps &amp;caps) = 0;
-
-    virtual gl::Error applyUniforms() = 0;
-    virtual gl::Error applyUniformBuffers(const gl::Data &amp;data, GLuint uniformBlockBindings[]) = 0;
-    virtual bool assignUniformBlockRegister(gl::InfoLog &amp;infoLog, gl::UniformBlock *uniformBlock, GLenum shader,
-                                            unsigned int registerIndex, const gl::Caps &amp;caps) = 0;
-
-    const std::vector&lt;gl::LinkedUniform*&gt; &amp;getUniforms() const { return mUniforms; }
-    const std::vector&lt;gl::VariableLocation&gt; &amp;getUniformIndices() const { return mUniformIndex; }
-    const std::vector&lt;gl::UniformBlock*&gt; &amp;getUniformBlocks() const { return mUniformBlocks; }
-    const std::vector&lt;gl::LinkedVarying&gt; &amp;getTransformFeedbackLinkedVaryings() const { return mTransformFeedbackLinkedVaryings; }
-    const std::vector&lt;sh::Attribute&gt; getShaderAttributes() { return mShaderAttributes; }
-    const SemanticIndexArray &amp;getSemanticIndexes() const { return mSemanticIndex; }
-
-    std::vector&lt;gl::LinkedUniform*&gt; &amp;getUniforms() { return mUniforms; }
-    std::vector&lt;gl::VariableLocation&gt; &amp;getUniformIndices() { return mUniformIndex; }
-    std::vector&lt;gl::UniformBlock*&gt; &amp;getUniformBlocks() { return mUniformBlocks; }
-    std::vector&lt;gl::LinkedVarying&gt; &amp;getTransformFeedbackLinkedVaryings() { return mTransformFeedbackLinkedVaryings; }
-    SemanticIndexArray &amp;getSemanticIndexes() { return mSemanticIndex; }
-
-    gl::LinkedUniform *getUniformByLocation(GLint location) const;
-    gl::LinkedUniform *getUniformByName(const std::string &amp;name) const;
-    gl::UniformBlock *getUniformBlockByIndex(GLuint blockIndex) const;
-
-    GLint getUniformLocation(const std::string &amp;name) const;
-    GLuint getUniformIndex(const std::string &amp;name) const;
-    GLuint getUniformBlockIndex(const std::string &amp;name) const;
-
-    void setShaderAttribute(size_t index, const sh::Attribute &amp;attrib);
-    void setShaderAttribute(size_t index, GLenum type, GLenum precision, const std::string &amp;name, GLint size, int location);
-
-    virtual void reset();
-
</del><span class="cx">   protected:
</span><del>-    std::vector&lt;gl::LinkedUniform*&gt; mUniforms;
-    std::vector&lt;gl::VariableLocation&gt; mUniformIndex;
-    std::vector&lt;gl::UniformBlock*&gt; mUniformBlocks;
-    std::vector&lt;gl::LinkedVarying&gt; mTransformFeedbackLinkedVaryings;
-
-    SemanticIndexArray mSemanticIndex;
-
-  private:
-    std::vector&lt;sh::Attribute&gt; mShaderAttributes;
</del><ins>+    const gl::Program::Data &amp;mData;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererProgramImpl_mockh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramImpl_mock.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramImpl_mock.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramImpl_mock.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,75 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// ProgramImpl_mock.h:
+//   Defines a mock of the ProgramImpl class.
+//
+
+#ifndef LIBANGLE_RENDERER_PROGRAMIMPLMOCK_H_
+#define LIBANGLE_RENDERER_PROGRAMIMPLMOCK_H_
+
+#include &quot;gmock/gmock.h&quot;
+
+#include &quot;libANGLE/renderer/ProgramImpl.h&quot;
+
+namespace rx
+{
+
+class MockProgramImpl : public rx::ProgramImpl
+{
+  public:
+    MockProgramImpl() : ProgramImpl(gl::Program::Data()) {}
+    virtual ~MockProgramImpl() { destroy(); }
+
+    MOCK_METHOD2(load, LinkResult(gl::InfoLog &amp;, gl::BinaryInputStream *));
+    MOCK_METHOD1(save, gl::Error(gl::BinaryOutputStream *));
+    MOCK_METHOD1(setBinaryRetrievableHint, void(bool));
+
+    MOCK_METHOD2(link, LinkResult(const gl::Data &amp;, gl::InfoLog &amp;));
+    MOCK_METHOD2(validate, GLboolean(const gl::Caps &amp;, gl::InfoLog *));
+
+    MOCK_METHOD3(setUniform1fv, void(GLint, GLsizei, const GLfloat *));
+    MOCK_METHOD3(setUniform2fv, void(GLint, GLsizei, const GLfloat *));
+    MOCK_METHOD3(setUniform3fv, void(GLint, GLsizei, const GLfloat *));
+    MOCK_METHOD3(setUniform4fv, void(GLint, GLsizei, const GLfloat *));
+    MOCK_METHOD3(setUniform1iv, void(GLint, GLsizei, const GLint *));
+    MOCK_METHOD3(setUniform2iv, void(GLint, GLsizei, const GLint *));
+    MOCK_METHOD3(setUniform3iv, void(GLint, GLsizei, const GLint *));
+    MOCK_METHOD3(setUniform4iv, void(GLint, GLsizei, const GLint *));
+    MOCK_METHOD3(setUniform1uiv, void(GLint, GLsizei, const GLuint *));
+    MOCK_METHOD3(setUniform2uiv, void(GLint, GLsizei, const GLuint *));
+    MOCK_METHOD3(setUniform3uiv, void(GLint, GLsizei, const GLuint *));
+    MOCK_METHOD3(setUniform4uiv, void(GLint, GLsizei, const GLuint *));
+
+    MOCK_METHOD4(setUniformMatrix2fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
+    MOCK_METHOD4(setUniformMatrix3fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
+    MOCK_METHOD4(setUniformMatrix4fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
+    MOCK_METHOD4(setUniformMatrix2x3fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
+    MOCK_METHOD4(setUniformMatrix3x2fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
+    MOCK_METHOD4(setUniformMatrix2x4fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
+    MOCK_METHOD4(setUniformMatrix4x2fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
+    MOCK_METHOD4(setUniformMatrix3x4fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
+    MOCK_METHOD4(setUniformMatrix4x3fv, void(GLint, GLsizei, GLboolean, const GLfloat *));
+
+    MOCK_METHOD2(setUniformBlockBinding, void(GLuint, GLuint));
+    MOCK_CONST_METHOD2(getUniformBlockSize, bool(const std::string &amp;, size_t *));
+    MOCK_CONST_METHOD2(getUniformBlockMemberInfo, bool(const std::string &amp;, sh::BlockMemberInfo *));
+
+    MOCK_METHOD0(destroy, void());
+};
+
+inline ::testing::NiceMock&lt;MockProgramImpl&gt; *MakeProgramMock()
+{
+    ::testing::NiceMock&lt;MockProgramImpl&gt; *programImpl = new ::testing::NiceMock&lt;MockProgramImpl&gt;();
+    // TODO(jmadill): add ON_CALLS for returning methods
+    // We must mock the destructor since NiceMock doesn't work for destructors.
+    EXPECT_CALL(*programImpl, destroy()).Times(1).RetiresOnSaturation();
+
+    return programImpl;
+}
+
+}  // namespace rx
+
+#endif  // LIBANGLE_RENDERER_PROGRAMIMPLMOCK_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererQueryImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/QueryImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/QueryImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/QueryImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -26,8 +26,12 @@
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error begin() = 0;
</span><span class="cx">     virtual gl::Error end() = 0;
</span><ins>+    virtual gl::Error queryCounter() = 0;
+    virtual gl::Error getResult(GLint *params) = 0;
</ins><span class="cx">     virtual gl::Error getResult(GLuint *params) = 0;
</span><del>-    virtual gl::Error isResultAvailable(GLuint *available) = 0;
</del><ins>+    virtual gl::Error getResult(GLint64 *params) = 0;
+    virtual gl::Error getResult(GLuint64 *params) = 0;
+    virtual gl::Error isResultAvailable(bool *available) = 0;
</ins><span class="cx"> 
</span><span class="cx">     GLenum getType() const { return mType;  }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererRenderbufferImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/RenderbufferImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/RenderbufferImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/RenderbufferImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,17 +14,23 @@
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><span class="cx"> 
</span><ins>+namespace egl
+{
+class Image;
+}
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> class RenderbufferImpl : public FramebufferAttachmentObjectImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    RenderbufferImpl();
-    virtual ~RenderbufferImpl() = 0;
</del><ins>+    RenderbufferImpl() {}
+    virtual ~RenderbufferImpl() {}
</ins><span class="cx"> 
</span><span class="cx">     virtual gl::Error setStorage(GLenum internalformat, size_t width, size_t height) = 0;
</span><span class="cx">     virtual gl::Error setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height) = 0;
</span><ins>+    virtual gl::Error setStorageEGLImageTarget(egl::Image *image) = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererRenderbufferImpl_mockh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/RenderbufferImpl_mock.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/RenderbufferImpl_mock.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/RenderbufferImpl_mock.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// RenderbufferImpl_mock.h: Defines a mock of the RenderbufferImpl class.
+
+#ifndef LIBANGLE_RENDERER_RENDERBUFFERIMPLMOCK_H_
+#define LIBANGLE_RENDERER_RENDERBUFFERIMPLMOCK_H_
+
+#include &quot;gmock/gmock.h&quot;
+
+#include &quot;libANGLE/Image.h&quot;
+#include &quot;libANGLE/renderer/RenderbufferImpl.h&quot;
+
+namespace rx
+{
+
+class MockRenderbufferImpl : public RenderbufferImpl
+{
+  public:
+    virtual ~MockRenderbufferImpl() { destructor(); }
+    MOCK_METHOD3(setStorage, gl::Error(GLenum, size_t, size_t));
+    MOCK_METHOD4(setStorageMultisample, gl::Error(size_t, GLenum, size_t, size_t));
+    MOCK_METHOD1(setStorageEGLImageTarget, gl::Error(egl::Image *));
+
+    MOCK_METHOD2(getAttachmentRenderTarget, gl::Error(const gl::FramebufferAttachment::Target &amp;, FramebufferAttachmentRenderTarget **));
+
+    MOCK_METHOD0(destructor, void());
+};
+
+}
+
+#endif // LIBANGLE_RENDERER_RENDERBUFFERIMPLMOCK_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererRenderercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/Renderer.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/Renderer.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/Renderer.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,10 +14,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><del>-
-Renderer::Renderer()
-    : mCapsInitialized(false),
-      mWorkaroundsInitialized(false)
</del><ins>+Renderer::Renderer() : mCapsInitialized(false)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -25,48 +22,41 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const gl::Caps &amp;Renderer::getRendererCaps() const
</del><ins>+void Renderer::ensureCapsInitialized() const
</ins><span class="cx"> {
</span><span class="cx">     if (!mCapsInitialized)
</span><span class="cx">     {
</span><del>-        generateCaps(&amp;mCaps, &amp;mTextureCaps, &amp;mExtensions);
</del><ins>+        generateCaps(&amp;mCaps, &amp;mTextureCaps, &amp;mExtensions, &amp;mLimitations);
</ins><span class="cx">         mCapsInitialized = true;
</span><span class="cx">     }
</span><ins>+}
</ins><span class="cx"> 
</span><ins>+const gl::Caps &amp;Renderer::getRendererCaps() const
+{
+    ensureCapsInitialized();
+
</ins><span class="cx">     return mCaps;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const gl::TextureCapsMap &amp;Renderer::getRendererTextureCaps() const
</span><span class="cx"> {
</span><del>-    if (!mCapsInitialized)
-    {
-        generateCaps(&amp;mCaps, &amp;mTextureCaps, &amp;mExtensions);
-        mCapsInitialized = true;
-    }
</del><ins>+    ensureCapsInitialized();
</ins><span class="cx"> 
</span><span class="cx">     return mTextureCaps;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const gl::Extensions &amp;Renderer::getRendererExtensions() const
</span><span class="cx"> {
</span><del>-    if (!mCapsInitialized)
-    {
-        generateCaps(&amp;mCaps, &amp;mTextureCaps, &amp;mExtensions);
-        mCapsInitialized = true;
-    }
</del><ins>+    ensureCapsInitialized();
</ins><span class="cx"> 
</span><span class="cx">     return mExtensions;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const Workarounds &amp;Renderer::getWorkarounds() const
</del><ins>+const gl::Limitations &amp;Renderer::getRendererLimitations() const
</ins><span class="cx"> {
</span><del>-    if (!mWorkaroundsInitialized)
-    {
-        mWorkarounds = generateWorkarounds();
-        mWorkaroundsInitialized = true;
-    }
</del><ins>+    ensureCapsInitialized();
</ins><span class="cx"> 
</span><del>-    return mWorkarounds;
</del><ins>+    return mLimitations;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererRendererh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/Renderer.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/Renderer.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/Renderer.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,10 +13,10 @@
</span><span class="cx"> #include &quot;libANGLE/Caps.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><ins>+#include &quot;libANGLE/State.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Uniform.h&quot;
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/ImplFactory.h&quot;
</span><del>-#include &quot;libANGLE/renderer/Workarounds.h&quot;
</del><span class="cx"> #include &quot;common/mathutil.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;stdint.h&gt;
</span><span class="lines">@@ -30,16 +30,11 @@
</span><span class="cx"> class Surface;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-namespace gl
-{
-class Buffer;
-struct Data;
-}
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> struct TranslatedIndexData;
</span><del>-struct Workarounds;
</del><ins>+struct SourceIndexData;
+struct WorkaroundsD3D;
</ins><span class="cx"> class DisplayImpl;
</span><span class="cx"> 
</span><span class="cx"> class Renderer : public ImplFactory
</span><span class="lines">@@ -51,12 +46,35 @@
</span><span class="cx">     virtual gl::Error flush() = 0;
</span><span class="cx">     virtual gl::Error finish() = 0;
</span><span class="cx"> 
</span><del>-    virtual gl::Error drawArrays(const gl::Data &amp;data, GLenum mode,
-                                 GLint first, GLsizei count, GLsizei instances) = 0;
-    virtual gl::Error drawElements(const gl::Data &amp;data, GLenum mode, GLsizei count, GLenum type,
-                                   const GLvoid *indices, GLsizei instances,
-                                   const RangeUI &amp;indexRange) = 0;
</del><ins>+    virtual gl::Error drawArrays(const gl::Data &amp;data, GLenum mode, GLint first, GLsizei count) = 0;
+    virtual gl::Error drawArraysInstanced(const gl::Data &amp;data,
+                                          GLenum mode,
+                                          GLint first,
+                                          GLsizei count,
+                                          GLsizei instanceCount) = 0;
</ins><span class="cx"> 
</span><ins>+    virtual gl::Error drawElements(const gl::Data &amp;data,
+                                   GLenum mode,
+                                   GLsizei count,
+                                   GLenum type,
+                                   const GLvoid *indices,
+                                   const gl::IndexRange &amp;indexRange) = 0;
+    virtual gl::Error drawElementsInstanced(const gl::Data &amp;data,
+                                            GLenum mode,
+                                            GLsizei count,
+                                            GLenum type,
+                                            const GLvoid *indices,
+                                            GLsizei instances,
+                                            const gl::IndexRange &amp;indexRange) = 0;
+    virtual gl::Error drawRangeElements(const gl::Data &amp;data,
+                                        GLenum mode,
+                                        GLuint start,
+                                        GLuint end,
+                                        GLsizei count,
+                                        GLenum type,
+                                        const GLvoid *indices,
+                                        const gl::IndexRange &amp;indexRange) = 0;
+
</ins><span class="cx">     // lost device
</span><span class="cx">     //TODO(jmadill): investigate if this stuff is necessary in GL
</span><span class="cx">     virtual void notifyDeviceLost() = 0;
</span><span class="lines">@@ -64,27 +82,39 @@
</span><span class="cx">     virtual bool testDeviceLost() = 0;
</span><span class="cx">     virtual bool testDeviceResettable() = 0;
</span><span class="cx"> 
</span><del>-    virtual VendorID getVendorId() const = 0;
</del><span class="cx">     virtual std::string getVendorString() const = 0;
</span><span class="cx">     virtual std::string getRendererDescription() const = 0;
</span><span class="cx"> 
</span><ins>+    virtual void insertEventMarker(GLsizei length, const char *marker) = 0;
+    virtual void pushGroupMarker(GLsizei length, const char *marker) = 0;
+    virtual void popGroupMarker() = 0;
+
+    virtual void syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;dirtyBits) = 0;
+
+    // Disjoint timer queries
+    virtual GLint getGPUDisjoint() = 0;
+    virtual GLint64 getTimestamp() = 0;
+
+    // Context switching
+    virtual void onMakeCurrent(const gl::Data &amp;data) = 0;
+
</ins><span class="cx">     // Renderer capabilities
</span><span class="cx">     const gl::Caps &amp;getRendererCaps() const;
</span><span class="cx">     const gl::TextureCapsMap &amp;getRendererTextureCaps() const;
</span><span class="cx">     const gl::Extensions &amp;getRendererExtensions() const;
</span><del>-    const Workarounds &amp;getWorkarounds() const;
</del><ins>+    const gl::Limitations &amp;getRendererLimitations() const;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    virtual void generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps, gl::Extensions *outExtensions) const = 0;
-    virtual Workarounds generateWorkarounds() const = 0;
</del><ins>+    void ensureCapsInitialized() const;
+    virtual void generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps,
+                              gl::Extensions *outExtensions,
+                              gl::Limitations *outLimitations) const = 0;
</ins><span class="cx"> 
</span><span class="cx">     mutable bool mCapsInitialized;
</span><span class="cx">     mutable gl::Caps mCaps;
</span><span class="cx">     mutable gl::TextureCapsMap mTextureCaps;
</span><span class="cx">     mutable gl::Extensions mExtensions;
</span><del>-
-    mutable bool mWorkaroundsInitialized;
-    mutable Workarounds mWorkarounds;
</del><ins>+    mutable gl::Limitations mLimitations;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererSamplerImplh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SamplerImpl.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SamplerImpl.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SamplerImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,25 @@
</span><ins>+//
+// Copyright 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// SamplerImpl.h: Defines the abstract rx::SamplerImpl class.
+
+#ifndef LIBANGLE_RENDERER_SAMPLERIMPL_H_
+#define LIBANGLE_RENDERER_SAMPLERIMPL_H_
+
+#include &quot;common/angleutils.h&quot;
+
+namespace rx
+{
+
+class SamplerImpl : public angle::NonCopyable
+{
+  public:
+    SamplerImpl() {}
+    virtual ~SamplerImpl() {}
+};
+}
+
+#endif  // LIBANGLE_RENDERER_SAMPLERIMPL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererShaderImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,8 +9,6 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_SHADERIMPL_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_SHADERIMPL_H_
</span><span class="cx"> 
</span><del>-#include &lt;vector&gt;
-
</del><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Shader.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -20,36 +18,21 @@
</span><span class="cx"> class ShaderImpl : angle::NonCopyable
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    ShaderImpl() { }
</del><ins>+    ShaderImpl(const gl::Shader::Data &amp;data) : mData(data) {}
</ins><span class="cx">     virtual ~ShaderImpl() { }
</span><span class="cx"> 
</span><del>-    virtual bool compile(gl::Compiler *compiler, const std::string &amp;source) = 0;
</del><ins>+    // Returns additional ShCompile options.
+    virtual int prepareSourceAndReturnOptions(std::stringstream *sourceStream,
+                                              std::string *sourcePath) = 0;
+    // Returns success for compiling on the driver. Returns success.
+    virtual bool postTranslateCompile(gl::Compiler *compiler, std::string *infoLog) = 0;
+
</ins><span class="cx">     virtual std::string getDebugInfo() const = 0;
</span><span class="cx"> 
</span><del>-    virtual const std::string &amp;getInfoLog() const { return mInfoLog; }
-    virtual const std::string &amp;getTranslatedSource() const { return mTranslatedSource; }
</del><ins>+    const gl::Shader::Data &amp;getData() const { return mData; }
</ins><span class="cx"> 
</span><del>-    const std::vector&lt;gl::PackedVarying&gt; &amp;getVaryings() const { return mVaryings; }
-    const std::vector&lt;sh::Uniform&gt; &amp;getUniforms() const { return mUniforms; }
-    const std::vector&lt;sh::InterfaceBlock&gt; &amp;getInterfaceBlocks() const  { return mInterfaceBlocks; }
-    const std::vector&lt;sh::Attribute&gt; &amp;getActiveAttributes() const { return mActiveAttributes; }
-    const std::vector&lt;sh::Attribute&gt; &amp;getActiveOutputVariables() const { return mActiveOutputVariables; }
-
-    std::vector&lt;gl::PackedVarying&gt; &amp;getVaryings() { return mVaryings; }
-    std::vector&lt;sh::Uniform&gt; &amp;getUniforms() { return mUniforms; }
-    std::vector&lt;sh::InterfaceBlock&gt; &amp;getInterfaceBlocks() { return mInterfaceBlocks; }
-    std::vector&lt;sh::Attribute&gt; &amp;getActiveAttributes() { return mActiveAttributes; }
-    std::vector&lt;sh::Attribute&gt; &amp;getActiveOutputVariables() { return mActiveOutputVariables; }
-
</del><span class="cx">   protected:
</span><del>-    std::string mInfoLog;
-    std::string mTranslatedSource;
-
-    std::vector&lt;gl::PackedVarying&gt; mVaryings;
-    std::vector&lt;sh::Uniform&gt; mUniforms;
-    std::vector&lt;sh::InterfaceBlock&gt; mInterfaceBlocks;
-    std::vector&lt;sh::Attribute&gt; mActiveAttributes;
-    std::vector&lt;sh::Attribute&gt; mActiveOutputVariables;
</del><ins>+    const gl::Shader::Data &amp;mData;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererStreamImplh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/StreamImpl.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/StreamImpl.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/StreamImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,25 @@
</span><ins>+//
+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// StreamImpl.h: Defines the abstract rx::StreamImpl class.
+
+#ifndef LIBANGLE_RENDERER_STREAMIMPL_H_
+#define LIBANGLE_RENDERER_STREAMIMPL_H_
+
+#include &quot;common/angleutils.h&quot;
+
+namespace rx
+{
+
+class StreamImpl : angle::NonCopyable
+{
+  public:
+    explicit StreamImpl() {}
+    virtual ~StreamImpl() {}
+};
+}  // namespace rx
+
+#endif  // LIBANGLE_RENDERER_STREAMIMPL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererSurfaceImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,6 +11,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><ins>+#include &quot;libANGLE/Framebuffer.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace egl
</span><span class="lines">@@ -22,6 +23,8 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+class FramebufferImpl;
+
</ins><span class="cx"> class SurfaceImpl : public FramebufferAttachmentObjectImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="lines">@@ -29,10 +32,11 @@
</span><span class="cx">     virtual ~SurfaceImpl();
</span><span class="cx"> 
</span><span class="cx">     virtual egl::Error initialize() = 0;
</span><ins>+    virtual FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data) = 0;
</ins><span class="cx">     virtual egl::Error swap() = 0;
</span><span class="cx">     virtual egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) = 0;
</span><span class="cx">     virtual egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) = 0;
</span><del>-    virtual egl::Error bindTexImage(EGLint buffer) = 0;
</del><ins>+    virtual egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) = 0;
</ins><span class="cx">     virtual egl::Error releaseTexImage(EGLint buffer) = 0;
</span><span class="cx">     virtual void setSwapInterval(EGLint interval) = 0;
</span><span class="cx"> 
</span><span class="lines">@@ -41,6 +45,7 @@
</span><span class="cx">     virtual EGLint getHeight() const = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual EGLint isPostSubBufferSupported() const = 0;
</span><ins>+    virtual EGLint getSwapBehavior() const = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererTextureImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TextureImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TextureImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TextureImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -20,6 +20,7 @@
</span><span class="cx"> namespace egl
</span><span class="cx"> {
</span><span class="cx"> class Surface;
</span><ins>+class Image;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="lines">@@ -30,7 +31,7 @@
</span><span class="cx"> struct Rectangle;
</span><span class="cx"> class Framebuffer;
</span><span class="cx"> struct PixelUnpackState;
</span><del>-struct SamplerState;
</del><ins>+struct TextureState;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="lines">@@ -50,9 +51,9 @@
</span><span class="cx">                                   const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
</span><del>-                                         const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) = 0;
</del><ins>+                                         const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) = 0;
</ins><span class="cx">     virtual gl::Error setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                            const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) = 0;
</del><ins>+                                            const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual gl::Error copyImage(GLenum target, size_t level, const gl::Rectangle &amp;sourceArea, GLenum internalFormat,
</span><span class="cx">                                 const gl::Framebuffer *source) = 0;
</span><span class="lines">@@ -61,8 +62,10 @@
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error setStorage(GLenum target, size_t levels, GLenum internalFormat, const gl::Extents &amp;size) = 0;
</span><span class="cx"> 
</span><del>-    virtual gl::Error generateMipmaps(const gl::SamplerState &amp;samplerState) = 0;
</del><ins>+    virtual gl::Error setEGLImageTarget(GLenum target, egl::Image *image) = 0;
</ins><span class="cx"> 
</span><ins>+    virtual gl::Error generateMipmaps(const gl::TextureState &amp;textureState) = 0;
+
</ins><span class="cx">     virtual void bindTexImage(egl::Surface *surface) = 0;
</span><span class="cx">     virtual void releaseTexImage() = 0;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererTextureImpl_mockh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TextureImpl_mock.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TextureImpl_mock.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TextureImpl_mock.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// TextureImpl_mock.h: Defines a mock of the TextureImpl class.
+
+#ifndef LIBANGLE_RENDERER_TEXTUREIMPLMOCK_H_
+#define LIBANGLE_RENDERER_TEXTUREIMPLMOCK_H_
+
+#include &quot;gmock/gmock.h&quot;
+
+#include &quot;libANGLE/renderer/TextureImpl.h&quot;
+
+namespace rx
+{
+
+class MockTextureImpl : public TextureImpl
+{
+  public:
+    virtual ~MockTextureImpl() { destructor(); }
+    MOCK_METHOD1(setUsage, void(GLenum));
+    MOCK_METHOD8(setImage, gl::Error(GLenum, size_t, GLenum, const gl::Extents &amp;, GLenum, GLenum, const gl::PixelUnpackState &amp;, const uint8_t *));
+    MOCK_METHOD7(setSubImage, gl::Error(GLenum, size_t, const gl::Box &amp;, GLenum, GLenum, const gl::PixelUnpackState &amp;, const uint8_t *));
+    MOCK_METHOD7(setCompressedImage, gl::Error(GLenum, size_t, GLenum, const gl::Extents &amp;, const gl::PixelUnpackState &amp;, size_t, const uint8_t *));
+    MOCK_METHOD7(setCompressedSubImage, gl::Error(GLenum, size_t, const gl::Box &amp;, GLenum, const gl::PixelUnpackState &amp;, size_t, const uint8_t *));
+    MOCK_METHOD5(copyImage, gl::Error(GLenum, size_t, const gl::Rectangle &amp;, GLenum, const gl::Framebuffer *));
+    MOCK_METHOD5(copySubImage, gl::Error(GLenum, size_t, const gl::Offset &amp;, const gl::Rectangle &amp;, const gl::Framebuffer *));
+    MOCK_METHOD4(setStorage, gl::Error(GLenum, size_t, GLenum, const gl::Extents &amp;));
+    MOCK_METHOD2(setEGLImageTarget, gl::Error(GLenum, egl::Image *));
+    MOCK_METHOD1(generateMipmaps, gl::Error(const gl::TextureState &amp;));
+    MOCK_METHOD1(bindTexImage, void(egl::Surface *));
+    MOCK_METHOD0(releaseTexImage, void(void));
+
+    MOCK_METHOD2(getAttachmentRenderTarget, gl::Error(const gl::FramebufferAttachment::Target &amp;, FramebufferAttachmentRenderTarget **));
+
+    MOCK_METHOD0(destructor, void());
+};
+
+}
+
+#endif // LIBANGLE_RENDERER_TEXTUREIMPLMOCK_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererTransformFeedbackImpl_mockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TransformFeedbackImpl_mock.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TransformFeedbackImpl_mock.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/TransformFeedbackImpl_mock.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -19,7 +19,7 @@
</span><span class="cx"> class MockTransformFeedbackImpl : public TransformFeedbackImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    ~MockTransformFeedbackImpl() override { destructor(); }
</del><ins>+    ~MockTransformFeedbackImpl() { destructor(); }
</ins><span class="cx"> 
</span><span class="cx">     MOCK_METHOD1(begin, void(GLenum primitiveMode));
</span><span class="cx">     MOCK_METHOD0(end, void());
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererVertexArrayImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/VertexArrayImpl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/VertexArrayImpl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/VertexArrayImpl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,7 +11,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Buffer.h&quot;
</span><del>-#include &quot;libANGLE/VertexAttribute.h&quot;
</del><ins>+#include &quot;libANGLE/VertexArray.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -19,12 +19,11 @@
</span><span class="cx"> class VertexArrayImpl : angle::NonCopyable
</span><span class="cx"> {
</span><span class="cx">   public:
</span><ins>+    VertexArrayImpl(const gl::VertexArray::Data &amp;data) : mData(data) { }
</ins><span class="cx">     virtual ~VertexArrayImpl() { }
</span><del>-
-    virtual void setElementArrayBuffer(const gl::Buffer *buffer) = 0;
-    virtual void setAttribute(size_t idx, const gl::VertexAttribute &amp;attr) = 0;
-    virtual void setAttributeDivisor(size_t idx, GLuint divisor) = 0;
-    virtual void enableAttribute(size_t idx, bool enabledState) = 0;
</del><ins>+    virtual void syncState(const gl::VertexArray::DirtyBits &amp;dirtyBits) {}
+  protected:
+    const gl::VertexArray::Data &amp;mData;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dBufferD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/BufferD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/BufferD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/BufferD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,8 +8,11 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/BufferD3D.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/mathutil.h&quot;
+#include &quot;common/utilities.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/IndexBuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/VertexBuffer.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -19,29 +22,62 @@
</span><span class="cx"> BufferD3D::BufferD3D(BufferFactoryD3D *factory)
</span><span class="cx">     : BufferImpl(),
</span><span class="cx">       mFactory(factory),
</span><del>-      mStaticVertexBuffer(nullptr),
</del><span class="cx">       mStaticIndexBuffer(nullptr),
</span><del>-      mUnmodifiedDataUse(0)
</del><ins>+      mStaticBufferCacheTotalSize(0),
+      mStaticVertexBufferOutOfDate(false),
+      mUnmodifiedDataUse(0),
+      mUsage(D3DBufferUsage::STATIC)
</ins><span class="cx"> {
</span><span class="cx">     updateSerial();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> BufferD3D::~BufferD3D()
</span><span class="cx"> {
</span><del>-    SafeDelete(mStaticVertexBuffer);
</del><span class="cx">     SafeDelete(mStaticIndexBuffer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void BufferD3D::emptyStaticBufferCache()
+{
+    mStaticVertexBuffers.clear();
+    mStaticBufferCacheTotalSize = 0;
+}
+
</ins><span class="cx"> void BufferD3D::updateSerial()
</span><span class="cx"> {
</span><span class="cx">     mSerial = mNextSerial++;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void BufferD3D::updateD3DBufferUsage(GLenum usage)
+{
+    switch (usage)
+    {
+        case GL_STATIC_DRAW:
+        case GL_STATIC_READ:
+        case GL_STATIC_COPY:
+            mUsage = D3DBufferUsage::STATIC;
+            initializeStaticData();
+            break;
+
+        case GL_STREAM_DRAW:
+        case GL_STREAM_READ:
+        case GL_STREAM_COPY:
+        case GL_DYNAMIC_READ:
+        case GL_DYNAMIC_COPY:
+        case GL_DYNAMIC_DRAW:
+            mUsage = D3DBufferUsage::DYNAMIC;
+            break;
+        default:
+            UNREACHABLE();
+    }
+}
+
</ins><span class="cx"> void BufferD3D::initializeStaticData()
</span><span class="cx"> {
</span><del>-    if (!mStaticVertexBuffer)
</del><ins>+    if (mStaticVertexBuffers.empty())
</ins><span class="cx">     {
</span><del>-        mStaticVertexBuffer = new StaticVertexBufferInterface(mFactory);
</del><ins>+        auto newStaticBuffer = new StaticVertexBufferInterface(mFactory);
+        mStaticVertexBuffers.push_back(
+            std::unique_ptr&lt;StaticVertexBufferInterface&gt;(newStaticBuffer));
</ins><span class="cx">     }
</span><span class="cx">     if (!mStaticIndexBuffer)
</span><span class="cx">     {
</span><span class="lines">@@ -49,14 +85,73 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+StaticIndexBufferInterface *BufferD3D::getStaticIndexBuffer()
+{
+    return mStaticIndexBuffer;
+}
+
+StaticVertexBufferInterface *BufferD3D::getStaticVertexBuffer(const gl::VertexAttribute &amp;attribute)
+{
+    if (mStaticVertexBuffers.empty())
+    {
+        // Early out if there aren't any static buffers at all
+        return nullptr;
+    }
+
+    // Early out, the attribute can be added to mStaticVertexBuffer.
+    if (mStaticVertexBuffers.size() == 1 &amp;&amp; mStaticVertexBuffers[0]-&gt;empty())
+    {
+        return mStaticVertexBuffers[0].get();
+    }
+
+    // Cache size limiting: track the total allocated buffer sizes.
+    size_t currentTotalSize = 0;
+
+    // At this point, see if any of the existing static buffers contains the attribute data
+    // If there is a cached static buffer that already contains the attribute, then return it
+    for (const auto &amp;staticBuffer : mStaticVertexBuffers)
+    {
+        if (staticBuffer-&gt;matchesAttribute(attribute))
+        {
+            return staticBuffer.get();
+        }
+
+        currentTotalSize += staticBuffer-&gt;getBufferSize();
+    }
+
+    // Cache size limiting: Clean-up threshold is four times the base buffer size, with a minimum.
+    ASSERT(IsUnsignedMultiplicationSafe(getSize(), static_cast&lt;size_t&gt;(4u)));
+    size_t sizeThreshold = std::max(getSize() * 4u, static_cast&lt;size_t&gt;(0x1000u));
+
+    // If we're past the threshold, clear the buffer cache. Note that this will release buffers
+    // that are currenly bound, and in an edge case can even translate the same attribute twice
+    // in the same draw call. It will not delete currently bound buffers, however, because they
+    // are ref counted.
+    if (currentTotalSize &gt; sizeThreshold)
+    {
+        emptyStaticBufferCache();
+    }
+
+    // At this point, we must create a new static buffer for the attribute data.
+    auto newStaticBuffer = new StaticVertexBufferInterface(mFactory);
+    newStaticBuffer-&gt;setAttribute(attribute);
+    mStaticVertexBuffers.push_back(std::unique_ptr&lt;StaticVertexBufferInterface&gt;(newStaticBuffer));
+    return newStaticBuffer;
+}
+
</ins><span class="cx"> void BufferD3D::invalidateStaticData()
</span><span class="cx"> {
</span><del>-    if ((mStaticVertexBuffer &amp;&amp; mStaticVertexBuffer-&gt;getBufferSize() != 0) || (mStaticIndexBuffer &amp;&amp; mStaticIndexBuffer-&gt;getBufferSize() != 0))
</del><ins>+    emptyStaticBufferCache();
+
+    if (mStaticIndexBuffer &amp;&amp; mStaticIndexBuffer-&gt;getBufferSize() != 0)
</ins><span class="cx">     {
</span><del>-        SafeDelete(mStaticVertexBuffer);
</del><span class="cx">         SafeDelete(mStaticIndexBuffer);
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-        // Re-init static data to track that we're in a static buffer
</del><ins>+    // If the buffer was created with a static usage then we recreate the static
+    // buffers so that they are populated the next time we use this buffer.
+    if (mUsage == D3DBufferUsage::STATIC)
+    {
</ins><span class="cx">         initializeStaticData();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -66,15 +161,32 @@
</span><span class="cx"> // Creates static buffers if sufficient used data has been left unmodified
</span><span class="cx"> void BufferD3D::promoteStaticUsage(int dataSize)
</span><span class="cx"> {
</span><del>-    if (!mStaticVertexBuffer &amp;&amp; !mStaticIndexBuffer)
</del><ins>+    if (mUsage == D3DBufferUsage::DYNAMIC)
</ins><span class="cx">     {
</span><span class="cx">         mUnmodifiedDataUse += dataSize;
</span><span class="cx"> 
</span><span class="cx">         if (mUnmodifiedDataUse &gt; 3 * getSize())
</span><span class="cx">         {
</span><del>-            initializeStaticData();
</del><ins>+            updateD3DBufferUsage(GL_STATIC_DRAW);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><span class="cx">\ No newline at end of file
</span><ins>+gl::Error BufferD3D::getIndexRange(GLenum type,
+                                   size_t offset,
+                                   size_t count,
+                                   bool primitiveRestartEnabled,
+                                   gl::IndexRange *outRange)
+{
+    const uint8_t *data = nullptr;
+    gl::Error error = getData(&amp;data);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    *outRange = gl::ComputeIndexRange(type, data + offset, count, primitiveRestartEnabled);
+    return gl::Error(GL_NO_ERROR);
+}
+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dBufferD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/BufferD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/BufferD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/BufferD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,10 +9,11 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_BUFFERD3D_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_BUFFERD3D_H_
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/angletypes.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/BufferImpl.h&quot;
</span><del>-#include &quot;libANGLE/angletypes.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &lt;stdint.h&gt;
</span><ins>+#include &lt;vector&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -20,6 +21,12 @@
</span><span class="cx"> class StaticIndexBufferInterface;
</span><span class="cx"> class StaticVertexBufferInterface;
</span><span class="cx"> 
</span><ins>+enum class D3DBufferUsage
+{
+    STATIC,
+    DYNAMIC,
+};
+
</ins><span class="cx"> class BufferD3D : public BufferImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="lines">@@ -30,25 +37,41 @@
</span><span class="cx"> 
</span><span class="cx">     virtual size_t getSize() const = 0;
</span><span class="cx">     virtual bool supportsDirectBinding() const = 0;
</span><del>-    virtual void markTransformFeedbackUsage() = 0;
</del><ins>+    virtual gl::Error markTransformFeedbackUsage() = 0;
+    virtual gl::Error getData(const uint8_t **outData) = 0;
</ins><span class="cx"> 
</span><del>-    StaticVertexBufferInterface *getStaticVertexBuffer() { return mStaticVertexBuffer; }
-    StaticIndexBufferInterface *getStaticIndexBuffer() { return mStaticIndexBuffer; }
</del><ins>+    StaticVertexBufferInterface *getStaticVertexBuffer(const gl::VertexAttribute &amp;attribute);
+    StaticIndexBufferInterface *getStaticIndexBuffer();
</ins><span class="cx"> 
</span><del>-    void initializeStaticData();
-    void invalidateStaticData();
</del><ins>+    virtual void initializeStaticData();
+    virtual void invalidateStaticData();
+
</ins><span class="cx">     void promoteStaticUsage(int dataSize);
</span><span class="cx"> 
</span><ins>+    gl::Error getIndexRange(GLenum type,
+                            size_t offset,
+                            size_t count,
+                            bool primitiveRestartEnabled,
+                            gl::IndexRange *outRange) override;
+
+    BufferFactoryD3D *getFactory() const { return mFactory; }
+    D3DBufferUsage getUsage() const { return mUsage; }
+
</ins><span class="cx">   protected:
</span><span class="cx">     void updateSerial();
</span><ins>+    void updateD3DBufferUsage(GLenum usage);
+    void emptyStaticBufferCache();
</ins><span class="cx"> 
</span><span class="cx">     BufferFactoryD3D *mFactory;
</span><span class="cx">     unsigned int mSerial;
</span><span class="cx">     static unsigned int mNextSerial;
</span><span class="cx"> 
</span><del>-    StaticVertexBufferInterface *mStaticVertexBuffer;
</del><ins>+    std::vector&lt;std::unique_ptr&lt;StaticVertexBufferInterface&gt;&gt; mStaticVertexBuffers;
</ins><span class="cx">     StaticIndexBufferInterface *mStaticIndexBuffer;
</span><ins>+    unsigned int mStaticBufferCacheTotalSize;
+    unsigned int mStaticVertexBufferOutOfDate;
</ins><span class="cx">     unsigned int mUnmodifiedDataUse;
</span><ins>+    D3DBufferUsage mUsage;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dCompilerD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/CompilerD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/CompilerD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/CompilerD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,122 +1,20 @@
</span><span class="cx"> //
</span><del>-// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
</del><ins>+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
</ins><span class="cx"> // Use of this source code is governed by a BSD-style license that can be
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><ins>+// CompilerD3D:
+//   Implementation of the D3D compiler methods.
+//
</ins><span class="cx"> 
</span><del>-// CompilerD3D.cpp: Implementation of the rx::CompilerD3D class.
-
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/CompilerD3D.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;libANGLE/Caps.h&quot;
-#include &quot;libANGLE/Data.h&quot;
-
-#include &quot;common/debug.h&quot;
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-// Global count of active shader compiler handles. Needed to know when to call ShInitialize and ShFinalize.
-static size_t activeCompilerHandles = 0;
-
-CompilerD3D::CompilerD3D(const gl::Data &amp;data, ShShaderOutput outputType)
-    : mSpec(data.clientVersion &gt; 2 ? SH_GLES3_SPEC : SH_GLES2_SPEC),
-      mOutputType(outputType),
-      mResources(),
-      mFragmentCompiler(NULL),
-      mVertexCompiler(NULL)
</del><ins>+CompilerD3D::CompilerD3D(ShShaderOutput translatorOutputType)
+    : mTranslatorOutputType(translatorOutputType)
</ins><span class="cx"> {
</span><del>-    ASSERT(data.clientVersion == 2 || data.clientVersion == 3);
-
-    const gl::Caps &amp;caps = *data.caps;
-    const gl::Extensions &amp;extensions = *data.extensions;
-
-    ShInitBuiltInResources(&amp;mResources);
-    mResources.MaxVertexAttribs = caps.maxVertexAttributes;
-    mResources.MaxVertexUniformVectors = caps.maxVertexUniformVectors;
-    mResources.MaxVaryingVectors = caps.maxVaryingVectors;
-    mResources.MaxVertexTextureImageUnits = caps.maxVertexTextureImageUnits;
-    mResources.MaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
-    mResources.MaxTextureImageUnits = caps.maxTextureImageUnits;
-    mResources.MaxFragmentUniformVectors = caps.maxFragmentUniformVectors;
-    mResources.MaxDrawBuffers = caps.maxDrawBuffers;
-    mResources.OES_standard_derivatives = extensions.standardDerivatives;
-    mResources.EXT_draw_buffers = extensions.drawBuffers;
-    mResources.EXT_shader_texture_lod = 1;
-    // resources.OES_EGL_image_external = mRenderer-&gt;getShareHandleSupport() ? 1 : 0; // TODO: commented out until the extension is actually supported.
-    mResources.FragmentPrecisionHigh = 1;   // Shader Model 2+ always supports FP24 (s16e7) which corresponds to highp
-    mResources.EXT_frag_depth = 1; // Shader Model 2+ always supports explicit depth output
-
-    // GLSL ES 3.0 constants
-    mResources.MaxVertexOutputVectors = caps.maxVertexOutputComponents / 4;
-    mResources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4;
-    mResources.MinProgramTexelOffset = caps.minProgramTexelOffset;
-    mResources.MaxProgramTexelOffset = caps.maxProgramTexelOffset;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-CompilerD3D::~CompilerD3D()
-{
-    release();
-}
-
-gl::Error CompilerD3D::release()
-{
-    if (mFragmentCompiler)
-    {
-        ShDestruct(mFragmentCompiler);
-        mFragmentCompiler = NULL;
-
-        ASSERT(activeCompilerHandles &gt; 0);
-        activeCompilerHandles--;
-    }
-
-    if (mVertexCompiler)
-    {
-        ShDestruct(mVertexCompiler);
-        mVertexCompiler = NULL;
-
-        ASSERT(activeCompilerHandles &gt; 0);
-        activeCompilerHandles--;
-    }
-
-    if (activeCompilerHandles == 0)
-    {
-        ShFinalize();
-    }
-
-    return gl::Error(GL_NO_ERROR);
-}
-
-ShHandle CompilerD3D::getCompilerHandle(GLenum type)
-{
-    ShHandle *compiler = NULL;
-    switch (type)
-    {
-      case GL_VERTEX_SHADER:
-        compiler = &amp;mVertexCompiler;
-        break;
-
-      case GL_FRAGMENT_SHADER:
-        compiler = &amp;mFragmentCompiler;
-        break;
-
-      default:
-        UNREACHABLE();
-        return NULL;
-    }
-
-    if (!(*compiler))
-    {
-        if (activeCompilerHandles == 0)
-        {
-            ShInitialize();
-        }
-
-        *compiler = ShConstructCompiler(type, mSpec, mOutputType, &amp;mResources);
-        activeCompilerHandles++;
-    }
-
-    return *compiler;
-}
-
-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dCompilerD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/CompilerD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/CompilerD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/CompilerD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,35 +10,22 @@
</span><span class="cx"> #define LIBANGLE_RENDERER_COMPILERD3D_H_
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/CompilerImpl.h&quot;
</span><del>-#include &quot;libANGLE/Caps.h&quot;
</del><ins>+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</ins><span class="cx"> 
</span><del>-#include &quot;GLSLANG/ShaderLang.h&quot;
-
-namespace gl
-{
-struct Data;
-}
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> class CompilerD3D : public CompilerImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    CompilerD3D(const gl::Data &amp;data, ShShaderOutput outputType);
-    virtual ~CompilerD3D();
</del><ins>+    CompilerD3D(ShShaderOutput translatorOutputType);
+    ~CompilerD3D() override {}
</ins><span class="cx"> 
</span><del>-    gl::Error release() override;
</del><ins>+    gl::Error release() override { return gl::Error(GL_NO_ERROR); }
+    ShShaderOutput getTranslatorOutputType() const override { return mTranslatorOutputType; }
</ins><span class="cx"> 
</span><del>-    ShHandle getCompilerHandle(GLenum type);
-
</del><span class="cx">   private:
</span><del>-    ShShaderSpec mSpec;
-    ShShaderOutput mOutputType;
-    ShBuiltInResources mResources;
-
-    ShHandle mFragmentCompiler;
-    ShHandle mVertexCompiler;
</del><ins>+    ShShaderOutput mTranslatorOutputType;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDeviceD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DeviceD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DeviceD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DeviceD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -17,35 +17,83 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-DeviceD3D::DeviceD3D(rx::RendererD3D *renderer)
-    : mRenderer(renderer)
</del><ins>+DeviceD3D::DeviceD3D()
+    : mDevice(0), mDeviceType(0), mDeviceExternallySourced(false), mIsInitialized(false)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error DeviceD3D::getDevice(EGLAttrib *value)
</del><ins>+DeviceD3D::~DeviceD3D()
</ins><span class="cx"> {
</span><del>-    *value = reinterpret_cast&lt;EGLAttrib&gt;(mRenderer-&gt;getD3DDevice());
-    if (*value == 0)
</del><ins>+#if defined(ANGLE_ENABLE_D3D11)
+    if (mDeviceType == EGL_D3D11_DEVICE_ANGLE)
</ins><span class="cx">     {
</span><ins>+        // DeviceD3D holds a ref to an externally-sourced D3D11 device. We must release it.
+        ID3D11Device *device = reinterpret_cast&lt;ID3D11Device *&gt;(mDevice);
+        device-&gt;Release();
+    }
+#endif
+}
+
+egl::Error DeviceD3D::getDevice(void **outValue)
+{
+    if (!mIsInitialized)
+    {
+        *outValue = nullptr;
</ins><span class="cx">         return egl::Error(EGL_BAD_DEVICE_EXT);
</span><span class="cx">     }
</span><ins>+
+    *outValue = mDevice;
</ins><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-EGLint DeviceD3D::getType()
</del><ins>+egl::Error DeviceD3D::initialize(void *device,
+                                 EGLint deviceType,
+                                 EGLBoolean deviceExternallySourced)
</ins><span class="cx"> {
</span><del>-    switch (mRenderer-&gt;getRendererClass())
</del><ins>+    ASSERT(!mIsInitialized);
+    if (mIsInitialized)
</ins><span class="cx">     {
</span><del>-      case RENDERER_D3D11:
-        return EGL_D3D11_DEVICE_ANGLE;
-      case RENDERER_D3D9:
-        return EGL_D3D9_DEVICE_ANGLE;
-      default:
-        UNREACHABLE();
-        return EGL_NONE;
</del><ins>+        return egl::Error(EGL_BAD_DEVICE_EXT);
</ins><span class="cx">     }
</span><ins>+
+    mDevice                  = device;
+    mDeviceType              = deviceType;
+    mDeviceExternallySourced = !!deviceExternallySourced;
+
+#if defined(ANGLE_ENABLE_D3D11)
+    if (mDeviceType == EGL_D3D11_DEVICE_ANGLE)
+    {
+        // Validate the device
+        IUnknown *iunknown = reinterpret_cast&lt;IUnknown *&gt;(device);
+
+        ID3D11Device *d3dDevice = nullptr;
+        HRESULT hr =
+            iunknown-&gt;QueryInterface(__uuidof(ID3D11Device), reinterpret_cast&lt;void **&gt;(&amp;d3dDevice));
+        if (FAILED(hr))
+        {
+            return egl::Error(EGL_BAD_ATTRIBUTE, &quot;Invalid D3D device passed into EGLDeviceEXT&quot;);
+        }
+
+        // The QI to ID3D11Device adds a ref to the D3D11 device.
+        // Deliberately don't release the ref here, so that the DeviceD3D holds a ref to the
+        // D3D11 device.
+    }
+    else
+#endif
+    {
+        ASSERT(!mDeviceExternallySourced);
+    }
+
+    mIsInitialized = true;
+
+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+EGLint DeviceD3D::getType()
+{
+    return mDeviceType;
+}
+
</ins><span class="cx"> void DeviceD3D::generateExtensions(egl::DeviceExtensions *outExtensions) const
</span><span class="cx"> {
</span><span class="cx">     outExtensions-&gt;deviceD3D = true;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDeviceD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DeviceD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DeviceD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DeviceD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,14 +18,20 @@
</span><span class="cx"> class DeviceD3D : public DeviceImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    DeviceD3D(RendererD3D *renderer);
</del><ins>+    DeviceD3D();
+    ~DeviceD3D() override;
</ins><span class="cx"> 
</span><del>-    egl::Error getDevice(EGLAttrib *value) override;
</del><ins>+    egl::Error initialize(void *device, EGLint deviceType, EGLBoolean external);
+    egl::Error getDevice(void **outValue) override;
</ins><span class="cx">     EGLint getType() override;
</span><span class="cx">     void generateExtensions(egl::DeviceExtensions *outExtensions) const override;
</span><ins>+    bool deviceExternallySourced() override { return mDeviceExternallySourced; }
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    RendererD3D *mRenderer;
</del><ins>+    void *mDevice;
+    EGLint mDeviceType;
+    bool mDeviceExternallySourced;
+    bool mIsInitialized;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDisplayD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DisplayD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DisplayD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DisplayD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,6 +13,7 @@
</span><span class="cx"> #include &quot;libANGLE/Display.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><span class="cx"> #include &quot;libANGLE/histogram_macros.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/EGLImageD3D.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/SurfaceD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/SwapChainD3D.h&quot;
</span><span class="lines">@@ -34,7 +35,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if !defined(ANGLE_DEFAULT_D3D11)
</span><span class="cx"> // Enables use of the Direct3D 11 API for a default display, when available
</span><del>-#   define ANGLE_DEFAULT_D3D11 0
</del><ins>+#   define ANGLE_DEFAULT_D3D11 1
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="lines">@@ -54,10 +55,13 @@
</span><span class="cx"> 
</span><span class="cx">     std::vector&lt;CreateRendererD3DFunction&gt; rendererCreationFunctions;
</span><span class="cx"> 
</span><del>-    const auto &amp;attribMap = display-&gt;getAttributeMap();
-    EGLNativeDisplayType nativeDisplay = display-&gt;getNativeDisplayId();
</del><ins>+    if (display-&gt;getPlatform() == EGL_PLATFORM_ANGLE_ANGLE)
+    {
+        const auto &amp;attribMap              = display-&gt;getAttributeMap();
+        EGLNativeDisplayType nativeDisplay = display-&gt;getNativeDisplayId();
</ins><span class="cx"> 
</span><del>-    EGLint requestedDisplayType = attribMap.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE);
</del><ins>+        EGLint requestedDisplayType = static_cast&lt;EGLint&gt;(
+            attribMap.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE));
</ins><span class="cx"> 
</span><span class="cx"> #   if defined(ANGLE_ENABLE_D3D11)
</span><span class="cx">         if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
</span><span class="lines">@@ -76,28 +80,42 @@
</span><span class="cx">         }
</span><span class="cx"> #   endif
</span><span class="cx"> 
</span><del>-    if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE &amp;&amp;
-        nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE &amp;&amp;
-        requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
-    {
</del><ins>+        if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE &amp;&amp;
+            nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE &amp;&amp;
+            requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
+        {
</ins><span class="cx">         // The default display is requested, try the D3D9 and D3D11 renderers, order them using
</span><span class="cx">         // the definition of ANGLE_DEFAULT_D3D11
</span><span class="cx"> #       if ANGLE_DEFAULT_D3D11
</span><span class="cx"> #           if defined(ANGLE_ENABLE_D3D11)
</span><del>-                rendererCreationFunctions.push_back(CreateTypedRendererD3D&lt;Renderer11&gt;);
</del><ins>+            rendererCreationFunctions.push_back(CreateTypedRendererD3D&lt;Renderer11&gt;);
</ins><span class="cx"> #           endif
</span><span class="cx"> #           if defined(ANGLE_ENABLE_D3D9)
</span><del>-                rendererCreationFunctions.push_back(CreateTypedRendererD3D&lt;Renderer9&gt;);
</del><ins>+            rendererCreationFunctions.push_back(CreateTypedRendererD3D&lt;Renderer9&gt;);
</ins><span class="cx"> #           endif
</span><span class="cx"> #       else
</span><span class="cx"> #           if defined(ANGLE_ENABLE_D3D9)
</span><del>-                rendererCreationFunctions.push_back(CreateTypedRendererD3D&lt;Renderer9&gt;);
</del><ins>+            rendererCreationFunctions.push_back(CreateTypedRendererD3D&lt;Renderer9&gt;);
</ins><span class="cx"> #           endif
</span><span class="cx"> #           if defined(ANGLE_ENABLE_D3D11)
</span><del>-                rendererCreationFunctions.push_back(CreateTypedRendererD3D&lt;Renderer11&gt;);
</del><ins>+            rendererCreationFunctions.push_back(CreateTypedRendererD3D&lt;Renderer11&gt;);
</ins><span class="cx"> #           endif
</span><span class="cx"> #       endif
</span><ins>+        }
</ins><span class="cx">     }
</span><ins>+    else if (display-&gt;getPlatform() == EGL_PLATFORM_DEVICE_EXT)
+    {
+#if defined(ANGLE_ENABLE_D3D11)
+        if (display-&gt;getDevice()-&gt;getType() == EGL_D3D11_DEVICE_ANGLE)
+        {
+            rendererCreationFunctions.push_back(CreateTypedRendererD3D&lt;Renderer11&gt;);
+        }
+#endif
+    }
+    else
+    {
+        UNIMPLEMENTED();
+    }
</ins><span class="cx"> 
</span><span class="cx">     egl::Error result(EGL_NOT_INITIALIZED, &quot;No available renderers.&quot;);
</span><span class="cx">     for (size_t i = 0; i &lt; rendererCreationFunctions.size(); i++)
</span><span class="lines">@@ -140,49 +158,23 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
-namespace
</del><ins>+DisplayD3D::DisplayD3D() : mRenderer(nullptr)
</ins><span class="cx"> {
</span><del>-
-LRESULT CALLBACK IntermediateWindowProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
-{
-    switch (message)
-    {
-      case WM_ERASEBKGND:
-        // Prevent windows from erasing the background.
-        return 1;
-      case WM_PAINT:
-        // Do not paint anything.
-        PAINTSTRUCT paint;
-        if (BeginPaint(window, &amp;paint))
-        {
-            EndPaint(window, &amp;paint);
-        }
-        return 0;
-    }
-
-    return DefWindowProc(window, message, wParam, lParam);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
-#endif
</del><span class="cx"> 
</span><del>-DisplayD3D::DisplayD3D()
-    : mDisplay(nullptr),
-      mRenderer(nullptr),
-      mChildWindowClass(0),
-      mDevice(nullptr)
</del><ins>+SurfaceImpl *DisplayD3D::createWindowSurface(const egl::Config *configuration,
+                                             EGLNativeWindowType window,
+                                             const egl::AttributeMap &amp;attribs)
</ins><span class="cx"> {
</span><del>-}
-
-egl::Error DisplayD3D::createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window,
-                                           const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface)
-{
</del><span class="cx">     ASSERT(mRenderer != nullptr);
</span><span class="cx"> 
</span><del>-    EGLint width = attribs.get(EGL_WIDTH, 0);
-    EGLint height = attribs.get(EGL_HEIGHT, 0);
-    EGLint fixedSize = attribs.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE);
</del><ins>+    EGLint width       = static_cast&lt;EGLint&gt;(attribs.get(EGL_WIDTH, 0));
+    EGLint height      = static_cast&lt;EGLint&gt;(attribs.get(EGL_HEIGHT, 0));
+    EGLint fixedSize   = static_cast&lt;EGLint&gt;(attribs.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE));
+    EGLint orientation = static_cast&lt;EGLint&gt;(attribs.get(EGL_SURFACE_ORIENTATION_ANGLE, 0));
+    EGLint directComposition =
+        static_cast&lt;EGLint&gt;(attribs.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE));
</ins><span class="cx"> 
</span><span class="cx">     if (!fixedSize)
</span><span class="cx">     {
</span><span class="lines">@@ -190,88 +182,66 @@
</span><span class="cx">         height = -1;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    SurfaceD3D *surface = SurfaceD3D::createFromWindow(mRenderer, mDisplay, configuration, window, fixedSize,
-                                                       width, height);
-    egl::Error error = surface-&gt;initialize();
-    if (error.isError())
-    {
-        SafeDelete(surface);
-        return error;
-    }
-
-    *outSurface = surface;
-    return egl::Error(EGL_SUCCESS);
</del><ins>+    return SurfaceD3D::createFromWindow(mRenderer, mDisplay, configuration, window, fixedSize,
+                                        directComposition, width, height, orientation);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error DisplayD3D::createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &amp;attribs,
-                                            SurfaceImpl **outSurface)
</del><ins>+SurfaceImpl *DisplayD3D::createPbufferSurface(const egl::Config *configuration,
+                                              const egl::AttributeMap &amp;attribs)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mRenderer != nullptr);
</span><span class="cx"> 
</span><del>-    EGLint width = attribs.get(EGL_WIDTH, 0);
-    EGLint height = attribs.get(EGL_HEIGHT, 0);
</del><ins>+    EGLint width  = static_cast&lt;EGLint&gt;(attribs.get(EGL_WIDTH, 0));
+    EGLint height = static_cast&lt;EGLint&gt;(attribs.get(EGL_HEIGHT, 0));
</ins><span class="cx"> 
</span><del>-    SurfaceD3D *surface = SurfaceD3D::createOffscreen(mRenderer, mDisplay, configuration, NULL, width, height);
-    egl::Error error = surface-&gt;initialize();
-    if (error.isError())
-    {
-        SafeDelete(surface);
-        return error;
-    }
-
-    *outSurface = surface;
-    return egl::Error(EGL_SUCCESS);
</del><ins>+    return SurfaceD3D::createOffscreen(mRenderer, mDisplay, configuration, nullptr, width, height);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error DisplayD3D::createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
-                                                     const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface)
</del><ins>+SurfaceImpl *DisplayD3D::createPbufferFromClientBuffer(const egl::Config *configuration,
+                                                       EGLClientBuffer shareHandle,
+                                                       const egl::AttributeMap &amp;attribs)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mRenderer != nullptr);
</span><span class="cx"> 
</span><del>-    EGLint width = attribs.get(EGL_WIDTH, 0);
-    EGLint height = attribs.get(EGL_HEIGHT, 0);
</del><ins>+    EGLint width  = static_cast&lt;EGLint&gt;(attribs.get(EGL_WIDTH, 0));
+    EGLint height = static_cast&lt;EGLint&gt;(attribs.get(EGL_HEIGHT, 0));
</ins><span class="cx"> 
</span><del>-    SurfaceD3D *surface = SurfaceD3D::createOffscreen(mRenderer, mDisplay, configuration, shareHandle,
-                                                      width, height);
-    egl::Error error = surface-&gt;initialize();
-    if (error.isError())
-    {
-        SafeDelete(surface);
-        return error;
-    }
-
-    *outSurface = surface;
-    return egl::Error(EGL_SUCCESS);
</del><ins>+    return SurfaceD3D::createOffscreen(
+        mRenderer, mDisplay, configuration, shareHandle, width, height);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error DisplayD3D::createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap,
-                                           const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface)
</del><ins>+SurfaceImpl *DisplayD3D::createPixmapSurface(const egl::Config *configuration,
+                                             NativePixmapType nativePixmap,
+                                             const egl::AttributeMap &amp;attribs)
</ins><span class="cx"> {
</span><del>-    ASSERT(mRenderer != nullptr);
-
</del><span class="cx">     UNIMPLEMENTED();
</span><del>-    *outSurface = nullptr;
-    return egl::Error(EGL_BAD_DISPLAY);
</del><ins>+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ImageImpl *DisplayD3D::createImage(EGLenum target,
+                                   egl::ImageSibling *buffer,
+                                   const egl::AttributeMap &amp;attribs)
+{
+    return new EGLImageD3D(mRenderer, target, buffer, attribs);
+}
+
</ins><span class="cx"> egl::Error DisplayD3D::getDevice(DeviceImpl **device)
</span><span class="cx"> {
</span><del>-    *device = reinterpret_cast&lt;DeviceImpl*&gt;(mDevice);
-    ASSERT(*device != nullptr);
-    return egl::Error(EGL_SUCCESS);
</del><ins>+    return mRenderer-&gt;getEGLDevice(device);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error DisplayD3D::createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &amp;attribs,
-                                     gl::Context **outContext)
</del><ins>+gl::Context *DisplayD3D::createContext(const egl::Config *config,
+                                       const gl::Context *shareContext,
+                                       const egl::AttributeMap &amp;attribs)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mRenderer != nullptr);
</span><ins>+    return new gl::Context(config, shareContext, mRenderer, attribs);
+}
</ins><span class="cx"> 
</span><del>-    EGLint clientVersion = attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1);
-    bool notifyResets = (attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION_EXT) == EGL_LOSE_CONTEXT_ON_RESET_EXT);
-    bool robustAccess = (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE);
-
-    *outContext = new gl::Context(config, clientVersion, shareContext, mRenderer, notifyResets, robustAccess);
-    return egl::Error(EGL_SUCCESS);
</del><ins>+StreamImpl *DisplayD3D::createStream(const egl::AttributeMap &amp;attribs)
+{
+    ASSERT(mRenderer != nullptr);
+    return mRenderer-&gt;createStream(attribs);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> egl::Error DisplayD3D::makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context)
</span><span class="lines">@@ -289,49 +259,12 @@
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(mDevice == nullptr);
-    mDevice = new DeviceD3D(mRenderer);
-
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
-    // Work around compile error from not defining &quot;UNICODE&quot; while Chromium does
-    const LPSTR idcArrow = MAKEINTRESOURCEA(32512);
-
-    std::string className = FormatString(&quot;ANGLE DisplayD3D 0x%0.8p Child Window Class&quot;, mDisplay);
-
-    WNDCLASSA childWindowClassDesc = { 0 };
-    childWindowClassDesc.style = CS_OWNDC;
-    childWindowClassDesc.lpfnWndProc = IntermediateWindowProc;
-    childWindowClassDesc.cbClsExtra = 0;
-    childWindowClassDesc.cbWndExtra = 0;
-    childWindowClassDesc.hInstance = GetModuleHandle(nullptr);
-    childWindowClassDesc.hIcon = nullptr;
-    childWindowClassDesc.hCursor = LoadCursorA(nullptr, idcArrow);
-    childWindowClassDesc.hbrBackground = 0;
-    childWindowClassDesc.lpszMenuName = nullptr;
-    childWindowClassDesc.lpszClassName = className.c_str();
-
-    mChildWindowClass = RegisterClassA(&amp;childWindowClassDesc);
-    if (!mChildWindowClass)
-    {
-        return egl::Error(EGL_NOT_INITIALIZED, &quot;Failed to register child window class.&quot;);
-    }
-#endif
-
</del><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DisplayD3D::terminate()
</span><span class="cx"> {
</span><del>-    SafeDelete(mDevice);
</del><span class="cx">     SafeDelete(mRenderer);
</span><del>-
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
-    if (mChildWindowClass != 0)
-    {
-        UnregisterClassA(reinterpret_cast&lt;const char*&gt;(mChildWindowClass), NULL);
-        mChildWindowClass = 0;
-    }
-#endif
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> egl::ConfigSet DisplayD3D::generateConfigs() const
</span><span class="lines">@@ -392,26 +325,7 @@
</span><span class="cx"> 
</span><span class="cx"> void DisplayD3D::generateExtensions(egl::DisplayExtensions *outExtensions) const
</span><span class="cx"> {
</span><del>-    outExtensions-&gt;createContextRobustness = true;
-
-    // ANGLE-specific extensions
-    if (mRenderer-&gt;getShareHandleSupport())
-    {
-        outExtensions-&gt;d3dShareHandleClientBuffer = true;
-        outExtensions-&gt;surfaceD3DTexture2DShareHandle = true;
-    }
-
-    outExtensions-&gt;querySurfacePointer = true;
-    outExtensions-&gt;windowFixedSize = true;
-
-    if (mRenderer-&gt;getPostSubBufferSupport())
-    {
-        outExtensions-&gt;postSubBuffer = true;
-    }
-
-    outExtensions-&gt;createContext = true;
-
-    outExtensions-&gt;deviceQuery = true;
</del><ins>+    mRenderer-&gt;generateDisplayExtensions(outExtensions);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> std::string DisplayD3D::getVendorString() const
</span><span class="lines">@@ -433,9 +347,17 @@
</span><span class="cx">     outCaps-&gt;textureNPOT = mRenderer-&gt;getRendererExtensions().textureNPOT;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ATOM DisplayD3D::getChildWindowClass() const
</del><ins>+egl::Error DisplayD3D::waitClient() const
</ins><span class="cx"> {
</span><del>-    return mChildWindowClass;
</del><ins>+    // Unimplemented as it is a noop on D3D
+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+egl::Error DisplayD3D::waitNative(EGLint engine,
+                                  egl::Surface *drawSurface,
+                                  egl::Surface *readSurface) const
+{
+    // Unimplemented as it is a noop on D3D
+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><ins>+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDisplayD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DisplayD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DisplayD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DisplayD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -24,18 +24,29 @@
</span><span class="cx">     egl::Error initialize(egl::Display *display) override;
</span><span class="cx">     virtual void terminate() override;
</span><span class="cx"> 
</span><del>-    egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &amp;attribs,
-                                   SurfaceImpl **outSurface) override;
-    egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &amp;attribs,
-                                    SurfaceImpl **outSurface) override;
-    egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
-                                             const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface) override;
-    egl::Error createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap,
-                                   const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface) override;
</del><ins>+    // Surface creation
+    SurfaceImpl *createWindowSurface(const egl::Config *configuration,
+                                     EGLNativeWindowType window,
+                                     const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
+                                      const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
+                                               EGLClientBuffer shareHandle,
+                                               const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
+                                     NativePixmapType nativePixmap,
+                                     const egl::AttributeMap &amp;attribs) override;
</ins><span class="cx"> 
</span><del>-    egl::Error createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &amp;attribs,
-                             gl::Context **outContext) override;
</del><ins>+    ImageImpl *createImage(EGLenum target,
+                           egl::ImageSibling *buffer,
+                           const egl::AttributeMap &amp;attribs) override;
</ins><span class="cx"> 
</span><ins>+    gl::Context *createContext(const egl::Config *config,
+                               const gl::Context *shareContext,
+                               const egl::AttributeMap &amp;attribs) override;
+
+    StreamImpl *createStream(const egl::AttributeMap &amp;attribs) override;
+
</ins><span class="cx">     egl::Error makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context) override;
</span><span class="cx"> 
</span><span class="cx">     egl::ConfigSet generateConfigs() const override;
</span><span class="lines">@@ -50,7 +61,10 @@
</span><span class="cx"> 
</span><span class="cx">     std::string getVendorString() const override;
</span><span class="cx"> 
</span><del>-    ATOM getChildWindowClass() const;
</del><ins>+    egl::Error waitClient() const override;
+    egl::Error waitNative(EGLint engine,
+                          egl::Surface *drawSurface,
+                          egl::Surface *readSurface) const override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
</span><span class="lines">@@ -59,9 +73,6 @@
</span><span class="cx">     egl::Display *mDisplay;
</span><span class="cx"> 
</span><span class="cx">     rx::RendererD3D *mRenderer;
</span><del>-    ATOM mChildWindowClass;
-
-    DeviceImpl *mDevice;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDynamicHLSLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DynamicHLSL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DynamicHLSL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DynamicHLSL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,15 +10,14 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/utilities.h&quot;
</span><span class="cx"> #include &quot;compiler/translator/blocklayoutHLSL.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/ShaderD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</del><span class="cx"> #include &quot;libANGLE/Program.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Shader.h&quot;
</span><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/ShaderD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/VaryingPacking.h&quot;
</ins><span class="cx"> 
</span><del>-// For use with ArrayString, see angleutils.h
-static_assert(GL_INVALID_INDEX == UINT_MAX, &quot;GL_INVALID_INDEX must be equal to the max unsigned int.&quot;);
-
</del><span class="cx"> using namespace gl;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="lines">@@ -31,12 +30,17 @@
</span><span class="cx"> {
</span><span class="cx">     switch (componentType)
</span><span class="cx">     {
</span><del>-      case GL_UNSIGNED_INT:         return &quot;uint&quot;;
-      case GL_INT:                  return &quot;int&quot;;
-      case GL_UNSIGNED_NORMALIZED:
-      case GL_SIGNED_NORMALIZED:
-      case GL_FLOAT:                return &quot;float&quot;;
-      default: UNREACHABLE();       return &quot;not-component-type&quot;;
</del><ins>+        case GL_UNSIGNED_INT:
+            return &quot;uint&quot;;
+        case GL_INT:
+            return &quot;int&quot;;
+        case GL_UNSIGNED_NORMALIZED:
+        case GL_SIGNED_NORMALIZED:
+        case GL_FLOAT:
+            return &quot;float&quot;;
+        default:
+            UNREACHABLE();
+            return &quot;not-component-type&quot;;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -49,16 +53,27 @@
</span><span class="cx"> {
</span><span class="cx">     switch (type)
</span><span class="cx">     {
</span><del>-      case GL_FLOAT_MAT2:     return &quot;float2x2&quot;;
-      case GL_FLOAT_MAT3:     return &quot;float3x3&quot;;
-      case GL_FLOAT_MAT4:     return &quot;float4x4&quot;;
-      case GL_FLOAT_MAT2x3:   return &quot;float2x3&quot;;
-      case GL_FLOAT_MAT3x2:   return &quot;float3x2&quot;;
-      case GL_FLOAT_MAT2x4:   return &quot;float2x4&quot;;
-      case GL_FLOAT_MAT4x2:   return &quot;float4x2&quot;;
-      case GL_FLOAT_MAT3x4:   return &quot;float3x4&quot;;
-      case GL_FLOAT_MAT4x3:   return &quot;float4x3&quot;;
-      default: UNREACHABLE(); return &quot;not-matrix-type&quot;;
</del><ins>+        case GL_FLOAT_MAT2:
+            return &quot;float2x2&quot;;
+        case GL_FLOAT_MAT3:
+            return &quot;float3x3&quot;;
+        case GL_FLOAT_MAT4:
+            return &quot;float4x4&quot;;
+        case GL_FLOAT_MAT2x3:
+            return &quot;float2x3&quot;;
+        case GL_FLOAT_MAT3x2:
+            return &quot;float3x2&quot;;
+        case GL_FLOAT_MAT2x4:
+            return &quot;float2x4&quot;;
+        case GL_FLOAT_MAT4x2:
+            return &quot;float4x2&quot;;
+        case GL_FLOAT_MAT3x4:
+            return &quot;float3x4&quot;;
+        case GL_FLOAT_MAT4x3:
+            return &quot;float4x3&quot;;
+        default:
+            UNREACHABLE();
+            return &quot;not-matrix-type&quot;;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -69,11 +84,13 @@
</span><span class="cx">         return HLSLMatrixTypeString(type);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return HLSLComponentTypeString(gl::VariableComponentType(type), gl::VariableComponentCount(type));
</del><ins>+    return HLSLComponentTypeString(gl::VariableComponentType(type),
+                                   gl::VariableComponentCount(type));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const PixelShaderOutputVariable *FindOutputAtLocation(const std::vector&lt;PixelShaderOutputVariable&gt; &amp;outputVariables,
-                                                        unsigned int location)
</del><ins>+const PixelShaderOutputVariable *FindOutputAtLocation(
+    const std::vector&lt;PixelShaderOutputVariable&gt; &amp;outputVariables,
+    unsigned int location)
</ins><span class="cx"> {
</span><span class="cx">     for (size_t variableIndex = 0; variableIndex &lt; outputVariables.size(); ++variableIndex)
</span><span class="cx">     {
</span><span class="lines">@@ -83,314 +100,102 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return NULL;
</del><ins>+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const std::string VERTEX_ATTRIBUTE_STUB_STRING = &quot;@@ VERTEX ATTRIBUTES @@&quot;;
-const std::string PIXEL_OUTPUT_STUB_STRING = &quot;@@ PIXEL OUTPUT @@&quot;;
-
-}
-
-DynamicHLSL::DynamicHLSL(RendererD3D *const renderer)
-    : mRenderer(renderer)
</del><ins>+void WriteArrayString(std::stringstream &amp;strstr, unsigned int i)
</ins><span class="cx"> {
</span><del>-}
-
-static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, VaryingPacking packing)
-{
-    // Make sure we use transposed matrix types to count registers correctly.
-    int registers = 0;
-    int elements = 0;
-
-    if (varying-&gt;isStruct())
</del><ins>+    static_assert(GL_INVALID_INDEX == UINT_MAX,
+                  &quot;GL_INVALID_INDEX must be equal to the max unsigned int.&quot;);
+    if (i == UINT_MAX)
</ins><span class="cx">     {
</span><del>-        registers = HLSLVariableRegisterCount(*varying, true) * varying-&gt;elementCount();
-        elements = 4;
</del><ins>+        return;
</ins><span class="cx">     }
</span><del>-    else
-    {
-        GLenum transposedType = TransposeMatrixType(varying-&gt;type);
-        registers = VariableRowCount(transposedType) * varying-&gt;elementCount();
-        elements = VariableColumnCount(transposedType);
-    }
</del><span class="cx"> 
</span><del>-    if (elements &gt;= 2 &amp;&amp; elements &lt;= 4)
-    {
-        for (int r = 0; r &lt;= maxVaryingVectors - registers; r++)
-        {
-            bool available = true;
</del><ins>+    strstr &lt;&lt; &quot;[&quot;;
+    strstr &lt;&lt; i;
+    strstr &lt;&lt; &quot;]&quot;;
+}
</ins><span class="cx"> 
</span><del>-            for (int y = 0; y &lt; registers &amp;&amp; available; y++)
-            {
-                for (int x = 0; x &lt; elements &amp;&amp; available; x++)
-                {
-                    if (packing[r + y][x])
-                    {
-                        available = false;
-                    }
-                }
-            }
</del><ins>+const std::string VERTEX_ATTRIBUTE_STUB_STRING = &quot;@@ VERTEX ATTRIBUTES @@&quot;;
+const std::string PIXEL_OUTPUT_STUB_STRING     = &quot;@@ PIXEL OUTPUT @@&quot;;
+}  // anonymous namespace
</ins><span class="cx"> 
</span><del>-            if (available)
-            {
-                varying-&gt;registerIndex = r;
-                varying-&gt;columnIndex = 0;
</del><ins>+std::string GetVaryingSemantic(int majorShaderModel, bool programUsesPointSize)
+{
+    // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
+    // In D3D11 we manually compute gl_PointCoord in the GS.
+    return ((programUsesPointSize &amp;&amp; majorShaderModel &lt; 4) ? &quot;COLOR&quot; : &quot;TEXCOORD&quot;);
+}
</ins><span class="cx"> 
</span><del>-                for (int y = 0; y &lt; registers; y++)
-                {
-                    for (int x = 0; x &lt; elements; x++)
-                    {
-                        packing[r + y][x] = &amp;*varying;
-                    }
-                }
</del><ins>+// DynamicHLSL implementation
</ins><span class="cx"> 
</span><del>-                return true;
-            }
-        }
-
-        if (elements == 2)
-        {
-            for (int r = maxVaryingVectors - registers; r &gt;= 0; r--)
-            {
-                bool available = true;
-
-                for (int y = 0; y &lt; registers &amp;&amp; available; y++)
-                {
-                    for (int x = 2; x &lt; 4 &amp;&amp; available; x++)
-                    {
-                        if (packing[r + y][x])
-                        {
-                            available = false;
-                        }
-                    }
-                }
-
-                if (available)
-                {
-                    varying-&gt;registerIndex = r;
-                    varying-&gt;columnIndex = 2;
-
-                    for (int y = 0; y &lt; registers; y++)
-                    {
-                        for (int x = 2; x &lt; 4; x++)
-                        {
-                            packing[r + y][x] = &amp;*varying;
-                        }
-                    }
-
-                    return true;
-                }
-            }
-        }
-    }
-    else if (elements == 1)
-    {
-        int space[4] = { 0 };
-
-        for (int y = 0; y &lt; maxVaryingVectors; y++)
-        {
-            for (int x = 0; x &lt; 4; x++)
-            {
-                space[x] += packing[y][x] ? 0 : 1;
-            }
-        }
-
-        int column = 0;
-
-        for (int x = 0; x &lt; 4; x++)
-        {
-            if (space[x] &gt;= registers &amp;&amp; (space[column] &lt; registers || space[x] &lt; space[column]))
-            {
-                column = x;
-            }
-        }
-
-        if (space[column] &gt;= registers)
-        {
-            for (int r = 0; r &lt; maxVaryingVectors; r++)
-            {
-                if (!packing[r][column])
-                {
-                    varying-&gt;registerIndex = r;
-                    varying-&gt;columnIndex = column;
-
-                    for (int y = r; y &lt; r + registers; y++)
-                    {
-                        packing[y][column] = &amp;*varying;
-                    }
-
-                    break;
-                }
-            }
-
-            return true;
-        }
-    }
-    else UNREACHABLE();
-
-    return false;
</del><ins>+DynamicHLSL::DynamicHLSL(RendererD3D *const renderer) : mRenderer(renderer)
+{
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-// Packs varyings into generic varying registers, using the algorithm from [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111
-// Returns the number of used varying registers, or -1 if unsuccesful
-int DynamicHLSL::packVaryings(InfoLog &amp;infoLog, VaryingPacking packing, ShaderD3D *fragmentShader,
-                              ShaderD3D *vertexShader, const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings)
</del><ins>+void DynamicHLSL::generateVaryingHLSL(const VaryingPacking &amp;varyingPacking,
+                                      std::stringstream &amp;hlslStream) const
</ins><span class="cx"> {
</span><del>-    // TODO (geofflang):  Use context's caps
-    const int maxVaryingVectors = mRenderer-&gt;getRendererCaps().maxVaryingVectors;
</del><ins>+    std::string varyingSemantic =
+        GetVaryingSemantic(mRenderer-&gt;getMajorShaderModel(), varyingPacking.usesPointSize());
</ins><span class="cx"> 
</span><del>-    vertexShader-&gt;resetVaryingsRegisterAssignment();
-    fragmentShader-&gt;resetVaryingsRegisterAssignment();
-
-    std::set&lt;std::string&gt; packedVaryings;
-
-    std::vector&lt;gl::PackedVarying&gt; &amp;fragmentVaryings = fragmentShader-&gt;getVaryings();
-    std::vector&lt;gl::PackedVarying&gt; &amp;vertexVaryings = vertexShader-&gt;getVaryings();
-    for (unsigned int varyingIndex = 0; varyingIndex &lt; fragmentVaryings.size(); varyingIndex++)
</del><ins>+    for (const PackedVaryingRegister &amp;registerInfo : varyingPacking.getRegisterList())
</ins><span class="cx">     {
</span><del>-        PackedVarying *varying = &amp;fragmentVaryings[varyingIndex];
</del><ins>+        const auto &amp;varying = *registerInfo.packedVarying-&gt;varying;
+        ASSERT(!varying.isStruct());
</ins><span class="cx"> 
</span><del>-        // Do not assign registers to built-in or unreferenced varyings
-        if (varying-&gt;isBuiltIn() || !varying-&gt;staticUse)
-        {
-            continue;
-        }
</del><ins>+        // TODO: Add checks to ensure D3D interpolation modifiers don't result in too many
+        // registers being used.
+        // For example, if there are N registers, and we have N vec3 varyings and 1 float
+        // varying, then D3D will pack them into N registers.
+        // If the float varying has the 'nointerpolation' modifier on it then we would need
+        // N + 1 registers, and D3D compilation will fail.
</ins><span class="cx"> 
</span><del>-        if (packVarying(varying, maxVaryingVectors, packing))
</del><ins>+        switch (registerInfo.packedVarying-&gt;interpolation)
</ins><span class="cx">         {
</span><del>-            packedVaryings.insert(varying-&gt;name);
</del><ins>+            case sh::INTERPOLATION_SMOOTH:
+                hlslStream &lt;&lt; &quot;    &quot;;
+                break;
+            case sh::INTERPOLATION_FLAT:
+                hlslStream &lt;&lt; &quot;    nointerpolation &quot;;
+                break;
+            case sh::INTERPOLATION_CENTROID:
+                hlslStream &lt;&lt; &quot;    centroid &quot;;
+                break;
+            default:
+                UNREACHABLE();
</ins><span class="cx">         }
</span><del>-        else
-        {
-            infoLog.append(&quot;Could not pack varying %s&quot;, varying-&gt;name.c_str());
-            return -1;
-        }
-    }
</del><span class="cx"> 
</span><del>-    for (unsigned int feedbackVaryingIndex = 0; feedbackVaryingIndex &lt; transformFeedbackVaryings.size(); feedbackVaryingIndex++)
-    {
-        const std::string &amp;transformFeedbackVarying = transformFeedbackVaryings[feedbackVaryingIndex];
-
-        if (transformFeedbackVarying == &quot;gl_Position&quot; || transformFeedbackVarying == &quot;gl_PointSize&quot;)
-        {
-            // do not pack builtin XFB varyings
-            continue;
-        }
-
-        if (packedVaryings.find(transformFeedbackVarying) == packedVaryings.end())
-        {
-            bool found = false;
-            for (unsigned int varyingIndex = 0; varyingIndex &lt; vertexVaryings.size(); varyingIndex++)
-            {
-                PackedVarying *varying = &amp;vertexVaryings[varyingIndex];
-                if (transformFeedbackVarying == varying-&gt;name)
-                {
-                    if (!packVarying(varying, maxVaryingVectors, packing))
-                    {
-                        infoLog.append(&quot;Could not pack varying %s&quot;, varying-&gt;name.c_str());
-                        return -1;
-                    }
-
-                    found = true;
-                    break;
-                }
-            }
-
-            if (!found)
-            {
-                infoLog.append(&quot;Transform feedback varying %s does not exist in the vertex shader.&quot;, transformFeedbackVarying.c_str());
-                return -1;
-            }
-        }
</del><ins>+        GLenum transposedType = gl::TransposeMatrixType(varying.type);
+        GLenum componentType  = gl::VariableComponentType(transposedType);
+        int columnCount = gl::VariableColumnCount(transposedType);
+        hlslStream &lt;&lt; HLSLComponentTypeString(componentType, columnCount);
+        unsigned int semanticIndex = registerInfo.semanticIndex;
+        hlslStream &lt;&lt; &quot; v&quot; &lt;&lt; semanticIndex &lt;&lt; &quot; : &quot; &lt;&lt; varyingSemantic &lt;&lt; semanticIndex &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx">     }
</span><del>-
-    // Return the number of used registers
-    int registers = 0;
-
-    for (int r = 0; r &lt; maxVaryingVectors; r++)
-    {
-        if (packing[r][0] || packing[r][1] || packing[r][2] || packing[r][3])
-        {
-            registers++;
-        }
-    }
-
-    return registers;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::string DynamicHLSL::generateVaryingHLSL(const ShaderD3D *shader) const
</del><ins>+std::string DynamicHLSL::generateVertexShaderForInputLayout(
+    const std::string &amp;sourceShader,
+    const InputLayout &amp;inputLayout,
+    const std::vector&lt;sh::Attribute&gt; &amp;shaderAttributes) const
</ins><span class="cx"> {
</span><del>-    std::string varyingSemantic = getVaryingSemantic(shader-&gt;mUsesPointSize);
-    std::string varyingHLSL;
</del><ins>+    std::stringstream structStream;
+    std::stringstream initStream;
</ins><span class="cx"> 
</span><del>-    const std::vector&lt;gl::PackedVarying&gt; &amp;varyings = shader-&gt;getVaryings();
</del><ins>+    structStream &lt;&lt; &quot;struct VS_INPUT\n&quot;
+                 &lt;&lt; &quot;{\n&quot;;
</ins><span class="cx"> 
</span><del>-    for (unsigned int varyingIndex = 0; varyingIndex &lt; varyings.size(); varyingIndex++)
-    {
-        const PackedVarying &amp;varying = varyings[varyingIndex];
-        if (varying.registerAssigned())
-        {
-            ASSERT(!varying.isBuiltIn());
-            GLenum transposedType = TransposeMatrixType(varying.type);
-            int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType));
-
-            for (unsigned int elementIndex = 0; elementIndex &lt; varying.elementCount(); elementIndex++)
-            {
-                for (int row = 0; row &lt; variableRows; row++)
-                {
-                    // TODO: Add checks to ensure D3D interpolation modifiers don't result in too many registers being used.
-                    // For example, if there are N registers, and we have N vec3 varyings and 1 float varying, then D3D will pack them into N registers.
-                    // If the float varying has the 'nointerpolation' modifier on it then we would need N + 1 registers, and D3D compilation will fail.
-
-                    switch (varying.interpolation)
-                    {
-                      case sh::INTERPOLATION_SMOOTH:   varyingHLSL += &quot;    &quot;;                 break;
-                      case sh::INTERPOLATION_FLAT:     varyingHLSL += &quot;    nointerpolation &quot;; break;
-                      case sh::INTERPOLATION_CENTROID: varyingHLSL += &quot;    centroid &quot;;        break;
-                      default:  UNREACHABLE();
-                    }
-
-                    unsigned int semanticIndex = elementIndex * variableRows +
-                                                 varying.columnIndex * mRenderer-&gt;getRendererCaps().maxVaryingVectors +
-                                                 varying.registerIndex + row;
-                    std::string n = Str(semanticIndex);
-
-                    std::string typeString;
-
-                    if (varying.isStruct())
-                    {
-                        // TODO(jmadill): pass back translated name from the shader translator
-                        typeString = decorateVariable(varying.structName);
-                    }
-                    else
-                    {
-                        GLenum componentType = VariableComponentType(transposedType);
-                        int columnCount = VariableColumnCount(transposedType);
-                        typeString = HLSLComponentTypeString(componentType, columnCount);
-                    }
-                    varyingHLSL += typeString + &quot; v&quot; + n + &quot; : &quot; + varyingSemantic + n + &quot;;\n&quot;;
-                }
-            }
-        }
-    }
-
-    return varyingHLSL;
-}
-
-std::string DynamicHLSL::generateVertexShaderForInputLayout(const std::string &amp;sourceShader,
-                                                            const VertexFormat inputLayout[],
-                                                            const std::vector&lt;sh::Attribute&gt; &amp;shaderAttributes) const
-{
-    std::string structHLSL, initHLSL;
-
-    int semanticIndex = 0;
</del><ins>+    int semanticIndex       = 0;
</ins><span class="cx">     unsigned int inputIndex = 0;
</span><span class="cx"> 
</span><span class="cx">     // If gl_PointSize is used in the shader then pointsprites rendering is expected.
</span><span class="cx">     // If the renderer does not support Geometry shaders then Instanced PointSprite emulation
</span><span class="cx">     // must be used.
</span><span class="cx">     bool usesPointSize = sourceShader.find(&quot;GL_USES_POINT_SIZE&quot;) != std::string::npos;
</span><del>-    bool useInstancedPointSpriteEmulation = usesPointSize &amp;&amp; mRenderer-&gt;getWorkarounds().useInstancedPointSpriteEmulation;
</del><ins>+    bool useInstancedPointSpriteEmulation =
+        usesPointSize &amp;&amp; mRenderer-&gt;getWorkarounds().useInstancedPointSpriteEmulation;
</ins><span class="cx"> 
</span><span class="cx">     // Instanced PointSprite emulation requires additional entries in the
</span><span class="cx">     // VS_INPUT structure to support the vertices that make up the quad vertices.
</span><span class="lines">@@ -402,8 +207,8 @@
</span><span class="cx">     // before per instance data in the shader.
</span><span class="cx">     if (useInstancedPointSpriteEmulation)
</span><span class="cx">     {
</span><del>-        structHLSL += &quot;    float3 spriteVertexPos : SPRITEPOSITION0;\n&quot;;
-        structHLSL += &quot;    float2 spriteTexCoord : SPRITETEXCOORD0;\n&quot;;
</del><ins>+        structStream &lt;&lt; &quot;    float3 spriteVertexPos : SPRITEPOSITION0;\n&quot;
+                     &lt;&lt; &quot;    float2 spriteTexCoord : SPRITETEXCOORD0;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (size_t attributeIndex = 0; attributeIndex &lt; shaderAttributes.size(); ++attributeIndex)
</span><span class="lines">@@ -412,93 +217,105 @@
</span><span class="cx">         if (!shaderAttribute.name.empty())
</span><span class="cx">         {
</span><span class="cx">             ASSERT(inputIndex &lt; MAX_VERTEX_ATTRIBS);
</span><del>-            const VertexFormat &amp;vertexFormat = inputLayout[inputIndex];
</del><ins>+            VertexFormatType vertexFormatType =
+                inputIndex &lt; inputLayout.size() ? inputLayout[inputIndex] : VERTEX_FORMAT_INVALID;
</ins><span class="cx"> 
</span><span class="cx">             // HLSL code for input structure
</span><span class="cx">             if (IsMatrixType(shaderAttribute.type))
</span><span class="cx">             {
</span><span class="cx">                 // Matrix types are always transposed
</span><del>-                structHLSL += &quot;    &quot; + HLSLMatrixTypeString(TransposeMatrixType(shaderAttribute.type));
</del><ins>+                structStream &lt;&lt; &quot;    &quot;
+                             &lt;&lt; HLSLMatrixTypeString(TransposeMatrixType(shaderAttribute.type));
</ins><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><del>-                GLenum componentType = mRenderer-&gt;getVertexComponentType(vertexFormat);
</del><ins>+                GLenum componentType = mRenderer-&gt;getVertexComponentType(vertexFormatType);
</ins><span class="cx"> 
</span><del>-                if (shaderAttribute.name == &quot;gl_InstanceID&quot;)
</del><ins>+                if (shaderAttribute.name == &quot;gl_InstanceID&quot; ||
+                    shaderAttribute.name == &quot;gl_VertexID&quot;)
</ins><span class="cx">                 {
</span><del>-                    // The input type of the instance ID in HLSL (uint) differs from the one in ESSL (int).
-                    structHLSL += &quot; uint&quot;;
</del><ins>+                    // The input types of the instance ID and vertex ID in HLSL (uint) differs from
+                    // the ones in ESSL (int).
+                    structStream &lt;&lt; &quot; uint&quot;;
</ins><span class="cx">                 }
</span><span class="cx">                 else
</span><span class="cx">                 {
</span><del>-                    structHLSL += &quot;    &quot; + HLSLComponentTypeString(componentType, VariableComponentCount(shaderAttribute.type));
</del><ins>+                    structStream &lt;&lt; &quot;    &quot; &lt;&lt; HLSLComponentTypeString(
+                                                  componentType,
+                                                  VariableComponentCount(shaderAttribute.type));
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            structHLSL += &quot; &quot; + decorateVariable(shaderAttribute.name) + &quot; : &quot;;
</del><ins>+            structStream &lt;&lt; &quot; &quot; &lt;&lt; decorateVariable(shaderAttribute.name) &lt;&lt; &quot; : &quot;;
</ins><span class="cx"> 
</span><span class="cx">             if (shaderAttribute.name == &quot;gl_InstanceID&quot;)
</span><span class="cx">             {
</span><del>-                structHLSL += &quot;SV_InstanceID&quot;;
</del><ins>+                structStream &lt;&lt; &quot;SV_InstanceID&quot;;
</ins><span class="cx">             }
</span><ins>+            else if (shaderAttribute.name == &quot;gl_VertexID&quot;)
+            {
+                structStream &lt;&lt; &quot;SV_VertexID&quot;;
+            }
</ins><span class="cx">             else
</span><span class="cx">             {
</span><del>-                structHLSL += &quot;TEXCOORD&quot; + Str(semanticIndex);
</del><ins>+                structStream &lt;&lt; &quot;TEXCOORD&quot; &lt;&lt; semanticIndex;
</ins><span class="cx">                 semanticIndex += VariableRegisterCount(shaderAttribute.type);
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            structHLSL += &quot;;\n&quot;;
</del><ins>+            structStream &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx"> 
</span><span class="cx">             // HLSL code for initialization
</span><del>-            initHLSL += &quot;    &quot; + decorateVariable(shaderAttribute.name) + &quot; = &quot;;
</del><ins>+            initStream &lt;&lt; &quot;    &quot; &lt;&lt; decorateVariable(shaderAttribute.name) &lt;&lt; &quot; = &quot;;
</ins><span class="cx"> 
</span><span class="cx">             // Mismatched vertex attribute to vertex input may result in an undefined
</span><span class="cx">             // data reinterpretation (eg for pure integer-&gt;float, float-&gt;pure integer)
</span><span class="cx">             // TODO: issue warning with gl debug info extension, when supported
</span><span class="cx">             if (IsMatrixType(shaderAttribute.type) ||
</span><del>-                (mRenderer-&gt;getVertexConversionType(vertexFormat) &amp; VERTEX_CONVERT_GPU) != 0)
</del><ins>+                (mRenderer-&gt;getVertexConversionType(vertexFormatType) &amp; VERTEX_CONVERT_GPU) != 0)
</ins><span class="cx">             {
</span><del>-                initHLSL += generateAttributeConversionHLSL(vertexFormat, shaderAttribute);
</del><ins>+                initStream &lt;&lt; generateAttributeConversionHLSL(vertexFormatType, shaderAttribute);
</ins><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><del>-                initHLSL += &quot;input.&quot; + decorateVariable(shaderAttribute.name);
</del><ins>+                initStream &lt;&lt; &quot;input.&quot; &lt;&lt; decorateVariable(shaderAttribute.name);
</ins><span class="cx">             }
</span><span class="cx"> 
</span><del>-            initHLSL += &quot;;\n&quot;;
</del><ins>+            initStream &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx"> 
</span><span class="cx">             inputIndex += VariableRowCount(TransposeMatrixType(shaderAttribute.type));
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    std::string replacementHLSL = &quot;struct VS_INPUT\n&quot;
-                                  &quot;{\n&quot; +
-                                  structHLSL +
-                                  &quot;};\n&quot;
-                                  &quot;\n&quot;
-                                  &quot;void initAttributes(VS_INPUT input)\n&quot;
-                                  &quot;{\n&quot; +
-                                  initHLSL +
-                                  &quot;}\n&quot;;
</del><ins>+    structStream &lt;&lt; &quot;};\n&quot;
+                    &quot;\n&quot;
+                    &quot;void initAttributes(VS_INPUT input)\n&quot;
+                    &quot;{\n&quot;
+                 &lt;&lt; initStream.str() &lt;&lt; &quot;}\n&quot;;
</ins><span class="cx"> 
</span><span class="cx">     std::string vertexHLSL(sourceShader);
</span><span class="cx"> 
</span><span class="cx">     size_t copyInsertionPos = vertexHLSL.find(VERTEX_ATTRIBUTE_STUB_STRING);
</span><del>-    vertexHLSL.replace(copyInsertionPos, VERTEX_ATTRIBUTE_STUB_STRING.length(), replacementHLSL);
</del><ins>+    vertexHLSL.replace(copyInsertionPos, VERTEX_ATTRIBUTE_STUB_STRING.length(), structStream.str());
</ins><span class="cx"> 
</span><span class="cx">     return vertexHLSL;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::string DynamicHLSL::generatePixelShaderForOutputSignature(const std::string &amp;sourceShader, const std::vector&lt;PixelShaderOutputVariable&gt; &amp;outputVariables,
-                                                               bool usesFragDepth, const std::vector&lt;GLenum&gt; &amp;outputLayout) const
</del><ins>+std::string DynamicHLSL::generatePixelShaderForOutputSignature(
+    const std::string &amp;sourceShader,
+    const std::vector&lt;PixelShaderOutputVariable&gt; &amp;outputVariables,
+    bool usesFragDepth,
+    const std::vector&lt;GLenum&gt; &amp;outputLayout) const
</ins><span class="cx"> {
</span><del>-    const int shaderModel = mRenderer-&gt;getMajorShaderModel();
</del><ins>+    const int shaderModel      = mRenderer-&gt;getMajorShaderModel();
</ins><span class="cx">     std::string targetSemantic = (shaderModel &gt;= 4) ? &quot;SV_TARGET&quot; : &quot;COLOR&quot;;
</span><del>-    std::string depthSemantic = (shaderModel &gt;= 4) ? &quot;SV_Depth&quot; : &quot;DEPTH&quot;;
</del><ins>+    std::string depthSemantic  = (shaderModel &gt;= 4) ? &quot;SV_Depth&quot; : &quot;DEPTH&quot;;
</ins><span class="cx"> 
</span><del>-    std::string declarationHLSL;
-    std::string copyHLSL;
</del><ins>+    std::stringstream declarationStream;
+    std::stringstream copyStream;
</ins><span class="cx"> 
</span><ins>+    declarationStream &lt;&lt; &quot;struct PS_OUTPUT\n&quot;
+                         &quot;{\n&quot;;
+
</ins><span class="cx">     for (size_t layoutIndex = 0; layoutIndex &lt; outputLayout.size(); ++layoutIndex)
</span><span class="cx">     {
</span><span class="cx">         GLenum binding = outputLayout[layoutIndex];
</span><span class="lines">@@ -507,703 +324,667 @@
</span><span class="cx">         {
</span><span class="cx">             unsigned int location = (binding - GL_COLOR_ATTACHMENT0);
</span><span class="cx"> 
</span><del>-            const PixelShaderOutputVariable *outputVariable = FindOutputAtLocation(outputVariables, location);
</del><ins>+            const PixelShaderOutputVariable *outputVariable =
+                FindOutputAtLocation(outputVariables, location);
</ins><span class="cx"> 
</span><span class="cx">             // OpenGL ES 3.0 spec $4.2.1
</span><del>-            // If [...] not all user-defined output variables are written, the values of fragment colors
</del><ins>+            // If [...] not all user-defined output variables are written, the values of fragment
+            // colors
</ins><span class="cx">             // corresponding to unwritten variables are similarly undefined.
</span><span class="cx">             if (outputVariable)
</span><span class="cx">             {
</span><del>-                declarationHLSL += &quot;    &quot; + HLSLTypeString(outputVariable-&gt;type) + &quot; &quot; + outputVariable-&gt;name +
-                                   &quot; : &quot; + targetSemantic + Str(layoutIndex) + &quot;;\n&quot;;
</del><ins>+                declarationStream &lt;&lt; &quot;    &quot; + HLSLTypeString(outputVariable-&gt;type) &lt;&lt; &quot; &quot;
+                                  &lt;&lt; outputVariable-&gt;name &lt;&lt; &quot; : &quot; &lt;&lt; targetSemantic
+                                  &lt;&lt; static_cast&lt;int&gt;(layoutIndex) &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx"> 
</span><del>-                copyHLSL += &quot;    output.&quot; + outputVariable-&gt;name + &quot; = &quot; + outputVariable-&gt;source + &quot;;\n&quot;;
</del><ins>+                copyStream &lt;&lt; &quot;    output.&quot; &lt;&lt; outputVariable-&gt;name &lt;&lt; &quot; = &quot;
+                           &lt;&lt; outputVariable-&gt;source &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (usesFragDepth)
</span><span class="cx">     {
</span><del>-        declarationHLSL += &quot;    float gl_Depth : &quot; + depthSemantic + &quot;;\n&quot;;
-        copyHLSL += &quot;    output.gl_Depth = gl_Depth; \n&quot;;
</del><ins>+        declarationStream &lt;&lt; &quot;    float gl_Depth : &quot; &lt;&lt; depthSemantic &lt;&lt; &quot;;\n&quot;;
+        copyStream &lt;&lt; &quot;    output.gl_Depth = gl_Depth; \n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    std::string replacementHLSL = &quot;struct PS_OUTPUT\n&quot;
-                                  &quot;{\n&quot; +
-                                  declarationHLSL +
-                                  &quot;};\n&quot;
-                                  &quot;\n&quot;
-                                  &quot;PS_OUTPUT generateOutput()\n&quot;
-                                  &quot;{\n&quot;
-                                  &quot;    PS_OUTPUT output;\n&quot; +
-                                  copyHLSL +
-                                  &quot;    return output;\n&quot;
-                                  &quot;}\n&quot;;
</del><ins>+    declarationStream &lt;&lt; &quot;};\n&quot;
+                         &quot;\n&quot;
+                         &quot;PS_OUTPUT generateOutput()\n&quot;
+                         &quot;{\n&quot;
+                         &quot;    PS_OUTPUT output;\n&quot;
+                      &lt;&lt; copyStream.str() &lt;&lt; &quot;    return output;\n&quot;
+                                             &quot;}\n&quot;;
</ins><span class="cx"> 
</span><span class="cx">     std::string pixelHLSL(sourceShader);
</span><span class="cx"> 
</span><span class="cx">     size_t outputInsertionPos = pixelHLSL.find(PIXEL_OUTPUT_STUB_STRING);
</span><del>-    pixelHLSL.replace(outputInsertionPos, PIXEL_OUTPUT_STUB_STRING.length(), replacementHLSL);
</del><ins>+    pixelHLSL.replace(outputInsertionPos, PIXEL_OUTPUT_STUB_STRING.length(),
+                      declarationStream.str());
</ins><span class="cx"> 
</span><span class="cx">     return pixelHLSL;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::string DynamicHLSL::getVaryingSemantic(bool pointSize) const
</del><ins>+void DynamicHLSL::generateVaryingLinkHLSL(ShaderType shaderType,
+                                          const VaryingPacking &amp;varyingPacking,
+                                          std::stringstream &amp;linkStream) const
</ins><span class="cx"> {
</span><del>-    // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
-    // In D3D11 we manually compute gl_PointCoord in the GS.
-    int shaderModel = mRenderer-&gt;getMajorShaderModel();
-    return ((pointSize &amp;&amp; shaderModel &lt; 4) ? &quot;COLOR&quot; : &quot;TEXCOORD&quot;);
-}
</del><ins>+    const auto &amp;builtins = varyingPacking.builtins(shaderType);
+    ASSERT(builtins.dxPosition.enabled);
+    linkStream &lt;&lt; &quot;{\n&quot;
+               &lt;&lt; &quot;    float4 dx_Position : &quot; &lt;&lt; builtins.dxPosition.str() &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx"> 
</span><del>-struct DynamicHLSL::SemanticInfo
-{
-    struct BuiltinInfo
</del><ins>+    if (builtins.glPosition.enabled)
</ins><span class="cx">     {
</span><del>-        BuiltinInfo()
-            : enabled(false),
-              index(0),
-              systemValue(false)
-        {}
-
-        bool enabled;
-        std::string semantic;
-        unsigned int index;
-        bool systemValue;
-
-        std::string str() const
-        {
-            return (systemValue ? semantic : (semantic + Str(index)));
-        }
-
-        void enableSystem(const std::string &amp;systemValueSemantic)
-        {
-            enabled = true;
-            semantic = systemValueSemantic;
-            systemValue = true;
-        }
-
-        void enable(const std::string &amp;semanticVal, unsigned int indexVal)
-        {
-            enabled = true;
-            semantic = semanticVal;
-            index = indexVal;
-        }
-    };
-
-    BuiltinInfo dxPosition;
-    BuiltinInfo glPosition;
-    BuiltinInfo glFragCoord;
-    BuiltinInfo glPointCoord;
-    BuiltinInfo glPointSize;
-};
-
-DynamicHLSL::SemanticInfo DynamicHLSL::getSemanticInfo(int startRegisters, bool position, bool fragCoord,
-                                                       bool pointCoord, bool pointSize, bool pixelShader) const
-{
-    SemanticInfo info;
-    bool hlsl4 = (mRenderer-&gt;getMajorShaderModel() &gt;= 4);
-    const std::string &amp;varyingSemantic = getVaryingSemantic(pointSize);
-
-    int reservedRegisterIndex = startRegisters;
-
-    if (hlsl4)
-    {
-        info.dxPosition.enableSystem(&quot;SV_Position&quot;);
</del><ins>+        linkStream &lt;&lt; &quot;    float4 gl_Position : &quot; &lt;&lt; builtins.glPosition.str() &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx">     }
</span><del>-    else if (pixelShader)
-    {
-        info.dxPosition.enableSystem(&quot;VPOS&quot;);
-    }
-    else
-    {
-        info.dxPosition.enableSystem(&quot;POSITION&quot;);
-    }
</del><span class="cx"> 
</span><del>-    if (position)
</del><ins>+    if (builtins.glFragCoord.enabled)
</ins><span class="cx">     {
</span><del>-        info.glPosition.enable(varyingSemantic, reservedRegisterIndex++);
</del><ins>+        linkStream &lt;&lt; &quot;    float4 gl_FragCoord : &quot; &lt;&lt; builtins.glFragCoord.str() &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (fragCoord)
</del><ins>+    if (builtins.glPointCoord.enabled)
</ins><span class="cx">     {
</span><del>-        info.glFragCoord.enable(varyingSemantic, reservedRegisterIndex++);
</del><ins>+        linkStream &lt;&lt; &quot;    float2 gl_PointCoord : &quot; &lt;&lt; builtins.glPointCoord.str() &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (pointCoord)
</del><ins>+    if (builtins.glPointSize.enabled)
</ins><span class="cx">     {
</span><del>-        // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
-        // In D3D11 we manually compute gl_PointCoord in the GS.
-        if (hlsl4)
-        {
-            info.glPointCoord.enable(varyingSemantic, reservedRegisterIndex++);
-        }
-        else
-        {
-            info.glPointCoord.enable(&quot;TEXCOORD&quot;, 0);
-        }
</del><ins>+        linkStream &lt;&lt; &quot;    float gl_PointSize : &quot; &lt;&lt; builtins.glPointSize.str() &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Special case: do not include PSIZE semantic in HLSL 3 pixel shaders
-    if (pointSize &amp;&amp; (!pixelShader || hlsl4))
-    {
-        info.glPointSize.enableSystem(&quot;PSIZE&quot;);
-    }
</del><ins>+    // Do this after gl_PointSize, to potentially combine gl_PointCoord and gl_PointSize into the
+    // same register.
+    generateVaryingHLSL(varyingPacking, linkStream);
</ins><span class="cx"> 
</span><del>-    return info;
</del><ins>+    linkStream &lt;&lt; &quot;};\n&quot;;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::string DynamicHLSL::generateVaryingLinkHLSL(const SemanticInfo &amp;info, const std::string &amp;varyingHLSL) const
</del><ins>+bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &amp;data,
+                                         const gl::Program::Data &amp;programData,
+                                         const ProgramD3DMetadata &amp;programMetadata,
+                                         const VaryingPacking &amp;varyingPacking,
+                                         std::string *pixelHLSL,
+                                         std::string *vertexHLSL) const
</ins><span class="cx"> {
</span><del>-    std::string linkHLSL = &quot;{\n&quot;;
</del><ins>+    ASSERT(pixelHLSL-&gt;empty() &amp;&amp; vertexHLSL-&gt;empty());
</ins><span class="cx"> 
</span><del>-    ASSERT(info.dxPosition.enabled);
-    linkHLSL += &quot;    float4 dx_Position : &quot; + info.dxPosition.str() + &quot;;\n&quot;;
</del><ins>+    const gl::Shader *vertexShaderGL   = programData.getAttachedVertexShader();
+    const gl::Shader *fragmentShaderGL = programData.getAttachedFragmentShader();
+    const ShaderD3D *fragmentShader    = GetImplAs&lt;ShaderD3D&gt;(fragmentShaderGL);
+    const int shaderModel              = mRenderer-&gt;getMajorShaderModel();
</ins><span class="cx"> 
</span><del>-    if (info.glPosition.enabled)
-    {
-        linkHLSL += &quot;    float4 gl_Position : &quot; + info.glPosition.str() + &quot;;\n&quot;;
-    }
</del><ins>+    // usesViewScale() isn't supported in the D3D9 renderer
+    ASSERT(shaderModel &gt;= 4 || !programMetadata.usesViewScale());
</ins><span class="cx"> 
</span><del>-    if (info.glFragCoord.enabled)
-    {
-        linkHLSL += &quot;    float4 gl_FragCoord : &quot; + info.glFragCoord.str() + &quot;;\n&quot;;
-    }
</del><ins>+    bool useInstancedPointSpriteEmulation =
+        programMetadata.usesPointSize() &amp;&amp;
+        mRenderer-&gt;getWorkarounds().useInstancedPointSpriteEmulation;
</ins><span class="cx"> 
</span><del>-    if (info.glPointCoord.enabled)
-    {
-        linkHLSL += &quot;    float2 gl_PointCoord : &quot; + info.glPointCoord.str() + &quot;;\n&quot;;
-    }
</del><ins>+    // Validation done in the compiler
+    ASSERT(!fragmentShader-&gt;usesFragColor() || !fragmentShader-&gt;usesFragData());
</ins><span class="cx"> 
</span><del>-    if (info.glPointSize.enabled)
</del><ins>+    std::stringstream vertexStream;
+    vertexStream &lt;&lt; vertexShaderGL-&gt;getTranslatedSource();
+
+    // Instanced PointSprite emulation requires additional entries originally generated in the
+    // GeometryShader HLSL. These include pointsize clamp values.
+    if (useInstancedPointSpriteEmulation)
</ins><span class="cx">     {
</span><del>-        linkHLSL += &quot;    float gl_PointSize : &quot; + info.glPointSize.str() + &quot;;\n&quot;;
</del><ins>+        vertexStream &lt;&lt; &quot;static float minPointSize = &quot;
+                     &lt;&lt; static_cast&lt;int&gt;(data.caps-&gt;minAliasedPointSize) &lt;&lt; &quot;.0f;\n&quot;
+                     &lt;&lt; &quot;static float maxPointSize = &quot;
+                     &lt;&lt; static_cast&lt;int&gt;(data.caps-&gt;maxAliasedPointSize) &lt;&lt; &quot;.0f;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Do this after glPointSize, to potentially combine gl_PointCoord and gl_PointSize into the same register.
-    linkHLSL += varyingHLSL;
</del><ins>+    // Add stub string to be replaced when shader is dynamically defined by its layout
+    vertexStream &lt;&lt; &quot;\n&quot; &lt;&lt; VERTEX_ATTRIBUTE_STUB_STRING + &quot;\n&quot;;
</ins><span class="cx"> 
</span><del>-    linkHLSL += &quot;};\n&quot;;
</del><ins>+    // Write the HLSL input/output declarations
+    vertexStream &lt;&lt; &quot;struct VS_OUTPUT\n&quot;;
+    generateVaryingLinkHLSL(SHADER_VERTEX, varyingPacking, vertexStream);
+    vertexStream &lt;&lt; &quot;\n&quot;
+                 &lt;&lt; &quot;VS_OUTPUT main(VS_INPUT input)\n&quot;
+                 &lt;&lt; &quot;{\n&quot;
+                 &lt;&lt; &quot;    initAttributes(input);\n&quot;;
</ins><span class="cx"> 
</span><del>-    return linkHLSL;
-}
</del><ins>+    vertexStream &lt;&lt; &quot;\n&quot;
+                 &lt;&lt; &quot;    gl_main();\n&quot;
+                 &lt;&lt; &quot;\n&quot;
+                 &lt;&lt; &quot;    VS_OUTPUT output;\n&quot;;
</ins><span class="cx"> 
</span><del>-void DynamicHLSL::storeBuiltinLinkedVaryings(const SemanticInfo &amp;info,
-                                             std::vector&lt;LinkedVarying&gt; *linkedVaryings) const
-{
-    if (info.glPosition.enabled)
-    {
-        linkedVaryings-&gt;push_back(LinkedVarying(&quot;gl_Position&quot;, GL_FLOAT_VEC4, 1, info.glPosition.semantic,
-                                                info.glPosition.index, 1));
-    }
</del><ins>+    const auto &amp;vertexBuiltins = varyingPacking.builtins(SHADER_VERTEX);
</ins><span class="cx"> 
</span><del>-    if (info.glFragCoord.enabled)
</del><ins>+    if (vertexBuiltins.glPosition.enabled)
</ins><span class="cx">     {
</span><del>-        linkedVaryings-&gt;push_back(LinkedVarying(&quot;gl_FragCoord&quot;, GL_FLOAT_VEC4, 1, info.glFragCoord.semantic,
-                                                info.glFragCoord.index, 1));
</del><ins>+        vertexStream &lt;&lt; &quot;    output.gl_Position = gl_Position;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (info.glPointSize.enabled)
</del><ins>+    // On D3D9 or D3D11 Feature Level 9, we need to emulate large viewports using dx_ViewAdjust.
+    if (shaderModel &gt;= 4 &amp;&amp; mRenderer-&gt;getShaderModelSuffix() == &quot;&quot;)
</ins><span class="cx">     {
</span><del>-        linkedVaryings-&gt;push_back(LinkedVarying(&quot;gl_PointSize&quot;, GL_FLOAT, 1, &quot;PSIZE&quot;, 0, 1));
-    }
-}
</del><ins>+        vertexStream &lt;&lt; &quot;    output.dx_Position.x = gl_Position.x;\n&quot;;
</ins><span class="cx"> 
</span><del>-void DynamicHLSL::storeUserLinkedVaryings(const ShaderD3D *vertexShader,
-                                          std::vector&lt;LinkedVarying&gt; *linkedVaryings) const
-{
-    const std::string &amp;varyingSemantic = getVaryingSemantic(vertexShader-&gt;mUsesPointSize);
-    const std::vector&lt;PackedVarying&gt; &amp;varyings = vertexShader-&gt;getVaryings();
-
-    for (unsigned int varyingIndex = 0; varyingIndex &lt; varyings.size(); varyingIndex++)
-    {
-        const PackedVarying &amp;varying = varyings[varyingIndex];
-
-        if (varying.registerAssigned())
</del><ins>+        if (programMetadata.usesViewScale())
</ins><span class="cx">         {
</span><del>-            ASSERT(!varying.isBuiltIn());
-            GLenum transposedType = TransposeMatrixType(varying.type);
-            int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType));
-
-            linkedVaryings-&gt;push_back(LinkedVarying(varying.name, varying.type, varying.elementCount(),
-                                                    varyingSemantic, varying.registerIndex,
-                                                    variableRows * varying.elementCount()));
</del><ins>+            // This code assumes that dx_ViewScale.y = -1.0f when rendering to texture, and +1.0f
+            // when rendering to the default framebuffer. No other values are valid.
+            vertexStream &lt;&lt; &quot;    output.dx_Position.y = dx_ViewScale.y * gl_Position.y;\n&quot;;
</ins><span class="cx">         }
</span><del>-    }
-}
</del><ins>+        else
+        {
+            vertexStream &lt;&lt; &quot;    output.dx_Position.y = - gl_Position.y;\n&quot;;
+        }
</ins><span class="cx"> 
</span><del>-bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &amp;data, InfoLog &amp;infoLog, int registers,
-                                         const VaryingPacking packing,
-                                         std::string &amp;pixelHLSL, std::string &amp;vertexHLSL,
-                                         ShaderD3D *fragmentShader, ShaderD3D *vertexShader,
-                                         const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings,
-                                         std::vector&lt;LinkedVarying&gt; *linkedVaryings,
-                                         std::map&lt;int, VariableLocation&gt; *programOutputVars,
-                                         std::vector&lt;PixelShaderOutputVariable&gt; *outPixelShaderKey,
-                                         bool *outUsesFragDepth) const
-{
-    if (pixelHLSL.empty() || vertexHLSL.empty())
-    {
-        return false;
</del><ins>+        vertexStream &lt;&lt; &quot;    output.dx_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n&quot;
+                     &lt;&lt; &quot;    output.dx_Position.w = gl_Position.w;\n&quot;;
</ins><span class="cx">     }
</span><del>-
-    bool usesMRT = fragmentShader-&gt;mUsesMultipleRenderTargets;
-    bool usesFragColor = fragmentShader-&gt;mUsesFragColor;
-    bool usesFragData = fragmentShader-&gt;mUsesFragData;
-    bool usesFragCoord = fragmentShader-&gt;mUsesFragCoord;
-    bool usesPointCoord = fragmentShader-&gt;mUsesPointCoord;
-    bool usesPointSize = vertexShader-&gt;mUsesPointSize;
-    bool useInstancedPointSpriteEmulation = usesPointSize &amp;&amp; mRenderer-&gt;getWorkarounds().useInstancedPointSpriteEmulation;
-
-    if (usesFragColor &amp;&amp; usesFragData)
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        infoLog.append(&quot;Cannot use both gl_FragColor and gl_FragData in the same fragment shader.&quot;);
-        return false;
-    }
</del><ins>+        vertexStream &lt;&lt; &quot;    output.dx_Position.x = gl_Position.x * dx_ViewAdjust.z + &quot;
+                        &quot;dx_ViewAdjust.x * gl_Position.w;\n&quot;;
</ins><span class="cx"> 
</span><del>-    // Write the HLSL input/output declarations
-    const int shaderModel = mRenderer-&gt;getMajorShaderModel();
-    const int registersNeeded = registers + (usesFragCoord ? 1 : 0) + (usesPointCoord ? 1 : 0);
</del><ins>+        // If usesViewScale() is true and we're using the D3D11 renderer via Feature Level 9_*,
+        // then we need to multiply the gl_Position.y by the viewScale.
+        // usesViewScale() isn't supported when using the D3D9 renderer.
+        if (programMetadata.usesViewScale() &amp;&amp;
+            (shaderModel &gt;= 4 &amp;&amp; mRenderer-&gt;getShaderModelSuffix() != &quot;&quot;))
+        {
+            vertexStream &lt;&lt; &quot;    output.dx_Position.y = dx_ViewScale.y * (gl_Position.y * &quot;
+                            &quot;dx_ViewAdjust.w + dx_ViewAdjust.y * gl_Position.w);\n&quot;;
+        }
+        else
+        {
+            vertexStream &lt;&lt; &quot;    output.dx_Position.y = -(gl_Position.y * dx_ViewAdjust.w + &quot;
+                            &quot;dx_ViewAdjust.y * gl_Position.w);\n&quot;;
+        }
</ins><span class="cx"> 
</span><del>-    // Two cases when writing to gl_FragColor and using ESSL 1.0:
-    // - with a 3.0 context, the output color is copied to channel 0
-    // - with a 2.0 context, the output color is broadcast to all channels
-    const bool broadcast = (fragmentShader-&gt;mUsesFragColor &amp;&amp; data.clientVersion &lt; 3);
-    const unsigned int numRenderTargets = (broadcast || usesMRT ? data.caps-&gt;maxDrawBuffers : 1);
-
-    // gl_Position only needs to be outputted from the vertex shader if transform feedback is active.
-    // This isn't supported on D3D11 Feature Level 9_3, so we don't output gl_Position from the vertex shader in this case.
-    // This saves us 1 output vector.
-    bool outputPositionFromVS = !(shaderModel &gt;= 4 &amp;&amp; mRenderer-&gt;getShaderModelSuffix() != &quot;&quot;);
-
-    int shaderVersion = vertexShader-&gt;getShaderVersion();
-
-    if (static_cast&lt;GLuint&gt;(registersNeeded) &gt; data.caps-&gt;maxVaryingVectors)
-    {
-        infoLog.append(&quot;No varying registers left to support gl_FragCoord/gl_PointCoord&quot;);
-        return false;
</del><ins>+        vertexStream &lt;&lt; &quot;    output.dx_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n&quot;
+                     &lt;&lt; &quot;    output.dx_Position.w = gl_Position.w;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const std::string &amp;varyingHLSL = generateVaryingHLSL(vertexShader);
-
-    // Instanced PointSprite emulation requires that gl_PointCoord is present in the vertex shader VS_OUTPUT
-    // structure to ensure compatibility with the generated PS_INPUT of the pixel shader.
-    // GeometryShader PointSprite emulation does not require this additional entry because the
-    // GS_OUTPUT of the Geometry shader contains the pointCoord value and already matches the PS_INPUT of the
-    // generated pixel shader.
-    // The Geometry Shader point sprite implementation needs gl_PointSize to be in VS_OUTPUT and GS_INPUT.
-    // Instanced point sprites doesn't need gl_PointSize in VS_OUTPUT.
-    const SemanticInfo &amp;vertexSemantics = getSemanticInfo(registers, outputPositionFromVS,
-                                                          usesFragCoord, (useInstancedPointSpriteEmulation &amp;&amp; usesPointCoord),
-                                                          (!useInstancedPointSpriteEmulation &amp;&amp; usesPointSize), false);
-
-    storeUserLinkedVaryings(vertexShader, linkedVaryings);
-    storeBuiltinLinkedVaryings(vertexSemantics, linkedVaryings);
-
-    // Instanced PointSprite emulation requires additional entries originally generated in the
-    // GeometryShader HLSL.  These include pointsize clamp values.
-    if (useInstancedPointSpriteEmulation)
</del><ins>+    // We don't need to output gl_PointSize if we use are emulating point sprites via instancing.
+    if (vertexBuiltins.glPointSize.enabled)
</ins><span class="cx">     {
</span><del>-        vertexHLSL += &quot;static float minPointSize = &quot; + Str((int)mRenderer-&gt;getRendererCaps().minAliasedPointSize) + &quot;.0f;\n&quot;
-                      &quot;static float maxPointSize = &quot; + Str((int)mRenderer-&gt;getRendererCaps().maxAliasedPointSize) + &quot;.0f;\n&quot;;
</del><ins>+        vertexStream &lt;&lt; &quot;    output.gl_PointSize = gl_PointSize;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Add stub string to be replaced when shader is dynamically defined by its layout
-    vertexHLSL += &quot;\n&quot; + VERTEX_ATTRIBUTE_STUB_STRING + &quot;\n&quot;
-                  &quot;struct VS_OUTPUT\n&quot; + generateVaryingLinkHLSL(vertexSemantics, varyingHLSL) + &quot;\n&quot;
-                  &quot;VS_OUTPUT main(VS_INPUT input)\n&quot;
-                  &quot;{\n&quot;
-                  &quot;    initAttributes(input);\n&quot;;
-
-    if (vertexShader-&gt;usesDeferredInit())
</del><ins>+    if (vertexBuiltins.glFragCoord.enabled)
</ins><span class="cx">     {
</span><del>-        vertexHLSL += &quot;\n&quot;
-                      &quot;    initializeDeferredGlobals();\n&quot;;
</del><ins>+        vertexStream &lt;&lt; &quot;    output.gl_FragCoord = gl_Position;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    vertexHLSL += &quot;\n&quot;
-                  &quot;    gl_main();\n&quot;
-                  &quot;\n&quot;
-                  &quot;    VS_OUTPUT output;\n&quot;;
-
-    if (outputPositionFromVS)
</del><ins>+    for (const PackedVaryingRegister &amp;registerInfo : varyingPacking.getRegisterList())
</ins><span class="cx">     {
</span><del>-        vertexHLSL += &quot;    output.gl_Position = gl_Position;\n&quot;;
-    }
</del><ins>+        const auto &amp;packedVarying = *registerInfo.packedVarying;
+        const auto &amp;varying = *packedVarying.varying;
+        ASSERT(!varying.isStruct());
</ins><span class="cx"> 
</span><del>-    // On D3D9 or D3D11 Feature Level 9, we need to emulate large viewports using dx_ViewAdjust.
-    if (shaderModel &gt;= 4  &amp;&amp; mRenderer-&gt;getShaderModelSuffix() == &quot;&quot;)
-    {
-        vertexHLSL += &quot;    output.dx_Position.x = gl_Position.x;\n&quot;
-                      &quot;    output.dx_Position.y = -gl_Position.y;\n&quot;
-                      &quot;    output.dx_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n&quot;
-                      &quot;    output.dx_Position.w = gl_Position.w;\n&quot;;
-    }
-    else
-    {
-        vertexHLSL += &quot;    output.dx_Position.x = gl_Position.x * dx_ViewAdjust.z + dx_ViewAdjust.x * gl_Position.w;\n&quot;
-                      &quot;    output.dx_Position.y = -(gl_Position.y * dx_ViewAdjust.w + dx_ViewAdjust.y * gl_Position.w);\n&quot;
-                      &quot;    output.dx_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n&quot;
-                      &quot;    output.dx_Position.w = gl_Position.w;\n&quot;;
-    }
</del><ins>+        vertexStream &lt;&lt; &quot;    output.v&quot; &lt;&lt; registerInfo.semanticIndex &lt;&lt; &quot; = &quot;;
</ins><span class="cx"> 
</span><del>-    // We don't need to output gl_PointSize if we use are emulating point sprites via instancing.
-    if (usesPointSize &amp;&amp; shaderModel &gt;= 3 &amp;&amp; !useInstancedPointSpriteEmulation)
-    {
-        vertexHLSL += &quot;    output.gl_PointSize = gl_PointSize;\n&quot;;
-    }
</del><ins>+        if (packedVarying.isStructField())
+        {
+            vertexStream &lt;&lt; decorateVariable(packedVarying.parentStructName) &lt;&lt; &quot;.&quot;;
+        }
</ins><span class="cx"> 
</span><del>-    if (usesFragCoord)
-    {
-        vertexHLSL += &quot;    output.gl_FragCoord = gl_Position;\n&quot;;
-    }
</del><ins>+        vertexStream &lt;&lt; decorateVariable(varying.name);
</ins><span class="cx"> 
</span><del>-    const std::vector&lt;PackedVarying&gt; &amp;vertexVaryings = vertexShader-&gt;getVaryings();
-    for (unsigned int vertVaryingIndex = 0; vertVaryingIndex &lt; vertexVaryings.size(); vertVaryingIndex++)
-    {
-        const PackedVarying &amp;varying = vertexVaryings[vertVaryingIndex];
-        if (varying.registerAssigned())
</del><ins>+        if (varying.isArray())
</ins><span class="cx">         {
</span><del>-            for (unsigned int elementIndex = 0; elementIndex &lt; varying.elementCount(); elementIndex++)
-            {
-                int variableRows = (varying.isStruct() ? 1 : VariableRowCount(TransposeMatrixType(varying.type)));
</del><ins>+            WriteArrayString(vertexStream, registerInfo.varyingArrayIndex);
+        }
</ins><span class="cx"> 
</span><del>-                for (int row = 0; row &lt; variableRows; row++)
-                {
-                    int r = varying.registerIndex + varying.columnIndex * data.caps-&gt;maxVaryingVectors + elementIndex * variableRows + row;
-                    vertexHLSL += &quot;    output.v&quot; + Str(r);
-
-                    vertexHLSL += &quot; = _&quot; + varying.name;
-
-                    if (varying.isArray())
-                    {
-                        vertexHLSL += ArrayString(elementIndex);
-                    }
-
-                    if (variableRows &gt; 1)
-                    {
-                        vertexHLSL += ArrayString(row);
-                    }
-
-                    vertexHLSL += &quot;;\n&quot;;
-                }
-            }
</del><ins>+        if (VariableRowCount(varying.type) &gt; 1)
+        {
+            WriteArrayString(vertexStream, registerInfo.varyingRowIndex);
</ins><span class="cx">         }
</span><ins>+
+        vertexStream &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Instanced PointSprite emulation requires additional entries to calculate
</span><span class="cx">     // the final output vertex positions of the quad that represents each sprite.
</span><span class="cx">     if (useInstancedPointSpriteEmulation)
</span><span class="cx">     {
</span><del>-        vertexHLSL += &quot;\n&quot;
-                      &quot;    gl_PointSize = clamp(gl_PointSize, minPointSize, maxPointSize);\n&quot;
-                      &quot;    output.dx_Position.xyz += float3(input.spriteVertexPos.x * gl_PointSize / (dx_ViewCoords.x*2), input.spriteVertexPos.y * gl_PointSize / (dx_ViewCoords.y*2), input.spriteVertexPos.z) * output.dx_Position.w;\n&quot;;
</del><ins>+        vertexStream &lt;&lt; &quot;\n&quot;
+                     &lt;&lt; &quot;    gl_PointSize = clamp(gl_PointSize, minPointSize, maxPointSize);\n&quot;;
</ins><span class="cx"> 
</span><del>-        if (usesPointCoord)
</del><ins>+        vertexStream &lt;&lt; &quot;    output.dx_Position.x += (input.spriteVertexPos.x * gl_PointSize / &quot;
+                        &quot;(dx_ViewCoords.x*2)) * output.dx_Position.w;&quot;;
+
+        if (programMetadata.usesViewScale())
</ins><span class="cx">         {
</span><del>-            vertexHLSL += &quot;\n&quot;
-                          &quot;    output.gl_PointCoord = input.spriteTexCoord;\n&quot;;
</del><ins>+            // Multiply by ViewScale to invert the rendering when appropriate
+            vertexStream &lt;&lt; &quot;    output.dx_Position.y += (-dx_ViewScale.y * &quot;
+                            &quot;input.spriteVertexPos.y * gl_PointSize / (dx_ViewCoords.y*2)) * &quot;
+                            &quot;output.dx_Position.w;&quot;;
</ins><span class="cx">         }
</span><del>-    }
-
-    vertexHLSL += &quot;\n&quot;
-                  &quot;    return output;\n&quot;
-                  &quot;}\n&quot;;
-
-    const SemanticInfo &amp;pixelSemantics = getSemanticInfo(registers, outputPositionFromVS, usesFragCoord, usesPointCoord,
-                                                         (!useInstancedPointSpriteEmulation &amp;&amp; usesPointSize), true);
-
-    pixelHLSL += &quot;struct PS_INPUT\n&quot; + generateVaryingLinkHLSL(pixelSemantics, varyingHLSL) + &quot;\n&quot;;
-
-    if (shaderVersion &lt; 300)
-    {
-        for (unsigned int renderTargetIndex = 0; renderTargetIndex &lt; numRenderTargets; renderTargetIndex++)
</del><ins>+        else
</ins><span class="cx">         {
</span><del>-            PixelShaderOutputVariable outputKeyVariable;
-            outputKeyVariable.type = GL_FLOAT_VEC4;
-            outputKeyVariable.name = &quot;gl_Color&quot; + Str(renderTargetIndex);
-            outputKeyVariable.source = broadcast ? &quot;gl_Color[0]&quot; : &quot;gl_Color[&quot; + Str(renderTargetIndex) + &quot;]&quot;;
-            outputKeyVariable.outputIndex = renderTargetIndex;
-
-            outPixelShaderKey-&gt;push_back(outputKeyVariable);
</del><ins>+            vertexStream &lt;&lt; &quot;    output.dx_Position.y += (input.spriteVertexPos.y * gl_PointSize / &quot;
+                            &quot;(dx_ViewCoords.y*2)) * output.dx_Position.w;&quot;;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        *outUsesFragDepth = fragmentShader-&gt;mUsesFragDepth;
-    }
-    else
-    {
-        defineOutputVariables(fragmentShader, programOutputVars);
</del><ins>+        vertexStream
+            &lt;&lt; &quot;    output.dx_Position.z += input.spriteVertexPos.z * output.dx_Position.w;\n&quot;;
</ins><span class="cx"> 
</span><del>-        const std::vector&lt;sh::Attribute&gt; &amp;shaderOutputVars = fragmentShader-&gt;getActiveOutputVariables();
-        for (auto locationIt = programOutputVars-&gt;begin(); locationIt != programOutputVars-&gt;end(); locationIt++)
</del><ins>+        if (programMetadata.usesPointCoord())
</ins><span class="cx">         {
</span><del>-            const VariableLocation &amp;outputLocation = locationIt-&gt;second;
-            const sh::ShaderVariable &amp;outputVariable = shaderOutputVars[outputLocation.index];
-            const std::string &amp;variableName = &quot;out_&quot; + outputLocation.name;
-            const std::string &amp;elementString = (outputLocation.element == GL_INVALID_INDEX ? &quot;&quot; : Str(outputLocation.element));
-
-            ASSERT(outputVariable.staticUse);
-
-            PixelShaderOutputVariable outputKeyVariable;
-            outputKeyVariable.type = outputVariable.type;
-            outputKeyVariable.name = variableName + elementString;
-            outputKeyVariable.source = variableName + ArrayString(outputLocation.element);
-            outputKeyVariable.outputIndex = locationIt-&gt;first;
-
-            outPixelShaderKey-&gt;push_back(outputKeyVariable);
</del><ins>+            vertexStream &lt;&lt; &quot;\n&quot;
+                         &lt;&lt; &quot;    output.gl_PointCoord = input.spriteTexCoord;\n&quot;;
</ins><span class="cx">         }
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-        *outUsesFragDepth = false;
</del><ins>+    // Renderers that enable instanced pointsprite emulation require the vertex shader output member
+    // gl_PointCoord to be set to a default value if used without gl_PointSize. 0.5,0.5 is the same
+    // default value used in the generated pixel shader.
+    if (programMetadata.usesInsertedPointCoordValue())
+    {
+        ASSERT(!useInstancedPointSpriteEmulation);
+        vertexStream &lt;&lt; &quot;\n&quot;
+                     &lt;&lt; &quot;    output.gl_PointCoord = float2(0.5, 0.5);\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    pixelHLSL += PIXEL_OUTPUT_STUB_STRING + &quot;\n&quot;;
</del><ins>+    vertexStream &lt;&lt; &quot;\n&quot;
+                 &lt;&lt; &quot;    return output;\n&quot;
+                 &lt;&lt; &quot;}\n&quot;;
</ins><span class="cx"> 
</span><del>-    if (fragmentShader-&gt;mUsesFrontFacing)
</del><ins>+    std::stringstream pixelStream;
+    pixelStream &lt;&lt; fragmentShaderGL-&gt;getTranslatedSource();
+    pixelStream &lt;&lt; &quot;struct PS_INPUT\n&quot;;
+    generateVaryingLinkHLSL(SHADER_PIXEL, varyingPacking, pixelStream);
+    pixelStream &lt;&lt; &quot;\n&quot;;
+
+    pixelStream &lt;&lt; PIXEL_OUTPUT_STUB_STRING + &quot;\n&quot;;
+
+    if (fragmentShader-&gt;usesFrontFacing())
</ins><span class="cx">     {
</span><span class="cx">         if (shaderModel &gt;= 4)
</span><span class="cx">         {
</span><del>-            pixelHLSL += &quot;PS_OUTPUT main(PS_INPUT input, bool isFrontFace : SV_IsFrontFace)\n&quot;
-                         &quot;{\n&quot;;
</del><ins>+            pixelStream &lt;&lt; &quot;PS_OUTPUT main(PS_INPUT input, bool isFrontFace : SV_IsFrontFace)\n&quot;
+                        &lt;&lt; &quot;{\n&quot;;
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            pixelHLSL += &quot;PS_OUTPUT main(PS_INPUT input, float vFace : VFACE)\n&quot;
-                         &quot;{\n&quot;;
</del><ins>+            pixelStream &lt;&lt; &quot;PS_OUTPUT main(PS_INPUT input, float vFace : VFACE)\n&quot;
+                        &lt;&lt; &quot;{\n&quot;;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        pixelHLSL += &quot;PS_OUTPUT main(PS_INPUT input)\n&quot;
-                     &quot;{\n&quot;;
</del><ins>+        pixelStream &lt;&lt; &quot;PS_OUTPUT main(PS_INPUT input)\n&quot;
+                    &lt;&lt; &quot;{\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (usesFragCoord)
</del><ins>+    const auto &amp;pixelBuiltins = varyingPacking.builtins(SHADER_PIXEL);
+
+    if (pixelBuiltins.glFragCoord.enabled)
</ins><span class="cx">     {
</span><del>-        pixelHLSL += &quot;    float rhw = 1.0 / input.gl_FragCoord.w;\n&quot;;
</del><ins>+        pixelStream &lt;&lt; &quot;    float rhw = 1.0 / input.gl_FragCoord.w;\n&quot;;
</ins><span class="cx"> 
</span><span class="cx">         // Certain Shader Models (4_0+ and 3_0) allow reading from dx_Position in the pixel shader.
</span><del>-        // Other Shader Models (4_0_level_9_3 and 2_x) don't support this, so we emulate it using dx_ViewCoords.
</del><ins>+        // Other Shader Models (4_0_level_9_3 and 2_x) don't support this, so we emulate it using
+        // dx_ViewCoords.
</ins><span class="cx">         if (shaderModel &gt;= 4 &amp;&amp; mRenderer-&gt;getShaderModelSuffix() == &quot;&quot;)
</span><span class="cx">         {
</span><del>-            pixelHLSL += &quot;    gl_FragCoord.x = input.dx_Position.x;\n&quot;
-                         &quot;    gl_FragCoord.y = input.dx_Position.y;\n&quot;;
</del><ins>+            pixelStream &lt;&lt; &quot;    gl_FragCoord.x = input.dx_Position.x;\n&quot;
+                        &lt;&lt; &quot;    gl_FragCoord.y = input.dx_Position.y;\n&quot;;
</ins><span class="cx">         }
</span><span class="cx">         else if (shaderModel == 3)
</span><span class="cx">         {
</span><del>-            pixelHLSL += &quot;    gl_FragCoord.x = input.dx_Position.x + 0.5;\n&quot;
-                         &quot;    gl_FragCoord.y = input.dx_Position.y + 0.5;\n&quot;;
</del><ins>+            pixelStream &lt;&lt; &quot;    gl_FragCoord.x = input.dx_Position.x + 0.5;\n&quot;
+                        &lt;&lt; &quot;    gl_FragCoord.y = input.dx_Position.y + 0.5;\n&quot;;
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            // dx_ViewCoords contains the viewport width/2, height/2, center.x and center.y. See Renderer::setViewport()
-            pixelHLSL += &quot;    gl_FragCoord.x = (input.gl_FragCoord.x * rhw) * dx_ViewCoords.x + dx_ViewCoords.z;\n&quot;
-                         &quot;    gl_FragCoord.y = (input.gl_FragCoord.y * rhw) * dx_ViewCoords.y + dx_ViewCoords.w;\n&quot;;
</del><ins>+            // dx_ViewCoords contains the viewport width/2, height/2, center.x and center.y. See
+            // Renderer::setViewport()
+            pixelStream &lt;&lt; &quot;    gl_FragCoord.x = (input.gl_FragCoord.x * rhw) * dx_ViewCoords.x + &quot;
+                           &quot;dx_ViewCoords.z;\n&quot;
+                        &lt;&lt; &quot;    gl_FragCoord.y = (input.gl_FragCoord.y * rhw) * dx_ViewCoords.y + &quot;
+                           &quot;dx_ViewCoords.w;\n&quot;;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        pixelHLSL += &quot;    gl_FragCoord.z = (input.gl_FragCoord.z * rhw) * dx_DepthFront.x + dx_DepthFront.y;\n&quot;
-                     &quot;    gl_FragCoord.w = rhw;\n&quot;;
</del><ins>+        if (programMetadata.usesViewScale())
+        {
+            // For Feature Level 9_3 and below, we need to correct gl_FragCoord.y to account
+            // for dx_ViewScale. On Feature Level 10_0+, gl_FragCoord.y is calculated above using
+            // dx_ViewCoords and is always correct irrespective of dx_ViewScale's value.
+            // NOTE: usesViewScale() can only be true on D3D11 (i.e. Shader Model 4.0+).
+            if (shaderModel &gt;= 4 &amp;&amp; mRenderer-&gt;getShaderModelSuffix() == &quot;&quot;)
+            {
+                // Some assumptions:
+                //  - dx_ViewScale.y = -1.0f when rendering to texture
+                //  - dx_ViewScale.y = +1.0f when rendering to the default framebuffer
+                //  - gl_FragCoord.y has been set correctly above.
+                //
+                // When rendering to the backbuffer, the code inverts gl_FragCoord's y coordinate.
+                // This involves subtracting the y coordinate from the height of the area being
+                // rendered to.
+                //
+                // First we calculate the height of the area being rendered to:
+                //    render_area_height = (2.0f / (1.0f - input.gl_FragCoord.y * rhw)) *
+                //    gl_FragCoord.y
+                //
+                // Note that when we're rendering to default FB, we want our output to be
+                // equivalent to:
+                //    &quot;gl_FragCoord.y = render_area_height - gl_FragCoord.y&quot;
+                //
+                // When we're rendering to a texture, we want our output to be equivalent to:
+                //    &quot;gl_FragCoord.y = gl_FragCoord.y;&quot;
+                //
+                // If we set scale_factor = ((1.0f + dx_ViewScale.y) / 2.0f), then notice that
+                //  - When rendering to default FB: scale_factor = 1.0f
+                //  - When rendering to texture:    scale_factor = 0.0f
+                //
+                // Therefore, we can get our desired output by setting:
+                //    &quot;gl_FragCoord.y = scale_factor * render_area_height - dx_ViewScale.y *
+                //    gl_FragCoord.y&quot;
+                //
+                // Simplifying, this becomes:
+                pixelStream
+                    &lt;&lt; &quot;    gl_FragCoord.y = (1.0f + dx_ViewScale.y) * gl_FragCoord.y /&quot;
+                       &quot;(1.0f - input.gl_FragCoord.y * rhw)  - dx_ViewScale.y * gl_FragCoord.y;\n&quot;;
+            }
+        }
+
+        pixelStream &lt;&lt; &quot;    gl_FragCoord.z = (input.gl_FragCoord.z * rhw) * dx_DepthFront.x + &quot;
+                       &quot;dx_DepthFront.y;\n&quot;
+                    &lt;&lt; &quot;    gl_FragCoord.w = rhw;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (usesPointCoord &amp;&amp; shaderModel &gt;= 3)
</del><ins>+    if (pixelBuiltins.glPointCoord.enabled &amp;&amp; shaderModel &gt;= 3)
</ins><span class="cx">     {
</span><del>-        pixelHLSL += &quot;    gl_PointCoord.x = input.gl_PointCoord.x;\n&quot;;
-        pixelHLSL += &quot;    gl_PointCoord.y = 1.0 - input.gl_PointCoord.y;\n&quot;;
</del><ins>+        pixelStream &lt;&lt; &quot;    gl_PointCoord.x = input.gl_PointCoord.x;\n&quot;
+                    &lt;&lt; &quot;    gl_PointCoord.y = 1.0 - input.gl_PointCoord.y;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (fragmentShader-&gt;mUsesFrontFacing)
</del><ins>+    if (fragmentShader-&gt;usesFrontFacing())
</ins><span class="cx">     {
</span><span class="cx">         if (shaderModel &lt;= 3)
</span><span class="cx">         {
</span><del>-            pixelHLSL += &quot;    gl_FrontFacing = (vFace * dx_DepthFront.z &gt;= 0.0);\n&quot;;
</del><ins>+            pixelStream &lt;&lt; &quot;    gl_FrontFacing = (vFace * dx_DepthFront.z &gt;= 0.0);\n&quot;;
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            pixelHLSL += &quot;    gl_FrontFacing = isFrontFace;\n&quot;;
</del><ins>+            pixelStream &lt;&lt; &quot;    gl_FrontFacing = isFrontFace;\n&quot;;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const std::vector&lt;PackedVarying&gt; &amp;fragmentVaryings = fragmentShader-&gt;getVaryings();
-    for (unsigned int varyingIndex = 0; varyingIndex &lt; fragmentVaryings.size(); varyingIndex++)
</del><ins>+    for (const PackedVaryingRegister &amp;registerInfo : varyingPacking.getRegisterList())
</ins><span class="cx">     {
</span><del>-        const PackedVarying &amp;varying = fragmentVaryings[varyingIndex];
-        if (varying.registerAssigned())
</del><ins>+        const auto &amp;packedVarying = *registerInfo.packedVarying;
+        const auto &amp;varying = *packedVarying.varying;
+        ASSERT(!varying.isBuiltIn() &amp;&amp; !varying.isStruct());
+
+        // Don't reference VS-only transform feedback varyings in the PS.
+        if (registerInfo.packedVarying-&gt;vertexOnly)
+            continue;
+
+        pixelStream &lt;&lt; &quot;    &quot;;
+
+        if (packedVarying.isStructField())
</ins><span class="cx">         {
</span><del>-            ASSERT(!varying.isBuiltIn());
-            for (unsigned int elementIndex = 0; elementIndex &lt; varying.elementCount(); elementIndex++)
-            {
-                GLenum transposedType = TransposeMatrixType(varying.type);
-                int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType));
-                for (int row = 0; row &lt; variableRows; row++)
-                {
-                    std::string n = Str(varying.registerIndex + varying.columnIndex * data.caps-&gt;maxVaryingVectors + elementIndex * variableRows + row);
-                    pixelHLSL += &quot;    _&quot; + varying.name;
</del><ins>+            pixelStream &lt;&lt; decorateVariable(packedVarying.parentStructName) &lt;&lt; &quot;.&quot;;
+        }
</ins><span class="cx"> 
</span><del>-                    if (varying.isArray())
-                    {
-                        pixelHLSL += ArrayString(elementIndex);
-                    }
</del><ins>+        pixelStream &lt;&lt; decorateVariable(varying.name);
</ins><span class="cx"> 
</span><del>-                    if (variableRows &gt; 1)
-                    {
-                        pixelHLSL += ArrayString(row);
-                    }
</del><ins>+        if (varying.isArray())
+        {
+            WriteArrayString(pixelStream, registerInfo.varyingArrayIndex);
+        }
</ins><span class="cx"> 
</span><del>-                    if (varying.isStruct())
-                    {
-                        pixelHLSL += &quot; = input.v&quot; + n + &quot;;\n&quot;;   break;
-                    }
-                    else
-                    {
-                        switch (VariableColumnCount(transposedType))
-                        {
-                          case 1: pixelHLSL += &quot; = input.v&quot; + n + &quot;.x;\n&quot;;   break;
-                          case 2: pixelHLSL += &quot; = input.v&quot; + n + &quot;.xy;\n&quot;;  break;
-                          case 3: pixelHLSL += &quot; = input.v&quot; + n + &quot;.xyz;\n&quot;; break;
-                          case 4: pixelHLSL += &quot; = input.v&quot; + n + &quot;;\n&quot;;     break;
-                          default: UNREACHABLE();
-                        }
-                    }
-                }
-            }
</del><ins>+        GLenum transposedType = TransposeMatrixType(varying.type);
+        if (VariableRowCount(transposedType) &gt; 1)
+        {
+            WriteArrayString(pixelStream, registerInfo.varyingRowIndex);
</ins><span class="cx">         }
</span><del>-        else
</del><ins>+
+        pixelStream &lt;&lt; &quot; = input.v&quot; &lt;&lt; registerInfo.semanticIndex;
+
+        switch (VariableColumnCount(transposedType))
</ins><span class="cx">         {
</span><del>-            ASSERT(varying.isBuiltIn() || !varying.staticUse);
</del><ins>+            case 1:
+                pixelStream &lt;&lt; &quot;.x&quot;;
+                break;
+            case 2:
+                pixelStream &lt;&lt; &quot;.xy&quot;;
+                break;
+            case 3:
+                pixelStream &lt;&lt; &quot;.xyz&quot;;
+                break;
+            case 4:
+                break;
+            default:
+                UNREACHABLE();
</ins><span class="cx">         }
</span><ins>+        pixelStream &lt;&lt; &quot;;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (fragmentShader-&gt;usesDeferredInit())
-    {
-        pixelHLSL += &quot;\n&quot;
-                     &quot;    initializeDeferredGlobals();\n&quot;;
-    }
</del><ins>+    pixelStream &lt;&lt; &quot;\n&quot;
+                &lt;&lt; &quot;    gl_main();\n&quot;
+                &lt;&lt; &quot;\n&quot;
+                &lt;&lt; &quot;    return generateOutput();\n&quot;
+                &lt;&lt; &quot;}\n&quot;;
</ins><span class="cx"> 
</span><del>-    pixelHLSL += &quot;\n&quot;
-                 &quot;    gl_main();\n&quot;
-                 &quot;\n&quot;
-                 &quot;    return generateOutput();\n&quot;
-                 &quot;}\n&quot;;
</del><ins>+    *vertexHLSL = vertexStream.str();
+    *pixelHLSL  = pixelStream.str();
</ins><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DynamicHLSL::defineOutputVariables(ShaderD3D *fragmentShader, std::map&lt;int, VariableLocation&gt; *programOutputVars) const
</del><ins>+std::string DynamicHLSL::generateGeometryShaderPreamble(const VaryingPacking &amp;varyingPacking) const
</ins><span class="cx"> {
</span><del>-    const std::vector&lt;sh::Attribute&gt; &amp;shaderOutputVars = fragmentShader-&gt;getActiveOutputVariables();
</del><ins>+    ASSERT(mRenderer-&gt;getMajorShaderModel() &gt;= 4);
</ins><span class="cx"> 
</span><del>-    for (unsigned int outputVariableIndex = 0; outputVariableIndex &lt; shaderOutputVars.size(); outputVariableIndex++)
-    {
-        const sh::Attribute &amp;outputVariable = shaderOutputVars[outputVariableIndex];
-        const int baseLocation = outputVariable.location == -1 ? 0 : outputVariable.location;
</del><ins>+    std::stringstream preambleStream;
</ins><span class="cx"> 
</span><del>-        ASSERT(outputVariable.staticUse);
</del><ins>+    const auto &amp;builtins = varyingPacking.builtins(SHADER_VERTEX);
</ins><span class="cx"> 
</span><del>-        if (outputVariable.arraySize &gt; 0)
</del><ins>+    preambleStream &lt;&lt; &quot;struct GS_INPUT\n&quot;;
+    generateVaryingLinkHLSL(SHADER_VERTEX, varyingPacking, preambleStream);
+    preambleStream &lt;&lt; &quot;\n&quot;
+                   &lt;&lt; &quot;struct GS_OUTPUT\n&quot;;
+    generateVaryingLinkHLSL(SHADER_GEOMETRY, varyingPacking, preambleStream);
+    preambleStream
+        &lt;&lt; &quot;\n&quot;
+        &lt;&lt; &quot;void copyVertex(inout GS_OUTPUT output, GS_INPUT input, GS_INPUT flatinput)\n&quot;
+        &lt;&lt; &quot;{\n&quot;
+        &lt;&lt; &quot;    output.gl_Position = input.gl_Position;\n&quot;;
+
+    if (builtins.glPointSize.enabled)
+    {
+        preambleStream &lt;&lt; &quot;    output.gl_PointSize = input.gl_PointSize;\n&quot;;
+    }
+
+    for (const PackedVaryingRegister &amp;varyingRegister : varyingPacking.getRegisterList())
+    {
+        preambleStream &lt;&lt; &quot;    output.v&quot; &lt;&lt; varyingRegister.semanticIndex &lt;&lt; &quot; = &quot;;
+        if (varyingRegister.packedVarying-&gt;interpolation == sh::INTERPOLATION_FLAT)
</ins><span class="cx">         {
</span><del>-            for (unsigned int elementIndex = 0; elementIndex &lt; outputVariable.arraySize; elementIndex++)
-            {
-                const int location = baseLocation + elementIndex;
-                ASSERT(programOutputVars-&gt;count(location) == 0);
-                (*programOutputVars)[location] = VariableLocation(outputVariable.name, elementIndex, outputVariableIndex);
-            }
</del><ins>+            preambleStream &lt;&lt; &quot;flat&quot;;
</ins><span class="cx">         }
</span><del>-        else
-        {
-            ASSERT(programOutputVars-&gt;count(baseLocation) == 0);
-            (*programOutputVars)[baseLocation] = VariableLocation(outputVariable.name, GL_INVALID_INDEX, outputVariableIndex);
-        }
</del><ins>+        preambleStream &lt;&lt; &quot;input.v&quot; &lt;&lt; varyingRegister.semanticIndex &lt;&lt; &quot;; \n&quot;;
</ins><span class="cx">     }
</span><del>-}
</del><span class="cx"> 
</span><del>-std::string DynamicHLSL::generateGeometryShaderHLSL(int registers, ShaderD3D *fragmentShader, ShaderD3D *vertexShader) const
-{
-    // for now we only handle point sprite emulation
-    ASSERT(vertexShader-&gt;mUsesPointSize &amp;&amp; mRenderer-&gt;getMajorShaderModel() &gt;= 4);
-    return generatePointSpriteHLSL(registers, fragmentShader, vertexShader);
</del><ins>+    if (builtins.glFragCoord.enabled)
+    {
+        preambleStream &lt;&lt; &quot;    output.gl_FragCoord = input.gl_FragCoord;\n&quot;;
+    }
+
+    // Only write the dx_Position if we aren't using point sprites
+    preambleStream &lt;&lt; &quot;#ifndef ANGLE_POINT_SPRITE_SHADER\n&quot;
+                   &lt;&lt; &quot;    output.dx_Position = input.dx_Position;\n&quot;
+                   &lt;&lt; &quot;#endif  // ANGLE_POINT_SPRITE_SHADER\n&quot;
+                   &lt;&lt; &quot;}\n&quot;;
+
+    return preambleStream.str();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::string DynamicHLSL::generatePointSpriteHLSL(int registers, ShaderD3D *fragmentShader, ShaderD3D *vertexShader) const
</del><ins>+std::string DynamicHLSL::generateGeometryShaderHLSL(gl::PrimitiveType primitiveType,
+                                                    const gl::Data &amp;data,
+                                                    const gl::Program::Data &amp;programData,
+                                                    const bool useViewScale,
+                                                    const std::string &amp;preambleString) const
</ins><span class="cx"> {
</span><del>-    ASSERT(registers &gt;= 0);
-    ASSERT(vertexShader-&gt;mUsesPointSize);
</del><span class="cx">     ASSERT(mRenderer-&gt;getMajorShaderModel() &gt;= 4);
</span><span class="cx"> 
</span><del>-    std::string geomHLSL;
</del><ins>+    std::stringstream shaderStream;
</ins><span class="cx"> 
</span><del>-    const SemanticInfo &amp;inSemantics = getSemanticInfo(registers, true, fragmentShader-&gt;mUsesFragCoord,
-                                                      false, true, false);
-    const SemanticInfo &amp;outSemantics = getSemanticInfo(registers, true, fragmentShader-&gt;mUsesFragCoord,
-                                                       fragmentShader-&gt;mUsesPointCoord, true, false);
</del><ins>+    const bool pointSprites   = (primitiveType == PRIMITIVE_POINTS);
+    const bool usesPointCoord = preambleString.find(&quot;gl_PointCoord&quot;) != std::string::npos;
</ins><span class="cx"> 
</span><del>-    std::string varyingHLSL = generateVaryingHLSL(vertexShader);
-    std::string inLinkHLSL = generateVaryingLinkHLSL(inSemantics, varyingHLSL);
-    std::string outLinkHLSL = generateVaryingLinkHLSL(outSemantics, varyingHLSL);
</del><ins>+    const char *inputPT  = nullptr;
+    const char *outputPT = nullptr;
+    int inputSize        = 0;
+    int maxVertexOutput  = 0;
</ins><span class="cx"> 
</span><del>-    // TODO(geofflang): use context's caps
-    geomHLSL += &quot;uniform float4 dx_ViewCoords : register(c1);\n&quot;
-                &quot;\n&quot;
-                &quot;struct GS_INPUT\n&quot; + inLinkHLSL + &quot;\n&quot; +
-                &quot;struct GS_OUTPUT\n&quot; + outLinkHLSL + &quot;\n&quot; +
-                &quot;\n&quot;
-                &quot;static float2 pointSpriteCorners[] = \n&quot;
-                &quot;{\n&quot;
-                &quot;    float2( 0.5f, -0.5f),\n&quot;
-                &quot;    float2( 0.5f,  0.5f),\n&quot;
-                &quot;    float2(-0.5f, -0.5f),\n&quot;
-                &quot;    float2(-0.5f,  0.5f)\n&quot;
-                &quot;};\n&quot;
-                &quot;\n&quot;
-                &quot;static float2 pointSpriteTexcoords[] = \n&quot;
-                &quot;{\n&quot;
-                &quot;    float2(1.0f, 1.0f),\n&quot;
-                &quot;    float2(1.0f, 0.0f),\n&quot;
-                &quot;    float2(0.0f, 1.0f),\n&quot;
-                &quot;    float2(0.0f, 0.0f)\n&quot;
-                &quot;};\n&quot;
-                &quot;\n&quot;
-                &quot;static float minPointSize = &quot; + Str(static_cast&lt;int&gt;(mRenderer-&gt;getRendererCaps().minAliasedPointSize)) + &quot;.0f;\n&quot;
-                &quot;static float maxPointSize = &quot; + Str(static_cast&lt;int&gt;(mRenderer-&gt;getRendererCaps().maxAliasedPointSize)) + &quot;.0f;\n&quot;
-                &quot;\n&quot;
-                &quot;[maxvertexcount(4)]\n&quot;
-                &quot;void main(point GS_INPUT input[1], inout TriangleStream&lt;GS_OUTPUT&gt; outStream)\n&quot;
-                &quot;{\n&quot;
-                &quot;    GS_OUTPUT output = (GS_OUTPUT)0;\n&quot;
-                &quot;    output.gl_Position = input[0].gl_Position;\n&quot;
-                &quot;    output.gl_PointSize = input[0].gl_PointSize;\n&quot;;
</del><ins>+    switch (primitiveType)
+    {
+        case PRIMITIVE_POINTS:
+            inputPT         = &quot;point&quot;;
+            outputPT        = &quot;Triangle&quot;;
+            inputSize       = 1;
+            maxVertexOutput = 4;
+            break;
</ins><span class="cx"> 
</span><del>-    for (int r = 0; r &lt; registers; r++)
</del><ins>+        case PRIMITIVE_LINES:
+        case PRIMITIVE_LINE_STRIP:
+        case PRIMITIVE_LINE_LOOP:
+            inputPT         = &quot;line&quot;;
+            outputPT        = &quot;Line&quot;;
+            inputSize       = 2;
+            maxVertexOutput = 2;
+            break;
+
+        case PRIMITIVE_TRIANGLES:
+        case PRIMITIVE_TRIANGLE_STRIP:
+        case PRIMITIVE_TRIANGLE_FAN:
+            inputPT         = &quot;triangle&quot;;
+            outputPT        = &quot;Triangle&quot;;
+            inputSize       = 3;
+            maxVertexOutput = 3;
+            break;
+
+        default:
+            UNREACHABLE();
+            break;
+    }
+
+    if (pointSprites)
</ins><span class="cx">     {
</span><del>-        geomHLSL += &quot;    output.v&quot; + Str(r) + &quot; = input[0].v&quot; + Str(r) + &quot;;\n&quot;;
</del><ins>+        shaderStream &lt;&lt; &quot;#define ANGLE_POINT_SPRITE_SHADER\n&quot;
+                        &quot;\n&quot;
+                        &quot;uniform float4 dx_ViewCoords : register(c1);\n&quot;;
+
+        if (useViewScale)
+        {
+            shaderStream &lt;&lt; &quot;uniform float2 dx_ViewScale : register(c3);\n&quot;;
+        }
+
+        shaderStream &lt;&lt; &quot;\n&quot;
+                        &quot;static float2 pointSpriteCorners[] = \n&quot;
+                        &quot;{\n&quot;
+                        &quot;    float2( 0.5f, -0.5f),\n&quot;
+                        &quot;    float2( 0.5f,  0.5f),\n&quot;
+                        &quot;    float2(-0.5f, -0.5f),\n&quot;
+                        &quot;    float2(-0.5f,  0.5f)\n&quot;
+                        &quot;};\n&quot;
+                        &quot;\n&quot;
+                        &quot;static float2 pointSpriteTexcoords[] = \n&quot;
+                        &quot;{\n&quot;
+                        &quot;    float2(1.0f, 1.0f),\n&quot;
+                        &quot;    float2(1.0f, 0.0f),\n&quot;
+                        &quot;    float2(0.0f, 1.0f),\n&quot;
+                        &quot;    float2(0.0f, 0.0f)\n&quot;
+                        &quot;};\n&quot;
+                        &quot;\n&quot;
+                        &quot;static float minPointSize = &quot;
+                     &lt;&lt; static_cast&lt;int&gt;(data.caps-&gt;minAliasedPointSize)
+                     &lt;&lt; &quot;.0f;\n&quot;
+                        &quot;static float maxPointSize = &quot;
+                     &lt;&lt; static_cast&lt;int&gt;(data.caps-&gt;maxAliasedPointSize) &lt;&lt; &quot;.0f;\n&quot;
+                     &lt;&lt; &quot;\n&quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (fragmentShader-&gt;mUsesFragCoord)
</del><ins>+    shaderStream &lt;&lt; preambleString &lt;&lt; &quot;\n&quot;
+                 &lt;&lt; &quot;[maxvertexcount(&quot; &lt;&lt; maxVertexOutput &lt;&lt; &quot;)]\n&quot;
+                 &lt;&lt; &quot;void main(&quot; &lt;&lt; inputPT &lt;&lt; &quot; GS_INPUT input[&quot; &lt;&lt; inputSize &lt;&lt; &quot;], &quot;;
+
+    if (primitiveType == PRIMITIVE_TRIANGLE_STRIP)
</ins><span class="cx">     {
</span><del>-        geomHLSL += &quot;    output.gl_FragCoord = input[0].gl_FragCoord;\n&quot;;
</del><ins>+        shaderStream &lt;&lt; &quot;uint primitiveID : SV_PrimitiveID, &quot;;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    geomHLSL += &quot;    \n&quot;
-                &quot;    float gl_PointSize = clamp(input[0].gl_PointSize, minPointSize, maxPointSize);\n&quot;
-                &quot;    float4 dx_Position = input[0].dx_Position;\n&quot;
-                &quot;    float2 viewportScale = float2(1.0f / dx_ViewCoords.x, 1.0f / dx_ViewCoords.y) * dx_Position.w;\n&quot;;
</del><ins>+    shaderStream &lt;&lt; &quot; inout &quot; &lt;&lt; outputPT &lt;&lt; &quot;Stream&lt;GS_OUTPUT&gt; outStream)\n&quot;
+                 &lt;&lt; &quot;{\n&quot;
+                 &lt;&lt; &quot;    GS_OUTPUT output = (GS_OUTPUT)0;\n&quot;;
</ins><span class="cx"> 
</span><del>-    for (int corner = 0; corner &lt; 4; corner++)
</del><ins>+    if (primitiveType == PRIMITIVE_TRIANGLE_STRIP)
</ins><span class="cx">     {
</span><del>-        geomHLSL += &quot;    \n&quot;
-                    &quot;    output.dx_Position = dx_Position + float4(pointSpriteCorners[&quot; + Str(corner) + &quot;] * viewportScale * gl_PointSize, 0.0f, 0.0f);\n&quot;;
</del><ins>+        shaderStream &lt;&lt; &quot;    uint lastVertexIndex = (primitiveID % 2 == 0 ? 2 : 1);\n&quot;;
+    }
+    else
+    {
+        shaderStream &lt;&lt; &quot;    uint lastVertexIndex = &quot; &lt;&lt; (inputSize - 1) &lt;&lt; &quot;;\n&quot;;
+    }
</ins><span class="cx"> 
</span><del>-        if (fragmentShader-&gt;mUsesPointCoord)
</del><ins>+    for (int vertexIndex = 0; vertexIndex &lt; inputSize; ++vertexIndex)
+    {
+        shaderStream &lt;&lt; &quot;    copyVertex(output, input[&quot; &lt;&lt; vertexIndex
+                     &lt;&lt; &quot;], input[lastVertexIndex]);\n&quot;;
+
+        if (!pointSprites)
</ins><span class="cx">         {
</span><del>-            geomHLSL += &quot;    output.gl_PointCoord = pointSpriteTexcoords[&quot; + Str(corner) + &quot;];\n&quot;;
</del><ins>+            ASSERT(inputSize == maxVertexOutput);
+            shaderStream &lt;&lt; &quot;    outStream.Append(output);\n&quot;;
</ins><span class="cx">         }
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-        geomHLSL += &quot;    outStream.Append(output);\n&quot;;
</del><ins>+    if (pointSprites)
+    {
+        shaderStream &lt;&lt; &quot;\n&quot;
+                        &quot;    float4 dx_Position = input[0].dx_Position;\n&quot;
+                        &quot;    float gl_PointSize = clamp(input[0].gl_PointSize, minPointSize, &quot;
+                        &quot;maxPointSize);\n&quot;
+                        &quot;    float2 viewportScale = float2(1.0f / dx_ViewCoords.x, 1.0f / &quot;
+                        &quot;dx_ViewCoords.y) * dx_Position.w;\n&quot;;
+
+        for (int corner = 0; corner &lt; 4; corner++)
+        {
+            if (useViewScale)
+            {
+                shaderStream &lt;&lt; &quot;    \n&quot;
+                                &quot;    output.dx_Position = dx_Position + float4(1.0f, &quot;
+                                &quot;-dx_ViewScale.y, 1.0f, 1.0f)&quot;
+                                &quot;        * float4(pointSpriteCorners[&quot;
+                             &lt;&lt; corner &lt;&lt; &quot;] * viewportScale * gl_PointSize, 0.0f, 0.0f);\n&quot;;
+            }
+            else
+            {
+                shaderStream &lt;&lt; &quot;\n&quot;
+                                &quot;    output.dx_Position = dx_Position + float4(pointSpriteCorners[&quot;
+                             &lt;&lt; corner &lt;&lt; &quot;] * viewportScale * gl_PointSize, 0.0f, 0.0f);\n&quot;;
+            }
+
+            if (usesPointCoord)
+            {
+                shaderStream &lt;&lt; &quot;    output.gl_PointCoord = pointSpriteTexcoords[&quot; &lt;&lt; corner
+                             &lt;&lt; &quot;];\n&quot;;
+            }
+
+            shaderStream &lt;&lt; &quot;    outStream.Append(output);\n&quot;;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    geomHLSL += &quot;    \n&quot;
-                &quot;    outStream.RestartStrip();\n&quot;
-                &quot;}\n&quot;;
</del><ins>+    shaderStream &lt;&lt; &quot;    \n&quot;
+                    &quot;    outStream.RestartStrip();\n&quot;
+                    &quot;}\n&quot;;
</ins><span class="cx"> 
</span><del>-    return geomHLSL;
</del><ins>+    return shaderStream.str();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // This method needs to match OutputHLSL::decorate
</span><span class="lines">@@ -1217,9 +998,12 @@
</span><span class="cx">     return name;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::string DynamicHLSL::generateAttributeConversionHLSL(const VertexFormat &amp;vertexFormat, const sh::ShaderVariable &amp;shaderAttrib) const
</del><ins>+std::string DynamicHLSL::generateAttributeConversionHLSL(
+    gl::VertexFormatType vertexFormatType,
+    const sh::ShaderVariable &amp;shaderAttrib) const
</ins><span class="cx"> {
</span><del>-    std::string attribString = &quot;input.&quot; + decorateVariable(shaderAttrib.name);
</del><ins>+    const gl::VertexFormat &amp;vertexFormat = gl::GetVertexFormatFromType(vertexFormatType);
+    std::string attribString             = &quot;input.&quot; + decorateVariable(shaderAttrib.name);
</ins><span class="cx"> 
</span><span class="cx">     // Matrix
</span><span class="cx">     if (IsMatrixType(shaderAttrib.type))
</span><span class="lines">@@ -1228,15 +1012,16 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     GLenum shaderComponentType = VariableComponentType(shaderAttrib.type);
</span><del>-    int shaderComponentCount = VariableComponentCount(shaderAttrib.type);
</del><ins>+    int shaderComponentCount   = VariableComponentCount(shaderAttrib.type);
</ins><span class="cx"> 
</span><span class="cx">     // Perform integer to float conversion (if necessary)
</span><del>-    bool requiresTypeConversion = (shaderComponentType == GL_FLOAT &amp;&amp; vertexFormat.mType != GL_FLOAT);
</del><ins>+    bool requiresTypeConversion =
+        (shaderComponentType == GL_FLOAT &amp;&amp; vertexFormat.type != GL_FLOAT);
</ins><span class="cx"> 
</span><span class="cx">     if (requiresTypeConversion)
</span><span class="cx">     {
</span><span class="cx">         // TODO: normalization for 32-bit integer formats
</span><del>-        ASSERT(!vertexFormat.mNormalized &amp;&amp; !vertexFormat.mPureInteger);
</del><ins>+        ASSERT(!vertexFormat.normalized &amp;&amp; !vertexFormat.pureInteger);
</ins><span class="cx">         return &quot;float&quot; + Str(shaderComponentCount) + &quot;(&quot; + attribString + &quot;)&quot;;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1244,22 +1029,57 @@
</span><span class="cx">     return attribString;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DynamicHLSL::getInputLayoutSignature(const VertexFormat inputLayout[], GLenum signature[]) const
</del><ins>+void DynamicHLSL::getPixelShaderOutputKey(const gl::Data &amp;data,
+                                          const gl::Program::Data &amp;programData,
+                                          const ProgramD3DMetadata &amp;metadata,
+                                          std::vector&lt;PixelShaderOutputVariable&gt; *outPixelShaderKey)
</ins><span class="cx"> {
</span><del>-    for (size_t inputIndex = 0; inputIndex &lt; MAX_VERTEX_ATTRIBS; inputIndex++)
-    {
-        const VertexFormat &amp;vertexFormat = inputLayout[inputIndex];
</del><ins>+    // Two cases when writing to gl_FragColor and using ESSL 1.0:
+    // - with a 3.0 context, the output color is copied to channel 0
+    // - with a 2.0 context, the output color is broadcast to all channels
+    bool broadcast = metadata.usesBroadcast(data);
+    const unsigned int numRenderTargets =
+        (broadcast || metadata.usesMultipleFragmentOuts() ? data.caps-&gt;maxDrawBuffers : 1);
</ins><span class="cx"> 
</span><del>-        if (vertexFormat.mType == GL_NONE)
</del><ins>+    if (metadata.getMajorShaderVersion() &lt; 300)
+    {
+        for (unsigned int renderTargetIndex = 0; renderTargetIndex &lt; numRenderTargets;
+             renderTargetIndex++)
</ins><span class="cx">         {
</span><del>-            signature[inputIndex] = GL_NONE;
</del><ins>+            PixelShaderOutputVariable outputKeyVariable;
+            outputKeyVariable.type = GL_FLOAT_VEC4;
+            outputKeyVariable.name = &quot;gl_Color&quot; + Str(renderTargetIndex);
+            outputKeyVariable.source =
+                broadcast ? &quot;gl_Color[0]&quot; : &quot;gl_Color[&quot; + Str(renderTargetIndex) + &quot;]&quot;;
+            outputKeyVariable.outputIndex = renderTargetIndex;
+
+            outPixelShaderKey-&gt;push_back(outputKeyVariable);
</ins><span class="cx">         }
</span><del>-        else
</del><ins>+    }
+    else
+    {
+        const auto &amp;shaderOutputVars =
+            metadata.getFragmentShader()-&gt;getData().getActiveOutputVariables();
+
+        for (auto outputPair : programData.getOutputVariables())
</ins><span class="cx">         {
</span><del>-            bool gpuConverted = ((mRenderer-&gt;getVertexConversionType(vertexFormat) &amp; VERTEX_CONVERT_GPU) != 0);
-            signature[inputIndex] = (gpuConverted ? GL_TRUE : GL_FALSE);
</del><ins>+            const VariableLocation &amp;outputLocation   = outputPair.second;
+            const sh::ShaderVariable &amp;outputVariable = shaderOutputVars[outputLocation.index];
+            const std::string &amp;variableName = &quot;out_&quot; + outputLocation.name;
+            const std::string &amp;elementString =
+                (outputLocation.element == GL_INVALID_INDEX ? &quot;&quot; : Str(outputLocation.element));
+
+            ASSERT(outputVariable.staticUse);
+
+            PixelShaderOutputVariable outputKeyVariable;
+            outputKeyVariable.type        = outputVariable.type;
+            outputKeyVariable.name        = variableName + elementString;
+            outputKeyVariable.source      = variableName + ArrayString(outputLocation.element);
+            outputKeyVariable.outputIndex = outputPair.first;
+
+            outPixelShaderKey-&gt;push_back(outputKeyVariable);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dDynamicHLSLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DynamicHLSL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DynamicHLSL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/DynamicHLSL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,14 +9,16 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
</span><span class="cx"> 
</span><ins>+#include &lt;map&gt;
+#include &lt;vector&gt;
+
+#include &quot;angle_gl.h&quot;
</ins><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Constants.h&quot;
</span><ins>+#include &quot;libANGLE/Program.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</ins><span class="cx"> 
</span><del>-#include &quot;angle_gl.h&quot;
-
-#include &lt;vector&gt;
-#include &lt;map&gt;
-
</del><span class="cx"> namespace sh
</span><span class="cx"> {
</span><span class="cx"> struct Attribute;
</span><span class="lines">@@ -27,20 +29,17 @@
</span><span class="cx"> {
</span><span class="cx"> class InfoLog;
</span><span class="cx"> struct VariableLocation;
</span><del>-struct LinkedVarying;
</del><span class="cx"> struct VertexAttribute;
</span><del>-struct VertexFormat;
-struct PackedVarying;
</del><span class="cx"> struct Data;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><del>-class RendererD3D;
</del><ins>+struct PackedVarying;
+class ProgramD3DMetadata;
</ins><span class="cx"> class ShaderD3D;
</span><ins>+class VaryingPacking;
</ins><span class="cx"> 
</span><del>-typedef const gl::PackedVarying *VaryingPacking[gl::IMPLEMENTATION_MAX_VARYING_VECTORS][4];
-
</del><span class="cx"> struct PixelShaderOutputVariable
</span><span class="cx"> {
</span><span class="cx">     GLenum type;
</span><span class="lines">@@ -54,47 +53,52 @@
</span><span class="cx">   public:
</span><span class="cx">     explicit DynamicHLSL(RendererD3D *const renderer);
</span><span class="cx"> 
</span><del>-    int packVaryings(gl::InfoLog &amp;infoLog, VaryingPacking packing, ShaderD3D *fragmentShader,
-                     ShaderD3D *vertexShader, const std::vector&lt;std::string&gt;&amp; transformFeedbackVaryings);
-    std::string generateVertexShaderForInputLayout(const std::string &amp;sourceShader,
-                                                   const gl::VertexFormat inputLayout[],
-                                                   const std::vector&lt;sh::Attribute&gt; &amp;shaderAttributes) const;
-    std::string generatePixelShaderForOutputSignature(const std::string &amp;sourceShader, const std::vector&lt;PixelShaderOutputVariable&gt; &amp;outputVariables,
-                                                      bool usesFragDepth, const std::vector&lt;GLenum&gt; &amp;outputLayout) const;
-    bool generateShaderLinkHLSL(const gl::Data &amp;data, gl::InfoLog &amp;infoLog, int registers,
-                                const VaryingPacking packing,
-                                std::string &amp;pixelHLSL, std::string &amp;vertexHLSL,
-                                ShaderD3D *fragmentShader, ShaderD3D *vertexShader,
-                                const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings,
-                                std::vector&lt;gl::LinkedVarying&gt; *linkedVaryings,
-                                std::map&lt;int, gl::VariableLocation&gt; *programOutputVars,
-                                std::vector&lt;PixelShaderOutputVariable&gt; *outPixelShaderKey,
-                                bool *outUsesFragDepth) const;
</del><ins>+    std::string generateVertexShaderForInputLayout(
+        const std::string &amp;sourceShader,
+        const gl::InputLayout &amp;inputLayout,
+        const std::vector&lt;sh::Attribute&gt; &amp;shaderAttributes) const;
+    std::string generatePixelShaderForOutputSignature(
+        const std::string &amp;sourceShader,
+        const std::vector&lt;PixelShaderOutputVariable&gt; &amp;outputVariables,
+        bool usesFragDepth,
+        const std::vector&lt;GLenum&gt; &amp;outputLayout) const;
+    bool generateShaderLinkHLSL(const gl::Data &amp;data,
+                                const gl::Program::Data &amp;programData,
+                                const ProgramD3DMetadata &amp;programMetadata,
+                                const VaryingPacking &amp;varyingPacking,
+                                std::string *pixelHLSL,
+                                std::string *vertexHLSL) const;
</ins><span class="cx"> 
</span><del>-    std::string generateGeometryShaderHLSL(int registers, ShaderD3D *fragmentShader, ShaderD3D *vertexShader) const;
-    void getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const;
</del><ins>+    std::string generateGeometryShaderPreamble(const VaryingPacking &amp;varyingPacking) const;
</ins><span class="cx"> 
</span><ins>+    std::string generateGeometryShaderHLSL(gl::PrimitiveType primitiveType,
+                                           const gl::Data &amp;data,
+                                           const gl::Program::Data &amp;programData,
+                                           const bool useViewScale,
+                                           const std::string &amp;preambleString) const;
+
+    void getPixelShaderOutputKey(const gl::Data &amp;data,
+                                 const gl::Program::Data &amp;programData,
+                                 const ProgramD3DMetadata &amp;metadata,
+                                 std::vector&lt;PixelShaderOutputVariable&gt; *outPixelShaderKey);
+
</ins><span class="cx">   private:
</span><span class="cx">     RendererD3D *const mRenderer;
</span><span class="cx"> 
</span><del>-    struct SemanticInfo;
</del><ins>+    void generateVaryingLinkHLSL(ShaderType shaderType,
+                                 const VaryingPacking &amp;varyingPacking,
+                                 std::stringstream &amp;linkStream) const;
+    void generateVaryingHLSL(const VaryingPacking &amp;varyingPacking,
+                             std::stringstream &amp;hlslStream) const;
</ins><span class="cx"> 
</span><del>-    std::string getVaryingSemantic(bool pointSize) const;
-    SemanticInfo getSemanticInfo(int startRegisters, bool position, bool fragCoord, bool pointCoord,
-                                 bool pointSize, bool pixelShader) const;
-    std::string generateVaryingLinkHLSL(const SemanticInfo &amp;info, const std::string &amp;varyingHLSL) const;
-    std::string generateVaryingHLSL(const ShaderD3D *shader) const;
-    void storeUserLinkedVaryings(const ShaderD3D *vertexShader, std::vector&lt;gl::LinkedVarying&gt; *linkedVaryings) const;
-    void storeBuiltinLinkedVaryings(const SemanticInfo &amp;info, std::vector&lt;gl::LinkedVarying&gt; *linkedVaryings) const;
-    void defineOutputVariables(ShaderD3D *fragmentShader, std::map&lt;int, gl::VariableLocation&gt; *programOutputVars) const;
-    std::string generatePointSpriteHLSL(int registers, ShaderD3D *fragmentShader, ShaderD3D *vertexShader) const;
-
</del><span class="cx">     // Prepend an underscore
</span><span class="cx">     static std::string decorateVariable(const std::string &amp;name);
</span><span class="cx"> 
</span><del>-    std::string generateAttributeConversionHLSL(const gl::VertexFormat &amp;vertexFormat, const sh::ShaderVariable &amp;shaderAttrib) const;
</del><ins>+    std::string generateAttributeConversionHLSL(gl::VertexFormatType vertexFormatType,
+                                                const sh::ShaderVariable &amp;shaderAttrib) const;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+std::string GetVaryingSemantic(int majorShaderModel, bool programUsesPointSize);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-#endif // LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
</del><ins>+#endif  // LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dEGLImageD3Dcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/EGLImageD3D.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/EGLImageD3D.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/EGLImageD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,135 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// EGLImageD3D.cpp: Implements the rx::EGLImageD3D class, the D3D implementation of EGL images
+
+#include &quot;libANGLE/renderer/d3d/EGLImageD3D.h&quot;
+
+#include &quot;common/debug.h&quot;
+#include &quot;common/utilities.h&quot;
+#include &quot;libANGLE/AttributeMap.h&quot;
+#include &quot;libANGLE/Texture.h&quot;
+#include &quot;libANGLE/renderer/d3d/RenderbufferD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/RenderTargetD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/TextureD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/TextureStorage.h&quot;
+
+#include &lt;EGL/eglext.h&gt;
+
+namespace rx
+{
+static gl::ImageIndex GetImageIndex(GLenum target, size_t mip, size_t layer)
+{
+    if (target == GL_TEXTURE_3D)
+    {
+        return gl::ImageIndex::Make3D(static_cast&lt;GLint&gt;(mip), static_cast&lt;GLint&gt;(layer));
+    }
+    else
+    {
+        ASSERT(layer == 0);
+        return gl::ImageIndex::MakeGeneric(target, static_cast&lt;GLint&gt;(mip));
+    }
+}
+
+EGLImageD3D::EGLImageD3D(RendererD3D *renderer,
+                         EGLenum target,
+                         egl::ImageSibling *buffer,
+                         const egl::AttributeMap &amp;attribs)
+    : mRenderer(renderer), mBuffer(buffer), mAttachmentBuffer(nullptr), mRenderTarget(nullptr)
+{
+    ASSERT(renderer != nullptr);
+    ASSERT(buffer != nullptr);
+
+    if (egl::IsTextureTarget(target))
+    {
+        mAttachmentBuffer = GetImplAs&lt;TextureD3D&gt;(GetAs&lt;gl::Texture&gt;(buffer));
+        mAttachmentTarget = gl::FramebufferAttachment::Target(
+            GL_NONE, GetImageIndex(egl_gl::EGLImageTargetToGLTextureTarget(target),
+                                   attribs.get(EGL_GL_TEXTURE_LEVEL_KHR, 0),
+                                   attribs.get(EGL_GL_TEXTURE_ZOFFSET_KHR, 0)));
+    }
+    else if (egl::IsRenderbufferTarget(target))
+    {
+        mAttachmentBuffer = GetImplAs&lt;RenderbufferD3D&gt;(GetAs&lt;gl::Renderbuffer&gt;(buffer));
+        mAttachmentTarget =
+            gl::FramebufferAttachment::Target(GL_NONE, gl::ImageIndex::MakeInvalid());
+    }
+    else
+    {
+        UNREACHABLE();
+    }
+}
+
+EGLImageD3D::~EGLImageD3D()
+{
+    SafeDelete(mRenderTarget);
+}
+
+egl::Error EGLImageD3D::initialize()
+{
+    return egl::Error(EGL_SUCCESS);
+}
+
+gl::Error EGLImageD3D::orphan(egl::ImageSibling *sibling)
+{
+    if (sibling == mBuffer)
+    {
+        gl::Error error = copyToLocalRendertarget();
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error EGLImageD3D::getRenderTarget(RenderTargetD3D **outRT) const
+{
+    if (mAttachmentBuffer)
+    {
+        FramebufferAttachmentRenderTarget *rt = nullptr;
+        gl::Error error = mAttachmentBuffer-&gt;getAttachmentRenderTarget(mAttachmentTarget, &amp;rt);
+        if (error.isError())
+        {
+            return error;
+        }
+
+        *outRT = static_cast&lt;RenderTargetD3D *&gt;(rt);
+        return gl::Error(GL_NO_ERROR);
+    }
+    else
+    {
+        ASSERT(mRenderTarget);
+        *outRT = mRenderTarget;
+        return gl::Error(GL_NO_ERROR);
+    }
+}
+
+gl::Error EGLImageD3D::copyToLocalRendertarget()
+{
+    ASSERT(mBuffer != nullptr);
+    ASSERT(mAttachmentBuffer != nullptr);
+    ASSERT(mRenderTarget == nullptr);
+
+    RenderTargetD3D *curRenderTarget = nullptr;
+    gl::Error error = getRenderTarget(&amp;curRenderTarget);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    // This only currently applies do D3D11, where it invalidates FBOs with this Image attached.
+    curRenderTarget-&gt;signalDirty();
+
+    // Clear the source image buffers
+    mBuffer           = nullptr;
+    mAttachmentBuffer = nullptr;
+
+    return mRenderer-&gt;createRenderTargetCopy(curRenderTarget, &amp;mRenderTarget);
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dEGLImageD3Dh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/EGLImageD3D.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/EGLImageD3D.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/EGLImageD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,56 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// EGLImageD3D.h: Defines the rx::EGLImageD3D class, the D3D implementation of EGL images
+
+#ifndef LIBANGLE_RENDERER_D3D_EGLIMAGED3D_H_
+#define LIBANGLE_RENDERER_D3D_EGLIMAGED3D_H_
+
+#include &quot;libANGLE/FramebufferAttachment.h&quot;
+#include &quot;libANGLE/renderer/ImageImpl.h&quot;
+
+namespace egl
+{
+class AttributeMap;
+}
+
+namespace rx
+{
+class TextureD3D;
+class RenderbufferD3D;
+class RendererD3D;
+class RenderTargetD3D;
+
+class EGLImageD3D final : public ImageImpl
+{
+  public:
+    EGLImageD3D(RendererD3D *renderer,
+                EGLenum target,
+                egl::ImageSibling *buffer,
+                const egl::AttributeMap &amp;attribs);
+    ~EGLImageD3D() override;
+
+    egl::Error initialize() override;
+
+    gl::Error orphan(egl::ImageSibling *sibling) override;
+
+    gl::Error getRenderTarget(RenderTargetD3D **outRT) const;
+
+  private:
+    gl::Error copyToLocalRendertarget();
+
+    RendererD3D *mRenderer;
+
+    egl::ImageSibling *mBuffer;
+
+    gl::FramebufferAttachment::Target mAttachmentTarget;
+    FramebufferAttachmentObjectImpl *mAttachmentBuffer;
+
+    RenderTargetD3D *mRenderTarget;
+};
+}
+
+#endif  // LIBANGLE_RENDERER_D3D_EGLIMAGED3D_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dFramebufferD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/FramebufferD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/FramebufferD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/FramebufferD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,6 +8,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/FramebufferD3D.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/BitSetIterator.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><span class="lines">@@ -53,7 +54,7 @@
</span><span class="cx">     const gl::Framebuffer *framebufferObject = state.getDrawFramebuffer();
</span><span class="cx">     if (mask &amp; GL_COLOR_BUFFER_BIT)
</span><span class="cx">     {
</span><del>-        if (framebufferObject-&gt;hasEnabledColorAttachment())
</del><ins>+        if (framebufferObject-&gt;hasEnabledDrawBuffer())
</ins><span class="cx">         {
</span><span class="cx">             for (unsigned int i = 0; i &lt; ArraySize(clearParams.clearColor); i++)
</span><span class="cx">             {
</span><span class="lines">@@ -85,67 +86,28 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FramebufferD3D::FramebufferD3D(const gl::Framebuffer::Data &amp;data, RendererD3D *renderer)
</span><del>-    : FramebufferImpl(data),
-      mRenderer(renderer),
-      mColorAttachmentsForRender(mData.getColorAttachments().size(), nullptr),
-      mInvalidateColorAttachmentCache(true)
</del><ins>+    : FramebufferImpl(data), mRenderer(renderer)
</ins><span class="cx"> {
</span><del>-    ASSERT(mRenderer != nullptr);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FramebufferD3D::~FramebufferD3D()
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FramebufferD3D::onUpdateColorAttachment(size_t /*index*/)
-{
-    mInvalidateColorAttachmentCache = true;
-}
-
-void FramebufferD3D::onUpdateDepthAttachment()
-{
-}
-
-void FramebufferD3D::onUpdateStencilAttachment()
-{
-}
-
-void FramebufferD3D::onUpdateDepthStencilAttachment()
-{
-}
-
-void FramebufferD3D::setDrawBuffers(size_t, const GLenum *)
-{
-    mInvalidateColorAttachmentCache = true;
-}
-
-void FramebufferD3D::setReadBuffer(GLenum)
-{
-}
-
-gl::Error FramebufferD3D::invalidate(size_t, const GLenum *)
-{
-    // No-op in D3D
-    return gl::Error(GL_NO_ERROR);
-}
-
-gl::Error FramebufferD3D::invalidateSub(size_t, const GLenum *, const gl::Rectangle &amp;)
-{
-    // No-op in D3D
-    return gl::Error(GL_NO_ERROR);
-}
-
</del><span class="cx"> gl::Error FramebufferD3D::clear(const gl::Data &amp;data, GLbitfield mask)
</span><span class="cx"> {
</span><span class="cx">     const gl::State &amp;state = *data.state;
</span><span class="cx">     ClearParameters clearParams = GetClearParameters(state, mask);
</span><del>-    return clear(state, clearParams);
</del><ins>+    return clear(data, clearParams);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferD3D::clearBufferfv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLfloat *values)
</del><ins>+gl::Error FramebufferD3D::clearBufferfv(const gl::Data &amp;data,
+                                        GLenum buffer,
+                                        GLint drawbuffer,
+                                        const GLfloat *values)
</ins><span class="cx"> {
</span><span class="cx">     // glClearBufferfv can be called to clear the color buffer or depth buffer
</span><del>-    ClearParameters clearParams = GetClearParameters(state, 0);
</del><ins>+    ClearParameters clearParams = GetClearParameters(*data.state, 0);
</ins><span class="cx"> 
</span><span class="cx">     if (buffer == GL_COLOR)
</span><span class="cx">     {
</span><span class="lines">@@ -163,13 +125,16 @@
</span><span class="cx">         clearParams.depthClearValue = values[0];
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return clear(state, clearParams);
</del><ins>+    return clear(data, clearParams);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferD3D::clearBufferuiv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLuint *values)
</del><ins>+gl::Error FramebufferD3D::clearBufferuiv(const gl::Data &amp;data,
+                                         GLenum buffer,
+                                         GLint drawbuffer,
+                                         const GLuint *values)
</ins><span class="cx"> {
</span><span class="cx">     // glClearBufferuiv can only be called to clear a color buffer
</span><del>-    ClearParameters clearParams = GetClearParameters(state, 0);
</del><ins>+    ClearParameters clearParams = GetClearParameters(*data.state, 0);
</ins><span class="cx">     for (unsigned int i = 0; i &lt; ArraySize(clearParams.clearColor); i++)
</span><span class="cx">     {
</span><span class="cx">         clearParams.clearColor[i] = (drawbuffer == static_cast&lt;int&gt;(i));
</span><span class="lines">@@ -177,13 +142,16 @@
</span><span class="cx">     clearParams.colorUIClearValue = gl::ColorUI(values[0], values[1], values[2], values[3]);
</span><span class="cx">     clearParams.colorClearType = GL_UNSIGNED_INT;
</span><span class="cx"> 
</span><del>-    return clear(state, clearParams);
</del><ins>+    return clear(data, clearParams);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferD3D::clearBufferiv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLint *values)
</del><ins>+gl::Error FramebufferD3D::clearBufferiv(const gl::Data &amp;data,
+                                        GLenum buffer,
+                                        GLint drawbuffer,
+                                        const GLint *values)
</ins><span class="cx"> {
</span><span class="cx">     // glClearBufferiv can be called to clear the color buffer or stencil buffer
</span><del>-    ClearParameters clearParams = GetClearParameters(state, 0);
</del><ins>+    ClearParameters clearParams = GetClearParameters(*data.state, 0);
</ins><span class="cx"> 
</span><span class="cx">     if (buffer == GL_COLOR)
</span><span class="cx">     {
</span><span class="lines">@@ -201,19 +169,23 @@
</span><span class="cx">         clearParams.stencilClearValue = values[1];
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return clear(state, clearParams);
</del><ins>+    return clear(data, clearParams);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferD3D::clearBufferfi(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
</del><ins>+gl::Error FramebufferD3D::clearBufferfi(const gl::Data &amp;data,
+                                        GLenum buffer,
+                                        GLint drawbuffer,
+                                        GLfloat depth,
+                                        GLint stencil)
</ins><span class="cx"> {
</span><span class="cx">     // glClearBufferfi can only be called to clear a depth stencil buffer
</span><del>-    ClearParameters clearParams = GetClearParameters(state, 0);
</del><ins>+    ClearParameters clearParams   = GetClearParameters(*data.state, 0);
</ins><span class="cx">     clearParams.clearDepth = true;
</span><span class="cx">     clearParams.depthClearValue = depth;
</span><span class="cx">     clearParams.clearStencil = true;
</span><span class="cx">     clearParams.stencilClearValue = stencil;
</span><span class="cx"> 
</span><del>-    return clear(state, clearParams);
</del><ins>+    return clear(data, clearParams);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLenum FramebufferD3D::getImplementationColorReadFormat() const
</span><span class="lines">@@ -264,17 +236,15 @@
</span><span class="cx"> {
</span><span class="cx">     const gl::PixelPackState &amp;packState = state.getPackState();
</span><span class="cx"> 
</span><del>-    if (packState.rowLength != 0 || packState.skipRows != 0 || packState.skipPixels != 0)
-    {
-        UNIMPLEMENTED();
-        return gl::Error(GL_INVALID_OPERATION, &quot;invalid pixel store parameters in readPixels&quot;);
-    }
-
</del><span class="cx">     GLenum sizedInternalFormat = gl::GetSizedInternalFormat(format, type);
</span><span class="cx">     const gl::InternalFormat &amp;sizedFormatInfo = gl::GetInternalFormatInfo(sizedInternalFormat);
</span><del>-    GLuint outputPitch = sizedFormatInfo.computeRowPitch(type, area.width, packState.alignment, 0);
</del><ins>+    GLuint outputPitch =
+        sizedFormatInfo.computeRowPitch(type, area.width, packState.alignment, packState.rowLength);
+    GLsizei outputSkipBytes = sizedFormatInfo.computeSkipPixels(
+        outputPitch, 0, 0, packState.skipRows, packState.skipPixels);
</ins><span class="cx"> 
</span><del>-    return readPixels(area, format, type, outputPitch, packState, reinterpret_cast&lt;uint8_t*&gt;(pixels));
</del><ins>+    return readPixelsImpl(area, format, type, outputPitch, packState,
+                          reinterpret_cast&lt;uint8_t *&gt;(pixels) + outputSkipBytes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error FramebufferD3D::blit(const gl::State &amp;state, const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea,
</span><span class="lines">@@ -318,8 +288,16 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLenum FramebufferD3D::checkStatus() const
</del><ins>+bool FramebufferD3D::checkStatus() const
</ins><span class="cx"> {
</span><ins>+    // if we have both a depth and stencil buffer, they must refer to the same object
+    // since we only support packed_depth_stencil and not separate depth and stencil
+    if (mData.getDepthAttachment() != nullptr &amp;&amp; mData.getStencilAttachment() != nullptr &amp;&amp;
+        mData.getDepthStencilAttachment() == nullptr)
+    {
+        return false;
+    }
+
</ins><span class="cx">     // D3D11 does not allow for overlapping RenderTargetViews, so ensure uniqueness
</span><span class="cx">     const auto &amp;colorAttachments = mData.getColorAttachments();
</span><span class="cx">     for (size_t colorAttachment = 0; colorAttachment &lt; colorAttachments.size(); colorAttachment++)
</span><span class="lines">@@ -334,27 +312,51 @@
</span><span class="cx">                     (attachment.id() == prevAttachment.id() &amp;&amp;
</span><span class="cx">                      attachment.type() == prevAttachment.type()))
</span><span class="cx">                 {
</span><del>-                    return GL_FRAMEBUFFER_UNSUPPORTED;
</del><ins>+                    return false;
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return GL_FRAMEBUFFER_COMPLETE;
</del><ins>+    // D3D requires all render targets to have the same dimensions.
+    if (!mData.attachmentsHaveSameDimensions())
+    {
+        return false;
+    }
+
+    return true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const gl::AttachmentList &amp;FramebufferD3D::getColorAttachmentsForRender(const Workarounds &amp;workarounds) const
</del><ins>+void FramebufferD3D::syncState(const gl::Framebuffer::DirtyBits &amp;dirtyBits)
</ins><span class="cx"> {
</span><del>-    if (!mInvalidateColorAttachmentCache)
</del><ins>+    bool invalidateColorAttachmentCache = false;
+
+    if (!mColorAttachmentsForRender.valid())
</ins><span class="cx">     {
</span><del>-        return mColorAttachmentsForRender;
</del><ins>+        invalidateColorAttachmentCache = true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    for (auto dirtyBit : angle::IterateBitSet(dirtyBits))
+    {
+        if ((dirtyBit &gt;= gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 &amp;&amp;
+             dirtyBit &lt; gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX) ||
+            dirtyBit == gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS)
+        {
+            invalidateColorAttachmentCache = true;
+        }
+    }
+
+    if (!invalidateColorAttachmentCache)
+    {
+        return;
+    }
+
</ins><span class="cx">     // Does not actually free memory
</span><del>-    mColorAttachmentsForRender.clear();
</del><ins>+    gl::AttachmentList colorAttachmentsForRender;
</ins><span class="cx"> 
</span><span class="cx">     const auto &amp;colorAttachments = mData.getColorAttachments();
</span><span class="cx">     const auto &amp;drawBufferStates = mData.getDrawBufferStates();
</span><ins>+    const auto &amp;workarounds      = mRenderer-&gt;getWorkarounds();
</ins><span class="cx"> 
</span><span class="cx">     for (size_t attachmentIndex = 0; attachmentIndex &lt; colorAttachments.size(); ++attachmentIndex)
</span><span class="cx">     {
</span><span class="lines">@@ -364,57 +366,21 @@
</span><span class="cx">         if (colorAttachment.isAttached() &amp;&amp; drawBufferState != GL_NONE)
</span><span class="cx">         {
</span><span class="cx">             ASSERT(drawBufferState == GL_BACK || drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + attachmentIndex));
</span><del>-            mColorAttachmentsForRender.push_back(&amp;colorAttachment);
</del><ins>+            colorAttachmentsForRender.push_back(&amp;colorAttachment);
</ins><span class="cx">         }
</span><span class="cx">         else if (!workarounds.mrtPerfWorkaround)
</span><span class="cx">         {
</span><del>-            mColorAttachmentsForRender.push_back(nullptr);
</del><ins>+            colorAttachmentsForRender.push_back(nullptr);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mInvalidateColorAttachmentCache = false;
-    return mColorAttachmentsForRender;
</del><ins>+    mColorAttachmentsForRender = std::move(colorAttachmentsForRender);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-// Note: RenderTarget serials should ideally be in the RenderTargets themselves.
-unsigned int GetAttachmentSerial(const gl::FramebufferAttachment *attachment)
</del><ins>+const gl::AttachmentList &amp;FramebufferD3D::getColorAttachmentsForRender() const
</ins><span class="cx"> {
</span><del>-    if (attachment-&gt;type() == GL_TEXTURE)
-    {
-        gl::Texture *texture = attachment-&gt;getTexture();
-        ASSERT(texture);
-        TextureD3D *textureD3D = GetImplAs&lt;TextureD3D&gt;(texture);
-        const gl::ImageIndex &amp;index = attachment-&gt;getTextureImageIndex();
-        return textureD3D-&gt;getRenderTargetSerial(index);
-    }
-    else if (attachment-&gt;type() == GL_RENDERBUFFER)
-    {
-        gl::Renderbuffer *renderbuffer = attachment-&gt;getRenderbuffer();
-        ASSERT(renderbuffer);
-        RenderbufferD3D *renderbufferD3D = GetImplAs&lt;RenderbufferD3D&gt;(renderbuffer);
-        return renderbufferD3D-&gt;getRenderTargetSerial();
-    }
-    else if (attachment-&gt;type() == GL_FRAMEBUFFER_DEFAULT)
-    {
-        const egl::Surface *surface = attachment-&gt;getSurface();
-        ASSERT(surface);
-        const SurfaceD3D *surfaceD3D = GetImplAs&lt;SurfaceD3D&gt;(surface);
-        ASSERT(surfaceD3D);
-
-        if (attachment-&gt;getBinding() == GL_BACK)
-        {
-            return surfaceD3D-&gt;getSwapChain()-&gt;getColorRenderTarget()-&gt;getSerial();
-        }
-        else
-        {
-            return surfaceD3D-&gt;getSwapChain()-&gt;getDepthStencilRenderTarget()-&gt;getSerial();
-        }
-    }
-    else
-    {
-        UNREACHABLE();
-        return 0;
-    }
</del><ins>+    ASSERT(mColorAttachmentsForRender.valid());
+    return mColorAttachmentsForRender.value();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dFramebufferD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/FramebufferD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/FramebufferD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/FramebufferD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,6 +12,7 @@
</span><span class="cx"> #include &lt;vector&gt;
</span><span class="cx"> #include &lt;cstdint&gt;
</span><span class="cx"> 
</span><ins>+#include &quot;common/Optional.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/FramebufferImpl.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -26,8 +27,9 @@
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+class RendererD3D;
</ins><span class="cx"> class RenderTargetD3D;
</span><del>-class RendererD3D;
</del><ins>+struct WorkaroundsD3D;
</ins><span class="cx"> 
</span><span class="cx"> struct ClearParameters
</span><span class="cx"> {
</span><span class="lines">@@ -58,22 +60,24 @@
</span><span class="cx">     FramebufferD3D(const gl::Framebuffer::Data &amp;data, RendererD3D *renderer);
</span><span class="cx">     virtual ~FramebufferD3D();
</span><span class="cx"> 
</span><del>-    void onUpdateColorAttachment(size_t index) override;
-    void onUpdateDepthAttachment() override;
-    void onUpdateStencilAttachment() override;
-    void onUpdateDepthStencilAttachment() override;
-
-    void setDrawBuffers(size_t count, const GLenum *buffers) override;
-    void setReadBuffer(GLenum buffer) override;
-
-    gl::Error invalidate(size_t count, const GLenum *attachments) override;
-    gl::Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &amp;area) override;
-
</del><span class="cx">     gl::Error clear(const gl::Data &amp;data, GLbitfield mask) override;
</span><del>-    gl::Error clearBufferfv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLfloat *values) override;
-    gl::Error clearBufferuiv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLuint *values) override;
-    gl::Error clearBufferiv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLint *values) override;
-    gl::Error clearBufferfi(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) override;
</del><ins>+    gl::Error clearBufferfv(const gl::Data &amp;data,
+                            GLenum buffer,
+                            GLint drawbuffer,
+                            const GLfloat *values) override;
+    gl::Error clearBufferuiv(const gl::Data &amp;data,
+                             GLenum buffer,
+                             GLint drawbuffer,
+                             const GLuint *values) override;
+    gl::Error clearBufferiv(const gl::Data &amp;data,
+                            GLenum buffer,
+                            GLint drawbuffer,
+                            const GLint *values) override;
+    gl::Error clearBufferfi(const gl::Data &amp;data,
+                            GLenum buffer,
+                            GLint drawbuffer,
+                            GLfloat depth,
+                            GLint stencil) override;
</ins><span class="cx"> 
</span><span class="cx">     GLenum getImplementationColorReadFormat() const override;
</span><span class="cx">     GLenum getImplementationColorReadType() const override;
</span><span class="lines">@@ -82,32 +86,32 @@
</span><span class="cx">     gl::Error blit(const gl::State &amp;state, const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea,
</span><span class="cx">                    GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer) override;
</span><span class="cx"> 
</span><del>-    GLenum checkStatus() const override;
</del><ins>+    bool checkStatus() const override;
</ins><span class="cx"> 
</span><del>-    const gl::AttachmentList &amp;getColorAttachmentsForRender(const Workarounds &amp;workarounds) const;
</del><ins>+    void syncState(const gl::Framebuffer::DirtyBits &amp;dirtyBits) override;
</ins><span class="cx"> 
</span><del>-  protected:
-    // Cache variable
-    mutable gl::AttachmentList mColorAttachmentsForRender;
-    mutable bool mInvalidateColorAttachmentCache;
</del><ins>+    const gl::AttachmentList &amp;getColorAttachmentsForRender() const;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    RendererD3D *const mRenderer;
</del><ins>+    virtual gl::Error clear(const gl::Data &amp;data, const ClearParameters &amp;clearParams) = 0;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error clear(const gl::State &amp;state, const ClearParameters &amp;clearParams) = 0;
</del><ins>+    virtual gl::Error readPixelsImpl(const gl::Rectangle &amp;area,
+                                     GLenum format,
+                                     GLenum type,
+                                     size_t outputPitch,
+                                     const gl::PixelPackState &amp;pack,
+                                     uint8_t *pixels) const = 0;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error readPixels(const gl::Rectangle &amp;area, GLenum format, GLenum type, size_t outputPitch,
-                                 const gl::PixelPackState &amp;pack, uint8_t *pixels) const = 0;
-
</del><span class="cx">     virtual gl::Error blit(const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea, const gl::Rectangle *scissor,
</span><span class="cx">                            bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter,
</span><span class="cx">                            const gl::Framebuffer *sourceFramebuffer) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual GLenum getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const = 0;
</span><ins>+
+    RendererD3D *mRenderer;
+    Optional&lt;gl::AttachmentList&gt; mColorAttachmentsForRender;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-unsigned int GetAttachmentSerial(const gl::FramebufferAttachment *attachment);
-
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_FRAMBUFFERD3D_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dHLSLCompilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/HLSLCompiler.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/HLSLCompiler.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/HLSLCompiler.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -5,17 +5,16 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/HLSLCompiler.h&quot;
</span><ins>+
+#include &quot;common/utilities.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Program.h&quot;
</span><span class="cx"> #include &quot;libANGLE/features.h&quot;
</span><del>-
-#include &quot;common/utilities.h&quot;
-
</del><ins>+#include &quot;libANGLE/histogram_macros.h&quot;
</ins><span class="cx"> #include &quot;third_party/trace_event/trace_event.h&quot;
</span><span class="cx"> 
</span><del>-// Definitions local to the translation unit
</del><ins>+#if ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED
</ins><span class="cx"> namespace
</span><span class="cx"> {
</span><del>-
</del><span class="cx"> #ifdef CREATE_COMPILER_FLAG_INFO
</span><span class="cx">     #undef CREATE_COMPILER_FLAG_INFO
</span><span class="cx"> #endif
</span><span class="lines">@@ -76,20 +75,9 @@
</span><span class="cx">         return isFlagSet;
</span><span class="cx">     }
</span><span class="cx"> }
</span><ins>+}  // anonymous namespace
+#endif  // ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED
</ins><span class="cx"> 
</span><del>-const char *GetCompilerFlagName(UINT mask, size_t flagIx)
-{
-    const CompilerFlagInfo &amp;flagInfo = CompilerFlagInfos[flagIx];
-    if (IsCompilerFlagSet(mask, flagInfo.mFlag))
-    {
-        return flagInfo.mName;
-    }
-
-    return nullptr;
-}
-
-}
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -106,9 +94,10 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> HLSLCompiler::HLSLCompiler()
</span><del>-    : mD3DCompilerModule(NULL),
-      mD3DCompileFunc(NULL),
-      mD3DDisassembleFunc(NULL)
</del><ins>+    : mInitialized(false),
+      mD3DCompilerModule(nullptr),
+      mD3DCompileFunc(nullptr),
+      mD3DDisassembleFunc(nullptr)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -117,8 +106,13 @@
</span><span class="cx">     release();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool HLSLCompiler::initialize()
</del><ins>+gl::Error HLSLCompiler::initialize()
</ins><span class="cx"> {
</span><ins>+    if (mInitialized)
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
</ins><span class="cx">     TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;HLSLCompiler::initialize&quot;);
</span><span class="cx"> #if !defined(ANGLE_ENABLE_WINDOWS_STORE)
</span><span class="cx"> #if defined(ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES)
</span><span class="lines">@@ -142,8 +136,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!mD3DCompilerModule)
</span><span class="cx">     {
</span><del>-        ERR(&quot;No D3D compiler module found - aborting!\n&quot;);
-        return false;
</del><ins>+        return gl::Error(GL_INVALID_OPERATION, &quot;No D3D compiler module found - aborting!\n&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mD3DCompileFunc = reinterpret_cast&lt;pD3DCompile&gt;(GetProcAddress(mD3DCompilerModule, &quot;D3DCompile&quot;));
</span><span class="lines">@@ -155,29 +148,42 @@
</span><span class="cx"> #else
</span><span class="cx">     // D3D Shader compiler is linked already into this module, so the export
</span><span class="cx">     // can be directly assigned.
</span><del>-    mD3DCompilerModule = NULL;
</del><ins>+    mD3DCompilerModule = nullptr;
</ins><span class="cx">     mD3DCompileFunc = reinterpret_cast&lt;pD3DCompile&gt;(D3DCompile);
</span><span class="cx">     mD3DDisassembleFunc = reinterpret_cast&lt;pD3DDisassemble&gt;(D3DDisassemble);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    return mD3DCompileFunc != NULL;
</del><ins>+    if (mD3DCompileFunc == nullptr)
+    {
+        return gl::Error(GL_INVALID_OPERATION, &quot;Error finding D3DCompile entry point&quot;);
+    }
+
+    mInitialized = true;
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void HLSLCompiler::release()
</span><span class="cx"> {
</span><del>-    if (mD3DCompilerModule)
</del><ins>+    if (mInitialized)
</ins><span class="cx">     {
</span><span class="cx">         FreeLibrary(mD3DCompilerModule);
</span><del>-        mD3DCompilerModule = NULL;
-        mD3DCompileFunc = NULL;
-        mD3DDisassembleFunc = NULL;
</del><ins>+        mD3DCompilerModule = nullptr;
+        mD3DCompileFunc = nullptr;
+        mD3DDisassembleFunc = nullptr;
+        mInitialized = false;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error HLSLCompiler::compileToBinary(gl::InfoLog &amp;infoLog, const std::string &amp;hlsl, const std::string &amp;profile,
</span><span class="cx">                                         const std::vector&lt;CompileConfig&gt; &amp;configs, const D3D_SHADER_MACRO *overrideMacros,
</span><del>-                                        ID3DBlob **outCompiledBlob, std::string *outDebugInfo) const
</del><ins>+                                        ID3DBlob **outCompiledBlob, std::string *outDebugInfo)
</ins><span class="cx"> {
</span><ins>+    gl::Error error = initialize();
+    if (error.isError())
+    {
+        return error;
+    }
+
</ins><span class="cx"> #if !defined(ANGLE_ENABLE_WINDOWS_STORE)
</span><span class="cx">     ASSERT(mD3DCompilerModule);
</span><span class="cx"> #endif
</span><span class="lines">@@ -192,15 +198,21 @@
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    const D3D_SHADER_MACRO *macros = overrideMacros ? overrideMacros : NULL;
</del><ins>+    const D3D_SHADER_MACRO *macros = overrideMacros ? overrideMacros : nullptr;
</ins><span class="cx"> 
</span><span class="cx">     for (size_t i = 0; i &lt; configs.size(); ++i)
</span><span class="cx">     {
</span><del>-        ID3DBlob *errorMessage = NULL;
-        ID3DBlob *binary = NULL;
</del><ins>+        ID3DBlob *errorMessage = nullptr;
+        ID3DBlob *binary = nullptr;
+        HRESULT result         = S_OK;
</ins><span class="cx"> 
</span><del>-        HRESULT result = mD3DCompileFunc(hlsl.c_str(), hlsl.length(), gl::g_fakepath, macros, NULL, &quot;main&quot;, profile.c_str(),
-                                         configs[i].flags, 0, &amp;binary, &amp;errorMessage);
</del><ins>+        {
+            TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;D3DCompile&quot;);
+            SCOPED_ANGLE_HISTOGRAM_TIMER(&quot;GPU.ANGLE.D3DCompileMS&quot;);
+            result = mD3DCompileFunc(hlsl.c_str(), hlsl.length(), gl::g_fakepath, macros, nullptr,
+                                     &quot;main&quot;, profile.c_str(), configs[i].flags, 0, &amp;binary,
+                                     &amp;errorMessage);
+        }
</ins><span class="cx"> 
</span><span class="cx">         if (errorMessage)
</span><span class="cx">         {
</span><span class="lines">@@ -211,13 +223,14 @@
</span><span class="cx">             TRACE(&quot;\n%s&quot;, hlsl.c_str());
</span><span class="cx">             TRACE(&quot;\n%s&quot;, message.c_str());
</span><span class="cx"> 
</span><del>-            if (message.find(&quot;error X3531:&quot;) != std::string::npos || // &quot;can't unroll loops marked with loop attribute&quot;
-                message.find(&quot;error X4014:&quot;) != std::string::npos)   // &quot;cannot have gradient operations inside loops with divergent flow control&quot;,
-                                                                     // even though it is counter-intuitive to disable unrolling for this error,
-                                                                     // some very long shaders have trouble deciding which loops to unroll and
-                                                                     // turning off forced unrolls allows them to compile properly.
</del><ins>+            if ((message.find(&quot;error X3531:&quot;) != std::string::npos ||  // &quot;can't unroll loops marked with loop attribute&quot;
+                 message.find(&quot;error X4014:&quot;) != std::string::npos) &amp;&amp; // &quot;cannot have gradient operations inside loops with divergent flow control&quot;,
+                                                                       // even though it is counter-intuitive to disable unrolling for this error,
+                                                                       // some very long shaders have trouble deciding which loops to unroll and
+                                                                       // turning off forced unrolls allows them to compile properly.
+                macros != nullptr)
</ins><span class="cx">             {
</span><del>-                macros = NULL;   // Disable [loop] and [flatten]
</del><ins>+                macros = nullptr;   // Disable [loop] and [flatten]
</ins><span class="cx"> 
</span><span class="cx">                 // Retry without changing compiler flags
</span><span class="cx">                 i--;
</span><span class="lines">@@ -229,16 +242,16 @@
</span><span class="cx">         {
</span><span class="cx">             *outCompiledBlob = binary;
</span><span class="cx"> 
</span><del>-#if ANGLE_SHADER_DEBUG_INFO == ANGLE_ENABLED
</del><span class="cx">             (*outDebugInfo) += &quot;// COMPILER INPUT HLSL BEGIN\n\n&quot; + hlsl + &quot;\n// COMPILER INPUT HLSL END\n&quot;;
</span><ins>+
+#if ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED
</ins><span class="cx">             (*outDebugInfo) += &quot;\n\n// ASSEMBLY BEGIN\n\n&quot;;
</span><span class="cx">             (*outDebugInfo) += &quot;// Compiler configuration: &quot; + configs[i].name + &quot;\n// Flags:\n&quot;;
</span><span class="cx">             for (size_t fIx = 0; fIx &lt; ArraySize(CompilerFlagInfos); ++fIx)
</span><span class="cx">             {
</span><del>-                const char *flagName = GetCompilerFlagName(configs[i].flags, fIx);
-                if (flagName != nullptr)
</del><ins>+                if (IsCompilerFlagSet(configs[i].flags, CompilerFlagInfos[fIx].mFlag))
</ins><span class="cx">                 {
</span><del>-                    (*outDebugInfo) += std::string(&quot;// &quot;) + flagName + &quot;\n&quot;;
</del><ins>+                    (*outDebugInfo) += std::string(&quot;// &quot;) + CompilerFlagInfos[fIx].mName + &quot;\n&quot;;
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="lines">@@ -255,52 +268,65 @@
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            (*outDebugInfo) += &quot;\n&quot; + disassembleBinary(binary) + &quot;\n// ASSEMBLY END\n&quot;;
-#endif
-
</del><ins>+            std::string disassembly;
+            error = disassembleBinary(binary, &amp;disassembly);
+            if (error.isError())
+            {
+                return error;
+            }
+            (*outDebugInfo) += &quot;\n&quot; + disassembly + &quot;\n// ASSEMBLY END\n&quot;;
+#endif  // ANGLE_APPEND_ASSEMBLY_TO_SHADER_DEBUG_INFO == ANGLE_ENABLED
</ins><span class="cx">             return gl::Error(GL_NO_ERROR);
</span><span class="cx">         }
</span><del>-        else
</del><ins>+
+        if (result == E_OUTOFMEMORY)
</ins><span class="cx">         {
</span><del>-            if (result == E_OUTOFMEMORY)
-            {
-                *outCompiledBlob = NULL;
-                return gl::Error(GL_OUT_OF_MEMORY, &quot;HLSL compiler had an unexpected failure, result: 0x%X.&quot;, result);
-            }
</del><ins>+            *outCompiledBlob = nullptr;
+            return gl::Error(GL_OUT_OF_MEMORY, &quot;HLSL compiler had an unexpected failure, result: 0x%X.&quot;, result);
+        }
</ins><span class="cx"> 
</span><del>-            infoLog.append(&quot;Warning: D3D shader compilation failed with %s flags.&quot;, configs[i].name.c_str());
</del><ins>+        infoLog &lt;&lt; &quot;Warning: D3D shader compilation failed with &quot; &lt;&lt; configs[i].name &lt;&lt; &quot; flags. (&quot;
+                &lt;&lt; profile &lt;&lt; &quot;)&quot;;
</ins><span class="cx"> 
</span><del>-            if (i + 1 &lt; configs.size())
-            {
-                infoLog.append(&quot; Retrying with %s.\n&quot;, configs[i + 1].name.c_str());
-            }
</del><ins>+        if (i + 1 &lt; configs.size())
+        {
+            infoLog &lt;&lt; &quot; Retrying with &quot; &lt;&lt; configs[i + 1].name;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // None of the configurations succeeded in compiling this shader but the compiler is still intact
</span><del>-    *outCompiledBlob = NULL;
</del><ins>+    *outCompiledBlob = nullptr;
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::string HLSLCompiler::disassembleBinary(ID3DBlob *shaderBinary) const
</del><ins>+gl::Error HLSLCompiler::disassembleBinary(ID3DBlob *shaderBinary, std::string *disassemblyOut)
</ins><span class="cx"> {
</span><ins>+    gl::Error error = initialize();
+    if (error.isError())
+    {
+        return error;
+    }
+
</ins><span class="cx">     // Retrieve disassembly
</span><span class="cx">     UINT flags = D3D_DISASM_ENABLE_DEFAULT_VALUE_PRINTS | D3D_DISASM_ENABLE_INSTRUCTION_NUMBERING;
</span><del>-    ID3DBlob *disassembly = NULL;
</del><ins>+    ID3DBlob *disassembly = nullptr;
</ins><span class="cx">     pD3DDisassemble disassembleFunc = reinterpret_cast&lt;pD3DDisassemble&gt;(mD3DDisassembleFunc);
</span><span class="cx">     LPCVOID buffer = shaderBinary-&gt;GetBufferPointer();
</span><span class="cx">     SIZE_T bufSize = shaderBinary-&gt;GetBufferSize();
</span><span class="cx">     HRESULT result = disassembleFunc(buffer, bufSize, flags, &quot;&quot;, &amp;disassembly);
</span><span class="cx"> 
</span><del>-    std::string asmSrc;
</del><span class="cx">     if (SUCCEEDED(result))
</span><span class="cx">     {
</span><del>-        asmSrc = reinterpret_cast&lt;const char*&gt;(disassembly-&gt;GetBufferPointer());
</del><ins>+        *disassemblyOut = std::string(reinterpret_cast&lt;const char*&gt;(disassembly-&gt;GetBufferPointer()));
</ins><span class="cx">     }
</span><ins>+    else
+    {
+        *disassemblyOut = &quot;&quot;;
+    }
</ins><span class="cx"> 
</span><span class="cx">     SafeRelease(disassembly);
</span><span class="cx"> 
</span><del>-    return asmSrc;
</del><ins>+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dHLSLCompilerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/HLSLCompiler.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/HLSLCompiler.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/HLSLCompiler.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -32,18 +32,20 @@
</span><span class="cx">     HLSLCompiler();
</span><span class="cx">     ~HLSLCompiler();
</span><span class="cx"> 
</span><del>-    bool initialize();
</del><span class="cx">     void release();
</span><span class="cx"> 
</span><span class="cx">     // Attempt to compile a HLSL shader using the supplied configurations, may output a NULL compiled blob
</span><span class="cx">     // even if no GL errors are returned.
</span><span class="cx">     gl::Error compileToBinary(gl::InfoLog &amp;infoLog, const std::string &amp;hlsl, const std::string &amp;profile,
</span><span class="cx">                               const std::vector&lt;CompileConfig&gt; &amp;configs, const D3D_SHADER_MACRO *overrideMacros,
</span><del>-                              ID3DBlob **outCompiledBlob, std::string *outDebugInfo) const;
</del><ins>+                              ID3DBlob **outCompiledBlob, std::string *outDebugInfo);
</ins><span class="cx"> 
</span><del>-    std::string disassembleBinary(ID3DBlob* shaderBinary) const;
</del><ins>+    gl::Error disassembleBinary(ID3DBlob *shaderBinary, std::string *disassemblyOut);
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><ins>+    gl::Error initialize();
+
+    bool mInitialized;
</ins><span class="cx">     HMODULE mD3DCompilerModule;
</span><span class="cx">     pD3DCompile mD3DCompileFunc;
</span><span class="cx">     pD3DDisassemble mD3DDisassembleFunc;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dImageD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ImageD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ImageD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ImageD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -23,26 +23,10 @@
</span><span class="cx">       mHeight(0),
</span><span class="cx">       mDepth(0),
</span><span class="cx">       mInternalFormat(GL_NONE),
</span><del>-      mTarget(GL_NONE),
</del><span class="cx">       mRenderable(false),
</span><ins>+      mTarget(GL_NONE),
</ins><span class="cx">       mDirty(false)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error ImageD3D::copy(const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea, const gl::Framebuffer *source)
-{
-    const gl::FramebufferAttachment *srcAttachment = source-&gt;getReadColorbuffer();
-    ASSERT(srcAttachment);
-
-    RenderTargetD3D *renderTarget = NULL;
-    gl::Error error = srcAttachment-&gt;getRenderTarget(&amp;renderTarget);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    ASSERT(renderTarget);
-    return copy(destOffset, sourceArea, renderTarget);
-}
-
-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dImageD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ImageD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ImageD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ImageD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -60,11 +60,12 @@
</span><span class="cx">     virtual gl::Error setManagedSurface2DArray(TextureStorage *storage, int layer, int level) { return gl::Error(GL_NO_ERROR); };
</span><span class="cx">     virtual gl::Error copyToStorage(TextureStorage *storage, const gl::ImageIndex &amp;index, const gl::Box &amp;region) = 0;
</span><span class="cx"> 
</span><del>-    virtual gl::Error copy(const gl::Offset &amp;destOffset, const gl::Box &amp;sourceArea,
-                           const gl::ImageIndex &amp;sourceIndex, TextureStorage *source) = 0;
</del><ins>+    virtual gl::Error copyFromTexStorage(const gl::ImageIndex &amp;imageIndex,
+                                         TextureStorage *source) = 0;
+    virtual gl::Error copyFromFramebuffer(const gl::Offset &amp;destOffset,
+                                          const gl::Rectangle &amp;sourceArea,
+                                          const gl::Framebuffer *source) = 0;
</ins><span class="cx"> 
</span><del>-    gl::Error copy(const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea, const gl::Framebuffer *source);
-
</del><span class="cx">   protected:
</span><span class="cx">     GLsizei mWidth;
</span><span class="cx">     GLsizei mHeight;
</span><span class="lines">@@ -74,9 +75,6 @@
</span><span class="cx">     GLenum mTarget;
</span><span class="cx"> 
</span><span class="cx">     bool mDirty;
</span><del>-
-  private:
-    virtual gl::Error copy(const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea, RenderTargetD3D *source) = 0;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dIndexBufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexBuffer.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexBuffer.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexBuffer.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,7 +12,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><del>-#include &quot;libANGLE/renderer/IndexRangeCache.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dIndexDataManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexDataManager.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexDataManager.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexDataManager.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,6 +8,8 @@
</span><span class="cx"> // runs the Buffer translation process for index buffers.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/IndexDataManager.h&quot;
</span><ins>+
+#include &quot;common/utilities.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/BufferD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/IndexBuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Buffer.h&quot;
</span><span class="lines">@@ -16,45 +18,111 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-static void ConvertIndices(GLenum sourceType, GLenum destinationType, const void *input, GLsizei count, void *output)
</del><ins>+namespace
</ins><span class="cx"> {
</span><del>-    if (sourceType == GL_UNSIGNED_BYTE)
</del><ins>+
+template &lt;typename InputT, typename DestT&gt;
+void ConvertIndexArray(const void *input,
+                       GLenum sourceType,
+                       void *output,
+                       GLenum destinationType,
+                       GLsizei count,
+                       bool usePrimitiveRestartFixedIndex)
+{
+    const InputT *in = static_cast&lt;const InputT *&gt;(input);
+    DestT *out       = static_cast&lt;DestT *&gt;(output);
+
+    if (usePrimitiveRestartFixedIndex)
</ins><span class="cx">     {
</span><del>-        ASSERT(destinationType == GL_UNSIGNED_SHORT);
-        const GLubyte *in = static_cast&lt;const GLubyte*&gt;(input);
-        GLushort *out = static_cast&lt;GLushort*&gt;(output);
-
</del><ins>+        InputT srcRestartIndex = static_cast&lt;InputT&gt;(gl::GetPrimitiveRestartIndex(sourceType));
+        DestT destRestartIndex = static_cast&lt;DestT&gt;(gl::GetPrimitiveRestartIndex(destinationType));
</ins><span class="cx">         for (GLsizei i = 0; i &lt; count; i++)
</span><span class="cx">         {
</span><del>-            out[i] = in[i];
</del><ins>+            out[i] = (in[i] == srcRestartIndex ? destRestartIndex : static_cast&lt;DestT&gt;(in[i]));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><del>-    else if (sourceType == GL_UNSIGNED_INT)
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        ASSERT(destinationType == GL_UNSIGNED_INT);
-        memcpy(output, input, count * sizeof(GLuint));
-    }
-    else if (sourceType == GL_UNSIGNED_SHORT)
-    {
-        if (destinationType == GL_UNSIGNED_SHORT)
</del><ins>+        for (GLsizei i = 0; i &lt; count; i++)
</ins><span class="cx">         {
</span><del>-            memcpy(output, input, count * sizeof(GLushort));
</del><ins>+            out[i] = static_cast&lt;DestT&gt;(in[i]);
</ins><span class="cx">         }
</span><del>-        else if (destinationType == GL_UNSIGNED_INT)
-        {
-            const GLushort *in = static_cast&lt;const GLushort*&gt;(input);
-            GLuint *out = static_cast&lt;GLuint*&gt;(output);
</del><ins>+    }
+}
</ins><span class="cx"> 
</span><del>-            for (GLsizei i = 0; i &lt; count; i++)
-            {
-                out[i] = in[i];
-            }
-        }
-        else UNREACHABLE();
</del><ins>+void ConvertIndices(GLenum sourceType,
+                    GLenum destinationType,
+                    const void *input,
+                    GLsizei count,
+                    void *output,
+                    bool usePrimitiveRestartFixedIndex)
+{
+    if (sourceType == destinationType)
+    {
+        const gl::Type &amp;typeInfo = gl::GetTypeInfo(destinationType);
+        memcpy(output, input, count * typeInfo.bytes);
+        return;
</ins><span class="cx">     }
</span><ins>+
+    if (sourceType == GL_UNSIGNED_BYTE)
+    {
+        ASSERT(destinationType == GL_UNSIGNED_SHORT);
+        ConvertIndexArray&lt;GLubyte, GLushort&gt;(input, sourceType, output, destinationType, count,
+                                             usePrimitiveRestartFixedIndex);
+    }
+    else if (sourceType == GL_UNSIGNED_SHORT)
+    {
+        ASSERT(destinationType == GL_UNSIGNED_INT);
+        ConvertIndexArray&lt;GLushort, GLuint&gt;(input, sourceType, output, destinationType, count,
+                                            usePrimitiveRestartFixedIndex);
+    }
</ins><span class="cx">     else UNREACHABLE();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+gl::Error StreamInIndexBuffer(IndexBufferInterface *buffer,
+                              const GLvoid *data,
+                              unsigned int count,
+                              GLenum srcType,
+                              GLenum dstType,
+                              bool usePrimitiveRestartFixedIndex,
+                              unsigned int *offset)
+{
+    const gl::Type &amp;dstTypeInfo = gl::GetTypeInfo(dstType);
+
+    if (count &gt; (std::numeric_limits&lt;unsigned int&gt;::max() &gt;&gt; dstTypeInfo.bytesShift))
+    {
+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Reserving %u indices of %u bytes each exceeds the maximum buffer size.&quot;,
+                         count, dstTypeInfo.bytes);
+    }
+
+    unsigned int bufferSizeRequired = count &lt;&lt; dstTypeInfo.bytesShift;
+    gl::Error error = buffer-&gt;reserveBufferSpace(bufferSizeRequired, dstType);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    void *output = nullptr;
+    error = buffer-&gt;mapBuffer(bufferSizeRequired, &amp;output, offset);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    ConvertIndices(srcType, dstType, data, count, output, usePrimitiveRestartFixedIndex);
+
+    error = buffer-&gt;unmapBuffer();
+    if (error.isError())
+    {
+        return error;
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+}  // anonymous namespace
+
</ins><span class="cx"> IndexDataManager::IndexDataManager(BufferFactoryD3D *factory, RendererClass rendererClass)
</span><span class="cx">     : mFactory(factory),
</span><span class="cx">       mRendererClass(rendererClass),
</span><span class="lines">@@ -69,169 +137,180 @@
</span><span class="cx">     SafeDelete(mStreamingBufferInt);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error IndexDataManager::prepareIndexData(GLenum type, GLsizei count, gl::Buffer *buffer, const GLvoid *indices, TranslatedIndexData *translated)
</del><ins>+// This function translates a GL-style indices into DX-style indices, with their description
+// returned in translated.
+// GL can specify vertex data in immediate mode (pointer to CPU array of indices), which is not
+// possible in DX and requires streaming (Case 1). If the GL indices are specified with a buffer
+// (Case 2), in a format supported by DX (subcase a) then all is good.
+// When we have a buffer with an unsupported format (subcase b) then we need to do some translation:
+// we will start by falling back to streaming, and after a while will start using a static translated
+// copy of the index buffer.
+gl::Error IndexDataManager::prepareIndexData(GLenum srcType,
+                                             GLsizei count,
+                                             gl::Buffer *glBuffer,
+                                             const GLvoid *indices,
+                                             TranslatedIndexData *translated,
+                                             bool primitiveRestartFixedIndexEnabled)
</ins><span class="cx"> {
</span><del>-    const gl::Type &amp;typeInfo = gl::GetTypeInfo(type);
</del><ins>+    // Avoid D3D11's primitive restart index value
+    // see http://msdn.microsoft.com/en-us/library/windows/desktop/bb205124(v=vs.85).aspx
+    bool hasPrimitiveRestartIndex =
+        translated-&gt;indexRange.vertexIndexCount &lt; static_cast&lt;size_t&gt;(count) ||
+        translated-&gt;indexRange.end == gl::GetPrimitiveRestartIndex(srcType);
+    bool primitiveRestartWorkaround = mRendererClass == RENDERER_D3D11 &amp;&amp;
+                                      !primitiveRestartFixedIndexEnabled &amp;&amp;
+                                      hasPrimitiveRestartIndex &amp;&amp; srcType == GL_UNSIGNED_SHORT;
</ins><span class="cx"> 
</span><del>-    GLenum destinationIndexType = (type == GL_UNSIGNED_INT) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
</del><ins>+    // We should never have to deal with MAX_UINT indices, since we restrict it via
+    // MAX_ELEMENT_INDEX.
+    ASSERT(!(mRendererClass == RENDERER_D3D11 &amp;&amp; !primitiveRestartFixedIndexEnabled &amp;&amp;
+             hasPrimitiveRestartIndex &amp;&amp; srcType == GL_UNSIGNED_INT));
</ins><span class="cx"> 
</span><del>-    unsigned int offset = 0;
-    bool alignedOffset = false;
</del><ins>+    const GLenum dstType = (srcType == GL_UNSIGNED_INT || primitiveRestartWorkaround) ?
+                           GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
</ins><span class="cx"> 
</span><del>-    BufferD3D *storage = NULL;
</del><ins>+    const gl::Type &amp;srcTypeInfo = gl::GetTypeInfo(srcType);
+    const gl::Type &amp;dstTypeInfo = gl::GetTypeInfo(dstType);
</ins><span class="cx"> 
</span><del>-    if (buffer != NULL)
-    {
-        offset = static_cast&lt;unsigned int&gt;(reinterpret_cast&lt;uintptr_t&gt;(indices));
</del><ins>+    BufferD3D *buffer = glBuffer ? GetImplAs&lt;BufferD3D&gt;(glBuffer) : nullptr;
</ins><span class="cx"> 
</span><del>-        storage = GetImplAs&lt;BufferD3D&gt;(buffer);
</del><ins>+    translated-&gt;indexType = dstType;
+    translated-&gt;srcIndexData.srcBuffer    = buffer;
+    translated-&gt;srcIndexData.srcIndices   = indices;
+    translated-&gt;srcIndexData.srcIndexType = srcType;
+    translated-&gt;srcIndexData.srcCount     = count;
</ins><span class="cx"> 
</span><del>-        // We'll trust that the compiler will optimize the % below:
-        // the operands are unsigned and the divisor is a constant.
-        switch (type)
-        {
-          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;
-        }
-
-        ASSERT(typeInfo.bytes * static_cast&lt;unsigned int&gt;(count) + offset &lt;= storage-&gt;getSize());
-
-        const uint8_t *bufferData = NULL;
-        gl::Error error = storage-&gt;getData(&amp;bufferData);
-        if (error.isError())
-        {
-            return error;
-        }
-
-        indices = bufferData + offset;
</del><ins>+    // Case 1: the indices are passed by pointer, which forces the streaming of index data
+    if (glBuffer == nullptr)
+    {
+        translated-&gt;storage = nullptr;
+        return streamIndexData(indices, count, srcType, dstType, primitiveRestartFixedIndexEnabled,
+                               translated);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    StaticIndexBufferInterface *staticBuffer = storage ? storage-&gt;getStaticIndexBuffer() : NULL;
-    IndexBufferInterface *indexBuffer = NULL;
-    bool directStorage = alignedOffset &amp;&amp; storage &amp;&amp; storage-&gt;supportsDirectBinding() &amp;&amp;
-                         destinationIndexType == type;
-    unsigned int streamOffset = 0;
</del><ins>+    // Case 2: the indices are already in a buffer
+    unsigned int offset = static_cast&lt;unsigned int&gt;(reinterpret_cast&lt;uintptr_t&gt;(indices));
+    ASSERT(srcTypeInfo.bytes * static_cast&lt;unsigned int&gt;(count) + offset &lt;= buffer-&gt;getSize());
</ins><span class="cx"> 
</span><del>-    // Avoid D3D11's primitive restart index value
-    // see http://msdn.microsoft.com/en-us/library/windows/desktop/bb205124(v=vs.85).aspx
-    bool primitiveRestartWorkaround = mRendererClass == RENDERER_D3D11 &amp;&amp;
-                                      translated-&gt;indexRange.end == 0xFFFF &amp;&amp;
-                                      type == GL_UNSIGNED_SHORT;
-
-    if (primitiveRestartWorkaround)
</del><ins>+    bool offsetAligned;
+    switch (srcType)
</ins><span class="cx">     {
</span><del>-        destinationIndexType = GL_UNSIGNED_INT;
-        directStorage = false;
</del><ins>+      case GL_UNSIGNED_BYTE:  offsetAligned = (offset % sizeof(GLubyte) == 0);  break;
+      case GL_UNSIGNED_SHORT: offsetAligned = (offset % sizeof(GLushort) == 0); break;
+      case GL_UNSIGNED_INT:   offsetAligned = (offset % sizeof(GLuint) == 0);   break;
+      default: UNREACHABLE(); offsetAligned = false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const gl::Type &amp;destTypeInfo = gl::GetTypeInfo(destinationIndexType);
-
-    if (directStorage)
</del><ins>+    // Case 2a: the buffer can be used directly
+    if (offsetAligned &amp;&amp; buffer-&gt;supportsDirectBinding() &amp;&amp;
+        dstType == srcType &amp;&amp; !primitiveRestartWorkaround)
</ins><span class="cx">     {
</span><del>-        streamOffset = offset;
</del><ins>+        translated-&gt;storage = buffer;
+        translated-&gt;indexBuffer = nullptr;
+        translated-&gt;serial = buffer-&gt;getSerial();
+        translated-&gt;startIndex = (offset &gt;&gt; srcTypeInfo.bytesShift);
+        translated-&gt;startOffset = offset;
+        return gl::Error(GL_NO_ERROR);
</ins><span class="cx">     }
</span><del>-    else if (staticBuffer &amp;&amp;
-             staticBuffer-&gt;getBufferSize() != 0 &amp;&amp;
-             alignedOffset &amp;&amp;
-             staticBuffer-&gt;getIndexType() == destinationIndexType)
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        indexBuffer = staticBuffer;
-
-        // Using bit-shift here is faster than using division.
-        streamOffset = (offset &gt;&gt; typeInfo.bytesShift) &lt;&lt; destTypeInfo.bytesShift;
</del><ins>+        translated-&gt;storage = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!directStorage &amp;&amp; !indexBuffer)
-    {
-        gl::Error error = getStreamingIndexBuffer(destinationIndexType, &amp;indexBuffer);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+    // Case 2b: use a static translated copy or fall back to streaming
+    StaticIndexBufferInterface *staticBuffer = buffer-&gt;getStaticIndexBuffer();
</ins><span class="cx"> 
</span><del>-        unsigned int convertCount = count;
</del><ins>+    bool staticBufferInitialized = staticBuffer &amp;&amp; staticBuffer-&gt;getBufferSize() != 0;
+    bool staticBufferUsable = staticBuffer &amp;&amp;
+                              offsetAligned &amp;&amp; staticBuffer-&gt;getIndexType() == dstType;
</ins><span class="cx"> 
</span><del>-        if (staticBuffer)
-        {
-            if (staticBuffer-&gt;getBufferSize() == 0 &amp;&amp; alignedOffset)
-            {
-                indexBuffer = staticBuffer;
-                // Using bit-shift here is faster than using division.
-                convertCount = storage-&gt;getSize() &gt;&gt; typeInfo.bytesShift;
-            }
-            else
-            {
-                storage-&gt;invalidateStaticData();
-                staticBuffer = NULL;
-            }
-        }
</del><ins>+    if (staticBufferInitialized &amp;&amp; !staticBufferUsable)
+    {
+        buffer-&gt;invalidateStaticData();
+        staticBuffer = nullptr;
+    }
</ins><span class="cx"> 
</span><del>-        ASSERT(indexBuffer);
-
-        // Using bit-shift here is faster than using division.
-        if (convertCount &gt; (std::numeric_limits&lt;unsigned int&gt;::max() &gt;&gt; destTypeInfo.bytesShift))
-        {
-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Reserving %u indices of %u bytes each exceeds the maximum buffer size.&quot;,
-                             convertCount, destTypeInfo.bytes);
-        }
-
-        unsigned int bufferSizeRequired = convertCount &lt;&lt; destTypeInfo.bytesShift;
-        error = indexBuffer-&gt;reserveBufferSpace(bufferSizeRequired, destinationIndexType);
</del><ins>+    if (staticBuffer == nullptr || !offsetAligned)
+    {
+        const uint8_t *bufferData = nullptr;
+        gl::Error error = buffer-&gt;getData(&amp;bufferData);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><ins>+        ASSERT(bufferData != nullptr);
</ins><span class="cx"> 
</span><del>-        void* output = NULL;
-        error = indexBuffer-&gt;mapBuffer(bufferSizeRequired, &amp;output, &amp;streamOffset);
</del><ins>+        error = streamIndexData(bufferData + offset, count, srcType, dstType,
+                                primitiveRestartFixedIndexEnabled, translated);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><del>-
-        const uint8_t *dataPointer = reinterpret_cast&lt;const uint8_t*&gt;(indices);
-        if (staticBuffer)
</del><ins>+        buffer-&gt;promoteStaticUsage(count &lt;&lt; srcTypeInfo.bytesShift);
+    }
+    else
+    {
+        if (!staticBufferInitialized)
</ins><span class="cx">         {
</span><del>-            error = storage-&gt;getData(&amp;dataPointer);
</del><ins>+            const uint8_t *bufferData = nullptr;
+            gl::Error error = buffer-&gt;getData(&amp;bufferData);
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 return error;
</span><span class="cx">             }
</span><del>-        }
-        ConvertIndices(type, destinationIndexType, dataPointer, convertCount, output);
</del><ins>+            ASSERT(bufferData != nullptr);
</ins><span class="cx"> 
</span><del>-        error = indexBuffer-&gt;unmapBuffer();
-        if (error.isError())
-        {
-            return error;
</del><ins>+            unsigned int convertCount =
+                static_cast&lt;unsigned int&gt;(buffer-&gt;getSize()) &gt;&gt; srcTypeInfo.bytesShift;
+            error = StreamInIndexBuffer(staticBuffer, bufferData, convertCount, srcType, dstType,
+                                        primitiveRestartFixedIndexEnabled, nullptr);
+            if (error.isError())
+            {
+                return error;
+            }
</ins><span class="cx">         }
</span><ins>+        ASSERT(offsetAligned &amp;&amp; staticBuffer-&gt;getIndexType() == dstType);
</ins><span class="cx"> 
</span><del>-        if (staticBuffer)
-        {
-            // Using bit-shift here is faster than using division.
-            streamOffset = (offset &gt;&gt; typeInfo.bytesShift) &lt;&lt; destTypeInfo.bytesShift;
-        }
</del><ins>+        translated-&gt;indexBuffer = staticBuffer-&gt;getIndexBuffer();
+        translated-&gt;serial = staticBuffer-&gt;getSerial();
+        translated-&gt;startIndex = (offset &gt;&gt; srcTypeInfo.bytesShift);
+        translated-&gt;startOffset = (offset &gt;&gt; srcTypeInfo.bytesShift) &lt;&lt; dstTypeInfo.bytesShift;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    translated-&gt;storage = directStorage ? storage : NULL;
-    translated-&gt;indexBuffer = indexBuffer ? indexBuffer-&gt;getIndexBuffer() : NULL;
-    translated-&gt;serial = directStorage ? storage-&gt;getSerial() : indexBuffer-&gt;getSerial();
-    // Using bit-shift here is faster than using division.
-    translated-&gt;startIndex = (streamOffset &gt;&gt; destTypeInfo.bytesShift);
-    translated-&gt;startOffset = streamOffset;
-    translated-&gt;indexType = destinationIndexType;
</del><ins>+    return gl::Error(GL_NO_ERROR);
+}
</ins><span class="cx"> 
</span><del>-    if (storage)
</del><ins>+gl::Error IndexDataManager::streamIndexData(const GLvoid *data,
+                                            unsigned int count,
+                                            GLenum srcType,
+                                            GLenum dstType,
+                                            bool usePrimitiveRestartFixedIndex,
+                                            TranslatedIndexData *translated)
+{
+    const gl::Type &amp;dstTypeInfo = gl::GetTypeInfo(dstType);
+
+    IndexBufferInterface *indexBuffer = nullptr;
+    gl::Error error = getStreamingIndexBuffer(dstType, &amp;indexBuffer);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        storage-&gt;promoteStaticUsage(count &lt;&lt; typeInfo.bytesShift);
</del><ins>+        return error;
</ins><span class="cx">     }
</span><ins>+    ASSERT(indexBuffer != nullptr);
</ins><span class="cx"> 
</span><ins>+    unsigned int offset;
+    StreamInIndexBuffer(indexBuffer, data, count, srcType, dstType, usePrimitiveRestartFixedIndex,
+                        &amp;offset);
+
+    translated-&gt;indexBuffer = indexBuffer-&gt;getIndexBuffer();
+    translated-&gt;serial = indexBuffer-&gt;getSerial();
+    translated-&gt;startIndex = (offset &gt;&gt; dstTypeInfo.bytesShift);
+    translated-&gt;startOffset = offset;
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error IndexDataManager::getStreamingIndexBuffer(GLenum destinationIndexType, IndexBufferInterface **outBuffer)
</del><ins>+gl::Error IndexDataManager::getStreamingIndexBuffer(GLenum destinationIndexType,
+                                                    IndexBufferInterface **outBuffer)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(outBuffer);
</span><span class="cx">     if (destinationIndexType == GL_UNSIGNED_INT)
</span><span class="lines">@@ -239,7 +318,8 @@
</span><span class="cx">         if (!mStreamingBufferInt)
</span><span class="cx">         {
</span><span class="cx">             mStreamingBufferInt = new StreamingIndexBufferInterface(mFactory);
</span><del>-            gl::Error error = mStreamingBufferInt-&gt;reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_INT);
</del><ins>+            gl::Error error = mStreamingBufferInt-&gt;reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE,
+                                                                      GL_UNSIGNED_INT);
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 SafeDelete(mStreamingBufferInt);
</span><span class="lines">@@ -257,7 +337,8 @@
</span><span class="cx">         if (!mStreamingBufferShort)
</span><span class="cx">         {
</span><span class="cx">             mStreamingBufferShort = new StreamingIndexBufferInterface(mFactory);
</span><del>-            gl::Error error = mStreamingBufferShort-&gt;reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE, GL_UNSIGNED_SHORT);
</del><ins>+            gl::Error error = mStreamingBufferShort-&gt;reserveBufferSpace(INITIAL_INDEX_BUFFER_SIZE,
+                                                                        GL_UNSIGNED_SHORT);
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 SafeDelete(mStreamingBufferShort);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dIndexDataManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexDataManager.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexDataManager.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/IndexDataManager.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -36,9 +36,18 @@
</span><span class="cx"> class BufferD3D;
</span><span class="cx"> class RendererD3D;
</span><span class="cx"> 
</span><ins>+struct SourceIndexData
+{
+    BufferD3D *srcBuffer;
+    const GLvoid *srcIndices;
+    unsigned int srcCount;
+    GLenum srcIndexType;
+    bool srcIndicesChanged;
+};
+
</ins><span class="cx"> struct TranslatedIndexData
</span><span class="cx"> {
</span><del>-    RangeUI indexRange;
</del><ins>+    gl::IndexRange indexRange;
</ins><span class="cx">     unsigned int startIndex;
</span><span class="cx">     unsigned int startOffset;   // In bytes
</span><span class="cx"> 
</span><span class="lines">@@ -46,6 +55,8 @@
</span><span class="cx">     BufferD3D *storage;
</span><span class="cx">     GLenum indexType;
</span><span class="cx">     unsigned int serial;
</span><ins>+
+    SourceIndexData srcIndexData;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class IndexDataManager : angle::NonCopyable
</span><span class="lines">@@ -54,10 +65,22 @@
</span><span class="cx">     explicit IndexDataManager(BufferFactoryD3D *factory, RendererClass rendererClass);
</span><span class="cx">     virtual ~IndexDataManager();
</span><span class="cx"> 
</span><del>-    gl::Error prepareIndexData(GLenum type, GLsizei count, gl::Buffer *arrayElementBuffer, const GLvoid *indices, TranslatedIndexData *translated);
</del><ins>+    gl::Error prepareIndexData(GLenum srcType,
+                               GLsizei count,
+                               gl::Buffer *glBuffer,
+                               const GLvoid *indices,
+                               TranslatedIndexData *translated,
+                               bool primitiveRestartFixedIndexEnabled);
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    gl::Error getStreamingIndexBuffer(GLenum destinationIndexType, IndexBufferInterface **outBuffer);
</del><ins>+    gl::Error streamIndexData(const GLvoid *data,
+                              unsigned int count,
+                              GLenum srcType,
+                              GLenum dstType,
+                              bool usePrimitiveRestartFixedIndex,
+                              TranslatedIndexData *translated);
+    gl::Error getStreamingIndexBuffer(GLenum destinationIndexType,
+                                      IndexBufferInterface **outBuffer);
</ins><span class="cx"> 
</span><span class="cx">     BufferFactoryD3D *const mFactory;
</span><span class="cx">     RendererClass mRendererClass;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dProgramD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ProgramD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ProgramD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ProgramD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,16 +8,19 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/BitSetIterator.h&quot;
</ins><span class="cx"> #include &quot;common/utilities.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Program.h&quot;
</span><ins>+#include &quot;libANGLE/VertexArray.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/features.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/DynamicHLSL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/FramebufferD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/ShaderD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/ShaderExecutableD3D.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/VaryingPacking.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/VertexDataManager.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="lines">@@ -26,69 +29,41 @@
</span><span class="cx"> namespace
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-GLenum GetTextureType(GLenum samplerType)
</del><ins>+gl::InputLayout GetDefaultInputLayoutFromShader(const gl::Shader *vertexShader)
</ins><span class="cx"> {
</span><del>-    switch (samplerType)
</del><ins>+    gl::InputLayout defaultLayout;
+    for (const sh::Attribute &amp;shaderAttr : vertexShader-&gt;getActiveAttributes())
</ins><span class="cx">     {
</span><del>-      case GL_SAMPLER_2D:
-      case GL_INT_SAMPLER_2D:
-      case GL_UNSIGNED_INT_SAMPLER_2D:
-      case GL_SAMPLER_2D_SHADOW:
-        return GL_TEXTURE_2D;
-      case GL_SAMPLER_3D:
-      case GL_INT_SAMPLER_3D:
-      case GL_UNSIGNED_INT_SAMPLER_3D:
-        return GL_TEXTURE_3D;
-      case GL_SAMPLER_CUBE:
-      case GL_SAMPLER_CUBE_SHADOW:
-        return GL_TEXTURE_CUBE_MAP;
-      case GL_INT_SAMPLER_CUBE:
-      case GL_UNSIGNED_INT_SAMPLER_CUBE:
-        return GL_TEXTURE_CUBE_MAP;
-      case GL_SAMPLER_2D_ARRAY:
-      case GL_INT_SAMPLER_2D_ARRAY:
-      case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
-      case GL_SAMPLER_2D_ARRAY_SHADOW:
-        return GL_TEXTURE_2D_ARRAY;
-      default: UNREACHABLE();
-    }
-
-    return GL_TEXTURE_2D;
-}
-
-void GetDefaultInputLayoutFromShader(const std::vector&lt;sh::Attribute&gt; &amp;shaderAttributes, gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS])
-{
-    size_t layoutIndex = 0;
-    for (size_t attributeIndex = 0; attributeIndex &lt; shaderAttributes.size(); attributeIndex++)
-    {
-        ASSERT(layoutIndex &lt; gl::MAX_VERTEX_ATTRIBS);
-
-        const sh::Attribute &amp;shaderAttr = shaderAttributes[attributeIndex];
-
</del><span class="cx">         if (shaderAttr.type != GL_NONE)
</span><span class="cx">         {
</span><span class="cx">             GLenum transposedType = gl::TransposeMatrixType(shaderAttr.type);
</span><span class="cx"> 
</span><del>-            for (size_t rowIndex = 0; static_cast&lt;int&gt;(rowIndex) &lt; gl::VariableRowCount(transposedType); rowIndex++, layoutIndex++)
</del><ins>+            for (size_t rowIndex = 0;
+                 static_cast&lt;int&gt;(rowIndex) &lt; gl::VariableRowCount(transposedType); ++rowIndex)
</ins><span class="cx">             {
</span><del>-                gl::VertexFormat *defaultFormat = &amp;inputLayout[layoutIndex];
</del><ins>+                GLenum componentType = gl::VariableComponentType(transposedType);
+                GLuint components    = static_cast&lt;GLuint&gt;(gl::VariableColumnCount(transposedType));
+                bool pureInt = (componentType != GL_FLOAT);
+                gl::VertexFormatType defaultType =
+                    gl::GetVertexFormatType(componentType, GL_FALSE, components, pureInt);
</ins><span class="cx"> 
</span><del>-                defaultFormat-&gt;mType = gl::VariableComponentType(transposedType);
-                defaultFormat-&gt;mNormalized = false;
-                defaultFormat-&gt;mPureInteger = (defaultFormat-&gt;mType != GL_FLOAT); // note: inputs can not be bool
-                defaultFormat-&gt;mComponents = gl::VariableColumnCount(transposedType);
</del><ins>+                defaultLayout.push_back(defaultType);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    return defaultLayout;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::vector&lt;GLenum&gt; GetDefaultOutputLayoutFromShader(const std::vector&lt;PixelShaderOutputVariable&gt; &amp;shaderOutputVars)
</del><ins>+std::vector&lt;GLenum&gt; GetDefaultOutputLayoutFromShader(
+    const std::vector&lt;PixelShaderOutputVariable&gt; &amp;shaderOutputVars)
</ins><span class="cx"> {
</span><span class="cx">     std::vector&lt;GLenum&gt; defaultPixelOutput;
</span><span class="cx"> 
</span><span class="cx">     if (!shaderOutputVars.empty())
</span><span class="cx">     {
</span><del>-        defaultPixelOutput.push_back(GL_COLOR_ATTACHMENT0 + shaderOutputVars[0].outputIndex);
</del><ins>+        defaultPixelOutput.push_back(GL_COLOR_ATTACHMENT0 +
+                                     static_cast&lt;unsigned int&gt;(shaderOutputVars[0].outputIndex));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return defaultPixelOutput;
</span><span class="lines">@@ -104,61 +79,473 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-struct AttributeSorter
</del><ins>+// true if varying x has a higher priority in packing than y
+bool ComparePackedVarying(const PackedVarying &amp;x, const PackedVarying &amp;y)
</ins><span class="cx"> {
</span><del>-    AttributeSorter(const ProgramImpl::SemanticIndexArray &amp;semanticIndices)
-        : originalIndices(&amp;semanticIndices)
</del><ins>+    return gl::CompareShaderVar(*x.varying, *y.varying);
+}
+
+std::vector&lt;PackedVarying&gt; MergeVaryings(const gl::Shader &amp;vertexShader,
+                                         const gl::Shader &amp;fragmentShader,
+                                         const std::vector&lt;std::string&gt; &amp;tfVaryings)
+{
+    std::vector&lt;PackedVarying&gt; packedVaryings;
+
+    for (const sh::Varying &amp;output : vertexShader.getVaryings())
</ins><span class="cx">     {
</span><ins>+        bool packed = false;
+
+        // Built-in varyings obey special rules
+        if (output.isBuiltIn())
+        {
+            continue;
+        }
+
+        for (const sh::Varying &amp;input : fragmentShader.getVaryings())
+        {
+            if (output.name == input.name)
+            {
+                if (output.isStruct())
+                {
+                    ASSERT(!output.isArray());
+                    for (const auto &amp;field : output.fields)
+                    {
+                        ASSERT(!field.isStruct() &amp;&amp; !field.isArray());
+                        packedVaryings.push_back(
+                            PackedVarying(field, input.interpolation, input.name));
+                    }
+                }
+                else
+                {
+                    packedVaryings.push_back(PackedVarying(input, input.interpolation));
+                }
+                packed = true;
+                break;
+            }
+        }
+
+        // Keep Transform FB varyings in the merged list always.
+        if (!packed)
+        {
+            for (const std::string &amp;tfVarying : tfVaryings)
+            {
+                if (tfVarying == output.name)
+                {
+                    // Transform feedback for varying structs is underspecified.
+                    // See Khronos bug 9856.
+                    // TODO(jmadill): Figure out how to be spec-compliant here.
+                    if (!output.isStruct())
+                    {
+                        packedVaryings.push_back(PackedVarying(output, output.interpolation));
+                        packedVaryings.back().vertexOnly = true;
+                    }
+                    break;
+                }
+            }
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool operator()(int a, int b)
</del><ins>+    std::sort(packedVaryings.begin(), packedVaryings.end(), ComparePackedVarying);
+
+    return packedVaryings;
+}
+
+template &lt;typename VarT&gt;
+void GetUniformBlockInfo(const std::vector&lt;VarT&gt; &amp;fields,
+                         const std::string &amp;prefix,
+                         sh::BlockLayoutEncoder *encoder,
+                         bool inRowMajorLayout,
+                         std::map&lt;std::string, sh::BlockMemberInfo&gt; *blockInfoOut)
+{
+    for (const VarT &amp;field : fields)
</ins><span class="cx">     {
</span><del>-        int indexA = (*originalIndices)[a];
-        int indexB = (*originalIndices)[b];
</del><ins>+        const std::string &amp;fieldName = (prefix.empty() ? field.name : prefix + &quot;.&quot; + field.name);
</ins><span class="cx"> 
</span><del>-        if (indexA == -1) return false;
-        if (indexB == -1) return true;
-        return (indexA &lt; indexB);
</del><ins>+        if (field.isStruct())
+        {
+            bool rowMajorLayout = (inRowMajorLayout || IsRowMajorLayout(field));
+
+            for (unsigned int arrayElement = 0; arrayElement &lt; field.elementCount(); arrayElement++)
+            {
+                encoder-&gt;enterAggregateType();
+
+                const std::string uniformElementName =
+                    fieldName + (field.isArray() ? ArrayString(arrayElement) : &quot;&quot;);
+                GetUniformBlockInfo(field.fields, uniformElementName, encoder, rowMajorLayout,
+                                    blockInfoOut);
+
+                encoder-&gt;exitAggregateType();
+            }
+        }
+        else
+        {
+            bool isRowMajorMatrix = (gl::IsMatrixType(field.type) &amp;&amp; inRowMajorLayout);
+            (*blockInfoOut)[fieldName] =
+                encoder-&gt;encodeType(field.type, field.arraySize, isRowMajorMatrix);
+        }
</ins><span class="cx">     }
</span><ins>+}
</ins><span class="cx"> 
</span><del>-    const ProgramImpl::SemanticIndexArray *originalIndices;
-};
</del><ins>+template &lt;typename T&gt;
+static inline void SetIfDirty(T *dest, const T &amp;source, bool *dirtyFlag)
+{
+    ASSERT(dest != NULL);
+    ASSERT(dirtyFlag != NULL);
</ins><span class="cx"> 
</span><ins>+    *dirtyFlag = *dirtyFlag || (memcmp(dest, &amp;source, sizeof(T)) != 0);
+    *dest      = source;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ProgramD3D::VertexExecutable::VertexExecutable(const gl::VertexFormat inputLayout[],
-                                               const GLenum signature[],
-                                               ShaderExecutableD3D *shaderExecutable)
-    : mShaderExecutable(shaderExecutable)
</del><ins>+template &lt;typename T&gt;
+bool TransposeMatrix(T *target,
+                     const GLfloat *value,
+                     int targetWidth,
+                     int targetHeight,
+                     int srcWidth,
+                     int srcHeight)
</ins><span class="cx"> {
</span><del>-    for (size_t attributeIndex = 0; attributeIndex &lt; gl::MAX_VERTEX_ATTRIBS; attributeIndex++)
</del><ins>+    bool dirty = false;
+    int copyWidth = std::min(targetHeight, srcWidth);
+    int copyHeight = std::min(targetWidth, srcHeight);
+
+    for (int x = 0; x &lt; copyWidth; x++)
</ins><span class="cx">     {
</span><del>-        mInputs[attributeIndex] = inputLayout[attributeIndex];
-        mSignature[attributeIndex] = signature[attributeIndex];
</del><ins>+        for (int y = 0; y &lt; copyHeight; y++)
+        {
+            SetIfDirty(target + (x * targetWidth + y), static_cast&lt;T&gt;(value[y * srcWidth + x]),
+                       &amp;dirty);
+        }
</ins><span class="cx">     }
</span><ins>+    // clear unfilled right side
+    for (int y = 0; y &lt; copyWidth; y++)
+    {
+        for (int x = copyHeight; x &lt; targetWidth; x++)
+        {
+            SetIfDirty(target + (y * targetWidth + x), static_cast&lt;T&gt;(0), &amp;dirty);
+        }
+    }
+    // clear unfilled bottom.
+    for (int y = copyWidth; y &lt; targetHeight; y++)
+    {
+        for (int x = 0; x &lt; targetWidth; x++)
+        {
+            SetIfDirty(target + (y * targetWidth + x), static_cast&lt;T&gt;(0), &amp;dirty);
+        }
+    }
+
+    return dirty;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template &lt;typename T&gt;
+bool ExpandMatrix(T *target,
+                  const GLfloat *value,
+                  int targetWidth,
+                  int targetHeight,
+                  int srcWidth,
+                  int srcHeight)
+{
+    bool dirty = false;
+    int copyWidth = std::min(targetWidth, srcWidth);
+    int copyHeight = std::min(targetHeight, srcHeight);
+
+    for (int y = 0; y &lt; copyHeight; y++)
+    {
+        for (int x = 0; x &lt; copyWidth; x++)
+        {
+            SetIfDirty(target + (y * targetWidth + x), static_cast&lt;T&gt;(value[y * srcWidth + x]),
+                       &amp;dirty);
+        }
+    }
+    // clear unfilled right side
+    for (int y = 0; y &lt; copyHeight; y++)
+    {
+        for (int x = copyWidth; x &lt; targetWidth; x++)
+        {
+            SetIfDirty(target + (y * targetWidth + x), static_cast&lt;T&gt;(0), &amp;dirty);
+        }
+    }
+    // clear unfilled bottom.
+    for (int y = copyHeight; y &lt; targetHeight; y++)
+    {
+        for (int x = 0; x &lt; targetWidth; x++)
+        {
+            SetIfDirty(target + (y * targetWidth + x), static_cast&lt;T&gt;(0), &amp;dirty);
+        }
+    }
+
+    return dirty;
+}
+
+gl::PrimitiveType GetGeometryShaderTypeFromDrawMode(GLenum drawMode)
+{
+    switch (drawMode)
+    {
+        // Uses the point sprite geometry shader.
+        case GL_POINTS:
+            return gl::PRIMITIVE_POINTS;
+
+        // All line drawing uses the same geometry shader.
+        case GL_LINES:
+        case GL_LINE_STRIP:
+        case GL_LINE_LOOP:
+            return gl::PRIMITIVE_LINES;
+
+        // The triangle fan primitive is emulated with strips in D3D11.
+        case GL_TRIANGLES:
+        case GL_TRIANGLE_FAN:
+            return gl::PRIMITIVE_TRIANGLES;
+
+        // Special case for triangle strips.
+        case GL_TRIANGLE_STRIP:
+            return gl::PRIMITIVE_TRIANGLE_STRIP;
+
+        default:
+            UNREACHABLE();
+            return gl::PRIMITIVE_TYPE_MAX;
+    }
+}
+
+}  // anonymous namespace
+
+// D3DUniform Implementation
+
+D3DUniform::D3DUniform(GLenum typeIn,
+                       const std::string &amp;nameIn,
+                       unsigned int arraySizeIn,
+                       bool defaultBlock)
+    : type(typeIn),
+      name(nameIn),
+      arraySize(arraySizeIn),
+      data(nullptr),
+      dirty(true),
+      vsRegisterIndex(GL_INVALID_INDEX),
+      psRegisterIndex(GL_INVALID_INDEX),
+      registerCount(0),
+      registerElement(0)
+{
+    // We use data storage for default block uniforms to cache values that are sent to D3D during
+    // rendering
+    // Uniform blocks/buffers are treated separately by the Renderer (ES3 path only)
+    if (defaultBlock)
+    {
+        size_t bytes = gl::VariableInternalSize(type) * elementCount();
+        data = new uint8_t[bytes];
+        memset(data, 0, bytes);
+
+        // TODO(jmadill): is this correct with non-square matrices?
+        registerCount = gl::VariableRowCount(type) * elementCount();
+    }
+}
+
+D3DUniform::~D3DUniform()
+{
+    SafeDeleteArray(data);
+}
+
+bool D3DUniform::isSampler() const
+{
+    return gl::IsSamplerType(type);
+}
+
+bool D3DUniform::isReferencedByVertexShader() const
+{
+    return vsRegisterIndex != GL_INVALID_INDEX;
+}
+
+bool D3DUniform::isReferencedByFragmentShader() const
+{
+    return psRegisterIndex != GL_INVALID_INDEX;
+}
+
+// D3DVarying Implementation
+
+D3DVarying::D3DVarying() : semanticIndex(0), componentCount(0), outputSlot(0)
+{
+}
+
+D3DVarying::D3DVarying(const std::string &amp;semanticNameIn,
+                       unsigned int semanticIndexIn,
+                       unsigned int componentCountIn,
+                       unsigned int outputSlotIn)
+    : semanticName(semanticNameIn),
+      semanticIndex(semanticIndexIn),
+      componentCount(componentCountIn),
+      outputSlot(outputSlotIn)
+{
+}
+
+// ProgramD3DMetadata Implementation
+
+ProgramD3DMetadata::ProgramD3DMetadata(int rendererMajorShaderModel,
+                                       const std::string &amp;shaderModelSuffix,
+                                       bool usesInstancedPointSpriteEmulation,
+                                       bool usesViewScale,
+                                       const ShaderD3D *vertexShader,
+                                       const ShaderD3D *fragmentShader)
+    : mRendererMajorShaderModel(rendererMajorShaderModel),
+      mShaderModelSuffix(shaderModelSuffix),
+      mUsesInstancedPointSpriteEmulation(usesInstancedPointSpriteEmulation),
+      mUsesViewScale(usesViewScale),
+      mVertexShader(vertexShader),
+      mFragmentShader(fragmentShader)
+{
+}
+
+int ProgramD3DMetadata::getRendererMajorShaderModel() const
+{
+    return mRendererMajorShaderModel;
+}
+
+bool ProgramD3DMetadata::usesBroadcast(const gl::Data &amp;data) const
+{
+    return (mFragmentShader-&gt;usesFragColor() &amp;&amp; data.clientVersion &lt; 3);
+}
+
+bool ProgramD3DMetadata::usesFragDepth(const gl::Program::Data &amp;programData) const
+{
+    return mFragmentShader-&gt;usesFragDepth();
+}
+
+bool ProgramD3DMetadata::usesPointCoord() const
+{
+    return mFragmentShader-&gt;usesPointCoord();
+}
+
+bool ProgramD3DMetadata::usesFragCoord() const
+{
+    return mFragmentShader-&gt;usesFragCoord();
+}
+
+bool ProgramD3DMetadata::usesPointSize() const
+{
+    return mVertexShader-&gt;usesPointSize();
+}
+
+bool ProgramD3DMetadata::usesInsertedPointCoordValue() const
+{
+    return !usesPointSize() &amp;&amp; usesPointCoord() &amp;&amp; mRendererMajorShaderModel &gt;= 4;
+}
+
+bool ProgramD3DMetadata::usesViewScale() const
+{
+    return mUsesViewScale;
+}
+
+bool ProgramD3DMetadata::addsPointCoordToVertexShader() const
+{
+    // Instanced PointSprite emulation requires that gl_PointCoord is present in the vertex shader
+    // VS_OUTPUT structure to ensure compatibility with the generated PS_INPUT of the pixel shader.
+    // GeometryShader PointSprite emulation does not require this additional entry because the
+    // GS_OUTPUT of the Geometry shader contains the pointCoord value and already matches the
+    // PS_INPUT of the generated pixel shader. The Geometry Shader point sprite implementation needs
+    // gl_PointSize to be in VS_OUTPUT and GS_INPUT. Instanced point sprites doesn't need
+    // gl_PointSize in VS_OUTPUT.
+    return (mUsesInstancedPointSpriteEmulation &amp;&amp; usesPointCoord()) ||
+           usesInsertedPointCoordValue();
+}
+
+bool ProgramD3DMetadata::usesTransformFeedbackGLPosition() const
+{
+    // gl_Position only needs to be outputted from the vertex shader if transform feedback is
+    // active. This isn't supported on D3D11 Feature Level 9_3, so we don't output gl_Position from
+    // the vertex shader in this case. This saves us 1 output vector.
+    return !(mRendererMajorShaderModel &gt;= 4 &amp;&amp; mShaderModelSuffix != &quot;&quot;);
+}
+
+bool ProgramD3DMetadata::usesSystemValuePointSize() const
+{
+    return !mUsesInstancedPointSpriteEmulation &amp;&amp; usesPointSize();
+}
+
+bool ProgramD3DMetadata::usesMultipleFragmentOuts() const
+{
+    return mFragmentShader-&gt;usesMultipleRenderTargets();
+}
+
+GLint ProgramD3DMetadata::getMajorShaderVersion() const
+{
+    return mVertexShader-&gt;getData().getShaderVersion();
+}
+
+const ShaderD3D *ProgramD3DMetadata::getFragmentShader() const
+{
+    return mFragmentShader;
+}
+
+// ProgramD3D Implementation
+
+ProgramD3D::VertexExecutable::VertexExecutable(const gl::InputLayout &amp;inputLayout,
+                                               const Signature &amp;signature,
+                                               ShaderExecutableD3D *shaderExecutable)
+    : mInputs(inputLayout), mSignature(signature), mShaderExecutable(shaderExecutable)
+{
+}
+
</ins><span class="cx"> ProgramD3D::VertexExecutable::~VertexExecutable()
</span><span class="cx"> {
</span><span class="cx">     SafeDelete(mShaderExecutable);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ProgramD3D::VertexExecutable::matchesSignature(const GLenum signature[]) const
</del><ins>+// static
+ProgramD3D::VertexExecutable::HLSLAttribType ProgramD3D::VertexExecutable::GetAttribType(
+    GLenum type)
</ins><span class="cx"> {
</span><del>-    for (size_t attributeIndex = 0; attributeIndex &lt; gl::MAX_VERTEX_ATTRIBS; attributeIndex++)
</del><ins>+    switch (type)
</ins><span class="cx">     {
</span><del>-        if (mSignature[attributeIndex] != signature[attributeIndex])
-        {
</del><ins>+        case GL_INT:
+            return HLSLAttribType::SIGNED_INT;
+        case GL_UNSIGNED_INT:
+            return HLSLAttribType::UNSIGNED_INT;
+        case GL_SIGNED_NORMALIZED:
+        case GL_UNSIGNED_NORMALIZED:
+        case GL_FLOAT:
+            return HLSLAttribType::FLOAT;
+        default:
+            UNREACHABLE();
+            return HLSLAttribType::FLOAT;
+    }
+}
+
+// static
+void ProgramD3D::VertexExecutable::getSignature(RendererD3D *renderer,
+                                                const gl::InputLayout &amp;inputLayout,
+                                                Signature *signatureOut)
+{
+    signatureOut-&gt;assign(inputLayout.size(), HLSLAttribType::FLOAT);
+
+    for (size_t index = 0; index &lt; inputLayout.size(); ++index)
+    {
+        gl::VertexFormatType vertexFormatType = inputLayout[index];
+        if (vertexFormatType == gl::VERTEX_FORMAT_INVALID)
+            continue;
+
+        VertexConversionType conversionType = renderer-&gt;getVertexConversionType(vertexFormatType);
+        if ((conversionType &amp; VERTEX_CONVERT_GPU) == 0)
+            continue;
+
+        GLenum componentType = renderer-&gt;getVertexComponentType(vertexFormatType);
+        (*signatureOut)[index] = GetAttribType(componentType);
+    }
+}
+
+bool ProgramD3D::VertexExecutable::matchesSignature(const Signature &amp;signature) const
+{
+    size_t limit = std::max(mSignature.size(), signature.size());
+    for (size_t index = 0; index &lt; limit; ++index)
+    {
+        // treat undefined indexes as FLOAT
+        auto a = index &lt; signature.size() ? signature[index] : HLSLAttribType::FLOAT;
+        auto b = index &lt; mSignature.size() ? mSignature[index] : HLSLAttribType::FLOAT;
+        if (a != b)
</ins><span class="cx">             return false;
</span><del>-        }
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ProgramD3D::PixelExecutable::PixelExecutable(const std::vector&lt;GLenum&gt; &amp;outputSignature, ShaderExecutableD3D *shaderExecutable)
-    : mOutputSignature(outputSignature),
-      mShaderExecutable(shaderExecutable)
</del><ins>+ProgramD3D::PixelExecutable::PixelExecutable(const std::vector&lt;GLenum&gt; &amp;outputSignature,
+                                             ShaderExecutableD3D *shaderExecutable)
+    : mOutputSignature(outputSignature), mShaderExecutable(shaderExecutable)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -173,19 +560,18 @@
</span><span class="cx"> 
</span><span class="cx"> unsigned int ProgramD3D::mCurrentSerial = 1;
</span><span class="cx"> 
</span><del>-ProgramD3D::ProgramD3D(RendererD3D *renderer)
-    : ProgramImpl(),
</del><ins>+ProgramD3D::ProgramD3D(const gl::Program::Data &amp;data, RendererD3D *renderer)
+    : ProgramImpl(data),
</ins><span class="cx">       mRenderer(renderer),
</span><span class="cx">       mDynamicHLSL(NULL),
</span><del>-      mGeometryExecutable(NULL),
</del><ins>+      mGeometryExecutables(gl::PRIMITIVE_TYPE_MAX, nullptr),
</ins><span class="cx">       mUsesPointSize(false),
</span><ins>+      mUsesFlatInterpolation(false),
</ins><span class="cx">       mVertexUniformStorage(NULL),
</span><span class="cx">       mFragmentUniformStorage(NULL),
</span><span class="cx">       mUsedVertexSamplerRange(0),
</span><span class="cx">       mUsedPixelSamplerRange(0),
</span><span class="cx">       mDirtySamplerMapping(true),
</span><del>-      mTextureUnitTypesCache(renderer-&gt;getRendererCaps().maxCombinedTextureImageUnits),
-      mShaderVersion(100),
</del><span class="cx">       mSerial(issueSerial())
</span><span class="cx"> {
</span><span class="cx">     mDynamicHLSL = new DynamicHLSL(renderer);
</span><span class="lines">@@ -202,8 +588,13 @@
</span><span class="cx">     return mUsesPointSize &amp;&amp; mRenderer-&gt;getMajorShaderModel() &gt;= 4;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ProgramD3D::usesGeometryShader() const
</del><ins>+bool ProgramD3D::usesGeometryShader(GLenum drawMode) const
</ins><span class="cx"> {
</span><ins>+    if (drawMode != GL_POINTS)
+    {
+        return mUsesFlatInterpolation;
+    }
+
</ins><span class="cx">     return usesPointSpriteEmulation() &amp;&amp; !usesInstancedPointSpriteEmulation();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -212,30 +603,34 @@
</span><span class="cx">     return mRenderer-&gt;getWorkarounds().useInstancedPointSpriteEmulation;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLint ProgramD3D::getSamplerMapping(gl::SamplerType type, unsigned int samplerIndex, const gl::Caps &amp;caps) const
</del><ins>+GLint ProgramD3D::getSamplerMapping(gl::SamplerType type,
+                                    unsigned int samplerIndex,
+                                    const gl::Caps &amp;caps) const
</ins><span class="cx"> {
</span><span class="cx">     GLint logicalTextureUnit = -1;
</span><span class="cx"> 
</span><span class="cx">     switch (type)
</span><span class="cx">     {
</span><del>-      case gl::SAMPLER_PIXEL:
-        ASSERT(samplerIndex &lt; caps.maxTextureImageUnits);
-        if (samplerIndex &lt; mSamplersPS.size() &amp;&amp; mSamplersPS[samplerIndex].active)
-        {
-            logicalTextureUnit = mSamplersPS[samplerIndex].logicalTextureUnit;
-        }
-        break;
-      case gl::SAMPLER_VERTEX:
-        ASSERT(samplerIndex &lt; caps.maxVertexTextureImageUnits);
-        if (samplerIndex &lt; mSamplersVS.size() &amp;&amp; mSamplersVS[samplerIndex].active)
-        {
-            logicalTextureUnit = mSamplersVS[samplerIndex].logicalTextureUnit;
-        }
-        break;
-      default: UNREACHABLE();
</del><ins>+        case gl::SAMPLER_PIXEL:
+            ASSERT(samplerIndex &lt; caps.maxTextureImageUnits);
+            if (samplerIndex &lt; mSamplersPS.size() &amp;&amp; mSamplersPS[samplerIndex].active)
+            {
+                logicalTextureUnit = mSamplersPS[samplerIndex].logicalTextureUnit;
+            }
+            break;
+        case gl::SAMPLER_VERTEX:
+            ASSERT(samplerIndex &lt; caps.maxVertexTextureImageUnits);
+            if (samplerIndex &lt; mSamplersVS.size() &amp;&amp; mSamplersVS[samplerIndex].active)
+            {
+                logicalTextureUnit = mSamplersVS[samplerIndex].logicalTextureUnit;
+            }
+            break;
+        default:
+            UNREACHABLE();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (logicalTextureUnit &gt;= 0 &amp;&amp; logicalTextureUnit &lt; static_cast&lt;GLint&gt;(caps.maxCombinedTextureImageUnits))
</del><ins>+    if (logicalTextureUnit &gt;= 0 &amp;&amp;
+        logicalTextureUnit &lt; static_cast&lt;GLint&gt;(caps.maxCombinedTextureImageUnits))
</ins><span class="cx">     {
</span><span class="cx">         return logicalTextureUnit;
</span><span class="cx">     }
</span><span class="lines">@@ -249,31 +644,32 @@
</span><span class="cx"> {
</span><span class="cx">     switch (type)
</span><span class="cx">     {
</span><del>-      case gl::SAMPLER_PIXEL:
-        ASSERT(samplerIndex &lt; mSamplersPS.size());
-        ASSERT(mSamplersPS[samplerIndex].active);
-        return mSamplersPS[samplerIndex].textureType;
-      case gl::SAMPLER_VERTEX:
-        ASSERT(samplerIndex &lt; mSamplersVS.size());
-        ASSERT(mSamplersVS[samplerIndex].active);
-        return mSamplersVS[samplerIndex].textureType;
-      default: UNREACHABLE();
</del><ins>+        case gl::SAMPLER_PIXEL:
+            ASSERT(samplerIndex &lt; mSamplersPS.size());
+            ASSERT(mSamplersPS[samplerIndex].active);
+            return mSamplersPS[samplerIndex].textureType;
+        case gl::SAMPLER_VERTEX:
+            ASSERT(samplerIndex &lt; mSamplersVS.size());
+            ASSERT(mSamplersVS[samplerIndex].active);
+            return mSamplersVS[samplerIndex].textureType;
+        default:
+            UNREACHABLE();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return GL_TEXTURE_2D;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLint ProgramD3D::getUsedSamplerRange(gl::SamplerType type) const
</del><ins>+GLuint ProgramD3D::getUsedSamplerRange(gl::SamplerType type) const
</ins><span class="cx"> {
</span><span class="cx">     switch (type)
</span><span class="cx">     {
</span><del>-      case gl::SAMPLER_PIXEL:
-        return mUsedPixelSamplerRange;
-      case gl::SAMPLER_VERTEX:
-        return mUsedVertexSamplerRange;
-      default:
-        UNREACHABLE();
-        return 0;
</del><ins>+        case gl::SAMPLER_PIXEL:
+            return mUsedPixelSamplerRange;
+        case gl::SAMPLER_VERTEX:
+            return mUsedVertexSamplerRange;
+        default:
+            UNREACHABLE();
+            return 0u;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -287,157 +683,77 @@
</span><span class="cx">     mDirtySamplerMapping = false;
</span><span class="cx"> 
</span><span class="cx">     // Retrieve sampler uniform values
</span><del>-    for (size_t uniformIndex = 0; uniformIndex &lt; mUniforms.size(); uniformIndex++)
</del><ins>+    for (const D3DUniform *d3dUniform : mD3DUniforms)
</ins><span class="cx">     {
</span><del>-        gl::LinkedUniform *targetUniform = mUniforms[uniformIndex];
</del><ins>+        if (!d3dUniform-&gt;dirty)
+            continue;
</ins><span class="cx"> 
</span><del>-        if (targetUniform-&gt;dirty)
-        {
-            if (gl::IsSamplerType(targetUniform-&gt;type))
-            {
-                int count = targetUniform-&gt;elementCount();
-                GLint (*v)[4] = reinterpret_cast&lt;GLint(*)[4]&gt;(targetUniform-&gt;data);
</del><ins>+        if (!d3dUniform-&gt;isSampler())
+            continue;
</ins><span class="cx"> 
</span><del>-                if (targetUniform-&gt;isReferencedByFragmentShader())
-                {
-                    unsigned int firstIndex = targetUniform-&gt;psRegisterIndex;
</del><ins>+        int count = d3dUniform-&gt;elementCount();
+        const GLint(*v)[4] = reinterpret_cast&lt;const GLint(*)[4]&gt;(d3dUniform-&gt;data);
</ins><span class="cx"> 
</span><del>-                    for (int i = 0; i &lt; count; i++)
-                    {
-                        unsigned int samplerIndex = firstIndex + i;
-
-                        if (samplerIndex &lt; mSamplersPS.size())
-                        {
-                            ASSERT(mSamplersPS[samplerIndex].active);
-                            mSamplersPS[samplerIndex].logicalTextureUnit = v[i][0];
-                        }
-                    }
-                }
-
-                if (targetUniform-&gt;isReferencedByVertexShader())
-                {
-                    unsigned int firstIndex = targetUniform-&gt;vsRegisterIndex;
-
-                    for (int i = 0; i &lt; count; i++)
-                    {
-                        unsigned int samplerIndex = firstIndex + i;
-
-                        if (samplerIndex &lt; mSamplersVS.size())
-                        {
-                            ASSERT(mSamplersVS[samplerIndex].active);
-                            mSamplersVS[samplerIndex].logicalTextureUnit = v[i][0];
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-bool ProgramD3D::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &amp;caps)
-{
-    // Skip cache if we're using an infolog, so we get the full error.
-    // Also skip the cache if the sample mapping has changed, or if we haven't ever validated.
-    if (!mDirtySamplerMapping &amp;&amp; infoLog == nullptr &amp;&amp; mCachedValidateSamplersResult.valid())
-    {
-        return mCachedValidateSamplersResult.value();
-    }
-
-    // if any two active samplers in a program are of different types, but refer to the same
-    // texture image unit, and this is the current program, then ValidateProgram will fail, and
-    // DrawArrays and DrawElements will issue the INVALID_OPERATION error.
-    updateSamplerMapping();
-
-    std::fill(mTextureUnitTypesCache.begin(), mTextureUnitTypesCache.end(), GL_NONE);
-
-    for (unsigned int i = 0; i &lt; mUsedPixelSamplerRange; ++i)
-    {
-        if (mSamplersPS[i].active)
</del><ins>+        if (d3dUniform-&gt;isReferencedByFragmentShader())
</ins><span class="cx">         {
</span><del>-            unsigned int unit = mSamplersPS[i].logicalTextureUnit;
</del><ins>+            unsigned int firstIndex = d3dUniform-&gt;psRegisterIndex;
</ins><span class="cx"> 
</span><del>-            if (unit &gt;= caps.maxCombinedTextureImageUnits)
</del><ins>+            for (int i = 0; i &lt; count; i++)
</ins><span class="cx">             {
</span><del>-                if (infoLog)
-                {
-                    infoLog-&gt;append(&quot;Sampler uniform (%d) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)&quot;, unit, caps.maxCombinedTextureImageUnits);
-                }
</del><ins>+                unsigned int samplerIndex = firstIndex + i;
</ins><span class="cx"> 
</span><del>-                mCachedValidateSamplersResult = false;
-                return false;
-            }
-
-            if (mTextureUnitTypesCache[unit] != GL_NONE)
-            {
-                if (mSamplersPS[i].textureType != mTextureUnitTypesCache[unit])
</del><ins>+                if (samplerIndex &lt; mSamplersPS.size())
</ins><span class="cx">                 {
</span><del>-                    if (infoLog)
-                    {
-                        infoLog-&gt;append(&quot;Samplers of conflicting types refer to the same texture image unit (%d).&quot;, unit);
-                    }
-
-                    mCachedValidateSamplersResult = false;
-                    return false;
</del><ins>+                    ASSERT(mSamplersPS[samplerIndex].active);
+                    mSamplersPS[samplerIndex].logicalTextureUnit = v[i][0];
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><del>-            else
-            {
-                mTextureUnitTypesCache[unit] = mSamplersPS[i].textureType;
-            }
</del><span class="cx">         }
</span><del>-    }
</del><span class="cx"> 
</span><del>-    for (unsigned int i = 0; i &lt; mUsedVertexSamplerRange; ++i)
-    {
-        if (mSamplersVS[i].active)
</del><ins>+        if (d3dUniform-&gt;isReferencedByVertexShader())
</ins><span class="cx">         {
</span><del>-            unsigned int unit = mSamplersVS[i].logicalTextureUnit;
</del><ins>+            unsigned int firstIndex = d3dUniform-&gt;vsRegisterIndex;
</ins><span class="cx"> 
</span><del>-            if (unit &gt;= caps.maxCombinedTextureImageUnits)
</del><ins>+            for (int i = 0; i &lt; count; i++)
</ins><span class="cx">             {
</span><del>-                if (infoLog)
-                {
-                    infoLog-&gt;append(&quot;Sampler uniform (%d) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)&quot;, unit, caps.maxCombinedTextureImageUnits);
-                }
</del><ins>+                unsigned int samplerIndex = firstIndex + i;
</ins><span class="cx"> 
</span><del>-                mCachedValidateSamplersResult = false;
-                return false;
-            }
-
-            if (mTextureUnitTypesCache[unit] != GL_NONE)
-            {
-                if (mSamplersVS[i].textureType != mTextureUnitTypesCache[unit])
</del><ins>+                if (samplerIndex &lt; mSamplersVS.size())
</ins><span class="cx">                 {
</span><del>-                    if (infoLog)
-                    {
-                        infoLog-&gt;append(&quot;Samplers of conflicting types refer to the same texture image unit (%d).&quot;, unit);
-                    }
-
-                    mCachedValidateSamplersResult = false;
-                    return false;
</del><ins>+                    ASSERT(mSamplersVS[samplerIndex].active);
+                    mSamplersVS[samplerIndex].logicalTextureUnit = v[i][0];
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><del>-            else
-            {
-                mTextureUnitTypesCache[unit] = mSamplersVS[i].textureType;
-            }
</del><span class="cx">         }
</span><span class="cx">     }
</span><del>-
-    mCachedValidateSamplersResult = true;
-    return true;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LinkResult ProgramD3D::load(gl::InfoLog &amp;infoLog, gl::BinaryInputStream *stream)
</span><span class="cx"> {
</span><ins>+    reset();
+
+    DeviceIdentifier binaryDeviceIdentifier = {0};
+    stream-&gt;readBytes(reinterpret_cast&lt;unsigned char *&gt;(&amp;binaryDeviceIdentifier),
+                      sizeof(DeviceIdentifier));
+
+    DeviceIdentifier identifier = mRenderer-&gt;getAdapterIdentifier();
+    if (memcmp(&amp;identifier, &amp;binaryDeviceIdentifier, sizeof(DeviceIdentifier)) != 0)
+    {
+        infoLog &lt;&lt; &quot;Invalid program binary, device configuration has changed.&quot;;
+        return LinkResult(false, gl::Error(GL_NO_ERROR));
+    }
+
</ins><span class="cx">     int compileFlags = stream-&gt;readInt&lt;int&gt;();
</span><span class="cx">     if (compileFlags != ANGLE_COMPILE_OPTIMIZATION_LEVEL)
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Mismatched compilation flags.&quot;);
</del><ins>+        infoLog &lt;&lt; &quot;Mismatched compilation flags.&quot;;
</ins><span class="cx">         return LinkResult(false, gl::Error(GL_NO_ERROR));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    stream-&gt;readInt(&amp;mShaderVersion);
</del><ins>+    for (int &amp;index : mAttribLocationToD3DSemantic)
+    {
+        stream-&gt;readInt(&amp;index);
+    }
</ins><span class="cx"> 
</span><span class="cx">     const unsigned int psSamplerCount = stream-&gt;readInt&lt;unsigned int&gt;();
</span><span class="cx">     for (unsigned int i = 0; i &lt; psSamplerCount; ++i)
</span><span class="lines">@@ -464,105 +780,69 @@
</span><span class="cx">     const unsigned int uniformCount = stream-&gt;readInt&lt;unsigned int&gt;();
</span><span class="cx">     if (stream-&gt;error())
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Invalid program binary.&quot;);
</del><ins>+        infoLog &lt;&lt; &quot;Invalid program binary.&quot;;
</ins><span class="cx">         return LinkResult(false, gl::Error(GL_NO_ERROR));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mUniforms.resize(uniformCount);
</del><ins>+    const auto &amp;linkedUniforms = mData.getUniforms();
+    ASSERT(mD3DUniforms.empty());
</ins><span class="cx">     for (unsigned int uniformIndex = 0; uniformIndex &lt; uniformCount; uniformIndex++)
</span><span class="cx">     {
</span><del>-        GLenum type = stream-&gt;readInt&lt;GLenum&gt;();
-        GLenum precision = stream-&gt;readInt&lt;GLenum&gt;();
-        std::string name = stream-&gt;readString();
-        unsigned int arraySize = stream-&gt;readInt&lt;unsigned int&gt;();
-        int blockIndex = stream-&gt;readInt&lt;int&gt;();
</del><ins>+        const gl::LinkedUniform &amp;linkedUniform = linkedUniforms[uniformIndex];
</ins><span class="cx"> 
</span><del>-        int offset = stream-&gt;readInt&lt;int&gt;();
-        int arrayStride = stream-&gt;readInt&lt;int&gt;();
-        int matrixStride = stream-&gt;readInt&lt;int&gt;();
-        bool isRowMajorMatrix = stream-&gt;readBool();
</del><ins>+        D3DUniform *d3dUniform =
+            new D3DUniform(linkedUniform.type, linkedUniform.name, linkedUniform.arraySize,
+                           linkedUniform.isInDefaultBlock());
+        stream-&gt;readInt(&amp;d3dUniform-&gt;psRegisterIndex);
+        stream-&gt;readInt(&amp;d3dUniform-&gt;vsRegisterIndex);
+        stream-&gt;readInt(&amp;d3dUniform-&gt;registerCount);
+        stream-&gt;readInt(&amp;d3dUniform-&gt;registerElement);
</ins><span class="cx"> 
</span><del>-        const sh::BlockMemberInfo blockInfo(offset, arrayStride, matrixStride, isRowMajorMatrix);
-
-        gl::LinkedUniform *uniform = new gl::LinkedUniform(type, precision, name, arraySize, blockIndex, blockInfo);
-
-        stream-&gt;readInt(&amp;uniform-&gt;psRegisterIndex);
-        stream-&gt;readInt(&amp;uniform-&gt;vsRegisterIndex);
-        stream-&gt;readInt(&amp;uniform-&gt;registerCount);
-        stream-&gt;readInt(&amp;uniform-&gt;registerElement);
-
-        mUniforms[uniformIndex] = uniform;
</del><ins>+        mD3DUniforms.push_back(d3dUniform);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const unsigned int uniformIndexCount = stream-&gt;readInt&lt;unsigned int&gt;();
</del><ins>+    const unsigned int blockCount = stream-&gt;readInt&lt;unsigned int&gt;();
</ins><span class="cx">     if (stream-&gt;error())
</span><span class="cx">     {
</span><del>-        infoLog.append(&quot;Invalid program binary.&quot;);
</del><ins>+        infoLog &lt;&lt; &quot;Invalid program binary.&quot;;
</ins><span class="cx">         return LinkResult(false, gl::Error(GL_NO_ERROR));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mUniformIndex.resize(uniformIndexCount);
-    for (unsigned int uniformIndexIndex = 0; uniformIndexIndex &lt; uniformIndexCount; uniformIndexIndex++)
</del><ins>+    ASSERT(mD3DUniformBlocks.empty());
+    for (unsigned int blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)
</ins><span class="cx">     {
</span><del>-        stream-&gt;readString(&amp;mUniformIndex[uniformIndexIndex].name);
-        stream-&gt;readInt(&amp;mUniformIndex[uniformIndexIndex].element);
-        stream-&gt;readInt(&amp;mUniformIndex[uniformIndexIndex].index);
</del><ins>+        D3DUniformBlock uniformBlock;
+        stream-&gt;readInt(&amp;uniformBlock.psRegisterIndex);
+        stream-&gt;readInt(&amp;uniformBlock.vsRegisterIndex);
+        mD3DUniformBlocks.push_back(uniformBlock);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    unsigned int uniformBlockCount = stream-&gt;readInt&lt;unsigned int&gt;();
-    if (stream-&gt;error())
</del><ins>+    const unsigned int streamOutVaryingCount = stream-&gt;readInt&lt;unsigned int&gt;();
+    mStreamOutVaryings.resize(streamOutVaryingCount);
+    for (unsigned int varyingIndex = 0; varyingIndex &lt; streamOutVaryingCount; ++varyingIndex)
</ins><span class="cx">     {
</span><del>-        infoLog.append(&quot;Invalid program binary.&quot;);
-        return LinkResult(false, gl::Error(GL_NO_ERROR));
-    }
</del><ins>+        D3DVarying *varying = &amp;mStreamOutVaryings[varyingIndex];
</ins><span class="cx"> 
</span><del>-    mUniformBlocks.resize(uniformBlockCount);
-    for (unsigned int uniformBlockIndex = 0; uniformBlockIndex &lt; uniformBlockCount; ++uniformBlockIndex)
-    {
-        std::string name = stream-&gt;readString();
-        unsigned int elementIndex = stream-&gt;readInt&lt;unsigned int&gt;();
-        unsigned int dataSize = stream-&gt;readInt&lt;unsigned int&gt;();
-
-        gl::UniformBlock *uniformBlock = new gl::UniformBlock(name, elementIndex, dataSize);
-
-        stream-&gt;readInt(&amp;uniformBlock-&gt;psRegisterIndex);
-        stream-&gt;readInt(&amp;uniformBlock-&gt;vsRegisterIndex);
-
-        unsigned int numMembers = stream-&gt;readInt&lt;unsigned int&gt;();
-        uniformBlock-&gt;memberUniformIndexes.resize(numMembers);
-        for (unsigned int blockMemberIndex = 0; blockMemberIndex &lt; numMembers; blockMemberIndex++)
-        {
-            stream-&gt;readInt(&amp;uniformBlock-&gt;memberUniformIndexes[blockMemberIndex]);
-        }
-
-        mUniformBlocks[uniformBlockIndex] = uniformBlock;
</del><ins>+        stream-&gt;readString(&amp;varying-&gt;semanticName);
+        stream-&gt;readInt(&amp;varying-&gt;semanticIndex);
+        stream-&gt;readInt(&amp;varying-&gt;componentCount);
+        stream-&gt;readInt(&amp;varying-&gt;outputSlot);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    stream-&gt;readInt(&amp;mTransformFeedbackBufferMode);
-    const unsigned int transformFeedbackVaryingCount = stream-&gt;readInt&lt;unsigned int&gt;();
-    mTransformFeedbackLinkedVaryings.resize(transformFeedbackVaryingCount);
-    for (unsigned int varyingIndex = 0; varyingIndex &lt; transformFeedbackVaryingCount; varyingIndex++)
-    {
-        gl::LinkedVarying &amp;varying = mTransformFeedbackLinkedVaryings[varyingIndex];
-
-        stream-&gt;readString(&amp;varying.name);
-        stream-&gt;readInt(&amp;varying.type);
-        stream-&gt;readInt(&amp;varying.size);
-        stream-&gt;readString(&amp;varying.semanticName);
-        stream-&gt;readInt(&amp;varying.semanticIndex);
-        stream-&gt;readInt(&amp;varying.semanticIndexCount);
-    }
-
</del><span class="cx">     stream-&gt;readString(&amp;mVertexHLSL);
</span><del>-    stream-&gt;readBytes(reinterpret_cast&lt;unsigned char*&gt;(&amp;mVertexWorkarounds), sizeof(D3DCompilerWorkarounds));
</del><ins>+    stream-&gt;readBytes(reinterpret_cast&lt;unsigned char *&gt;(&amp;mVertexWorkarounds),
+                      sizeof(D3DCompilerWorkarounds));
</ins><span class="cx">     stream-&gt;readString(&amp;mPixelHLSL);
</span><del>-    stream-&gt;readBytes(reinterpret_cast&lt;unsigned char*&gt;(&amp;mPixelWorkarounds), sizeof(D3DCompilerWorkarounds));
</del><ins>+    stream-&gt;readBytes(reinterpret_cast&lt;unsigned char *&gt;(&amp;mPixelWorkarounds),
+                      sizeof(D3DCompilerWorkarounds));
</ins><span class="cx">     stream-&gt;readBool(&amp;mUsesFragDepth);
</span><span class="cx">     stream-&gt;readBool(&amp;mUsesPointSize);
</span><ins>+    stream-&gt;readBool(&amp;mUsesFlatInterpolation);
</ins><span class="cx"> 
</span><span class="cx">     const size_t pixelShaderKeySize = stream-&gt;readInt&lt;unsigned int&gt;();
</span><span class="cx">     mPixelShaderKey.resize(pixelShaderKeySize);
</span><del>-    for (size_t pixelShaderKeyIndex = 0; pixelShaderKeyIndex &lt; pixelShaderKeySize; pixelShaderKeyIndex++)
</del><ins>+    for (size_t pixelShaderKeyIndex = 0; pixelShaderKeyIndex &lt; pixelShaderKeySize;
+         pixelShaderKeyIndex++)
</ins><span class="cx">     {
</span><span class="cx">         stream-&gt;readInt(&amp;mPixelShaderKey[pixelShaderKeyIndex].type);
</span><span class="cx">         stream-&gt;readString(&amp;mPixelShaderKey[pixelShaderKeyIndex].name);
</span><span class="lines">@@ -570,31 +850,30 @@
</span><span class="cx">         stream-&gt;readInt(&amp;mPixelShaderKey[pixelShaderKeyIndex].outputIndex);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const unsigned char* binary = reinterpret_cast&lt;const unsigned char*&gt;(stream-&gt;data());
</del><ins>+    stream-&gt;readString(&amp;mGeometryShaderPreamble);
</ins><span class="cx"> 
</span><ins>+    const unsigned char *binary = reinterpret_cast&lt;const unsigned char *&gt;(stream-&gt;data());
+
</ins><span class="cx">     const unsigned int vertexShaderCount = stream-&gt;readInt&lt;unsigned int&gt;();
</span><del>-    for (unsigned int vertexShaderIndex = 0; vertexShaderIndex &lt; vertexShaderCount; vertexShaderIndex++)
</del><ins>+    for (unsigned int vertexShaderIndex = 0; vertexShaderIndex &lt; vertexShaderCount;
+         vertexShaderIndex++)
</ins><span class="cx">     {
</span><del>-        gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS];
</del><ins>+        size_t inputLayoutSize = stream-&gt;readInt&lt;size_t&gt;();
+        gl::InputLayout inputLayout(inputLayoutSize, gl::VERTEX_FORMAT_INVALID);
</ins><span class="cx"> 
</span><del>-        for (size_t inputIndex = 0; inputIndex &lt; gl::MAX_VERTEX_ATTRIBS; inputIndex++)
</del><ins>+        for (size_t inputIndex = 0; inputIndex &lt; inputLayoutSize; inputIndex++)
</ins><span class="cx">         {
</span><del>-            gl::VertexFormat *vertexInput = &amp;inputLayout[inputIndex];
-            stream-&gt;readInt(&amp;vertexInput-&gt;mType);
-            stream-&gt;readInt(&amp;vertexInput-&gt;mNormalized);
-            stream-&gt;readInt(&amp;vertexInput-&gt;mComponents);
-            stream-&gt;readBool(&amp;vertexInput-&gt;mPureInteger);
</del><ins>+            inputLayout[inputIndex] = stream-&gt;readInt&lt;gl::VertexFormatType&gt;();
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        unsigned int vertexShaderSize = stream-&gt;readInt&lt;unsigned int&gt;();
</del><ins>+        unsigned int vertexShaderSize             = stream-&gt;readInt&lt;unsigned int&gt;();
</ins><span class="cx">         const unsigned char *vertexShaderFunction = binary + stream-&gt;offset();
</span><span class="cx"> 
</span><del>-        ShaderExecutableD3D *shaderExecutable = NULL;
-        gl::Error error = mRenderer-&gt;loadExecutable(vertexShaderFunction, vertexShaderSize,
-                                                    SHADER_VERTEX,
-                                                    mTransformFeedbackLinkedVaryings,
-                                                    (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS),
-                                                    &amp;shaderExecutable);
</del><ins>+        ShaderExecutableD3D *shaderExecutable = nullptr;
+
+        gl::Error error = mRenderer-&gt;loadExecutable(
+            vertexShaderFunction, vertexShaderSize, SHADER_VERTEX, mStreamOutVaryings,
+            (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), &amp;shaderExecutable);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return LinkResult(false, error);
</span><span class="lines">@@ -602,16 +881,17 @@
</span><span class="cx"> 
</span><span class="cx">         if (!shaderExecutable)
</span><span class="cx">         {
</span><del>-            infoLog.append(&quot;Could not create vertex shader.&quot;);
</del><ins>+            infoLog &lt;&lt; &quot;Could not create vertex shader.&quot;;
</ins><span class="cx">             return LinkResult(false, gl::Error(GL_NO_ERROR));
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // generated converted input layout
</span><del>-        GLenum signature[gl::MAX_VERTEX_ATTRIBS];
-        getInputLayoutSignature(inputLayout, signature);
</del><ins>+        VertexExecutable::Signature signature;
+        VertexExecutable::getSignature(mRenderer, inputLayout, &amp;signature);
</ins><span class="cx"> 
</span><span class="cx">         // add new binary
</span><del>-        mVertexExecutables.push_back(new VertexExecutable(inputLayout, signature, shaderExecutable));
</del><ins>+        mVertexExecutables.push_back(
+            new VertexExecutable(inputLayout, signature, shaderExecutable));
</ins><span class="cx"> 
</span><span class="cx">         stream-&gt;skip(vertexShaderSize);
</span><span class="cx">     }
</span><span class="lines">@@ -626,13 +906,13 @@
</span><span class="cx">             stream-&gt;readInt(&amp;outputs[outputIndex]);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        const size_t pixelShaderSize = stream-&gt;readInt&lt;unsigned int&gt;();
</del><ins>+        const size_t pixelShaderSize             = stream-&gt;readInt&lt;unsigned int&gt;();
</ins><span class="cx">         const unsigned char *pixelShaderFunction = binary + stream-&gt;offset();
</span><del>-        ShaderExecutableD3D *shaderExecutable = NULL;
-        gl::Error error = mRenderer-&gt;loadExecutable(pixelShaderFunction, pixelShaderSize, SHADER_PIXEL,
-                                                    mTransformFeedbackLinkedVaryings,
-                                                    (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS),
-                                                    &amp;shaderExecutable);
</del><ins>+        ShaderExecutableD3D *shaderExecutable    = nullptr;
+
+        gl::Error error = mRenderer-&gt;loadExecutable(
+            pixelShaderFunction, pixelShaderSize, SHADER_PIXEL, mStreamOutVaryings,
+            (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), &amp;shaderExecutable);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return LinkResult(false, error);
</span><span class="lines">@@ -640,7 +920,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (!shaderExecutable)
</span><span class="cx">         {
</span><del>-            infoLog.append(&quot;Could not create pixel shader.&quot;);
</del><ins>+            infoLog &lt;&lt; &quot;Could not create pixel shader.&quot;;
</ins><span class="cx">             return LinkResult(false, gl::Error(GL_NO_ERROR));
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -650,49 +930,55 @@
</span><span class="cx">         stream-&gt;skip(pixelShaderSize);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    unsigned int geometryShaderSize = stream-&gt;readInt&lt;unsigned int&gt;();
</del><ins>+    for (unsigned int geometryExeIndex = 0; geometryExeIndex &lt; gl::PRIMITIVE_TYPE_MAX;
+         ++geometryExeIndex)
+    {
+        unsigned int geometryShaderSize = stream-&gt;readInt&lt;unsigned int&gt;();
+        if (geometryShaderSize == 0)
+        {
+            mGeometryExecutables[geometryExeIndex] = nullptr;
+            continue;
+        }
</ins><span class="cx"> 
</span><del>-    if (geometryShaderSize &gt; 0)
-    {
</del><span class="cx">         const unsigned char *geometryShaderFunction = binary + stream-&gt;offset();
</span><del>-        gl::Error error = mRenderer-&gt;loadExecutable(geometryShaderFunction, geometryShaderSize, SHADER_GEOMETRY,
-                                                    mTransformFeedbackLinkedVaryings,
-                                                    (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS),
-                                                    &amp;mGeometryExecutable);
</del><ins>+        bool splitAttribs                           = (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS);
+
+        gl::Error error = mRenderer-&gt;loadExecutable(
+            geometryShaderFunction, geometryShaderSize, SHADER_GEOMETRY, mStreamOutVaryings,
+            splitAttribs, &amp;mGeometryExecutables[geometryExeIndex]);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return LinkResult(false, error);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!mGeometryExecutable)
</del><ins>+        if (!mGeometryExecutables[geometryExeIndex])
</ins><span class="cx">         {
</span><del>-            infoLog.append(&quot;Could not create geometry shader.&quot;);
</del><ins>+            infoLog &lt;&lt; &quot;Could not create geometry shader.&quot;;
</ins><span class="cx">             return LinkResult(false, gl::Error(GL_NO_ERROR));
</span><span class="cx">         }
</span><span class="cx">         stream-&gt;skip(geometryShaderSize);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    GUID binaryIdentifier = {0};
-    stream-&gt;readBytes(reinterpret_cast&lt;unsigned char*&gt;(&amp;binaryIdentifier), sizeof(GUID));
-
-    GUID identifier = mRenderer-&gt;getAdapterIdentifier();
-    if (memcmp(&amp;identifier, &amp;binaryIdentifier, sizeof(GUID)) != 0)
-    {
-        infoLog.append(&quot;Invalid program binary.&quot;);
-        return LinkResult(false, gl::Error(GL_NO_ERROR));
-    }
-
</del><span class="cx">     initializeUniformStorage();
</span><del>-    initAttributesByLayout();
</del><span class="cx"> 
</span><span class="cx">     return LinkResult(true, gl::Error(GL_NO_ERROR));
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
</span><span class="cx"> {
</span><ins>+    // Output the DeviceIdentifier before we output any shader code
+    // When we load the binary again later, we can validate the device identifier before trying to
+    // compile any HLSL
+    DeviceIdentifier binaryIdentifier = mRenderer-&gt;getAdapterIdentifier();
+    stream-&gt;writeBytes(reinterpret_cast&lt;unsigned char *&gt;(&amp;binaryIdentifier),
+                       sizeof(DeviceIdentifier));
+
</ins><span class="cx">     stream-&gt;writeInt(ANGLE_COMPILE_OPTIMIZATION_LEVEL);
</span><span class="cx"> 
</span><del>-    stream-&gt;writeInt(mShaderVersion);
</del><ins>+    for (int d3dSemantic : mAttribLocationToD3DSemantic)
+    {
+        stream-&gt;writeInt(d3dSemantic);
+    }
</ins><span class="cx"> 
</span><span class="cx">     stream-&gt;writeInt(mSamplersPS.size());
</span><span class="cx">     for (unsigned int i = 0; i &lt; mSamplersPS.size(); ++i)
</span><span class="lines">@@ -713,79 +999,46 @@
</span><span class="cx">     stream-&gt;writeInt(mUsedVertexSamplerRange);
</span><span class="cx">     stream-&gt;writeInt(mUsedPixelSamplerRange);
</span><span class="cx"> 
</span><del>-    stream-&gt;writeInt(mUniforms.size());
-    for (size_t uniformIndex = 0; uniformIndex &lt; mUniforms.size(); ++uniformIndex)
</del><ins>+    stream-&gt;writeInt(mD3DUniforms.size());
+    for (const D3DUniform *uniform : mD3DUniforms)
</ins><span class="cx">     {
</span><del>-        const gl::LinkedUniform &amp;uniform = *mUniforms[uniformIndex];
-
-        stream-&gt;writeInt(uniform.type);
-        stream-&gt;writeInt(uniform.precision);
-        stream-&gt;writeString(uniform.name);
-        stream-&gt;writeInt(uniform.arraySize);
-        stream-&gt;writeInt(uniform.blockIndex);
-
-        stream-&gt;writeInt(uniform.blockInfo.offset);
-        stream-&gt;writeInt(uniform.blockInfo.arrayStride);
-        stream-&gt;writeInt(uniform.blockInfo.matrixStride);
-        stream-&gt;writeInt(uniform.blockInfo.isRowMajorMatrix);
-
-        stream-&gt;writeInt(uniform.psRegisterIndex);
-        stream-&gt;writeInt(uniform.vsRegisterIndex);
-        stream-&gt;writeInt(uniform.registerCount);
-        stream-&gt;writeInt(uniform.registerElement);
</del><ins>+        // Type, name and arraySize are redundant, so aren't stored in the binary.
+        stream-&gt;writeInt(uniform-&gt;psRegisterIndex);
+        stream-&gt;writeInt(uniform-&gt;vsRegisterIndex);
+        stream-&gt;writeInt(uniform-&gt;registerCount);
+        stream-&gt;writeInt(uniform-&gt;registerElement);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    stream-&gt;writeInt(mUniformIndex.size());
-    for (size_t i = 0; i &lt; mUniformIndex.size(); ++i)
</del><ins>+    stream-&gt;writeInt(mD3DUniformBlocks.size());
+    for (const D3DUniformBlock &amp;uniformBlock : mD3DUniformBlocks)
</ins><span class="cx">     {
</span><del>-        stream-&gt;writeString(mUniformIndex[i].name);
-        stream-&gt;writeInt(mUniformIndex[i].element);
-        stream-&gt;writeInt(mUniformIndex[i].index);
-    }
-
-    stream-&gt;writeInt(mUniformBlocks.size());
-    for (size_t uniformBlockIndex = 0; uniformBlockIndex &lt; mUniformBlocks.size(); ++uniformBlockIndex)
-    {
-        const gl::UniformBlock&amp; uniformBlock = *mUniformBlocks[uniformBlockIndex];
-
-        stream-&gt;writeString(uniformBlock.name);
-        stream-&gt;writeInt(uniformBlock.elementIndex);
-        stream-&gt;writeInt(uniformBlock.dataSize);
-
-        stream-&gt;writeInt(uniformBlock.memberUniformIndexes.size());
-        for (unsigned int blockMemberIndex = 0; blockMemberIndex &lt; uniformBlock.memberUniformIndexes.size(); blockMemberIndex++)
-        {
-            stream-&gt;writeInt(uniformBlock.memberUniformIndexes[blockMemberIndex]);
-        }
-
</del><span class="cx">         stream-&gt;writeInt(uniformBlock.psRegisterIndex);
</span><span class="cx">         stream-&gt;writeInt(uniformBlock.vsRegisterIndex);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    stream-&gt;writeInt(mTransformFeedbackBufferMode);
-    stream-&gt;writeInt(mTransformFeedbackLinkedVaryings.size());
-    for (size_t i = 0; i &lt; mTransformFeedbackLinkedVaryings.size(); i++)
</del><ins>+    stream-&gt;writeInt(mStreamOutVaryings.size());
+    for (const auto &amp;varying : mStreamOutVaryings)
</ins><span class="cx">     {
</span><del>-        const gl::LinkedVarying &amp;varying = mTransformFeedbackLinkedVaryings[i];
-
-        stream-&gt;writeString(varying.name);
-        stream-&gt;writeInt(varying.type);
-        stream-&gt;writeInt(varying.size);
</del><span class="cx">         stream-&gt;writeString(varying.semanticName);
</span><span class="cx">         stream-&gt;writeInt(varying.semanticIndex);
</span><del>-        stream-&gt;writeInt(varying.semanticIndexCount);
</del><ins>+        stream-&gt;writeInt(varying.componentCount);
+        stream-&gt;writeInt(varying.outputSlot);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     stream-&gt;writeString(mVertexHLSL);
</span><del>-    stream-&gt;writeBytes(reinterpret_cast&lt;unsigned char*&gt;(&amp;mVertexWorkarounds), sizeof(D3DCompilerWorkarounds));
</del><ins>+    stream-&gt;writeBytes(reinterpret_cast&lt;unsigned char *&gt;(&amp;mVertexWorkarounds),
+                       sizeof(D3DCompilerWorkarounds));
</ins><span class="cx">     stream-&gt;writeString(mPixelHLSL);
</span><del>-    stream-&gt;writeBytes(reinterpret_cast&lt;unsigned char*&gt;(&amp;mPixelWorkarounds), sizeof(D3DCompilerWorkarounds));
</del><ins>+    stream-&gt;writeBytes(reinterpret_cast&lt;unsigned char *&gt;(&amp;mPixelWorkarounds),
+                       sizeof(D3DCompilerWorkarounds));
</ins><span class="cx">     stream-&gt;writeInt(mUsesFragDepth);
</span><span class="cx">     stream-&gt;writeInt(mUsesPointSize);
</span><ins>+    stream-&gt;writeInt(mUsesFlatInterpolation);
</ins><span class="cx"> 
</span><span class="cx">     const std::vector&lt;PixelShaderOutputVariable&gt; &amp;pixelShaderKey = mPixelShaderKey;
</span><span class="cx">     stream-&gt;writeInt(pixelShaderKey.size());
</span><del>-    for (size_t pixelShaderKeyIndex = 0; pixelShaderKeyIndex &lt; pixelShaderKey.size(); pixelShaderKeyIndex++)
</del><ins>+    for (size_t pixelShaderKeyIndex = 0; pixelShaderKeyIndex &lt; pixelShaderKey.size();
+         pixelShaderKeyIndex++)
</ins><span class="cx">     {
</span><span class="cx">         const PixelShaderOutputVariable &amp;variable = pixelShaderKey[pixelShaderKeyIndex];
</span><span class="cx">         stream-&gt;writeInt(variable.type);
</span><span class="lines">@@ -794,18 +1047,20 @@
</span><span class="cx">         stream-&gt;writeInt(variable.outputIndex);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    stream-&gt;writeString(mGeometryShaderPreamble);
+
</ins><span class="cx">     stream-&gt;writeInt(mVertexExecutables.size());
</span><del>-    for (size_t vertexExecutableIndex = 0; vertexExecutableIndex &lt; mVertexExecutables.size(); vertexExecutableIndex++)
</del><ins>+    for (size_t vertexExecutableIndex = 0; vertexExecutableIndex &lt; mVertexExecutables.size();
+         vertexExecutableIndex++)
</ins><span class="cx">     {
</span><span class="cx">         VertexExecutable *vertexExecutable = mVertexExecutables[vertexExecutableIndex];
</span><span class="cx"> 
</span><del>-        for (size_t inputIndex = 0; inputIndex &lt; gl::MAX_VERTEX_ATTRIBS; inputIndex++)
</del><ins>+        const auto &amp;inputLayout = vertexExecutable-&gt;inputs();
+        stream-&gt;writeInt(inputLayout.size());
+
+        for (size_t inputIndex = 0; inputIndex &lt; inputLayout.size(); inputIndex++)
</ins><span class="cx">         {
</span><del>-            const gl::VertexFormat &amp;vertexInput = vertexExecutable-&gt;inputs()[inputIndex];
-            stream-&gt;writeInt(vertexInput.mType);
-            stream-&gt;writeInt(vertexInput.mNormalized);
-            stream-&gt;writeInt(vertexInput.mComponents);
-            stream-&gt;writeInt(vertexInput.mPureInteger);
</del><ins>+            stream-&gt;writeInt(inputLayout[inputIndex]);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         size_t vertexShaderSize = vertexExecutable-&gt;shaderExecutable()-&gt;getLength();
</span><span class="lines">@@ -816,7 +1071,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     stream-&gt;writeInt(mPixelExecutables.size());
</span><del>-    for (size_t pixelExecutableIndex = 0; pixelExecutableIndex &lt; mPixelExecutables.size(); pixelExecutableIndex++)
</del><ins>+    for (size_t pixelExecutableIndex = 0; pixelExecutableIndex &lt; mPixelExecutables.size();
+         pixelExecutableIndex++)
</ins><span class="cx">     {
</span><span class="cx">         PixelExecutable *pixelExecutable = mPixelExecutables[pixelExecutableIndex];
</span><span class="cx"> 
</span><span class="lines">@@ -834,27 +1090,33 @@
</span><span class="cx">         stream-&gt;writeBytes(pixelBlob, pixelShaderSize);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    size_t geometryShaderSize = (mGeometryExecutable != NULL) ? mGeometryExecutable-&gt;getLength() : 0;
-    stream-&gt;writeInt(geometryShaderSize);
</del><ins>+    for (const ShaderExecutableD3D *geometryExe : mGeometryExecutables)
+    {
+        if (geometryExe == nullptr)
+        {
+            stream-&gt;writeInt(0);
+            continue;
+        }
</ins><span class="cx"> 
</span><del>-    if (mGeometryExecutable != NULL &amp;&amp; geometryShaderSize &gt; 0)
-    {
-        const uint8_t *geometryBlob = mGeometryExecutable-&gt;getFunction();
-        stream-&gt;writeBytes(geometryBlob, geometryShaderSize);
</del><ins>+        size_t geometryShaderSize = geometryExe-&gt;getLength();
+        stream-&gt;writeInt(geometryShaderSize);
+        stream-&gt;writeBytes(geometryExe-&gt;getFunction(), geometryShaderSize);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    GUID binaryIdentifier = mRenderer-&gt;getAdapterIdentifier();
-    stream-&gt;writeBytes(reinterpret_cast&lt;unsigned char*&gt;(&amp;binaryIdentifier), sizeof(GUID));
-
</del><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error ProgramD3D::getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo, ShaderExecutableD3D **outExecutable)
</del><ins>+void ProgramD3D::setBinaryRetrievableHint(bool /* retrievable */)
</ins><span class="cx"> {
</span><ins>+}
+
+gl::Error ProgramD3D::getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo,
+                                                       ShaderExecutableD3D **outExecutable)
+{
</ins><span class="cx">     mPixelShaderOutputFormatCache.clear();
</span><span class="cx"> 
</span><span class="cx">     const FramebufferD3D *fboD3D = GetImplAs&lt;FramebufferD3D&gt;(fbo);
</span><del>-    const gl::AttachmentList &amp;colorbuffers = fboD3D-&gt;getColorAttachmentsForRender(mRenderer-&gt;getWorkarounds());
</del><ins>+    const gl::AttachmentList &amp;colorbuffers = fboD3D-&gt;getColorAttachmentsForRender();
</ins><span class="cx"> 
</span><span class="cx">     for (size_t colorAttachment = 0; colorAttachment &lt; colorbuffers.size(); ++colorAttachment)
</span><span class="cx">     {
</span><span class="lines">@@ -862,7 +1124,9 @@
</span><span class="cx"> 
</span><span class="cx">         if (colorbuffer)
</span><span class="cx">         {
</span><del>-            mPixelShaderOutputFormatCache.push_back(colorbuffer-&gt;getBinding() == GL_BACK ? GL_COLOR_ATTACHMENT0 : colorbuffer-&gt;getBinding());
</del><ins>+            mPixelShaderOutputFormatCache.push_back(colorbuffer-&gt;getBinding() == GL_BACK
+                                                        ? GL_COLOR_ATTACHMENT0
+                                                        : colorbuffer-&gt;getBinding());
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="lines">@@ -886,8 +1150,8 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    std::string finalPixelHLSL = mDynamicHLSL-&gt;generatePixelShaderForOutputSignature(mPixelHLSL, mPixelShaderKey, mUsesFragDepth,
-                                                                                     outputSignature);
</del><ins>+    std::string finalPixelHLSL = mDynamicHLSL-&gt;generatePixelShaderForOutputSignature(
+        mPixelHLSL, mPixelShaderKey, mUsesFragDepth, outputSignature);
</ins><span class="cx"> 
</span><span class="cx">     // Generate new pixel executable
</span><span class="cx">     ShaderExecutableD3D *pixelExecutable = NULL;
</span><span class="lines">@@ -895,10 +1159,10 @@
</span><span class="cx">     gl::InfoLog tempInfoLog;
</span><span class="cx">     gl::InfoLog *currentInfoLog = infoLog ? infoLog : &amp;tempInfoLog;
</span><span class="cx"> 
</span><del>-    gl::Error error = mRenderer-&gt;compileToExecutable(*currentInfoLog, finalPixelHLSL, SHADER_PIXEL,
-                                                     mTransformFeedbackLinkedVaryings,
-                                                     (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS),
-                                                     mPixelWorkarounds, &amp;pixelExecutable);
</del><ins>+    gl::Error error = mRenderer-&gt;compileToExecutable(
+        *currentInfoLog, finalPixelHLSL, SHADER_PIXEL, mStreamOutVaryings,
+        (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), mPixelWorkarounds,
+        &amp;pixelExecutable);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -911,7 +1175,7 @@
</span><span class="cx">     else if (!infoLog)
</span><span class="cx">     {
</span><span class="cx">         std::vector&lt;char&gt; tempCharBuffer(tempInfoLog.getLength() + 3);
</span><del>-        tempInfoLog.getLog(tempInfoLog.getLength(), NULL, &amp;tempCharBuffer[0]);
</del><ins>+        tempInfoLog.getLog(static_cast&lt;GLsizei&gt;(tempInfoLog.getLength()), NULL, &amp;tempCharBuffer[0]);
</ins><span class="cx">         ERR(&quot;Error compiling dynamic pixel executable:\n%s\n&quot;, &amp;tempCharBuffer[0]);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -919,16 +1183,15 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error ProgramD3D::getVertexExecutableForInputLayout(const gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS],
</del><ins>+gl::Error ProgramD3D::getVertexExecutableForInputLayout(const gl::InputLayout &amp;inputLayout,
</ins><span class="cx">                                                         ShaderExecutableD3D **outExectuable,
</span><span class="cx">                                                         gl::InfoLog *infoLog)
</span><span class="cx"> {
</span><del>-    GLenum signature[gl::MAX_VERTEX_ATTRIBS];
-    getInputLayoutSignature(inputLayout, signature);
</del><ins>+    VertexExecutable::getSignature(mRenderer, inputLayout, &amp;mCachedVertexSignature);
</ins><span class="cx"> 
</span><span class="cx">     for (size_t executableIndex = 0; executableIndex &lt; mVertexExecutables.size(); executableIndex++)
</span><span class="cx">     {
</span><del>-        if (mVertexExecutables[executableIndex]-&gt;matchesSignature(signature))
</del><ins>+        if (mVertexExecutables[executableIndex]-&gt;matchesSignature(mCachedVertexSignature))
</ins><span class="cx">         {
</span><span class="cx">             *outExectuable = mVertexExecutables[executableIndex]-&gt;shaderExecutable();
</span><span class="cx">             return gl::Error(GL_NO_ERROR);
</span><span class="lines">@@ -936,7 +1199,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Generate new dynamic layout with attribute conversions
</span><del>-    std::string finalVertexHLSL = mDynamicHLSL-&gt;generateVertexShaderForInputLayout(mVertexHLSL, inputLayout, getShaderAttributes());
</del><ins>+    std::string finalVertexHLSL = mDynamicHLSL-&gt;generateVertexShaderForInputLayout(
+        mVertexHLSL, inputLayout, mData.getAttributes());
</ins><span class="cx"> 
</span><span class="cx">     // Generate new vertex executable
</span><span class="cx">     ShaderExecutableD3D *vertexExecutable = NULL;
</span><span class="lines">@@ -944,10 +1208,10 @@
</span><span class="cx">     gl::InfoLog tempInfoLog;
</span><span class="cx">     gl::InfoLog *currentInfoLog = infoLog ? infoLog : &amp;tempInfoLog;
</span><span class="cx"> 
</span><del>-    gl::Error error = mRenderer-&gt;compileToExecutable(*currentInfoLog, finalVertexHLSL, SHADER_VERTEX,
-                                                     mTransformFeedbackLinkedVaryings,
-                                                     (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS),
-                                                     mVertexWorkarounds, &amp;vertexExecutable);
</del><ins>+    gl::Error error = mRenderer-&gt;compileToExecutable(
+        *currentInfoLog, finalVertexHLSL, SHADER_VERTEX, mStreamOutVaryings,
+        (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), mVertexWorkarounds,
+        &amp;vertexExecutable);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -955,12 +1219,13 @@
</span><span class="cx"> 
</span><span class="cx">     if (vertexExecutable)
</span><span class="cx">     {
</span><del>-        mVertexExecutables.push_back(new VertexExecutable(inputLayout, signature, vertexExecutable));
</del><ins>+        mVertexExecutables.push_back(
+            new VertexExecutable(inputLayout, mCachedVertexSignature, vertexExecutable));
</ins><span class="cx">     }
</span><span class="cx">     else if (!infoLog)
</span><span class="cx">     {
</span><span class="cx">         std::vector&lt;char&gt; tempCharBuffer(tempInfoLog.getLength() + 3);
</span><del>-        tempInfoLog.getLog(tempInfoLog.getLength(), NULL, &amp;tempCharBuffer[0]);
</del><ins>+        tempInfoLog.getLog(static_cast&lt;GLsizei&gt;(tempInfoLog.getLength()), NULL, &amp;tempCharBuffer[0]);
</ins><span class="cx">         ERR(&quot;Error compiling dynamic vertex executable:\n%s\n&quot;, &amp;tempCharBuffer[0]);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -968,50 +1233,96 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-LinkResult ProgramD3D::compileProgramExecutables(gl::InfoLog &amp;infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                                                 int registers)
</del><ins>+gl::Error ProgramD3D::getGeometryExecutableForPrimitiveType(const gl::Data &amp;data,
+                                                            GLenum drawMode,
+                                                            ShaderExecutableD3D **outExecutable,
+                                                            gl::InfoLog *infoLog)
</ins><span class="cx"> {
</span><del>-    ShaderD3D *vertexShaderD3D = GetImplAs&lt;ShaderD3D&gt;(vertexShader);
-    ShaderD3D *fragmentShaderD3D = GetImplAs&lt;ShaderD3D&gt;(fragmentShader);
</del><ins>+    if (outExecutable)
+    {
+        *outExecutable = nullptr;
+    }
</ins><span class="cx"> 
</span><del>-    gl::VertexFormat defaultInputLayout[gl::MAX_VERTEX_ATTRIBS];
-    GetDefaultInputLayoutFromShader(vertexShader-&gt;getActiveAttributes(), defaultInputLayout);
</del><ins>+    // Return a null shader if the current rendering doesn't use a geometry shader
+    if (!usesGeometryShader(drawMode))
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    gl::PrimitiveType geometryShaderType = GetGeometryShaderTypeFromDrawMode(drawMode);
+
+    if (mGeometryExecutables[geometryShaderType] != nullptr)
+    {
+        if (outExecutable)
+        {
+            *outExecutable = mGeometryExecutables[geometryShaderType];
+        }
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    std::string geometryHLSL = mDynamicHLSL-&gt;generateGeometryShaderHLSL(
+        geometryShaderType, data, mData, mRenderer-&gt;presentPathFastEnabled(),
+        mGeometryShaderPreamble);
+
+    gl::InfoLog tempInfoLog;
+    gl::InfoLog *currentInfoLog = infoLog ? infoLog : &amp;tempInfoLog;
+
+    gl::Error error = mRenderer-&gt;compileToExecutable(
+        *currentInfoLog, geometryHLSL, SHADER_GEOMETRY, mStreamOutVaryings,
+        (mData.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), D3DCompilerWorkarounds(),
+        &amp;mGeometryExecutables[geometryShaderType]);
+
+    if (!infoLog &amp;&amp; error.isError())
+    {
+        std::vector&lt;char&gt; tempCharBuffer(tempInfoLog.getLength() + 3);
+        tempInfoLog.getLog(static_cast&lt;GLsizei&gt;(tempInfoLog.getLength()), NULL, &amp;tempCharBuffer[0]);
+        ERR(&quot;Error compiling dynamic geometry executable:\n%s\n&quot;, &amp;tempCharBuffer[0]);
+    }
+
+    if (outExecutable)
+    {
+        *outExecutable = mGeometryExecutables[geometryShaderType];
+    }
+    return error;
+}
+
+LinkResult ProgramD3D::compileProgramExecutables(const gl::Data &amp;data, gl::InfoLog &amp;infoLog)
+{
+    const gl::InputLayout &amp;defaultInputLayout =
+        GetDefaultInputLayoutFromShader(mData.getAttachedVertexShader());
</ins><span class="cx">     ShaderExecutableD3D *defaultVertexExecutable = NULL;
</span><del>-    gl::Error error = getVertexExecutableForInputLayout(defaultInputLayout, &amp;defaultVertexExecutable, &amp;infoLog);
</del><ins>+    gl::Error error =
+        getVertexExecutableForInputLayout(defaultInputLayout, &amp;defaultVertexExecutable, &amp;infoLog);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return LinkResult(false, error);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    std::vector&lt;GLenum&gt; defaultPixelOutput = GetDefaultOutputLayoutFromShader(getPixelShaderKey());
</del><ins>+    std::vector&lt;GLenum&gt; defaultPixelOutput      = GetDefaultOutputLayoutFromShader(getPixelShaderKey());
</ins><span class="cx">     ShaderExecutableD3D *defaultPixelExecutable = NULL;
</span><del>-    error = getPixelExecutableForOutputLayout(defaultPixelOutput, &amp;defaultPixelExecutable, &amp;infoLog);
</del><ins>+    error =
+        getPixelExecutableForOutputLayout(defaultPixelOutput, &amp;defaultPixelExecutable, &amp;infoLog);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return LinkResult(false, error);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (usesGeometryShader())
</del><ins>+    // Auto-generate the geometry shader here, if we expect to be using point rendering in D3D11.
+    ShaderExecutableD3D *pointGS = nullptr;
+    if (usesGeometryShader(GL_POINTS))
</ins><span class="cx">     {
</span><del>-        std::string geometryHLSL = mDynamicHLSL-&gt;generateGeometryShaderHLSL(registers, fragmentShaderD3D, vertexShaderD3D);
</del><ins>+        getGeometryExecutableForPrimitiveType(data, GL_POINTS, &amp;pointGS, &amp;infoLog);
+    }
</ins><span class="cx"> 
</span><ins>+    const ShaderD3D *vertexShaderD3D = GetImplAs&lt;ShaderD3D&gt;(mData.getAttachedVertexShader());
</ins><span class="cx"> 
</span><del>-        error = mRenderer-&gt;compileToExecutable(infoLog, geometryHLSL, SHADER_GEOMETRY, mTransformFeedbackLinkedVaryings,
-                                               (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS),
-                                               D3DCompilerWorkarounds(), &amp;mGeometryExecutable);
-        if (error.isError())
-        {
-            return LinkResult(false, error);
-        }
-    }
-
-#if ANGLE_SHADER_DEBUG_INFO == ANGLE_ENABLED
-    if (usesGeometryShader() &amp;&amp; mGeometryExecutable)
</del><ins>+    if (usesGeometryShader(GL_POINTS) &amp;&amp; pointGS)
</ins><span class="cx">     {
</span><del>-        // Geometry shaders are currently only used internally, so there is no corresponding shader object at the interface level
-        // For now the geometry shader debug info is pre-pended to the vertex shader, this is a bit of a clutch
</del><ins>+        // Geometry shaders are currently only used internally, so there is no corresponding shader
+        // object at the interface level. For now the geometry shader debug info is prepended to
+        // the vertex shader.
</ins><span class="cx">         vertexShaderD3D-&gt;appendDebugInfo(&quot;// GEOMETRY SHADER BEGIN\n\n&quot;);
</span><del>-        vertexShaderD3D-&gt;appendDebugInfo(mGeometryExecutable-&gt;getDebugInfo());
</del><ins>+        vertexShaderD3D-&gt;appendDebugInfo(pointGS-&gt;getDebugInfo());
</ins><span class="cx">         vertexShaderD3D-&gt;appendDebugInfo(&quot;\nGEOMETRY SHADER END\n\n\n&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1022,200 +1333,306 @@
</span><span class="cx"> 
</span><span class="cx">     if (defaultPixelExecutable)
</span><span class="cx">     {
</span><ins>+        const ShaderD3D *fragmentShaderD3D =
+            GetImplAs&lt;ShaderD3D&gt;(mData.getAttachedFragmentShader());
</ins><span class="cx">         fragmentShaderD3D-&gt;appendDebugInfo(defaultPixelExecutable-&gt;getDebugInfo());
</span><span class="cx">     }
</span><del>-#endif
</del><span class="cx"> 
</span><del>-    bool linkSuccess = (defaultVertexExecutable &amp;&amp; defaultPixelExecutable &amp;&amp; (!usesGeometryShader() || mGeometryExecutable));
</del><ins>+    bool linkSuccess = (defaultVertexExecutable &amp;&amp; defaultPixelExecutable &amp;&amp;
+                        (!usesGeometryShader(GL_POINTS) || pointGS));
</ins><span class="cx">     return LinkResult(linkSuccess, gl::Error(GL_NO_ERROR));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-LinkResult ProgramD3D::link(const gl::Data &amp;data, gl::InfoLog &amp;infoLog,
-                            gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                            const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings,
-                            GLenum transformFeedbackBufferMode,
-                            int *registers, std::vector&lt;gl::LinkedVarying&gt; *linkedVaryings,
-                            std::map&lt;int, gl::VariableLocation&gt; *outputVariables)
</del><ins>+LinkResult ProgramD3D::link(const gl::Data &amp;data, gl::InfoLog &amp;infoLog)
</ins><span class="cx"> {
</span><del>-    ShaderD3D *vertexShaderD3D = GetImplAs&lt;ShaderD3D&gt;(vertexShader);
-    ShaderD3D *fragmentShaderD3D = GetImplAs&lt;ShaderD3D&gt;(fragmentShader);
</del><ins>+    reset();
</ins><span class="cx"> 
</span><del>-    mSamplersPS.resize(data.caps-&gt;maxTextureImageUnits);
-    mSamplersVS.resize(data.caps-&gt;maxVertexTextureImageUnits);
</del><ins>+    const gl::Shader *vertexShader   = mData.getAttachedVertexShader();
+    const gl::Shader *fragmentShader = mData.getAttachedFragmentShader();
</ins><span class="cx"> 
</span><del>-    mTransformFeedbackBufferMode = transformFeedbackBufferMode;
</del><ins>+    const ShaderD3D *vertexShaderD3D   = GetImplAs&lt;ShaderD3D&gt;(vertexShader);
+    const ShaderD3D *fragmentShaderD3D = GetImplAs&lt;ShaderD3D&gt;(fragmentShader);
</ins><span class="cx"> 
</span><del>-    mPixelHLSL = fragmentShaderD3D-&gt;getTranslatedSource();
-    fragmentShaderD3D-&gt;generateWorkarounds(&amp;mPixelWorkarounds);
</del><ins>+    mSamplersVS.resize(data.caps-&gt;maxVertexTextureImageUnits);
+    mSamplersPS.resize(data.caps-&gt;maxTextureImageUnits);
</ins><span class="cx"> 
</span><del>-    mVertexHLSL = vertexShaderD3D-&gt;getTranslatedSource();
</del><span class="cx">     vertexShaderD3D-&gt;generateWorkarounds(&amp;mVertexWorkarounds);
</span><del>-    mShaderVersion = vertexShaderD3D-&gt;getShaderVersion();
</del><ins>+    fragmentShaderD3D-&gt;generateWorkarounds(&amp;mPixelWorkarounds);
</ins><span class="cx"> 
</span><ins>+    if (mRenderer-&gt;getRendererLimitations().noFrontFacingSupport)
+    {
+        if (fragmentShaderD3D-&gt;usesFrontFacing())
+        {
+            infoLog &lt;&lt; &quot;The current renderer doesn't support gl_FrontFacing&quot;;
+            return LinkResult(false, gl::Error(GL_NO_ERROR));
+        }
+    }
+
+    std::vector&lt;PackedVarying&gt; packedVaryings =
+        MergeVaryings(*vertexShader, *fragmentShader, mData.getTransformFeedbackVaryingNames());
+
</ins><span class="cx">     // Map the varyings to the register file
</span><del>-    VaryingPacking packing = { NULL };
-    *registers = mDynamicHLSL-&gt;packVaryings(infoLog, packing, fragmentShaderD3D, vertexShaderD3D, transformFeedbackVaryings);
</del><ins>+    VaryingPacking varyingPacking(data.caps-&gt;maxVaryingVectors);
+    if (!varyingPacking.packVaryings(infoLog, packedVaryings,
+                                     mData.getTransformFeedbackVaryingNames()))
+    {
+        return LinkResult(false, gl::Error(GL_NO_ERROR));
+    }
</ins><span class="cx"> 
</span><del>-    if (*registers &lt; 0)
</del><ins>+    ProgramD3DMetadata metadata(mRenderer-&gt;getMajorShaderModel(), mRenderer-&gt;getShaderModelSuffix(),
+                                usesInstancedPointSpriteEmulation(),
+                                mRenderer-&gt;presentPathFastEnabled(), vertexShaderD3D,
+                                fragmentShaderD3D);
+
+    varyingPacking.enableBuiltins(SHADER_VERTEX, metadata);
+    varyingPacking.enableBuiltins(SHADER_PIXEL, metadata);
+
+    if (static_cast&lt;GLuint&gt;(varyingPacking.getRegisterCount()) &gt; data.caps-&gt;maxVaryingVectors)
</ins><span class="cx">     {
</span><ins>+        infoLog &lt;&lt; &quot;No varying registers left to support gl_FragCoord/gl_PointCoord&quot;;
</ins><span class="cx">         return LinkResult(false, gl::Error(GL_NO_ERROR));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!gl::Program::linkVaryings(infoLog, fragmentShader, vertexShader))
</del><ins>+    // TODO(jmadill): Implement more sophisticated component packing in D3D9.
+    // We can fail here because we use one semantic per GLSL varying. D3D11 can pack varyings
+    // intelligently, but D3D9 assumes one semantic per register.
+    if (mRenderer-&gt;getRendererClass() == RENDERER_D3D9 &amp;&amp;
+        varyingPacking.getMaxSemanticIndex() &gt; data.caps-&gt;maxVaryingVectors)
</ins><span class="cx">     {
</span><ins>+        infoLog &lt;&lt; &quot;Cannot pack these varyings on D3D9.&quot;;
</ins><span class="cx">         return LinkResult(false, gl::Error(GL_NO_ERROR));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!mDynamicHLSL-&gt;generateShaderLinkHLSL(data, infoLog, *registers, packing, mPixelHLSL, mVertexHLSL,
-                                              fragmentShaderD3D, vertexShaderD3D, transformFeedbackVaryings,
-                                              linkedVaryings, outputVariables, &amp;mPixelShaderKey, &amp;mUsesFragDepth))
</del><ins>+    if (!mDynamicHLSL-&gt;generateShaderLinkHLSL(data, mData, metadata, varyingPacking, &amp;mPixelHLSL,
+                                              &amp;mVertexHLSL))
</ins><span class="cx">     {
</span><span class="cx">         return LinkResult(false, gl::Error(GL_NO_ERROR));
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mUsesPointSize = vertexShaderD3D-&gt;usesPointSize();
</span><ins>+    mDynamicHLSL-&gt;getPixelShaderOutputKey(data, mData, metadata, &amp;mPixelShaderKey);
+    mUsesFragDepth = metadata.usesFragDepth(mData);
</ins><span class="cx"> 
</span><del>-    initAttributesByLayout();
</del><ins>+    // Cache if we use flat shading
+    mUsesFlatInterpolation = false;
+    for (const auto &amp;varying : packedVaryings)
+    {
+        if (varying.interpolation == sh::INTERPOLATION_FLAT)
+        {
+            mUsesFlatInterpolation = true;
+            break;
+        }
+    }
</ins><span class="cx"> 
</span><ins>+    if (mRenderer-&gt;getMajorShaderModel() &gt;= 4)
+    {
+        varyingPacking.enableBuiltins(SHADER_GEOMETRY, metadata);
+        mGeometryShaderPreamble = mDynamicHLSL-&gt;generateGeometryShaderPreamble(varyingPacking);
+    }
+
+    initAttribLocationsToD3DSemantic();
+
+    defineUniformsAndAssignRegisters();
+
+    gatherTransformFeedbackVaryings(varyingPacking);
+
+    LinkResult result = compileProgramExecutables(data, infoLog);
+    if (result.error.isError() || !result.linkSuccess)
+    {
+        infoLog &lt;&lt; &quot;Failed to create D3D shaders.&quot;;
+        return result;
+    }
+
+    initUniformBlockInfo();
+
</ins><span class="cx">     return LinkResult(true, gl::Error(GL_NO_ERROR));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const
</del><ins>+GLboolean ProgramD3D::validate(const gl::Caps &amp; /*caps*/, gl::InfoLog * /*infoLog*/)
</ins><span class="cx"> {
</span><del>-    mDynamicHLSL-&gt;getInputLayoutSignature(inputLayout, signature);
</del><ins>+    // TODO(jmadill): Do something useful here?
+    return GL_TRUE;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void ProgramD3D::initUniformBlockInfo()
+{
+    const gl::Shader *vertexShader = mData.getAttachedVertexShader();
+
+    for (const sh::InterfaceBlock &amp;vertexBlock : vertexShader-&gt;getInterfaceBlocks())
+    {
+        if (!vertexBlock.staticUse &amp;&amp; vertexBlock.layout == sh::BLOCKLAYOUT_PACKED)
+            continue;
+
+        if (mBlockDataSizes.count(vertexBlock.name) &gt; 0)
+            continue;
+
+        size_t dataSize                   = getUniformBlockInfo(vertexBlock);
+        mBlockDataSizes[vertexBlock.name] = dataSize;
+    }
+
+    const gl::Shader *fragmentShader = mData.getAttachedFragmentShader();
+
+    for (const sh::InterfaceBlock &amp;fragmentBlock : fragmentShader-&gt;getInterfaceBlocks())
+    {
+        if (!fragmentBlock.staticUse &amp;&amp; fragmentBlock.layout == sh::BLOCKLAYOUT_PACKED)
+            continue;
+
+        if (mBlockDataSizes.count(fragmentBlock.name) &gt; 0)
+            continue;
+
+        size_t dataSize                     = getUniformBlockInfo(fragmentBlock);
+        mBlockDataSizes[fragmentBlock.name] = dataSize;
+    }
+}
+
+void ProgramD3D::assignUniformBlockRegisters()
+{
+    mD3DUniformBlocks.clear();
+
+    // Assign registers and update sizes.
+    const ShaderD3D *vertexShaderD3D   = GetImplAs&lt;ShaderD3D&gt;(mData.getAttachedVertexShader());
+    const ShaderD3D *fragmentShaderD3D = GetImplAs&lt;ShaderD3D&gt;(mData.getAttachedFragmentShader());
+
+    for (const gl::UniformBlock &amp;uniformBlock : mData.getUniformBlocks())
+    {
+        unsigned int uniformBlockElement = uniformBlock.isArray ? uniformBlock.arrayElement : 0;
+
+        D3DUniformBlock d3dUniformBlock;
+
+        if (uniformBlock.vertexStaticUse)
+        {
+            unsigned int baseRegister =
+                vertexShaderD3D-&gt;getInterfaceBlockRegister(uniformBlock.name);
+            d3dUniformBlock.vsRegisterIndex = baseRegister + uniformBlockElement;
+        }
+
+        if (uniformBlock.fragmentStaticUse)
+        {
+            unsigned int baseRegister =
+                fragmentShaderD3D-&gt;getInterfaceBlockRegister(uniformBlock.name);
+            d3dUniformBlock.psRegisterIndex = baseRegister + uniformBlockElement;
+        }
+
+        mD3DUniformBlocks.push_back(d3dUniformBlock);
+    }
+}
+
</ins><span class="cx"> void ProgramD3D::initializeUniformStorage()
</span><span class="cx"> {
</span><span class="cx">     // Compute total default block size
</span><del>-    unsigned int vertexRegisters = 0;
</del><ins>+    unsigned int vertexRegisters   = 0;
</ins><span class="cx">     unsigned int fragmentRegisters = 0;
</span><del>-    for (size_t uniformIndex = 0; uniformIndex &lt; mUniforms.size(); uniformIndex++)
</del><ins>+    for (const D3DUniform *d3dUniform : mD3DUniforms)
</ins><span class="cx">     {
</span><del>-        const gl::LinkedUniform &amp;uniform = *mUniforms[uniformIndex];
-
-        if (!gl::IsSamplerType(uniform.type))
</del><ins>+        if (!d3dUniform-&gt;isSampler())
</ins><span class="cx">         {
</span><del>-            if (uniform.isReferencedByVertexShader())
</del><ins>+            if (d3dUniform-&gt;isReferencedByVertexShader())
</ins><span class="cx">             {
</span><del>-                vertexRegisters = std::max(vertexRegisters, uniform.vsRegisterIndex + uniform.registerCount);
</del><ins>+                vertexRegisters = std::max(vertexRegisters,
+                                           d3dUniform-&gt;vsRegisterIndex + d3dUniform-&gt;registerCount);
</ins><span class="cx">             }
</span><del>-            if (uniform.isReferencedByFragmentShader())
</del><ins>+            if (d3dUniform-&gt;isReferencedByFragmentShader())
</ins><span class="cx">             {
</span><del>-                fragmentRegisters = std::max(fragmentRegisters, uniform.psRegisterIndex + uniform.registerCount);
</del><ins>+                fragmentRegisters = std::max(
+                    fragmentRegisters, d3dUniform-&gt;psRegisterIndex + d3dUniform-&gt;registerCount);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mVertexUniformStorage = mRenderer-&gt;createUniformStorage(vertexRegisters * 16u);
</del><ins>+    mVertexUniformStorage   = mRenderer-&gt;createUniformStorage(vertexRegisters * 16u);
</ins><span class="cx">     mFragmentUniformStorage = mRenderer-&gt;createUniformStorage(fragmentRegisters * 16u);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error ProgramD3D::applyUniforms()
</del><ins>+gl::Error ProgramD3D::applyUniforms(GLenum drawMode)
</ins><span class="cx"> {
</span><del>-    updateSamplerMapping();
</del><ins>+    ASSERT(!mDirtySamplerMapping);
</ins><span class="cx"> 
</span><del>-    gl::Error error = mRenderer-&gt;applyUniforms(*this, mUniforms);
</del><ins>+    gl::Error error = mRenderer-&gt;applyUniforms(*this, drawMode, mD3DUniforms);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (size_t uniformIndex = 0; uniformIndex &lt; mUniforms.size(); uniformIndex++)
</del><ins>+    for (D3DUniform *d3dUniform : mD3DUniforms)
</ins><span class="cx">     {
</span><del>-        mUniforms[uniformIndex]-&gt;dirty = false;
</del><ins>+        d3dUniform-&gt;dirty = false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error ProgramD3D::applyUniformBuffers(const gl::Data &amp;data, GLuint uniformBlockBindings[])
</del><ins>+gl::Error ProgramD3D::applyUniformBuffers(const gl::Data &amp;data)
</ins><span class="cx"> {
</span><del>-    GLint vertexUniformBuffers[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
-    GLint fragmentUniformBuffers[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
-
-    for (unsigned int registerIndex = 0; registerIndex &lt; gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS; ++registerIndex)
</del><ins>+    if (mData.getUniformBlocks().empty())
</ins><span class="cx">     {
</span><del>-        vertexUniformBuffers[registerIndex] = -1;
</del><ins>+        return gl::Error(GL_NO_ERROR);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (unsigned int registerIndex = 0; registerIndex &lt; gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS; ++registerIndex)
</del><ins>+    // Lazy init.
+    if (mD3DUniformBlocks.empty())
</ins><span class="cx">     {
</span><del>-        fragmentUniformBuffers[registerIndex] = -1;
</del><ins>+        assignUniformBlockRegisters();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    mVertexUBOCache.clear();
+    mFragmentUBOCache.clear();
+
</ins><span class="cx">     const unsigned int reservedBuffersInVS = mRenderer-&gt;getReservedVertexUniformBuffers();
</span><span class="cx">     const unsigned int reservedBuffersInFS = mRenderer-&gt;getReservedFragmentUniformBuffers();
</span><span class="cx"> 
</span><del>-    for (unsigned int uniformBlockIndex = 0; uniformBlockIndex &lt; mUniformBlocks.size(); uniformBlockIndex++)
</del><ins>+    for (unsigned int uniformBlockIndex = 0; uniformBlockIndex &lt; mD3DUniformBlocks.size();
+         uniformBlockIndex++)
</ins><span class="cx">     {
</span><del>-        gl::UniformBlock *uniformBlock = mUniformBlocks[uniformBlockIndex];
-        GLuint blockBinding = uniformBlockBindings[uniformBlockIndex];
</del><ins>+        const D3DUniformBlock &amp;uniformBlock = mD3DUniformBlocks[uniformBlockIndex];
+        GLuint blockBinding                 = mData.getUniformBlockBinding(uniformBlockIndex);
</ins><span class="cx"> 
</span><del>-        ASSERT(uniformBlock);
-
</del><span class="cx">         // Unnecessary to apply an unreferenced standard or shared UBO
</span><del>-        if (!uniformBlock-&gt;isReferencedByVertexShader() &amp;&amp; !uniformBlock-&gt;isReferencedByFragmentShader())
</del><ins>+        if (!uniformBlock.vertexStaticUse() &amp;&amp; !uniformBlock.fragmentStaticUse())
</ins><span class="cx">         {
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (uniformBlock-&gt;isReferencedByVertexShader())
</del><ins>+        if (uniformBlock.vertexStaticUse())
</ins><span class="cx">         {
</span><del>-            unsigned int registerIndex = uniformBlock-&gt;vsRegisterIndex - reservedBuffersInVS;
-            ASSERT(vertexUniformBuffers[registerIndex] == -1);
</del><ins>+            unsigned int registerIndex = uniformBlock.vsRegisterIndex - reservedBuffersInVS;
</ins><span class="cx">             ASSERT(registerIndex &lt; data.caps-&gt;maxVertexUniformBlocks);
</span><del>-            vertexUniformBuffers[registerIndex] = blockBinding;
</del><ins>+
+            if (mVertexUBOCache.size() &lt;= registerIndex)
+            {
+                mVertexUBOCache.resize(registerIndex + 1, -1);
+            }
+
+            ASSERT(mVertexUBOCache[registerIndex] == -1);
+            mVertexUBOCache[registerIndex] = blockBinding;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (uniformBlock-&gt;isReferencedByFragmentShader())
</del><ins>+        if (uniformBlock.fragmentStaticUse())
</ins><span class="cx">         {
</span><del>-            unsigned int registerIndex = uniformBlock-&gt;psRegisterIndex - reservedBuffersInFS;
-            ASSERT(fragmentUniformBuffers[registerIndex] == -1);
</del><ins>+            unsigned int registerIndex = uniformBlock.psRegisterIndex - reservedBuffersInFS;
</ins><span class="cx">             ASSERT(registerIndex &lt; data.caps-&gt;maxFragmentUniformBlocks);
</span><del>-            fragmentUniformBuffers[registerIndex] = blockBinding;
-        }
-    }
</del><span class="cx"> 
</span><del>-    return mRenderer-&gt;setUniformBuffers(data, vertexUniformBuffers, fragmentUniformBuffers);
-}
</del><ins>+            if (mFragmentUBOCache.size() &lt;= registerIndex)
+            {
+                mFragmentUBOCache.resize(registerIndex + 1, -1);
+            }
</ins><span class="cx"> 
</span><del>-bool ProgramD3D::assignUniformBlockRegister(gl::InfoLog &amp;infoLog, gl::UniformBlock *uniformBlock, GLenum shader,
-                                            unsigned int registerIndex, const gl::Caps &amp;caps)
-{
-    if (shader == GL_VERTEX_SHADER)
-    {
-        uniformBlock-&gt;vsRegisterIndex = registerIndex;
-        if (registerIndex - mRenderer-&gt;getReservedVertexUniformBuffers() &gt;= caps.maxVertexUniformBlocks)
-        {
-            infoLog.append(&quot;Vertex shader uniform block count exceed GL_MAX_VERTEX_UNIFORM_BLOCKS (%u)&quot;, caps.maxVertexUniformBlocks);
-            return false;
</del><ins>+            ASSERT(mFragmentUBOCache[registerIndex] == -1);
+            mFragmentUBOCache[registerIndex] = blockBinding;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><del>-    else if (shader == GL_FRAGMENT_SHADER)
-    {
-        uniformBlock-&gt;psRegisterIndex = registerIndex;
-        if (registerIndex - mRenderer-&gt;getReservedFragmentUniformBuffers() &gt;= caps.maxFragmentUniformBlocks)
-        {
-            infoLog.append(&quot;Fragment shader uniform block count exceed GL_MAX_FRAGMENT_UNIFORM_BLOCKS (%u)&quot;, caps.maxFragmentUniformBlocks);
-            return false;
-        }
-    }
-    else UNREACHABLE();
</del><span class="cx"> 
</span><del>-    return true;
</del><ins>+    return mRenderer-&gt;setUniformBuffers(data, mVertexUBOCache, mFragmentUBOCache);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramD3D::dirtyAllUniforms()
</span><span class="cx"> {
</span><del>-    unsigned int numUniforms = mUniforms.size();
-    for (unsigned int index = 0; index &lt; numUniforms; index++)
</del><ins>+    for (D3DUniform *d3dUniform : mD3DUniforms)
</ins><span class="cx">     {
</span><del>-        mUniforms[index]-&gt;dirty = true;
</del><ins>+        d3dUniform-&gt;dirty = true;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::setUniform1fv(GLint location, GLsizei count, const GLfloat* v)
</del><ins>+void ProgramD3D::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
</ins><span class="cx"> {
</span><span class="cx">     setUniform(location, count, v, GL_FLOAT);
</span><span class="cx"> }
</span><span class="lines">@@ -1235,47 +1652,74 @@
</span><span class="cx">     setUniform(location, count, v, GL_FLOAT_VEC4);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</del><ins>+void ProgramD3D::setUniformMatrix2fv(GLint location,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLfloat *value)
</ins><span class="cx"> {
</span><span class="cx">     setUniformMatrixfv&lt;2, 2&gt;(location, count, transpose, value, GL_FLOAT_MAT2);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</del><ins>+void ProgramD3D::setUniformMatrix3fv(GLint location,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLfloat *value)
</ins><span class="cx"> {
</span><span class="cx">     setUniformMatrixfv&lt;3, 3&gt;(location, count, transpose, value, GL_FLOAT_MAT3);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</del><ins>+void ProgramD3D::setUniformMatrix4fv(GLint location,
+                                     GLsizei count,
+                                     GLboolean transpose,
+                                     const GLfloat *value)
</ins><span class="cx"> {
</span><span class="cx">     setUniformMatrixfv&lt;4, 4&gt;(location, count, transpose, value, GL_FLOAT_MAT4);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</del><ins>+void ProgramD3D::setUniformMatrix2x3fv(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat *value)
</ins><span class="cx"> {
</span><span class="cx">     setUniformMatrixfv&lt;2, 3&gt;(location, count, transpose, value, GL_FLOAT_MAT2x3);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</del><ins>+void ProgramD3D::setUniformMatrix3x2fv(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat *value)
</ins><span class="cx"> {
</span><span class="cx">     setUniformMatrixfv&lt;3, 2&gt;(location, count, transpose, value, GL_FLOAT_MAT3x2);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</del><ins>+void ProgramD3D::setUniformMatrix2x4fv(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat *value)
</ins><span class="cx"> {
</span><span class="cx">     setUniformMatrixfv&lt;2, 4&gt;(location, count, transpose, value, GL_FLOAT_MAT2x4);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</del><ins>+void ProgramD3D::setUniformMatrix4x2fv(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat *value)
</ins><span class="cx"> {
</span><span class="cx">     setUniformMatrixfv&lt;4, 2&gt;(location, count, transpose, value, GL_FLOAT_MAT4x2);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</del><ins>+void ProgramD3D::setUniformMatrix3x4fv(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat *value)
</ins><span class="cx"> {
</span><span class="cx">     setUniformMatrixfv&lt;3, 4&gt;(location, count, transpose, value, GL_FLOAT_MAT3x4);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</del><ins>+void ProgramD3D::setUniformMatrix4x3fv(GLint location,
+                                       GLsizei count,
+                                       GLboolean transpose,
+                                       const GLfloat *value)
</ins><span class="cx"> {
</span><span class="cx">     setUniformMatrixfv&lt;4, 3&gt;(location, count, transpose, value, GL_FLOAT_MAT4x3);
</span><span class="cx"> }
</span><span class="lines">@@ -1320,107 +1764,88 @@
</span><span class="cx">     setUniform(location, count, v, GL_UNSIGNED_INT_VEC4);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::getUniformfv(GLint location, GLfloat *params)
</del><ins>+void ProgramD3D::setUniformBlockBinding(GLuint /*uniformBlockIndex*/,
+                                        GLuint /*uniformBlockBinding*/)
</ins><span class="cx"> {
</span><del>-    getUniformv(location, params, GL_FLOAT);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::getUniformiv(GLint location, GLint *params)
</del><ins>+void ProgramD3D::defineUniformsAndAssignRegisters()
</ins><span class="cx"> {
</span><del>-    getUniformv(location, params, GL_INT);
-}
</del><ins>+    D3DUniformMap uniformMap;
+    const gl::Shader *vertexShader = mData.getAttachedVertexShader();
+    for (const sh::Uniform &amp;vertexUniform : vertexShader-&gt;getUniforms())
</ins><span class="cx"> 
</span><del>-void ProgramD3D::getUniformuiv(GLint location, GLuint *params)
-{
-    getUniformv(location, params, GL_UNSIGNED_INT);
-}
-
-bool ProgramD3D::linkUniforms(gl::InfoLog &amp;infoLog, const gl::Shader &amp;vertexShader, const gl::Shader &amp;fragmentShader,
-                              const gl::Caps &amp;caps)
-{
-    const ShaderD3D *vertexShaderD3D = GetImplAs&lt;ShaderD3D&gt;(&amp;vertexShader);
-    const ShaderD3D *fragmentShaderD3D = GetImplAs&lt;ShaderD3D&gt;(&amp;fragmentShader);
-
-    const std::vector&lt;sh::Uniform&gt; &amp;vertexUniforms = vertexShader.getUniforms();
-    const std::vector&lt;sh::Uniform&gt; &amp;fragmentUniforms = fragmentShader.getUniforms();
-
-    // Check that uniforms defined in the vertex and fragment shaders are identical
-    typedef std::map&lt;std::string, const sh::Uniform*&gt; UniformMap;
-    UniformMap linkedUniforms;
-
-    for (unsigned int vertexUniformIndex = 0; vertexUniformIndex &lt; vertexUniforms.size(); vertexUniformIndex++)
</del><span class="cx">     {
</span><del>-        const sh::Uniform &amp;vertexUniform = vertexUniforms[vertexUniformIndex];
-        linkedUniforms[vertexUniform.name] = &amp;vertexUniform;
-    }
-
-    for (unsigned int fragmentUniformIndex = 0; fragmentUniformIndex &lt; fragmentUniforms.size(); fragmentUniformIndex++)
-    {
-        const sh::Uniform &amp;fragmentUniform = fragmentUniforms[fragmentUniformIndex];
-        UniformMap::const_iterator entry = linkedUniforms.find(fragmentUniform.name);
-        if (entry != linkedUniforms.end())
</del><ins>+        if (vertexUniform.staticUse)
</ins><span class="cx">         {
</span><del>-            const sh::Uniform &amp;vertexUniform = *entry-&gt;second;
-            const std::string &amp;uniformName = &quot;uniform '&quot; + vertexUniform.name + &quot;'&quot;;
-            if (!gl::Program::linkValidateUniforms(infoLog, uniformName, vertexUniform, fragmentUniform))
-            {
-                return false;
-            }
</del><ins>+            defineUniformBase(vertexShader, vertexUniform, &amp;uniformMap);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (unsigned int uniformIndex = 0; uniformIndex &lt; vertexUniforms.size(); uniformIndex++)
</del><ins>+    const gl::Shader *fragmentShader = mData.getAttachedFragmentShader();
+    for (const sh::Uniform &amp;fragmentUniform : fragmentShader-&gt;getUniforms())
</ins><span class="cx">     {
</span><del>-        const sh::Uniform &amp;uniform = vertexUniforms[uniformIndex];
-
-        if (uniform.staticUse)
</del><ins>+        if (fragmentUniform.staticUse)
</ins><span class="cx">         {
</span><del>-            unsigned int registerBase = uniform.isBuiltIn() ? GL_INVALID_INDEX :
-                vertexShaderD3D-&gt;getUniformRegister(uniform.name);
-            defineUniformBase(vertexShaderD3D, uniform, registerBase);
</del><ins>+            defineUniformBase(fragmentShader, fragmentUniform, &amp;uniformMap);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (unsigned int uniformIndex = 0; uniformIndex &lt; fragmentUniforms.size(); uniformIndex++)
</del><ins>+    // Initialize the D3DUniform list to mirror the indexing of the GL layer.
+    for (const gl::LinkedUniform &amp;glUniform : mData.getUniforms())
</ins><span class="cx">     {
</span><del>-        const sh::Uniform &amp;uniform = fragmentUniforms[uniformIndex];
</del><ins>+        if (!glUniform.isInDefaultBlock())
+            continue;
</ins><span class="cx"> 
</span><del>-        if (uniform.staticUse)
-        {
-            unsigned int registerBase = uniform.isBuiltIn() ? GL_INVALID_INDEX :
-                fragmentShaderD3D-&gt;getUniformRegister(uniform.name);
-            defineUniformBase(fragmentShaderD3D, uniform, registerBase);
-        }
</del><ins>+        auto mapEntry = uniformMap.find(glUniform.name);
+        ASSERT(mapEntry != uniformMap.end());
+        mD3DUniforms.push_back(mapEntry-&gt;second);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!indexUniforms(infoLog, caps))
-    {
-        return false;
-    }
-
</del><ins>+    assignAllSamplerRegisters();
</ins><span class="cx">     initializeUniformStorage();
</span><del>-
-    return true;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::defineUniformBase(const ShaderD3D *shader, const sh::Uniform &amp;uniform, unsigned int uniformRegister)
</del><ins>+void ProgramD3D::defineUniformBase(const gl::Shader *shader,
+                                   const sh::Uniform &amp;uniform,
+                                   D3DUniformMap *uniformMap)
</ins><span class="cx"> {
</span><del>-    if (uniformRegister == GL_INVALID_INDEX)
</del><ins>+    // Samplers get their registers assigned in assignAllSamplerRegisters.
+    if (uniform.isBuiltIn() || gl::IsSamplerType(uniform.type))
</ins><span class="cx">     {
</span><del>-        defineUniform(shader, uniform, uniform.name, nullptr);
</del><ins>+        defineUniform(shader-&gt;getType(), uniform, uniform.name, nullptr, uniformMap);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ShShaderOutput outputType = shader-&gt;getCompilerOutputType();
</del><ins>+    const ShaderD3D *shaderD3D = GetImplAs&lt;ShaderD3D&gt;(shader);
+
+    unsigned int startRegister = shaderD3D-&gt;getUniformRegister(uniform.name);
+    ShShaderOutput outputType = shaderD3D-&gt;getCompilerOutputType();
</ins><span class="cx">     sh::HLSLBlockEncoder encoder(sh::HLSLBlockEncoder::GetStrategyFor(outputType));
</span><del>-    encoder.skipRegisters(uniformRegister);
</del><ins>+    encoder.skipRegisters(startRegister);
</ins><span class="cx"> 
</span><del>-    defineUniform(shader, uniform, uniform.name, &amp;encoder);
</del><ins>+    defineUniform(shader-&gt;getType(), uniform, uniform.name, &amp;encoder, uniformMap);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::defineUniform(const ShaderD3D *shader, const sh::ShaderVariable &amp;uniform,
-                               const std::string &amp;fullName, sh::HLSLBlockEncoder *encoder)
</del><ins>+D3DUniform *ProgramD3D::getD3DUniformByName(const std::string &amp;name)
</ins><span class="cx"> {
</span><ins>+    for (D3DUniform *d3dUniform : mD3DUniforms)
+    {
+        if (d3dUniform-&gt;name == name)
+        {
+            return d3dUniform;
+        }
+    }
+
+    return nullptr;
+}
+
+void ProgramD3D::defineUniform(GLenum shaderType,
+                               const sh::ShaderVariable &amp;uniform,
+                               const std::string &amp;fullName,
+                               sh::HLSLBlockEncoder *encoder,
+                               D3DUniformMap *uniformMap)
+{
</ins><span class="cx">     if (uniform.isStruct())
</span><span class="cx">     {
</span><span class="cx">         for (unsigned int elementIndex = 0; elementIndex &lt; uniform.elementCount(); elementIndex++)
</span><span class="lines">@@ -1432,57 +1857,70 @@
</span><span class="cx"> 
</span><span class="cx">             for (size_t fieldIndex = 0; fieldIndex &lt; uniform.fields.size(); fieldIndex++)
</span><span class="cx">             {
</span><del>-                const sh::ShaderVariable &amp;field = uniform.fields[fieldIndex];
</del><ins>+                const sh::ShaderVariable &amp;field  = uniform.fields[fieldIndex];
</ins><span class="cx">                 const std::string &amp;fieldFullName = (fullName + elementString + &quot;.&quot; + field.name);
</span><span class="cx"> 
</span><del>-                defineUniform(shader, field, fieldFullName, encoder);
</del><ins>+                // Samplers get their registers assigned in assignAllSamplerRegisters.
+                // Also they couldn't use the same encoder as the rest of the struct, since they are
+                // extracted out of the struct by the shader translator.
+                if (gl::IsSamplerType(field.type))
+                {
+                    defineUniform(shaderType, field, fieldFullName, nullptr, uniformMap);
+                }
+                else
+                {
+                    defineUniform(shaderType, field, fieldFullName, encoder, uniformMap);
+                }
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (encoder)
</span><span class="cx">                 encoder-&gt;exitAggregateType();
</span><span class="cx">         }
</span><ins>+        return;
</ins><span class="cx">     }
</span><del>-    else // Not a struct
</del><ins>+
+    // Not a struct. Arrays are treated as aggregate types.
+    if (uniform.isArray() &amp;&amp; encoder)
</ins><span class="cx">     {
</span><del>-        // Arrays are treated as aggregate types
-        if (uniform.isArray() &amp;&amp; encoder)
-        {
-            encoder-&gt;enterAggregateType();
-        }
</del><ins>+        encoder-&gt;enterAggregateType();
+    }
</ins><span class="cx"> 
</span><del>-        gl::LinkedUniform *linkedUniform = getUniformByName(fullName);
</del><ins>+    // Advance the uniform offset, to track registers allocation for structs
+    sh::BlockMemberInfo blockInfo =
+        encoder ? encoder-&gt;encodeType(uniform.type, uniform.arraySize, false)
+                : sh::BlockMemberInfo::getDefaultBlockInfo();
</ins><span class="cx"> 
</span><del>-        // Advance the uniform offset, to track registers allocation for structs
-        sh::BlockMemberInfo blockInfo = encoder ?
-            encoder-&gt;encodeType(uniform.type, uniform.arraySize, false) :
-            sh::BlockMemberInfo::getDefaultBlockInfo();
</del><ins>+    auto uniformMapEntry   = uniformMap-&gt;find(fullName);
+    D3DUniform *d3dUniform = nullptr;
</ins><span class="cx"> 
</span><del>-        if (!linkedUniform)
</del><ins>+    if (uniformMapEntry != uniformMap-&gt;end())
+    {
+        d3dUniform = uniformMapEntry-&gt;second;
+    }
+    else
+    {
+        d3dUniform = new D3DUniform(uniform.type, fullName, uniform.arraySize, true);
+        (*uniformMap)[fullName] = d3dUniform;
+    }
+
+    if (encoder)
+    {
+        d3dUniform-&gt;registerElement =
+            static_cast&lt;unsigned int&gt;(sh::HLSLBlockEncoder::getBlockRegisterElement(blockInfo));
+        unsigned int reg =
+            static_cast&lt;unsigned int&gt;(sh::HLSLBlockEncoder::getBlockRegister(blockInfo));
+        if (shaderType == GL_FRAGMENT_SHADER)
</ins><span class="cx">         {
</span><del>-            linkedUniform = new gl::LinkedUniform(uniform.type, uniform.precision, fullName, uniform.arraySize,
-                                                  -1, sh::BlockMemberInfo::getDefaultBlockInfo());
-            ASSERT(linkedUniform);
-
-            if (encoder)
-                linkedUniform-&gt;registerElement = sh::HLSLBlockEncoder::getBlockRegisterElement(blockInfo);
-            mUniforms.push_back(linkedUniform);
</del><ins>+            d3dUniform-&gt;psRegisterIndex = reg;
</ins><span class="cx">         }
</span><del>-
-        if (encoder)
</del><ins>+        else
</ins><span class="cx">         {
</span><del>-            if (shader-&gt;getShaderType() == GL_FRAGMENT_SHADER)
-            {
-                linkedUniform-&gt;psRegisterIndex = sh::HLSLBlockEncoder::getBlockRegister(blockInfo);
-            }
-            else if (shader-&gt;getShaderType() == GL_VERTEX_SHADER)
-            {
-                linkedUniform-&gt;vsRegisterIndex = sh::HLSLBlockEncoder::getBlockRegister(blockInfo);
-            }
-            else UNREACHABLE();
</del><ins>+            ASSERT(shaderType == GL_VERTEX_SHADER);
+            d3dUniform-&gt;vsRegisterIndex = reg;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Arrays are treated as aggregate types
</span><del>-        if (uniform.isArray() &amp;&amp; encoder)
</del><ins>+        if (uniform.isArray())
</ins><span class="cx">         {
</span><span class="cx">             encoder-&gt;exitAggregateType();
</span><span class="cx">         }
</span><span class="lines">@@ -1490,34 +1928,24 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename T&gt;
</span><del>-static inline void SetIfDirty(T *dest, const T&amp; source, bool *dirtyFlag)
</del><ins>+void ProgramD3D::setUniform(GLint location, GLsizei countIn, const T *v, GLenum targetUniformType)
</ins><span class="cx"> {
</span><del>-    ASSERT(dest != NULL);
-    ASSERT(dirtyFlag != NULL);
-
-    *dirtyFlag = *dirtyFlag || (memcmp(dest, &amp;source, sizeof(T)) != 0);
-    *dest = source;
-}
-
-template &lt;typename T&gt;
-void ProgramD3D::setUniform(GLint location, GLsizei count, const T* v, GLenum targetUniformType)
-{
-    const int components = gl::VariableComponentCount(targetUniformType);
</del><ins>+    const int components        = gl::VariableComponentCount(targetUniformType);
</ins><span class="cx">     const GLenum targetBoolType = gl::VariableBoolVectorType(targetUniformType);
</span><span class="cx"> 
</span><del>-    gl::LinkedUniform *targetUniform = getUniformByLocation(location);
</del><ins>+    D3DUniform *targetUniform = getD3DUniformFromLocation(location);
</ins><span class="cx"> 
</span><del>-    int elementCount = targetUniform-&gt;elementCount();
</del><ins>+    unsigned int elementCount = targetUniform-&gt;elementCount();
+    unsigned int arrayElement = mData.getUniformLocations()[location].element;
+    unsigned int count        = std::min(elementCount - arrayElement, static_cast&lt;unsigned int&gt;(countIn));
</ins><span class="cx"> 
</span><del>-    count = std::min(elementCount - (int)mUniformIndex[location].element, count);
-
</del><span class="cx">     if (targetUniform-&gt;type == targetUniformType)
</span><span class="cx">     {
</span><del>-        T *target = reinterpret_cast&lt;T*&gt;(targetUniform-&gt;data) + mUniformIndex[location].element * 4;
</del><ins>+        T *target = reinterpret_cast&lt;T *&gt;(targetUniform-&gt;data) + arrayElement * 4;
</ins><span class="cx"> 
</span><del>-        for (int i = 0; i &lt; count; i++)
</del><ins>+        for (unsigned int i = 0; i &lt; count; i++)
</ins><span class="cx">         {
</span><del>-            T *dest = target + (i * 4);
</del><ins>+            T *dest         = target + (i * 4);
</ins><span class="cx">             const T *source = v + (i * components);
</span><span class="cx"> 
</span><span class="cx">             for (int c = 0; c &lt; components; c++)
</span><span class="lines">@@ -1532,16 +1960,17 @@
</span><span class="cx">     }
</span><span class="cx">     else if (targetUniform-&gt;type == targetBoolType)
</span><span class="cx">     {
</span><del>-        GLint *boolParams = reinterpret_cast&lt;GLint*&gt;(targetUniform-&gt;data) + mUniformIndex[location].element * 4;
</del><ins>+        GLint *boolParams = reinterpret_cast&lt;GLint *&gt;(targetUniform-&gt;data) + arrayElement * 4;
</ins><span class="cx"> 
</span><del>-        for (int i = 0; i &lt; count; i++)
</del><ins>+        for (unsigned int i = 0; i &lt; count; i++)
</ins><span class="cx">         {
</span><del>-            GLint *dest = boolParams + (i * 4);
</del><ins>+            GLint *dest     = boolParams + (i * 4);
</ins><span class="cx">             const T *source = v + (i * components);
</span><span class="cx"> 
</span><span class="cx">             for (int c = 0; c &lt; components; c++)
</span><span class="cx">             {
</span><del>-                SetIfDirty(dest + c, (source[c] == static_cast&lt;T&gt;(0)) ? GL_FALSE : GL_TRUE, &amp;targetUniform-&gt;dirty);
</del><ins>+                SetIfDirty(dest + c, (source[c] == static_cast&lt;T&gt;(0)) ? GL_FALSE : GL_TRUE,
+                           &amp;targetUniform-&gt;dirty);
</ins><span class="cx">             }
</span><span class="cx">             for (int c = components; c &lt; 4; c++)
</span><span class="cx">             {
</span><span class="lines">@@ -1549,18 +1978,18 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    else if (gl::IsSamplerType(targetUniform-&gt;type))
</del><ins>+    else if (targetUniform-&gt;isSampler())
</ins><span class="cx">     {
</span><span class="cx">         ASSERT(targetUniformType == GL_INT);
</span><span class="cx"> 
</span><del>-        GLint *target = reinterpret_cast&lt;GLint*&gt;(targetUniform-&gt;data) + mUniformIndex[location].element * 4;
</del><ins>+        GLint *target = reinterpret_cast&lt;GLint *&gt;(targetUniform-&gt;data) + arrayElement * 4;
</ins><span class="cx"> 
</span><span class="cx">         bool wasDirty = targetUniform-&gt;dirty;
</span><span class="cx"> 
</span><del>-        for (int i = 0; i &lt; count; i++)
</del><ins>+        for (unsigned int i = 0; i &lt; count; i++)
</ins><span class="cx">         {
</span><del>-            GLint *dest = target + (i * 4);
-            const GLint *source = reinterpret_cast&lt;const GLint*&gt;(v) + (i * components);
</del><ins>+            GLint *dest         = target + (i * 4);
+            const GLint *source = reinterpret_cast&lt;const GLint *&gt;(v) + (i * components);
</ins><span class="cx"> 
</span><span class="cx">             SetIfDirty(dest + 0, source[0], &amp;targetUniform-&gt;dirty);
</span><span class="cx">             SetIfDirty(dest + 1, 0, &amp;targetUniform-&gt;dirty);
</span><span class="lines">@@ -1573,408 +2002,146 @@
</span><span class="cx">             mDirtySamplerMapping = true;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    else UNREACHABLE();
</del><ins>+    else
+        UNREACHABLE();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T&gt;
-bool transposeMatrix(T *target, const GLfloat *value, int targetWidth, int targetHeight, int srcWidth, int srcHeight)
-{
-    bool dirty = false;
-    int copyWidth = std::min(targetHeight, srcWidth);
-    int copyHeight = std::min(targetWidth, srcHeight);
-
-    for (int x = 0; x &lt; copyWidth; x++)
-    {
-        for (int y = 0; y &lt; copyHeight; y++)
-        {
-            SetIfDirty(target + (x * targetWidth + y), static_cast&lt;T&gt;(value[y * srcWidth + x]), &amp;dirty);
-        }
-    }
-    // clear unfilled right side
-    for (int y = 0; y &lt; copyWidth; y++)
-    {
-        for (int x = copyHeight; x &lt; targetWidth; x++)
-        {
-            SetIfDirty(target + (y * targetWidth + x), static_cast&lt;T&gt;(0), &amp;dirty);
-        }
-    }
-    // clear unfilled bottom.
-    for (int y = copyWidth; y &lt; targetHeight; y++)
-    {
-        for (int x = 0; x &lt; targetWidth; x++)
-        {
-            SetIfDirty(target + (y * targetWidth + x), static_cast&lt;T&gt;(0), &amp;dirty);
-        }
-    }
-
-    return dirty;
-}
-
-template&lt;typename T&gt;
-bool expandMatrix(T *target, const GLfloat *value, int targetWidth, int targetHeight, int srcWidth, int srcHeight)
-{
-    bool dirty = false;
-    int copyWidth = std::min(targetWidth, srcWidth);
-    int copyHeight = std::min(targetHeight, srcHeight);
-
-    for (int y = 0; y &lt; copyHeight; y++)
-    {
-        for (int x = 0; x &lt; copyWidth; x++)
-        {
-            SetIfDirty(target + (y * targetWidth + x), static_cast&lt;T&gt;(value[y * srcWidth + x]), &amp;dirty);
-        }
-    }
-    // clear unfilled right side
-    for (int y = 0; y &lt; copyHeight; y++)
-    {
-        for (int x = copyWidth; x &lt; targetWidth; x++)
-        {
-            SetIfDirty(target + (y * targetWidth + x), static_cast&lt;T&gt;(0), &amp;dirty);
-        }
-    }
-    // clear unfilled bottom.
-    for (int y = copyHeight; y &lt; targetHeight; y++)
-    {
-        for (int x = 0; x &lt; targetWidth; x++)
-        {
-            SetIfDirty(target + (y * targetWidth + x), static_cast&lt;T&gt;(0), &amp;dirty);
-        }
-    }
-
-    return dirty;
-}
-
</del><span class="cx"> template &lt;int cols, int rows&gt;
</span><del>-void ProgramD3D::setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum targetUniformType)
</del><ins>+void ProgramD3D::setUniformMatrixfv(GLint location,
+                                    GLsizei countIn,
+                                    GLboolean transpose,
+                                    const GLfloat *value,
+                                    GLenum targetUniformType)
</ins><span class="cx"> {
</span><del>-    gl::LinkedUniform *targetUniform = getUniformByLocation(location);
</del><ins>+    D3DUniform *targetUniform = getD3DUniformFromLocation(location);
</ins><span class="cx"> 
</span><del>-    int elementCount = targetUniform-&gt;elementCount();
</del><ins>+    unsigned int elementCount = targetUniform-&gt;elementCount();
+    unsigned int arrayElement = mData.getUniformLocations()[location].element;
+    unsigned int count        = std::min(elementCount - arrayElement, static_cast&lt;unsigned int&gt;(countIn));
</ins><span class="cx"> 
</span><del>-    count = std::min(elementCount - (int)mUniformIndex[location].element, count);
</del><span class="cx">     const unsigned int targetMatrixStride = (4 * rows);
</span><del>-    GLfloat *target = (GLfloat*)(targetUniform-&gt;data + mUniformIndex[location].element * sizeof(GLfloat) * targetMatrixStride);
</del><ins>+    GLfloat *target =
+        (GLfloat *)(targetUniform-&gt;data + arrayElement * sizeof(GLfloat) * targetMatrixStride);
</ins><span class="cx"> 
</span><del>-    for (int i = 0; i &lt; count; i++)
</del><ins>+    for (unsigned int i = 0; i &lt; count; i++)
</ins><span class="cx">     {
</span><span class="cx">         // Internally store matrices as transposed versions to accomodate HLSL matrix indexing
</span><span class="cx">         if (transpose == GL_FALSE)
</span><span class="cx">         {
</span><del>-            targetUniform-&gt;dirty = transposeMatrix&lt;GLfloat&gt;(target, value, 4, rows, rows, cols) || targetUniform-&gt;dirty;
</del><ins>+            targetUniform-&gt;dirty = TransposeMatrix&lt;GLfloat&gt;(target, value, 4, rows, rows, cols) ||
+                                   targetUniform-&gt;dirty;
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            targetUniform-&gt;dirty = expandMatrix&lt;GLfloat&gt;(target, value, 4, rows, cols, rows) || targetUniform-&gt;dirty;
</del><ins>+            targetUniform-&gt;dirty =
+                ExpandMatrix&lt;GLfloat&gt;(target, value, 4, rows, cols, rows) || targetUniform-&gt;dirty;
</ins><span class="cx">         }
</span><span class="cx">         target += targetMatrixStride;
</span><span class="cx">         value += cols * rows;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;typename T&gt;
-void ProgramD3D::getUniformv(GLint location, T *params, GLenum uniformType)
</del><ins>+size_t ProgramD3D::getUniformBlockInfo(const sh::InterfaceBlock &amp;interfaceBlock)
</ins><span class="cx"> {
</span><del>-    gl::LinkedUniform *targetUniform = mUniforms[mUniformIndex[location].index];
</del><ins>+    ASSERT(interfaceBlock.staticUse || interfaceBlock.layout != sh::BLOCKLAYOUT_PACKED);
</ins><span class="cx"> 
</span><del>-    if (gl::IsMatrixType(targetUniform-&gt;type))
</del><ins>+    // define member uniforms
+    sh::Std140BlockEncoder std140Encoder;
+    sh::HLSLBlockEncoder hlslEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED);
+    sh::BlockLayoutEncoder *encoder = nullptr;
+
+    if (interfaceBlock.layout == sh::BLOCKLAYOUT_STANDARD)
</ins><span class="cx">     {
</span><del>-        const int rows = gl::VariableRowCount(targetUniform-&gt;type);
-        const int cols = gl::VariableColumnCount(targetUniform-&gt;type);
-        transposeMatrix(params, (GLfloat*)targetUniform-&gt;data + mUniformIndex[location].element * 4 * rows, rows, cols, 4, rows);
</del><ins>+        encoder = &amp;std140Encoder;
</ins><span class="cx">     }
</span><del>-    else if (uniformType == gl::VariableComponentType(targetUniform-&gt;type))
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        unsigned int size = gl::VariableComponentCount(targetUniform-&gt;type);
-        memcpy(params, targetUniform-&gt;data + mUniformIndex[location].element * 4 * sizeof(T),
-                size * sizeof(T));
</del><ins>+        encoder = &amp;hlslEncoder;
</ins><span class="cx">     }
</span><del>-    else
-    {
-        unsigned int size = gl::VariableComponentCount(targetUniform-&gt;type);
-        switch (gl::VariableComponentType(targetUniform-&gt;type))
-        {
-          case GL_BOOL:
-            {
-                GLint *boolParams = (GLint*)targetUniform-&gt;data + mUniformIndex[location].element * 4;
</del><span class="cx"> 
</span><del>-                for (unsigned int i = 0; i &lt; size; i++)
-                {
-                    params[i] = (boolParams[i] == GL_FALSE) ? static_cast&lt;T&gt;(0) : static_cast&lt;T&gt;(1);
-                }
-            }
-            break;
</del><ins>+    GetUniformBlockInfo(interfaceBlock.fields, interfaceBlock.fieldPrefix(), encoder,
+                        interfaceBlock.isRowMajorLayout, &amp;mBlockInfo);
</ins><span class="cx"> 
</span><del>-          case GL_FLOAT:
-            {
-                GLfloat *floatParams = (GLfloat*)targetUniform-&gt;data + mUniformIndex[location].element * 4;
-
-                for (unsigned int i = 0; i &lt; size; i++)
-                {
-                    params[i] = static_cast&lt;T&gt;(floatParams[i]);
-                }
-            }
-            break;
-
-          case GL_INT:
-            {
-                GLint *intParams = (GLint*)targetUniform-&gt;data + mUniformIndex[location].element * 4;
-
-                for (unsigned int i = 0; i &lt; size; i++)
-                {
-                    params[i] = static_cast&lt;T&gt;(intParams[i]);
-                }
-            }
-            break;
-
-          case GL_UNSIGNED_INT:
-            {
-                GLuint *uintParams = (GLuint*)targetUniform-&gt;data + mUniformIndex[location].element * 4;
-
-                for (unsigned int i = 0; i &lt; size; i++)
-                {
-                    params[i] = static_cast&lt;T&gt;(uintParams[i]);
-                }
-            }
-            break;
-
-          default: UNREACHABLE();
-        }
-    }
</del><ins>+    return encoder-&gt;getBlockSize();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;typename VarT&gt;
-void ProgramD3D::defineUniformBlockMembers(const std::vector&lt;VarT&gt; &amp;fields, const std::string &amp;prefix, int blockIndex,
-                                           sh::BlockLayoutEncoder *encoder, std::vector&lt;unsigned int&gt; *blockUniformIndexes,
-                                           bool inRowMajorLayout)
</del><ins>+void ProgramD3D::assignAllSamplerRegisters()
</ins><span class="cx"> {
</span><del>-    for (unsigned int uniformIndex = 0; uniformIndex &lt; fields.size(); uniformIndex++)
</del><ins>+    for (D3DUniform *d3dUniform : mD3DUniforms)
</ins><span class="cx">     {
</span><del>-        const VarT &amp;field = fields[uniformIndex];
-        const std::string &amp;fieldName = (prefix.empty() ? field.name : prefix + &quot;.&quot; + field.name);
-
-        if (field.isStruct())
</del><ins>+        if (d3dUniform-&gt;isSampler())
</ins><span class="cx">         {
</span><del>-            bool rowMajorLayout = (inRowMajorLayout || IsRowMajorLayout(field));
-
-            for (unsigned int arrayElement = 0; arrayElement &lt; field.elementCount(); arrayElement++)
-            {
-                encoder-&gt;enterAggregateType();
-
-                const std::string uniformElementName = fieldName + (field.isArray() ? ArrayString(arrayElement) : &quot;&quot;);
-                defineUniformBlockMembers(field.fields, uniformElementName, blockIndex, encoder, blockUniformIndexes, rowMajorLayout);
-
-                encoder-&gt;exitAggregateType();
-            }
</del><ins>+            assignSamplerRegisters(d3dUniform);
</ins><span class="cx">         }
</span><del>-        else
-        {
-            bool isRowMajorMatrix = (gl::IsMatrixType(field.type) &amp;&amp; inRowMajorLayout);
-
-            sh::BlockMemberInfo memberInfo = encoder-&gt;encodeType(field.type, field.arraySize, isRowMajorMatrix);
-
-            gl::LinkedUniform *newUniform = new gl::LinkedUniform(field.type, field.precision, fieldName, field.arraySize,
-                                                          blockIndex, memberInfo);
-
-            // add to uniform list, but not index, since uniform block uniforms have no location
-            blockUniformIndexes-&gt;push_back(mUniforms.size());
-            mUniforms.push_back(newUniform);
-        }
</del><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ProgramD3D::defineUniformBlock(gl::InfoLog &amp;infoLog, const gl::Shader &amp;shader, const sh::InterfaceBlock &amp;interfaceBlock,
-                                    const gl::Caps &amp;caps)
</del><ins>+void ProgramD3D::assignSamplerRegisters(D3DUniform *d3dUniform)
</ins><span class="cx"> {
</span><del>-    const ShaderD3D* shaderD3D = GetImplAs&lt;ShaderD3D&gt;(&amp;shader);
-
-    // create uniform block entries if they do not exist
-    if (getUniformBlockIndex(interfaceBlock.name) == GL_INVALID_INDEX)
</del><ins>+    ASSERT(d3dUniform-&gt;isSampler());
+    const ShaderD3D *vertexShaderD3D   = GetImplAs&lt;ShaderD3D&gt;(mData.getAttachedVertexShader());
+    const ShaderD3D *fragmentShaderD3D = GetImplAs&lt;ShaderD3D&gt;(mData.getAttachedFragmentShader());
+    ASSERT(vertexShaderD3D-&gt;hasUniform(d3dUniform) || fragmentShaderD3D-&gt;hasUniform(d3dUniform));
+    if (vertexShaderD3D-&gt;hasUniform(d3dUniform))
</ins><span class="cx">     {
</span><del>-        std::vector&lt;unsigned int&gt; blockUniformIndexes;
-        const unsigned int blockIndex = mUniformBlocks.size();
-
-        // define member uniforms
-        sh::BlockLayoutEncoder *encoder = NULL;
-
-        if (interfaceBlock.layout == sh::BLOCKLAYOUT_STANDARD)
-        {
-            encoder = new sh::Std140BlockEncoder;
-        }
-        else
-        {
-            encoder = new sh::HLSLBlockEncoder(sh::HLSLBlockEncoder::ENCODE_PACKED);
-        }
-        ASSERT(encoder);
-
-        defineUniformBlockMembers(interfaceBlock.fields, &quot;&quot;, blockIndex, encoder, &amp;blockUniformIndexes, interfaceBlock.isRowMajorLayout);
-
-        size_t dataSize = encoder-&gt;getBlockSize();
-
-        // create all the uniform blocks
-        if (interfaceBlock.arraySize &gt; 0)
-        {
-            for (unsigned int uniformBlockElement = 0; uniformBlockElement &lt; interfaceBlock.arraySize; uniformBlockElement++)
-            {
-                gl::UniformBlock *newUniformBlock = new gl::UniformBlock(interfaceBlock.name, uniformBlockElement, dataSize);
-                newUniformBlock-&gt;memberUniformIndexes = blockUniformIndexes;
-                mUniformBlocks.push_back(newUniformBlock);
-            }
-        }
-        else
-        {
-            gl::UniformBlock *newUniformBlock = new gl::UniformBlock(interfaceBlock.name, GL_INVALID_INDEX, dataSize);
-            newUniformBlock-&gt;memberUniformIndexes = blockUniformIndexes;
-            mUniformBlocks.push_back(newUniformBlock);
-        }
</del><ins>+        d3dUniform-&gt;vsRegisterIndex = vertexShaderD3D-&gt;getUniformRegister(d3dUniform-&gt;name);
+        ASSERT(d3dUniform-&gt;vsRegisterIndex != GL_INVALID_INDEX);
+        AssignSamplers(d3dUniform-&gt;vsRegisterIndex, d3dUniform-&gt;type, d3dUniform-&gt;arraySize,
+                       mSamplersVS, &amp;mUsedVertexSamplerRange);
</ins><span class="cx">     }
</span><del>-
-    if (interfaceBlock.staticUse)
</del><ins>+    if (fragmentShaderD3D-&gt;hasUniform(d3dUniform))
</ins><span class="cx">     {
</span><del>-        // Assign registers to the uniform blocks
-        const GLuint blockIndex = getUniformBlockIndex(interfaceBlock.name);
-        const unsigned int elementCount = std::max(1u, interfaceBlock.arraySize);
-        ASSERT(blockIndex != GL_INVALID_INDEX);
-        ASSERT(blockIndex + elementCount &lt;= mUniformBlocks.size());
-
-        unsigned int interfaceBlockRegister = shaderD3D-&gt;getInterfaceBlockRegister(interfaceBlock.name);
-
-        for (unsigned int uniformBlockElement = 0; uniformBlockElement &lt; elementCount; uniformBlockElement++)
-        {
-            gl::UniformBlock *uniformBlock = mUniformBlocks[blockIndex + uniformBlockElement];
-            ASSERT(uniformBlock-&gt;name == interfaceBlock.name);
-
-            if (!assignUniformBlockRegister(infoLog, uniformBlock, shader.getType(),
-                                            interfaceBlockRegister + uniformBlockElement, caps))
-            {
-                return false;
-            }
-        }
</del><ins>+        d3dUniform-&gt;psRegisterIndex = fragmentShaderD3D-&gt;getUniformRegister(d3dUniform-&gt;name);
+        ASSERT(d3dUniform-&gt;psRegisterIndex != GL_INVALID_INDEX);
+        AssignSamplers(d3dUniform-&gt;psRegisterIndex, d3dUniform-&gt;type, d3dUniform-&gt;arraySize,
+                       mSamplersPS, &amp;mUsedPixelSamplerRange);
</ins><span class="cx">     }
</span><del>-
-    return true;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ProgramD3D::assignSamplers(unsigned int startSamplerIndex,
-                                   GLenum samplerType,
-                                   unsigned int samplerCount,
-                                   std::vector&lt;Sampler&gt; &amp;outSamplers,
-                                   GLuint *outUsedRange)
</del><ins>+// static
+void ProgramD3D::AssignSamplers(unsigned int startSamplerIndex,
+                                GLenum samplerType,
+                                unsigned int samplerCount,
+                                std::vector&lt;Sampler&gt; &amp;outSamplers,
+                                GLuint *outUsedRange)
</ins><span class="cx"> {
</span><span class="cx">     unsigned int samplerIndex = startSamplerIndex;
</span><span class="cx"> 
</span><span class="cx">     do
</span><span class="cx">     {
</span><del>-        if (samplerIndex &lt; outSamplers.size())
-        {
-            Sampler&amp; sampler = outSamplers[samplerIndex];
-            sampler.active = true;
-            sampler.textureType = GetTextureType(samplerType);
-            sampler.logicalTextureUnit = 0;
-            *outUsedRange = std::max(samplerIndex + 1, *outUsedRange);
-        }
-        else
-        {
-            return false;
-        }
-
</del><ins>+        ASSERT(samplerIndex &lt; outSamplers.size());
+        Sampler *sampler            = &amp;outSamplers[samplerIndex];
+        sampler-&gt;active             = true;
+        sampler-&gt;textureType        = gl::SamplerTypeToTextureType(samplerType);
+        sampler-&gt;logicalTextureUnit = 0;
+        *outUsedRange               = std::max(samplerIndex + 1, *outUsedRange);
</ins><span class="cx">         samplerIndex++;
</span><span class="cx">     } while (samplerIndex &lt; startSamplerIndex + samplerCount);
</span><del>-
-    return true;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ProgramD3D::indexSamplerUniform(const gl::LinkedUniform &amp;uniform, gl::InfoLog &amp;infoLog, const gl::Caps &amp;caps)
-{
-    ASSERT(gl::IsSamplerType(uniform.type));
-    ASSERT(uniform.vsRegisterIndex != GL_INVALID_INDEX || uniform.psRegisterIndex != GL_INVALID_INDEX);
-
-    if (uniform.vsRegisterIndex != GL_INVALID_INDEX)
-    {
-        if (!assignSamplers(uniform.vsRegisterIndex, uniform.type, uniform.arraySize, mSamplersVS,
-                            &amp;mUsedVertexSamplerRange))
-        {
-            infoLog.append(&quot;Vertex shader sampler count exceeds the maximum vertex texture units (%d).&quot;,
-                           mSamplersVS.size());
-            return false;
-        }
-
-        unsigned int maxVertexVectors = mRenderer-&gt;getReservedVertexUniformVectors() + caps.maxVertexUniformVectors;
-        if (uniform.vsRegisterIndex + uniform.registerCount &gt; maxVertexVectors)
-        {
-            infoLog.append(&quot;Vertex shader active uniforms exceed GL_MAX_VERTEX_UNIFORM_VECTORS (%u)&quot;,
-                           caps.maxVertexUniformVectors);
-            return false;
-        }
-    }
-
-    if (uniform.psRegisterIndex != GL_INVALID_INDEX)
-    {
-        if (!assignSamplers(uniform.psRegisterIndex, uniform.type, uniform.arraySize, mSamplersPS,
-                            &amp;mUsedPixelSamplerRange))
-        {
-            infoLog.append(&quot;Pixel shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (%d).&quot;,
-                           mSamplersPS.size());
-            return false;
-        }
-
-        unsigned int maxFragmentVectors = mRenderer-&gt;getReservedFragmentUniformVectors() + caps.maxFragmentUniformVectors;
-        if (uniform.psRegisterIndex + uniform.registerCount &gt; maxFragmentVectors)
-        {
-            infoLog.append(&quot;Fragment shader active uniforms exceed GL_MAX_FRAGMENT_UNIFORM_VECTORS (%u)&quot;,
-                           caps.maxFragmentUniformVectors);
-            return false;
-        }
-    }
-
-    return true;
-}
-
-bool ProgramD3D::indexUniforms(gl::InfoLog &amp;infoLog, const gl::Caps &amp;caps)
-{
-    for (size_t uniformIndex = 0; uniformIndex &lt; mUniforms.size(); uniformIndex++)
-    {
-        const gl::LinkedUniform &amp;uniform = *mUniforms[uniformIndex];
-
-        if (gl::IsSamplerType(uniform.type))
-        {
-            if (!indexSamplerUniform(uniform, infoLog, caps))
-            {
-                return false;
-            }
-        }
-
-        for (unsigned int arrayIndex = 0; arrayIndex &lt; uniform.elementCount(); arrayIndex++)
-        {
-            if (!uniform.isBuiltIn())
-            {
-                mUniformIndex.push_back(gl::VariableLocation(uniform.name, arrayIndex, uniformIndex));
-            }
-        }
-    }
-
-    return true;
-}
-
</del><span class="cx"> void ProgramD3D::reset()
</span><span class="cx"> {
</span><del>-    ProgramImpl::reset();
-
</del><span class="cx">     SafeDeleteContainer(mVertexExecutables);
</span><span class="cx">     SafeDeleteContainer(mPixelExecutables);
</span><del>-    SafeDelete(mGeometryExecutable);
</del><span class="cx"> 
</span><del>-    mTransformFeedbackBufferMode = GL_NONE;
</del><ins>+    for (auto &amp;element : mGeometryExecutables)
+    {
+        SafeDelete(element);
+    }
</ins><span class="cx"> 
</span><span class="cx">     mVertexHLSL.clear();
</span><del>-    mVertexWorkarounds.reset();
-    mShaderVersion = 100;
</del><ins>+    mVertexWorkarounds = D3DCompilerWorkarounds();
</ins><span class="cx"> 
</span><span class="cx">     mPixelHLSL.clear();
</span><del>-    mPixelWorkarounds.reset();
</del><ins>+    mPixelWorkarounds = D3DCompilerWorkarounds();
</ins><span class="cx">     mUsesFragDepth = false;
</span><span class="cx">     mPixelShaderKey.clear();
</span><span class="cx">     mUsesPointSize = false;
</span><ins>+    mUsesFlatInterpolation = false;
</ins><span class="cx"> 
</span><ins>+    SafeDeleteContainer(mD3DUniforms);
+    mD3DUniformBlocks.clear();
+
</ins><span class="cx">     SafeDelete(mVertexUniformStorage);
</span><span class="cx">     SafeDelete(mFragmentUniformStorage);
</span><span class="cx"> 
</span><span class="lines">@@ -1982,10 +2149,14 @@
</span><span class="cx">     mSamplersVS.clear();
</span><span class="cx"> 
</span><span class="cx">     mUsedVertexSamplerRange = 0;
</span><del>-    mUsedPixelSamplerRange = 0;
-    mDirtySamplerMapping = true;
</del><ins>+    mUsedPixelSamplerRange  = 0;
+    mDirtySamplerMapping    = true;
</ins><span class="cx"> 
</span><del>-    std::fill(mAttributesByLayout, mAttributesByLayout + ArraySize(mAttributesByLayout), -1);
</del><ins>+    mAttribLocationToD3DSemantic.fill(-1);
+
+    mStreamOutVaryings.clear();
+
+    mGeometryShaderPreamble.clear();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned int ProgramD3D::getSerial() const
</span><span class="lines">@@ -1998,32 +2169,143 @@
</span><span class="cx">     return mCurrentSerial++;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::initAttributesByLayout()
</del><ins>+void ProgramD3D::initAttribLocationsToD3DSemantic()
</ins><span class="cx"> {
</span><del>-    for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+    const gl::Shader *vertexShader = mData.getAttachedVertexShader();
+    ASSERT(vertexShader != nullptr);
+
+    // Init semantic index
+    for (const sh::Attribute &amp;attribute : mData.getAttributes())
</ins><span class="cx">     {
</span><del>-        mAttributesByLayout[i] = i;
</del><ins>+        int d3dSemantic = vertexShader-&gt;getSemanticIndex(attribute.name);
+        int regCount    = gl::VariableRegisterCount(attribute.type);
+
+        for (int reg = 0; reg &lt; regCount; ++reg)
+        {
+            mAttribLocationToD3DSemantic[attribute.location + reg] = d3dSemantic + reg;
+        }
</ins><span class="cx">     }
</span><ins>+}
</ins><span class="cx"> 
</span><del>-    std::sort(&amp;mAttributesByLayout[0], &amp;mAttributesByLayout[gl::MAX_VERTEX_ATTRIBS], AttributeSorter(mSemanticIndex));
</del><ins>+void ProgramD3D::updateCachedInputLayout(const gl::State &amp;state)
+{
+    mCachedInputLayout.clear();
+    const auto &amp;vertexAttributes = state.getVertexArray()-&gt;getVertexAttributes();
+
+    for (unsigned int locationIndex : angle::IterateBitSet(mData.getActiveAttribLocationsMask()))
+    {
+        int d3dSemantic = mAttribLocationToD3DSemantic[locationIndex];
+
+        if (d3dSemantic != -1)
+        {
+            if (mCachedInputLayout.size() &lt; static_cast&lt;size_t&gt;(d3dSemantic + 1))
+            {
+                mCachedInputLayout.resize(d3dSemantic + 1, gl::VERTEX_FORMAT_INVALID);
+            }
+            mCachedInputLayout[d3dSemantic] =
+                GetVertexFormatType(vertexAttributes[locationIndex],
+                                    state.getVertexAttribCurrentValue(locationIndex).Type);
+        }
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramD3D::sortAttributesByLayout(rx::TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS],
-                                        int sortedSemanticIndices[gl::MAX_VERTEX_ATTRIBS]) const
</del><ins>+void ProgramD3D::gatherTransformFeedbackVaryings(const VaryingPacking &amp;varyingPacking)
</ins><span class="cx"> {
</span><del>-    rx::TranslatedAttribute oldTranslatedAttributes[gl::MAX_VERTEX_ATTRIBS];
</del><ins>+    const auto &amp;builtins = varyingPacking.builtins(SHADER_VERTEX);
</ins><span class="cx"> 
</span><del>-    for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+    const std::string &amp;varyingSemantic =
+        GetVaryingSemantic(mRenderer-&gt;getMajorShaderModel(), usesPointSize());
+
+    // Gather the linked varyings that are used for transform feedback, they should all exist.
+    mStreamOutVaryings.clear();
+
+    const auto &amp;tfVaryingNames = mData.getTransformFeedbackVaryingNames();
+    for (unsigned int outputSlot = 0; outputSlot &lt; static_cast&lt;unsigned int&gt;(tfVaryingNames.size());
+         ++outputSlot)
</ins><span class="cx">     {
</span><del>-        oldTranslatedAttributes[i] = attributes[i];
</del><ins>+        const auto &amp;tfVaryingName = tfVaryingNames[outputSlot];
+        if (tfVaryingName == &quot;gl_Position&quot;)
+        {
+            if (builtins.glPosition.enabled)
+            {
+                mStreamOutVaryings.push_back(D3DVarying(builtins.glPosition.semantic,
+                                                        builtins.glPosition.index, 4, outputSlot));
+            }
+        }
+        else if (tfVaryingName == &quot;gl_FragCoord&quot;)
+        {
+            if (builtins.glFragCoord.enabled)
+            {
+                mStreamOutVaryings.push_back(D3DVarying(builtins.glFragCoord.semantic,
+                                                        builtins.glFragCoord.index, 4, outputSlot));
+            }
+        }
+        else if (tfVaryingName == &quot;gl_PointSize&quot;)
+        {
+            if (builtins.glPointSize.enabled)
+            {
+                mStreamOutVaryings.push_back(D3DVarying(&quot;PSIZE&quot;, 0, 1, outputSlot));
+            }
+        }
+        else
+        {
+            for (const PackedVaryingRegister &amp;registerInfo : varyingPacking.getRegisterList())
+            {
+                const auto &amp;varying   = *registerInfo.packedVarying-&gt;varying;
+                GLenum transposedType = gl::TransposeMatrixType(varying.type);
+                int componentCount = gl::VariableColumnCount(transposedType);
+                ASSERT(!varying.isBuiltIn());
+
+                // Transform feedback for varying structs is underspecified.
+                // See Khronos bug 9856.
+                // TODO(jmadill): Figure out how to be spec-compliant here.
+                if (registerInfo.packedVarying-&gt;isStructField() || varying.isStruct())
+                    continue;
+
+                // There can be more than one register assigned to a particular varying, and each
+                // register needs its own stream out entry.
+                if (tfVaryingName == varying.name)
+                {
+                    mStreamOutVaryings.push_back(D3DVarying(
+                        varyingSemantic, registerInfo.semanticIndex, componentCount, outputSlot));
+                }
+            }
+        }
</ins><span class="cx">     }
</span><ins>+}
</ins><span class="cx"> 
</span><del>-    for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+D3DUniform *ProgramD3D::getD3DUniformFromLocation(GLint location)
+{
+    return mD3DUniforms[mData.getUniformLocations()[location].index];
+}
+
+bool ProgramD3D::getUniformBlockSize(const std::string &amp;blockName, size_t *sizeOut) const
+{
+    std::string baseName = blockName;
+    gl::ParseAndStripArrayIndex(&amp;baseName);
+
+    auto sizeIter = mBlockDataSizes.find(baseName);
+    if (sizeIter == mBlockDataSizes.end())
</ins><span class="cx">     {
</span><del>-        int oldIndex = mAttributesByLayout[i];
-        sortedSemanticIndices[i] = mSemanticIndex[oldIndex];
-        attributes[i] = oldTranslatedAttributes[oldIndex];
</del><ins>+        *sizeOut = 0;
+        return false;
</ins><span class="cx">     }
</span><ins>+
+    *sizeOut = sizeIter-&gt;second;
+    return true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool ProgramD3D::getUniformBlockMemberInfo(const std::string &amp;memberUniformName,
+                                           sh::BlockMemberInfo *memberInfoOut) const
+{
+    auto infoIter = mBlockInfo.find(memberUniformName);
+    if (infoIter == mBlockInfo.end())
+    {
+        *memberInfoOut = sh::BlockMemberInfo::getDefaultBlockInfo();
+        return false;
+    }
+
+    *memberInfoOut = infoIter-&gt;second;
+    return true;
</ins><span class="cx"> }
</span><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dProgramD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ProgramD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ProgramD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ProgramD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,23 +9,16 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_
</span><span class="cx"> 
</span><del>-#include &quot;common/Optional.h&quot;
</del><ins>+#include &lt;string&gt;
+#include &lt;vector&gt;
+
</ins><span class="cx"> #include &quot;compiler/translator/blocklayoutHLSL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Constants.h&quot;
</span><ins>+#include &quot;libANGLE/formatutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/ProgramImpl.h&quot;
</span><del>-#include &quot;libANGLE/renderer/Workarounds.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/DynamicHLSL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/WorkaroundsD3D.h&quot;
</ins><span class="cx"> 
</span><del>-#include &lt;string&gt;
-#include &lt;vector&gt;
-
-namespace gl
-{
-struct LinkedUniform;
-struct VariableLocation;
-struct VertexFormat;
-}
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class RendererD3D;
</span><span class="lines">@@ -38,53 +31,153 @@
</span><span class="cx"> #define ANGLE_COMPILE_OPTIMIZATION_LEVEL D3DCOMPILE_OPTIMIZATION_LEVEL1
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+// Helper struct representing a single shader uniform
+struct D3DUniform : angle::NonCopyable
+{
+    D3DUniform(GLenum typeIn,
+               const std::string &amp;nameIn,
+               unsigned int arraySizeIn,
+               bool defaultBlock);
+    ~D3DUniform();
+
+    bool isSampler() const;
+    unsigned int elementCount() const { return std::max(1u, arraySize); }
+    bool isReferencedByVertexShader() const;
+    bool isReferencedByFragmentShader() const;
+
+    // Duplicated from the GL layer
+    GLenum type;
+    std::string name;
+    unsigned int arraySize;
+
+    // Pointer to a system copy of the data.
+    // TODO(jmadill): remove this in favor of gl::LinkedUniform::data().
+    uint8_t *data;
+
+    // Has the data been updated since the last sync?
+    bool dirty;
+
+    // Register information.
+    unsigned int vsRegisterIndex;
+    unsigned int psRegisterIndex;
+    unsigned int registerCount;
+
+    // Register &quot;elements&quot; are used for uniform structs in ES3, to appropriately identify single
+    // uniforms
+    // inside aggregate types, which are packed according C-like structure rules.
+    unsigned int registerElement;
+};
+
+struct D3DUniformBlock
+{
+    D3DUniformBlock() : vsRegisterIndex(GL_INVALID_INDEX), psRegisterIndex(GL_INVALID_INDEX) {}
+
+    bool vertexStaticUse() const { return vsRegisterIndex != GL_INVALID_INDEX; }
+
+    bool fragmentStaticUse() const { return psRegisterIndex != GL_INVALID_INDEX; }
+
+    unsigned int vsRegisterIndex;
+    unsigned int psRegisterIndex;
+};
+
+struct D3DVarying final
+{
+    D3DVarying();
+    D3DVarying(const std::string &amp;semanticNameIn,
+               unsigned int semanticIndexIn,
+               unsigned int componentCountIn,
+               unsigned int outputSlotIn);
+
+    D3DVarying(const D3DVarying &amp;) = default;
+    D3DVarying &amp;operator=(const D3DVarying &amp;) = default;
+
+    std::string semanticName;
+    unsigned int semanticIndex;
+    unsigned int componentCount;
+    unsigned int outputSlot;
+};
+
+class ProgramD3DMetadata : angle::NonCopyable
+{
+  public:
+    ProgramD3DMetadata(int rendererMajorShaderModel,
+                       const std::string &amp;shaderModelSuffix,
+                       bool usesInstancedPointSpriteEmulation,
+                       bool usesViewScale,
+                       const ShaderD3D *vertexShader,
+                       const ShaderD3D *fragmentShader);
+
+    int getRendererMajorShaderModel() const;
+    bool usesBroadcast(const gl::Data &amp;data) const;
+    bool usesFragDepth(const gl::Program::Data &amp;programData) const;
+    bool usesPointCoord() const;
+    bool usesFragCoord() const;
+    bool usesPointSize() const;
+    bool usesInsertedPointCoordValue() const;
+    bool usesViewScale() const;
+    bool addsPointCoordToVertexShader() const;
+    bool usesTransformFeedbackGLPosition() const;
+    bool usesSystemValuePointSize() const;
+    bool usesMultipleFragmentOuts() const;
+    GLint getMajorShaderVersion() const;
+    const ShaderD3D *getFragmentShader() const;
+
+  private:
+    const int mRendererMajorShaderModel;
+    const std::string mShaderModelSuffix;
+    const bool mUsesInstancedPointSpriteEmulation;
+    const bool mUsesViewScale;
+    const ShaderD3D *mVertexShader;
+    const ShaderD3D *mFragmentShader;
+};
+
</ins><span class="cx"> class ProgramD3D : public ProgramImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    ProgramD3D(RendererD3D *renderer);
</del><ins>+    ProgramD3D(const gl::Program::Data &amp;data, RendererD3D *renderer);
</ins><span class="cx">     virtual ~ProgramD3D();
</span><span class="cx"> 
</span><span class="cx">     const std::vector&lt;PixelShaderOutputVariable&gt; &amp;getPixelShaderKey() { return mPixelShaderKey; }
</span><del>-    int getShaderVersion() const { return mShaderVersion; }
-    GLenum getTransformFeedbackBufferMode() const { return mTransformFeedbackBufferMode; }
</del><span class="cx"> 
</span><del>-    GLint getSamplerMapping(gl::SamplerType type, unsigned int samplerIndex, const gl::Caps &amp;caps) const;
</del><ins>+    GLint getSamplerMapping(gl::SamplerType type,
+                            unsigned int samplerIndex,
+                            const gl::Caps &amp;caps) const;
</ins><span class="cx">     GLenum getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const;
</span><del>-    GLint getUsedSamplerRange(gl::SamplerType type) const;
</del><ins>+    GLuint getUsedSamplerRange(gl::SamplerType type) const;
</ins><span class="cx">     void updateSamplerMapping();
</span><del>-    bool validateSamplers(gl::InfoLog *infoLog, const gl::Caps &amp;caps);
</del><span class="cx"> 
</span><span class="cx">     bool usesPointSize() const { return mUsesPointSize; }
</span><span class="cx">     bool usesPointSpriteEmulation() const;
</span><del>-    bool usesGeometryShader() const;
</del><ins>+    bool usesGeometryShader(GLenum drawMode) const;
</ins><span class="cx">     bool usesInstancedPointSpriteEmulation() const;
</span><span class="cx"> 
</span><del>-    GLenum getBinaryFormat() { return GL_PROGRAM_BINARY_ANGLE; }
-    LinkResult load(gl::InfoLog &amp;infoLog, gl::BinaryInputStream *stream);
-    gl::Error save(gl::BinaryOutputStream *stream);
</del><ins>+    LinkResult load(gl::InfoLog &amp;infoLog, gl::BinaryInputStream *stream) override;
+    gl::Error save(gl::BinaryOutputStream *stream) override;
+    void setBinaryRetrievableHint(bool retrievable) override;
</ins><span class="cx"> 
</span><del>-    gl::Error getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo, ShaderExecutableD3D **outExectuable);
-    gl::Error getPixelExecutableForOutputLayout(const std::vector&lt;GLenum&gt; &amp;outputLayout, ShaderExecutableD3D **outExectuable, gl::InfoLog *infoLog);
-    gl::Error getVertexExecutableForInputLayout(const gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS], ShaderExecutableD3D **outExectuable, gl::InfoLog *infoLog);
-    ShaderExecutableD3D *getGeometryExecutable() const { return mGeometryExecutable; }
</del><ins>+    gl::Error getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo,
+                                               ShaderExecutableD3D **outExectuable);
+    gl::Error getPixelExecutableForOutputLayout(const std::vector&lt;GLenum&gt; &amp;outputLayout,
+                                                ShaderExecutableD3D **outExectuable,
+                                                gl::InfoLog *infoLog);
+    gl::Error getVertexExecutableForInputLayout(const gl::InputLayout &amp;inputLayout,
+                                                ShaderExecutableD3D **outExectuable,
+                                                gl::InfoLog *infoLog);
+    gl::Error getGeometryExecutableForPrimitiveType(const gl::Data &amp;data,
+                                                    GLenum drawMode,
+                                                    ShaderExecutableD3D **outExecutable,
+                                                    gl::InfoLog *infoLog);
</ins><span class="cx"> 
</span><del>-    LinkResult compileProgramExecutables(gl::InfoLog &amp;infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                                         int registers);
</del><ins>+    LinkResult link(const gl::Data &amp;data, gl::InfoLog &amp;infoLog) override;
+    GLboolean validate(const gl::Caps &amp;caps, gl::InfoLog *infoLog) override;
</ins><span class="cx"> 
</span><del>-    LinkResult link(const gl::Data &amp;data, gl::InfoLog &amp;infoLog,
-                    gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                    const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings,
-                    GLenum transformFeedbackBufferMode,
-                    int *registers, std::vector&lt;gl::LinkedVarying&gt; *linkedVaryings,
-                    std::map&lt;int, gl::VariableLocation&gt; *outputVariables);
</del><ins>+    bool getUniformBlockSize(const std::string &amp;blockName, size_t *sizeOut) const override;
+    bool getUniformBlockMemberInfo(const std::string &amp;memberUniformName,
+                                   sh::BlockMemberInfo *memberInfoOut) const override;
</ins><span class="cx"> 
</span><del>-    void getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const;
-
</del><span class="cx">     void initializeUniformStorage();
</span><del>-    gl::Error applyUniforms();
-    gl::Error applyUniformBuffers(const gl::Data &amp;data, GLuint uniformBlockBindings[]) override;
-    bool assignUniformBlockRegister(gl::InfoLog &amp;infoLog, gl::UniformBlock *uniformBlock, GLenum shader,
-                                    unsigned int registerIndex, const gl::Caps &amp;caps);
</del><ins>+    gl::Error applyUniforms(GLenum drawMode);
+    gl::Error applyUniformBuffers(const gl::Data &amp;data);
</ins><span class="cx">     void dirtyAllUniforms();
</span><span class="cx"> 
</span><span class="cx">     void setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
</span><span class="lines">@@ -99,63 +192,106 @@
</span><span class="cx">     void setUniform2uiv(GLint location, GLsizei count, const GLuint *v);
</span><span class="cx">     void setUniform3uiv(GLint location, GLsizei count, const GLuint *v);
</span><span class="cx">     void setUniform4uiv(GLint location, GLsizei count, const GLuint *v);
</span><del>-    void setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-    void setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-    void setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-    void setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-    void setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-    void setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-    void setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-    void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-    void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
</del><ins>+    void setUniformMatrix2fv(GLint location,
+                             GLsizei count,
+                             GLboolean transpose,
+                             const GLfloat *value);
+    void setUniformMatrix3fv(GLint location,
+                             GLsizei count,
+                             GLboolean transpose,
+                             const GLfloat *value);
+    void setUniformMatrix4fv(GLint location,
+                             GLsizei count,
+                             GLboolean transpose,
+                             const GLfloat *value);
+    void setUniformMatrix2x3fv(GLint location,
+                               GLsizei count,
+                               GLboolean transpose,
+                               const GLfloat *value);
+    void setUniformMatrix3x2fv(GLint location,
+                               GLsizei count,
+                               GLboolean transpose,
+                               const GLfloat *value);
+    void setUniformMatrix2x4fv(GLint location,
+                               GLsizei count,
+                               GLboolean transpose,
+                               const GLfloat *value);
+    void setUniformMatrix4x2fv(GLint location,
+                               GLsizei count,
+                               GLboolean transpose,
+                               const GLfloat *value);
+    void setUniformMatrix3x4fv(GLint location,
+                               GLsizei count,
+                               GLboolean transpose,
+                               const GLfloat *value);
+    void setUniformMatrix4x3fv(GLint location,
+                               GLsizei count,
+                               GLboolean transpose,
+                               const GLfloat *value);
</ins><span class="cx"> 
</span><del>-    void getUniformfv(GLint location, GLfloat *params);
-    void getUniformiv(GLint location, GLint *params);
-    void getUniformuiv(GLint location, GLuint *params);
</del><ins>+    void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override;
</ins><span class="cx"> 
</span><span class="cx">     const UniformStorageD3D &amp;getVertexUniformStorage() const { return *mVertexUniformStorage; }
</span><span class="cx">     const UniformStorageD3D &amp;getFragmentUniformStorage() const { return *mFragmentUniformStorage; }
</span><span class="cx"> 
</span><del>-    bool linkUniforms(gl::InfoLog &amp;infoLog, const gl::Shader &amp;vertexShader, const gl::Shader &amp;fragmentShader,
-                      const gl::Caps &amp;caps);
-    bool defineUniformBlock(gl::InfoLog &amp;infoLog, const gl::Shader &amp;shader, const sh::InterfaceBlock &amp;interfaceBlock, const gl::Caps &amp;caps);
</del><ins>+    unsigned int getSerial() const;
</ins><span class="cx"> 
</span><del>-    void reset();
</del><ins>+    const AttribIndexArray &amp;getAttribLocationToD3DSemantics() const
+    {
+        return mAttribLocationToD3DSemantic;
+    }
</ins><span class="cx"> 
</span><del>-    unsigned int getSerial() const;
</del><ins>+    void updateCachedInputLayout(const gl::State &amp;state);
+    const gl::InputLayout &amp;getCachedInputLayout() const { return mCachedInputLayout; }
</ins><span class="cx"> 
</span><del>-    void initAttributesByLayout();
-    void sortAttributesByLayout(rx::TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS],
-                                int sortedSemanticIndices[gl::MAX_VERTEX_ATTRIBS]) const;
</del><ins>+    bool isSamplerMappingDirty() { return mDirtySamplerMapping; }
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     class VertexExecutable
</span><span class="cx">     {
</span><span class="cx">       public:
</span><del>-        VertexExecutable(const gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS],
-                         const GLenum signature[gl::MAX_VERTEX_ATTRIBS],
</del><ins>+        enum HLSLAttribType
+        {
+            FLOAT,
+            UNSIGNED_INT,
+            SIGNED_INT,
+        };
+
+        typedef std::vector&lt;HLSLAttribType&gt; Signature;
+
+        VertexExecutable(const gl::InputLayout &amp;inputLayout,
+                         const Signature &amp;signature,
</ins><span class="cx">                          ShaderExecutableD3D *shaderExecutable);
</span><span class="cx">         ~VertexExecutable();
</span><span class="cx"> 
</span><del>-        bool matchesSignature(const GLenum convertedLayout[gl::MAX_VERTEX_ATTRIBS]) const;
</del><ins>+        bool matchesSignature(const Signature &amp;signature) const;
+        static void getSignature(RendererD3D *renderer,
+                                 const gl::InputLayout &amp;inputLayout,
+                                 Signature *signatureOut);
</ins><span class="cx"> 
</span><del>-        const gl::VertexFormat *inputs() const { return mInputs; }
-        const GLenum *signature() const { return mSignature; }
</del><ins>+        const gl::InputLayout &amp;inputs() const { return mInputs; }
+        const Signature &amp;signature() const { return mSignature; }
</ins><span class="cx">         ShaderExecutableD3D *shaderExecutable() const { return mShaderExecutable; }
</span><span class="cx"> 
</span><span class="cx">       private:
</span><del>-        gl::VertexFormat mInputs[gl::MAX_VERTEX_ATTRIBS];
-        GLenum mSignature[gl::MAX_VERTEX_ATTRIBS];
</del><ins>+        static HLSLAttribType GetAttribType(GLenum type);
+
+        gl::InputLayout mInputs;
+        Signature mSignature;
</ins><span class="cx">         ShaderExecutableD3D *mShaderExecutable;
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     class PixelExecutable
</span><span class="cx">     {
</span><span class="cx">       public:
</span><del>-        PixelExecutable(const std::vector&lt;GLenum&gt; &amp;outputSignature, ShaderExecutableD3D *shaderExecutable);
</del><ins>+        PixelExecutable(const std::vector&lt;GLenum&gt; &amp;outputSignature,
+                        ShaderExecutableD3D *shaderExecutable);
</ins><span class="cx">         ~PixelExecutable();
</span><span class="cx"> 
</span><del>-        bool matchesSignature(const std::vector&lt;GLenum&gt; &amp;signature) const { return mOutputSignature == signature; }
</del><ins>+        bool matchesSignature(const std::vector&lt;GLenum&gt; &amp;signature) const
+        {
+            return mOutputSignature == signature;
+        }
</ins><span class="cx"> 
</span><span class="cx">         const std::vector&lt;GLenum&gt; &amp;outputSignature() const { return mOutputSignature; }
</span><span class="cx">         ShaderExecutableD3D *shaderExecutable() const { return mShaderExecutable; }
</span><span class="lines">@@ -174,34 +310,56 @@
</span><span class="cx">         GLenum textureType;
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    void defineUniformBase(const ShaderD3D *shader, const sh::Uniform &amp;uniform, unsigned int uniformRegister);
-    void defineUniform(const ShaderD3D *shader, const sh::ShaderVariable &amp;uniform, const std::string &amp;fullName,
-                       sh::HLSLBlockEncoder *encoder);
-    bool indexSamplerUniform(const gl::LinkedUniform &amp;uniform, gl::InfoLog &amp;infoLog, const gl::Caps &amp;caps);
-    bool indexUniforms(gl::InfoLog &amp;infoLog, const gl::Caps &amp;caps);
-    static bool assignSamplers(unsigned int startSamplerIndex, GLenum samplerType, unsigned int samplerCount,
-                               std::vector&lt;Sampler&gt; &amp;outSamplers, GLuint *outUsedRange);
</del><ins>+    typedef std::map&lt;std::string, D3DUniform *&gt; D3DUniformMap;
</ins><span class="cx"> 
</span><ins>+    void defineUniformsAndAssignRegisters();
+    void defineUniformBase(const gl::Shader *shader,
+                           const sh::Uniform &amp;uniform,
+                           D3DUniformMap *uniformMap);
+    void defineUniform(GLenum shaderType,
+                       const sh::ShaderVariable &amp;uniform,
+                       const std::string &amp;fullName,
+                       sh::HLSLBlockEncoder *encoder,
+                       D3DUniformMap *uniformMap);
+    void assignAllSamplerRegisters();
+    void assignSamplerRegisters(D3DUniform *d3dUniform);
+
+    static void AssignSamplers(unsigned int startSamplerIndex,
+                               GLenum samplerType,
+                               unsigned int samplerCount,
+                               std::vector&lt;Sampler&gt; &amp;outSamplers,
+                               GLuint *outUsedRange);
+
</ins><span class="cx">     template &lt;typename T&gt;
</span><del>-    void setUniform(GLint location, GLsizei count, const T* v, GLenum targetUniformType);
</del><ins>+    void setUniform(GLint location, GLsizei count, const T *v, GLenum targetUniformType);
</ins><span class="cx"> 
</span><span class="cx">     template &lt;int cols, int rows&gt;
</span><del>-    void setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum targetUniformType);
</del><ins>+    void setUniformMatrixfv(GLint location,
+                            GLsizei count,
+                            GLboolean transpose,
+                            const GLfloat *value,
+                            GLenum targetUniformType);
</ins><span class="cx"> 
</span><del>-    template &lt;typename T&gt;
-    void getUniformv(GLint location, T *params, GLenum uniformType);
</del><ins>+    LinkResult compileProgramExecutables(const gl::Data &amp;data, gl::InfoLog &amp;infoLog);
</ins><span class="cx"> 
</span><del>-    template &lt;typename VarT&gt;
-    void defineUniformBlockMembers(const std::vector&lt;VarT&gt; &amp;fields, const std::string &amp;prefix, int blockIndex,
-                                   sh::BlockLayoutEncoder *encoder, std::vector&lt;unsigned int&gt; *blockUniformIndexes,
-                                   bool inRowMajorLayout);
</del><ins>+    void gatherTransformFeedbackVaryings(const VaryingPacking &amp;varyings);
+    D3DUniform *getD3DUniformByName(const std::string &amp;name);
+    D3DUniform *getD3DUniformFromLocation(GLint location);
</ins><span class="cx"> 
</span><ins>+    void initAttribLocationsToD3DSemantic();
+
+    void reset();
+    void assignUniformBlockRegisters();
+
+    void initUniformBlockInfo();
+    size_t getUniformBlockInfo(const sh::InterfaceBlock &amp;interfaceBlock);
+
</ins><span class="cx">     RendererD3D *mRenderer;
</span><span class="cx">     DynamicHLSL *mDynamicHLSL;
</span><span class="cx"> 
</span><span class="cx">     std::vector&lt;VertexExecutable *&gt; mVertexExecutables;
</span><span class="cx">     std::vector&lt;PixelExecutable *&gt; mPixelExecutables;
</span><del>-    ShaderExecutableD3D *mGeometryExecutable;
</del><ins>+    std::vector&lt;ShaderExecutableD3D *&gt; mGeometryExecutables;
</ins><span class="cx"> 
</span><span class="cx">     std::string mVertexHLSL;
</span><span class="cx">     D3DCompilerWorkarounds mVertexWorkarounds;
</span><span class="lines">@@ -211,37 +369,45 @@
</span><span class="cx">     bool mUsesFragDepth;
</span><span class="cx">     std::vector&lt;PixelShaderOutputVariable&gt; mPixelShaderKey;
</span><span class="cx"> 
</span><ins>+    // Common code for all dynamic geometry shaders. Consists mainly of the GS input and output
+    // structures, built from the linked varying info. We store the string itself instead of the
+    // packed varyings for simplicity.
+    std::string mGeometryShaderPreamble;
+
</ins><span class="cx">     bool mUsesPointSize;
</span><ins>+    bool mUsesFlatInterpolation;
</ins><span class="cx"> 
</span><span class="cx">     UniformStorageD3D *mVertexUniformStorage;
</span><span class="cx">     UniformStorageD3D *mFragmentUniformStorage;
</span><span class="cx"> 
</span><del>-    GLenum mTransformFeedbackBufferMode;
-
</del><span class="cx">     std::vector&lt;Sampler&gt; mSamplersPS;
</span><span class="cx">     std::vector&lt;Sampler&gt; mSamplersVS;
</span><span class="cx">     GLuint mUsedVertexSamplerRange;
</span><span class="cx">     GLuint mUsedPixelSamplerRange;
</span><span class="cx">     bool mDirtySamplerMapping;
</span><span class="cx"> 
</span><del>-    // Cache for validateSamplers
-    std::vector&lt;GLenum&gt; mTextureUnitTypesCache;
-
</del><span class="cx">     // Cache for getPixelExecutableForFramebuffer
</span><span class="cx">     std::vector&lt;GLenum&gt; mPixelShaderOutputFormatCache;
</span><span class="cx"> 
</span><del>-    int mShaderVersion;
</del><ins>+    AttribIndexArray mAttribLocationToD3DSemantic;
</ins><span class="cx"> 
</span><del>-    int mAttributesByLayout[gl::MAX_VERTEX_ATTRIBS];
-
</del><span class="cx">     unsigned int mSerial;
</span><span class="cx"> 
</span><del>-    Optional&lt;bool&gt; mCachedValidateSamplersResult;
</del><ins>+    std::vector&lt;GLint&gt; mVertexUBOCache;
+    std::vector&lt;GLint&gt; mFragmentUBOCache;
+    VertexExecutable::Signature mCachedVertexSignature;
+    gl::InputLayout mCachedInputLayout;
</ins><span class="cx"> 
</span><ins>+    std::vector&lt;D3DVarying&gt; mStreamOutVaryings;
+    std::vector&lt;D3DUniform *&gt; mD3DUniforms;
+    std::vector&lt;D3DUniformBlock&gt; mD3DUniformBlocks;
+
+    std::map&lt;std::string, sh::BlockMemberInfo&gt; mBlockInfo;
+    std::map&lt;std::string, size_t&gt; mBlockDataSizes;
+
</ins><span class="cx">     static unsigned int issueSerial();
</span><span class="cx">     static unsigned int mCurrentSerial;
</span><span class="cx"> };
</span><del>-
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-#endif // LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_
</del><ins>+#endif  // LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dRenderTargetD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderTargetD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderTargetD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderTargetD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -33,6 +33,9 @@
</span><span class="cx">     virtual unsigned int getSerial() const;
</span><span class="cx">     static unsigned int issueSerials(unsigned int count);
</span><span class="cx"> 
</span><ins>+    // Only currently applies to D3D11.
+    virtual void signalDirty() {}
+
</ins><span class="cx">   private:
</span><span class="cx">     const unsigned int mSerial;
</span><span class="cx">     static unsigned int mCurrentSerial;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dRenderbufferD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderbufferD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,19 +9,22 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RenderbufferD3D.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/Image.h&quot;
+#include &quot;libANGLE/renderer/d3d/EGLImageD3D.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RenderTargetD3D.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><del>-RenderbufferD3D::RenderbufferD3D(RendererD3D *renderer) : mRenderer(renderer)
</del><ins>+RenderbufferD3D::RenderbufferD3D(RendererD3D *renderer)
+    : mRenderer(renderer), mRenderTarget(nullptr), mImage(nullptr)
</ins><span class="cx"> {
</span><del>-    mRenderTarget = NULL;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RenderbufferD3D::~RenderbufferD3D()
</span><span class="cx"> {
</span><span class="cx">     SafeDelete(mRenderTarget);
</span><ins>+    mImage = nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error RenderbufferD3D::setStorage(GLenum internalformat, size_t width, size_t height)
</span><span class="lines">@@ -53,33 +56,46 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     RenderTargetD3D *newRT = NULL;
</span><del>-    gl::Error error = mRenderer-&gt;createRenderTarget(width, height, creationFormat, samples, &amp;newRT);
</del><ins>+    gl::Error error =
+        mRenderer-&gt;createRenderTarget(static_cast&lt;int&gt;(width), static_cast&lt;int&gt;(height),
+                                      creationFormat, static_cast&lt;GLsizei&gt;(samples), &amp;newRT);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     SafeDelete(mRenderTarget);
</span><ins>+    mImage        = nullptr;
</ins><span class="cx">     mRenderTarget = newRT;
</span><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RenderTargetD3D *RenderbufferD3D::getRenderTarget()
</del><ins>+gl::Error RenderbufferD3D::setStorageEGLImageTarget(egl::Image *image)
</ins><span class="cx"> {
</span><del>-    return mRenderTarget;
</del><ins>+    mImage = GetImplAs&lt;EGLImageD3D&gt;(image);
+    SafeDelete(mRenderTarget);
+
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int RenderbufferD3D::getRenderTargetSerial() const
</del><ins>+gl::Error RenderbufferD3D::getRenderTarget(RenderTargetD3D **outRenderTarget)
</ins><span class="cx"> {
</span><del>-    return (mRenderTarget ? mRenderTarget-&gt;getSerial() : 0);
</del><ins>+    if (mImage)
+    {
+        return mImage-&gt;getRenderTarget(outRenderTarget);
+    }
+    else
+    {
+        *outRenderTarget = mRenderTarget;
+        return gl::Error(GL_NO_ERROR);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error RenderbufferD3D::getAttachmentRenderTarget(const gl::FramebufferAttachment::Target &amp;target,
</span><span class="cx">                                                      FramebufferAttachmentRenderTarget **rtOut)
</span><span class="cx"> {
</span><del>-    *rtOut = mRenderTarget;
-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return getRenderTarget(reinterpret_cast&lt;RenderTargetD3D **&gt;(rtOut));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dRenderbufferD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderbufferD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderbufferD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RenderbufferD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,6 +16,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+class EGLImageD3D;
</ins><span class="cx"> class RendererD3D;
</span><span class="cx"> class RenderTargetD3D;
</span><span class="cx"> class SwapChainD3D;
</span><span class="lines">@@ -26,19 +27,23 @@
</span><span class="cx">     RenderbufferD3D(RendererD3D *renderer);
</span><span class="cx">     virtual ~RenderbufferD3D();
</span><span class="cx"> 
</span><del>-    virtual gl::Error setStorage(GLenum internalformat, size_t width, size_t height) override;
-    virtual gl::Error setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height) override;
</del><ins>+    gl::Error setStorage(GLenum internalformat, size_t width, size_t height) override;
+    gl::Error setStorageMultisample(size_t samples,
+                                    GLenum internalformat,
+                                    size_t width,
+                                    size_t height) override;
+    gl::Error setStorageEGLImageTarget(egl::Image *image) override;
</ins><span class="cx"> 
</span><del>-    RenderTargetD3D *getRenderTarget();
-    unsigned int getRenderTargetSerial() const;
-
</del><ins>+    gl::Error getRenderTarget(RenderTargetD3D **outRenderTarget);
</ins><span class="cx">     gl::Error getAttachmentRenderTarget(const gl::FramebufferAttachment::Target &amp;target,
</span><span class="cx">                                         FramebufferAttachmentRenderTarget **rtOut) override;
</span><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     RendererD3D *mRenderer;
</span><span class="cx">     RenderTargetD3D *mRenderTarget;
</span><ins>+    EGLImageD3D *mImage;
</ins><span class="cx"> };
</span><ins>+
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_RENDERBUFFERD3D_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dRendererD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RendererD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RendererD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RendererD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,18 +8,22 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/debug.h&quot;
</ins><span class="cx"> #include &quot;common/MemoryBuffer.h&quot;
</span><span class="cx"> #include &quot;common/utilities.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Display.h&quot;
</span><ins>+#include &quot;libANGLE/formatutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><del>-#include &quot;libANGLE/ResourceManager.h&quot;
-#include &quot;libANGLE/State.h&quot;
-#include &quot;libANGLE/VertexArray.h&quot;
-#include &quot;libANGLE/formatutils.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/BufferD3D.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/DeviceD3D.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/DisplayD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/IndexDataManager.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/SamplerD3D.h&quot;
+#include &quot;libANGLE/ResourceManager.h&quot;
+#include &quot;libANGLE/State.h&quot;
+#include &quot;libANGLE/VertexArray.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -30,12 +34,17 @@
</span><span class="cx"> // release and recreate the scratch buffer. This ensures we don't have a
</span><span class="cx"> // degenerate case where we are stuck hogging memory.
</span><span class="cx"> const int ScratchMemoryBufferLifetime = 1000;
</span><del>-}
</del><span class="cx"> 
</span><ins>+}  // anonymous namespace
+
</ins><span class="cx"> RendererD3D::RendererD3D(egl::Display *display)
</span><span class="cx">     : mDisplay(display),
</span><span class="cx">       mDeviceLost(false),
</span><del>-      mScratchMemoryBufferResetCounter(0)
</del><ins>+      mAnnotator(nullptr),
+      mPresentPathFastEnabled(false),
+      mScratchMemoryBufferResetCounter(0),
+      mWorkaroundsInitialized(false),
+      mDisjoint(false)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -49,260 +58,190 @@
</span><span class="cx">     mScratchMemoryBuffer.resize(0);
</span><span class="cx">     for (auto &amp;incompleteTexture : mIncompleteTextures)
</span><span class="cx">     {
</span><del>-        incompleteTexture.second.set(NULL);
</del><ins>+        incompleteTexture.second.set(nullptr);
</ins><span class="cx">     }
</span><span class="cx">     mIncompleteTextures.clear();
</span><ins>+
+    if (mAnnotator != nullptr)
+    {
+        gl::UninitializeDebugAnnotations();
+        SafeDelete(mAnnotator);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+SamplerImpl *RendererD3D::createSampler()
+{
+    return new SamplerD3D();
+}
+
+gl::Error RendererD3D::drawArrays(const gl::Data &amp;data, GLenum mode, GLint first, GLsizei count)
+{
+    return genericDrawArrays(data, mode, first, count, 0);
+}
+
+gl::Error RendererD3D::drawArraysInstanced(const gl::Data &amp;data,
+                                           GLenum mode,
+                                           GLint first,
+                                           GLsizei count,
+                                           GLsizei instanceCount)
+{
+    return genericDrawArrays(data, mode, first, count, instanceCount);
+}
+
</ins><span class="cx"> gl::Error RendererD3D::drawElements(const gl::Data &amp;data,
</span><del>-                                    GLenum mode, GLsizei count, GLenum type,
-                                    const GLvoid *indices, GLsizei instances,
-                                    const RangeUI &amp;indexRange)
</del><ins>+                                    GLenum mode,
+                                    GLsizei count,
+                                    GLenum type,
+                                    const GLvoid *indices,
+                                    const gl::IndexRange &amp;indexRange)
</ins><span class="cx"> {
</span><del>-    if (data.state-&gt;isPrimitiveRestartEnabled())
-    {
-        UNIMPLEMENTED();
-        return gl::Error(GL_INVALID_OPERATION, &quot;Primitive restart not implemented&quot;);
-    }
</del><ins>+    return genericDrawElements(data, mode, count, type, indices, 0, indexRange);
+}
</ins><span class="cx"> 
</span><del>-    gl::Program *program = data.state-&gt;getProgram();
-    ASSERT(program != NULL);
</del><ins>+gl::Error RendererD3D::drawElementsInstanced(const gl::Data &amp;data,
+                                             GLenum mode,
+                                             GLsizei count,
+                                             GLenum type,
+                                             const GLvoid *indices,
+                                             GLsizei instances,
+                                             const gl::IndexRange &amp;indexRange)
+{
+    return genericDrawElements(data, mode, count, type, indices, instances, indexRange);
+}
</ins><span class="cx"> 
</span><del>-    program-&gt;updateSamplerMapping();
</del><ins>+gl::Error RendererD3D::drawRangeElements(const gl::Data &amp;data,
+                                         GLenum mode,
+                                         GLuint start,
+                                         GLuint end,
+                                         GLsizei count,
+                                         GLenum type,
+                                         const GLvoid *indices,
+                                         const gl::IndexRange &amp;indexRange)
+{
+    return genericDrawElements(data, mode, count, type, indices, 0, indexRange);
+}
</ins><span class="cx"> 
</span><del>-    gl::Error error = generateSwizzles(data);
-    if (error.isError())
-    {
-        return error;
-    }
</del><ins>+gl::Error RendererD3D::genericDrawElements(const gl::Data &amp;data,
+                                           GLenum mode,
+                                           GLsizei count,
+                                           GLenum type,
+                                           const GLvoid *indices,
+                                           GLsizei instances,
+                                           const gl::IndexRange &amp;indexRange)
+{
+    gl::Program *program = data.state-&gt;getProgram();
+    ASSERT(program != nullptr);
+    ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(program);
+    bool usesPointSize     = programD3D-&gt;usesPointSize();
</ins><span class="cx"> 
</span><del>-    if (!applyPrimitiveType(mode, count, program-&gt;usesPointSize()))
-    {
-        return gl::Error(GL_NO_ERROR);
-    }
</del><ins>+    programD3D-&gt;updateSamplerMapping();
</ins><span class="cx"> 
</span><del>-    error = applyRenderTarget(data, mode, false);
-    if (error.isError())
-    {
-        return error;
-    }
</del><ins>+    ANGLE_TRY(generateSwizzles(data));
</ins><span class="cx"> 
</span><del>-    error = applyState(data, mode);
-    if (error.isError())
</del><ins>+    if (!applyPrimitiveType(mode, count, usesPointSize))
</ins><span class="cx">     {
</span><del>-        return error;
</del><ins>+        return gl::NoError();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::VertexArray *vao = data.state-&gt;getVertexArray();
</del><ins>+    ANGLE_TRY(updateState(data, mode));
+
</ins><span class="cx">     TranslatedIndexData indexInfo;
</span><span class="cx">     indexInfo.indexRange = indexRange;
</span><del>-    error = applyIndexBuffer(indices, vao-&gt;getElementArrayBuffer(), count, mode, type, &amp;indexInfo);
-    if (error.isError())
-    {
-        return error;
-    }
</del><span class="cx"> 
</span><ins>+    ANGLE_TRY(applyIndexBuffer(data, indices, count, mode, type, &amp;indexInfo));
+
</ins><span class="cx">     applyTransformFeedbackBuffers(*data.state);
</span><span class="cx">     // Transform feedback is not allowed for DrawElements, this error should have been caught at the API validation
</span><span class="cx">     // layer.
</span><span class="cx">     ASSERT(!data.state-&gt;isTransformFeedbackActiveUnpaused());
</span><span class="cx"> 
</span><del>-    GLsizei vertexCount = indexInfo.indexRange.length() + 1;
-    error = applyVertexBuffer(*data.state, mode, indexInfo.indexRange.start, vertexCount, instances);
-    if (error.isError())
-    {
-        return error;
-    }
</del><ins>+    size_t vertexCount = indexInfo.indexRange.vertexCount();
+    ANGLE_TRY(applyVertexBuffer(*data.state, mode, static_cast&lt;GLsizei&gt;(indexInfo.indexRange.start),
+                                static_cast&lt;GLsizei&gt;(vertexCount), instances, &amp;indexInfo));
+    ANGLE_TRY(applyTextures(data));
+    ANGLE_TRY(applyShaders(data, mode));
+    ANGLE_TRY(programD3D-&gt;applyUniformBuffers(data));
</ins><span class="cx"> 
</span><del>-    error = applyShaders(data);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    error = applyTextures(data);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    error = program-&gt;applyUniformBuffers(data);
-    if (error.isError())
-    {
-        return error;
-    }
-
</del><span class="cx">     if (!skipDraw(data, mode))
</span><span class="cx">     {
</span><del>-        error = drawElements(mode, count, type, indices, vao-&gt;getElementArrayBuffer(), indexInfo, instances);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+        ANGLE_TRY(drawElementsImpl(data, indexInfo, mode, count, type, indices, instances));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error RendererD3D::drawArrays(const gl::Data &amp;data,
-                                  GLenum mode, GLint first,
-                                  GLsizei count, GLsizei instances)
</del><ins>+gl::Error RendererD3D::genericDrawArrays(const gl::Data &amp;data,
+                                         GLenum mode,
+                                         GLint first,
+                                         GLsizei count,
+                                         GLsizei instances)
</ins><span class="cx"> {
</span><span class="cx">     gl::Program *program = data.state-&gt;getProgram();
</span><del>-    ASSERT(program != NULL);
</del><ins>+    ASSERT(program != nullptr);
+    ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(program);
+    bool usesPointSize     = programD3D-&gt;usesPointSize();
</ins><span class="cx"> 
</span><del>-    program-&gt;updateSamplerMapping();
</del><ins>+    programD3D-&gt;updateSamplerMapping();
</ins><span class="cx"> 
</span><del>-    gl::Error error = generateSwizzles(data);
-    if (error.isError())
</del><ins>+    ANGLE_TRY(generateSwizzles(data));
+    if (!applyPrimitiveType(mode, count, usesPointSize))
</ins><span class="cx">     {
</span><del>-        return error;
</del><ins>+        return gl::NoError();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!applyPrimitiveType(mode, count, program-&gt;usesPointSize()))
-    {
-        return gl::Error(GL_NO_ERROR);
-    }
</del><ins>+    ANGLE_TRY(updateState(data, mode));
+    ANGLE_TRY(applyTransformFeedbackBuffers(*data.state));
+    ANGLE_TRY(applyVertexBuffer(*data.state, mode, first, count, instances, nullptr));
+    ANGLE_TRY(applyTextures(data));
+    ANGLE_TRY(applyShaders(data, mode));
+    ANGLE_TRY(programD3D-&gt;applyUniformBuffers(data));
</ins><span class="cx"> 
</span><del>-    error = applyRenderTarget(data, mode, false);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    error = applyState(data, mode);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    applyTransformFeedbackBuffers(*data.state);
-
-    error = applyVertexBuffer(*data.state, mode, first, count, instances);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    error = applyShaders(data);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    error = applyTextures(data);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    error = program-&gt;applyUniformBuffers(data);
-    if (error.isError())
-    {
-        return error;
-    }
-
</del><span class="cx">     if (!skipDraw(data, mode))
</span><span class="cx">     {
</span><del>-        error = drawArrays(data, mode, count, instances, program-&gt;usesPointSize());
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+        ANGLE_TRY(drawArraysImpl(data, mode, first, count, instances));
</ins><span class="cx"> 
</span><span class="cx">         if (data.state-&gt;isTransformFeedbackActiveUnpaused())
</span><span class="cx">         {
</span><del>-            markTransformFeedbackUsage(data);
</del><ins>+            ANGLE_TRY(markTransformFeedbackUsage(data));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error RendererD3D::generateSwizzles(const gl::Data &amp;data, gl::SamplerType type)
</span><span class="cx"> {
</span><del>-    gl::Program *program = data.state-&gt;getProgram();
</del><ins>+    ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(data.state-&gt;getProgram());
</ins><span class="cx"> 
</span><del>-    size_t samplerRange = program-&gt;getUsedSamplerRange(type);
</del><ins>+    unsigned int samplerRange = programD3D-&gt;getUsedSamplerRange(type);
</ins><span class="cx"> 
</span><del>-    for (size_t i = 0; i &lt; samplerRange; i++)
</del><ins>+    for (unsigned int i = 0; i &lt; samplerRange; i++)
</ins><span class="cx">     {
</span><del>-        GLenum textureType = program-&gt;getSamplerTextureType(type, i);
-        GLint textureUnit = program-&gt;getSamplerMapping(type, i, *data.caps);
</del><ins>+        GLenum textureType = programD3D-&gt;getSamplerTextureType(type, i);
+        GLint textureUnit = programD3D-&gt;getSamplerMapping(type, i, *data.caps);
</ins><span class="cx">         if (textureUnit != -1)
</span><span class="cx">         {
</span><span class="cx">             gl::Texture *texture = data.state-&gt;getSamplerTexture(textureUnit, textureType);
</span><span class="cx">             ASSERT(texture);
</span><del>-            if (texture-&gt;getSamplerState().swizzleRequired())
</del><ins>+            if (texture-&gt;getTextureState().swizzleRequired())
</ins><span class="cx">             {
</span><del>-                gl::Error error = generateSwizzle(texture);
-                if (error.isError())
-                {
-                    return error;
-                }
</del><ins>+                ANGLE_TRY(generateSwizzle(texture));
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error RendererD3D::generateSwizzles(const gl::Data &amp;data)
</span><span class="cx"> {
</span><del>-    gl::Error error = generateSwizzles(data, gl::SAMPLER_VERTEX);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    error = generateSwizzles(data, gl::SAMPLER_PIXEL);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    return gl::Error(GL_NO_ERROR);
</del><ins>+    ANGLE_TRY(generateSwizzles(data, gl::SAMPLER_VERTEX));
+    ANGLE_TRY(generateSwizzles(data, gl::SAMPLER_PIXEL));
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-// Applies the render target surface, depth stencil surface, viewport rectangle and
-// scissor rectangle to the renderer
-gl::Error RendererD3D::applyRenderTarget(const gl::Data &amp;data, GLenum drawMode, bool ignoreViewport)
</del><ins>+unsigned int RendererD3D::GetBlendSampleMask(const gl::Data &amp;data, int samples)
</ins><span class="cx"> {
</span><del>-    const gl::Framebuffer *framebufferObject = data.state-&gt;getDrawFramebuffer();
-    ASSERT(framebufferObject &amp;&amp; framebufferObject-&gt;checkStatus(data) == GL_FRAMEBUFFER_COMPLETE);
-
-    gl::Error error = applyRenderTarget(framebufferObject);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    float nearZ = data.state-&gt;getNearPlane();
-    float farZ = data.state-&gt;getFarPlane();
-    setViewport(data.state-&gt;getViewport(), nearZ, farZ, drawMode,
-                data.state-&gt;getRasterizerState().frontFace, ignoreViewport);
-
-    setScissorRectangle(data.state-&gt;getScissor(), data.state-&gt;isScissorTestEnabled());
-
-    return gl::Error(GL_NO_ERROR);
-}
-
-// Applies the fixed-function state (culling, depth test, alpha blending, stenciling, etc) to the Direct3D device
-gl::Error RendererD3D::applyState(const gl::Data &amp;data, GLenum drawMode)
-{
-    const gl::Framebuffer *framebufferObject = data.state-&gt;getDrawFramebuffer();
-    int samples = framebufferObject-&gt;getSamples(data);
-
-    gl::RasterizerState rasterizer = data.state-&gt;getRasterizerState();
-    rasterizer.pointDrawMode = (drawMode == GL_POINTS);
-    rasterizer.multiSample = (samples != 0);
-
-    gl::Error error = setRasterizerState(rasterizer);
-    if (error.isError())
-    {
-        return error;
-    }
-
</del><span class="cx">     unsigned int mask = 0;
</span><span class="cx">     if (data.state-&gt;isSampleCoverageEnabled())
</span><span class="cx">     {
</span><span class="lines">@@ -333,147 +272,103 @@
</span><span class="cx">     {
</span><span class="cx">         mask = 0xFFFFFFFF;
</span><span class="cx">     }
</span><del>-    error = setBlendState(framebufferObject, data.state-&gt;getBlendState(), data.state-&gt;getBlendColor(), mask);
-    if (error.isError())
-    {
-        return error;
-    }
</del><span class="cx"> 
</span><del>-    error = setDepthStencilState(data.state-&gt;getDepthStencilState(), data.state-&gt;getStencilRef(),
-                                 data.state-&gt;getStencilBackRef(), rasterizer.frontFace == GL_CCW);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return mask;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Applies the shaders and shader constants to the Direct3D device
</span><del>-gl::Error RendererD3D::applyShaders(const gl::Data &amp;data)
</del><ins>+gl::Error RendererD3D::applyShaders(const gl::Data &amp;data, GLenum drawMode)
</ins><span class="cx"> {
</span><span class="cx">     gl::Program *program = data.state-&gt;getProgram();
</span><ins>+    ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(program);
+    programD3D-&gt;updateCachedInputLayout(*data.state);
</ins><span class="cx"> 
</span><del>-    gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS];
-    gl::VertexFormat::GetInputLayout(inputLayout, program, *data.state);
</del><ins>+    ANGLE_TRY(applyShadersImpl(data, drawMode));
</ins><span class="cx"> 
</span><del>-    const gl::Framebuffer *fbo = data.state-&gt;getDrawFramebuffer();
-
-    gl::Error error = applyShaders(program, inputLayout, fbo, data.state-&gt;getRasterizerState().rasterizerDiscard, data.state-&gt;isTransformFeedbackActiveUnpaused());
-    if (error.isError())
-    {
-        return error;
-    }
-
-    return program-&gt;applyUniforms();
</del><ins>+    return programD3D-&gt;applyUniforms(drawMode);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // For each Direct3D sampler of either the pixel or vertex stage,
</span><span class="cx"> // looks up the corresponding OpenGL texture image unit and texture type,
</span><span class="cx"> // and sets the texture and its addressing/filtering state (or NULL when inactive).
</span><ins>+// Sampler mapping needs to be up-to-date on the program object before this is called.
</ins><span class="cx"> gl::Error RendererD3D::applyTextures(const gl::Data &amp;data, gl::SamplerType shaderType,
</span><del>-                                     const FramebufferTextureSerialArray &amp;framebufferSerials, size_t framebufferSerialCount)
</del><ins>+                                     const FramebufferTextureArray &amp;framebufferTextures, size_t framebufferTextureCount)
</ins><span class="cx"> {
</span><del>-    gl::Program *program = data.state-&gt;getProgram();
</del><ins>+    ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(data.state-&gt;getProgram());
</ins><span class="cx"> 
</span><del>-    size_t samplerRange = program-&gt;getUsedSamplerRange(shaderType);
-    for (size_t samplerIndex = 0; samplerIndex &lt; samplerRange; samplerIndex++)
</del><ins>+    ASSERT(!programD3D-&gt;isSamplerMappingDirty());
+
+    unsigned int samplerRange = programD3D-&gt;getUsedSamplerRange(shaderType);
+    for (unsigned int samplerIndex = 0; samplerIndex &lt; samplerRange; samplerIndex++)
</ins><span class="cx">     {
</span><del>-        GLenum textureType = program-&gt;getSamplerTextureType(shaderType, samplerIndex);
-        GLint textureUnit = program-&gt;getSamplerMapping(shaderType, samplerIndex, *data.caps);
</del><ins>+        GLenum textureType = programD3D-&gt;getSamplerTextureType(shaderType, samplerIndex);
+        GLint textureUnit = programD3D-&gt;getSamplerMapping(shaderType, samplerIndex, *data.caps);
</ins><span class="cx">         if (textureUnit != -1)
</span><span class="cx">         {
</span><span class="cx">             gl::Texture *texture = data.state-&gt;getSamplerTexture(textureUnit, textureType);
</span><span class="cx">             ASSERT(texture);
</span><del>-            gl::SamplerState sampler = texture-&gt;getSamplerState();
</del><span class="cx"> 
</span><span class="cx">             gl::Sampler *samplerObject = data.state-&gt;getSampler(textureUnit);
</span><del>-            if (samplerObject)
-            {
-                samplerObject-&gt;getState(&amp;sampler);
-            }
</del><span class="cx"> 
</span><ins>+            const gl::SamplerState &amp;samplerState =
+                samplerObject ? samplerObject-&gt;getSamplerState() : texture-&gt;getSamplerState();
+
</ins><span class="cx">             // TODO: std::binary_search may become unavailable using older versions of GCC
</span><del>-            if (texture-&gt;isSamplerComplete(sampler, data) &amp;&amp;
-                !std::binary_search(framebufferSerials.begin(), framebufferSerials.begin() + framebufferSerialCount, texture-&gt;getTextureSerial()))
</del><ins>+            if (texture-&gt;isSamplerComplete(samplerState, data) &amp;&amp;
+                !std::binary_search(framebufferTextures.begin(),
+                                    framebufferTextures.begin() + framebufferTextureCount, texture))
</ins><span class="cx">             {
</span><del>-                gl::Error error = setSamplerState(shaderType, samplerIndex, texture, sampler);
-                if (error.isError())
-                {
-                    return error;
-                }
-
-                error = setTexture(shaderType, samplerIndex, texture);
-                if (error.isError())
-                {
-                    return error;
-                }
</del><ins>+                ANGLE_TRY(setSamplerState(shaderType, samplerIndex, texture, samplerState));
+                ANGLE_TRY(setTexture(shaderType, samplerIndex, texture));
</ins><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><span class="cx">                 // Texture is not sampler complete or it is in use by the framebuffer.  Bind the incomplete texture.
</span><span class="cx">                 gl::Texture *incompleteTexture = getIncompleteTexture(textureType);
</span><del>-                gl::Error error = setTexture(shaderType, samplerIndex, incompleteTexture);
-                if (error.isError())
-                {
-                    return error;
-                }
</del><ins>+
+                ANGLE_TRY(setSamplerState(shaderType, samplerIndex, incompleteTexture,
+                                          incompleteTexture-&gt;getSamplerState()));
+                ANGLE_TRY(setTexture(shaderType, samplerIndex, incompleteTexture));
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="cx">             // No texture bound to this slot even though it is used by the shader, bind a NULL texture
</span><del>-            gl::Error error = setTexture(shaderType, samplerIndex, NULL);
-            if (error.isError())
-            {
-                return error;
-            }
</del><ins>+            ANGLE_TRY(setTexture(shaderType, samplerIndex, nullptr));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Set all the remaining textures to NULL
</span><span class="cx">     size_t samplerCount = (shaderType == gl::SAMPLER_PIXEL) ? data.caps-&gt;maxTextureImageUnits
</span><span class="cx">                                                             : data.caps-&gt;maxVertexTextureImageUnits;
</span><del>-    for (size_t samplerIndex = samplerRange; samplerIndex &lt; samplerCount; samplerIndex++)
-    {
-        gl::Error error = setTexture(shaderType, samplerIndex, NULL);
-        if (error.isError())
-        {
-            return error;
-        }
-    }
</del><ins>+    clearTextures(shaderType, samplerRange, samplerCount);
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error RendererD3D::applyTextures(const gl::Data &amp;data)
</span><span class="cx"> {
</span><del>-    FramebufferTextureSerialArray framebufferSerials;
-    size_t framebufferSerialCount = getBoundFramebufferTextureSerials(data, &amp;framebufferSerials);
</del><ins>+    FramebufferTextureArray framebufferTextures;
+    size_t framebufferSerialCount = getBoundFramebufferTextures(data, &amp;framebufferTextures);
</ins><span class="cx"> 
</span><del>-    gl::Error error = applyTextures(data, gl::SAMPLER_VERTEX, framebufferSerials, framebufferSerialCount);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    error = applyTextures(data, gl::SAMPLER_PIXEL, framebufferSerials, framebufferSerialCount);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    return gl::Error(GL_NO_ERROR);
</del><ins>+    ANGLE_TRY(applyTextures(data, gl::SAMPLER_VERTEX, framebufferTextures, framebufferSerialCount));
+    ANGLE_TRY(applyTextures(data, gl::SAMPLER_PIXEL, framebufferTextures, framebufferSerialCount));
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool RendererD3D::skipDraw(const gl::Data &amp;data, GLenum drawMode)
</span><span class="cx"> {
</span><ins>+    const gl::State &amp;state = *data.state;
+
</ins><span class="cx">     if (drawMode == GL_POINTS)
</span><span class="cx">     {
</span><ins>+        bool usesPointSize = GetImplAs&lt;ProgramD3D&gt;(state.getProgram())-&gt;usesPointSize();
+
</ins><span class="cx">         // ProgramBinary assumes non-point rendering if gl_PointSize isn't written,
</span><span class="cx">         // which affects varying interpolation. Since the value of gl_PointSize is
</span><span class="cx">         // undefined when not written, just skip drawing to avoid unexpected results.
</span><del>-        if (!data.state-&gt;getProgram()-&gt;usesPointSize() &amp;&amp; !data.state-&gt;isTransformFeedbackActiveUnpaused())
</del><ins>+        if (!usesPointSize &amp;&amp; !state.isTransformFeedbackActiveUnpaused())
</ins><span class="cx">         {
</span><span class="cx">             // This is stictly speaking not an error, but developers should be
</span><span class="cx">             // notified of risking undefined behavior.
</span><span class="lines">@@ -484,7 +379,8 @@
</span><span class="cx">     }
</span><span class="cx">     else if (gl::IsTriangleMode(drawMode))
</span><span class="cx">     {
</span><del>-        if (data.state-&gt;getRasterizerState().cullFace &amp;&amp; data.state-&gt;getRasterizerState().cullMode == GL_FRONT_AND_BACK)
</del><ins>+        if (state.getRasterizerState().cullFace &amp;&amp;
+            state.getRasterizerState().cullMode == GL_FRONT_AND_BACK)
</ins><span class="cx">         {
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="lines">@@ -493,7 +389,7 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RendererD3D::markTransformFeedbackUsage(const gl::Data &amp;data)
</del><ins>+gl::Error RendererD3D::markTransformFeedbackUsage(const gl::Data &amp;data)
</ins><span class="cx"> {
</span><span class="cx">     const gl::TransformFeedback *transformFeedback = data.state-&gt;getCurrentTransformFeedback();
</span><span class="cx">     for (size_t i = 0; i &lt; transformFeedback-&gt;getIndexedBufferCount(); i++)
</span><span class="lines">@@ -502,37 +398,36 @@
</span><span class="cx">         if (binding.get() != nullptr)
</span><span class="cx">         {
</span><span class="cx">             BufferD3D *bufferD3D = GetImplAs&lt;BufferD3D&gt;(binding.get());
</span><del>-            bufferD3D-&gt;markTransformFeedbackUsage();
</del><ins>+            ANGLE_TRY(bufferD3D-&gt;markTransformFeedbackUsage());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-size_t RendererD3D::getBoundFramebufferTextureSerials(const gl::Data &amp;data,
-                                                      FramebufferTextureSerialArray *outSerialArray)
</del><ins>+size_t RendererD3D::getBoundFramebufferTextures(const gl::Data &amp;data, FramebufferTextureArray *outTextureArray)
</ins><span class="cx"> {
</span><del>-    size_t serialCount = 0;
</del><ins>+    size_t textureCount = 0;
</ins><span class="cx"> 
</span><span class="cx">     const gl::Framebuffer *drawFramebuffer = data.state-&gt;getDrawFramebuffer();
</span><del>-    for (unsigned int i = 0; i &lt; data.caps-&gt;maxColorAttachments; i++)
</del><ins>+    for (size_t i = 0; i &lt; drawFramebuffer-&gt;getNumColorBuffers(); i++)
</ins><span class="cx">     {
</span><span class="cx">         const gl::FramebufferAttachment *attachment = drawFramebuffer-&gt;getColorbuffer(i);
</span><span class="cx">         if (attachment &amp;&amp; attachment-&gt;type() == GL_TEXTURE)
</span><span class="cx">         {
</span><del>-            gl::Texture *texture = attachment-&gt;getTexture();
-            (*outSerialArray)[serialCount++] = texture-&gt;getTextureSerial();
</del><ins>+            (*outTextureArray)[textureCount++] = attachment-&gt;getTexture();
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     const gl::FramebufferAttachment *depthStencilAttachment = drawFramebuffer-&gt;getDepthOrStencilbuffer();
</span><span class="cx">     if (depthStencilAttachment &amp;&amp; depthStencilAttachment-&gt;type() == GL_TEXTURE)
</span><span class="cx">     {
</span><del>-        gl::Texture *depthStencilTexture = depthStencilAttachment-&gt;getTexture();
-        (*outSerialArray)[serialCount++] = depthStencilTexture-&gt;getTextureSerial();
</del><ins>+        (*outTextureArray)[textureCount++] = depthStencilAttachment-&gt;getTexture();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    std::sort(outSerialArray-&gt;begin(), outSerialArray-&gt;begin() + serialCount);
</del><ins>+    std::sort(outTextureArray-&gt;begin(), outTextureArray-&gt;begin() + textureCount);
</ins><span class="cx"> 
</span><del>-    return serialCount;
</del><ins>+    return textureCount;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Texture *RendererD3D::getIncompleteTexture(GLenum type)
</span><span class="lines">@@ -541,20 +436,26 @@
</span><span class="cx">     {
</span><span class="cx">         const GLubyte color[] = { 0, 0, 0, 255 };
</span><span class="cx">         const gl::Extents colorSize(1, 1, 1);
</span><del>-        const gl::PixelUnpackState incompleteUnpackState(1, 0);
</del><ins>+        const gl::PixelUnpackState unpack(1, 0);
+        const gl::Box area(0, 0, 0, 1, 1, 1);
</ins><span class="cx"> 
</span><del>-        gl::Texture* t = new gl::Texture(createTexture(type), gl::Texture::INCOMPLETE_TEXTURE_ID, type);
</del><ins>+        // Skip the API layer to avoid needing to pass the Context and mess with dirty bits.
+        gl::Texture *t =
+            new gl::Texture(createTexture(type), std::numeric_limits&lt;GLuint&gt;::max(), type);
+        t-&gt;setStorage(type, 1, GL_RGBA8, colorSize);
</ins><span class="cx"> 
</span><span class="cx">         if (type == GL_TEXTURE_CUBE_MAP)
</span><span class="cx">         {
</span><span class="cx">             for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face &lt;= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
</span><span class="cx">             {
</span><del>-                t-&gt;setImage(face, 0, GL_RGBA, colorSize, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
</del><ins>+                t-&gt;getImplementation()-&gt;setSubImage(face, 0, area, GL_RGBA8, GL_UNSIGNED_BYTE,
+                                                    unpack, color);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            t-&gt;setImage(type, 0, GL_RGBA, colorSize, GL_RGBA, GL_UNSIGNED_BYTE, incompleteUnpackState, color);
</del><ins>+            t-&gt;getImplementation()-&gt;setSubImage(type, 0, area, GL_RGBA8, GL_UNSIGNED_BYTE, unpack,
+                                                color);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         mIncompleteTextures[type].set(t);
</span><span class="lines">@@ -618,4 +519,68 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RendererD3D::insertEventMarker(GLsizei length, const char *marker)
+{
+    std::vector&lt;wchar_t&gt; wcstring (length + 1);
+    size_t convertedChars = 0;
+    errno_t err = mbstowcs_s(&amp;convertedChars, wcstring.data(), length + 1, marker, _TRUNCATE);
+    if (err == 0)
+    {
+        getAnnotator()-&gt;setMarker(wcstring.data());
+    }
</ins><span class="cx"> }
</span><ins>+
+void RendererD3D::pushGroupMarker(GLsizei length, const char *marker)
+{
+    std::vector&lt;wchar_t&gt; wcstring(length + 1);
+    size_t convertedChars = 0;
+    errno_t err = mbstowcs_s(&amp;convertedChars, wcstring.data(), length + 1, marker, _TRUNCATE);
+    if (err == 0)
+    {
+        getAnnotator()-&gt;beginEvent(wcstring.data());
+    }
+}
+
+void RendererD3D::popGroupMarker()
+{
+    getAnnotator()-&gt;endEvent();
+}
+
+void RendererD3D::setGPUDisjoint()
+{
+    mDisjoint = true;
+}
+
+GLint RendererD3D::getGPUDisjoint()
+{
+    bool disjoint = mDisjoint;
+
+    // Disjoint flag is cleared when read
+    mDisjoint = false;
+
+    return disjoint;
+}
+
+GLint64 RendererD3D::getTimestamp()
+{
+    // D3D has no way to get an actual timestamp reliably so 0 is returned
+    return 0;
+}
+
+void RendererD3D::onMakeCurrent(const gl::Data &amp;data)
+{
+}
+
+void RendererD3D::initializeDebugAnnotator()
+{
+    createAnnotator();
+    ASSERT(mAnnotator);
+    gl::InitializeDebugAnnotations(mAnnotator);
+}
+
+gl::DebugAnnotator *RendererD3D::getAnnotator()
+{
+    ASSERT(mAnnotator);
+    return mAnnotator;
+}
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dRendererD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RendererD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RendererD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/RendererD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,10 +9,15 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_RENDERERD3D_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_RENDERERD3D_H_
</span><span class="cx"> 
</span><ins>+#include &quot;common/debug.h&quot;
</ins><span class="cx"> #include &quot;common/MemoryBuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Data.h&quot;
</span><ins>+#include &quot;libANGLE/Device.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/Renderer.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/VertexDataManager.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/formatutilsD3D.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/WorkaroundsD3D.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/NativeWindow.h&quot;
</span><span class="cx"> 
</span><span class="cx"> //FIXME(jmadill): std::array is currently prohibited by Chromium style guide
</span><span class="lines">@@ -25,15 +30,21 @@
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><ins>+class DebugAnnotator;
</ins><span class="cx"> class InfoLog;
</span><ins>+class Texture;
</ins><span class="cx"> struct LinkedVarying;
</span><del>-class Texture;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+struct D3DUniform;
+struct D3DVarying;
+class DeviceD3D;
+class EGLImageD3D;
</ins><span class="cx"> class ImageD3D;
</span><span class="cx"> class IndexBuffer;
</span><ins>+class ProgramD3D;
</ins><span class="cx"> class RenderTargetD3D;
</span><span class="cx"> class ShaderExecutableD3D;
</span><span class="cx"> class SwapChainD3D;
</span><span class="lines">@@ -45,9 +56,19 @@
</span><span class="cx"> {
</span><span class="cx">     SHADER_VERTEX,
</span><span class="cx">     SHADER_PIXEL,
</span><del>-    SHADER_GEOMETRY
</del><ins>+    SHADER_GEOMETRY,
+    SHADER_TYPE_MAX
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+struct DeviceIdentifier
+{
+    UINT VendorId;
+    UINT DeviceId;
+    UINT SubSysId;
+    UINT Revision;
+    UINT FeatureLevel;
+};
+
</ins><span class="cx"> enum RendererClass
</span><span class="cx"> {
</span><span class="cx">     RENDERER_D3D11,
</span><span class="lines">@@ -65,10 +86,16 @@
</span><span class="cx">     virtual IndexBuffer *createIndexBuffer() = 0;
</span><span class="cx"> 
</span><span class="cx">     // TODO(jmadill): add VertexFormatCaps
</span><del>-    virtual VertexConversionType getVertexConversionType(const gl::VertexFormat &amp;vertexFormat) const = 0;
-    virtual GLenum getVertexComponentType(const gl::VertexFormat &amp;vertexFormat) const = 0;
</del><ins>+    virtual VertexConversionType getVertexConversionType(gl::VertexFormatType vertexFormatType) const = 0;
+    virtual GLenum getVertexComponentType(gl::VertexFormatType vertexFormatType) const = 0;
+    virtual gl::ErrorOrResult&lt;unsigned int&gt; getVertexSpaceRequired(
+        const gl::VertexAttribute &amp;attrib,
+        GLsizei count,
+        GLsizei instances) const = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+using AttribIndexArray = std::array&lt;int, gl::MAX_VERTEX_ATTRIBS&gt;;
+
</ins><span class="cx"> class RendererD3D : public Renderer, public BufferFactoryD3D
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="lines">@@ -78,66 +105,92 @@
</span><span class="cx">     virtual egl::Error initialize() = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual egl::ConfigSet generateConfigs() const = 0;
</span><ins>+    virtual void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const = 0;
</ins><span class="cx"> 
</span><del>-    gl::Error drawArrays(const gl::Data &amp;data,
-                         GLenum mode, GLint first,
-                         GLsizei count, GLsizei instances) override;
</del><ins>+    gl::Error drawArrays(const gl::Data &amp;data, GLenum mode, GLint first, GLsizei count) override;
+    gl::Error drawArraysInstanced(const gl::Data &amp;data,
+                                  GLenum mode,
+                                  GLint first,
+                                  GLsizei count,
+                                  GLsizei instanceCount) override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error drawElements(const gl::Data &amp;data,
</span><del>-                           GLenum mode, GLsizei count, GLenum type,
-                           const GLvoid *indices, GLsizei instances,
-                           const RangeUI &amp;indexRange) override;
</del><ins>+                           GLenum mode,
+                           GLsizei count,
+                           GLenum type,
+                           const GLvoid *indices,
+                           const gl::IndexRange &amp;indexRange) override;
+    gl::Error drawElementsInstanced(const gl::Data &amp;data,
+                                    GLenum mode,
+                                    GLsizei count,
+                                    GLenum type,
+                                    const GLvoid *indices,
+                                    GLsizei instances,
+                                    const gl::IndexRange &amp;indexRange) override;
+    gl::Error drawRangeElements(const gl::Data &amp;data,
+                                GLenum mode,
+                                GLuint start,
+                                GLuint end,
+                                GLsizei count,
+                                GLenum type,
+                                const GLvoid *indices,
+                                const gl::IndexRange &amp;indexRange) override;
</ins><span class="cx"> 
</span><span class="cx">     bool isDeviceLost() const override;
</span><span class="cx">     std::string getVendorString() const override;
</span><span class="cx"> 
</span><ins>+    SamplerImpl *createSampler() override;
+
</ins><span class="cx">     virtual int getMinorShaderModel() const = 0;
</span><span class="cx">     virtual std::string getShaderModelSuffix() const = 0;
</span><span class="cx"> 
</span><span class="cx">     // Direct3D Specific methods
</span><del>-    virtual GUID getAdapterIdentifier() const = 0;
</del><ins>+    virtual DeviceIdentifier getAdapterIdentifier() const = 0;
</ins><span class="cx"> 
</span><del>-    virtual bool shouldCreateChildWindowForSurface(EGLNativeWindowType window) const = 0;
-    virtual SwapChainD3D *createSwapChain(NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat) = 0;
</del><ins>+    virtual SwapChainD3D *createSwapChain(NativeWindow nativeWindow,
+                                          HANDLE shareHandle,
+                                          GLenum backBufferFormat,
+                                          GLenum depthBufferFormat,
+                                          EGLint orientation) = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual gl::Error generateSwizzle(gl::Texture *texture) = 0;
</span><span class="cx">     virtual gl::Error setSamplerState(gl::SamplerType type, int index, gl::Texture *texture, const gl::SamplerState &amp;sampler) = 0;
</span><span class="cx">     virtual gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error setUniformBuffers(const gl::Data &amp;data,
</span><del>-                                        const GLint vertexUniformBuffers[],
-                                        const GLint fragmentUniformBuffers[]) = 0;
</del><ins>+                                        const std::vector&lt;GLint&gt; &amp;vertexUniformBuffers,
+                                        const std::vector&lt;GLint&gt; &amp;fragmentUniformBuffers) = 0;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error setRasterizerState(const gl::RasterizerState &amp;rasterState) = 0;
-    virtual gl::Error setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &amp;blendState, const gl::ColorF &amp;blendColor,
-                                    unsigned int sampleMask) = 0;
-    virtual gl::Error setDepthStencilState(const gl::DepthStencilState &amp;depthStencilState, int stencilRef,
-                                           int stencilBackRef, bool frontFaceCCW) = 0;
</del><ins>+    virtual gl::Error updateState(const gl::Data &amp;data, GLenum drawMode) = 0;
</ins><span class="cx"> 
</span><del>-    virtual void setScissorRectangle(const gl::Rectangle &amp;scissor, bool enabled) = 0;
-    virtual void setViewport(const gl::Rectangle &amp;viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace,
-                             bool ignoreViewport) = 0;
-
</del><span class="cx">     virtual gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) = 0;
</span><del>-    virtual gl::Error applyShaders(gl::Program *program, const gl::VertexFormat inputLayout[], const gl::Framebuffer *framebuffer,
-                                   bool rasterizerDiscard, bool transformFeedbackActive) = 0;
-    virtual gl::Error applyUniforms(const ProgramImpl &amp;program, const std::vector&lt;gl::LinkedUniform*&gt; &amp;uniformArray) = 0;
</del><ins>+    virtual gl::Error applyUniforms(const ProgramD3D &amp;programD3D,
+                                    GLenum drawMode,
+                                    const std::vector&lt;D3DUniform *&gt; &amp;uniformArray) = 0;
</ins><span class="cx">     virtual bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount, bool usesPointSize) = 0;
</span><del>-    virtual gl::Error applyVertexBuffer(const gl::State &amp;state, GLenum mode, GLint first, GLsizei count, GLsizei instances) = 0;
-    virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) = 0;
-    virtual void applyTransformFeedbackBuffers(const gl::State&amp; state) = 0;
</del><ins>+    virtual gl::Error applyVertexBuffer(const gl::State &amp;state,
+                                        GLenum mode,
+                                        GLint first,
+                                        GLsizei count,
+                                        GLsizei instances,
+                                        TranslatedIndexData *indexInfo) = 0;
+    virtual gl::Error applyIndexBuffer(const gl::Data &amp;data,
+                                       const GLvoid *indices,
+                                       GLsizei count,
+                                       GLenum mode,
+                                       GLenum type,
+                                       TranslatedIndexData *indexInfo) = 0;
+    virtual gl::Error applyTransformFeedbackBuffers(const gl::State &amp;state) = 0;
</ins><span class="cx"> 
</span><del>-    virtual void markAllStateDirty() = 0;
-
</del><span class="cx">     virtual unsigned int getReservedVertexUniformVectors() const = 0;
</span><span class="cx">     virtual unsigned int getReservedFragmentUniformVectors() const = 0;
</span><span class="cx">     virtual unsigned int getReservedVertexUniformBuffers() const = 0;
</span><span class="cx">     virtual unsigned int getReservedFragmentUniformBuffers() const = 0;
</span><del>-    virtual bool getShareHandleSupport() const = 0;
-    virtual bool getPostSubBufferSupport() const = 0;
</del><span class="cx"> 
</span><span class="cx">     virtual int getMajorShaderModel() const = 0;
</span><span class="cx"> 
</span><ins>+    const WorkaroundsD3D &amp;getWorkarounds() const;
+
</ins><span class="cx">     // Pixel operations
</span><span class="cx">     virtual gl::Error copyImage2D(const gl::Framebuffer *framebuffer, const gl::Rectangle &amp;sourceRect, GLenum destFormat,
</span><span class="cx">                                  const gl::Offset &amp;destOffset, TextureStorage *storage, GLint level) = 0;
</span><span class="lines">@@ -150,22 +203,31 @@
</span><span class="cx"> 
</span><span class="cx">     // RenderTarget creation
</span><span class="cx">     virtual gl::Error createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTargetD3D **outRT) = 0;
</span><ins>+    virtual gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) = 0;
</ins><span class="cx"> 
</span><span class="cx">     // Shader operations
</span><del>-    virtual gl::Error loadExecutable(const void *function, size_t length, ShaderType type,
-                                     const std::vector&lt;gl::LinkedVarying&gt; &amp;transformFeedbackVaryings,
-                                     bool separatedOutputBuffers, ShaderExecutableD3D **outExecutable) = 0;
-    virtual gl::Error compileToExecutable(gl::InfoLog &amp;infoLog, const std::string &amp;shaderHLSL, ShaderType type,
-                                          const std::vector&lt;gl::LinkedVarying&gt; &amp;transformFeedbackVaryings,
-                                          bool separatedOutputBuffers, const D3DCompilerWorkarounds &amp;workarounds,
</del><ins>+    virtual gl::Error loadExecutable(const void *function,
+                                     size_t length,
+                                     ShaderType type,
+                                     const std::vector&lt;D3DVarying&gt; &amp;streamOutVaryings,
+                                     bool separatedOutputBuffers,
+                                     ShaderExecutableD3D **outExecutable) = 0;
+    virtual gl::Error compileToExecutable(gl::InfoLog &amp;infoLog,
+                                          const std::string &amp;shaderHLSL,
+                                          ShaderType type,
+                                          const std::vector&lt;D3DVarying&gt; &amp;streamOutVaryings,
+                                          bool separatedOutputBuffers,
+                                          const D3DCompilerWorkarounds &amp;workarounds,
</ins><span class="cx">                                           ShaderExecutableD3D **outExectuable) = 0;
</span><span class="cx">     virtual UniformStorageD3D *createUniformStorage(size_t storageSize) = 0;
</span><span class="cx"> 
</span><span class="cx">     // Image operations
</span><span class="cx">     virtual ImageD3D *createImage() = 0;
</span><span class="cx">     virtual gl::Error generateMipmap(ImageD3D *dest, ImageD3D *source) = 0;
</span><del>-    virtual gl::Error generateMipmapsUsingD3D(TextureStorage *storage, const gl::SamplerState &amp;samplerState) = 0;
</del><ins>+    virtual gl::Error generateMipmapsUsingD3D(TextureStorage *storage,
+                                              const gl::TextureState &amp;textureState) = 0;
</ins><span class="cx">     virtual TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain) = 0;
</span><ins>+    virtual TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage) = 0;
</ins><span class="cx">     virtual TextureStorage *createTextureStorage2D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly) = 0;
</span><span class="cx">     virtual TextureStorage *createTextureStorageCube(GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly) = 0;
</span><span class="cx">     virtual TextureStorage *createTextureStorage3D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels) = 0;
</span><span class="lines">@@ -184,56 +246,105 @@
</span><span class="cx"> 
</span><span class="cx">     gl::Error getScratchMemoryBuffer(size_t requestedSize, MemoryBuffer **bufferOut);
</span><span class="cx"> 
</span><ins>+    // EXT_debug_marker
+    void insertEventMarker(GLsizei length, const char *marker) override;
+    void pushGroupMarker(GLsizei length, const char *marker) override;
+    void popGroupMarker() override;
+
+    void setGPUDisjoint();
+
+    GLint getGPUDisjoint() override;
+    GLint64 getTimestamp() override;
+
+    void onMakeCurrent(const gl::Data &amp;data) override;
+
+    // In D3D11, faster than calling setTexture a jillion times
+    virtual gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) = 0;
+
+    virtual egl::Error getEGLDevice(DeviceImpl **device) = 0;
+
+    bool presentPathFastEnabled() const { return mPresentPathFastEnabled; }
+
+    // Stream creation
+    virtual StreamImpl *createStream(const egl::AttributeMap &amp;attribs) = 0;
+
</ins><span class="cx">   protected:
</span><del>-    virtual gl::Error drawArrays(const gl::Data &amp;data, GLenum mode, GLsizei count, GLsizei instances, bool usesPointSize) = 0;
-    virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
-                                   gl::Buffer *elementArrayBuffer, const TranslatedIndexData &amp;indexInfo, GLsizei instances) = 0;
-
</del><span class="cx">     virtual bool getLUID(LUID *adapterLuid) const = 0;
</span><ins>+    virtual gl::Error applyShadersImpl(const gl::Data &amp;data, GLenum drawMode) = 0;
</ins><span class="cx"> 
</span><span class="cx">     void cleanup();
</span><span class="cx"> 
</span><ins>+    virtual void createAnnotator() = 0;
+
+    static unsigned int GetBlendSampleMask(const gl::Data &amp;data, int samples);
+    // dirtyPointer is a special value that will make the comparison with any valid pointer fail and force the renderer to re-apply the state.
+
</ins><span class="cx">     egl::Display *mDisplay;
</span><span class="cx">     bool mDeviceLost;
</span><span class="cx"> 
</span><ins>+    void initializeDebugAnnotator();
+    gl::DebugAnnotator *mAnnotator;
+
+    bool mPresentPathFastEnabled;
+
</ins><span class="cx">   private:
</span><ins>+    gl::Error genericDrawArrays(const gl::Data &amp;data,
+                                GLenum mode,
+                                GLint first,
+                                GLsizei count,
+                                GLsizei instances);
+
+    gl::Error genericDrawElements(const gl::Data &amp;data,
+                                  GLenum mode,
+                                  GLsizei count,
+                                  GLenum type,
+                                  const GLvoid *indices,
+                                  GLsizei instances,
+                                  const gl::IndexRange &amp;indexRange);
+
+    virtual gl::Error drawArraysImpl(const gl::Data &amp;data,
+                                     GLenum mode,
+                                     GLint startVertex,
+                                     GLsizei count,
+                                     GLsizei instances) = 0;
+    virtual gl::Error drawElementsImpl(const gl::Data &amp;data,
+                                       const TranslatedIndexData &amp;indexInfo,
+                                       GLenum mode,
+                                       GLsizei count,
+                                       GLenum type,
+                                       const GLvoid *indices,
+                                       GLsizei instances) = 0;
+
</ins><span class="cx">     //FIXME(jmadill): std::array is currently prohibited by Chromium style guide
</span><del>-    typedef std::array&lt;unsigned int, gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS&gt; FramebufferTextureSerialArray;
</del><ins>+    typedef std::array&lt;gl::Texture*, gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS&gt; FramebufferTextureArray;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error generateSwizzles(const gl::Data &amp;data, gl::SamplerType type);
</span><span class="cx">     gl::Error generateSwizzles(const gl::Data &amp;data);
</span><span class="cx"> 
</span><del>-    gl::Error applyRenderTarget(const gl::Data &amp;data, GLenum drawMode, bool ignoreViewport);
</del><span class="cx">     gl::Error applyState(const gl::Data &amp;data, GLenum drawMode);
</span><del>-    gl::Error applyShaders(const gl::Data &amp;data);
</del><ins>+    gl::Error applyShaders(const gl::Data &amp;data, GLenum drawMode);
</ins><span class="cx">     gl::Error applyTextures(const gl::Data &amp;data, gl::SamplerType shaderType,
</span><del>-                            const FramebufferTextureSerialArray &amp;framebufferSerials, size_t framebufferSerialCount);
</del><ins>+                            const FramebufferTextureArray &amp;framebufferTextures, size_t framebufferTextureCount);
</ins><span class="cx">     gl::Error applyTextures(const gl::Data &amp;data);
</span><span class="cx"> 
</span><span class="cx">     bool skipDraw(const gl::Data &amp;data, GLenum drawMode);
</span><del>-    void markTransformFeedbackUsage(const gl::Data &amp;data);
</del><ins>+    gl::Error markTransformFeedbackUsage(const gl::Data &amp;data);
</ins><span class="cx"> 
</span><del>-    size_t getBoundFramebufferTextureSerials(const gl::Data &amp;data,
-                                             FramebufferTextureSerialArray *outSerialArray);
</del><ins>+    size_t getBoundFramebufferTextures(const gl::Data &amp;data, FramebufferTextureArray *outTextureArray);
</ins><span class="cx">     gl::Texture *getIncompleteTexture(GLenum type);
</span><span class="cx"> 
</span><ins>+    gl::DebugAnnotator *getAnnotator();
+
+    virtual WorkaroundsD3D generateWorkarounds() const = 0;
+
</ins><span class="cx">     gl::TextureMap mIncompleteTextures;
</span><span class="cx">     MemoryBuffer mScratchMemoryBuffer;
</span><span class="cx">     unsigned int mScratchMemoryBufferResetCounter;
</span><del>-};
</del><span class="cx"> 
</span><del>-struct dx_VertexConstants
-{
-    float depthRange[4];
-    float viewAdjust[4];
-    float viewCoords[4];
-};
</del><ins>+    mutable bool mWorkaroundsInitialized;
+    mutable WorkaroundsD3D mWorkarounds;
</ins><span class="cx"> 
</span><del>-struct dx_PixelConstants
-{
-    float depthRange[4];
-    float viewCoords[4];
-    float depthFront[4];
</del><ins>+    bool mDisjoint;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dSamplerD3Dh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SamplerD3D.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SamplerD3D.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SamplerD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,25 @@
</span><ins>+//
+// Copyright 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// SamplerD3D.h: Defines the rx::SamplerD3D class, an implementation of SamplerImpl.
+
+#ifndef LIBANGLE_RENDERER_D3D_SAMPLERD3D_H_
+#define LIBANGLE_RENDERER_D3D_SAMPLERD3D_H_
+
+#include &quot;libANGLE/renderer/SamplerImpl.h&quot;
+
+namespace rx
+{
+
+class SamplerD3D : public SamplerImpl
+{
+  public:
+    SamplerD3D() {}
+    ~SamplerD3D() override {}
+};
+}
+
+#endif  // LIBANGLE_RENDERER_D3D_SAMPLERD3D_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dShaderD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ShaderD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ShaderD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ShaderD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,14 +6,14 @@
</span><span class="cx"> 
</span><span class="cx"> // ShaderD3D.cpp: Defines the rx::ShaderD3D class which implements rx::ShaderImpl.
</span><span class="cx"> 
</span><del>-#include &quot;libANGLE/Shader.h&quot;
-#include &quot;libANGLE/Compiler.h&quot;
-#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/ShaderD3D.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/CompilerD3D.h&quot;
-#include &quot;libANGLE/features.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;common/utilities.h&quot;
</span><ins>+#include &quot;libANGLE/Compiler.h&quot;
+#include &quot;libANGLE/Shader.h&quot;
+#include &quot;libANGLE/features.h&quot;
+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> // Definitions local to the translation unit
</span><span class="cx"> namespace
</span><span class="lines">@@ -23,52 +23,25 @@
</span><span class="cx"> {
</span><span class="cx">     switch (type)
</span><span class="cx">     {
</span><del>-      case GL_VERTEX_SHADER:
-        return &quot;VERTEX&quot;;
</del><ins>+        case GL_VERTEX_SHADER:
+            return &quot;VERTEX&quot;;
</ins><span class="cx"> 
</span><del>-      case GL_FRAGMENT_SHADER:
-        return &quot;FRAGMENT&quot;;
</del><ins>+        case GL_FRAGMENT_SHADER:
+            return &quot;FRAGMENT&quot;;
</ins><span class="cx"> 
</span><del>-      default:
-        UNREACHABLE();
-        return &quot;&quot;;
</del><ins>+        default:
+            UNREACHABLE();
+            return &quot;&quot;;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // anonymous namespace
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-template &lt;typename VarT&gt;
-void FilterInactiveVariables(std::vector&lt;VarT&gt; *variableList)
</del><ins>+ShaderD3D::ShaderD3D(const gl::Shader::Data &amp;data) : ShaderImpl(data)
</ins><span class="cx"> {
</span><del>-    ASSERT(variableList);
-
-    for (size_t varIndex = 0; varIndex &lt; variableList-&gt;size();)
-    {
-        if (!(*variableList)[varIndex].staticUse)
-        {
-            variableList-&gt;erase(variableList-&gt;begin() + varIndex);
-        }
-        else
-        {
-            varIndex++;
-        }
-    }
-}
-
-template &lt;typename VarT&gt;
-const std::vector&lt;VarT&gt; *GetShaderVariables(const std::vector&lt;VarT&gt; *variableList)
-{
-    ASSERT(variableList);
-    return variableList;
-}
-
-ShaderD3D::ShaderD3D(GLenum type)
-    : mShaderType(type),
-      mShaderVersion(100)
-{
</del><span class="cx">     uncompile();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -78,53 +51,15 @@
</span><span class="cx"> 
</span><span class="cx"> std::string ShaderD3D::getDebugInfo() const
</span><span class="cx"> {
</span><del>-    return mDebugInfo + std::string(&quot;\n// &quot;) + GetShaderTypeString(mShaderType) + &quot; SHADER END\n&quot;;
</del><ins>+    return mDebugInfo + std::string(&quot;\n// &quot;) + GetShaderTypeString(mData.getShaderType()) +
+           &quot; SHADER END\n&quot;;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-
-void ShaderD3D::parseVaryings(ShHandle compiler)
-{
-    if (!mTranslatedSource.empty())
-    {
-        const std::vector&lt;sh::Varying&gt; *varyings = ShGetVaryings(compiler);
-        ASSERT(varyings);
-
-        for (size_t varyingIndex = 0; varyingIndex &lt; varyings-&gt;size(); varyingIndex++)
-        {
-            mVaryings.push_back(gl::PackedVarying((*varyings)[varyingIndex]));
-        }
-
-        mUsesMultipleRenderTargets   = mTranslatedSource.find(&quot;GL_USES_MRT&quot;)                          != std::string::npos;
-        mUsesFragColor               = mTranslatedSource.find(&quot;GL_USES_FRAG_COLOR&quot;)                   != std::string::npos;
-        mUsesFragData                = mTranslatedSource.find(&quot;GL_USES_FRAG_DATA&quot;)                    != std::string::npos;
-        mUsesFragCoord               = mTranslatedSource.find(&quot;GL_USES_FRAG_COORD&quot;)                   != std::string::npos;
-        mUsesFrontFacing             = mTranslatedSource.find(&quot;GL_USES_FRONT_FACING&quot;)                 != std::string::npos;
-        mUsesPointSize               = mTranslatedSource.find(&quot;GL_USES_POINT_SIZE&quot;)                   != std::string::npos;
-        mUsesPointCoord              = mTranslatedSource.find(&quot;GL_USES_POINT_COORD&quot;)                  != std::string::npos;
-        mUsesDepthRange              = mTranslatedSource.find(&quot;GL_USES_DEPTH_RANGE&quot;)                  != std::string::npos;
-        mUsesFragDepth               = mTranslatedSource.find(&quot;GL_USES_FRAG_DEPTH&quot;)                   != std::string::npos;
-        mUsesDiscardRewriting        = mTranslatedSource.find(&quot;ANGLE_USES_DISCARD_REWRITING&quot;)         != std::string::npos;
-        mUsesNestedBreak             = mTranslatedSource.find(&quot;ANGLE_USES_NESTED_BREAK&quot;)              != std::string::npos;
-        mUsesDeferredInit            = mTranslatedSource.find(&quot;ANGLE_USES_DEFERRED_INIT&quot;)             != std::string::npos;
-        mRequiresIEEEStrictCompiling = mTranslatedSource.find(&quot;ANGLE_REQUIRES_IEEE_STRICT_COMPILING&quot;) != std::string::npos;
-    }
-}
-
-void ShaderD3D::resetVaryingsRegisterAssignment()
-{
-    for (size_t varyingIndex = 0; varyingIndex &lt; mVaryings.size(); varyingIndex++)
-    {
-        mVaryings[varyingIndex].resetRegisterAssignment();
-    }
-}
-
</del><span class="cx"> // initialize/clean up previous state
</span><span class="cx"> void ShaderD3D::uncompile()
</span><span class="cx"> {
</span><span class="cx">     // set by compileToHLSL
</span><span class="cx">     mCompilerOutputType = SH_ESSL_OUTPUT;
</span><del>-    mTranslatedSource.clear();
-    mInfoLog.clear();
</del><span class="cx"> 
</span><span class="cx">     mUsesMultipleRenderTargets = false;
</span><span class="cx">     mUsesFragColor = false;
</span><span class="lines">@@ -135,125 +70,13 @@
</span><span class="cx">     mUsesPointCoord = false;
</span><span class="cx">     mUsesDepthRange = false;
</span><span class="cx">     mUsesFragDepth = false;
</span><del>-    mShaderVersion = 100;
</del><span class="cx">     mUsesDiscardRewriting = false;
</span><span class="cx">     mUsesNestedBreak = false;
</span><del>-    mUsesDeferredInit = false;
</del><span class="cx">     mRequiresIEEEStrictCompiling = false;
</span><span class="cx"> 
</span><del>-    mVaryings.clear();
-    mUniforms.clear();
-    mInterfaceBlocks.clear();
-    mActiveAttributes.clear();
-    mActiveOutputVariables.clear();
</del><span class="cx">     mDebugInfo.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ShaderD3D::compileToHLSL(ShHandle compiler, const std::string &amp;source)
-{
-    int compileOptions = (SH_OBJECT_CODE | SH_VARIABLES);
-    std::string sourcePath;
-
-#if !defined (ANGLE_ENABLE_WINDOWS_STORE)
-    if (gl::DebugAnnotationsActive())
-    {
-        sourcePath = getTempPath();
-        writeFile(sourcePath.c_str(), source.c_str(), source.length());
-        compileOptions |= SH_LINE_DIRECTIVES;
-    }
-#endif
-
-    int result;
-    if (sourcePath.empty())
-    {
-        const char* sourceStrings[] =
-        {
-            source.c_str(),
-        };
-
-        result = ShCompile(compiler, sourceStrings, ArraySize(sourceStrings), compileOptions);
-    }
-    else
-    {
-        const char* sourceStrings[] =
-        {
-            sourcePath.c_str(),
-            source.c_str(),
-        };
-
-        result = ShCompile(compiler, sourceStrings, ArraySize(sourceStrings), compileOptions | SH_SOURCE_PATH);
-    }
-
-    mShaderVersion = ShGetShaderVersion(compiler);
-
-    if (result)
-    {
-        mTranslatedSource = ShGetObjectCode(compiler);
-
-#ifdef _DEBUG
-        // Prefix hlsl shader with commented out glsl shader
-        // Useful in diagnostics tools like pix which capture the hlsl shaders
-        std::ostringstream hlslStream;
-        hlslStream &lt;&lt; &quot;// GLSL\n&quot;;
-        hlslStream &lt;&lt; &quot;//\n&quot;;
-
-        size_t curPos = 0;
-        while (curPos != std::string::npos)
-        {
-            size_t nextLine = source.find(&quot;\n&quot;, curPos);
-            size_t len = (nextLine == std::string::npos) ? std::string::npos : (nextLine - curPos + 1);
-
-            hlslStream &lt;&lt; &quot;// &quot; &lt;&lt; source.substr(curPos, len);
-
-            curPos = (nextLine == std::string::npos) ? std::string::npos : (nextLine + 1);
-        }
-        hlslStream &lt;&lt; &quot;\n\n&quot;;
-        hlslStream &lt;&lt; mTranslatedSource;
-        mTranslatedSource = hlslStream.str();
-#endif
-
-        mUniforms = *GetShaderVariables(ShGetUniforms(compiler));
-
-        for (size_t uniformIndex = 0; uniformIndex &lt; mUniforms.size(); uniformIndex++)
-        {
-            const sh::Uniform &amp;uniform = mUniforms[uniformIndex];
-
-            if (uniform.staticUse &amp;&amp; !uniform.isBuiltIn())
-            {
-                unsigned int index = static_cast&lt;unsigned int&gt;(-1);
-                bool getUniformRegisterResult = ShGetUniformRegister(compiler, uniform.name, &amp;index);
-                UNUSED_ASSERTION_VARIABLE(getUniformRegisterResult);
-                ASSERT(getUniformRegisterResult);
-
-                mUniformRegisterMap[uniform.name] = index;
-            }
-        }
-
-        mInterfaceBlocks = *GetShaderVariables(ShGetInterfaceBlocks(compiler));
-
-        for (size_t blockIndex = 0; blockIndex &lt; mInterfaceBlocks.size(); blockIndex++)
-        {
-            const sh::InterfaceBlock &amp;interfaceBlock = mInterfaceBlocks[blockIndex];
-
-            if (interfaceBlock.staticUse)
-            {
-                unsigned int index = static_cast&lt;unsigned int&gt;(-1);
-                bool blockRegisterResult = ShGetInterfaceBlockRegister(compiler, interfaceBlock.name, &amp;index);
-                UNUSED_ASSERTION_VARIABLE(blockRegisterResult);
-                ASSERT(blockRegisterResult);
-
-                mInterfaceBlockRegisterMap[interfaceBlock.name] = index;
-            }
-        }
-    }
-    else
-    {
-        mInfoLog = ShGetInfoLog(compiler);
-
-        TRACE(&quot;\n%s&quot;, mInfoLog.c_str());
-    }
-}
-
</del><span class="cx"> void ShaderD3D::generateWorkarounds(D3DCompilerWorkarounds *workarounds) const
</span><span class="cx"> {
</span><span class="cx">     if (mUsesDiscardRewriting)
</span><span class="lines">@@ -277,28 +100,6 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// true if varying x has a higher priority in packing than y
-bool ShaderD3D::compareVarying(const gl::PackedVarying &amp;x, const gl::PackedVarying &amp;y)
-{
-    if (x.type == y.type)
-    {
-        return x.arraySize &gt; y.arraySize;
-    }
-
-    // Special case for handling structs: we sort these to the end of the list
-    if (x.type == GL_STRUCT_ANGLEX)
-    {
-        return false;
-    }
-
-    if (y.type == GL_STRUCT_ANGLEX)
-    {
-        return true;
-    }
-
-    return gl::VariableSortOrder(x.type) &lt; gl::VariableSortOrder(y.type);
-}
-
</del><span class="cx"> unsigned int ShaderD3D::getUniformRegister(const std::string &amp;uniformName) const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(mUniformRegisterMap.count(uniformName) &gt; 0);
</span><span class="lines">@@ -311,66 +112,91 @@
</span><span class="cx">     return mInterfaceBlockRegisterMap.find(blockName)-&gt;second;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLenum ShaderD3D::getShaderType() const
-{
-    return mShaderType;
-}
-
</del><span class="cx"> ShShaderOutput ShaderD3D::getCompilerOutputType() const
</span><span class="cx"> {
</span><span class="cx">     return mCompilerOutputType;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ShaderD3D::compile(gl::Compiler *compiler, const std::string &amp;source)
</del><ins>+int ShaderD3D::prepareSourceAndReturnOptions(std::stringstream *shaderSourceStream,
+                                             std::string *sourcePath)
</ins><span class="cx"> {
</span><span class="cx">     uncompile();
</span><span class="cx"> 
</span><del>-    CompilerD3D *compilerD3D = GetImplAs&lt;CompilerD3D&gt;(compiler);
-    ShHandle compilerHandle = compilerD3D-&gt;getCompilerHandle(mShaderType);
</del><ins>+    int additionalOptions = 0;
</ins><span class="cx"> 
</span><del>-    mCompilerOutputType = ShGetShaderOutputType(compilerHandle);
</del><ins>+    const std::string &amp;source = mData.getSource();
</ins><span class="cx"> 
</span><del>-    compileToHLSL(compilerHandle, source);
-
-    if (mShaderType == GL_VERTEX_SHADER)
</del><ins>+#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
+    if (gl::DebugAnnotationsActive())
</ins><span class="cx">     {
</span><del>-        parseAttributes(compilerHandle);
</del><ins>+        *sourcePath = getTempPath();
+        writeFile(sourcePath-&gt;c_str(), source.c_str(), source.length());
+        additionalOptions |= SH_LINE_DIRECTIVES | SH_SOURCE_PATH;
</ins><span class="cx">     }
</span><ins>+#endif
</ins><span class="cx"> 
</span><del>-    parseVaryings(compilerHandle);
</del><ins>+    *shaderSourceStream &lt;&lt; source;
+    return additionalOptions;
+}
</ins><span class="cx"> 
</span><del>-    if (mShaderType == GL_FRAGMENT_SHADER)
-    {
-        std::sort(mVaryings.begin(), mVaryings.end(), compareVarying);
</del><ins>+bool ShaderD3D::hasUniform(const D3DUniform *d3dUniform) const
+{
+    return mUniformRegisterMap.find(d3dUniform-&gt;name) != mUniformRegisterMap.end();
+}
</ins><span class="cx"> 
</span><del>-        const std::string &amp;hlsl = getTranslatedSource();
-        if (!hlsl.empty())
-        {
-            mActiveOutputVariables = *GetShaderVariables(ShGetOutputVariables(compilerHandle));
-            FilterInactiveVariables(&amp;mActiveOutputVariables);
-        }
-    }
-
-#if ANGLE_SHADER_DEBUG_INFO == ANGLE_ENABLED
-    mDebugInfo += std::string(&quot;// &quot;) + GetShaderTypeString(mShaderType) + &quot; SHADER BEGIN\n&quot;;
-    mDebugInfo += &quot;\n// GLSL BEGIN\n\n&quot; + source + &quot;\n\n// GLSL END\n\n\n&quot;;
-    mDebugInfo += &quot;// INITIAL HLSL BEGIN\n\n&quot; + getTranslatedSource() + &quot;\n// INITIAL HLSL END\n\n\n&quot;;
-    // Successive steps will append more info
-#else
-    mDebugInfo += getTranslatedSource();
-#endif
-
-    return !getTranslatedSource().empty();
</del><ins>+const std::map&lt;std::string, unsigned int&gt; &amp;GetUniformRegisterMap(
+    const std::map&lt;std::string, unsigned int&gt; *uniformRegisterMap)
+{
+    ASSERT(uniformRegisterMap);
+    return *uniformRegisterMap;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ShaderD3D::parseAttributes(ShHandle compiler)
</del><ins>+bool ShaderD3D::postTranslateCompile(gl::Compiler *compiler, std::string *infoLog)
</ins><span class="cx"> {
</span><del>-    const std::string &amp;hlsl = getTranslatedSource();
-    if (!hlsl.empty())
</del><ins>+    // TODO(jmadill): We shouldn't need to cache this.
+    mCompilerOutputType = compiler-&gt;getShaderOutputType();
+
+    const std::string &amp;translatedSource = mData.getTranslatedSource();
+
+    mUsesMultipleRenderTargets = translatedSource.find(&quot;GL_USES_MRT&quot;) != std::string::npos;
+    mUsesFragColor             = translatedSource.find(&quot;GL_USES_FRAG_COLOR&quot;) != std::string::npos;
+    mUsesFragData              = translatedSource.find(&quot;GL_USES_FRAG_DATA&quot;) != std::string::npos;
+    mUsesFragCoord             = translatedSource.find(&quot;GL_USES_FRAG_COORD&quot;) != std::string::npos;
+    mUsesFrontFacing           = translatedSource.find(&quot;GL_USES_FRONT_FACING&quot;) != std::string::npos;
+    mUsesPointSize             = translatedSource.find(&quot;GL_USES_POINT_SIZE&quot;) != std::string::npos;
+    mUsesPointCoord            = translatedSource.find(&quot;GL_USES_POINT_COORD&quot;) != std::string::npos;
+    mUsesDepthRange            = translatedSource.find(&quot;GL_USES_DEPTH_RANGE&quot;) != std::string::npos;
+    mUsesFragDepth = translatedSource.find(&quot;GL_USES_FRAG_DEPTH&quot;) != std::string::npos;
+    mUsesDiscardRewriting =
+        translatedSource.find(&quot;ANGLE_USES_DISCARD_REWRITING&quot;) != std::string::npos;
+    mUsesNestedBreak  = translatedSource.find(&quot;ANGLE_USES_NESTED_BREAK&quot;) != std::string::npos;
+    mRequiresIEEEStrictCompiling =
+        translatedSource.find(&quot;ANGLE_REQUIRES_IEEE_STRICT_COMPILING&quot;) != std::string::npos;
+
+    ShHandle compilerHandle = compiler-&gt;getCompilerHandle(mData.getShaderType());
+
+    mUniformRegisterMap = GetUniformRegisterMap(ShGetUniformRegisterMap(compilerHandle));
+
+    for (const sh::InterfaceBlock &amp;interfaceBlock : mData.getInterfaceBlocks())
</ins><span class="cx">     {
</span><del>-        mActiveAttributes = *GetShaderVariables(ShGetAttributes(compiler));
-        FilterInactiveVariables(&amp;mActiveAttributes);
</del><ins>+        if (interfaceBlock.staticUse)
+        {
+            unsigned int index = static_cast&lt;unsigned int&gt;(-1);
+            bool blockRegisterResult =
+                ShGetInterfaceBlockRegister(compilerHandle, interfaceBlock.name, &amp;index);
+            UNUSED_ASSERTION_VARIABLE(blockRegisterResult);
+            ASSERT(blockRegisterResult);
+
+            mInterfaceBlockRegisterMap[interfaceBlock.name] = index;
+        }
</ins><span class="cx">     }
</span><del>-}
</del><span class="cx"> 
</span><ins>+    mDebugInfo +=
+        std::string(&quot;// &quot;) + GetShaderTypeString(mData.getShaderType()) + &quot; SHADER BEGIN\n&quot;;
+    mDebugInfo += &quot;\n// GLSL BEGIN\n\n&quot; + mData.getSource() + &quot;\n\n// GLSL END\n\n\n&quot;;
+    mDebugInfo += &quot;// INITIAL HLSL BEGIN\n\n&quot; + translatedSource + &quot;\n// INITIAL HLSL END\n\n\n&quot;;
+    // Successive steps will append more info
+    return true;
</ins><span class="cx"> }
</span><ins>+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dShaderD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ShaderD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ShaderD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/ShaderD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,8 +10,6 @@
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_SHADERD3D_H_
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/ShaderImpl.h&quot;
</span><del>-#include &quot;libANGLE/renderer/Workarounds.h&quot;
-#include &quot;libANGLE/Shader.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &lt;map&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -19,48 +17,48 @@
</span><span class="cx"> {
</span><span class="cx"> class DynamicHLSL;
</span><span class="cx"> class RendererD3D;
</span><ins>+struct D3DCompilerWorkarounds;
+struct D3DUniform;
</ins><span class="cx"> 
</span><span class="cx"> class ShaderD3D : public ShaderImpl
</span><span class="cx"> {
</span><del>-    friend class DynamicHLSL;
-
</del><span class="cx">   public:
</span><del>-    ShaderD3D(GLenum type);
</del><ins>+    ShaderD3D(const gl::Shader::Data &amp;data);
</ins><span class="cx">     virtual ~ShaderD3D();
</span><span class="cx"> 
</span><span class="cx">     // ShaderImpl implementation
</span><del>-    virtual std::string getDebugInfo() const;
</del><ins>+    int prepareSourceAndReturnOptions(std::stringstream *sourceStream,
+                                      std::string *sourcePath) override;
+    bool postTranslateCompile(gl::Compiler *compiler, std::string *infoLog) override;
+    std::string getDebugInfo() const override;
</ins><span class="cx"> 
</span><span class="cx">     // D3D-specific methods
</span><del>-    virtual void uncompile();
-    void resetVaryingsRegisterAssignment();
</del><ins>+    void uncompile();
+
+    bool hasUniform(const D3DUniform *d3dUniform) const;
+
+    // Query regular uniforms with their name. Query sampler fields of structs with field selection
+    // using dot (.) operator.
</ins><span class="cx">     unsigned int getUniformRegister(const std::string &amp;uniformName) const;
</span><ins>+
</ins><span class="cx">     unsigned int getInterfaceBlockRegister(const std::string &amp;blockName) const;
</span><del>-    void appendDebugInfo(const std::string &amp;info) { mDebugInfo += info; }
</del><ins>+    void appendDebugInfo(const std::string &amp;info) const { mDebugInfo += info; }
</ins><span class="cx"> 
</span><span class="cx">     void generateWorkarounds(D3DCompilerWorkarounds *workarounds) const;
</span><del>-    int getShaderVersion() const { return mShaderVersion; }
-    bool usesDepthRange() const { return mUsesDepthRange; }
</del><ins>+
+    bool usesMultipleRenderTargets() const { return mUsesMultipleRenderTargets; }
+    bool usesFragColor() const { return mUsesFragColor; }
+    bool usesFragData() const { return mUsesFragData; }
+    bool usesFragCoord() const { return mUsesFragCoord; }
+    bool usesFrontFacing() const { return mUsesFrontFacing; }
</ins><span class="cx">     bool usesPointSize() const { return mUsesPointSize; }
</span><del>-    bool usesDeferredInit() const { return mUsesDeferredInit; }
</del><ins>+    bool usesPointCoord() const { return mUsesPointCoord; }
+    bool usesDepthRange() const { return mUsesDepthRange; }
+    bool usesFragDepth() const { return mUsesFragDepth; }
</ins><span class="cx"> 
</span><del>-    GLenum getShaderType() const;
</del><span class="cx">     ShShaderOutput getCompilerOutputType() const;
</span><span class="cx"> 
</span><del>-    virtual bool compile(gl::Compiler *compiler, const std::string &amp;source);
-
</del><span class="cx">   private:
</span><del>-    void compileToHLSL(ShHandle compiler, const std::string &amp;source);
-    void parseVaryings(ShHandle compiler);
-
-    void parseAttributes(ShHandle compiler);
-
-    static bool compareVarying(const gl::PackedVarying &amp;x, const gl::PackedVarying &amp;y);
-
-    GLenum mShaderType;
-
-    int mShaderVersion;
-
</del><span class="cx">     bool mUsesMultipleRenderTargets;
</span><span class="cx">     bool mUsesFragColor;
</span><span class="cx">     bool mUsesFragData;
</span><span class="lines">@@ -72,15 +70,13 @@
</span><span class="cx">     bool mUsesFragDepth;
</span><span class="cx">     bool mUsesDiscardRewriting;
</span><span class="cx">     bool mUsesNestedBreak;
</span><del>-    bool mUsesDeferredInit;
</del><span class="cx">     bool mRequiresIEEEStrictCompiling;
</span><span class="cx"> 
</span><span class="cx">     ShShaderOutput mCompilerOutputType;
</span><del>-    std::string mDebugInfo;
</del><ins>+    mutable std::string mDebugInfo;
</ins><span class="cx">     std::map&lt;std::string, unsigned int&gt; mUniformRegisterMap;
</span><span class="cx">     std::map&lt;std::string, unsigned int&gt; mInterfaceBlockRegisterMap;
</span><span class="cx"> };
</span><del>-
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-#endif // LIBANGLE_RENDERER_D3D_SHADERD3D_H_
</del><ins>+#endif  // LIBANGLE_RENDERER_D3D_SHADERD3D_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dSurfaceD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SurfaceD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SurfaceD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SurfaceD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,7 +10,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Display.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/DisplayD3D.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RenderTargetD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/SwapChainD3D.h&quot;
</span><span class="lines">@@ -25,44 +24,54 @@
</span><span class="cx"> SurfaceD3D *SurfaceD3D::createOffscreen(RendererD3D *renderer, egl::Display *display, const egl::Config *config, EGLClientBuffer shareHandle,
</span><span class="cx">                                         EGLint width, EGLint height)
</span><span class="cx"> {
</span><del>-    return new SurfaceD3D(renderer, display, config, width, height, EGL_TRUE, shareHandle, NULL);
</del><ins>+    return new SurfaceD3D(renderer, display, config, width, height, EGL_TRUE, 0, EGL_FALSE,
+                          shareHandle, NULL);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-SurfaceD3D *SurfaceD3D::createFromWindow(RendererD3D *renderer, egl::Display *display, const egl::Config *config, EGLNativeWindowType window,
-                                         EGLint fixedSize, EGLint width, EGLint height)
</del><ins>+SurfaceD3D *SurfaceD3D::createFromWindow(RendererD3D *renderer,
+                                         egl::Display *display,
+                                         const egl::Config *config,
+                                         EGLNativeWindowType window,
+                                         EGLint fixedSize,
+                                         EGLint directComposition,
+                                         EGLint width,
+                                         EGLint height,
+                                         EGLint orientation)
</ins><span class="cx"> {
</span><del>-    return new SurfaceD3D(renderer, display, config, width, height, fixedSize, static_cast&lt;EGLClientBuffer&gt;(0), window);
</del><ins>+    return new SurfaceD3D(renderer, display, config, width, height, fixedSize, orientation,
+                          directComposition, static_cast&lt;EGLClientBuffer&gt;(0), window);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-SurfaceD3D::SurfaceD3D(RendererD3D *renderer, egl::Display *display, const egl::Config *config, EGLint width, EGLint height, EGLint fixedSize,
-                       EGLClientBuffer shareHandle, EGLNativeWindowType window)
</del><ins>+SurfaceD3D::SurfaceD3D(RendererD3D *renderer,
+                       egl::Display *display,
+                       const egl::Config *config,
+                       EGLint width,
+                       EGLint height,
+                       EGLint fixedSize,
+                       EGLint orientation,
+                       EGLint directComposition,
+                       EGLClientBuffer shareHandle,
+                       EGLNativeWindowType window)
</ins><span class="cx">     : SurfaceImpl(),
</span><span class="cx">       mRenderer(renderer),
</span><span class="cx">       mDisplay(display),
</span><span class="cx">       mFixedSize(fixedSize == EGL_TRUE),
</span><ins>+      mOrientation(orientation),
</ins><span class="cx">       mRenderTargetFormat(config-&gt;renderTargetFormat),
</span><span class="cx">       mDepthStencilFormat(config-&gt;depthStencilFormat),
</span><span class="cx">       mSwapChain(nullptr),
</span><span class="cx">       mSwapIntervalDirty(true),
</span><del>-      mNativeWindow(window),
</del><ins>+      mNativeWindow(window, config, directComposition == EGL_TRUE),
</ins><span class="cx">       mWidth(width),
</span><span class="cx">       mHeight(height),
</span><del>-      mChildWindow(nullptr),
</del><span class="cx">       mSwapInterval(1),
</span><del>-      mShareHandle(reinterpret_cast&lt;HANDLE*&gt;(shareHandle))
</del><ins>+      mShareHandle(reinterpret_cast&lt;HANDLE *&gt;(shareHandle))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> SurfaceD3D::~SurfaceD3D()
</span><span class="cx"> {
</span><span class="cx">     releaseSwapChain();
</span><del>-
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
-    if (mChildWindow.getNativeWindow() != nullptr)
-    {
-        DestroyWindow(mChildWindow.getNativeWindow());
-    }
-#endif
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SurfaceD3D::releaseSwapChain()
</span><span class="lines">@@ -74,44 +83,6 @@
</span><span class="cx"> {
</span><span class="cx">     if (mNativeWindow.getNativeWindow())
</span><span class="cx">     {
</span><del>-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
-        if (mRenderer-&gt;shouldCreateChildWindowForSurface(mNativeWindow.getNativeWindow()))
-        {
-            RECT rect;
-            if (!mNativeWindow.getClientRect(&amp;rect))
-            {
-                return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to get the size of the native window.&quot;);
-            }
-
-            DisplayD3D *displayD3D = GetImplAs&lt;DisplayD3D&gt;(mDisplay);
-            ATOM windowClass = displayD3D-&gt;getChildWindowClass();
-
-            HWND childWindow = CreateWindowExA(WS_EX_NOPARENTNOTIFY,
-                                               reinterpret_cast&lt;const char*&gt;(windowClass),
-                                               &quot;ANGLE Intermediate Surface Window&quot;,
-                                               WS_CHILDWINDOW | WS_DISABLED | WS_VISIBLE,
-                                               0,
-                                               0,
-                                               rect.right - rect.left,
-                                               rect.bottom - rect.top,
-                                               mNativeWindow.getNativeWindow(),
-                                               nullptr,
-                                               nullptr,
-                                               nullptr);
-            if (!childWindow)
-            {
-                return egl::Error(EGL_NOT_INITIALIZED, &quot;Failed to create child window.&quot;);
-            }
-
-            mChildWindow = NativeWindow(childWindow);
-
-            if (!mChildWindow.initialize())
-            {
-                return egl::Error(EGL_BAD_SURFACE);
-            }
-        }
-#endif
-
</del><span class="cx">         if (!mNativeWindow.initialize())
</span><span class="cx">         {
</span><span class="cx">             return egl::Error(EGL_BAD_SURFACE);
</span><span class="lines">@@ -127,8 +98,13 @@
</span><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error SurfaceD3D::bindTexImage(EGLint)
</del><ins>+FramebufferImpl *SurfaceD3D::createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data)
</ins><span class="cx"> {
</span><ins>+    return mRenderer-&gt;createFramebuffer(data);
+}
+
+egl::Error SurfaceD3D::bindTexImage(gl::Texture *, EGLint)
+{
</ins><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -164,8 +140,8 @@
</span><span class="cx">         height = mHeight;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const NativeWindow &amp;window = (mChildWindow.getNativeWindow() != nullptr) ? mChildWindow : mNativeWindow;
-    mSwapChain = mRenderer-&gt;createSwapChain(window, mShareHandle, mRenderTargetFormat, mDepthStencilFormat);
</del><ins>+    mSwapChain = mRenderer-&gt;createSwapChain(mNativeWindow, mShareHandle, mRenderTargetFormat,
+                                            mDepthStencilFormat, mOrientation);
</ins><span class="cx">     if (!mSwapChain)
</span><span class="cx">     {
</span><span class="cx">         return egl::Error(EGL_BAD_ALLOC);
</span><span class="lines">@@ -201,17 +177,6 @@
</span><span class="cx">     mWidth = backbufferWidth;
</span><span class="cx">     mHeight = backbufferHeight;
</span><span class="cx"> 
</span><del>-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
-    if (mChildWindow.getNativeWindow())
-    {
-        // Resize the child window
-        if (!MoveWindow(mChildWindow.getNativeWindow(), 0, 0, mWidth, mHeight, FALSE))
-        {
-            return egl::Error(EGL_BAD_SURFACE, &quot;Failed to move the child window.&quot;);
-        }
-    }
-#endif
-
</del><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -354,10 +319,23 @@
</span><span class="cx">     return EGL_TRUE;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+EGLint SurfaceD3D::getSwapBehavior() const
+{
+    return EGL_BUFFER_PRESERVED;
+}
+
</ins><span class="cx"> egl::Error SurfaceD3D::querySurfacePointerANGLE(EGLint attribute, void **value)
</span><span class="cx"> {
</span><del>-    ASSERT(attribute == EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE);
-    *value = mSwapChain-&gt;getShareHandle();
</del><ins>+    if (attribute == EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE)
+    {
+        *value = mSwapChain-&gt;getShareHandle();
+    }
+    else if (attribute == EGL_DXGI_KEYED_MUTEX_ANGLE)
+    {
+        *value = mSwapChain-&gt;getKeyedMutex();
+    }
+    else UNREACHABLE();
+
</ins><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dSurfaceD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SurfaceD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SurfaceD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SurfaceD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -25,19 +25,27 @@
</span><span class="cx"> class SurfaceD3D : public SurfaceImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    static SurfaceD3D *createFromWindow(RendererD3D *renderer, egl::Display *display, const egl::Config *config,
-                                        EGLNativeWindowType window, EGLint fixedSize, EGLint width, EGLint height);
</del><ins>+    static SurfaceD3D *createFromWindow(RendererD3D *renderer,
+                                        egl::Display *display,
+                                        const egl::Config *config,
+                                        EGLNativeWindowType window,
+                                        EGLint fixedSize,
+                                        EGLint directComposition,
+                                        EGLint width,
+                                        EGLint height,
+                                        EGLint orientation);
</ins><span class="cx">     static SurfaceD3D *createOffscreen(RendererD3D *renderer, egl::Display *display, const egl::Config *config,
</span><span class="cx">                                        EGLClientBuffer shareHandle, EGLint width, EGLint height);
</span><span class="cx">     ~SurfaceD3D() override;
</span><span class="cx">     void releaseSwapChain();
</span><span class="cx"> 
</span><span class="cx">     egl::Error initialize() override;
</span><ins>+    FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data) override;
</ins><span class="cx"> 
</span><span class="cx">     egl::Error swap() override;
</span><span class="cx">     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
</span><span class="cx">     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
</span><del>-    egl::Error bindTexImage(EGLint buffer) override;
</del><ins>+    egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
</ins><span class="cx">     egl::Error releaseTexImage(EGLint buffer) override;
</span><span class="cx">     void setSwapInterval(EGLint interval) override;
</span><span class="cx"> 
</span><span class="lines">@@ -45,6 +53,7 @@
</span><span class="cx">     EGLint getHeight() const override;
</span><span class="cx"> 
</span><span class="cx">     EGLint isPostSubBufferSupported() const override;
</span><ins>+    EGLint getSwapBehavior() const override;
</ins><span class="cx"> 
</span><span class="cx">     // D3D implementations
</span><span class="cx">     SwapChainD3D *getSwapChain() const;
</span><span class="lines">@@ -58,8 +67,16 @@
</span><span class="cx">                                         FramebufferAttachmentRenderTarget **rtOut) override;
</span><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    SurfaceD3D(RendererD3D *renderer, egl::Display *display, const egl::Config *config, EGLint width, EGLint height,
-               EGLint fixedSize, EGLClientBuffer shareHandle, EGLNativeWindowType window);
</del><ins>+    SurfaceD3D(RendererD3D *renderer,
+               egl::Display *display,
+               const egl::Config *config,
+               EGLint width,
+               EGLint height,
+               EGLint fixedSize,
+               EGLint orientation,
+               EGLint directComposition,
+               EGLClientBuffer shareHandle,
+               EGLNativeWindowType window);
</ins><span class="cx"> 
</span><span class="cx">     egl::Error swapRect(EGLint x, EGLint y, EGLint width, EGLint height);
</span><span class="cx">     egl::Error resetSwapChain(int backbufferWidth, int backbufferHeight);
</span><span class="lines">@@ -69,6 +86,7 @@
</span><span class="cx">     egl::Display *mDisplay;
</span><span class="cx"> 
</span><span class="cx">     bool mFixedSize;
</span><ins>+    GLint mOrientation;
</ins><span class="cx"> 
</span><span class="cx">     GLenum mRenderTargetFormat;
</span><span class="cx">     GLenum mDepthStencilFormat;
</span><span class="lines">@@ -80,8 +98,6 @@
</span><span class="cx">     EGLint mWidth;
</span><span class="cx">     EGLint mHeight;
</span><span class="cx"> 
</span><del>-    NativeWindow mChildWindow;
-
</del><span class="cx">     EGLint mSwapInterval;
</span><span class="cx"> 
</span><span class="cx">     HANDLE mShareHandle;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dSwapChainD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SwapChainD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SwapChainD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/SwapChainD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     SwapChainD3D(rx::NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
</span><del>-        : mNativeWindow(nativeWindow), mShareHandle(shareHandle), mBackBufferFormat(backBufferFormat), mDepthBufferFormat(depthBufferFormat)
</del><ins>+        : mNativeWindow(nativeWindow), mOffscreenRenderTargetFormat(backBufferFormat), mDepthBufferFormat(depthBufferFormat), mShareHandle(shareHandle)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -45,14 +45,15 @@
</span><span class="cx">     virtual RenderTargetD3D *getColorRenderTarget() = 0;
</span><span class="cx">     virtual RenderTargetD3D *getDepthStencilRenderTarget() = 0;
</span><span class="cx"> 
</span><del>-    GLenum GetBackBufferInternalFormat() const { return mBackBufferFormat; }
</del><ins>+    GLenum GetRenderTargetInternalFormat() const { return mOffscreenRenderTargetFormat; }
</ins><span class="cx">     GLenum GetDepthBufferInternalFormat() const { return mDepthBufferFormat; }
</span><span class="cx"> 
</span><span class="cx">     HANDLE getShareHandle() { return mShareHandle; }
</span><ins>+    virtual void *getKeyedMutex() = 0;
</ins><span class="cx"> 
</span><span class="cx">   protected:
</span><span class="cx">     rx::NativeWindow mNativeWindow;  // Handler for the Window that the surface is created for.
</span><del>-    const GLenum mBackBufferFormat;
</del><ins>+    const GLenum mOffscreenRenderTargetFormat;
</ins><span class="cx">     const GLenum mDepthBufferFormat;
</span><span class="cx"> 
</span><span class="cx">     HANDLE mShareHandle;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dTextureD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,11 +13,13 @@
</span><span class="cx"> #include &quot;libANGLE/Buffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Config.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><ins>+#include &quot;libANGLE/Image.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Texture.h&quot;
</span><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/BufferImpl.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/BufferD3D.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/EGLImageD3D.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/ImageD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RenderTargetD3D.h&quot;
</span><span class="lines">@@ -157,16 +159,12 @@
</span><span class="cx">     return (mTexStorage &amp;&amp; !internalFormat.compressed);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D::setImage(const gl::ImageIndex &amp;index, GLenum type,
-                               const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels,
-                               ptrdiff_t layerOffset)
</del><ins>+gl::Error TextureD3D::setImageImpl(const gl::ImageIndex &amp;index,
+                                   GLenum type,
+                                   const gl::PixelUnpackState &amp;unpack,
+                                   const uint8_t *pixels,
+                                   ptrdiff_t layerOffset)
</ins><span class="cx"> {
</span><del>-    if (unpack.skipRows != 0 || unpack.skipPixels != 0 || unpack.imageHeight != 0 || unpack.skipImages != 0)
-    {
-        UNIMPLEMENTED();
-        return gl::Error(GL_INVALID_OPERATION, &quot;unimplemented pixel store state&quot;);
-    }
-
</del><span class="cx">     ImageD3D *image = getImage(index);
</span><span class="cx">     ASSERT(image);
</span><span class="cx"> 
</span><span class="lines">@@ -185,7 +183,7 @@
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (pixelData != NULL)
</del><ins>+    if (pixelData != nullptr)
</ins><span class="cx">     {
</span><span class="cx">         if (shouldUseSetData(image))
</span><span class="cx">         {
</span><span class="lines">@@ -247,15 +245,11 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D::setCompressedImage(const gl::ImageIndex &amp;index, const gl::PixelUnpackState &amp;unpack,
-                                         const uint8_t *pixels, ptrdiff_t layerOffset)
</del><ins>+gl::Error TextureD3D::setCompressedImageImpl(const gl::ImageIndex &amp;index,
+                                             const gl::PixelUnpackState &amp;unpack,
+                                             const uint8_t *pixels,
+                                             ptrdiff_t layerOffset)
</ins><span class="cx"> {
</span><del>-    if (unpack.skipRows != 0 || unpack.skipPixels != 0 || unpack.imageHeight != 0 || unpack.skipImages != 0)
-    {
-        UNIMPLEMENTED();
-        return gl::Error(GL_INVALID_OPERATION, &quot;unimplemented pixel store state&quot;);
-    }
-
</del><span class="cx">     // We no longer need the &quot;GLenum format&quot; parameter to TexImage to determine what data format &quot;pixels&quot; contains.
</span><span class="cx">     // From our image internal format we know how many channels to expect, and &quot;type&quot; gives the format of pixel's components.
</span><span class="cx">     const uint8_t *pixelData = NULL;
</span><span class="lines">@@ -287,12 +281,6 @@
</span><span class="cx">                                          const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels,
</span><span class="cx">                                          ptrdiff_t layerOffset)
</span><span class="cx"> {
</span><del>-    if (unpack.skipRows != 0 || unpack.skipPixels != 0 || unpack.imageHeight != 0 || unpack.skipImages != 0)
-    {
-        UNIMPLEMENTED();
-        return gl::Error(GL_INVALID_OPERATION, &quot;unimplemented pixel store state&quot;);
-    }
-
</del><span class="cx">     const uint8_t *pixelData = NULL;
</span><span class="cx">     gl::Error error = GetUnpackPointer(unpack, pixels, layerOffset, &amp;pixelData);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -325,6 +313,15 @@
</span><span class="cx"> gl::Error TextureD3D::fastUnpackPixels(const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels, const gl::Box &amp;destArea,
</span><span class="cx">                                        GLenum sizedInternalFormat, GLenum type, RenderTargetD3D *destRenderTarget)
</span><span class="cx"> {
</span><ins>+    if (unpack.skipRows != 0 || unpack.skipPixels != 0 || unpack.imageHeight != 0 ||
+        unpack.skipImages != 0)
+    {
+        // TODO(jmadill): additional unpack parameters
+        UNIMPLEMENTED();
+        return gl::Error(GL_INVALID_OPERATION,
+                         &quot;Unimplemented pixel store parameters in fastUnpackPixels&quot;);
+    }
+
</ins><span class="cx">     // No-op
</span><span class="cx">     if (destArea.width &lt;= 0 &amp;&amp; destArea.height &lt;= 0 &amp;&amp; destArea.depth &lt;= 0)
</span><span class="cx">     {
</span><span class="lines">@@ -376,7 +373,7 @@
</span><span class="cx">     return getImage(getImageIndex(0, 0));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D::generateMipmaps(const gl::SamplerState &amp;samplerState)
</del><ins>+gl::Error TextureD3D::generateMipmaps(const gl::TextureState &amp;textureState)
</ins><span class="cx"> {
</span><span class="cx">     GLint mipCount = mipLevels();
</span><span class="cx"> 
</span><span class="lines">@@ -414,7 +411,7 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Generate the mipmap chain using the ad-hoc DirectX function.
</span><del>-        error = mRenderer-&gt;generateMipmapsUsingD3D(mTexStorage, samplerState);
</del><ins>+        error = mRenderer-&gt;generateMipmapsUsingD3D(mTexStorage, textureState);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -453,9 +450,7 @@
</span><span class="cx">                 gl::ImageIndex srcIndex = getImageIndex(0, layer);
</span><span class="cx"> 
</span><span class="cx">                 ImageD3D *image = getImage(srcIndex);
</span><del>-                gl::Box area(0, 0, 0, image-&gt;getWidth(), image-&gt;getHeight(), image-&gt;getDepth());
-                gl::Offset offset(0, 0, 0);
-                gl::Error error = image-&gt;copy(offset, area, srcIndex, mTexStorage);
</del><ins>+                gl::Error error = image-&gt;copyFromTexStorage(srcIndex, mTexStorage);
</ins><span class="cx">                 if (error.isError())
</span><span class="cx">                 {
</span><span class="cx">                     return error;
</span><span class="lines">@@ -620,6 +615,7 @@
</span><span class="cx"> TextureD3D_2D::TextureD3D_2D(RendererD3D *renderer)
</span><span class="cx">     : TextureD3D(renderer)
</span><span class="cx"> {
</span><ins>+    mEGLImageTarget = false;
</ins><span class="cx">     for (int i = 0; i &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; ++i)
</span><span class="cx">     {
</span><span class="cx">         mImageArray[i] = renderer-&gt;createImage();
</span><span class="lines">@@ -689,16 +685,23 @@
</span><span class="cx">     return gl::GetInternalFormatInfo(getInternalFormat(level)).depthBits &gt; 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_2D::setImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size, GLenum format, GLenum type,
-                                  const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+gl::Error TextureD3D_2D::setImage(GLenum target,
+                                  size_t imageLevel,
+                                  GLenum internalFormat,
+                                  const gl::Extents &amp;size,
+                                  GLenum format,
+                                  GLenum type,
+                                  const gl::PixelUnpackState &amp;unpack,
+                                  const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_2D &amp;&amp; size.depth == 1);
</span><span class="cx"> 
</span><span class="cx">     GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, type);
</span><span class="cx"> 
</span><span class="cx">     bool fastUnpacked = false;
</span><ins>+    GLint level       = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx"> 
</span><del>-    redefineImage(level, sizedInternalFormat, size);
</del><ins>+    redefineImage(level, sizedInternalFormat, size, false);
</ins><span class="cx"> 
</span><span class="cx">     gl::ImageIndex index = gl::ImageIndex::Make2D(level);
</span><span class="cx"> 
</span><span class="lines">@@ -729,7 +732,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!fastUnpacked)
</span><span class="cx">     {
</span><del>-        gl::Error error = TextureD3D::setImage(index, type, unpack, pixels, 0);
</del><ins>+        gl::Error error = setImageImpl(index, type, unpack, pixels, 0);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -739,17 +742,17 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_2D::setSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format, GLenum type,
-                                     const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+gl::Error TextureD3D_2D::setSubImage(GLenum target,
+                                     size_t imageLevel,
+                                     const gl::Box &amp;area,
+                                     GLenum format,
+                                     GLenum type,
+                                     const gl::PixelUnpackState &amp;unpack,
+                                     const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_2D &amp;&amp; area.depth == 1 &amp;&amp; area.z == 0);
</span><span class="cx"> 
</span><del>-    if (unpack.skipRows != 0 || unpack.skipPixels != 0 || unpack.imageHeight != 0 || unpack.skipImages != 0)
-    {
-        UNIMPLEMENTED();
-        return gl::Error(GL_INVALID_OPERATION, &quot;unimplemented pixel store state&quot;);
-    }
-
</del><ins>+    GLint level          = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     gl::ImageIndex index = gl::ImageIndex::Make2D(level);
</span><span class="cx">     if (isFastUnpackable(unpack, getInternalFormat(level)) &amp;&amp; isLevelComplete(level))
</span><span class="cx">     {
</span><span class="lines">@@ -770,24 +773,29 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
-gl::Error TextureD3D_2D::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
-                                            const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+gl::Error TextureD3D_2D::setCompressedImage(GLenum target,
+                                            size_t imageLevel,
+                                            GLenum internalFormat,
+                                            const gl::Extents &amp;size,
+                                            const gl::PixelUnpackState &amp;unpack,
+                                            size_t imageSize,
+                                            const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_2D &amp;&amp; size.depth == 1);
</span><ins>+    GLint level = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx"> 
</span><span class="cx">     // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
</span><del>-    redefineImage(level, internalFormat, size);
</del><ins>+    redefineImage(level, internalFormat, size, false);
</ins><span class="cx"> 
</span><del>-    return TextureD3D::setCompressedImage(gl::ImageIndex::Make2D(level), unpack, pixels, 0);
</del><ins>+    return setCompressedImageImpl(gl::ImageIndex::Make2D(level), unpack, pixels, 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureD3D_2D::setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                               const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+                                               const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_2D &amp;&amp; area.depth == 1 &amp;&amp; area.z == 0);
</span><span class="cx"> 
</span><del>-    gl::ImageIndex index = gl::ImageIndex::Make2D(level);
</del><ins>+    gl::ImageIndex index = gl::ImageIndex::Make2D(static_cast&lt;GLint&gt;(level));
</ins><span class="cx">     gl::Error error = TextureD3D::subImageCompressed(index, area, format, unpack, pixels, 0);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="lines">@@ -797,13 +805,18 @@
</span><span class="cx">     return commitRegion(index, area);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_2D::copyImage(GLenum target, size_t level, const gl::Rectangle &amp;sourceArea, GLenum internalFormat,
</del><ins>+gl::Error TextureD3D_2D::copyImage(GLenum target,
+                                   size_t imageLevel,
+                                   const gl::Rectangle &amp;sourceArea,
+                                   GLenum internalFormat,
</ins><span class="cx">                                    const gl::Framebuffer *source)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_2D);
</span><span class="cx"> 
</span><ins>+    GLint level                = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE);
</span><del>-    redefineImage(level, sizedInternalFormat, gl::Extents(sourceArea.width, sourceArea.height, 1));
</del><ins>+    redefineImage(level, sizedInternalFormat, gl::Extents(sourceArea.width, sourceArea.height, 1),
+                  false);
</ins><span class="cx"> 
</span><span class="cx">     gl::ImageIndex index = gl::ImageIndex::Make2D(level);
</span><span class="cx">     gl::Offset destOffset(0, 0, 0);
</span><span class="lines">@@ -812,7 +825,7 @@
</span><span class="cx">     // so we should use the non-rendering copy path.
</span><span class="cx">     if (!canCreateRenderTargetForImage(index) || mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround)
</span><span class="cx">     {
</span><del>-        gl::Error error = mImageArray[level]-&gt;copy(destOffset, sourceArea, source);
</del><ins>+        gl::Error error = mImageArray[level]-&gt;copyFromFramebuffer(destOffset, sourceArea, source);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -843,7 +856,10 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_2D::copySubImage(GLenum target, size_t level, const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea,
</del><ins>+gl::Error TextureD3D_2D::copySubImage(GLenum target,
+                                      size_t imageLevel,
+                                      const gl::Offset &amp;destOffset,
+                                      const gl::Rectangle &amp;sourceArea,
</ins><span class="cx">                                       const gl::Framebuffer *source)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_2D &amp;&amp; destOffset.z == 0);
</span><span class="lines">@@ -851,13 +867,14 @@
</span><span class="cx">     // can only make our texture storage to a render target if level 0 is defined (with a width &amp; height) and
</span><span class="cx">     // the current level we're copying to is defined (with appropriate format, width &amp; height)
</span><span class="cx"> 
</span><ins>+    GLint level          = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     gl::ImageIndex index = gl::ImageIndex::Make2D(level);
</span><span class="cx"> 
</span><span class="cx">     // If the zero max LOD workaround is active, then we can't sample from individual layers of the framebuffer in shaders,
</span><span class="cx">     // so we should use the non-rendering copy path.
</span><span class="cx">     if (!canCreateRenderTargetForImage(index) || mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround)
</span><span class="cx">     {
</span><del>-        gl::Error error = mImageArray[level]-&gt;copy(destOffset, sourceArea, source);
</del><ins>+        gl::Error error = mImageArray[level]-&gt;copyFromFramebuffer(destOffset, sourceArea, source);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -903,17 +920,18 @@
</span><span class="cx">         gl::Extents levelSize(std::max(1, size.width &gt;&gt; level),
</span><span class="cx">                               std::max(1, size.height &gt;&gt; level),
</span><span class="cx">                               1);
</span><del>-        mImageArray[level]-&gt;redefine(GL_TEXTURE_2D, internalFormat, levelSize, true);
</del><ins>+        redefineImage(level, internalFormat, levelSize, true);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (int level = levels; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
</del><ins>+    for (size_t level = levels; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
</ins><span class="cx">     {
</span><del>-        mImageArray[level]-&gt;redefine(GL_TEXTURE_2D, GL_NONE, gl::Extents(0, 0, 0), true);
</del><ins>+        redefineImage(level, GL_NONE, gl::Extents(0, 0, 1), true);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // TODO(geofflang): Verify storage creation had no errors
</span><span class="cx">     bool renderTarget = IsRenderTargetUsage(mUsage);
</span><del>-    TextureStorage *storage = mRenderer-&gt;createTextureStorage2D(internalFormat, renderTarget, size.width, size.height, levels, false);
</del><ins>+    TextureStorage *storage = mRenderer-&gt;createTextureStorage2D(
+        internalFormat, renderTarget, size.width, size.height, static_cast&lt;int&gt;(levels), false);
</ins><span class="cx"> 
</span><span class="cx">     gl::Error error = setCompleteTexStorage(storage);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -939,7 +957,7 @@
</span><span class="cx">     GLenum internalformat = surface-&gt;getConfig()-&gt;renderTargetFormat;
</span><span class="cx"> 
</span><span class="cx">     gl::Extents size(surface-&gt;getWidth(), surface-&gt;getHeight(), 1);
</span><del>-    mImageArray[0]-&gt;redefine(GL_TEXTURE_2D, internalformat, size, true);
</del><ins>+    redefineImage(0, internalformat, size, true);
</ins><span class="cx"> 
</span><span class="cx">     if (mTexStorage)
</span><span class="cx">     {
</span><span class="lines">@@ -950,6 +968,7 @@
</span><span class="cx">     ASSERT(surfaceD3D);
</span><span class="cx"> 
</span><span class="cx">     mTexStorage = mRenderer-&gt;createTextureStorage2D(surfaceD3D-&gt;getSwapChain());
</span><ins>+    mEGLImageTarget = false;
</ins><span class="cx"> 
</span><span class="cx">     mDirtyImages = true;
</span><span class="cx"> }
</span><span class="lines">@@ -963,10 +982,34 @@
</span><span class="cx"> 
</span><span class="cx">     for (int i = 0; i &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
</span><span class="cx">     {
</span><del>-        mImageArray[i]-&gt;redefine(GL_TEXTURE_2D, GL_NONE, gl::Extents(0, 0, 0), true);
</del><ins>+        redefineImage(i, GL_NONE, gl::Extents(0, 0, 1), true);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+gl::Error TextureD3D_2D::setEGLImageTarget(GLenum target, egl::Image *image)
+{
+    EGLImageD3D *eglImaged3d = GetImplAs&lt;EGLImageD3D&gt;(image);
+
+    // Set the properties of the base mip level from the EGL image
+    GLenum internalformat = image-&gt;getInternalFormat();
+    gl::Extents size(static_cast&lt;int&gt;(image-&gt;getWidth()), static_cast&lt;int&gt;(image-&gt;getHeight()), 1);
+    redefineImage(0, internalformat, size, true);
+
+    // Clear all other images.
+    for (size_t level = 1; level &lt; ArraySize(mImageArray); level++)
+    {
+        redefineImage(level, GL_NONE, gl::Extents(0, 0, 1), true);
+    }
+
+    SafeDelete(mTexStorage);
+    mImageArray[0]-&gt;markClean();
+
+    mTexStorage     = mRenderer-&gt;createTextureStorageEGLImage(eglImaged3d);
+    mEGLImageTarget = true;
+
+    return gl::Error(GL_NO_ERROR);
+}
+
</ins><span class="cx"> void TextureD3D_2D::initMipmapsImages()
</span><span class="cx"> {
</span><span class="cx">     // Purge array levels 1 through q and reset them to represent the generated mipmap levels.
</span><span class="lines">@@ -977,16 +1020,10 @@
</span><span class="cx">                               std::max(getBaseLevelHeight() &gt;&gt; level, 1),
</span><span class="cx">                               1);
</span><span class="cx"> 
</span><del>-        redefineImage(level, getBaseLevelInternalFormat(), levelSize);
</del><ins>+        redefineImage(level, getBaseLevelInternalFormat(), levelSize, false);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int TextureD3D_2D::getRenderTargetSerial(const gl::ImageIndex &amp;index)
-{
-    ASSERT(!index.hasLayer());
-    return (!ensureRenderTarget().isError() ? mTexStorage-&gt;getRenderTargetSerial(index) : 0);
-}
-
</del><span class="cx"> gl::Error TextureD3D_2D::getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!index.hasLayer());
</span><span class="lines">@@ -1193,7 +1230,10 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TextureD3D_2D::redefineImage(GLint level, GLenum internalformat, const gl::Extents &amp;size)
</del><ins>+void TextureD3D_2D::redefineImage(size_t level,
+                                  GLenum internalformat,
+                                  const gl::Extents &amp;size,
+                                  bool forceRelease)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(size.depth == 1);
</span><span class="cx"> 
</span><span class="lines">@@ -1202,18 +1242,26 @@
</span><span class="cx">     const int storageHeight = std::max(1, getBaseLevelHeight() &gt;&gt; level);
</span><span class="cx">     const GLenum storageFormat = getBaseLevelInternalFormat();
</span><span class="cx"> 
</span><del>-    mImageArray[level]-&gt;redefine(GL_TEXTURE_2D, internalformat, size, false);
</del><ins>+    mImageArray[level]-&gt;redefine(GL_TEXTURE_2D, internalformat, size, forceRelease);
</ins><span class="cx"> 
</span><span class="cx">     if (mTexStorage)
</span><span class="cx">     {
</span><del>-        const int storageLevels = mTexStorage-&gt;getLevelCount();
</del><ins>+        const size_t storageLevels = mTexStorage-&gt;getLevelCount();
</ins><span class="cx"> 
</span><ins>+        // If the storage was from an EGL image, copy it back into local images to preserve it
+        // while orphaning
+        if (level != 0 &amp;&amp; mEGLImageTarget)
+        {
+            // TODO(jmadill): Don't discard error.
+            mImageArray[0]-&gt;copyFromTexStorage(gl::ImageIndex::Make2D(0), mTexStorage);
+        }
+
</ins><span class="cx">         if ((level &gt;= storageLevels &amp;&amp; storageLevels != 0) ||
</span><span class="cx">             size.width != storageWidth ||
</span><span class="cx">             size.height != storageHeight ||
</span><span class="cx">             internalformat != storageFormat)   // Discard mismatched storage
</span><span class="cx">         {
</span><del>-            for (int i = 0; i &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
</del><ins>+            for (size_t i = 0; i &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
</ins><span class="cx">             {
</span><span class="cx">                 mImageArray[i]-&gt;markDirty();
</span><span class="cx">             }
</span><span class="lines">@@ -1222,6 +1270,9 @@
</span><span class="cx">             mDirtyImages = true;
</span><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    // Can't be an EGL image target after being redefined
+    mEGLImageTarget = false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::ImageIndexIterator TextureD3D_2D::imageIterator() const
</span><span class="lines">@@ -1302,17 +1353,23 @@
</span><span class="cx">     return gl::GetInternalFormatInfo(getInternalFormat(level, layer)).depthBits &gt; 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+gl::Error TextureD3D_Cube::setEGLImageTarget(GLenum target, egl::Image *image)
+{
+    UNREACHABLE();
+    return gl::Error(GL_INVALID_OPERATION);
+}
+
</ins><span class="cx"> gl::Error TextureD3D_Cube::setImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size, GLenum format, GLenum type,
</span><span class="cx">                                     const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(size.depth == 1);
</span><span class="cx"> 
</span><span class="cx">     GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, type);
</span><del>-    gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
</del><ins>+    gl::ImageIndex index       = gl::ImageIndex::MakeCube(target, static_cast&lt;GLint&gt;(level));
</ins><span class="cx"> 
</span><del>-    redefineImage(index.layerIndex, level, sizedInternalFormat, size);
</del><ins>+    redefineImage(index.layerIndex, static_cast&lt;GLint&gt;(level), sizedInternalFormat, size);
</ins><span class="cx"> 
</span><del>-    return TextureD3D::setImage(index, type, unpack, pixels, 0);
</del><ins>+    return setImageImpl(index, type, unpack, pixels, 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureD3D_Cube::setSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format, GLenum type,
</span><span class="lines">@@ -1320,30 +1377,30 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(area.depth == 1 &amp;&amp; area.z == 0);
</span><span class="cx"> 
</span><del>-    gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
</del><ins>+    gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast&lt;GLint&gt;(level));
</ins><span class="cx">     return TextureD3D::subImage(index, area, format, type, unpack, pixels, 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureD3D_Cube::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
</span><del>-                                              const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+                                              const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(size.depth == 1);
</span><span class="cx"> 
</span><span class="cx">     // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
</span><span class="cx">     size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target);
</span><span class="cx"> 
</span><del>-    redefineImage(faceIndex, level, internalFormat, size);
</del><ins>+    redefineImage(static_cast&lt;int&gt;(faceIndex), static_cast&lt;GLint&gt;(level), internalFormat, size);
</ins><span class="cx"> 
</span><del>-    gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
-    return TextureD3D::setCompressedImage(index, unpack, pixels, 0);
</del><ins>+    gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast&lt;GLint&gt;(level));
+    return setCompressedImageImpl(index, unpack, pixels, 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureD3D_Cube::setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                                 const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+                                                 const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(area.depth == 1 &amp;&amp; area.z == 0);
</span><span class="cx"> 
</span><del>-    gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
</del><ins>+    gl::ImageIndex index = gl::ImageIndex::MakeCube(target, static_cast&lt;GLint&gt;(level));
</ins><span class="cx"> 
</span><span class="cx">     gl::Error error = TextureD3D::subImageCompressed(index, area, format, unpack, pixels, 0);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -1354,14 +1411,19 @@
</span><span class="cx">     return commitRegion(index, area);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_Cube::copyImage(GLenum target, size_t level, const gl::Rectangle &amp;sourceArea, GLenum internalFormat,
</del><ins>+gl::Error TextureD3D_Cube::copyImage(GLenum target,
+                                     size_t imageLevel,
+                                     const gl::Rectangle &amp;sourceArea,
+                                     GLenum internalFormat,
</ins><span class="cx">                                      const gl::Framebuffer *source)
</span><span class="cx"> {
</span><del>-    size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target);
</del><ins>+    int faceIndex              = static_cast&lt;int&gt;(gl::CubeMapTextureTargetToLayerIndex(target));
</ins><span class="cx">     GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, GL_UNSIGNED_BYTE);
</span><span class="cx"> 
</span><ins>+    GLint level = static_cast&lt;GLint&gt;(imageLevel);
+
</ins><span class="cx">     gl::Extents size(sourceArea.width, sourceArea.height, 1);
</span><del>-    redefineImage(faceIndex, level, sizedInternalFormat, size);
</del><ins>+    redefineImage(static_cast&lt;int&gt;(faceIndex), level, sizedInternalFormat, size);
</ins><span class="cx"> 
</span><span class="cx">     gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
</span><span class="cx">     gl::Offset destOffset(0, 0, 0);
</span><span class="lines">@@ -1370,7 +1432,8 @@
</span><span class="cx">     // so we should use the non-rendering copy path.
</span><span class="cx">     if (!canCreateRenderTargetForImage(index) || mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround)
</span><span class="cx">     {
</span><del>-        gl::Error error = mImageArray[faceIndex][level]-&gt;copy(destOffset, sourceArea, source);
</del><ins>+        gl::Error error =
+            mImageArray[faceIndex][level]-&gt;copyFromFramebuffer(destOffset, sourceArea, source);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -1403,18 +1466,23 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_Cube::copySubImage(GLenum target, size_t level, const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea,
</del><ins>+gl::Error TextureD3D_Cube::copySubImage(GLenum target,
+                                        size_t imageLevel,
+                                        const gl::Offset &amp;destOffset,
+                                        const gl::Rectangle &amp;sourceArea,
</ins><span class="cx">                                         const gl::Framebuffer *source)
</span><span class="cx"> {
</span><del>-    size_t faceIndex = gl::CubeMapTextureTargetToLayerIndex(target);
</del><ins>+    int faceIndex = static_cast&lt;int&gt;(gl::CubeMapTextureTargetToLayerIndex(target));
</ins><span class="cx"> 
</span><ins>+    GLint level          = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     gl::ImageIndex index = gl::ImageIndex::MakeCube(target, level);
</span><span class="cx"> 
</span><span class="cx">     // If the zero max LOD workaround is active, then we can't sample from individual layers of the framebuffer in shaders,
</span><span class="cx">     // so we should use the non-rendering copy path.
</span><span class="cx">     if (!canCreateRenderTargetForImage(index) || mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround)
</span><span class="cx">     {
</span><del>-        gl::Error error = mImageArray[faceIndex][level]-&gt;copy(destOffset, sourceArea, source);
</del><ins>+        gl::Error error =
+            mImageArray[faceIndex][level]-&gt;copyFromFramebuffer(destOffset, sourceArea, source);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -1464,7 +1532,7 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (int level = levels; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
</del><ins>+    for (size_t level = levels; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
</ins><span class="cx">     {
</span><span class="cx">         for (int faceIndex = 0; faceIndex &lt; 6; faceIndex++)
</span><span class="cx">         {
</span><span class="lines">@@ -1475,7 +1543,8 @@
</span><span class="cx">     // TODO(geofflang): Verify storage creation had no errors
</span><span class="cx">     bool renderTarget = IsRenderTargetUsage(mUsage);
</span><span class="cx"> 
</span><del>-    TextureStorage *storage = mRenderer-&gt;createTextureStorageCube(internalFormat, renderTarget, size.width, levels, false);
</del><ins>+    TextureStorage *storage = mRenderer-&gt;createTextureStorageCube(
+        internalFormat, renderTarget, size.width, static_cast&lt;int&gt;(levels), false);
</ins><span class="cx"> 
</span><span class="cx">     gl::Error error = setCompleteTexStorage(storage);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -1549,11 +1618,6 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int TextureD3D_Cube::getRenderTargetSerial(const gl::ImageIndex &amp;index)
-{
-    return (!ensureRenderTarget().isError() ? mTexStorage-&gt;getRenderTargetSerial(index) : 0);
-}
-
</del><span class="cx"> gl::Error TextureD3D_Cube::getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(gl::IsCubeMapTextureTarget(index.type));
</span><span class="lines">@@ -1892,12 +1956,25 @@
</span><span class="cx">     return gl::GetInternalFormatInfo(getInternalFormat(level)).depthBits &gt; 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_3D::setImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size, GLenum format, GLenum type,
-                                  const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+gl::Error TextureD3D_3D::setEGLImageTarget(GLenum target, egl::Image *image)
</ins><span class="cx"> {
</span><ins>+    UNREACHABLE();
+    return gl::Error(GL_INVALID_OPERATION);
+}
+
+gl::Error TextureD3D_3D::setImage(GLenum target,
+                                  size_t imageLevel,
+                                  GLenum internalFormat,
+                                  const gl::Extents &amp;size,
+                                  GLenum format,
+                                  GLenum type,
+                                  const gl::PixelUnpackState &amp;unpack,
+                                  const uint8_t *pixels)
+{
</ins><span class="cx">     ASSERT(target == GL_TEXTURE_3D);
</span><span class="cx">     GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, type);
</span><span class="cx"> 
</span><ins>+    GLint level = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     redefineImage(level, sizedInternalFormat, size);
</span><span class="cx"> 
</span><span class="cx">     bool fastUnpacked = false;
</span><span class="lines">@@ -1931,7 +2008,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!fastUnpacked)
</span><span class="cx">     {
</span><del>-        gl::Error error = TextureD3D::setImage(index, type, unpack, pixels, 0);
</del><ins>+        gl::Error error = setImageImpl(index, type, unpack, pixels, 0);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -1941,11 +2018,17 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_3D::setSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format, GLenum type,
-                                     const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+gl::Error TextureD3D_3D::setSubImage(GLenum target,
+                                     size_t imageLevel,
+                                     const gl::Box &amp;area,
+                                     GLenum format,
+                                     GLenum type,
+                                     const gl::PixelUnpackState &amp;unpack,
+                                     const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_3D);
</span><span class="cx"> 
</span><ins>+    GLint level          = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     gl::ImageIndex index = gl::ImageIndex::Make3D(level);
</span><span class="cx"> 
</span><span class="cx">     // Attempt a fast gpu copy of the pixel data to the surface if the app bound an unpack buffer
</span><span class="lines">@@ -1968,24 +2051,30 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_3D::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
-                                            const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+gl::Error TextureD3D_3D::setCompressedImage(GLenum target,
+                                            size_t imageLevel,
+                                            GLenum internalFormat,
+                                            const gl::Extents &amp;size,
+                                            const gl::PixelUnpackState &amp;unpack,
+                                            size_t imageSize,
+                                            const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_3D);
</span><span class="cx"> 
</span><ins>+    GLint level = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
</span><span class="cx">     redefineImage(level, internalFormat, size);
</span><span class="cx"> 
</span><span class="cx">     gl::ImageIndex index = gl::ImageIndex::Make3D(level);
</span><del>-    return TextureD3D::setCompressedImage(index, unpack, pixels, 0);
</del><ins>+    return setCompressedImageImpl(index, unpack, pixels, 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureD3D_3D::setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                               const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+                                               const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_3D);
</span><span class="cx"> 
</span><del>-    gl::ImageIndex index = gl::ImageIndex::Make3D(level);
</del><ins>+    gl::ImageIndex index = gl::ImageIndex::Make3D(static_cast&lt;GLint&gt;(level));
</ins><span class="cx">     gl::Error error = TextureD3D::subImageCompressed(index, area, format, unpack, pixels, 0);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="lines">@@ -2002,16 +2091,20 @@
</span><span class="cx">     return gl::Error(GL_INVALID_OPERATION, &quot;Copying 3D textures is unimplemented.&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_3D::copySubImage(GLenum target, size_t level, const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea,
</del><ins>+gl::Error TextureD3D_3D::copySubImage(GLenum target,
+                                      size_t imageLevel,
+                                      const gl::Offset &amp;destOffset,
+                                      const gl::Rectangle &amp;sourceArea,
</ins><span class="cx">                                       const gl::Framebuffer *source)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_3D);
</span><span class="cx"> 
</span><ins>+    GLint level          = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     gl::ImageIndex index = gl::ImageIndex::Make3D(level);
</span><span class="cx"> 
</span><span class="cx">     if (canCreateRenderTargetForImage(index))
</span><span class="cx">     {
</span><del>-        gl::Error error = mImageArray[level]-&gt;copy(destOffset, sourceArea, source);
</del><ins>+        gl::Error error = mImageArray[level]-&gt;copyFromFramebuffer(destOffset, sourceArea, source);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -2060,14 +2153,16 @@
</span><span class="cx">         mImageArray[level]-&gt;redefine(GL_TEXTURE_3D, internalFormat, levelSize, true);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (int level = levels; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
</del><ins>+    for (size_t level = levels; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
</ins><span class="cx">     {
</span><span class="cx">         mImageArray[level]-&gt;redefine(GL_TEXTURE_3D, GL_NONE, gl::Extents(0, 0, 0), true);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // TODO(geofflang): Verify storage creation had no errors
</span><span class="cx">     bool renderTarget = IsRenderTargetUsage(mUsage);
</span><del>-    TextureStorage *storage = mRenderer-&gt;createTextureStorage3D(internalFormat, renderTarget, size.width, size.height, size.depth, levels);
</del><ins>+    TextureStorage *storage =
+        mRenderer-&gt;createTextureStorage3D(internalFormat, renderTarget, size.width, size.height,
+                                          size.depth, static_cast&lt;int&gt;(levels));
</ins><span class="cx"> 
</span><span class="cx">     gl::Error error = setCompleteTexStorage(storage);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -2112,11 +2207,6 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int TextureD3D_3D::getRenderTargetSerial(const gl::ImageIndex &amp;index)
-{
-    return (!ensureRenderTarget().isError() ? mTexStorage-&gt;getRenderTargetSerial(index) : 0);
-}
-
</del><span class="cx"> gl::Error TextureD3D_3D::getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT)
</span><span class="cx"> {
</span><span class="cx">     // ensure the underlying texture is created
</span><span class="lines">@@ -2425,23 +2515,37 @@
</span><span class="cx">     return gl::GetInternalFormatInfo(getInternalFormat(level)).depthBits &gt; 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_2DArray::setImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size, GLenum format, GLenum type,
-                                       const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+gl::Error TextureD3D_2DArray::setEGLImageTarget(GLenum target, egl::Image *image)
</ins><span class="cx"> {
</span><ins>+    UNREACHABLE();
+    return gl::Error(GL_INVALID_OPERATION);
+}
+
+gl::Error TextureD3D_2DArray::setImage(GLenum target,
+                                       size_t imageLevel,
+                                       GLenum internalFormat,
+                                       const gl::Extents &amp;size,
+                                       GLenum format,
+                                       GLenum type,
+                                       const gl::PixelUnpackState &amp;unpack,
+                                       const uint8_t *pixels)
+{
</ins><span class="cx">     ASSERT(target == GL_TEXTURE_2D_ARRAY);
</span><span class="cx"> 
</span><span class="cx">     GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, type);
</span><span class="cx"> 
</span><ins>+    GLint level = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     redefineImage(level, sizedInternalFormat, size);
</span><span class="cx"> 
</span><span class="cx">     const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(sizedInternalFormat);
</span><del>-    GLsizei inputDepthPitch = formatInfo.computeDepthPitch(type, size.width, size.height, unpack.alignment, unpack.rowLength);
</del><ins>+    GLsizei inputDepthPitch = formatInfo.computeDepthPitch(
+        type, size.width, size.height, unpack.alignment, unpack.rowLength, unpack.imageHeight);
</ins><span class="cx"> 
</span><span class="cx">     for (int i = 0; i &lt; size.depth; i++)
</span><span class="cx">     {
</span><span class="cx">         const ptrdiff_t layerOffset = (inputDepthPitch * i);
</span><span class="cx">         gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, i);
</span><del>-        gl::Error error = TextureD3D::setImage(index, type, unpack, pixels, layerOffset);
</del><ins>+        gl::Error error = setImageImpl(index, type, unpack, pixels, layerOffset);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -2451,13 +2555,19 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_2DArray::setSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format, GLenum type,
-                                          const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+gl::Error TextureD3D_2DArray::setSubImage(GLenum target,
+                                          size_t imageLevel,
+                                          const gl::Box &amp;area,
+                                          GLenum format,
+                                          GLenum type,
+                                          const gl::PixelUnpackState &amp;unpack,
+                                          const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_2D_ARRAY);
</span><del>-
</del><ins>+    GLint level                          = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(getInternalFormat(level));
</span><del>-    GLsizei inputDepthPitch = formatInfo.computeDepthPitch(type, area.width, area.height, unpack.alignment, unpack.rowLength);
</del><ins>+    GLsizei inputDepthPitch = formatInfo.computeDepthPitch(
+        type, area.width, area.height, unpack.alignment, unpack.rowLength, unpack.imageHeight);
</ins><span class="cx"> 
</span><span class="cx">     for (int i = 0; i &lt; area.depth; i++)
</span><span class="cx">     {
</span><span class="lines">@@ -2477,23 +2587,30 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_2DArray::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
-                                                 const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+gl::Error TextureD3D_2DArray::setCompressedImage(GLenum target,
+                                                 size_t imageLevel,
+                                                 GLenum internalFormat,
+                                                 const gl::Extents &amp;size,
+                                                 const gl::PixelUnpackState &amp;unpack,
+                                                 size_t imageSize,
+                                                 const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_2D_ARRAY);
</span><span class="cx"> 
</span><ins>+    GLint level = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly
</span><span class="cx">     redefineImage(level, internalFormat, size);
</span><span class="cx"> 
</span><span class="cx">     const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(internalFormat);
</span><del>-    GLsizei inputDepthPitch = formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, size.width, size.height, 1, 0);
</del><ins>+    GLsizei inputDepthPitch =
+        formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, size.width, size.height, 1, 0, 0);
</ins><span class="cx"> 
</span><span class="cx">     for (int i = 0; i &lt; size.depth; i++)
</span><span class="cx">     {
</span><span class="cx">         const ptrdiff_t layerOffset = (inputDepthPitch * i);
</span><span class="cx"> 
</span><span class="cx">         gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, i);
</span><del>-        gl::Error error = TextureD3D::setCompressedImage(index, unpack, pixels, layerOffset);
</del><ins>+        gl::Error error = setCompressedImageImpl(index, unpack, pixels, layerOffset);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -2504,12 +2621,13 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureD3D_2DArray::setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                                    const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+                                                    const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_2D_ARRAY);
</span><span class="cx"> 
</span><span class="cx">     const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(format);
</span><del>-    GLsizei inputDepthPitch = formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, area.width, area.height, 1, 0);
</del><ins>+    GLsizei inputDepthPitch =
+        formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, area.width, area.height, 1, 0, 0);
</ins><span class="cx"> 
</span><span class="cx">     for (int i = 0; i &lt; area.depth; i++)
</span><span class="cx">     {
</span><span class="lines">@@ -2518,7 +2636,7 @@
</span><span class="cx"> 
</span><span class="cx">         gl::Box layerArea(area.x, area.y, 0, area.width, area.height, 1);
</span><span class="cx"> 
</span><del>-        gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, layer);
</del><ins>+        gl::ImageIndex index = gl::ImageIndex::Make2DArray(static_cast&lt;GLint&gt;(level), layer);
</ins><span class="cx">         gl::Error error = TextureD3D::subImageCompressed(index, layerArea, format, unpack, pixels, layerOffset);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="lines">@@ -2542,17 +2660,22 @@
</span><span class="cx">     return gl::Error(GL_INVALID_OPERATION, &quot;Copying 2D array textures is unimplemented.&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureD3D_2DArray::copySubImage(GLenum target, size_t level, const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea,
</del><ins>+gl::Error TextureD3D_2DArray::copySubImage(GLenum target,
+                                           size_t imageLevel,
+                                           const gl::Offset &amp;destOffset,
+                                           const gl::Rectangle &amp;sourceArea,
</ins><span class="cx">                                            const gl::Framebuffer *source)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(target == GL_TEXTURE_2D_ARRAY);
</span><span class="cx"> 
</span><ins>+    GLint level          = static_cast&lt;GLint&gt;(imageLevel);
</ins><span class="cx">     gl::ImageIndex index = gl::ImageIndex::Make2DArray(level, destOffset.z);
</span><span class="cx"> 
</span><span class="cx">     if (canCreateRenderTargetForImage(index))
</span><span class="cx">     {
</span><span class="cx">         gl::Offset destLayerOffset(destOffset.x, destOffset.y, 0);
</span><del>-        gl::Error error = mImageArray[level][destOffset.z]-&gt;copy(destLayerOffset, sourceArea, source);
</del><ins>+        gl::Error error = mImageArray[level][destOffset.z]-&gt;copyFromFramebuffer(destLayerOffset,
+                                                                                sourceArea, source);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -2616,7 +2739,9 @@
</span><span class="cx"> 
</span><span class="cx">     // TODO(geofflang): Verify storage creation had no errors
</span><span class="cx">     bool renderTarget = IsRenderTargetUsage(mUsage);
</span><del>-    TextureStorage *storage = mRenderer-&gt;createTextureStorage2DArray(internalFormat, renderTarget, size.width, size.height, size.depth, levels);
</del><ins>+    TextureStorage *storage =
+        mRenderer-&gt;createTextureStorage2DArray(internalFormat, renderTarget, size.width,
+                                               size.height, size.depth, static_cast&lt;int&gt;(levels));
</ins><span class="cx"> 
</span><span class="cx">     gl::Error error = setCompleteTexStorage(storage);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -2666,11 +2791,6 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int TextureD3D_2DArray::getRenderTargetSerial(const gl::ImageIndex &amp;index)
-{
-    return (!ensureRenderTarget().isError() ? mTexStorage-&gt;getRenderTargetSerial(index) : 0);
-}
-
</del><span class="cx"> gl::Error TextureD3D_2DArray::getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT)
</span><span class="cx"> {
</span><span class="cx">     // ensure the underlying texture is created
</span><span class="lines">@@ -2881,21 +3001,30 @@
</span><span class="cx">     const int storageDepth = getLayerCount(0);
</span><span class="cx">     const GLenum storageFormat = getBaseLevelInternalFormat();
</span><span class="cx"> 
</span><del>-    for (int layer = 0; layer &lt; mLayerCounts[level]; layer++)
</del><ins>+    // Only reallocate the layers if the size doesn't match
+    if (size.depth != mLayerCounts[level])
</ins><span class="cx">     {
</span><del>-        delete mImageArray[level][layer];
</del><ins>+        for (int layer = 0; layer &lt; mLayerCounts[level]; layer++)
+        {
+            SafeDelete(mImageArray[level][layer]);
+        }
+        SafeDeleteArray(mImageArray[level]);
+        mLayerCounts[level] = size.depth;
+
+        if (size.depth &gt; 0)
+        {
+            mImageArray[level] = new ImageD3D*[size.depth];
+            for (int layer = 0; layer &lt; mLayerCounts[level]; layer++)
+            {
+                mImageArray[level][layer] = mRenderer-&gt;createImage();
+            }
+        }
</ins><span class="cx">     }
</span><del>-    delete[] mImageArray[level];
-    mImageArray[level] = NULL;
-    mLayerCounts[level] = size.depth;
</del><span class="cx"> 
</span><span class="cx">     if (size.depth &gt; 0)
</span><span class="cx">     {
</span><del>-        mImageArray[level] = new ImageD3D*[size.depth]();
-
</del><span class="cx">         for (int layer = 0; layer &lt; mLayerCounts[level]; layer++)
</span><span class="cx">         {
</span><del>-            mImageArray[level][layer] = mRenderer-&gt;createImage();
</del><span class="cx">             mImageArray[level][layer]-&gt;redefine(GL_TEXTURE_2D_ARRAY, internalformat,
</span><span class="cx">                                                 gl::Extents(size.width, size.height, 1), false);
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dTextureD3Dh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureD3D.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureD3D.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -20,9 +20,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><del>-
</del><ins>+class EGLImageD3D;
</ins><span class="cx"> class ImageD3D;
</span><del>-class ImageD3D;
</del><span class="cx"> class RendererD3D;
</span><span class="cx"> class RenderTargetD3D;
</span><span class="cx"> class TextureStorage;
</span><span class="lines">@@ -50,7 +49,6 @@
</span><span class="cx">     bool isImmutable() const { return mImmutable; }
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT) = 0;
</span><del>-    virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &amp;index) = 0;
</del><span class="cx"> 
</span><span class="cx">     // Returns an iterator over all &quot;Images&quot; for this particular Texture.
</span><span class="cx">     virtual gl::ImageIndexIterator imageIterator() const = 0;
</span><span class="lines">@@ -60,7 +58,7 @@
</span><span class="cx">     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const = 0;
</span><span class="cx">     virtual bool isValidIndex(const gl::ImageIndex &amp;index) const = 0;
</span><span class="cx"> 
</span><del>-    virtual gl::Error generateMipmaps(const gl::SamplerState &amp;samplerState);
</del><ins>+    gl::Error generateMipmaps(const gl::TextureState &amp;textureState) override;
</ins><span class="cx">     TextureStorage *getStorage();
</span><span class="cx">     ImageD3D *getBaseLevelImage() const;
</span><span class="cx"> 
</span><span class="lines">@@ -68,13 +66,17 @@
</span><span class="cx">                                         FramebufferAttachmentRenderTarget **rtOut) override;
</span><span class="cx"> 
</span><span class="cx">   protected:
</span><del>-    gl::Error setImage(const gl::ImageIndex &amp;index, GLenum type,
-                       const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels,
-                       ptrdiff_t layerOffset);
</del><ins>+    gl::Error setImageImpl(const gl::ImageIndex &amp;index,
+                           GLenum type,
+                           const gl::PixelUnpackState &amp;unpack,
+                           const uint8_t *pixels,
+                           ptrdiff_t layerOffset);
</ins><span class="cx">     gl::Error subImage(const gl::ImageIndex &amp;index, const gl::Box &amp;area, GLenum format, GLenum type,
</span><span class="cx">                        const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels, ptrdiff_t layerOffset);
</span><del>-    gl::Error setCompressedImage(const gl::ImageIndex &amp;index, const gl::PixelUnpackState &amp;unpack,
-                                 const uint8_t *pixels, ptrdiff_t layerOffset);
</del><ins>+    gl::Error setCompressedImageImpl(const gl::ImageIndex &amp;index,
+                                     const gl::PixelUnpackState &amp;unpack,
+                                     const uint8_t *pixels,
+                                     ptrdiff_t layerOffset);
</ins><span class="cx">     gl::Error subImageCompressed(const gl::ImageIndex &amp;index, const gl::Box &amp;area, GLenum format,
</span><span class="cx">                                  const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels, ptrdiff_t layerOffset);
</span><span class="cx">     bool isFastUnpackable(const gl::PixelUnpackState &amp;unpack, GLenum sizedInternalFormat);
</span><span class="lines">@@ -134,9 +136,9 @@
</span><span class="cx">                           const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</span><span class="cx"> 
</span><span class="cx">     gl::Error setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
</span><del>-                                 const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</del><ins>+                                 const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) override;
</ins><span class="cx">     gl::Error setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                    const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</del><ins>+                                    const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error copyImage(GLenum target, size_t level, const gl::Rectangle &amp;sourceArea, GLenum internalFormat,
</span><span class="cx">                         const gl::Framebuffer *source) override;
</span><span class="lines">@@ -148,8 +150,9 @@
</span><span class="cx">     virtual void bindTexImage(egl::Surface *surface);
</span><span class="cx">     virtual void releaseTexImage();
</span><span class="cx"> 
</span><ins>+    gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+
</ins><span class="cx">     virtual gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT);
</span><del>-    virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &amp;index);
</del><span class="cx"> 
</span><span class="cx">     virtual gl::ImageIndexIterator imageIterator() const;
</span><span class="cx">     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
</span><span class="lines">@@ -169,8 +172,12 @@
</span><span class="cx"> 
</span><span class="cx">     gl::Error updateStorageLevel(int level);
</span><span class="cx"> 
</span><del>-    void redefineImage(GLint level, GLenum internalformat, const gl::Extents &amp;size);
</del><ins>+    void redefineImage(size_t level,
+                       GLenum internalformat,
+                       const gl::Extents &amp;size,
+                       bool forceRelease);
</ins><span class="cx"> 
</span><ins>+    bool mEGLImageTarget;
</ins><span class="cx">     ImageD3D *mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -197,9 +204,9 @@
</span><span class="cx">                           const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</span><span class="cx"> 
</span><span class="cx">     gl::Error setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
</span><del>-                                 const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</del><ins>+                                 const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) override;
</ins><span class="cx">     gl::Error setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                    const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</del><ins>+                                    const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error copyImage(GLenum target, size_t level, const gl::Rectangle &amp;sourceArea, GLenum internalFormat,
</span><span class="cx">                         const gl::Framebuffer *source) override;
</span><span class="lines">@@ -211,8 +218,9 @@
</span><span class="cx">     virtual void bindTexImage(egl::Surface *surface);
</span><span class="cx">     virtual void releaseTexImage();
</span><span class="cx"> 
</span><ins>+    gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+
</ins><span class="cx">     virtual gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT);
</span><del>-    virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &amp;index);
</del><span class="cx"> 
</span><span class="cx">     virtual gl::ImageIndexIterator imageIterator() const;
</span><span class="cx">     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
</span><span class="lines">@@ -259,9 +267,9 @@
</span><span class="cx">                           const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</span><span class="cx"> 
</span><span class="cx">     gl::Error setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
</span><del>-                                 const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</del><ins>+                                 const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) override;
</ins><span class="cx">     gl::Error setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                    const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</del><ins>+                                    const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error copyImage(GLenum target, size_t level, const gl::Rectangle &amp;sourceArea, GLenum internalFormat,
</span><span class="cx">                         const gl::Framebuffer *source) override;
</span><span class="lines">@@ -273,8 +281,9 @@
</span><span class="cx">     virtual void bindTexImage(egl::Surface *surface);
</span><span class="cx">     virtual void releaseTexImage();
</span><span class="cx"> 
</span><ins>+    gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+
</ins><span class="cx">     virtual gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT);
</span><del>-    virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &amp;index);
</del><span class="cx"> 
</span><span class="cx">     virtual gl::ImageIndexIterator imageIterator() const;
</span><span class="cx">     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
</span><span class="lines">@@ -319,9 +328,9 @@
</span><span class="cx">                           const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</span><span class="cx"> 
</span><span class="cx">     gl::Error setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
</span><del>-                                 const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</del><ins>+                                 const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) override;
</ins><span class="cx">     gl::Error setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                    const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</del><ins>+                                    const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error copyImage(GLenum target, size_t level, const gl::Rectangle &amp;sourceArea, GLenum internalFormat,
</span><span class="cx">                         const gl::Framebuffer *source) override;
</span><span class="lines">@@ -333,8 +342,9 @@
</span><span class="cx">     virtual void bindTexImage(egl::Surface *surface);
</span><span class="cx">     virtual void releaseTexImage();
</span><span class="cx"> 
</span><ins>+    gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+
</ins><span class="cx">     virtual gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT);
</span><del>-    virtual unsigned int getRenderTargetSerial(const gl::ImageIndex &amp;index);
</del><span class="cx"> 
</span><span class="cx">     virtual gl::ImageIndexIterator imageIterator() const;
</span><span class="cx">     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dTextureStorageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureStorage.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureStorage.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/TextureStorage.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -33,8 +33,8 @@
</span><span class="cx"> class TextureStorage : angle::NonCopyable
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    TextureStorage();
-    virtual ~TextureStorage() {};
</del><ins>+    TextureStorage() {}
+    virtual ~TextureStorage() {}
</ins><span class="cx"> 
</span><span class="cx">     virtual int getTopLevel() const = 0;
</span><span class="cx">     virtual bool isRenderTarget() const = 0;
</span><span class="lines">@@ -49,18 +49,8 @@
</span><span class="cx">     virtual gl::Error setData(const gl::ImageIndex &amp;index, ImageD3D *image, const gl::Box *destBox, GLenum type,
</span><span class="cx">                               const gl::PixelUnpackState &amp;unpack, const uint8_t *pixelData) = 0;
</span><span class="cx"> 
</span><del>-    unsigned int getRenderTargetSerial(const gl::ImageIndex &amp;index) const;
-    unsigned int getTextureSerial() const;
-
</del><span class="cx">     // This is a no-op for most implementations of TextureStorage. Some (e.g. TextureStorage11_2D) might override it.
</span><span class="cx">     virtual gl::Error useLevelZeroWorkaroundTexture(bool useLevelZeroTexture) { return gl::Error(GL_NO_ERROR); }
</span><del>-
-  protected:
-    void initializeSerials(unsigned int rtSerialsToReserve, unsigned int rtSerialsLayerStride);
-
-  private:
-    unsigned int mFirstRenderTargetSerial;
-    unsigned int mRenderTargetSerialsLayerStride;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVaryingPackingcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VaryingPacking.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VaryingPacking.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VaryingPacking.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,397 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// VaryingPacking:
+//   Class which describes a mapping from varyings to registers in D3D
+//   for linking between shader stages.
+//
+
+#include &quot;libANGLE/renderer/d3d/VaryingPacking.h&quot;
+
+#include &quot;common/utilities.h&quot;
+#include &quot;compiler/translator/blocklayoutHLSL.h&quot;
+#include &quot;libANGLE/renderer/d3d/DynamicHLSL.h&quot;
+#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
+
+namespace rx
+{
+
+// Implementation of VaryingPacking::BuiltinVarying
+VaryingPacking::BuiltinVarying::BuiltinVarying() : enabled(false), index(0), systemValue(false)
+{
+}
+
+std::string VaryingPacking::BuiltinVarying::str() const
+{
+    return (systemValue ? semantic : (semantic + Str(index)));
+}
+
+void VaryingPacking::BuiltinVarying::enableSystem(const std::string &amp;systemValueSemantic)
+{
+    enabled     = true;
+    semantic    = systemValueSemantic;
+    systemValue = true;
+}
+
+void VaryingPacking::BuiltinVarying::enable(const std::string &amp;semanticVal, unsigned int indexVal)
+{
+    enabled  = true;
+    semantic = semanticVal;
+    index    = indexVal;
+}
+
+// Implementation of VaryingPacking
+VaryingPacking::VaryingPacking(GLuint maxVaryingVectors)
+    : mRegisterMap(maxVaryingVectors), mBuiltinInfo(SHADER_TYPE_MAX)
+{
+}
+
+// Packs varyings into generic varying registers, using the algorithm from
+// See [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111
+// Also [OpenGL ES Shading Language 3.00 rev. 4] Section 11 page 119
+// Returns false if unsuccessful.
+bool VaryingPacking::packVarying(const PackedVarying &amp;packedVarying)
+{
+    unsigned int varyingRows    = 0;
+    unsigned int varyingColumns = 0;
+
+    const auto &amp;varying = *packedVarying.varying;
+
+    // &quot;Non - square matrices of type matCxR consume the same space as a square matrix of type matN
+    // where N is the greater of C and R.Variables of type mat2 occupies 2 complete rows.&quot;
+    // Here we are a bit more conservative and allow packing non-square matrices more tightly.
+    // Make sure we use transposed matrix types to count registers correctly.
+    ASSERT(!varying.isStruct());
+    GLenum transposedType = gl::TransposeMatrixType(varying.type);
+    varyingRows           = gl::VariableRowCount(transposedType);
+    varyingColumns        = gl::VariableColumnCount(transposedType);
+
+    // &quot;Arrays of size N are assumed to take N times the size of the base type&quot;
+    varyingRows *= varying.elementCount();
+
+    unsigned int maxVaryingVectors = static_cast&lt;unsigned int&gt;(mRegisterMap.size());
+
+    // &quot;For 2, 3 and 4 component variables packing is started using the 1st column of the 1st row.
+    // Variables are then allocated to successive rows, aligning them to the 1st column.&quot;
+    if (varyingColumns &gt;= 2 &amp;&amp; varyingColumns &lt;= 4)
+    {
+        for (unsigned int row = 0; row &lt;= maxVaryingVectors - varyingRows; ++row)
+        {
+            if (isFree(row, 0, varyingRows, varyingColumns))
+            {
+                insert(row, 0, packedVarying);
+                return true;
+            }
+        }
+
+        // &quot;For 2 component variables, when there are no spare rows, the strategy is switched to
+        // using the highest numbered row and the lowest numbered column where the variable will
+        // fit.&quot;
+        if (varyingColumns == 2)
+        {
+            for (unsigned int r = maxVaryingVectors - varyingRows + 1; r-- &gt;= 1;)
+            {
+                if (isFree(r, 2, varyingRows, 2))
+                {
+                    insert(r, 2, packedVarying);
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    // &quot;1 component variables have their own packing rule. They are packed in order of size, largest
+    // first. Each variable is placed in the column that leaves the least amount of space in the
+    // column and aligned to the lowest available rows within that column.&quot;
+    ASSERT(varyingColumns == 1);
+    unsigned int contiguousSpace[4]     = {0};
+    unsigned int bestContiguousSpace[4] = {0};
+    unsigned int totalSpace[4]          = {0};
+
+    for (unsigned int row = 0; row &lt; maxVaryingVectors; ++row)
+    {
+        for (unsigned int column = 0; column &lt; 4; ++column)
+        {
+            if (mRegisterMap[row][column])
+            {
+                contiguousSpace[column] = 0;
+            }
+            else
+            {
+                contiguousSpace[column]++;
+                totalSpace[column]++;
+
+                if (contiguousSpace[column] &gt; bestContiguousSpace[column])
+                {
+                    bestContiguousSpace[column] = contiguousSpace[column];
+                }
+            }
+        }
+    }
+
+    unsigned int bestColumn = 0;
+    for (unsigned int column = 1; column &lt; 4; ++column)
+    {
+        if (bestContiguousSpace[column] &gt;= varyingRows &amp;&amp;
+            (bestContiguousSpace[bestColumn] &lt; varyingRows ||
+             totalSpace[column] &lt; totalSpace[bestColumn]))
+        {
+            bestColumn = column;
+        }
+    }
+
+    if (bestContiguousSpace[bestColumn] &gt;= varyingRows)
+    {
+        for (unsigned int row = 0; row &lt; maxVaryingVectors; row++)
+        {
+            if (isFree(row, bestColumn, varyingRows, 1))
+            {
+                for (unsigned int arrayIndex = 0; arrayIndex &lt; varyingRows; ++arrayIndex)
+                {
+                    // If varyingRows &gt; 1, it must be an array.
+                    PackedVaryingRegister registerInfo;
+                    registerInfo.packedVarying     = &amp;packedVarying;
+                    registerInfo.registerRow       = row + arrayIndex;
+                    registerInfo.registerColumn    = bestColumn;
+                    registerInfo.varyingArrayIndex = arrayIndex;
+                    registerInfo.varyingRowIndex = 0;
+                    mRegisterList.push_back(registerInfo);
+                    mRegisterMap[row + arrayIndex][bestColumn] = true;
+                }
+                break;
+            }
+        }
+        return true;
+    }
+
+    return false;
+}
+
+bool VaryingPacking::isFree(unsigned int registerRow,
+                            unsigned int registerColumn,
+                            unsigned int varyingRows,
+                            unsigned int varyingColumns) const
+{
+    for (unsigned int row = 0; row &lt; varyingRows; ++row)
+    {
+        ASSERT(registerRow + row &lt; mRegisterMap.size());
+        for (unsigned int column = 0; column &lt; varyingColumns; ++column)
+        {
+            ASSERT(registerColumn + column &lt; 4);
+            if (mRegisterMap[registerRow + row][registerColumn + column])
+            {
+                return false;
+            }
+        }
+    }
+
+    return true;
+}
+
+void VaryingPacking::insert(unsigned int registerRow,
+                            unsigned int registerColumn,
+                            const PackedVarying &amp;packedVarying)
+{
+    unsigned int varyingRows    = 0;
+    unsigned int varyingColumns = 0;
+
+    const auto &amp;varying = *packedVarying.varying;
+    ASSERT(!varying.isStruct());
+    GLenum transposedType = gl::TransposeMatrixType(varying.type);
+    varyingRows           = gl::VariableRowCount(transposedType);
+    varyingColumns        = gl::VariableColumnCount(transposedType);
+
+    PackedVaryingRegister registerInfo;
+    registerInfo.packedVarying  = &amp;packedVarying;
+    registerInfo.registerColumn = registerColumn;
+
+    for (unsigned int arrayElement = 0; arrayElement &lt; varying.elementCount(); ++arrayElement)
+    {
+        for (unsigned int varyingRow = 0; varyingRow &lt; varyingRows; ++varyingRow)
+        {
+            registerInfo.registerRow       = registerRow + (arrayElement * varyingRows) + varyingRow;
+            registerInfo.varyingRowIndex   = varyingRow;
+            registerInfo.varyingArrayIndex = arrayElement;
+            mRegisterList.push_back(registerInfo);
+
+            for (unsigned int columnIndex = 0; columnIndex &lt; varyingColumns; ++columnIndex)
+            {
+                mRegisterMap[registerInfo.registerRow][registerColumn + columnIndex] = true;
+            }
+        }
+    }
+}
+
+// See comment on packVarying.
+bool VaryingPacking::packVaryings(gl::InfoLog &amp;infoLog,
+                                  const std::vector&lt;PackedVarying&gt; &amp;packedVaryings,
+                                  const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings)
+{
+    std::set&lt;std::string&gt; uniqueVaryingNames;
+
+    // &quot;Variables are packed into the registers one at a time so that they each occupy a contiguous
+    // subrectangle. No splitting of variables is permitted.&quot;
+    for (const PackedVarying &amp;packedVarying : packedVaryings)
+    {
+        const auto &amp;varying = *packedVarying.varying;
+
+        // Do not assign registers to built-in or unreferenced varyings
+        if (varying.isBuiltIn() || (!varying.staticUse &amp;&amp; !packedVarying.isStructField()))
+        {
+            continue;
+        }
+
+        ASSERT(!varying.isStruct());
+        ASSERT(uniqueVaryingNames.count(varying.name) == 0);
+
+        if (packVarying(packedVarying))
+        {
+            uniqueVaryingNames.insert(varying.name);
+        }
+        else
+        {
+            infoLog &lt;&lt; &quot;Could not pack varying &quot; &lt;&lt; varying.name;
+            return false;
+        }
+    }
+
+    for (const std::string &amp;transformFeedbackVaryingName : transformFeedbackVaryings)
+    {
+        if (transformFeedbackVaryingName.compare(0, 3, &quot;gl_&quot;) == 0)
+        {
+            // do not pack builtin XFB varyings
+            continue;
+        }
+
+        for (const PackedVarying &amp;packedVarying : packedVaryings)
+        {
+            const auto &amp;varying = *packedVarying.varying;
+
+            // Make sure transform feedback varyings aren't optimized out.
+            if (uniqueVaryingNames.count(transformFeedbackVaryingName) == 0)
+            {
+                bool found = false;
+                if (transformFeedbackVaryingName == varying.name)
+                {
+                    if (!packVarying(packedVarying))
+                    {
+                        infoLog &lt;&lt; &quot;Could not pack varying &quot; &lt;&lt; varying.name;
+                        return false;
+                    }
+
+                    found = true;
+                    break;
+                }
+                if (!found)
+                {
+                    infoLog &lt;&lt; &quot;Transform feedback varying &quot; &lt;&lt; transformFeedbackVaryingName
+                            &lt;&lt; &quot; does not exist in the vertex shader.&quot;;
+                    return false;
+                }
+            }
+        }
+    }
+
+    // Sort the packed register list
+    std::sort(mRegisterList.begin(), mRegisterList.end());
+
+    // Assign semantic indices
+    for (unsigned int semanticIndex = 0;
+         semanticIndex &lt; static_cast&lt;unsigned int&gt;(mRegisterList.size()); ++semanticIndex)
+    {
+        mRegisterList[semanticIndex].semanticIndex = semanticIndex;
+    }
+
+    return true;
+}
+
+unsigned int VaryingPacking::getRegisterCount() const
+{
+    unsigned int count = 0;
+
+    for (const Register &amp;reg : mRegisterMap)
+    {
+        if (reg.data[0] || reg.data[1] || reg.data[2] || reg.data[3])
+        {
+            ++count;
+        }
+    }
+
+    if (mBuiltinInfo[SHADER_PIXEL].glFragCoord.enabled)
+    {
+        ++count;
+    }
+
+    if (mBuiltinInfo[SHADER_PIXEL].glPointCoord.enabled)
+    {
+        ++count;
+    }
+
+    return count;
+}
+
+void VaryingPacking::enableBuiltins(ShaderType shaderType,
+                                    const ProgramD3DMetadata &amp;programMetadata)
+{
+    int majorShaderModel = programMetadata.getRendererMajorShaderModel();
+    bool position        = programMetadata.usesTransformFeedbackGLPosition();
+    bool fragCoord       = programMetadata.usesFragCoord();
+    bool pointCoord = shaderType == SHADER_VERTEX ? programMetadata.addsPointCoordToVertexShader()
+                                                  : programMetadata.usesPointCoord();
+    bool pointSize                  = programMetadata.usesSystemValuePointSize();
+    bool hlsl4                      = (majorShaderModel &gt;= 4);
+    const std::string &amp;userSemantic = GetVaryingSemantic(majorShaderModel, pointSize);
+
+    unsigned int reservedSemanticIndex = getMaxSemanticIndex();
+
+    BuiltinInfo *builtins = &amp;mBuiltinInfo[shaderType];
+
+    if (hlsl4)
+    {
+        builtins-&gt;dxPosition.enableSystem(&quot;SV_Position&quot;);
+    }
+    else if (shaderType == SHADER_PIXEL)
+    {
+        builtins-&gt;dxPosition.enableSystem(&quot;VPOS&quot;);
+    }
+    else
+    {
+        builtins-&gt;dxPosition.enableSystem(&quot;POSITION&quot;);
+    }
+
+    if (position)
+    {
+        builtins-&gt;glPosition.enable(userSemantic, reservedSemanticIndex++);
+    }
+
+    if (fragCoord)
+    {
+        builtins-&gt;glFragCoord.enable(userSemantic, reservedSemanticIndex++);
+    }
+
+    if (pointCoord)
+    {
+        // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
+        // In D3D11 we manually compute gl_PointCoord in the GS.
+        if (hlsl4)
+        {
+            builtins-&gt;glPointCoord.enable(userSemantic, reservedSemanticIndex++);
+        }
+        else
+        {
+            builtins-&gt;glPointCoord.enable(&quot;TEXCOORD&quot;, 0);
+        }
+    }
+
+    // Special case: do not include PSIZE semantic in HLSL 3 pixel shaders
+    if (pointSize &amp;&amp; (shaderType != SHADER_PIXEL || hlsl4))
+    {
+        builtins-&gt;glPointSize.enableSystem(&quot;PSIZE&quot;);
+    }
+}
+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVaryingPackingh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VaryingPacking.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VaryingPacking.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VaryingPacking.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,175 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// VaryingPacking:
+//   Class which describes a mapping from varyings to registers in D3D
+//   for linking between shader stages.
+//
+
+#ifndef LIBANGLE_RENDERER_D3D_VARYINGPACKING_H_
+#define LIBANGLE_RENDERER_D3D_VARYINGPACKING_H_
+
+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
+
+namespace rx
+{
+class ProgramD3DMetadata;
+
+struct PackedVarying
+{
+    PackedVarying(const sh::ShaderVariable &amp;varyingIn, sh::InterpolationType interpolationIn)
+        : varying(&amp;varyingIn), vertexOnly(false), interpolation(interpolationIn)
+    {
+    }
+    PackedVarying(const sh::ShaderVariable &amp;varyingIn,
+                  sh::InterpolationType interpolationIn,
+                  const std::string &amp;parentStructNameIn)
+        : varying(&amp;varyingIn),
+          vertexOnly(false),
+          interpolation(interpolationIn),
+          parentStructName(parentStructNameIn)
+    {
+    }
+
+    bool isStructField() const { return !parentStructName.empty(); }
+
+    const sh::ShaderVariable *varying;
+
+    // Transform feedback varyings can be only referenced in the VS.
+    bool vertexOnly;
+
+    // Cached so we can store sh::ShaderVariable to point to varying fields.
+    sh::InterpolationType interpolation;
+
+    // Struct name
+    std::string parentStructName;
+};
+
+struct PackedVaryingRegister final
+{
+    PackedVaryingRegister()
+        : packedVarying(nullptr),
+          varyingArrayIndex(0),
+          varyingRowIndex(0),
+          registerRow(0),
+          registerColumn(0)
+    {
+    }
+
+    PackedVaryingRegister(const PackedVaryingRegister &amp;) = default;
+    PackedVaryingRegister &amp;operator=(const PackedVaryingRegister &amp;) = default;
+
+    bool operator&lt;(const PackedVaryingRegister &amp;other) const
+    {
+        return sortOrder() &lt; other.sortOrder();
+    }
+
+    unsigned int sortOrder() const
+    {
+        // TODO(jmadill): Handle interpolation types
+        return registerRow * 4 + registerColumn;
+    }
+
+    bool isStructField() const { return !structFieldName.empty(); }
+
+    // Index to the array of varyings.
+    const PackedVarying *packedVarying;
+
+    // The array element of the packed varying.
+    unsigned int varyingArrayIndex;
+
+    // The row of the array element of the packed varying.
+    unsigned int varyingRowIndex;
+
+    // The register row to which we've assigned this packed varying.
+    unsigned int registerRow;
+
+    // The column of the register row into which we've packed this varying.
+    unsigned int registerColumn;
+
+    // Assigned after packing
+    unsigned int semanticIndex;
+
+    // Struct member this varying corresponds to.
+    std::string structFieldName;
+};
+
+class VaryingPacking final : angle::NonCopyable
+{
+  public:
+    VaryingPacking(GLuint maxVaryingVectors);
+
+    bool packVaryings(gl::InfoLog &amp;infoLog,
+                      const std::vector&lt;PackedVarying&gt; &amp;packedVaryings,
+                      const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings);
+
+    struct Register
+    {
+        Register() { data[0] = data[1] = data[2] = data[3] = false; }
+
+        bool &amp;operator[](unsigned int index) { return data[index]; }
+        bool operator[](unsigned int index) const { return data[index]; }
+
+        bool data[4];
+    };
+
+    Register &amp;operator[](unsigned int index) { return mRegisterMap[index]; }
+    const Register &amp;operator[](unsigned int index) const { return mRegisterMap[index]; }
+
+    const std::vector&lt;PackedVaryingRegister&gt; &amp;getRegisterList() const { return mRegisterList; }
+    unsigned int getMaxSemanticIndex() const
+    {
+        return static_cast&lt;unsigned int&gt;(mRegisterList.size());
+    }
+    unsigned int getRegisterCount() const;
+
+    void enableBuiltins(ShaderType shaderType, const ProgramD3DMetadata &amp;programMetadata);
+
+    struct BuiltinVarying final : angle::NonCopyable
+    {
+        BuiltinVarying();
+
+        std::string str() const;
+        void enableSystem(const std::string &amp;systemValueSemantic);
+        void enable(const std::string &amp;semanticVal, unsigned int indexVal);
+
+        bool enabled;
+        std::string semantic;
+        unsigned int index;
+        bool systemValue;
+    };
+
+    struct BuiltinInfo
+    {
+        BuiltinVarying dxPosition;
+        BuiltinVarying glPosition;
+        BuiltinVarying glFragCoord;
+        BuiltinVarying glPointCoord;
+        BuiltinVarying glPointSize;
+    };
+
+    const BuiltinInfo &amp;builtins(ShaderType shaderType) const { return mBuiltinInfo[shaderType]; }
+
+    bool usesPointSize() const { return mBuiltinInfo[SHADER_VERTEX].glPointSize.enabled; }
+
+  private:
+    bool packVarying(const PackedVarying &amp;packedVarying);
+    bool isFree(unsigned int registerRow,
+                unsigned int registerColumn,
+                unsigned int varyingRows,
+                unsigned int varyingColumns) const;
+    void insert(unsigned int registerRow,
+                unsigned int registerColumn,
+                const PackedVarying &amp;packedVarying);
+
+    std::vector&lt;Register&gt; mRegisterMap;
+    std::vector&lt;PackedVaryingRegister&gt; mRegisterList;
+
+    std::vector&lt;BuiltinInfo&gt; mBuiltinInfo;
+};
+
+}  // namespace rx
+
+#endif  // LIBANGLE_RENDERER_D3D_VARYINGPACKING_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVertexBuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexBuffer.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexBuffer.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexBuffer.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,18 +8,19 @@
</span><span class="cx"> // class with derivations, classes that perform graphics API agnostic vertex buffer operations.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/VertexBuffer.h&quot;
</span><ins>+
+#include &quot;common/mathutil.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/BufferD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/VertexAttribute.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;common/mathutil.h&quot;
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+// VertexBuffer Implementation
</ins><span class="cx"> unsigned int VertexBuffer::mNextSerial = 1;
</span><span class="cx"> 
</span><del>-VertexBuffer::VertexBuffer()
</del><ins>+VertexBuffer::VertexBuffer() : mRefCount(1)
</ins><span class="cx"> {
</span><span class="cx">     updateSerial();
</span><span class="cx"> }
</span><span class="lines">@@ -38,19 +39,34 @@
</span><span class="cx">     return mSerial;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-VertexBufferInterface::VertexBufferInterface(BufferFactoryD3D *factory, bool dynamic)
-    : mFactory(factory)
</del><ins>+void VertexBuffer::addRef()
</ins><span class="cx"> {
</span><del>-    mDynamic = dynamic;
-    mWritePosition = 0;
-    mReservedSpace = 0;
</del><ins>+    mRefCount++;
+}
</ins><span class="cx"> 
</span><del>-    mVertexBuffer = factory-&gt;createVertexBuffer();
</del><ins>+void VertexBuffer::release()
+{
+    ASSERT(mRefCount &gt; 0);
+    mRefCount--;
+
+    if (mRefCount == 0)
+    {
+        delete this;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// VertexBufferInterface Implementation
+VertexBufferInterface::VertexBufferInterface(BufferFactoryD3D *factory, bool dynamic)
+    : mFactory(factory), mVertexBuffer(factory-&gt;createVertexBuffer()), mDynamic(dynamic)
+{
+}
+
</ins><span class="cx"> VertexBufferInterface::~VertexBufferInterface()
</span><span class="cx"> {
</span><del>-    delete mVertexBuffer;
</del><ins>+    if (mVertexBuffer)
+    {
+        mVertexBuffer-&gt;release();
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned int VertexBufferInterface::getSerial() const
</span><span class="lines">@@ -69,56 +85,91 @@
</span><span class="cx">     {
</span><span class="cx">         return mVertexBuffer-&gt;initialize(size, mDynamic);
</span><span class="cx">     }
</span><del>-    else
</del><ins>+
+    return mVertexBuffer-&gt;setBufferSize(size);
+}
+
+gl::ErrorOrResult&lt;unsigned int&gt; VertexBufferInterface::getSpaceRequired(
+    const gl::VertexAttribute &amp;attrib,
+    GLsizei count,
+    GLsizei instances) const
+{
+    unsigned int spaceRequired = 0;
+    ANGLE_TRY_RESULT(mFactory-&gt;getVertexSpaceRequired(attrib, count, instances), spaceRequired);
+
+    // Align to 16-byte boundary
+    unsigned int alignedSpaceRequired = roundUp(spaceRequired, 16u);
+
+    if (alignedSpaceRequired &lt; spaceRequired)
</ins><span class="cx">     {
</span><del>-        return mVertexBuffer-&gt;setBufferSize(size);
</del><ins>+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Vertex buffer overflow in VertexBufferInterface::getSpaceRequired.&quot;);
</ins><span class="cx">     }
</span><ins>+
+    return alignedSpaceRequired;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int VertexBufferInterface::getWritePosition() const
</del><ins>+gl::Error VertexBufferInterface::discard()
</ins><span class="cx"> {
</span><del>-    return mWritePosition;
</del><ins>+    return mVertexBuffer-&gt;discard();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void VertexBufferInterface::setWritePosition(unsigned int writePosition)
</del><ins>+VertexBuffer *VertexBufferInterface::getVertexBuffer() const
</ins><span class="cx"> {
</span><del>-    mWritePosition = writePosition;
</del><ins>+    return mVertexBuffer;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexBufferInterface::discard()
</del><ins>+// StreamingVertexBufferInterface Implementation
+StreamingVertexBufferInterface::StreamingVertexBufferInterface(BufferFactoryD3D *factory,
+                                                               std::size_t initialSize)
+    : VertexBufferInterface(factory, true), mWritePosition(0), mReservedSpace(0)
</ins><span class="cx"> {
</span><del>-    return mVertexBuffer-&gt;discard();
</del><ins>+    setBufferSize(static_cast&lt;unsigned int&gt;(initialSize));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexBufferInterface::storeVertexAttributes(const gl::VertexAttribute &amp;attrib, const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                                       GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset)
</del><ins>+StreamingVertexBufferInterface::~StreamingVertexBufferInterface()
</ins><span class="cx"> {
</span><del>-    gl::Error error(GL_NO_ERROR);
</del><ins>+}
</ins><span class="cx"> 
</span><del>-    unsigned int spaceRequired;
-    error = mVertexBuffer-&gt;getSpaceRequired(attrib, count, instances, &amp;spaceRequired);
-    if (error.isError())
</del><ins>+gl::Error StreamingVertexBufferInterface::reserveSpace(unsigned int size)
+{
+    unsigned int curBufferSize = getBufferSize();
+    if (size &gt; curBufferSize)
</ins><span class="cx">     {
</span><del>-        return error;
</del><ins>+        ANGLE_TRY(setBufferSize(std::max(size, 3 * curBufferSize / 2)));
+        mWritePosition = 0;
</ins><span class="cx">     }
</span><del>-
-    if (mWritePosition + spaceRequired &lt; mWritePosition)
</del><ins>+    else if (mWritePosition + size &gt; curBufferSize)
</ins><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal error, new vertex buffer write position would overflow.&quot;);
</del><ins>+        ANGLE_TRY(discard());
+        mWritePosition = 0;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    error = reserveSpace(mReservedSpace);
-    if (error.isError())
</del><ins>+    return gl::NoError();
+}
+
+gl::Error StreamingVertexBufferInterface::storeDynamicAttribute(const gl::VertexAttribute &amp;attrib,
+                                                                GLenum currentValueType,
+                                                                GLint start,
+                                                                GLsizei count,
+                                                                GLsizei instances,
+                                                                unsigned int *outStreamOffset,
+                                                                const uint8_t *sourceData)
+{
+    unsigned int spaceRequired = 0;
+    ANGLE_TRY_RESULT(getSpaceRequired(attrib, count, instances), spaceRequired);
+
+    // Protect against integer overflow
+    if (!IsUnsignedAdditionSafe(mWritePosition, spaceRequired))
</ins><span class="cx">     {
</span><del>-        return error;
</del><ins>+        return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal error, new vertex buffer write position would overflow.&quot;);
</ins><span class="cx">     }
</span><ins>+
+    ANGLE_TRY(reserveSpace(mReservedSpace));
</ins><span class="cx">     mReservedSpace = 0;
</span><span class="cx"> 
</span><del>-    error = mVertexBuffer-&gt;storeVertexAttributes(attrib, currentValue, start, count, instances, mWritePosition);
-    if (error.isError())
-    {
-        return error;
-    }
</del><ins>+    ANGLE_TRY(mVertexBuffer-&gt;storeVertexAttributes(attrib, currentValueType, start, count,
+                                                   instances, mWritePosition, sourceData));
</ins><span class="cx"> 
</span><span class="cx">     if (outStreamOffset)
</span><span class="cx">     {
</span><span class="lines">@@ -127,113 +178,65 @@
</span><span class="cx"> 
</span><span class="cx">     mWritePosition += spaceRequired;
</span><span class="cx"> 
</span><del>-    // Align to 16-byte boundary
-    mWritePosition = roundUp(mWritePosition, 16u);
-
-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexBufferInterface::reserveVertexSpace(const gl::VertexAttribute &amp;attrib, GLsizei count, GLsizei instances)
</del><ins>+gl::Error StreamingVertexBufferInterface::reserveVertexSpace(const gl::VertexAttribute &amp;attrib,
+                                                             GLsizei count,
+                                                             GLsizei instances)
</ins><span class="cx"> {
</span><del>-    gl::Error error(GL_NO_ERROR);
</del><ins>+    unsigned int requiredSpace = 0;
+    ANGLE_TRY_RESULT(mFactory-&gt;getVertexSpaceRequired(attrib, count, instances), requiredSpace);
</ins><span class="cx"> 
</span><del>-    unsigned int requiredSpace;
-    error = mVertexBuffer-&gt;getSpaceRequired(attrib, count, instances, &amp;requiredSpace);
-    if (error.isError())
-    {
-        return error;
-    }
</del><ins>+    // Align to 16-byte boundary
+    unsigned int alignedRequiredSpace = roundUp(requiredSpace, 16u);
</ins><span class="cx"> 
</span><span class="cx">     // Protect against integer overflow
</span><del>-    if (mReservedSpace + requiredSpace &lt; mReservedSpace)
</del><ins>+    if (!IsUnsignedAdditionSafe(mReservedSpace, alignedRequiredSpace) ||
+        alignedRequiredSpace &lt; requiredSpace)
</ins><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Unable to reserve %u extra bytes in internal vertex buffer, &quot;
-                         &quot;it would result in an overflow.&quot;, requiredSpace);
</del><ins>+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Unable to reserve %u extra bytes in internal vertex buffer, &quot;
+                         &quot;it would result in an overflow.&quot;,
+                         requiredSpace);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mReservedSpace += requiredSpace;
</del><ins>+    mReservedSpace += alignedRequiredSpace;
</ins><span class="cx"> 
</span><del>-    // Align to 16-byte boundary
-    mReservedSpace = roundUp(mReservedSpace, 16u);
-
-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-VertexBuffer* VertexBufferInterface::getVertexBuffer() const
</del><ins>+// StaticVertexBufferInterface Implementation
+StaticVertexBufferInterface::AttributeSignature::AttributeSignature()
+    : type(GL_NONE), size(0), stride(0), normalized(false), pureInteger(false), offset(0)
</ins><span class="cx"> {
</span><del>-    return mVertexBuffer;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool VertexBufferInterface::directStoragePossible(const gl::VertexAttribute &amp;attrib,
-                                                  const gl::VertexAttribCurrentValueData &amp;currentValue) const
</del><ins>+bool StaticVertexBufferInterface::AttributeSignature::matchesAttribute(
+    const gl::VertexAttribute &amp;attrib) const
</ins><span class="cx"> {
</span><del>-    gl::Buffer *buffer = attrib.buffer.get();
-    BufferD3D *storage = buffer ? GetImplAs&lt;BufferD3D&gt;(buffer) : NULL;
</del><ins>+    size_t attribStride = ComputeVertexAttributeStride(attrib);
</ins><span class="cx"> 
</span><del>-    if (!storage || !storage-&gt;supportsDirectBinding())
</del><ins>+    if (type != attrib.type || size != attrib.size || static_cast&lt;GLuint&gt;(stride) != attribStride ||
+        normalized != attrib.normalized || pureInteger != attrib.pureInteger)
</ins><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Alignment restrictions: In D3D, vertex data must be aligned to
-    //  the format stride, or to a 4-byte boundary, whichever is smaller.
-    //  (Undocumented, and experimentally confirmed)
-    size_t alignment = 4;
-    bool requiresConversion = false;
-
-    if (attrib.type != GL_FLOAT)
-    {
-        gl::VertexFormat vertexFormat(attrib, currentValue.Type);
-
-        unsigned int outputElementSize;
-        getVertexBuffer()-&gt;getSpaceRequired(attrib, 1, 0, &amp;outputElementSize);
-        alignment = std::min&lt;size_t&gt;(outputElementSize, 4);
-
-        // TODO(jmadill): add VertexFormatCaps
-        requiresConversion = (mFactory-&gt;getVertexConversionType(vertexFormat) &amp; VERTEX_CONVERT_CPU) != 0;
-    }
-
-    bool isAligned = (static_cast&lt;size_t&gt;(ComputeVertexAttributeStride(attrib)) % alignment == 0) &amp;&amp;
-                     (static_cast&lt;size_t&gt;(attrib.offset) % alignment == 0);
-
-    return !requiresConversion &amp;&amp; isAligned;
</del><ins>+    size_t attribOffset = (static_cast&lt;size_t&gt;(attrib.offset) % attribStride);
+    return (offset == attribOffset);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-StreamingVertexBufferInterface::StreamingVertexBufferInterface(BufferFactoryD3D *factory, std::size_t initialSize)
-    : VertexBufferInterface(factory, true)
</del><ins>+void StaticVertexBufferInterface::AttributeSignature::set(const gl::VertexAttribute &amp;attrib)
</ins><span class="cx"> {
</span><del>-    setBufferSize(initialSize);
</del><ins>+    type        = attrib.type;
+    size        = attrib.size;
+    normalized  = attrib.normalized;
+    pureInteger = attrib.pureInteger;
+    offset = stride = static_cast&lt;GLuint&gt;(ComputeVertexAttributeStride(attrib));
+    offset = static_cast&lt;size_t&gt;(attrib.offset) % ComputeVertexAttributeStride(attrib);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-StreamingVertexBufferInterface::~StreamingVertexBufferInterface()
-{
-}
-
-gl::Error StreamingVertexBufferInterface::reserveSpace(unsigned int size)
-{
-    unsigned int curBufferSize = getBufferSize();
-    if (size &gt; curBufferSize)
-    {
-        gl::Error error = setBufferSize(std::max(size, 3 * curBufferSize / 2));
-        if (error.isError())
-        {
-            return error;
-        }
-        setWritePosition(0);
-    }
-    else if (getWritePosition() + size &gt; curBufferSize)
-    {
-        gl::Error error = discard();
-        if (error.isError())
-        {
-            return error;
-        }
-        setWritePosition(0);
-    }
-
-    return gl::Error(GL_NO_ERROR);
-}
-
</del><span class="cx"> StaticVertexBufferInterface::StaticVertexBufferInterface(BufferFactoryD3D *factory)
</span><span class="cx">     : VertexBufferInterface(factory, false)
</span><span class="cx"> {
</span><span class="lines">@@ -243,69 +246,33 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool StaticVertexBufferInterface::lookupAttribute(const gl::VertexAttribute &amp;attrib, unsigned int *outStreamOffset)
</del><ins>+bool StaticVertexBufferInterface::matchesAttribute(const gl::VertexAttribute &amp;attrib) const
</ins><span class="cx"> {
</span><del>-    for (unsigned int element = 0; element &lt; mCache.size(); element++)
-    {
-        if (mCache[element].type == attrib.type &amp;&amp;
-            mCache[element].size == attrib.size &amp;&amp;
-            mCache[element].stride == ComputeVertexAttributeStride(attrib) &amp;&amp;
-            mCache[element].normalized == attrib.normalized &amp;&amp;
-            mCache[element].pureInteger == attrib.pureInteger)
-        {
-            size_t offset = (static_cast&lt;size_t&gt;(attrib.offset) % ComputeVertexAttributeStride(attrib));
-            if (mCache[element].attributeOffset == offset)
-            {
-                if (outStreamOffset)
-                {
-                    *outStreamOffset = mCache[element].streamOffset;
-                }
-                return true;
-            }
-        }
-    }
-
-    return false;
</del><ins>+    return mSignature.matchesAttribute(attrib);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error StaticVertexBufferInterface::reserveSpace(unsigned int size)
</del><ins>+void StaticVertexBufferInterface::setAttribute(const gl::VertexAttribute &amp;attrib)
</ins><span class="cx"> {
</span><del>-    unsigned int curSize = getBufferSize();
-    if (curSize == 0)
-    {
-        return setBufferSize(size);
-    }
-    else if (curSize &gt;= size)
-    {
-        return gl::Error(GL_NO_ERROR);
-    }
-    else
-    {
-        UNREACHABLE();
-        return gl::Error(GL_INVALID_OPERATION, &quot;Internal error, Static vertex buffers can't be resized.&quot;);
-    }
</del><ins>+    return mSignature.set(attrib);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error StaticVertexBufferInterface::storeVertexAttributes(const gl::VertexAttribute &amp;attrib, const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                                             GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset)
</del><ins>+gl::Error StaticVertexBufferInterface::storeStaticAttribute(const gl::VertexAttribute &amp;attrib,
+                                                            GLint start,
+                                                            GLsizei count,
+                                                            GLsizei instances,
+                                                            const uint8_t *sourceData)
</ins><span class="cx"> {
</span><del>-    unsigned int streamOffset;
-    gl::Error error = VertexBufferInterface::storeVertexAttributes(attrib, currentValue, start, count, instances, &amp;streamOffset);
-    if (error.isError())
-    {
-        return error;
-    }
</del><ins>+    unsigned int spaceRequired = 0;
+    ANGLE_TRY_RESULT(getSpaceRequired(attrib, count, instances), spaceRequired);
+    setBufferSize(spaceRequired);
</ins><span class="cx"> 
</span><del>-    size_t attributeOffset = static_cast&lt;size_t&gt;(attrib.offset) % ComputeVertexAttributeStride(attrib);
-    VertexElement element = { attrib.type, attrib.size, static_cast&lt;GLuint&gt;(ComputeVertexAttributeStride(attrib)), attrib.normalized, attrib.pureInteger, attributeOffset, streamOffset };
-    mCache.push_back(element);
</del><ins>+    ASSERT(attrib.enabled);
+    ANGLE_TRY(mVertexBuffer-&gt;storeVertexAttributes(attrib, GL_NONE, start, count, instances, 0,
+                                                   sourceData));
</ins><span class="cx"> 
</span><del>-    if (outStreamOffset)
-    {
-        *outStreamOffset = streamOffset;
-    }
-
-    return gl::Error(GL_NO_ERROR);
</del><ins>+    mSignature.set(attrib);
+    mVertexBuffer-&gt;hintUnmapResource();
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVertexBufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexBuffer.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexBuffer.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexBuffer.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,6 +16,7 @@
</span><span class="cx"> #include &lt;GLES2/gl2.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;cstddef&gt;
</span><ins>+#include &lt;cstdint&gt;
</ins><span class="cx"> #include &lt;vector&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="lines">@@ -28,18 +29,22 @@
</span><span class="cx"> {
</span><span class="cx"> class BufferFactoryD3D;
</span><span class="cx"> 
</span><ins>+// Use a ref-counting scheme with self-deletion on release. We do this so that we can more
+// easily manage the static buffer cache, without deleting currently bound buffers.
</ins><span class="cx"> class VertexBuffer : angle::NonCopyable
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     VertexBuffer();
</span><del>-    virtual ~VertexBuffer();
</del><span class="cx"> 
</span><span class="cx">     virtual gl::Error initialize(unsigned int size, bool dynamicUsage) = 0;
</span><span class="cx"> 
</span><del>-    virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &amp;attrib, const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                            GLint start, GLsizei count, GLsizei instances, unsigned int offset) = 0;
-    virtual gl::Error getSpaceRequired(const gl::VertexAttribute &amp;attrib, GLsizei count, GLsizei instances,
-                                       unsigned int *outSpaceRequired) const = 0;
</del><ins>+    virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &amp;attrib,
+                                            GLenum currentValueType,
+                                            GLint start,
+                                            GLsizei count,
+                                            GLsizei instances,
+                                            unsigned int offset,
+                                            const uint8_t *sourceData) = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual unsigned int getBufferSize() const = 0;
</span><span class="cx">     virtual gl::Error setBufferSize(unsigned int size) = 0;
</span><span class="lines">@@ -50,12 +55,18 @@
</span><span class="cx">     // This may be overridden (e.g. by VertexBuffer11) if necessary.
</span><span class="cx">     virtual void hintUnmapResource() { };
</span><span class="cx"> 
</span><ins>+    // Reference counting.
+    void addRef();
+    void release();
+
</ins><span class="cx">   protected:
</span><span class="cx">     void updateSerial();
</span><ins>+    virtual ~VertexBuffer();
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     unsigned int mSerial;
</span><span class="cx">     static unsigned int mNextSerial;
</span><ins>+    unsigned int mRefCount;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class VertexBufferInterface : angle::NonCopyable
</span><span class="lines">@@ -64,37 +75,22 @@
</span><span class="cx">     VertexBufferInterface(BufferFactoryD3D *factory, bool dynamic);
</span><span class="cx">     virtual ~VertexBufferInterface();
</span><span class="cx"> 
</span><del>-    gl::Error reserveVertexSpace(const gl::VertexAttribute &amp;attribute, GLsizei count, GLsizei instances);
-
</del><span class="cx">     unsigned int getBufferSize() const;
</span><ins>+    bool empty() const { return getBufferSize() == 0; }
</ins><span class="cx"> 
</span><span class="cx">     unsigned int getSerial() const;
</span><span class="cx"> 
</span><del>-    virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &amp;attrib, const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                            GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset);
</del><ins>+    VertexBuffer *getVertexBuffer() const;
</ins><span class="cx"> 
</span><del>-    bool directStoragePossible(const gl::VertexAttribute &amp;attrib,
-                               const gl::VertexAttribCurrentValueData &amp;currentValue) const;
-
-    VertexBuffer* getVertexBuffer() const;
-
</del><span class="cx">   protected:
</span><del>-    virtual gl::Error reserveSpace(unsigned int size) = 0;
-
-    unsigned int getWritePosition() const;
-    void setWritePosition(unsigned int writePosition);
-
</del><span class="cx">     gl::Error discard();
</span><span class="cx"> 
</span><span class="cx">     gl::Error setBufferSize(unsigned int size);
</span><del>-
-  private:
</del><ins>+    gl::ErrorOrResult&lt;unsigned int&gt; getSpaceRequired(const gl::VertexAttribute &amp;attrib,
+                                                     GLsizei count,
+                                                     GLsizei instances) const;
</ins><span class="cx">     BufferFactoryD3D *const mFactory;
</span><del>-
-    VertexBuffer* mVertexBuffer;
-
-    unsigned int mWritePosition;
-    unsigned int mReservedSpace;
</del><ins>+    VertexBuffer *mVertexBuffer;
</ins><span class="cx">     bool mDynamic;
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -104,8 +100,23 @@
</span><span class="cx">     StreamingVertexBufferInterface(BufferFactoryD3D *factory, std::size_t initialSize);
</span><span class="cx">     ~StreamingVertexBufferInterface();
</span><span class="cx"> 
</span><del>-  protected:
</del><ins>+    gl::Error storeDynamicAttribute(const gl::VertexAttribute &amp;attrib,
+                                    GLenum currentValueType,
+                                    GLint start,
+                                    GLsizei count,
+                                    GLsizei instances,
+                                    unsigned int *outStreamOffset,
+                                    const uint8_t *sourceData);
+
+    gl::Error reserveVertexSpace(const gl::VertexAttribute &amp;attribute,
+                                 GLsizei count,
+                                 GLsizei instances);
+
+  private:
</ins><span class="cx">     gl::Error reserveSpace(unsigned int size);
</span><ins>+
+    unsigned int mWritePosition;
+    unsigned int mReservedSpace;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class StaticVertexBufferInterface : public VertexBufferInterface
</span><span class="lines">@@ -114,30 +125,35 @@
</span><span class="cx">     explicit StaticVertexBufferInterface(BufferFactoryD3D *factory);
</span><span class="cx">     ~StaticVertexBufferInterface();
</span><span class="cx"> 
</span><del>-    gl::Error storeVertexAttributes(const gl::VertexAttribute &amp;attrib, const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                    GLint start, GLsizei count, GLsizei instances, unsigned int *outStreamOffset);
</del><ins>+    gl::Error storeStaticAttribute(const gl::VertexAttribute &amp;attrib,
+                                   GLint start,
+                                   GLsizei count,
+                                   GLsizei instances,
+                                   const uint8_t *sourceData);
</ins><span class="cx"> 
</span><del>-    bool lookupAttribute(const gl::VertexAttribute &amp;attribute, unsigned int* outStreamFffset);
</del><ins>+    bool matchesAttribute(const gl::VertexAttribute &amp;attribute) const;
+    void setAttribute(const gl::VertexAttribute &amp;attribute);
</ins><span class="cx"> 
</span><del>-  protected:
-    gl::Error reserveSpace(unsigned int size);
-
</del><span class="cx">   private:
</span><del>-    struct VertexElement
</del><ins>+    class AttributeSignature final : angle::NonCopyable
</ins><span class="cx">     {
</span><ins>+      public:
+        AttributeSignature();
+        bool matchesAttribute(const gl::VertexAttribute &amp;attrib) const;
+        void set(const gl::VertexAttribute &amp;attrib);
+
+      private:
</ins><span class="cx">         GLenum type;
</span><span class="cx">         GLuint size;
</span><span class="cx">         GLuint stride;
</span><span class="cx">         bool normalized;
</span><span class="cx">         bool pureInteger;
</span><del>-        size_t attributeOffset;
-
-        unsigned int streamOffset;
</del><ins>+        size_t offset;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><del>-    std::vector&lt;VertexElement&gt; mCache;
</del><ins>+    AttributeSignature mSignature;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVertexDataManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexDataManager.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexDataManager.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexDataManager.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,25 +9,32 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/VertexDataManager.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/BitSetIterator.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Buffer.h&quot;
</span><ins>+#include &quot;libANGLE/formatutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Program.h&quot;
</span><span class="cx"> #include &quot;libANGLE/State.h&quot;
</span><span class="cx"> #include &quot;libANGLE/VertexAttribute.h&quot;
</span><span class="cx"> #include &quot;libANGLE/VertexArray.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/BufferD3D.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/VertexBuffer.h&quot;
</span><span class="cx"> 
</span><ins>+namespace rx
+{
</ins><span class="cx"> namespace
</span><span class="cx"> {
</span><del>-    enum { INITIAL_STREAM_BUFFER_SIZE = 1024*1024 };
-    // This has to be at least 4k or else it fails on ATI cards.
-    enum { CONSTANT_VERTEX_BUFFER_SIZE = 4096 };
-}
-
-namespace rx
</del><ins>+enum
</ins><span class="cx"> {
</span><ins>+    INITIAL_STREAM_BUFFER_SIZE = 1024 * 1024
+};
+// This has to be at least 4k or else it fails on ATI cards.
+enum
+{
+    CONSTANT_VERTEX_BUFFER_SIZE = 4096
+};
</ins><span class="cx"> 
</span><del>-static int ElementsInBuffer(const gl::VertexAttribute &amp;attrib, unsigned int size)
</del><ins>+int ElementsInBuffer(const gl::VertexAttribute &amp;attrib, unsigned int size)
</ins><span class="cx"> {
</span><span class="cx">     // Size cannot be larger than a GLsizei
</span><span class="cx">     if (size &gt; static_cast&lt;unsigned int&gt;(std::numeric_limits&lt;int&gt;::max()))
</span><span class="lines">@@ -35,362 +42,555 @@
</span><span class="cx">         size = static_cast&lt;unsigned int&gt;(std::numeric_limits&lt;int&gt;::max());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    GLsizei stride = ComputeVertexAttributeStride(attrib);
-    return (size - attrib.offset % stride + (stride - ComputeVertexAttributeTypeSize(attrib))) / stride;
</del><ins>+    GLsizei stride = static_cast&lt;GLsizei&gt;(ComputeVertexAttributeStride(attrib));
+    return (size - attrib.offset % stride +
+            (stride - static_cast&lt;GLsizei&gt;(ComputeVertexAttributeTypeSize(attrib)))) /
+           stride;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static int StreamingBufferElementCount(const gl::VertexAttribute &amp;attrib, int vertexDrawCount, int instanceDrawCount)
</del><ins>+bool DirectStoragePossible(const gl::VertexAttribute &amp;attrib)
</ins><span class="cx"> {
</span><del>-    // For instanced rendering, we draw &quot;instanceDrawCount&quot; sets of &quot;vertexDrawCount&quot; vertices.
-    //
-    // A vertex attribute with a positive divisor loads one instanced vertex for every set of
-    // non-instanced vertices, and the instanced vertex index advances once every &quot;mDivisor&quot; instances.
-    if (instanceDrawCount &gt; 0 &amp;&amp; attrib.divisor &gt; 0)
</del><ins>+    // Current value attribs may not use direct storage.
+    if (!attrib.enabled)
</ins><span class="cx">     {
</span><del>-        // When instanceDrawCount is not a multiple attrib.divisor, the division must round up.
-        // For instance, with 5 non-instanced vertices and a divisor equal to 3, we need 2 instanced vertices.
-        return (instanceDrawCount + attrib.divisor - 1) / attrib.divisor;
</del><ins>+        return false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return vertexDrawCount;
-}
</del><ins>+    gl::Buffer *buffer = attrib.buffer.get();
+    if (!buffer)
+    {
+        return false;
+    }
</ins><span class="cx"> 
</span><del>-VertexDataManager::VertexDataManager(BufferFactoryD3D *factory)
-    : mFactory(factory)
-{
-    for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+    BufferD3D *bufferD3D = GetImplAs&lt;BufferD3D&gt;(buffer);
+    ASSERT(bufferD3D);
+    if (!bufferD3D-&gt;supportsDirectBinding())
</ins><span class="cx">     {
</span><del>-        mCurrentValue[i].FloatValues[0] = std::numeric_limits&lt;float&gt;::quiet_NaN();
-        mCurrentValue[i].FloatValues[1] = std::numeric_limits&lt;float&gt;::quiet_NaN();
-        mCurrentValue[i].FloatValues[2] = std::numeric_limits&lt;float&gt;::quiet_NaN();
-        mCurrentValue[i].FloatValues[3] = std::numeric_limits&lt;float&gt;::quiet_NaN();
-        mCurrentValue[i].Type = GL_FLOAT;
-        mCurrentValueBuffer[i] = NULL;
-        mCurrentValueOffsets[i] = 0;
</del><ins>+        return false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mStreamingBuffer = new StreamingVertexBufferInterface(factory, INITIAL_STREAM_BUFFER_SIZE);
</del><ins>+    // Alignment restrictions: In D3D, vertex data must be aligned to the format stride, or to a
+    // 4-byte boundary, whichever is smaller. (Undocumented, and experimentally confirmed)
+    size_t alignment = 4;
</ins><span class="cx"> 
</span><del>-    if (!mStreamingBuffer)
</del><ins>+    if (attrib.type != GL_FLOAT)
</ins><span class="cx">     {
</span><del>-        ERR(&quot;Failed to allocate the streaming vertex buffer.&quot;);
</del><ins>+        gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib);
+
+        // TODO(jmadill): add VertexFormatCaps
+        BufferFactoryD3D *factory = bufferD3D-&gt;getFactory();
+
+        auto errorOrElementSize = factory-&gt;getVertexSpaceRequired(attrib, 1, 0);
+        if (errorOrElementSize.isError())
+        {
+            ERR(&quot;Unlogged error in DirectStoragePossible.&quot;);
+            return false;
+        }
+
+        alignment = std::min&lt;size_t&gt;(errorOrElementSize.getResult(), 4);
+
+        // CPU-converted vertex data must be converted (naturally).
+        if ((factory-&gt;getVertexConversionType(vertexFormatType) &amp; VERTEX_CONVERT_CPU) != 0)
+        {
+            return false;
+        }
</ins><span class="cx">     }
</span><ins>+
+    // Final alignment check - unaligned data must be converted.
+    return (static_cast&lt;size_t&gt;(ComputeVertexAttributeStride(attrib)) % alignment == 0) &amp;&amp;
+           (static_cast&lt;size_t&gt;(attrib.offset) % alignment == 0);
</ins><span class="cx"> }
</span><ins>+}  // anonymous namespace
</ins><span class="cx"> 
</span><del>-VertexDataManager::~VertexDataManager()
</del><ins>+TranslatedAttribute::TranslatedAttribute()
+    : active(false),
+      attribute(nullptr),
+      currentValueType(GL_NONE),
+      baseOffset(0),
+      usesFirstVertexOffset(false),
+      stride(0),
+      vertexBuffer(),
+      storage(nullptr),
+      serial(0),
+      divisor(0)
</ins><span class="cx"> {
</span><del>-    delete mStreamingBuffer;
</del><ins>+}
</ins><span class="cx"> 
</span><del>-    for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+gl::ErrorOrResult&lt;unsigned int&gt; TranslatedAttribute::computeOffset(GLint startVertex) const
+{
+    unsigned int offset = baseOffset;
+    if (usesFirstVertexOffset)
</ins><span class="cx">     {
</span><del>-        delete mCurrentValueBuffer[i];
</del><ins>+        unsigned int startVertexUnsigned = static_cast&lt;unsigned int&gt;(startVertex);
+
+        if (!IsUnsignedMultiplicationSafe(stride, startVertexUnsigned))
+        {
+            return gl::Error(GL_INVALID_OPERATION,
+                             &quot;Multiplication overflow in TranslatedAttribute::computeOffset&quot;);
+        }
+
+        unsigned int strideOffset = stride * startVertexUnsigned;
+        if (!IsUnsignedAdditionSafe(offset, strideOffset))
+        {
+            return gl::Error(GL_INVALID_OPERATION,
+                             &quot;Addition overflow in TranslatedAttribute::computeOffset&quot;);
+        }
+
+        offset += strideOffset;
</ins><span class="cx">     }
</span><ins>+    return offset;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void VertexDataManager::hintUnmapAllResources(const std::vector&lt;gl::VertexAttribute&gt; &amp;vertexAttributes)
</del><ins>+VertexStorageType ClassifyAttributeStorage(const gl::VertexAttribute &amp;attrib)
</ins><span class="cx"> {
</span><del>-    mStreamingBuffer-&gt;getVertexBuffer()-&gt;hintUnmapResource();
</del><ins>+    // If attribute is disabled, we use the current value.
+    if (!attrib.enabled)
+    {
+        return VertexStorageType::CURRENT_VALUE;
+    }
</ins><span class="cx"> 
</span><del>-    for (size_t i = 0; i &lt; vertexAttributes.size(); i++)
</del><ins>+    // If specified with immediate data, we must use dynamic storage.
+    auto *buffer = attrib.buffer.get();
+    if (!buffer)
</ins><span class="cx">     {
</span><del>-        const gl::VertexAttribute &amp;attrib = vertexAttributes[i];
-        if (attrib.enabled)
-        {
-            gl::Buffer *buffer = attrib.buffer.get();
-            BufferD3D *storage = buffer ? GetImplAs&lt;BufferD3D&gt;(buffer) : NULL;
-            StaticVertexBufferInterface *staticBuffer = storage ? storage-&gt;getStaticVertexBuffer() : NULL;
</del><ins>+        return VertexStorageType::DYNAMIC;
+    }
</ins><span class="cx"> 
</span><del>-            if (staticBuffer)
-            {
-                staticBuffer-&gt;getVertexBuffer()-&gt;hintUnmapResource();
-            }
-        }
</del><ins>+    // Check if the buffer supports direct storage.
+    if (DirectStoragePossible(attrib))
+    {
+        return VertexStorageType::DIRECT;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+    // Otherwise the storage is static or dynamic.
+    BufferD3D *bufferD3D = GetImplAs&lt;BufferD3D&gt;(buffer);
+    ASSERT(bufferD3D);
+    switch (bufferD3D-&gt;getUsage())
</ins><span class="cx">     {
</span><del>-        if (mCurrentValueBuffer[i] != NULL)
-        {
-            mCurrentValueBuffer[i]-&gt;getVertexBuffer()-&gt;hintUnmapResource();
-        }
</del><ins>+        case D3DBufferUsage::DYNAMIC:
+            return VertexStorageType::DYNAMIC;
+        case D3DBufferUsage::STATIC:
+            return VertexStorageType::STATIC;
+        default:
+            UNREACHABLE();
+            return VertexStorageType::UNKNOWN;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexDataManager::prepareVertexData(const gl::State &amp;state, GLint start, GLsizei count,
-                                               TranslatedAttribute *translated, GLsizei instances)
</del><ins>+VertexDataManager::CurrentValueState::CurrentValueState()
+    : buffer(nullptr),
+      offset(0)
</ins><span class="cx"> {
</span><ins>+    data.FloatValues[0] = std::numeric_limits&lt;float&gt;::quiet_NaN();
+    data.FloatValues[1] = std::numeric_limits&lt;float&gt;::quiet_NaN();
+    data.FloatValues[2] = std::numeric_limits&lt;float&gt;::quiet_NaN();
+    data.FloatValues[3] = std::numeric_limits&lt;float&gt;::quiet_NaN();
+    data.Type = GL_FLOAT;
+}
+
+VertexDataManager::CurrentValueState::~CurrentValueState()
+{
+    SafeDelete(buffer);
+}
+
+VertexDataManager::VertexDataManager(BufferFactoryD3D *factory)
+    : mFactory(factory),
+      mStreamingBuffer(nullptr),
+      // TODO(jmadill): use context caps
+      mCurrentValueCache(gl::MAX_VERTEX_ATTRIBS)
+{
+    mStreamingBuffer = new StreamingVertexBufferInterface(factory, INITIAL_STREAM_BUFFER_SIZE);
+
</ins><span class="cx">     if (!mStreamingBuffer)
</span><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal streaming vertex buffer is unexpectedly NULL.&quot;);
</del><ins>+        ERR(&quot;Failed to allocate the streaming vertex buffer.&quot;);
</ins><span class="cx">     }
</span><ins>+}
</ins><span class="cx"> 
</span><ins>+VertexDataManager::~VertexDataManager()
+{
+    SafeDelete(mStreamingBuffer);
+}
+
+gl::Error VertexDataManager::prepareVertexData(const gl::State &amp;state,
+                                               GLint start,
+                                               GLsizei count,
+                                               std::vector&lt;TranslatedAttribute&gt; *translatedAttribs,
+                                               GLsizei instances)
+{
+    ASSERT(mStreamingBuffer);
+
</ins><span class="cx">     const gl::VertexArray *vertexArray = state.getVertexArray();
</span><del>-    const std::vector&lt;gl::VertexAttribute&gt; &amp;vertexAttributes = vertexArray-&gt;getVertexAttributes();
</del><ins>+    const auto &amp;vertexAttributes       = vertexArray-&gt;getVertexAttributes();
</ins><span class="cx"> 
</span><del>-    // Invalidate static buffers that don't contain matching attributes
-    for (int attributeIndex = 0; attributeIndex &lt; gl::MAX_VERTEX_ATTRIBS; attributeIndex++)
</del><ins>+    mDynamicAttribsMaskCache.reset();
+    const gl::Program *program = state.getProgram();
+
+    translatedAttribs-&gt;clear();
+
+    for (size_t attribIndex = 0; attribIndex &lt; vertexAttributes.size(); ++attribIndex)
</ins><span class="cx">     {
</span><del>-        translated[attributeIndex].active = (state.getProgram()-&gt;getSemanticIndex(attributeIndex) != -1);
-        if (translated[attributeIndex].active &amp;&amp; vertexAttributes[attributeIndex].enabled)
-        {
-            invalidateMatchingStaticData(vertexAttributes[attributeIndex], state.getVertexAttribCurrentValue(attributeIndex));
-        }
-    }
</del><ins>+        // Skip attrib locations the program doesn't use.
+        if (!program-&gt;isAttribLocationActive(attribIndex))
+            continue;
</ins><span class="cx"> 
</span><del>-    // Reserve the required space in the buffers
-    for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
-    {
-        if (translated[i].active &amp;&amp; vertexAttributes[i].enabled)
</del><ins>+        const auto &amp;attrib = vertexAttributes[attribIndex];
+
+        // Resize automatically puts in empty attribs
+        translatedAttribs-&gt;resize(attribIndex + 1);
+
+        TranslatedAttribute *translated = &amp;(*translatedAttribs)[attribIndex];
+        auto currentValueData =
+            state.getVertexAttribCurrentValue(static_cast&lt;unsigned int&gt;(attribIndex));
+
+        // Record the attribute now
+        translated-&gt;active           = true;
+        translated-&gt;attribute        = &amp;attrib;
+        translated-&gt;currentValueType = currentValueData.Type;
+        translated-&gt;divisor          = attrib.divisor;
+
+        switch (ClassifyAttributeStorage(attrib))
</ins><span class="cx">         {
</span><del>-            gl::Error error = reserveSpaceForAttrib(vertexAttributes[i], state.getVertexAttribCurrentValue(i), count, instances);
-            if (error.isError())
</del><ins>+            case VertexStorageType::STATIC:
</ins><span class="cx">             {
</span><del>-                return error;
</del><ins>+                // Store static attribute.
+                ANGLE_TRY(StoreStaticAttrib(translated, count, instances));
+                break;
</ins><span class="cx">             }
</span><ins>+            case VertexStorageType::DYNAMIC:
+                // Dynamic attributes must be handled together.
+                mDynamicAttribsMaskCache.set(attribIndex);
+                break;
+            case VertexStorageType::DIRECT:
+                // Update translated data for direct attributes.
+                StoreDirectAttrib(translated);
+                break;
+            case VertexStorageType::CURRENT_VALUE:
+            {
+                ANGLE_TRY(storeCurrentValue(currentValueData, translated, attribIndex));
+                break;
+            }
+            default:
+                UNREACHABLE();
+                break;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Perform the vertex data translations
-    for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+    if (mDynamicAttribsMaskCache.none())
</ins><span class="cx">     {
</span><del>-        const gl::VertexAttribute &amp;curAttrib = vertexAttributes[i];
-        if (translated[i].active)
-        {
-            if (curAttrib.enabled)
-            {
-                gl::Error error = storeAttribute(curAttrib, state.getVertexAttribCurrentValue(i),
-                                                 &amp;translated[i], start, count, instances);
</del><ins>+        return gl::NoError();
+    }
</ins><span class="cx"> 
</span><del>-                if (error.isError())
-                {
-                    hintUnmapAllResources(vertexAttributes);
-                    return error;
-                }
-            }
-            else
-            {
-                if (!mCurrentValueBuffer[i])
-                {
-                    mCurrentValueBuffer[i] = new StreamingVertexBufferInterface(mFactory, CONSTANT_VERTEX_BUFFER_SIZE);
-                }
</del><ins>+    ANGLE_TRY(
+        storeDynamicAttribs(translatedAttribs, mDynamicAttribsMaskCache, start, count, instances));
</ins><span class="cx"> 
</span><del>-                gl::Error error = storeCurrentValue(curAttrib, state.getVertexAttribCurrentValue(i), &amp;translated[i],
-                                                    &amp;mCurrentValue[i], &amp;mCurrentValueOffsets[i],
-                                                    mCurrentValueBuffer[i]);
-                if (error.isError())
-                {
-                    hintUnmapAllResources(vertexAttributes);
-                    return error;
-                }
-            }
-        }
</del><ins>+    PromoteDynamicAttribs(*translatedAttribs, mDynamicAttribsMaskCache, count);
+
+    return gl::NoError();
+}
+
+// static
+void VertexDataManager::StoreDirectAttrib(TranslatedAttribute *directAttrib)
+{
+    const auto &amp;attrib   = *directAttrib-&gt;attribute;
+    gl::Buffer *buffer   = attrib.buffer.get();
+    BufferD3D *bufferD3D = buffer ? GetImplAs&lt;BufferD3D&gt;(buffer) : nullptr;
+
+    ASSERT(DirectStoragePossible(attrib));
+    directAttrib-&gt;vertexBuffer.set(nullptr);
+    directAttrib-&gt;storage = bufferD3D;
+    directAttrib-&gt;serial  = bufferD3D-&gt;getSerial();
+    directAttrib-&gt;stride = static_cast&lt;unsigned int&gt;(ComputeVertexAttributeStride(attrib));
+    directAttrib-&gt;baseOffset = static_cast&lt;unsigned int&gt;(attrib.offset);
+
+    // Instanced vertices do not apply the 'start' offset
+    directAttrib-&gt;usesFirstVertexOffset = (attrib.divisor == 0);
+}
+
+// static
+gl::Error VertexDataManager::StoreStaticAttrib(TranslatedAttribute *translated,
+                                               GLsizei count,
+                                               GLsizei instances)
+{
+    const gl::VertexAttribute &amp;attrib = *translated-&gt;attribute;
+
+    gl::Buffer *buffer = attrib.buffer.get();
+    ASSERT(buffer &amp;&amp; attrib.enabled &amp;&amp; !DirectStoragePossible(attrib));
+    BufferD3D *bufferD3D = GetImplAs&lt;BufferD3D&gt;(buffer);
+
+    // Compute source data pointer
+    const uint8_t *sourceData = nullptr;
+
+    ANGLE_TRY(bufferD3D-&gt;getData(&amp;sourceData));
+    sourceData += static_cast&lt;int&gt;(attrib.offset);
+
+    unsigned int streamOffset = 0;
+
+    translated-&gt;storage = nullptr;
+    ANGLE_TRY_RESULT(bufferD3D-&gt;getFactory()-&gt;getVertexSpaceRequired(attrib, 1, 0),
+                     translated-&gt;stride);
+
+    auto *staticBuffer = bufferD3D-&gt;getStaticVertexBuffer(attrib);
+    ASSERT(staticBuffer);
+
+    if (staticBuffer-&gt;empty())
+    {
+        // Convert the entire buffer
+        int totalCount = ElementsInBuffer(attrib, static_cast&lt;unsigned int&gt;(bufferD3D-&gt;getSize()));
+        int startIndex = static_cast&lt;int&gt;(attrib.offset) /
+                         static_cast&lt;int&gt;(ComputeVertexAttributeStride(attrib));
+
+        ANGLE_TRY(
+            staticBuffer-&gt;storeStaticAttribute(attrib, -startIndex, totalCount, 0, sourceData));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Hint to unmap all the resources
-    hintUnmapAllResources(vertexAttributes);
</del><ins>+    unsigned int firstElementOffset =
+        (static_cast&lt;unsigned int&gt;(attrib.offset) /
+         static_cast&lt;unsigned int&gt;(ComputeVertexAttributeStride(attrib))) *
+        translated-&gt;stride;
</ins><span class="cx"> 
</span><del>-    for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+    VertexBuffer *vertexBuffer = staticBuffer-&gt;getVertexBuffer();
+
+    if (!IsUnsignedAdditionSafe(streamOffset, firstElementOffset))
</ins><span class="cx">     {
</span><del>-        const gl::VertexAttribute &amp;curAttrib = vertexAttributes[i];
-        if (translated[i].active &amp;&amp; curAttrib.enabled)
</del><ins>+        return gl::Error(GL_INVALID_OPERATION,
+                         &quot;Integer overflow in VertexDataManager::StoreStaticAttrib&quot;);
+    }
+
+    translated-&gt;vertexBuffer.set(vertexBuffer);
+    translated-&gt;serial = vertexBuffer-&gt;getSerial();
+    translated-&gt;baseOffset = streamOffset + firstElementOffset;
+
+    // Instanced vertices do not apply the 'start' offset
+    translated-&gt;usesFirstVertexOffset = (attrib.divisor == 0);
+
+    return gl::NoError();
+}
+
+gl::Error VertexDataManager::storeDynamicAttribs(
+    std::vector&lt;TranslatedAttribute&gt; *translatedAttribs,
+    const gl::AttributesMask &amp;dynamicAttribsMask,
+    GLint start,
+    GLsizei count,
+    GLsizei instances)
+{
+    // Instantiating this class will ensure the streaming buffer is never left mapped.
+    class StreamingBufferUnmapper final : angle::NonCopyable
+    {
+      public:
+        StreamingBufferUnmapper(StreamingVertexBufferInterface *streamingBuffer)
+            : mStreamingBuffer(streamingBuffer)
</ins><span class="cx">         {
</span><del>-            gl::Buffer *buffer = curAttrib.buffer.get();
</del><ins>+            ASSERT(mStreamingBuffer);
+        }
+        ~StreamingBufferUnmapper() { mStreamingBuffer-&gt;getVertexBuffer()-&gt;hintUnmapResource(); }
</ins><span class="cx"> 
</span><del>-            if (buffer)
-            {
-                BufferD3D *bufferImpl = GetImplAs&lt;BufferD3D&gt;(buffer);
-                bufferImpl-&gt;promoteStaticUsage(count * ComputeVertexAttributeTypeSize(curAttrib));
-            }
-        }
</del><ins>+      private:
+        StreamingVertexBufferInterface *mStreamingBuffer;
+    };
+
+    // Will trigger unmapping on return.
+    StreamingBufferUnmapper localUnmapper(mStreamingBuffer);
+
+    // Reserve the required space for the dynamic buffers.
+    for (auto attribIndex : angle::IterateBitSet(dynamicAttribsMask))
+    {
+        const auto &amp;dynamicAttrib = (*translatedAttribs)[attribIndex];
+        ANGLE_TRY(reserveSpaceForAttrib(dynamicAttrib, count, instances));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    // Store dynamic attributes
+    for (auto attribIndex : angle::IterateBitSet(dynamicAttribsMask))
+    {
+        auto *dynamicAttrib = &amp;(*translatedAttribs)[attribIndex];
+        ANGLE_TRY(storeDynamicAttrib(dynamicAttrib, start, count, instances));
+    }
+
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void VertexDataManager::invalidateMatchingStaticData(const gl::VertexAttribute &amp;attrib,
-                                                     const gl::VertexAttribCurrentValueData &amp;currentValue) const
</del><ins>+void VertexDataManager::PromoteDynamicAttribs(
+    const std::vector&lt;TranslatedAttribute&gt; &amp;translatedAttribs,
+    const gl::AttributesMask &amp;dynamicAttribsMask,
+    GLsizei count)
</ins><span class="cx"> {
</span><del>-    gl::Buffer *buffer = attrib.buffer.get();
-
-    if (buffer)
</del><ins>+    for (auto attribIndex : angle::IterateBitSet(dynamicAttribsMask))
</ins><span class="cx">     {
</span><del>-        BufferD3D *bufferImpl = GetImplAs&lt;BufferD3D&gt;(buffer);
-        StaticVertexBufferInterface *staticBuffer = bufferImpl-&gt;getStaticVertexBuffer();
-
-        if (staticBuffer &amp;&amp;
-            staticBuffer-&gt;getBufferSize() &gt; 0 &amp;&amp;
-            !staticBuffer-&gt;lookupAttribute(attrib, NULL) &amp;&amp;
-            !staticBuffer-&gt;directStoragePossible(attrib, currentValue))
</del><ins>+        const auto &amp;dynamicAttrib = translatedAttribs[attribIndex];
+        gl::Buffer *buffer = dynamicAttrib.attribute-&gt;buffer.get();
+        if (buffer)
</ins><span class="cx">         {
</span><del>-            bufferImpl-&gt;invalidateStaticData();
</del><ins>+            BufferD3D *bufferD3D = GetImplAs&lt;BufferD3D&gt;(buffer);
+            size_t typeSize = ComputeVertexAttributeTypeSize(*dynamicAttrib.attribute);
+            bufferD3D-&gt;promoteStaticUsage(count * static_cast&lt;int&gt;(typeSize));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexDataManager::reserveSpaceForAttrib(const gl::VertexAttribute &amp;attrib,
-                                                   const gl::VertexAttribCurrentValueData &amp;currentValue,
</del><ins>+gl::Error VertexDataManager::reserveSpaceForAttrib(const TranslatedAttribute &amp;translatedAttrib,
</ins><span class="cx">                                                    GLsizei count,
</span><span class="cx">                                                    GLsizei instances) const
</span><span class="cx"> {
</span><del>-    gl::Buffer *buffer = attrib.buffer.get();
-    BufferD3D *bufferImpl = buffer ? GetImplAs&lt;BufferD3D&gt;(buffer) : NULL;
-    StaticVertexBufferInterface *staticBuffer = bufferImpl ? bufferImpl-&gt;getStaticVertexBuffer() : NULL;
-    VertexBufferInterface *vertexBuffer = staticBuffer ? staticBuffer : static_cast&lt;VertexBufferInterface*&gt;(mStreamingBuffer);
</del><ins>+    const gl::VertexAttribute &amp;attrib = *translatedAttrib.attribute;
+    ASSERT(!DirectStoragePossible(attrib));
</ins><span class="cx"> 
</span><del>-    if (!vertexBuffer-&gt;directStoragePossible(attrib, currentValue))
-    {
-        if (staticBuffer)
-        {
-            if (staticBuffer-&gt;getBufferSize() == 0)
-            {
-                int totalCount = ElementsInBuffer(attrib, bufferImpl-&gt;getSize());
-                gl::Error error = staticBuffer-&gt;reserveVertexSpace(attrib, totalCount, 0);
-                if (error.isError())
-                {
-                    return error;
-                }
-            }
-        }
-        else
-        {
-            int totalCount = StreamingBufferElementCount(attrib, count, instances);
-            ASSERT(!bufferImpl || ElementsInBuffer(attrib, bufferImpl-&gt;getSize()) &gt;= totalCount);
</del><ins>+    gl::Buffer *buffer   = attrib.buffer.get();
+    BufferD3D *bufferD3D = buffer ? GetImplAs&lt;BufferD3D&gt;(buffer) : nullptr;
+    ASSERT(!bufferD3D || bufferD3D-&gt;getStaticVertexBuffer(attrib) == nullptr);
+    UNUSED_ASSERTION_VARIABLE(bufferD3D);
</ins><span class="cx"> 
</span><del>-            gl::Error error = mStreamingBuffer-&gt;reserveVertexSpace(attrib, totalCount, instances);
-            if (error.isError())
-            {
-                return error;
-            }
-        }
-    }
</del><ins>+    size_t totalCount = ComputeVertexAttributeElementCount(attrib, count, instances);
+    ASSERT(!bufferD3D ||
+           ElementsInBuffer(attrib, static_cast&lt;unsigned int&gt;(bufferD3D-&gt;getSize())) &gt;=
+               static_cast&lt;int&gt;(totalCount));
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return mStreamingBuffer-&gt;reserveVertexSpace(attrib, static_cast&lt;GLsizei&gt;(totalCount),
+                                                instances);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexDataManager::storeAttribute(const gl::VertexAttribute &amp;attrib,
-                                            const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                            TranslatedAttribute *translated,
-                                            GLint start,
-                                            GLsizei count,
-                                            GLsizei instances)
</del><ins>+gl::Error VertexDataManager::storeDynamicAttrib(TranslatedAttribute *translated,
+                                                GLint start,
+                                                GLsizei count,
+                                                GLsizei instances)
</ins><span class="cx"> {
</span><ins>+    const gl::VertexAttribute &amp;attrib = *translated-&gt;attribute;
+
</ins><span class="cx">     gl::Buffer *buffer = attrib.buffer.get();
</span><span class="cx">     ASSERT(buffer || attrib.pointer);
</span><ins>+    ASSERT(attrib.enabled);
</ins><span class="cx"> 
</span><del>-    BufferD3D *storage = buffer ? GetImplAs&lt;BufferD3D&gt;(buffer) : NULL;
-    StaticVertexBufferInterface *staticBuffer = storage ? storage-&gt;getStaticVertexBuffer() : NULL;
-    VertexBufferInterface *vertexBuffer = staticBuffer ? staticBuffer : static_cast&lt;VertexBufferInterface*&gt;(mStreamingBuffer);
-    bool directStorage = vertexBuffer-&gt;directStoragePossible(attrib, currentValue);
</del><ins>+    BufferD3D *storage = buffer ? GetImplAs&lt;BufferD3D&gt;(buffer) : nullptr;
</ins><span class="cx"> 
</span><del>-    unsigned int streamOffset = 0;
-    unsigned int outputElementSize = 0;
-
</del><span class="cx">     // Instanced vertices do not apply the 'start' offset
</span><del>-    GLint firstVertexIndex = (instances &gt; 0 &amp;&amp; attrib.divisor &gt; 0 ? 0 : start);
</del><ins>+    GLint firstVertexIndex = (attrib.divisor &gt; 0 ? 0 : start);
</ins><span class="cx"> 
</span><del>-    if (directStorage)
</del><ins>+    // Compute source data pointer
+    const uint8_t *sourceData = nullptr;
+
+    if (buffer)
</ins><span class="cx">     {
</span><del>-        outputElementSize = ComputeVertexAttributeStride(attrib);
-        streamOffset = static_cast&lt;unsigned int&gt;(attrib.offset + outputElementSize * firstVertexIndex);
</del><ins>+        ANGLE_TRY(storage-&gt;getData(&amp;sourceData));
+        sourceData += static_cast&lt;int&gt;(attrib.offset);
</ins><span class="cx">     }
</span><del>-    else if (staticBuffer)
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        gl::Error error = staticBuffer-&gt;getVertexBuffer()-&gt;getSpaceRequired(attrib, 1, 0, &amp;outputElementSize);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+        sourceData = static_cast&lt;const uint8_t*&gt;(attrib.pointer);
+    }
</ins><span class="cx"> 
</span><del>-        if (!staticBuffer-&gt;lookupAttribute(attrib, &amp;streamOffset))
-        {
-            // Convert the entire buffer
-            int totalCount = ElementsInBuffer(attrib, storage-&gt;getSize());
-            int startIndex = attrib.offset / ComputeVertexAttributeStride(attrib);
</del><ins>+    unsigned int streamOffset = 0;
</ins><span class="cx"> 
</span><del>-            error = staticBuffer-&gt;storeVertexAttributes(attrib, currentValue, -startIndex, totalCount,
-                                                        0, &amp;streamOffset);
-            if (error.isError())
-            {
-                return error;
-            }
-        }
</del><ins>+    translated-&gt;storage = nullptr;
+    ANGLE_TRY_RESULT(mFactory-&gt;getVertexSpaceRequired(attrib, 1, 0), translated-&gt;stride);
</ins><span class="cx"> 
</span><del>-        unsigned int firstElementOffset = (attrib.offset / ComputeVertexAttributeStride(attrib)) * outputElementSize;
-        unsigned int startOffset = (instances == 0 || attrib.divisor == 0) ? firstVertexIndex * outputElementSize : 0;
-        if (streamOffset + firstElementOffset + startOffset &lt; streamOffset)
-        {
-            return gl::Error(GL_OUT_OF_MEMORY);
-        }
</del><ins>+    size_t totalCount = ComputeVertexAttributeElementCount(attrib, count, instances);
</ins><span class="cx"> 
</span><del>-        streamOffset += firstElementOffset + startOffset;
</del><ins>+    ANGLE_TRY(mStreamingBuffer-&gt;storeDynamicAttribute(
+        attrib, translated-&gt;currentValueType, firstVertexIndex, static_cast&lt;GLsizei&gt;(totalCount),
+        instances, &amp;streamOffset, sourceData));
+
+    VertexBuffer *vertexBuffer = mStreamingBuffer-&gt;getVertexBuffer();
+
+    translated-&gt;vertexBuffer.set(vertexBuffer);
+    translated-&gt;serial = vertexBuffer-&gt;getSerial();
+    translated-&gt;baseOffset            = streamOffset;
+    translated-&gt;usesFirstVertexOffset = false;
+
+    return gl::NoError();
+}
+
+gl::Error VertexDataManager::storeCurrentValue(const gl::VertexAttribCurrentValueData &amp;currentValue,
+                                               TranslatedAttribute *translated,
+                                               size_t attribIndex)
+{
+    CurrentValueState *cachedState = &amp;mCurrentValueCache[attribIndex];
+    auto *&amp;buffer                  = cachedState-&gt;buffer;
+
+    if (!buffer)
+    {
+        buffer = new StreamingVertexBufferInterface(mFactory, CONSTANT_VERTEX_BUFFER_SIZE);
</ins><span class="cx">     }
</span><del>-    else
</del><ins>+
+    if (cachedState-&gt;data != currentValue)
</ins><span class="cx">     {
</span><del>-        int totalCount = StreamingBufferElementCount(attrib, count, instances);
-        gl::Error error = mStreamingBuffer-&gt;getVertexBuffer()-&gt;getSpaceRequired(attrib, 1, 0, &amp;outputElementSize);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+        const gl::VertexAttribute &amp;attrib = *translated-&gt;attribute;
</ins><span class="cx"> 
</span><del>-        error = mStreamingBuffer-&gt;storeVertexAttributes(attrib, currentValue, firstVertexIndex,
-                                                        totalCount, instances, &amp;streamOffset);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+        ANGLE_TRY(buffer-&gt;reserveVertexSpace(attrib, 1, 0));
+
+        const uint8_t *sourceData = reinterpret_cast&lt;const uint8_t*&gt;(currentValue.FloatValues);
+        unsigned int streamOffset;
+        ANGLE_TRY(buffer-&gt;storeDynamicAttribute(attrib, currentValue.Type, 0, 1, 0, &amp;streamOffset,
+                                                sourceData));
+
+        buffer-&gt;getVertexBuffer()-&gt;hintUnmapResource();
+
+        cachedState-&gt;data = currentValue;
+        cachedState-&gt;offset = streamOffset;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    translated-&gt;storage = directStorage ? storage : NULL;
-    translated-&gt;vertexBuffer = vertexBuffer-&gt;getVertexBuffer();
-    translated-&gt;serial = directStorage ? storage-&gt;getSerial() : vertexBuffer-&gt;getSerial();
-    translated-&gt;divisor = attrib.divisor;
</del><ins>+    translated-&gt;vertexBuffer.set(buffer-&gt;getVertexBuffer());
</ins><span class="cx"> 
</span><del>-    translated-&gt;attribute = &amp;attrib;
-    translated-&gt;currentValueType = currentValue.Type;
-    translated-&gt;stride = outputElementSize;
-    translated-&gt;offset = streamOffset;
</del><ins>+    translated-&gt;storage = nullptr;
+    translated-&gt;serial  = buffer-&gt;getSerial();
+    translated-&gt;divisor = 0;
+    translated-&gt;stride  = 0;
+    translated-&gt;baseOffset            = static_cast&lt;unsigned int&gt;(cachedState-&gt;offset);
+    translated-&gt;usesFirstVertexOffset = false;
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexDataManager::storeCurrentValue(const gl::VertexAttribute &amp;attrib,
-                                               const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                               TranslatedAttribute *translated,
-                                               gl::VertexAttribCurrentValueData *cachedValue,
-                                               size_t *cachedOffset,
-                                               StreamingVertexBufferInterface *buffer)
</del><ins>+// VertexBufferBinding implementation
+VertexBufferBinding::VertexBufferBinding() : mBoundVertexBuffer(nullptr)
</ins><span class="cx"> {
</span><del>-    if (*cachedValue != currentValue)
</del><ins>+}
+
+VertexBufferBinding::VertexBufferBinding(const VertexBufferBinding &amp;other)
+    : mBoundVertexBuffer(other.mBoundVertexBuffer)
+{
+    if (mBoundVertexBuffer)
</ins><span class="cx">     {
</span><del>-        gl::Error error = buffer-&gt;reserveVertexSpace(attrib, 1, 0);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+        mBoundVertexBuffer-&gt;addRef();
+    }
+}
</ins><span class="cx"> 
</span><del>-        unsigned int streamOffset;
-        error = buffer-&gt;storeVertexAttributes(attrib, currentValue, 0, 1, 0, &amp;streamOffset);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+VertexBufferBinding::~VertexBufferBinding()
+{
+    if (mBoundVertexBuffer)
+    {
+        mBoundVertexBuffer-&gt;release();
+    }
+}
</ins><span class="cx"> 
</span><del>-        *cachedValue = currentValue;
-        *cachedOffset = streamOffset;
</del><ins>+VertexBufferBinding &amp;VertexBufferBinding::operator=(const VertexBufferBinding &amp;other)
+{
+    mBoundVertexBuffer = other.mBoundVertexBuffer;
+    if (mBoundVertexBuffer)
+    {
+        mBoundVertexBuffer-&gt;addRef();
</ins><span class="cx">     }
</span><ins>+    return *this;
+}
</ins><span class="cx"> 
</span><del>-    translated-&gt;storage = NULL;
-    translated-&gt;vertexBuffer = buffer-&gt;getVertexBuffer();
-    translated-&gt;serial = buffer-&gt;getSerial();
-    translated-&gt;divisor = 0;
</del><ins>+void VertexBufferBinding::set(VertexBuffer *vertexBuffer)
+{
+    if (mBoundVertexBuffer == vertexBuffer)
+        return;
</ins><span class="cx"> 
</span><del>-    translated-&gt;attribute = &amp;attrib;
-    translated-&gt;currentValueType = currentValue.Type;
-    translated-&gt;stride = 0;
-    translated-&gt;offset = *cachedOffset;
</del><ins>+    if (mBoundVertexBuffer)
+    {
+        mBoundVertexBuffer-&gt;release();
+    }
+    if (vertexBuffer)
+    {
+        vertexBuffer-&gt;addRef();
+    }
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    mBoundVertexBuffer = vertexBuffer;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+VertexBuffer *VertexBufferBinding::get() const
+{
+    return mBoundVertexBuffer;
</ins><span class="cx"> }
</span><ins>+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dVertexDataManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexDataManager.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexDataManager.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/VertexDataManager.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,9 +10,10 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_
</span><span class="cx"> 
</span><ins>+#include &quot;common/angleutils.h&quot;
+#include &quot;libANGLE/angletypes.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Constants.h&quot;
</span><span class="cx"> #include &quot;libANGLE/VertexAttribute.h&quot;
</span><del>-#include &quot;common/angleutils.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="lines">@@ -28,68 +29,115 @@
</span><span class="cx"> class StreamingVertexBufferInterface;
</span><span class="cx"> class VertexBuffer;
</span><span class="cx"> 
</span><ins>+class VertexBufferBinding final
+{
+  public:
+    VertexBufferBinding();
+    VertexBufferBinding(const VertexBufferBinding &amp;other);
+    ~VertexBufferBinding();
+
+    void set(VertexBuffer *vertexBuffer);
+    VertexBuffer *get() const;
+    VertexBufferBinding &amp;operator=(const VertexBufferBinding &amp;other);
+
+  private:
+    VertexBuffer *mBoundVertexBuffer;
+};
+
</ins><span class="cx"> struct TranslatedAttribute
</span><span class="cx"> {
</span><del>-    TranslatedAttribute() : active(false), attribute(NULL), currentValueType(GL_NONE),
-                            offset(0), stride(0), vertexBuffer(NULL), storage(NULL),
-                            serial(0), divisor(0) {};
</del><ins>+    TranslatedAttribute();
+
+    // Computes the correct offset from baseOffset, usesFirstVertexOffset, stride and startVertex.
+    // Can throw an error on integer overflow.
+    gl::ErrorOrResult&lt;unsigned int&gt; computeOffset(GLint startVertex) const;
+
</ins><span class="cx">     bool active;
</span><span class="cx"> 
</span><span class="cx">     const gl::VertexAttribute *attribute;
</span><span class="cx">     GLenum currentValueType;
</span><del>-    unsigned int offset;
</del><ins>+    unsigned int baseOffset;
+    bool usesFirstVertexOffset;
</ins><span class="cx">     unsigned int stride;   // 0 means not to advance the read pointer at all
</span><span class="cx"> 
</span><del>-    VertexBuffer *vertexBuffer;
</del><ins>+    VertexBufferBinding vertexBuffer;
</ins><span class="cx">     BufferD3D *storage;
</span><span class="cx">     unsigned int serial;
</span><span class="cx">     unsigned int divisor;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+enum class VertexStorageType
+{
+    UNKNOWN,
+    STATIC,         // Translate the vertex data once and re-use it.
+    DYNAMIC,        // Translate the data every frame into a ring buffer.
+    DIRECT,         // Bind a D3D buffer directly without any translation.
+    CURRENT_VALUE,  // Use a single value for the attribute.
+};
+
+// Given a vertex attribute, return the type of storage it will use.
+VertexStorageType ClassifyAttributeStorage(const gl::VertexAttribute &amp;attrib);
+
</ins><span class="cx"> class VertexDataManager : angle::NonCopyable
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     VertexDataManager(BufferFactoryD3D *factory);
</span><span class="cx">     virtual ~VertexDataManager();
</span><span class="cx"> 
</span><del>-    gl::Error prepareVertexData(const gl::State &amp;state, GLint start, GLsizei count,
-                                TranslatedAttribute *outAttribs, GLsizei instances);
</del><ins>+    gl::Error prepareVertexData(const gl::State &amp;state,
+                                GLint start,
+                                GLsizei count,
+                                std::vector&lt;TranslatedAttribute&gt; *translatedAttribs,
+                                GLsizei instances);
</ins><span class="cx"> 
</span><del>-  private:
-    gl::Error reserveSpaceForAttrib(const gl::VertexAttribute &amp;attrib,
-                                    const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                    GLsizei count,
-                                    GLsizei instances) const;
</del><ins>+    static void StoreDirectAttrib(TranslatedAttribute *directAttrib);
</ins><span class="cx"> 
</span><del>-    void invalidateMatchingStaticData(const gl::VertexAttribute &amp;attrib,
-                                      const gl::VertexAttribCurrentValueData &amp;currentValue) const;
</del><ins>+    static gl::Error StoreStaticAttrib(TranslatedAttribute *translated,
+                                       GLsizei count,
+                                       GLsizei instances);
</ins><span class="cx"> 
</span><del>-    gl::Error storeAttribute(const gl::VertexAttribute &amp;attrib,
-                             const gl::VertexAttribCurrentValueData &amp;currentValue,
-                             TranslatedAttribute *translated,
-                             GLint start,
-                             GLsizei count,
-                             GLsizei instances);
</del><ins>+    gl::Error storeDynamicAttribs(std::vector&lt;TranslatedAttribute&gt; *translatedAttribs,
+                                  const gl::AttributesMask &amp;dynamicAttribsMask,
+                                  GLint start,
+                                  GLsizei count,
+                                  GLsizei instances);
</ins><span class="cx"> 
</span><del>-    gl::Error storeCurrentValue(const gl::VertexAttribute &amp;attrib,
-                                const gl::VertexAttribCurrentValueData &amp;currentValue,
</del><ins>+    // Promote static usage of dynamic buffers.
+    static void PromoteDynamicAttribs(const std::vector&lt;TranslatedAttribute&gt; &amp;translatedAttribs,
+                                      const gl::AttributesMask &amp;dynamicAttribsMask,
+                                      GLsizei count);
+
+    gl::Error storeCurrentValue(const gl::VertexAttribCurrentValueData &amp;currentValue,
</ins><span class="cx">                                 TranslatedAttribute *translated,
</span><del>-                                gl::VertexAttribCurrentValueData *cachedValue,
-                                size_t *cachedOffset,
-                                StreamingVertexBufferInterface *buffer);
</del><ins>+                                size_t attribIndex);
</ins><span class="cx"> 
</span><del>-    void hintUnmapAllResources(const std::vector&lt;gl::VertexAttribute&gt; &amp;vertexAttributes);
</del><ins>+  private:
+    struct CurrentValueState
+    {
+        CurrentValueState();
+        ~CurrentValueState();
</ins><span class="cx"> 
</span><ins>+        StreamingVertexBufferInterface *buffer;
+        gl::VertexAttribCurrentValueData data;
+        size_t offset;
+    };
+
+    gl::Error reserveSpaceForAttrib(const TranslatedAttribute &amp;translatedAttrib,
+                                    GLsizei count,
+                                    GLsizei instances) const;
+
+    gl::Error storeDynamicAttrib(TranslatedAttribute *translated,
+                                 GLint start,
+                                 GLsizei count,
+                                 GLsizei instances);
+
</ins><span class="cx">     BufferFactoryD3D *const mFactory;
</span><span class="cx"> 
</span><span class="cx">     StreamingVertexBufferInterface *mStreamingBuffer;
</span><del>-
-    gl::VertexAttribCurrentValueData mCurrentValue[gl::MAX_VERTEX_ATTRIBS];
-
-    StreamingVertexBufferInterface *mCurrentValueBuffer[gl::MAX_VERTEX_ATTRIBS];
-    std::size_t mCurrentValueOffsets[gl::MAX_VERTEX_ATTRIBS];
</del><ins>+    std::vector&lt;CurrentValueState&gt; mCurrentValueCache;
+    gl::AttributesMask mDynamicAttribsMaskCache;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins><span class="cx"> 
</span><span class="cx"> #endif   // LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dWorkaroundsD3Dh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/WorkaroundsD3D.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/WorkaroundsD3D.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/WorkaroundsD3D.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,66 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// WorkaroundsD3D.h: Workarounds for D3D driver bugs and other issues.
+
+#ifndef LIBANGLE_RENDERER_D3D_WORKAROUNDSD3D_H_
+#define LIBANGLE_RENDERER_D3D_WORKAROUNDSD3D_H_
+
+// TODO(jmadill,zmo,geofflang): make a workarounds library that can operate
+// independent of ANGLE's renderer. Workarounds should also be accessible
+// outside of the Renderer.
+
+namespace rx
+{
+struct D3DCompilerWorkarounds
+{
+    D3DCompilerWorkarounds()
+        : skipOptimization(false), useMaxOptimization(false), enableIEEEStrictness(false)
+    {
+    }
+
+    bool skipOptimization;
+    bool useMaxOptimization;
+
+    // IEEE strictness needs to be enabled for NANs to work.
+    bool enableIEEEStrictness;
+};
+
+struct WorkaroundsD3D
+{
+    WorkaroundsD3D()
+        : mrtPerfWorkaround(false),
+          setDataFasterThanImageUpload(false),
+          zeroMaxLodWorkaround(false),
+          useInstancedPointSpriteEmulation(false)
+    {
+    }
+
+    // On some systems, having extra rendertargets than necessary slows down the shader.
+    // We can fix this by optimizing those out of the shader. At the same time, we can
+    // work around a bug on some nVidia drivers that they ignore &quot;null&quot; render targets
+    // in D3D11, by compacting the active color attachments list to omit null entries.
+    bool mrtPerfWorkaround;
+
+    bool setDataFasterThanImageUpload;
+
+    // Some renderers can't disable mipmaps on a mipmapped texture (i.e. solely sample from level
+    // zero, and ignore the other levels). D3D11 Feature Level 10+ does this by setting MaxLOD to
+    // 0.0f in the Sampler state. D3D9 sets D3DSAMP_MIPFILTER to D3DTEXF_NONE. There is no
+    // equivalent to this in D3D11 Feature Level 9_3. This causes problems when (for example) an
+    // application creates a mipmapped texture2D, but sets GL_TEXTURE_MIN_FILTER to GL_NEAREST
+    // (i.e disables mipmaps). To work around this, D3D11 FL9_3 has to create two copies of the
+    // texture. The textures' level zeros are identical, but only one texture has mips.
+    bool zeroMaxLodWorkaround;
+
+    // Some renderers do not support Geometry Shaders so the Geometry Shader-based PointSprite
+    // emulation will not work. To work around this, D3D11 FL9_3 has to use a different pointsprite
+    // emulation that is implemented using instanced quads.
+    bool useInstancedPointSpriteEmulation;
+};
+}
+
+#endif  // LIBANGLE_RENDERER_D3D_WORKAROUNDSD3D_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Blit11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Blit11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -99,15 +99,15 @@
</span><span class="cx">     stagingDesc.MiscFlags = 0;
</span><span class="cx">     stagingDesc.BindFlags = 0;
</span><span class="cx"> 
</span><del>-    ID3D11Texture2D *stagingTexture = NULL;
-    HRESULT result = device-&gt;CreateTexture2D(&amp;stagingDesc, NULL, &amp;stagingTexture);
</del><ins>+    ID3D11Texture2D *stagingTexture = nullptr;
+    HRESULT result = device-&gt;CreateTexture2D(&amp;stagingDesc, nullptr, &amp;stagingTexture);
</ins><span class="cx">     if (FAILED(result))
</span><span class="cx">     {
</span><span class="cx">         ERR(&quot;Failed to create staging texture for depth stencil blit. HRESULT: 0x%X.&quot;, result);
</span><del>-        return NULL;
</del><ins>+        return nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    context-&gt;CopySubresourceRegion(stagingTexture, 0, 0, 0, 0, source, subresource, NULL);
</del><ins>+    context-&gt;CopySubresourceRegion(stagingTexture, 0, 0, 0, 0, source, subresource, nullptr);
</ins><span class="cx"> 
</span><span class="cx">     return stagingTexture;
</span><span class="cx"> }
</span><span class="lines">@@ -196,40 +196,114 @@
</span><span class="cx">     return colorIndex;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+D3D11_BLEND_DESC GetAlphaMaskBlendStateDesc()
+{
+    D3D11_BLEND_DESC desc;
+    memset(&amp;desc, 0, sizeof(desc));
+    desc.RenderTarget[0].BlendEnable           = TRUE;
+    desc.RenderTarget[0].SrcBlend              = D3D11_BLEND_ONE;
+    desc.RenderTarget[0].DestBlend             = D3D11_BLEND_ZERO;
+    desc.RenderTarget[0].BlendOp               = D3D11_BLEND_OP_ADD;
+    desc.RenderTarget[0].SrcBlendAlpha         = D3D11_BLEND_ZERO;
+    desc.RenderTarget[0].DestBlendAlpha        = D3D11_BLEND_ZERO;
+    desc.RenderTarget[0].BlendOpAlpha          = D3D11_BLEND_OP_ADD;
+    desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_RED |
+                                                 D3D11_COLOR_WRITE_ENABLE_GREEN |
+                                                 D3D11_COLOR_WRITE_ENABLE_BLUE;
+    return desc;
+}
+
+D3D11_INPUT_ELEMENT_DESC quad2DLayout[] =
+{
+    { &quot;POSITION&quot;, 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+    { &quot;TEXCOORD&quot;, 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+};
+
+D3D11_INPUT_ELEMENT_DESC quad3DLayout[] =
+{
+    { &quot;POSITION&quot;, 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+    { &quot;LAYER&quot;, 0, DXGI_FORMAT_R32_UINT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+    { &quot;TEXCOORD&quot;, 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+};
+
</ins><span class="cx"> } // namespace
</span><span class="cx"> 
</span><span class="cx"> Blit11::Blit11(Renderer11 *renderer)
</span><span class="cx">     : mRenderer(renderer),
</span><del>-      mVertexBuffer(NULL),
-      mPointSampler(NULL),
-      mLinearSampler(NULL),
-      mScissorEnabledRasterizerState(NULL),
-      mScissorDisabledRasterizerState(NULL),
-      mDepthStencilState(NULL),
-      mQuad2DIL(NULL),
-      mQuad2DVS(NULL),
-      mDepthPS(NULL),
-      mQuad3DIL(NULL),
-      mQuad3DVS(NULL),
-      mQuad3DGS(NULL),
-      mSwizzleCB(NULL)
</del><ins>+      mResourcesInitialized(false),
+      mVertexBuffer(nullptr),
+      mPointSampler(nullptr),
+      mLinearSampler(nullptr),
+      mScissorEnabledRasterizerState(nullptr),
+      mScissorDisabledRasterizerState(nullptr),
+      mDepthStencilState(nullptr),
+      mQuad2DIL(quad2DLayout,
+                ArraySize(quad2DLayout),
+                g_VS_Passthrough2D,
+                ArraySize(g_VS_Passthrough2D),
+                &quot;Blit11 2D input layout&quot;),
+      mQuad2DVS(g_VS_Passthrough2D, ArraySize(g_VS_Passthrough2D), &quot;Blit11 2D vertex shader&quot;),
+      mDepthPS(g_PS_PassthroughDepth2D,
+               ArraySize(g_PS_PassthroughDepth2D),
+               &quot;Blit11 2D depth pixel shader&quot;),
+      mQuad3DIL(quad3DLayout,
+                ArraySize(quad3DLayout),
+                g_VS_Passthrough3D,
+                ArraySize(g_VS_Passthrough3D),
+                &quot;Blit11 3D input layout&quot;),
+      mQuad3DVS(g_VS_Passthrough3D, ArraySize(g_VS_Passthrough3D), &quot;Blit11 3D vertex shader&quot;),
+      mQuad3DGS(g_GS_Passthrough3D, ArraySize(g_GS_Passthrough3D), &quot;Blit11 3D geometry shader&quot;),
+      mAlphaMaskBlendState(GetAlphaMaskBlendStateDesc(), &quot;Blit11 Alpha Mask Blend&quot;),
+      mSwizzleCB(nullptr)
</ins><span class="cx"> {
</span><del>-    TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;Blit11::Blit11&quot;);
</del><ins>+}
</ins><span class="cx"> 
</span><ins>+Blit11::~Blit11()
+{
+    freeResources();
+
+    mQuad2DIL.release();
+    mQuad2DVS.release();
+    mDepthPS.release();
+
+    mQuad3DIL.release();
+    mQuad3DVS.release();
+    mQuad3DGS.release();
+
+    clearShaderMap();
+}
+
+gl::Error Blit11::initResources()
+{
+    if (mResourcesInitialized)
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;Blit11::initResources&quot;);
+
</ins><span class="cx">     HRESULT result;
</span><span class="cx">     ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">     D3D11_BUFFER_DESC vbDesc;
</span><del>-    vbDesc.ByteWidth = std::max(sizeof(d3d11::PositionLayerTexCoord3DVertex), sizeof(d3d11::PositionTexCoordVertex)) *
-                       6 * renderer-&gt;getRendererCaps().max3DTextureSize;
</del><ins>+    vbDesc.ByteWidth =
+        static_cast&lt;unsigned int&gt;(std::max(sizeof(d3d11::PositionLayerTexCoord3DVertex),
+                                           sizeof(d3d11::PositionTexCoordVertex)) *
+                                  6 * mRenderer-&gt;getRendererCaps().max3DTextureSize);
</ins><span class="cx">     vbDesc.Usage = D3D11_USAGE_DYNAMIC;
</span><span class="cx">     vbDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
</span><span class="cx">     vbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
</span><span class="cx">     vbDesc.MiscFlags = 0;
</span><span class="cx">     vbDesc.StructureByteStride = 0;
</span><span class="cx"> 
</span><del>-    result = device-&gt;CreateBuffer(&amp;vbDesc, NULL, &amp;mVertexBuffer);
</del><ins>+    result = device-&gt;CreateBuffer(&amp;vbDesc, nullptr, &amp;mVertexBuffer);
</ins><span class="cx">     ASSERT(SUCCEEDED(result));
</span><ins>+    if (FAILED(result))
+    {
+        freeResources();
+        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create blit vertex buffer, HRESULT: 0x%X&quot;,
+                         result);
+    }
</ins><span class="cx">     d3d11::SetDebugName(mVertexBuffer, &quot;Blit11 vertex buffer&quot;);
</span><span class="cx"> 
</span><span class="cx">     D3D11_SAMPLER_DESC pointSamplerDesc;
</span><span class="lines">@@ -249,6 +323,12 @@
</span><span class="cx"> 
</span><span class="cx">     result = device-&gt;CreateSamplerState(&amp;pointSamplerDesc, &amp;mPointSampler);
</span><span class="cx">     ASSERT(SUCCEEDED(result));
</span><ins>+    if (FAILED(result))
+    {
+        freeResources();
+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to create blit point sampler state, HRESULT: 0x%X&quot;, result);
+    }
</ins><span class="cx">     d3d11::SetDebugName(mPointSampler, &quot;Blit11 point sampler&quot;);
</span><span class="cx"> 
</span><span class="cx">     D3D11_SAMPLER_DESC linearSamplerDesc;
</span><span class="lines">@@ -268,6 +348,12 @@
</span><span class="cx"> 
</span><span class="cx">     result = device-&gt;CreateSamplerState(&amp;linearSamplerDesc, &amp;mLinearSampler);
</span><span class="cx">     ASSERT(SUCCEEDED(result));
</span><ins>+    if (FAILED(result))
+    {
+        freeResources();
+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to create blit linear sampler state, HRESULT: 0x%X&quot;, result);
+    }
</ins><span class="cx">     d3d11::SetDebugName(mLinearSampler, &quot;Blit11 linear sampler&quot;);
</span><span class="cx"> 
</span><span class="cx">     // Use a rasterizer state that will not cull so that inverted quads will not be culled
</span><span class="lines">@@ -285,11 +371,25 @@
</span><span class="cx">     rasterDesc.ScissorEnable = TRUE;
</span><span class="cx">     result = device-&gt;CreateRasterizerState(&amp;rasterDesc, &amp;mScissorEnabledRasterizerState);
</span><span class="cx">     ASSERT(SUCCEEDED(result));
</span><ins>+    if (FAILED(result))
+    {
+        freeResources();
+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to create blit scissoring rasterizer state, HRESULT: 0x%X&quot;,
+                         result);
+    }
</ins><span class="cx">     d3d11::SetDebugName(mScissorEnabledRasterizerState, &quot;Blit11 scissoring rasterizer state&quot;);
</span><span class="cx"> 
</span><span class="cx">     rasterDesc.ScissorEnable = FALSE;
</span><span class="cx">     result = device-&gt;CreateRasterizerState(&amp;rasterDesc, &amp;mScissorDisabledRasterizerState);
</span><span class="cx">     ASSERT(SUCCEEDED(result));
</span><ins>+    if (FAILED(result))
+    {
+        freeResources();
+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to create blit no scissoring rasterizer state, HRESULT: 0x%X&quot;,
+                         result);
+    }
</ins><span class="cx">     d3d11::SetDebugName(mScissorDisabledRasterizerState, &quot;Blit11 no scissoring rasterizer state&quot;);
</span><span class="cx"> 
</span><span class="cx">     D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
</span><span class="lines">@@ -310,47 +410,13 @@
</span><span class="cx"> 
</span><span class="cx">     result = device-&gt;CreateDepthStencilState(&amp;depthStencilDesc, &amp;mDepthStencilState);
</span><span class="cx">     ASSERT(SUCCEEDED(result));
</span><del>-    d3d11::SetDebugName(mDepthStencilState, &quot;Blit11 depth stencil state&quot;);
-
-    D3D11_INPUT_ELEMENT_DESC quad2DLayout[] =
</del><ins>+    if (FAILED(result))
</ins><span class="cx">     {
</span><del>-        { &quot;POSITION&quot;, 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
-        { &quot;TEXCOORD&quot;, 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0 },
-    };
-
-    result = device-&gt;CreateInputLayout(quad2DLayout, ArraySize(quad2DLayout), g_VS_Passthrough2D, ArraySize(g_VS_Passthrough2D), &amp;mQuad2DIL);
-    ASSERT(SUCCEEDED(result));
-    d3d11::SetDebugName(mQuad2DIL, &quot;Blit11 2D input layout&quot;);
-
-    result = device-&gt;CreateVertexShader(g_VS_Passthrough2D, ArraySize(g_VS_Passthrough2D), NULL, &amp;mQuad2DVS);
-    ASSERT(SUCCEEDED(result));
-    d3d11::SetDebugName(mQuad2DVS, &quot;Blit11 2D vertex shader&quot;);
-
-    if (renderer-&gt;isES3Capable())
-    {
-        result = device-&gt;CreatePixelShader(g_PS_PassthroughDepth2D, ArraySize(g_PS_PassthroughDepth2D), NULL, &amp;mDepthPS);
-        ASSERT(SUCCEEDED(result));
-        d3d11::SetDebugName(mDepthPS, &quot;Blit11 2D depth pixel shader&quot;);
-
-        D3D11_INPUT_ELEMENT_DESC quad3DLayout[] =
-        {
-            { &quot;POSITION&quot;, 0, DXGI_FORMAT_R32G32_FLOAT,    0,  0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
-            { &quot;LAYER&quot;,    0, DXGI_FORMAT_R32_UINT,        0,  8, D3D11_INPUT_PER_VERTEX_DATA, 0 },
-            { &quot;TEXCOORD&quot;, 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
-        };
-
-        result = device-&gt;CreateInputLayout(quad3DLayout, ArraySize(quad3DLayout), g_VS_Passthrough3D, ArraySize(g_VS_Passthrough3D), &amp;mQuad3DIL);
-        ASSERT(SUCCEEDED(result));
-        d3d11::SetDebugName(mQuad3DIL, &quot;Blit11 3D input layout&quot;);
-
-        result = device-&gt;CreateVertexShader(g_VS_Passthrough3D, ArraySize(g_VS_Passthrough3D), NULL, &amp;mQuad3DVS);
-        ASSERT(SUCCEEDED(result));
-        d3d11::SetDebugName(mQuad3DVS, &quot;Blit11 3D vertex shader&quot;);
-
-        result = device-&gt;CreateGeometryShader(g_GS_Passthrough3D, ArraySize(g_GS_Passthrough3D), NULL, &amp;mQuad3DGS);
-        ASSERT(SUCCEEDED(result));
-        d3d11::SetDebugName(mQuad3DGS, &quot;Renderer11 copy 3D texture geometry shader&quot;);
</del><ins>+        freeResources();
+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to create blit depth stencil state, HRESULT: 0x%X&quot;, result);
</ins><span class="cx">     }
</span><ins>+    d3d11::SetDebugName(mDepthStencilState, &quot;Blit11 depth stencil state&quot;);
</ins><span class="cx"> 
</span><span class="cx">     D3D11_BUFFER_DESC swizzleBufferDesc;
</span><span class="cx">     swizzleBufferDesc.ByteWidth = sizeof(unsigned int) * 4;
</span><span class="lines">@@ -360,12 +426,22 @@
</span><span class="cx">     swizzleBufferDesc.MiscFlags = 0;
</span><span class="cx">     swizzleBufferDesc.StructureByteStride = 0;
</span><span class="cx"> 
</span><del>-    result = device-&gt;CreateBuffer(&amp;swizzleBufferDesc, NULL, &amp;mSwizzleCB);
</del><ins>+    result = device-&gt;CreateBuffer(&amp;swizzleBufferDesc, nullptr, &amp;mSwizzleCB);
</ins><span class="cx">     ASSERT(SUCCEEDED(result));
</span><ins>+    if (FAILED(result))
+    {
+        freeResources();
+        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create blit swizzle buffer, HRESULT: 0x%X&quot;,
+                         result);
+    }
</ins><span class="cx">     d3d11::SetDebugName(mSwizzleCB, &quot;Blit11 swizzle constant buffer&quot;);
</span><ins>+
+    mResourcesInitialized = true;
+
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Blit11::~Blit11()
</del><ins>+void Blit11::freeResources()
</ins><span class="cx"> {
</span><span class="cx">     SafeRelease(mVertexBuffer);
</span><span class="cx">     SafeRelease(mPointSampler);
</span><span class="lines">@@ -373,24 +449,15 @@
</span><span class="cx">     SafeRelease(mScissorEnabledRasterizerState);
</span><span class="cx">     SafeRelease(mScissorDisabledRasterizerState);
</span><span class="cx">     SafeRelease(mDepthStencilState);
</span><del>-
-    SafeRelease(mQuad2DIL);
-    SafeRelease(mQuad2DVS);
-    SafeRelease(mDepthPS);
-
-    SafeRelease(mQuad3DIL);
-    SafeRelease(mQuad3DVS);
-    SafeRelease(mQuad3DGS);
-
</del><span class="cx">     SafeRelease(mSwizzleCB);
</span><span class="cx"> 
</span><del>-    clearShaderMap();
</del><ins>+    mResourcesInitialized = false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // static
</span><del>-Blit11::BlitShaderType Blit11::GetBlitShaderType(GLenum destinationFormat, bool isSigned, bool is3D)
</del><ins>+Blit11::BlitShaderType Blit11::GetBlitShaderType(GLenum destinationFormat, bool isSigned, ShaderDimension dimension)
</ins><span class="cx"> {
</span><del>-    if (is3D)
</del><ins>+    if (dimension == SHADER_3D)
</ins><span class="cx">     {
</span><span class="cx">         if (isSigned)
</span><span class="cx">         {
</span><span class="lines">@@ -399,7 +466,7 @@
</span><span class="cx">               case GL_RGBA_INTEGER: return BLITSHADER_3D_RGBAI;
</span><span class="cx">               case GL_RGB_INTEGER:  return BLITSHADER_3D_RGBI;
</span><span class="cx">               case GL_RG_INTEGER:   return BLITSHADER_3D_RGI;
</span><del>-              case GL_RED:          return BLITSHADER_3D_RI;
</del><ins>+              case GL_RED_INTEGER:  return BLITSHADER_3D_RI;
</ins><span class="cx">               default:
</span><span class="cx">                 UNREACHABLE();
</span><span class="cx">                 return BLITSHADER_INVALID;
</span><span class="lines">@@ -434,7 +501,7 @@
</span><span class="cx">           case GL_RGBA_INTEGER: return BLITSHADER_2D_RGBAI;
</span><span class="cx">           case GL_RGB_INTEGER:  return BLITSHADER_2D_RGBI;
</span><span class="cx">           case GL_RG_INTEGER:   return BLITSHADER_2D_RGI;
</span><del>-          case GL_RED:          return BLITSHADER_2D_RI;
</del><ins>+          case GL_RED_INTEGER:  return BLITSHADER_2D_RI;
</ins><span class="cx">           default:
</span><span class="cx">             UNREACHABLE();
</span><span class="cx">             return BLITSHADER_INVALID;
</span><span class="lines">@@ -514,9 +581,44 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTargetView *dest, const gl::Extents &amp;size,
-                                 GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha)
</del><ins>+Blit11::ShaderSupport Blit11::getShaderSupport(const Shader &amp;shader)
</ins><span class="cx"> {
</span><ins>+    ID3D11Device *device = mRenderer-&gt;getDevice();
+    ShaderSupport support;
+
+    if (shader.dimension == SHADER_2D)
+    {
+        support.inputLayout = mQuad2DIL.resolve(device);
+        support.vertexShader = mQuad2DVS.resolve(device);
+        support.geometryShader = nullptr;
+        support.vertexWriteFunction = Write2DVertices;
+    }
+    else
+    {
+        ASSERT(shader.dimension == SHADER_3D);
+        support.inputLayout = mQuad3DIL.resolve(device);
+        support.vertexShader = mQuad3DVS.resolve(device);
+        support.geometryShader = mQuad3DGS.resolve(device);
+        support.vertexWriteFunction = Write3DVertices;
+    }
+
+    return support;
+}
+
+gl::Error Blit11::swizzleTexture(ID3D11ShaderResourceView *source,
+                                 ID3D11RenderTargetView *dest,
+                                 const gl::Extents &amp;size,
+                                 GLenum swizzleRed,
+                                 GLenum swizzleGreen,
+                                 GLenum swizzleBlue,
+                                 GLenum swizzleAlpha)
+{
+    gl::Error error = initResources();
+    if (error.isError())
+    {
+        return error;
+    }
+
</ins><span class="cx">     HRESULT result;
</span><span class="cx">     ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><span class="lines">@@ -524,10 +626,26 @@
</span><span class="cx">     source-&gt;GetDesc(&amp;sourceSRVDesc);
</span><span class="cx"> 
</span><span class="cx">     const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(sourceSRVDesc.Format);
</span><del>-    const gl::InternalFormat &amp;sourceFormatInfo = gl::GetInternalFormatInfo(dxgiFormatInfo.internalFormat);
</del><ins>+    GLenum componentType = dxgiFormatInfo.componentType;
+    if (componentType == GL_NONE)
+    {
+        // We're swizzling the depth component of a depth-stencil texture.
+        switch (sourceSRVDesc.Format)
+        {
+            case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
+                componentType = GL_UNSIGNED_NORMALIZED;
+                break;
+            case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
+                componentType = GL_FLOAT;
+                break;
+            default:
+                UNREACHABLE();
+                break;
+        }
+    }
</ins><span class="cx"> 
</span><span class="cx">     GLenum shaderType = GL_NONE;
</span><del>-    switch (sourceFormatInfo.componentType)
</del><ins>+    switch (componentType)
</ins><span class="cx">     {
</span><span class="cx">       case GL_UNSIGNED_NORMALIZED:
</span><span class="cx">       case GL_SIGNED_NORMALIZED:
</span><span class="lines">@@ -546,7 +664,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     const Shader *shader = nullptr;
</span><del>-    gl::Error error = getSwizzleShader(shaderType, sourceSRVDesc.ViewDimension, &amp;shader);
</del><ins>+    error = getSwizzleShader(shaderType, sourceSRVDesc.ViewDimension, &amp;shader);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -560,13 +678,15 @@
</span><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to map internal vertex buffer for swizzle, HRESULT: 0x%X.&quot;, result);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    const ShaderSupport &amp;support = getShaderSupport(*shader);
+
</ins><span class="cx">     UINT stride = 0;
</span><span class="cx">     UINT startIdx = 0;
</span><span class="cx">     UINT drawCount = 0;
</span><span class="cx">     D3D11_PRIMITIVE_TOPOLOGY topology;
</span><span class="cx"> 
</span><span class="cx">     gl::Box area(0, 0, 0, size.width, size.height, size.depth);
</span><del>-    shader-&gt;mVertexWriteFunction(area, size, area, size, mappedResource.pData, &amp;stride, &amp;drawCount, &amp;topology);
</del><ins>+    support.vertexWriteFunction(area, size, area, size, mappedResource.pData, &amp;stride, &amp;drawCount, &amp;topology);
</ins><span class="cx"> 
</span><span class="cx">     deviceContext-&gt;Unmap(mVertexBuffer, 0);
</span><span class="cx"> 
</span><span class="lines">@@ -592,23 +712,24 @@
</span><span class="cx">     deviceContext-&gt;PSSetConstantBuffers(0, 1, &amp;mSwizzleCB);
</span><span class="cx"> 
</span><span class="cx">     // Apply state
</span><del>-    deviceContext-&gt;OMSetBlendState(NULL, NULL, 0xFFFFFFF);
-    deviceContext-&gt;OMSetDepthStencilState(NULL, 0xFFFFFFFF);
</del><ins>+    deviceContext-&gt;OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
+    deviceContext-&gt;OMSetDepthStencilState(nullptr, 0xFFFFFFFF);
</ins><span class="cx">     deviceContext-&gt;RSSetState(mScissorDisabledRasterizerState);
</span><span class="cx"> 
</span><span class="cx">     // Apply shaders
</span><del>-    deviceContext-&gt;IASetInputLayout(shader-&gt;mInputLayout);
</del><ins>+    deviceContext-&gt;IASetInputLayout(support.inputLayout);
</ins><span class="cx">     deviceContext-&gt;IASetPrimitiveTopology(topology);
</span><del>-    deviceContext-&gt;VSSetShader(shader-&gt;mVertexShader, NULL, 0);
</del><ins>+    deviceContext-&gt;VSSetShader(support.vertexShader, nullptr, 0);
</ins><span class="cx"> 
</span><del>-    deviceContext-&gt;PSSetShader(shader-&gt;mPixelShader, NULL, 0);
-    deviceContext-&gt;GSSetShader(shader-&gt;mGeometryShader, NULL, 0);
</del><ins>+    deviceContext-&gt;PSSetShader(shader-&gt;pixelShader, nullptr, 0);
+    deviceContext-&gt;GSSetShader(support.geometryShader, nullptr, 0);
</ins><span class="cx"> 
</span><span class="cx">     // Unset the currently bound shader resource to avoid conflicts
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
</del><ins>+    auto stateManager = mRenderer-&gt;getStateManager();
+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
</ins><span class="cx"> 
</span><span class="cx">     // Apply render target
</span><del>-    mRenderer-&gt;setOneTimeRenderTarget(dest);
</del><ins>+    stateManager-&gt;setOneTimeRenderTarget(dest, nullptr);
</ins><span class="cx"> 
</span><span class="cx">     // Set the viewport
</span><span class="cx">     D3D11_VIEWPORT viewport;
</span><span class="lines">@@ -621,7 +742,7 @@
</span><span class="cx">     deviceContext-&gt;RSSetViewports(1, &amp;viewport);
</span><span class="cx"> 
</span><span class="cx">     // Apply textures
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, source);
</del><ins>+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, source);
</ins><span class="cx"> 
</span><span class="cx">     // Apply samplers
</span><span class="cx">     deviceContext-&gt;PSSetSamplers(0, 1, &amp;mPointSampler);
</span><span class="lines">@@ -630,12 +751,10 @@
</span><span class="cx">     deviceContext-&gt;Draw(drawCount, 0);
</span><span class="cx"> 
</span><span class="cx">     // Unbind textures and render targets and vertex buffer
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
</del><ins>+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
</ins><span class="cx"> 
</span><del>-    mRenderer-&gt;unapplyRenderTargets();
-
</del><span class="cx">     UINT zero = 0;
</span><del>-    ID3D11Buffer *const nullBuffer = NULL;
</del><ins>+    ID3D11Buffer *const nullBuffer = nullptr;
</ins><span class="cx">     deviceContext-&gt;IASetVertexBuffers(0, 1, &amp;nullBuffer, &amp;zero, &amp;zero);
</span><span class="cx"> 
</span><span class="cx">     mRenderer-&gt;markAllStateDirty();
</span><span class="lines">@@ -643,10 +762,23 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source, const gl::Box &amp;sourceArea, const gl::Extents &amp;sourceSize,
-                              ID3D11RenderTargetView *dest, const gl::Box &amp;destArea, const gl::Extents &amp;destSize,
-                              const gl::Rectangle *scissor, GLenum destFormat, GLenum filter)
</del><ins>+gl::Error Blit11::copyTexture(ID3D11ShaderResourceView *source,
+                              const gl::Box &amp;sourceArea,
+                              const gl::Extents &amp;sourceSize,
+                              ID3D11RenderTargetView *dest,
+                              const gl::Box &amp;destArea,
+                              const gl::Extents &amp;destSize,
+                              const gl::Rectangle *scissor,
+                              GLenum destFormat,
+                              GLenum filter,
+                              bool maskOffAlpha)
</ins><span class="cx"> {
</span><ins>+    gl::Error error = initResources();
+    if (error.isError())
+    {
+        return error;
+    }
+
</ins><span class="cx">     HRESULT result;
</span><span class="cx">     ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><span class="lines">@@ -656,18 +788,23 @@
</span><span class="cx">     source-&gt;GetDesc(&amp;sourceSRVDesc);
</span><span class="cx"> 
</span><span class="cx">     const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(sourceSRVDesc.Format);
</span><del>-    const gl::InternalFormat &amp;internalFormatInfo = gl::GetInternalFormatInfo(dxgiFormatInfo.internalFormat);
</del><ins>+    GLenum componentType                    = dxgiFormatInfo.componentType;
</ins><span class="cx"> 
</span><del>-    bool isSigned = (internalFormatInfo.componentType == GL_INT);
-    bool is3D = (sourceSRVDesc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE3D);
</del><ins>+    ASSERT(componentType != GL_NONE);
+    ASSERT(componentType != GL_SIGNED_NORMALIZED);
+    bool isSigned = (componentType == GL_INT);
</ins><span class="cx"> 
</span><ins>+    ShaderDimension dimension = (sourceSRVDesc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE3D) ? SHADER_3D : SHADER_2D;
+
</ins><span class="cx">     const Shader *shader = nullptr;
</span><del>-    gl::Error error = getBlitShader(destFormat, isSigned, is3D, &amp;shader);
</del><ins>+    error = getBlitShader(destFormat, isSigned, dimension, &amp;shader);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    const ShaderSupport &amp;support = getShaderSupport(*shader);
+
</ins><span class="cx">     // Set vertices
</span><span class="cx">     D3D11_MAPPED_SUBRESOURCE mappedResource;
</span><span class="cx">     result = deviceContext-&gt;Map(mVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &amp;mappedResource);
</span><span class="lines">@@ -681,8 +818,8 @@
</span><span class="cx">     UINT drawCount = 0;
</span><span class="cx">     D3D11_PRIMITIVE_TOPOLOGY topology;
</span><span class="cx"> 
</span><del>-    shader-&gt;mVertexWriteFunction(sourceArea, sourceSize, destArea, destSize, mappedResource.pData,
-                                 &amp;stride, &amp;drawCount, &amp;topology);
</del><ins>+    support.vertexWriteFunction(sourceArea, sourceSize, destArea, destSize, mappedResource.pData,
+                                &amp;stride, &amp;drawCount, &amp;topology);
</ins><span class="cx"> 
</span><span class="cx">     deviceContext-&gt;Unmap(mVertexBuffer, 0);
</span><span class="cx"> 
</span><span class="lines">@@ -690,8 +827,17 @@
</span><span class="cx">     deviceContext-&gt;IASetVertexBuffers(0, 1, &amp;mVertexBuffer, &amp;stride, &amp;startIdx);
</span><span class="cx"> 
</span><span class="cx">     // Apply state
</span><del>-    deviceContext-&gt;OMSetBlendState(NULL, NULL, 0xFFFFFFF);
-    deviceContext-&gt;OMSetDepthStencilState(NULL, 0xFFFFFFFF);
</del><ins>+    if (maskOffAlpha)
+    {
+        ID3D11BlendState *blendState = mAlphaMaskBlendState.resolve(mRenderer-&gt;getDevice());
+        ASSERT(blendState);
+        deviceContext-&gt;OMSetBlendState(blendState, nullptr, 0xFFFFFFF);
+    }
+    else
+    {
+        deviceContext-&gt;OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
+    }
+    deviceContext-&gt;OMSetDepthStencilState(nullptr, 0xFFFFFFFF);
</ins><span class="cx"> 
</span><span class="cx">     if (scissor)
</span><span class="cx">     {
</span><span class="lines">@@ -710,18 +856,19 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Apply shaders
</span><del>-    deviceContext-&gt;IASetInputLayout(shader-&gt;mInputLayout);
</del><ins>+    deviceContext-&gt;IASetInputLayout(support.inputLayout);
</ins><span class="cx">     deviceContext-&gt;IASetPrimitiveTopology(topology);
</span><del>-    deviceContext-&gt;VSSetShader(shader-&gt;mVertexShader, NULL, 0);
</del><ins>+    deviceContext-&gt;VSSetShader(support.vertexShader, nullptr, 0);
</ins><span class="cx"> 
</span><del>-    deviceContext-&gt;PSSetShader(shader-&gt;mPixelShader, NULL, 0);
-    deviceContext-&gt;GSSetShader(shader-&gt;mGeometryShader, NULL, 0);
</del><ins>+    deviceContext-&gt;PSSetShader(shader-&gt;pixelShader, nullptr, 0);
+    deviceContext-&gt;GSSetShader(support.geometryShader, nullptr, 0);
</ins><span class="cx"> 
</span><span class="cx">     // Unset the currently bound shader resource to avoid conflicts
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
</del><ins>+    auto stateManager = mRenderer-&gt;getStateManager();
+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
</ins><span class="cx"> 
</span><span class="cx">     // Apply render target
</span><del>-    mRenderer-&gt;setOneTimeRenderTarget(dest);
</del><ins>+    stateManager-&gt;setOneTimeRenderTarget(dest, nullptr);
</ins><span class="cx"> 
</span><span class="cx">     // Set the viewport
</span><span class="cx">     D3D11_VIEWPORT viewport;
</span><span class="lines">@@ -734,10 +881,10 @@
</span><span class="cx">     deviceContext-&gt;RSSetViewports(1, &amp;viewport);
</span><span class="cx"> 
</span><span class="cx">     // Apply textures
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, source);
</del><ins>+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, source);
</ins><span class="cx"> 
</span><span class="cx">     // Apply samplers
</span><del>-    ID3D11SamplerState *sampler = NULL;
</del><ins>+    ID3D11SamplerState *sampler = nullptr;
</ins><span class="cx">     switch (filter)
</span><span class="cx">     {
</span><span class="cx">       case GL_NEAREST: sampler = mPointSampler;  break;
</span><span class="lines">@@ -753,12 +900,10 @@
</span><span class="cx">     deviceContext-&gt;Draw(drawCount, 0);
</span><span class="cx"> 
</span><span class="cx">     // Unbind textures and render targets and vertex buffer
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
</del><ins>+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
</ins><span class="cx"> 
</span><del>-    mRenderer-&gt;unapplyRenderTargets();
-
</del><span class="cx">     UINT zero = 0;
</span><del>-    ID3D11Buffer *const nullBuffer = NULL;
</del><ins>+    ID3D11Buffer *const nullBuffer = nullptr;
</ins><span class="cx">     deviceContext-&gt;IASetVertexBuffers(0, 1, &amp;nullBuffer, &amp;zero, &amp;zero);
</span><span class="cx"> 
</span><span class="cx">     mRenderer-&gt;markAllStateDirty();
</span><span class="lines">@@ -779,6 +924,12 @@
</span><span class="cx">                             ID3D11DepthStencilView *dest, const gl::Box &amp;destArea, const gl::Extents &amp;destSize,
</span><span class="cx">                             const gl::Rectangle *scissor)
</span><span class="cx"> {
</span><ins>+    gl::Error error = initResources();
+    if (error.isError())
+    {
+        return error;
+    }
+
</ins><span class="cx">     HRESULT result;
</span><span class="cx">     ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><span class="lines">@@ -804,7 +955,7 @@
</span><span class="cx">     deviceContext-&gt;IASetVertexBuffers(0, 1, &amp;mVertexBuffer, &amp;stride, &amp;startIdx);
</span><span class="cx"> 
</span><span class="cx">     // Apply state
</span><del>-    deviceContext-&gt;OMSetBlendState(NULL, NULL, 0xFFFFFFF);
</del><ins>+    deviceContext-&gt;OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
</ins><span class="cx">     deviceContext-&gt;OMSetDepthStencilState(mDepthStencilState, 0xFFFFFFFF);
</span><span class="cx"> 
</span><span class="cx">     if (scissor)
</span><span class="lines">@@ -823,19 +974,27 @@
</span><span class="cx">         deviceContext-&gt;RSSetState(mScissorDisabledRasterizerState);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    ID3D11Device *device = mRenderer-&gt;getDevice();
+    ID3D11VertexShader *quad2DVS = mQuad2DVS.resolve(device);
+    if (quad2DVS == nullptr)
+    {
+        return gl::Error(GL_INVALID_OPERATION, &quot;Error compiling internal 2D blit vertex shader&quot;);
+    }
+
</ins><span class="cx">     // Apply shaders
</span><del>-    deviceContext-&gt;IASetInputLayout(mQuad2DIL);
</del><ins>+    deviceContext-&gt;IASetInputLayout(mQuad2DIL.resolve(device));
</ins><span class="cx">     deviceContext-&gt;IASetPrimitiveTopology(topology);
</span><del>-    deviceContext-&gt;VSSetShader(mQuad2DVS, NULL, 0);
</del><ins>+    deviceContext-&gt;VSSetShader(quad2DVS, nullptr, 0);
</ins><span class="cx"> 
</span><del>-    deviceContext-&gt;PSSetShader(mDepthPS, NULL, 0);
-    deviceContext-&gt;GSSetShader(NULL, NULL, 0);
</del><ins>+    deviceContext-&gt;PSSetShader(mDepthPS.resolve(device), nullptr, 0);
+    deviceContext-&gt;GSSetShader(nullptr, nullptr, 0);
</ins><span class="cx"> 
</span><span class="cx">     // Unset the currently bound shader resource to avoid conflicts
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
</del><ins>+    auto stateManager = mRenderer-&gt;getStateManager();
+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
</ins><span class="cx"> 
</span><span class="cx">     // Apply render target
</span><del>-    deviceContext-&gt;OMSetRenderTargets(0, NULL, dest);
</del><ins>+    stateManager-&gt;setOneTimeRenderTarget(nullptr, dest);
</ins><span class="cx"> 
</span><span class="cx">     // Set the viewport
</span><span class="cx">     D3D11_VIEWPORT viewport;
</span><span class="lines">@@ -848,7 +1007,7 @@
</span><span class="cx">     deviceContext-&gt;RSSetViewports(1, &amp;viewport);
</span><span class="cx"> 
</span><span class="cx">     // Apply textures
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, source);
</del><ins>+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, source);
</ins><span class="cx"> 
</span><span class="cx">     // Apply samplers
</span><span class="cx">     deviceContext-&gt;PSSetSamplers(0, 1, &amp;mPointSampler);
</span><span class="lines">@@ -857,12 +1016,10 @@
</span><span class="cx">     deviceContext-&gt;Draw(drawCount, 0);
</span><span class="cx"> 
</span><span class="cx">     // Unbind textures and render targets and vertex buffer
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
</del><ins>+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
</ins><span class="cx"> 
</span><del>-    mRenderer-&gt;unapplyRenderTargets();
-
</del><span class="cx">     UINT zero = 0;
</span><del>-    ID3D11Buffer *const nullBuffer = NULL;
</del><ins>+    ID3D11Buffer *const nullBuffer = nullptr;
</ins><span class="cx">     deviceContext-&gt;IASetVertexBuffers(0, 1, &amp;nullBuffer, &amp;zero, &amp;zero);
</span><span class="cx"> 
</span><span class="cx">     mRenderer-&gt;markAllStateDirty();
</span><span class="lines">@@ -883,6 +1040,12 @@
</span><span class="cx">                                    ID3D11Resource *dest, unsigned int destSubresource, const gl::Box &amp;destArea, const gl::Extents &amp;destSize,
</span><span class="cx">                                    const gl::Rectangle *scissor, bool stencilOnly)
</span><span class="cx"> {
</span><ins>+    gl::Error error = initResources();
+    if (error.isError())
+    {
+        return error;
+    }
+
</ins><span class="cx">     ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx">     ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><span class="lines">@@ -901,19 +1064,25 @@
</span><span class="cx">     DXGI_FORMAT format = GetTextureFormat(source);
</span><span class="cx">     ASSERT(format == GetTextureFormat(dest));
</span><span class="cx"> 
</span><del>-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(format);
-    unsigned int pixelSize = dxgiFormatInfo.pixelBytes;
</del><ins>+    const d3d11::DXGIFormatSize &amp;dxgiFormatSizeInfo = d3d11::GetDXGIFormatSizeInfo(format);
+    unsigned int pixelSize                          = dxgiFormatSizeInfo.pixelBytes;
</ins><span class="cx">     unsigned int copyOffset = 0;
</span><span class="cx">     unsigned int copySize = pixelSize;
</span><span class="cx">     if (stencilOnly)
</span><span class="cx">     {
</span><del>-        copyOffset = dxgiFormatInfo.depthBits / 8;
-        copySize = dxgiFormatInfo.stencilBits / 8;
</del><ins>+        const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(format);
</ins><span class="cx"> 
</span><del>-        // It would be expensive to have non-byte sized stencil sizes since it would
-        // require reading from the destination, currently there aren't any though.
-        ASSERT(dxgiFormatInfo.stencilBits % 8 == 0 &amp;&amp;
-               dxgiFormatInfo.depthBits   % 8 == 0);
</del><ins>+        // Stencil channel should be right after the depth channel. Some views to depth/stencil
+        // resources have red channel for depth, in which case the depth channel bit width is in
+        // redBits.
+        ASSERT((dxgiFormatInfo.redBits != 0) != (dxgiFormatInfo.depthBits != 0));
+        GLuint depthBits = dxgiFormatInfo.redBits + dxgiFormatInfo.depthBits;
+        // Known formats have either 24 or 32 bits of depth.
+        ASSERT(depthBits == 24 || depthBits == 32);
+        copyOffset = depthBits / 8;
+
+        // Stencil is assumed to be 8-bit - currently this is true for all possible formats.
+        copySize = 1;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     D3D11_MAPPED_SUBRESOURCE sourceMapping;
</span><span class="lines">@@ -999,14 +1168,14 @@
</span><span class="cx"> 
</span><span class="cx">     // HACK: Use ID3D11DevicContext::UpdateSubresource which causes an extra copy compared to ID3D11DevicContext::CopySubresourceRegion
</span><span class="cx">     //       according to MSDN.
</span><del>-    deviceContext-&gt;UpdateSubresource(dest, destSubresource, NULL, destMapping.pData, destMapping.RowPitch, destMapping.DepthPitch);
</del><ins>+    deviceContext-&gt;UpdateSubresource(dest, destSubresource, nullptr, destMapping.pData, destMapping.RowPitch, destMapping.DepthPitch);
</ins><span class="cx"> 
</span><span class="cx">     deviceContext-&gt;Unmap(sourceStaging, 0);
</span><span class="cx">     deviceContext-&gt;Unmap(destStaging, 0);
</span><span class="cx"> 
</span><span class="cx">     // TODO: Determine why this call to ID3D11DevicContext::CopySubresourceRegion causes a TDR timeout on some
</span><span class="cx">     //       systems when called repeatedly.
</span><del>-    // deviceContext-&gt;CopySubresourceRegion(dest, destSubresource, 0, 0, 0, destStaging, 0, NULL);
</del><ins>+    // deviceContext-&gt;CopySubresourceRegion(dest, destSubresource, 0, 0, 0, destStaging, 0, nullptr);
</ins><span class="cx"> 
</span><span class="cx">     SafeRelease(sourceStaging);
</span><span class="cx">     SafeRelease(destStaging);
</span><span class="lines">@@ -1014,57 +1183,26 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Blit11::add2DBlitShaderToMap(BlitShaderType blitShaderType, ID3D11PixelShader *ps)
</del><ins>+void Blit11::addBlitShaderToMap(BlitShaderType blitShaderType, ShaderDimension dimension, ID3D11PixelShader *ps)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mBlitShaderMap.find(blitShaderType) == mBlitShaderMap.end());
</span><span class="cx">     ASSERT(ps);
</span><span class="cx"> 
</span><span class="cx">     Shader shader;
</span><del>-    shader.mVertexWriteFunction = Write2DVertices;
-    shader.mInputLayout = mQuad2DIL;
-    shader.mVertexShader = mQuad2DVS;
-    shader.mGeometryShader = NULL;
-    shader.mPixelShader = ps;
</del><ins>+    shader.dimension = dimension;
+    shader.pixelShader = ps;
</ins><span class="cx"> 
</span><span class="cx">     mBlitShaderMap[blitShaderType] = shader;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Blit11::add3DBlitShaderToMap(BlitShaderType blitShaderType, ID3D11PixelShader *ps)
</del><ins>+void Blit11::addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType, ShaderDimension dimension, ID3D11PixelShader *ps)
</ins><span class="cx"> {
</span><del>-    ASSERT(mBlitShaderMap.find(blitShaderType) == mBlitShaderMap.end());
-    ASSERT(ps);
-
-    Shader shader;
-    shader.mVertexWriteFunction = Write3DVertices;
-    shader.mInputLayout = mQuad3DIL;
-    shader.mVertexShader = mQuad3DVS;
-    shader.mGeometryShader = mQuad3DGS;
-    shader.mPixelShader = ps;
-
-    mBlitShaderMap[blitShaderType] = shader;
-}
-
-void Blit11::addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType, bool is2D, ID3D11PixelShader *ps)
-{
</del><span class="cx">     ASSERT(mSwizzleShaderMap.find(swizzleShaderType) == mSwizzleShaderMap.end());
</span><span class="cx">     ASSERT(ps);
</span><span class="cx"> 
</span><span class="cx">     Shader shader;
</span><del>-    if (is2D)
-    {
-        shader.mVertexWriteFunction = Write2DVertices;
-        shader.mInputLayout = mQuad2DIL;
-        shader.mVertexShader = mQuad2DVS;
-        shader.mGeometryShader = NULL;
-    }
-    else
-    {
-        shader.mVertexWriteFunction = Write3DVertices;
-        shader.mInputLayout = mQuad3DIL;
-        shader.mVertexShader = mQuad3DVS;
-        shader.mGeometryShader = mQuad3DGS;
-    }
-    shader.mPixelShader = ps;
</del><ins>+    shader.dimension = dimension;
+    shader.pixelShader = ps;
</ins><span class="cx"> 
</span><span class="cx">     mSwizzleShaderMap[swizzleShaderType] = shader;
</span><span class="cx"> }
</span><span class="lines">@@ -1073,20 +1211,20 @@
</span><span class="cx"> {
</span><span class="cx">     for (auto &amp;blitShader : mBlitShaderMap)
</span><span class="cx">     {
</span><del>-        SafeRelease(blitShader.second.mPixelShader);
</del><ins>+        SafeRelease(blitShader.second.pixelShader);
</ins><span class="cx">     }
</span><span class="cx">     mBlitShaderMap.clear();
</span><span class="cx"> 
</span><span class="cx">     for (auto &amp;swizzleShader : mSwizzleShaderMap)
</span><span class="cx">     {
</span><del>-        SafeRelease(swizzleShader.second.mPixelShader);
</del><ins>+        SafeRelease(swizzleShader.second.pixelShader);
</ins><span class="cx">     }
</span><span class="cx">     mSwizzleShaderMap.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Blit11::getBlitShader(GLenum destFormat, bool isSigned, bool is3D, const Shader **shader)
</del><ins>+gl::Error Blit11::getBlitShader(GLenum destFormat, bool isSigned, ShaderDimension dimension, const Shader **shader)
</ins><span class="cx"> {
</span><del>-    BlitShaderType blitShaderType = GetBlitShaderType(destFormat, isSigned, is3D);
</del><ins>+    BlitShaderType blitShaderType = GetBlitShaderType(destFormat, isSigned, dimension);
</ins><span class="cx"> 
</span><span class="cx">     if (blitShaderType == BLITSHADER_INVALID)
</span><span class="cx">     {
</span><span class="lines">@@ -1100,107 +1238,107 @@
</span><span class="cx">         return gl::Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(!is3D || mRenderer-&gt;isES3Capable());
</del><ins>+    ASSERT(dimension == SHADER_2D || mRenderer-&gt;isES3Capable());
</ins><span class="cx"> 
</span><span class="cx">     ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">     switch (blitShaderType)
</span><span class="cx">     {
</span><span class="cx">       case BLITSHADER_2D_RGBAF:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGBA2D, &quot;Blit11 2D RGBA pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRGBA2D, &quot;Blit11 2D RGBA pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_BGRAF:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGBA2D, &quot;Blit11 2D BGRA pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRGBA2D, &quot;Blit11 2D BGRA pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RGBF:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGB2D, &quot;Blit11 2D RGB pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRGB2D, &quot;Blit11 2D RGB pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RGF:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRG2D, &quot;Blit11 2D RG pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRG2D, &quot;Blit11 2D RG pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RF:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughR2D, &quot;Blit11 2D R pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughR2D, &quot;Blit11 2D R pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_ALPHA:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGBA2D, &quot;Blit11 2D alpha pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRGBA2D, &quot;Blit11 2D alpha pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_LUMA:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughLum2D, &quot;Blit11 2D lum pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughLum2D, &quot;Blit11 2D lum pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_LUMAALPHA:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughLumAlpha2D, &quot;Blit11 2D luminance alpha pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughLumAlpha2D, &quot;Blit11 2D luminance alpha pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RGBAUI:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGBA2DUI, &quot;Blit11 2D RGBA UI pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRGBA2DUI, &quot;Blit11 2D RGBA UI pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RGBAI:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGBA2DI, &quot;Blit11 2D RGBA I pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRGBA2DI, &quot;Blit11 2D RGBA I pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RGBUI:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGB2DUI, &quot;Blit11 2D RGB UI pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRGB2DUI, &quot;Blit11 2D RGB UI pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RGBI:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGB2DI, &quot;Blit11 2D RGB I pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRGB2DI, &quot;Blit11 2D RGB I pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RGUI:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRG2DUI, &quot;Blit11 2D RG UI pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRG2DUI, &quot;Blit11 2D RG UI pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RGI:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRG2DI, &quot;Blit11 2D RG I pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughRG2DI, &quot;Blit11 2D RG I pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RUI:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughR2DUI, &quot;Blit11 2D R UI pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughR2DUI, &quot;Blit11 2D R UI pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_2D_RI:
</span><del>-        add2DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughR2DI, &quot;Blit11 2D R I pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_PassthroughR2DI, &quot;Blit11 2D R I pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RGBAF:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGBA3D, &quot;Blit11 3D RGBA pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRGBA3D, &quot;Blit11 3D RGBA pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RGBAUI:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGBA3DUI, &quot;Blit11 3D UI RGBA pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRGBA3DUI, &quot;Blit11 3D UI RGBA pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RGBAI:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGBA3DI, &quot;Blit11 3D I RGBA pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRGBA3DI, &quot;Blit11 3D I RGBA pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_BGRAF:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGBA3D, &quot;Blit11 3D BGRA pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRGBA3D, &quot;Blit11 3D BGRA pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RGBF:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGB3D, &quot;Blit11 3D RGB pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRGB3D, &quot;Blit11 3D RGB pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RGBUI:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGB3DUI, &quot;Blit11 3D RGB UI pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRGB3DUI, &quot;Blit11 3D RGB UI pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RGBI:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGB3DI, &quot;Blit11 3D RGB I pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRGB3DI, &quot;Blit11 3D RGB I pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RGF:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRG3D, &quot;Blit11 3D RG pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRG3D, &quot;Blit11 3D RG pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RGUI:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRG3DUI, &quot;Blit11 3D RG UI pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRG3DUI, &quot;Blit11 3D RG UI pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RGI:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRG3DI, &quot;Blit11 3D RG I pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRG3DI, &quot;Blit11 3D RG I pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RF:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughR3D, &quot;Blit11 3D R pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughR3D, &quot;Blit11 3D R pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RUI:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughR3DUI, &quot;Blit11 3D R UI pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughR3DUI, &quot;Blit11 3D R UI pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_RI:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughR3DI, &quot;Blit11 3D R I pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughR3DI, &quot;Blit11 3D R I pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_ALPHA:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughRGBA3D, &quot;Blit11 3D alpha pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughRGBA3D, &quot;Blit11 3D alpha pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_LUMA:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughLum3D, &quot;Blit11 3D luminance pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughLum3D, &quot;Blit11 3D luminance pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case BLITSHADER_3D_LUMAALPHA:
</span><del>-        add3DBlitShaderToMap(blitShaderType, d3d11::CompilePS(device, g_PS_PassthroughLumAlpha3D, &quot;Blit11 3D luminance alpha pixel shader&quot;));
</del><ins>+        addBlitShaderToMap(blitShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_PassthroughLumAlpha3D, &quot;Blit11 3D luminance alpha pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       default:
</span><span class="cx">         UNREACHABLE();
</span><span class="lines">@@ -1237,40 +1375,40 @@
</span><span class="cx">     switch (swizzleShaderType)
</span><span class="cx">     {
</span><span class="cx">       case SWIZZLESHADER_2D_FLOAT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, true, d3d11::CompilePS(device, g_PS_SwizzleF2D, &quot;Blit11 2D F swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_SwizzleF2D, &quot;Blit11 2D F swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_2D_UINT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, true, d3d11::CompilePS(device, g_PS_SwizzleUI2D, &quot;Blit11 2D UI swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_SwizzleUI2D, &quot;Blit11 2D UI swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_2D_INT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, true, d3d11::CompilePS(device, g_PS_SwizzleI2D, &quot;Blit11 2D I swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_2D, d3d11::CompilePS(device, g_PS_SwizzleI2D, &quot;Blit11 2D I swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_CUBE_FLOAT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, false, d3d11::CompilePS(device, g_PS_SwizzleF2DArray, &quot;Blit11 2D Cube F swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_SwizzleF2DArray, &quot;Blit11 2D Cube F swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_CUBE_UINT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, false, d3d11::CompilePS(device, g_PS_SwizzleUI2DArray, &quot;Blit11 2D Cube UI swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_SwizzleUI2DArray, &quot;Blit11 2D Cube UI swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_CUBE_INT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, false, d3d11::CompilePS(device, g_PS_SwizzleI2DArray, &quot;Blit11 2D Cube I swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_SwizzleI2DArray, &quot;Blit11 2D Cube I swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_3D_FLOAT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, false, d3d11::CompilePS(device, g_PS_SwizzleF3D, &quot;Blit11 3D F swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_SwizzleF3D, &quot;Blit11 3D F swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_3D_UINT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, false, d3d11::CompilePS(device, g_PS_SwizzleUI3D, &quot;Blit11 3D UI swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_SwizzleUI3D, &quot;Blit11 3D UI swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_3D_INT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, false, d3d11::CompilePS(device, g_PS_SwizzleI3D, &quot;Blit11 3D I swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_SwizzleI3D, &quot;Blit11 3D I swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_ARRAY_FLOAT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, false, d3d11::CompilePS(device, g_PS_SwizzleF2DArray, &quot;Blit11 2D Array F swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_SwizzleF2DArray, &quot;Blit11 2D Array F swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_ARRAY_UINT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, false, d3d11::CompilePS(device, g_PS_SwizzleUI2DArray, &quot;Blit11 2D Array UI swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_SwizzleUI2DArray, &quot;Blit11 2D Array UI swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       case SWIZZLESHADER_ARRAY_INT:
</span><del>-        addSwizzleShaderToMap(swizzleShaderType, false, d3d11::CompilePS(device, g_PS_SwizzleI2DArray, &quot;Blit11 2D Array I swizzle pixel shader&quot;));
</del><ins>+        addSwizzleShaderToMap(swizzleShaderType, SHADER_3D, d3d11::CompilePS(device, g_PS_SwizzleI2DArray, &quot;Blit11 2D Array I swizzle pixel shader&quot;));
</ins><span class="cx">         break;
</span><span class="cx">       default:
</span><span class="cx">         UNREACHABLE();
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Blit11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Blit11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Blit11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Blit11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,6 +12,7 @@
</span><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #include &lt;map&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -28,9 +29,16 @@
</span><span class="cx">     gl::Error swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTargetView *dest, const gl::Extents &amp;size,
</span><span class="cx">                              GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
</span><span class="cx"> 
</span><del>-    gl::Error copyTexture(ID3D11ShaderResourceView *source, const gl::Box &amp;sourceArea, const gl::Extents &amp;sourceSize,
-                          ID3D11RenderTargetView *dest, const gl::Box &amp;destArea, const gl::Extents &amp;destSize,
-                          const gl::Rectangle *scissor, GLenum destFormat, GLenum filter);
</del><ins>+    gl::Error copyTexture(ID3D11ShaderResourceView *source,
+                          const gl::Box &amp;sourceArea,
+                          const gl::Extents &amp;sourceSize,
+                          ID3D11RenderTargetView *dest,
+                          const gl::Box &amp;destArea,
+                          const gl::Extents &amp;destSize,
+                          const gl::Rectangle *scissor,
+                          GLenum destFormat,
+                          GLenum filter,
+                          bool maskOffAlpha);
</ins><span class="cx"> 
</span><span class="cx">     gl::Error copyStencil(ID3D11Resource *source, unsigned int sourceSubresource, const gl::Box &amp;sourceArea, const gl::Extents &amp;sourceSize,
</span><span class="cx">                           ID3D11Resource *dest, unsigned int destSubresource, const gl::Box &amp;destArea, const gl::Extents &amp;destSize,
</span><span class="lines">@@ -82,8 +90,6 @@
</span><span class="cx">         BLITSHADER_3D_LUMAALPHA,
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    static BlitShaderType GetBlitShaderType(GLenum destinationFormat, bool isSigned, bool is3D);
-
</del><span class="cx">     enum SwizzleShaderType
</span><span class="cx">     {
</span><span class="cx">         SWIZZLESHADER_INVALID,
</span><span class="lines">@@ -101,33 +107,49 @@
</span><span class="cx">         SWIZZLESHADER_ARRAY_INT,
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    static SwizzleShaderType GetSwizzleShaderType(GLenum type, D3D11_SRV_DIMENSION dimensionality);
-
-    gl::Error copyDepthStencil(ID3D11Resource *source, unsigned int sourceSubresource, const gl::Box &amp;sourceArea, const gl::Extents &amp;sourceSize,
-                               ID3D11Resource *dest, unsigned int destSubresource, const gl::Box &amp;destArea, const gl::Extents &amp;destSize,
-                               const gl::Rectangle *scissor, bool stencilOnly);
-
</del><span class="cx">     typedef void (*WriteVertexFunction)(const gl::Box &amp;sourceArea, const gl::Extents &amp;sourceSize,
</span><span class="cx">                                         const gl::Box &amp;destArea, const gl::Extents &amp;destSize,
</span><span class="cx">                                         void *outVertices, unsigned int *outStride, unsigned int *outVertexCount,
</span><span class="cx">                                         D3D11_PRIMITIVE_TOPOLOGY *outTopology);
</span><span class="cx"> 
</span><ins>+    enum ShaderDimension
+    {
+        SHADER_2D,
+        SHADER_3D,
+    };
+
</ins><span class="cx">     struct Shader
</span><span class="cx">     {
</span><del>-        WriteVertexFunction mVertexWriteFunction;
-        ID3D11InputLayout *mInputLayout;
-        ID3D11VertexShader *mVertexShader;
-        ID3D11GeometryShader *mGeometryShader;
-        ID3D11PixelShader *mPixelShader;
</del><ins>+        ShaderDimension dimension;
+        ID3D11PixelShader *pixelShader;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><del>-    void add2DBlitShaderToMap(BlitShaderType blitShaderType, ID3D11PixelShader *ps);
-    void add3DBlitShaderToMap(BlitShaderType blitShaderType, ID3D11PixelShader *ps);
</del><ins>+    struct ShaderSupport
+    {
+        ID3D11InputLayout *inputLayout;
+        ID3D11VertexShader *vertexShader;
+        ID3D11GeometryShader *geometryShader;
+        WriteVertexFunction vertexWriteFunction;
+    };
</ins><span class="cx"> 
</span><del>-    gl::Error getBlitShader(GLenum destFormat, bool isSigned, bool is3D, const Shader **shaderOut);
</del><ins>+    gl::Error initResources();
+    void freeResources();
+
+    ShaderSupport getShaderSupport(const Shader &amp;shader);
+
+    static BlitShaderType GetBlitShaderType(GLenum destinationFormat, bool isSigned, ShaderDimension dimension);
+    static SwizzleShaderType GetSwizzleShaderType(GLenum type, D3D11_SRV_DIMENSION dimensionality);
+
+    gl::Error copyDepthStencil(ID3D11Resource *source, unsigned int sourceSubresource, const gl::Box &amp;sourceArea, const gl::Extents &amp;sourceSize,
+                               ID3D11Resource *dest, unsigned int destSubresource, const gl::Box &amp;destArea, const gl::Extents &amp;destSize,
+                               const gl::Rectangle *scissor, bool stencilOnly);
+
+    void addBlitShaderToMap(BlitShaderType blitShaderType, ShaderDimension dimension, ID3D11PixelShader *ps);
+
+    gl::Error getBlitShader(GLenum destFormat, bool isSigned, ShaderDimension dimension, const Shader **shaderOut);
</ins><span class="cx">     gl::Error getSwizzleShader(GLenum type, D3D11_SRV_DIMENSION viewDimension, const Shader **shaderOut);
</span><span class="cx"> 
</span><del>-    void addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType, bool is2D, ID3D11PixelShader *ps);
</del><ins>+    void addSwizzleShaderToMap(SwizzleShaderType swizzleShaderType, ShaderDimension dimension, ID3D11PixelShader *ps);
</ins><span class="cx"> 
</span><span class="cx">     void clearShaderMap();
</span><span class="cx"> 
</span><span class="lines">@@ -136,6 +158,7 @@
</span><span class="cx">     std::map&lt;BlitShaderType, Shader&gt; mBlitShaderMap;
</span><span class="cx">     std::map&lt;SwizzleShaderType, Shader&gt; mSwizzleShaderMap;
</span><span class="cx"> 
</span><ins>+    bool mResourcesInitialized;
</ins><span class="cx">     ID3D11Buffer *mVertexBuffer;
</span><span class="cx">     ID3D11SamplerState *mPointSampler;
</span><span class="cx">     ID3D11SamplerState *mLinearSampler;
</span><span class="lines">@@ -143,14 +166,16 @@
</span><span class="cx">     ID3D11RasterizerState *mScissorDisabledRasterizerState;
</span><span class="cx">     ID3D11DepthStencilState *mDepthStencilState;
</span><span class="cx"> 
</span><del>-    ID3D11InputLayout *mQuad2DIL;
-    ID3D11VertexShader *mQuad2DVS;
-    ID3D11PixelShader *mDepthPS;
</del><ins>+    d3d11::LazyInputLayout mQuad2DIL;
+    d3d11::LazyShader&lt;ID3D11VertexShader&gt; mQuad2DVS;
+    d3d11::LazyShader&lt;ID3D11PixelShader&gt; mDepthPS;
</ins><span class="cx"> 
</span><del>-    ID3D11InputLayout *mQuad3DIL;
-    ID3D11VertexShader *mQuad3DVS;
-    ID3D11GeometryShader *mQuad3DGS;
</del><ins>+    d3d11::LazyInputLayout mQuad3DIL;
+    d3d11::LazyShader&lt;ID3D11VertexShader&gt; mQuad3DVS;
+    d3d11::LazyShader&lt;ID3D11GeometryShader&gt; mQuad3DGS;
</ins><span class="cx"> 
</span><ins>+    d3d11::LazyBlendState mAlphaMaskBlendState;
+
</ins><span class="cx">     ID3D11Buffer *mSwizzleCB;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Buffer11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,39 +8,64 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Buffer11.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;memory&gt;
+
</ins><span class="cx"> #include &quot;common/MemoryBuffer.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/IndexDataManager.h&quot;
+#include &quot;libANGLE/renderer/d3d/VertexDataManager.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/RenderTarget11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+namespace
+{
+
+template &lt;typename T&gt;
+GLuint ReadIndexValueFromIndices(const uint8_t *data, size_t index)
+{
+    return reinterpret_cast&lt;const T *&gt;(data)[index];
+}
+typedef GLuint (*ReadIndexValueFunction)(const uint8_t *data, size_t index);
+
+enum class CopyResult
+{
+    RECREATED,
+    NOT_RECREATED,
+};
+
+}  // anonymous namespace
+
</ins><span class="cx"> PackPixelsParams::PackPixelsParams()
</span><del>-  : format(GL_NONE),
-    type(GL_NONE),
-    outputPitch(0),
-    packBuffer(NULL),
-    offset(0)
-{}
</del><ins>+    : format(GL_NONE), type(GL_NONE), outputPitch(0), packBuffer(nullptr), offset(0)
+{
+}
</ins><span class="cx"> 
</span><del>-PackPixelsParams::PackPixelsParams(const gl::Rectangle &amp;areaIn, GLenum formatIn, GLenum typeIn, GLuint outputPitchIn,
-                                   const gl::PixelPackState &amp;packIn, ptrdiff_t offsetIn)
-  : area(areaIn),
-    format(formatIn),
-    type(typeIn),
-    outputPitch(outputPitchIn),
-    packBuffer(packIn.pixelBuffer.get()),
-    pack(packIn.alignment, packIn.reverseRowOrder),
-    offset(offsetIn)
-{}
</del><ins>+PackPixelsParams::PackPixelsParams(const gl::Rectangle &amp;areaIn,
+                                   GLenum formatIn,
+                                   GLenum typeIn,
+                                   GLuint outputPitchIn,
+                                   const gl::PixelPackState &amp;packIn,
+                                   ptrdiff_t offsetIn)
+    : area(areaIn),
+      format(formatIn),
+      type(typeIn),
+      outputPitch(outputPitchIn),
+      packBuffer(packIn.pixelBuffer.get()),
+      pack(packIn.alignment, packIn.reverseRowOrder),
+      offset(offsetIn)
+{
+}
</ins><span class="cx"> 
</span><span class="cx"> namespace gl_d3d11
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> D3D11_MAP GetD3DMapTypeFromBits(GLbitfield access)
</span><span class="cx"> {
</span><del>-    bool readBit = ((access &amp; GL_MAP_READ_BIT) != 0);
</del><ins>+    bool readBit  = ((access &amp; GL_MAP_READ_BIT) != 0);
</ins><span class="cx">     bool writeBit = ((access &amp; GL_MAP_WRITE_BIT) != 0);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(readBit || writeBit);
</span><span class="lines">@@ -66,9 +91,8 @@
</span><span class="cx">         return D3D11_MAP_READ;
</span><span class="cx">     }
</span><span class="cx"> }
</span><ins>+}  // namespace gl_d3d11
</ins><span class="cx"> 
</span><del>-}
-
</del><span class="cx"> // Each instance of Buffer11::BufferStorage is specialized for a class of D3D binding points
</span><span class="cx"> // - vertex/transform feedback buffers
</span><span class="cx"> // - index buffers
</span><span class="lines">@@ -86,11 +110,16 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool isMappable() const = 0;
</span><span class="cx"> 
</span><del>-    virtual bool copyFromStorage(BufferStorage *source, size_t sourceOffset,
-                                 size_t size, size_t destOffset) = 0;
</del><ins>+    virtual gl::ErrorOrResult&lt;CopyResult&gt; copyFromStorage(BufferStorage *source,
+                                                          size_t sourceOffset,
+                                                          size_t size,
+                                                          size_t destOffset) = 0;
</ins><span class="cx">     virtual gl::Error resize(size_t size, bool preserveData) = 0;
</span><span class="cx"> 
</span><del>-    virtual uint8_t *map(size_t offset, size_t length, GLbitfield access) = 0;
</del><ins>+    virtual gl::Error map(size_t offset,
+                          size_t length,
+                          GLbitfield access,
+                          uint8_t **mapPointerOut) = 0;
</ins><span class="cx">     virtual void unmap() = 0;
</span><span class="cx"> 
</span><span class="cx">     gl::Error setData(const uint8_t *data, size_t offset, size_t size);
</span><span class="lines">@@ -109,26 +138,68 @@
</span><span class="cx"> class Buffer11::NativeStorage : public Buffer11::BufferStorage
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    NativeStorage(Renderer11 *renderer, BufferUsage usage);
</del><ins>+    NativeStorage(Renderer11 *renderer, BufferUsage usage, const NotificationSet *onStorageChanged);
</ins><span class="cx">     ~NativeStorage() override;
</span><span class="cx"> 
</span><span class="cx">     bool isMappable() const override { return mUsage == BUFFER_USAGE_STAGING; }
</span><span class="cx"> 
</span><span class="cx">     ID3D11Buffer *getNativeStorage() const { return mNativeStorage; }
</span><del>-
-    bool copyFromStorage(BufferStorage *source, size_t sourceOffset,
-                         size_t size, size_t destOffset) override;
</del><ins>+    gl::ErrorOrResult&lt;CopyResult&gt; copyFromStorage(BufferStorage *source,
+                                                  size_t sourceOffset,
+                                                  size_t size,
+                                                  size_t destOffset) override;
</ins><span class="cx">     gl::Error resize(size_t size, bool preserveData) override;
</span><span class="cx"> 
</span><del>-    uint8_t *map(size_t offset, size_t length, GLbitfield access) override;
</del><ins>+    gl::Error map(size_t offset,
+                  size_t length,
+                  GLbitfield access,
+                  uint8_t **mapPointerOut) override;
</ins><span class="cx">     void unmap() override;
</span><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    static void fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Renderer11 *renderer, BufferUsage usage, unsigned int bufferSize);
</del><ins>+    static void fillBufferDesc(D3D11_BUFFER_DESC *bufferDesc,
+                               Renderer11 *renderer,
+                               BufferUsage usage,
+                               unsigned int bufferSize);
</ins><span class="cx"> 
</span><span class="cx">     ID3D11Buffer *mNativeStorage;
</span><ins>+    const NotificationSet *mOnStorageChanged;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+// A emulated indexed buffer storage represents an underlying D3D11 buffer for data
+// that has been expanded to match the indices list used. This storage is only
+// used for FL9_3 pointsprite rendering emulation.
+class Buffer11::EmulatedIndexedStorage : public Buffer11::BufferStorage
+{
+  public:
+    EmulatedIndexedStorage(Renderer11 *renderer);
+    ~EmulatedIndexedStorage() override;
+
+    bool isMappable() const override { return true; }
+
+    gl::ErrorOrResult&lt;ID3D11Buffer *&gt; getNativeStorage(SourceIndexData *indexInfo,
+                                                       const TranslatedAttribute &amp;attribute,
+                                                       GLint startVertex);
+
+    gl::ErrorOrResult&lt;CopyResult&gt; copyFromStorage(BufferStorage *source,
+                                                  size_t sourceOffset,
+                                                  size_t size,
+                                                  size_t destOffset) override;
+
+    gl::Error resize(size_t size, bool preserveData) override;
+
+    gl::Error map(size_t offset,
+                  size_t length,
+                  GLbitfield access,
+                  uint8_t **mapPointerOut) override;
+    void unmap() override;
+
+  private:
+    ID3D11Buffer *mNativeStorage;       // contains expanded data for use by D3D
+    MemoryBuffer mMemoryBuffer;         // original data (not expanded)
+    MemoryBuffer mIndicesMemoryBuffer;  // indices data
+};
+
</ins><span class="cx"> // Pack storage represents internal storage for pack buffers. We implement pack buffers
</span><span class="cx"> // as CPU memory, tied to a staging texture, for asynchronous texture readback.
</span><span class="cx"> class Buffer11::PackStorage : public Buffer11::BufferStorage
</span><span class="lines">@@ -138,24 +209,27 @@
</span><span class="cx">     ~PackStorage() override;
</span><span class="cx"> 
</span><span class="cx">     bool isMappable() const override { return true; }
</span><del>-
-    bool copyFromStorage(BufferStorage *source, size_t sourceOffset,
-                         size_t size, size_t destOffset) override;
</del><ins>+    gl::ErrorOrResult&lt;CopyResult&gt; copyFromStorage(BufferStorage *source,
+                                                  size_t sourceOffset,
+                                                  size_t size,
+                                                  size_t destOffset) override;
</ins><span class="cx">     gl::Error resize(size_t size, bool preserveData) override;
</span><span class="cx"> 
</span><del>-    uint8_t *map(size_t offset, size_t length, GLbitfield access) override;
</del><ins>+    gl::Error map(size_t offset,
+                  size_t length,
+                  GLbitfield access,
+                  uint8_t **mapPointerOut) override;
</ins><span class="cx">     void unmap() override;
</span><span class="cx"> 
</span><del>-    gl::Error packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &amp;params);
</del><ins>+    gl::Error packPixels(const gl::FramebufferAttachment &amp;readAttachment,
+                         const PackPixelsParams &amp;params);
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     gl::Error flushQueuedPackCommand();
</span><span class="cx"> 
</span><del>-    ID3D11Texture2D *mStagingTexture;
-    DXGI_FORMAT mTextureFormat;
-    gl::Extents mTextureSize;
</del><ins>+    TextureHelper11 mStagingTexture;
</ins><span class="cx">     MemoryBuffer mMemoryBuffer;
</span><del>-    PackPixelsParams *mQueuedPackCommand;
</del><ins>+    std::unique_ptr&lt;PackPixelsParams&gt; mQueuedPackCommand;
</ins><span class="cx">     PackPixelsParams mPackParams;
</span><span class="cx">     bool mDataModified;
</span><span class="cx"> };
</span><span class="lines">@@ -170,12 +244,16 @@
</span><span class="cx">     ~SystemMemoryStorage() override {}
</span><span class="cx"> 
</span><span class="cx">     bool isMappable() const override { return true; }
</span><del>-
-    bool copyFromStorage(BufferStorage *source, size_t sourceOffset,
-                         size_t size, size_t destOffset) override;
</del><ins>+    gl::ErrorOrResult&lt;CopyResult&gt; copyFromStorage(BufferStorage *source,
+                                                  size_t sourceOffset,
+                                                  size_t size,
+                                                  size_t destOffset) override;
</ins><span class="cx">     gl::Error resize(size_t size, bool preserveData) override;
</span><span class="cx"> 
</span><del>-    uint8_t *map(size_t offset, size_t length, GLbitfield access) override;
</del><ins>+    gl::Error map(size_t offset,
+                  size_t length,
+                  GLbitfield access,
+                  uint8_t **mapPointerOut) override;
</ins><span class="cx">     void unmap() override;
</span><span class="cx"> 
</span><span class="cx">     MemoryBuffer *getSystemCopy() { return &amp;mSystemCopy; }
</span><span class="lines">@@ -188,73 +266,54 @@
</span><span class="cx">     : BufferD3D(renderer),
</span><span class="cx">       mRenderer(renderer),
</span><span class="cx">       mSize(0),
</span><del>-      mMappedStorage(NULL),
</del><ins>+      mMappedStorage(nullptr),
+      mBufferStorages(BUFFER_USAGE_COUNT, nullptr),
</ins><span class="cx">       mConstantBufferStorageAdditionalSize(0),
</span><span class="cx">       mMaxConstantBufferLruCount(0),
</span><del>-      mReadUsageCount(0),
-      mHasSystemMemoryStorage(false)
-{}
</del><ins>+      mReadUsageCount(0)
+{
+}
</ins><span class="cx"> 
</span><span class="cx"> Buffer11::~Buffer11()
</span><span class="cx"> {
</span><del>-    for (auto &amp;p : mBufferStorages)
</del><ins>+    for (auto &amp;storage : mBufferStorages)
</ins><span class="cx">     {
</span><del>-        SafeDelete(p.second);
</del><ins>+        SafeDelete(storage);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (auto &amp;p : mConstantBufferRangeStoragesCache)
</span><span class="cx">     {
</span><span class="cx">         SafeDelete(p.second.storage);
</span><span class="cx">     }
</span><ins>+
+    mRenderer-&gt;onBufferDelete(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Buffer11::setData(const void *data, size_t size, GLenum usage)
</span><span class="cx"> {
</span><del>-    gl::Error error = setSubData(data, size, 0);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    if (usage == GL_STATIC_DRAW)
-    {
-        initializeStaticData();
-    }
-
-    return error;
</del><ins>+    updateD3DBufferUsage(usage);
+    ANGLE_TRY(setSubData(data, size, 0));
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Buffer11::getData(const uint8_t **outData)
</span><span class="cx"> {
</span><span class="cx">     SystemMemoryStorage *systemMemoryStorage = nullptr;
</span><del>-    gl::Error error = getSystemMemoryStorage(&amp;systemMemoryStorage);
</del><ins>+    ANGLE_TRY_RESULT(getSystemMemoryStorage(), systemMemoryStorage);
</ins><span class="cx"> 
</span><del>-    if (error.isError())
-    {
-        *outData = nullptr;
-        return error;
-    }
-
</del><span class="cx">     mReadUsageCount = 0;
</span><span class="cx"> 
</span><span class="cx">     ASSERT(systemMemoryStorage-&gt;getSize() &gt;= mSize);
</span><span class="cx"> 
</span><span class="cx">     *outData = systemMemoryStorage-&gt;getSystemCopy()-&gt;data();
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Buffer11::getSystemMemoryStorage(SystemMemoryStorage **storageOut)
</del><ins>+gl::ErrorOrResult&lt;Buffer11::SystemMemoryStorage *&gt; Buffer11::getSystemMemoryStorage()
</ins><span class="cx"> {
</span><del>-    BufferStorage *memStorageUntyped = getBufferStorage(BUFFER_USAGE_SYSTEM_MEMORY);
-
-    if (memStorageUntyped == nullptr)
-    {
-        // TODO(jmadill): convert all to errors
-        return gl::Error(GL_OUT_OF_MEMORY);
-    }
-
-    *storageOut = GetAs&lt;SystemMemoryStorage&gt;(memStorageUntyped);
-    return gl::Error(GL_NO_ERROR);
</del><ins>+    BufferStorage *storage = nullptr;
+    ANGLE_TRY_RESULT(getBufferStorage(BUFFER_USAGE_SYSTEM_MEMORY), storage);
+    return GetAs&lt;SystemMemoryStorage&gt;(storage);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Buffer11::setSubData(const void *data, size_t size, size_t offset)
</span><span class="lines">@@ -268,23 +327,11 @@
</span><span class="cx">         BufferStorage *writeBuffer = nullptr;
</span><span class="cx">         if (supportsDirectBinding())
</span><span class="cx">         {
</span><del>-            writeBuffer = getStagingStorage();
-
-            if (!writeBuffer)
-            {
-                return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to allocate internal buffer.&quot;);
-            }
</del><ins>+            ANGLE_TRY_RESULT(getStagingStorage(), writeBuffer);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            SystemMemoryStorage *systemMemoryStorage = nullptr;
-            gl::Error error = getSystemMemoryStorage(&amp;systemMemoryStorage);
-            if (error.isError())
-            {
-                return error;
-            }
-
-            writeBuffer = systemMemoryStorage;
</del><ins>+            ANGLE_TRY_RESULT(getSystemMemoryStorage(), writeBuffer);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         ASSERT(writeBuffer);
</span><span class="lines">@@ -294,11 +341,7 @@
</span><span class="cx">         if (writeBuffer-&gt;getSize() &lt; requiredSize)
</span><span class="cx">         {
</span><span class="cx">             bool preserveData = (offset &gt; 0);
</span><del>-            gl::Error error = writeBuffer-&gt;resize(requiredSize, preserveData);
-            if (error.isError())
-            {
-                return error;
-            }
</del><ins>+            ANGLE_TRY(writeBuffer-&gt;resize(requiredSize, preserveData));
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         writeBuffer-&gt;setData(static_cast&lt;const uint8_t *&gt;(data), offset, size);
</span><span class="lines">@@ -308,21 +351,27 @@
</span><span class="cx">     mSize = std::max(mSize, requiredSize);
</span><span class="cx">     invalidateStaticData();
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Buffer11::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
</del><ins>+gl::Error Buffer11::copySubData(BufferImpl *source,
+                                GLintptr sourceOffset,
+                                GLintptr destOffset,
+                                GLsizeiptr size)
</ins><span class="cx"> {
</span><span class="cx">     Buffer11 *sourceBuffer = GetAs&lt;Buffer11&gt;(source);
</span><del>-    ASSERT(sourceBuffer != NULL);
</del><ins>+    ASSERT(sourceBuffer != nullptr);
</ins><span class="cx"> 
</span><del>-    BufferStorage *copyDest = getLatestBufferStorage();
</del><ins>+    BufferStorage *copyDest = nullptr;
+    ANGLE_TRY_RESULT(getLatestBufferStorage(), copyDest);
+
</ins><span class="cx">     if (!copyDest)
</span><span class="cx">     {
</span><del>-        copyDest = getStagingStorage();
</del><ins>+        ANGLE_TRY_RESULT(getStagingStorage(), copyDest);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    BufferStorage *copySource = sourceBuffer-&gt;getLatestBufferStorage();
</del><ins>+    BufferStorage *copySource = nullptr;
+    ANGLE_TRY_RESULT(sourceBuffer-&gt;getLatestBufferStorage(), copySource);
</ins><span class="cx"> 
</span><span class="cx">     if (!copySource || !copyDest)
</span><span class="cx">     {
</span><span class="lines">@@ -333,11 +382,11 @@
</span><span class="cx">     // pack buffer partner, because other native buffers can't be mapped
</span><span class="cx">     if (copyDest-&gt;getUsage() == BUFFER_USAGE_PIXEL_PACK &amp;&amp; !copySource-&gt;isMappable())
</span><span class="cx">     {
</span><del>-        copySource = sourceBuffer-&gt;getStagingStorage();
</del><ins>+        ANGLE_TRY_RESULT(sourceBuffer-&gt;getStagingStorage(), copySource);
</ins><span class="cx">     }
</span><span class="cx">     else if (copySource-&gt;getUsage() == BUFFER_USAGE_PIXEL_PACK &amp;&amp; !copyDest-&gt;isMappable())
</span><span class="cx">     {
</span><del>-        copyDest = getStagingStorage();
</del><ins>+        ANGLE_TRY_RESULT(getStagingStorage(), copyDest);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // D3D11 does not allow overlapped copies until 11.1, and only if the
</span><span class="lines">@@ -347,21 +396,24 @@
</span><span class="cx">     {
</span><span class="cx">         if (copySource-&gt;getUsage() == BUFFER_USAGE_STAGING)
</span><span class="cx">         {
</span><del>-            copySource = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
</del><ins>+            ANGLE_TRY_RESULT(getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK),
+                             copySource);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            copySource = getStagingStorage();
</del><ins>+            ANGLE_TRY_RESULT(getStagingStorage(), copySource);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    copyDest-&gt;copyFromStorage(copySource, sourceOffset, size, destOffset);
</del><ins>+    CopyResult copyResult = CopyResult::NOT_RECREATED;
+    ANGLE_TRY_RESULT(copyDest-&gt;copyFromStorage(copySource, sourceOffset, size, destOffset),
+                     copyResult);
</ins><span class="cx">     copyDest-&gt;setDataRevision(copyDest-&gt;getDataRevision() + 1);
</span><span class="cx"> 
</span><span class="cx">     mSize = std::max&lt;size_t&gt;(mSize, destOffset + size);
</span><span class="cx">     invalidateStaticData();
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Buffer11::map(GLenum access, GLvoid **mapPtr)
</span><span class="lines">@@ -376,19 +428,20 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!mMappedStorage);
</span><span class="cx"> 
</span><del>-    BufferStorage *latestStorage = getLatestBufferStorage();
-    if (latestStorage &amp;&amp;
-        (latestStorage-&gt;getUsage() == BUFFER_USAGE_PIXEL_PACK ||
-         latestStorage-&gt;getUsage() == BUFFER_USAGE_STAGING))
</del><ins>+    BufferStorage *latestStorage = nullptr;
+    ANGLE_TRY_RESULT(getLatestBufferStorage(), latestStorage);
+
+    if (latestStorage &amp;&amp; (latestStorage-&gt;getUsage() == BUFFER_USAGE_PIXEL_PACK ||
+                          latestStorage-&gt;getUsage() == BUFFER_USAGE_STAGING))
</ins><span class="cx">     {
</span><span class="cx">         // Latest storage is mappable.
</span><span class="cx">         mMappedStorage = latestStorage;
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        // Fall back to using the staging buffer if the latest storage does
-        // not exist or is not CPU-accessible.
-        mMappedStorage = getStagingStorage();
</del><ins>+        // Fall back to using the staging buffer if the latest storage does not exist or is not
+        // CPU-accessible.
+        ANGLE_TRY_RESULT(getStagingStorage(), mMappedStorage);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (!mMappedStorage)
</span><span class="lines">@@ -400,33 +453,34 @@
</span><span class="cx">     {
</span><span class="cx">         // Update the data revision immediately, since the data might be changed at any time
</span><span class="cx">         mMappedStorage-&gt;setDataRevision(mMappedStorage-&gt;getDataRevision() + 1);
</span><ins>+        invalidateStaticData();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    uint8_t *mappedBuffer = mMappedStorage-&gt;map(offset, length, access);
-    if (!mappedBuffer)
-    {
-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to map internal buffer.&quot;);
-    }
</del><ins>+    uint8_t *mappedBuffer = nullptr;
+    ANGLE_TRY(mMappedStorage-&gt;map(offset, length, access, &amp;mappedBuffer));
+    ASSERT(mappedBuffer);
</ins><span class="cx"> 
</span><span class="cx">     *mapPtr = static_cast&lt;GLvoid *&gt;(mappedBuffer);
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Buffer11::unmap(GLboolean *result)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(mMappedStorage);
</span><span class="cx">     mMappedStorage-&gt;unmap();
</span><del>-    mMappedStorage = NULL;
</del><ins>+    mMappedStorage = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     // TODO: detect if we had corruption. if so, return false.
</span><span class="cx">     *result = GL_TRUE;
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Buffer11::markTransformFeedbackUsage()
</del><ins>+gl::Error Buffer11::markTransformFeedbackUsage()
</ins><span class="cx"> {
</span><del>-    BufferStorage *transformFeedbackStorage = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
</del><ins>+    BufferStorage *transformFeedbackStorage = nullptr;
+    ANGLE_TRY_RESULT(getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK),
+                     transformFeedbackStorage);
</ins><span class="cx"> 
</span><span class="cx">     if (transformFeedbackStorage)
</span><span class="cx">     {
</span><span class="lines">@@ -434,78 +488,82 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     invalidateStaticData();
</span><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Buffer11::markBufferUsage()
</del><ins>+gl::Error Buffer11::markBufferUsage()
</ins><span class="cx"> {
</span><span class="cx">     mReadUsageCount++;
</span><span class="cx"> 
</span><span class="cx">     // Free the system memory storage if we decide it isn't being used very often.
</span><span class="cx">     const unsigned int usageLimit = 5;
</span><span class="cx"> 
</span><del>-    if (mReadUsageCount &gt; usageLimit &amp;&amp; mHasSystemMemoryStorage)
</del><ins>+    BufferStorage *&amp;sysMemUsage = mBufferStorages[BUFFER_USAGE_SYSTEM_MEMORY];
+    if (mReadUsageCount &gt; usageLimit &amp;&amp; sysMemUsage != nullptr)
</ins><span class="cx">     {
</span><del>-        auto systemMemoryStorageIt = mBufferStorages.find(BUFFER_USAGE_SYSTEM_MEMORY);
-        ASSERT(systemMemoryStorageIt != mBufferStorages.end());
-
-        if (getLatestBufferStorage() != systemMemoryStorageIt-&gt;second)
</del><ins>+        BufferStorage *latestStorage = nullptr;
+        ANGLE_TRY_RESULT(getLatestBufferStorage(), latestStorage);
+        if (latestStorage != sysMemUsage)
</ins><span class="cx">         {
</span><del>-            SafeDelete(systemMemoryStorageIt-&gt;second);
-            mBufferStorages.erase(systemMemoryStorageIt);
-            mHasSystemMemoryStorage = false;
</del><ins>+            SafeDelete(sysMemUsage);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ID3D11Buffer *Buffer11::getBuffer(BufferUsage usage)
</del><ins>+gl::ErrorOrResult&lt;ID3D11Buffer *&gt; Buffer11::getBuffer(BufferUsage usage)
</ins><span class="cx"> {
</span><del>-    markBufferUsage();
</del><ins>+    ANGLE_TRY(markBufferUsage());
</ins><span class="cx"> 
</span><del>-    BufferStorage *bufferStorage = getBufferStorage(usage);
</del><ins>+    BufferStorage *storage = nullptr;
+    ANGLE_TRY_RESULT(getBufferStorage(usage), storage);
+    return GetAs&lt;NativeStorage&gt;(storage)-&gt;getNativeStorage();
+}
</ins><span class="cx"> 
</span><del>-    if (!bufferStorage)
-    {
-        // Storage out-of-memory
-        return NULL;
-    }
</del><ins>+gl::ErrorOrResult&lt;ID3D11Buffer *&gt; Buffer11::getEmulatedIndexedBuffer(
+    SourceIndexData *indexInfo,
+    const TranslatedAttribute &amp;attribute,
+    GLint startVertex)
+{
+    ASSERT(indexInfo);
</ins><span class="cx"> 
</span><del>-    return GetAs&lt;NativeStorage&gt;(bufferStorage)-&gt;getNativeStorage();
</del><ins>+    ANGLE_TRY(markBufferUsage());
+
+    BufferStorage *untypedStorage = nullptr;
+    ANGLE_TRY_RESULT(getBufferStorage(BUFFER_USAGE_EMULATED_INDEXED_VERTEX), untypedStorage);
+
+    EmulatedIndexedStorage *emulatedStorage = GetAs&lt;EmulatedIndexedStorage&gt;(untypedStorage);
+
+    ID3D11Buffer *nativeStorage = nullptr;
+    ANGLE_TRY_RESULT(emulatedStorage-&gt;getNativeStorage(indexInfo, attribute, startVertex),
+                     nativeStorage);
+
+    return nativeStorage;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ID3D11Buffer *Buffer11::getConstantBufferRange(GLintptr offset, GLsizeiptr size)
</del><ins>+gl::ErrorOrResult&lt;ID3D11Buffer *&gt; Buffer11::getConstantBufferRange(GLintptr offset, GLsizeiptr size)
</ins><span class="cx"> {
</span><del>-    markBufferUsage();
</del><ins>+    ANGLE_TRY(markBufferUsage());
</ins><span class="cx"> 
</span><del>-    BufferStorage *bufferStorage;
</del><ins>+    BufferStorage *bufferStorage = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     if (offset == 0)
</span><span class="cx">     {
</span><del>-        bufferStorage = getBufferStorage(BUFFER_USAGE_UNIFORM);
</del><ins>+        ANGLE_TRY_RESULT(getBufferStorage(BUFFER_USAGE_UNIFORM), bufferStorage);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        bufferStorage = getContantBufferRangeStorage(offset, size);
</del><ins>+        ANGLE_TRY_RESULT(getConstantBufferRangeStorage(offset, size), bufferStorage);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!bufferStorage)
-    {
-        // Storage out-of-memory
-        return NULL;
-    }
-
</del><span class="cx">     return GetAs&lt;NativeStorage&gt;(bufferStorage)-&gt;getNativeStorage();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ID3D11ShaderResourceView *Buffer11::getSRV(DXGI_FORMAT srvFormat)
</del><ins>+gl::ErrorOrResult&lt;ID3D11ShaderResourceView *&gt; Buffer11::getSRV(DXGI_FORMAT srvFormat)
</ins><span class="cx"> {
</span><del>-    BufferStorage *storage = getBufferStorage(BUFFER_USAGE_PIXEL_UNPACK);
-
-    if (!storage)
-    {
-        // Storage out-of-memory
-        return NULL;
-    }
-
</del><ins>+    BufferStorage *storage = nullptr;
+    ANGLE_TRY_RESULT(getBufferStorage(BUFFER_USAGE_PIXEL_UNPACK), storage);
</ins><span class="cx">     ID3D11Buffer *buffer = GetAs&lt;NativeStorage&gt;(storage)-&gt;getNativeStorage();
</span><span class="cx"> 
</span><span class="cx">     auto bufferSRVIt = mBufferResourceViews.find(srvFormat);
</span><span class="lines">@@ -523,16 +581,17 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ID3D11Device *device = mRenderer-&gt;getDevice();
-    ID3D11ShaderResourceView *bufferSRV = NULL;
</del><ins>+    ID3D11Device *device                = mRenderer-&gt;getDevice();
+    ID3D11ShaderResourceView *bufferSRV = nullptr;
</ins><span class="cx"> 
</span><del>-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(srvFormat);
</del><ins>+    const d3d11::DXGIFormatSize &amp;dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(srvFormat);
</ins><span class="cx"> 
</span><span class="cx">     D3D11_SHADER_RESOURCE_VIEW_DESC bufferSRVDesc;
</span><span class="cx">     bufferSRVDesc.Buffer.ElementOffset = 0;
</span><del>-    bufferSRVDesc.Buffer.ElementWidth = mSize / dxgiFormatInfo.pixelBytes;
-    bufferSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
-    bufferSRVDesc.Format = srvFormat;
</del><ins>+    bufferSRVDesc.Buffer.ElementWidth =
+        static_cast&lt;unsigned int&gt;(mSize) / dxgiFormatInfo.pixelBytes;
+    bufferSRVDesc.ViewDimension        = D3D11_SRV_DIMENSION_BUFFER;
+    bufferSRVDesc.Format               = srvFormat;
</ins><span class="cx"> 
</span><span class="cx">     HRESULT result = device-&gt;CreateShaderResourceView(buffer, &amp;bufferSRVDesc, &amp;bufferSRV);
</span><span class="cx">     UNUSED_ASSERTION_VARIABLE(result);
</span><span class="lines">@@ -543,84 +602,92 @@
</span><span class="cx">     return bufferSRV;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Buffer11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource, const PackPixelsParams &amp;params)
</del><ins>+gl::Error Buffer11::packPixels(const gl::FramebufferAttachment &amp;readAttachment,
+                               const PackPixelsParams &amp;params)
</ins><span class="cx"> {
</span><del>-    PackStorage *packStorage = getPackStorage();
-    BufferStorage *latestStorage = getLatestBufferStorage();
</del><ins>+    PackStorage *packStorage = nullptr;
+    ANGLE_TRY_RESULT(getPackStorage(), packStorage);
</ins><span class="cx"> 
</span><del>-    if (packStorage)
-    {
-        gl::Error error = packStorage-&gt;packPixels(srcTexture, srcSubresource, params);
-        if (error.isError())
-        {
-            return error;
-        }
-        packStorage-&gt;setDataRevision(latestStorage ? latestStorage-&gt;getDataRevision() + 1 : 1);
-    }
</del><ins>+    BufferStorage *latestStorage = nullptr;
+    ANGLE_TRY_RESULT(getLatestBufferStorage(), latestStorage);
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    ASSERT(packStorage);
+    ANGLE_TRY(packStorage-&gt;packPixels(readAttachment, params));
+    packStorage-&gt;setDataRevision(latestStorage ? latestStorage-&gt;getDataRevision() + 1 : 1);
+
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Buffer11::BufferStorage *Buffer11::getBufferStorage(BufferUsage usage)
</del><ins>+size_t Buffer11::getTotalCPUBufferMemoryBytes() const
</ins><span class="cx"> {
</span><del>-    BufferStorage *newStorage = NULL;
-    auto directBufferIt = mBufferStorages.find(usage);
-    if (directBufferIt != mBufferStorages.end())
-    {
-        newStorage = directBufferIt-&gt;second;
-    }
</del><ins>+    size_t allocationSize = 0;
</ins><span class="cx"> 
</span><ins>+    BufferStorage *staging = mBufferStorages[BUFFER_USAGE_STAGING];
+    allocationSize += staging ? staging-&gt;getSize() : 0;
+
+    BufferStorage *sysMem = mBufferStorages[BUFFER_USAGE_SYSTEM_MEMORY];
+    allocationSize += sysMem ? sysMem-&gt;getSize() : 0;
+
+    return allocationSize;
+}
+
+gl::ErrorOrResult&lt;Buffer11::BufferStorage *&gt; Buffer11::getBufferStorage(BufferUsage usage)
+{
+    ASSERT(0 &lt;= usage &amp;&amp; usage &lt; BUFFER_USAGE_COUNT);
+    BufferStorage *&amp;newStorage = mBufferStorages[usage];
+
</ins><span class="cx">     if (!newStorage)
</span><span class="cx">     {
</span><del>-        if (usage == BUFFER_USAGE_PIXEL_PACK)
-        {
-            newStorage = new PackStorage(mRenderer);
-        }
-        else if (usage == BUFFER_USAGE_SYSTEM_MEMORY)
-        {
-            newStorage = new SystemMemoryStorage(mRenderer);
-            mHasSystemMemoryStorage = true;
-        }
-        else
-        {
-            // buffer is not allocated, create it
-            newStorage = new NativeStorage(mRenderer, usage);
-        }
-
-        mBufferStorages.insert(std::make_pair(usage, newStorage));
</del><ins>+        newStorage = allocateStorage(usage);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // resize buffer
</span><span class="cx">     if (newStorage-&gt;getSize() &lt; mSize)
</span><span class="cx">     {
</span><del>-        if (newStorage-&gt;resize(mSize, true).isError())
-        {
-            // Out of memory error
-            return NULL;
-        }
</del><ins>+        ANGLE_TRY(newStorage-&gt;resize(mSize, true));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    updateBufferStorage(newStorage, 0, mSize);
</del><ins>+    ANGLE_TRY(updateBufferStorage(newStorage, 0, mSize));
</ins><span class="cx"> 
</span><span class="cx">     return newStorage;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Buffer11::BufferStorage *Buffer11::getContantBufferRangeStorage(GLintptr offset, GLsizeiptr size)
</del><ins>+Buffer11::BufferStorage *Buffer11::allocateStorage(BufferUsage usage) const
</ins><span class="cx"> {
</span><ins>+    switch (usage)
+    {
+        case BUFFER_USAGE_PIXEL_PACK:
+            return new PackStorage(mRenderer);
+        case BUFFER_USAGE_SYSTEM_MEMORY:
+            return new SystemMemoryStorage(mRenderer);
+        case BUFFER_USAGE_EMULATED_INDEXED_VERTEX:
+            return new EmulatedIndexedStorage(mRenderer);
+        case BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK:
+            return new NativeStorage(mRenderer, usage, &amp;mDirectBufferDirtyCallbacks);
+        default:
+            return new NativeStorage(mRenderer, usage, nullptr);
+    }
+}
+
+gl::ErrorOrResult&lt;Buffer11::BufferStorage *&gt; Buffer11::getConstantBufferRangeStorage(
+    GLintptr offset,
+    GLsizeiptr size)
+{
</ins><span class="cx">     BufferStorage *newStorage;
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        // Keep the cacheEntry in a limited scope because it may be invalidated later in the code if we need to reclaim some space.
</del><ins>+        // Keep the cacheEntry in a limited scope because it may be invalidated later in the code if
+        // we need to reclaim some space.
</ins><span class="cx">         ConstantBufferCacheEntry *cacheEntry = &amp;mConstantBufferRangeStoragesCache[offset];
</span><span class="cx"> 
</span><span class="cx">         if (!cacheEntry-&gt;storage)
</span><span class="cx">         {
</span><del>-            cacheEntry-&gt;storage = new NativeStorage(mRenderer, BUFFER_USAGE_UNIFORM);
</del><ins>+            cacheEntry-&gt;storage  = allocateStorage(BUFFER_USAGE_UNIFORM);
</ins><span class="cx">             cacheEntry-&gt;lruCount = ++mMaxConstantBufferLruCount;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         cacheEntry-&gt;lruCount = ++mMaxConstantBufferLruCount;
</span><del>-        newStorage = cacheEntry-&gt;storage;
</del><ins>+        newStorage           = cacheEntry-&gt;storage;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (newStorage-&gt;getSize() &lt; static_cast&lt;size_t&gt;(size))
</span><span class="lines">@@ -631,11 +698,13 @@
</span><span class="cx"> 
</span><span class="cx">         while (mConstantBufferStorageAdditionalSize + sizeDelta &gt; maximumAllowedAdditionalSize)
</span><span class="cx">         {
</span><del>-            auto iter = std::min_element(std::begin(mConstantBufferRangeStoragesCache), std::end(mConstantBufferRangeStoragesCache),
-                [](const ConstantBufferCache::value_type &amp;a, const ConstantBufferCache::value_type &amp;b)
-                {
-                    return a.second.lruCount &lt; b.second.lruCount;
-                });
</del><ins>+            auto iter = std::min_element(std::begin(mConstantBufferRangeStoragesCache),
+                                         std::end(mConstantBufferRangeStoragesCache),
+                                         [](const ConstantBufferCache::value_type &amp;a,
+                                            const ConstantBufferCache::value_type &amp;b)
+                                         {
+                                             return a.second.lruCount &lt; b.second.lruCount;
+                                         });
</ins><span class="cx"> 
</span><span class="cx">             ASSERT(iter-&gt;second.storage != newStorage);
</span><span class="cx">             ASSERT(mConstantBufferStorageAdditionalSize &gt;= iter-&gt;second.storage-&gt;getSize());
</span><span class="lines">@@ -645,27 +714,26 @@
</span><span class="cx">             mConstantBufferRangeStoragesCache.erase(iter);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (newStorage-&gt;resize(size, false).isError())
-        {
-            // Out of memory error
-            return nullptr;
-        }
-
</del><ins>+        ANGLE_TRY(newStorage-&gt;resize(size, false));
</ins><span class="cx">         mConstantBufferStorageAdditionalSize += sizeDelta;
</span><span class="cx"> 
</span><del>-        // We don't copy the old data when resizing the constant buffer because the data may be out-of-date
-        // therefore we reset the data revision and let updateBufferStorage() handle the copy.
</del><ins>+        // We don't copy the old data when resizing the constant buffer because the data may be
+        // out-of-date therefore we reset the data revision and let updateBufferStorage() handle the
+        // copy.
</ins><span class="cx">         newStorage-&gt;setDataRevision(0);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    updateBufferStorage(newStorage, offset, size);
-
</del><ins>+    ANGLE_TRY(updateBufferStorage(newStorage, offset, size));
</ins><span class="cx">     return newStorage;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Buffer11::updateBufferStorage(BufferStorage *storage, size_t sourceOffset, size_t storageSize)
</del><ins>+gl::Error Buffer11::updateBufferStorage(BufferStorage *storage,
+                                        size_t sourceOffset,
+                                        size_t storageSize)
</ins><span class="cx"> {
</span><del>-    BufferStorage *latestBuffer = getLatestBufferStorage();
</del><ins>+    BufferStorage *latestBuffer = nullptr;
+    ANGLE_TRY_RESULT(getLatestBufferStorage(), latestBuffer);
+
</ins><span class="cx">     if (latestBuffer &amp;&amp; latestBuffer-&gt;getDataRevision() &gt; storage-&gt;getDataRevision())
</span><span class="cx">     {
</span><span class="cx">         // Copy through a staging buffer if we're copying from or to a non-staging, mappable
</span><span class="lines">@@ -675,36 +743,43 @@
</span><span class="cx">             storage-&gt;getUsage() != BUFFER_USAGE_STAGING &amp;&amp;
</span><span class="cx">             (!latestBuffer-&gt;isMappable() || !storage-&gt;isMappable()))
</span><span class="cx">         {
</span><del>-            NativeStorage *stagingBuffer = getStagingStorage();
</del><ins>+            NativeStorage *stagingBuffer = nullptr;
+            ANGLE_TRY_RESULT(getStagingStorage(), stagingBuffer);
</ins><span class="cx"> 
</span><del>-            stagingBuffer-&gt;copyFromStorage(latestBuffer, 0, latestBuffer-&gt;getSize(), 0);
</del><ins>+            CopyResult copyResult = CopyResult::NOT_RECREATED;
+            ANGLE_TRY_RESULT(
+                stagingBuffer-&gt;copyFromStorage(latestBuffer, 0, latestBuffer-&gt;getSize(), 0),
+                copyResult);
</ins><span class="cx">             stagingBuffer-&gt;setDataRevision(latestBuffer-&gt;getDataRevision());
</span><span class="cx"> 
</span><span class="cx">             latestBuffer = stagingBuffer;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // if copyFromStorage returns true, the D3D buffer has been recreated
-        // and we should update our serial
-        if (storage-&gt;copyFromStorage(latestBuffer, sourceOffset, storageSize, 0))
</del><ins>+        CopyResult copyResult = CopyResult::NOT_RECREATED;
+        ANGLE_TRY_RESULT(storage-&gt;copyFromStorage(latestBuffer, sourceOffset, storageSize, 0),
+                         copyResult);
+        // If the D3D buffer has been recreated, we should update our serial.
+        if (copyResult == CopyResult::RECREATED)
</ins><span class="cx">         {
</span><span class="cx">             updateSerial();
</span><span class="cx">         }
</span><span class="cx">         storage-&gt;setDataRevision(latestBuffer-&gt;getDataRevision());
</span><span class="cx">     }
</span><ins>+
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Buffer11::BufferStorage *Buffer11::getLatestBufferStorage() const
</del><ins>+gl::ErrorOrResult&lt;Buffer11::BufferStorage *&gt; Buffer11::getLatestBufferStorage() const
</ins><span class="cx"> {
</span><span class="cx">     // Even though we iterate over all the direct buffers, it is expected that only
</span><span class="cx">     // 1 or 2 will be present.
</span><del>-    BufferStorage *latestStorage = NULL;
</del><ins>+    BufferStorage *latestStorage = nullptr;
</ins><span class="cx">     DataRevision latestRevision = 0;
</span><del>-    for (auto it = mBufferStorages.begin(); it != mBufferStorages.end(); it++)
</del><ins>+    for (auto &amp;storage : mBufferStorages)
</ins><span class="cx">     {
</span><del>-        BufferStorage *storage = it-&gt;second;
-        if (!latestStorage || storage-&gt;getDataRevision() &gt; latestRevision)
</del><ins>+        if (storage &amp;&amp; (!latestStorage || storage-&gt;getDataRevision() &gt; latestRevision))
</ins><span class="cx">         {
</span><del>-            latestStorage = storage;
</del><ins>+            latestStorage  = storage;
</ins><span class="cx">             latestRevision = storage-&gt;getDataRevision();
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -712,39 +787,23 @@
</span><span class="cx">     // resize buffer
</span><span class="cx">     if (latestStorage &amp;&amp; latestStorage-&gt;getSize() &lt; mSize)
</span><span class="cx">     {
</span><del>-        if (latestStorage-&gt;resize(mSize, true).isError())
-        {
-            // Out of memory error
-            return NULL;
-        }
</del><ins>+        ANGLE_TRY(latestStorage-&gt;resize(mSize, true));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return latestStorage;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Buffer11::NativeStorage *Buffer11::getStagingStorage()
</del><ins>+gl::ErrorOrResult&lt;Buffer11::NativeStorage *&gt; Buffer11::getStagingStorage()
</ins><span class="cx"> {
</span><del>-    BufferStorage *stagingStorage = getBufferStorage(BUFFER_USAGE_STAGING);
-
-    if (!stagingStorage)
-    {
-        // Out-of-memory
-        return NULL;
-    }
-
</del><ins>+    BufferStorage *stagingStorage = nullptr;
+    ANGLE_TRY_RESULT(getBufferStorage(BUFFER_USAGE_STAGING), stagingStorage);
</ins><span class="cx">     return GetAs&lt;NativeStorage&gt;(stagingStorage);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Buffer11::PackStorage *Buffer11::getPackStorage()
</del><ins>+gl::ErrorOrResult&lt;Buffer11::PackStorage *&gt; Buffer11::getPackStorage()
</ins><span class="cx"> {
</span><del>-    BufferStorage *packStorage = getBufferStorage(BUFFER_USAGE_PIXEL_PACK);
-
-    if (!packStorage)
-    {
-        // Out-of-memory
-        return NULL;
-    }
-
</del><ins>+    BufferStorage *packStorage = nullptr;
+    ANGLE_TRY_RESULT(getBufferStorage(BUFFER_USAGE_PIXEL_PACK), packStorage);
</ins><span class="cx">     return GetAs&lt;PackStorage&gt;(packStorage);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -752,15 +811,47 @@
</span><span class="cx"> {
</span><span class="cx">     // Do not support direct buffers for dynamic data. The streaming buffer
</span><span class="cx">     // offers better performance for data which changes every frame.
</span><del>-    // Check for absence of static buffer interfaces to detect dynamic data.
-    return (mStaticVertexBuffer &amp;&amp; mStaticIndexBuffer);
</del><ins>+    return (mUsage == D3DBufferUsage::STATIC);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Buffer11::initializeStaticData()
+{
+    BufferD3D::initializeStaticData();
+
+    // Notify when static data changes.
+    mStaticBufferDirtyCallbacks.signal();
+}
+
+void Buffer11::invalidateStaticData()
+{
+    BufferD3D::invalidateStaticData();
+
+    // Notify when static data changes.
+    mStaticBufferDirtyCallbacks.signal();
+}
+
+void Buffer11::addStaticBufferDirtyCallback(const NotificationCallback *callback)
+{
+    mStaticBufferDirtyCallbacks.add(callback);
+}
+
+void Buffer11::removeStaticBufferDirtyCallback(const NotificationCallback *callback)
+{
+    mStaticBufferDirtyCallbacks.remove(callback);
+}
+
+void Buffer11::addDirectBufferDirtyCallback(const NotificationCallback *callback)
+{
+    mDirectBufferDirtyCallbacks.add(callback);
+}
+
+void Buffer11::removeDirectBufferDirtyCallback(const NotificationCallback *callback)
+{
+    mDirectBufferDirtyCallbacks.remove(callback);
+}
+
</ins><span class="cx"> Buffer11::BufferStorage::BufferStorage(Renderer11 *renderer, BufferUsage usage)
</span><del>-    : mRenderer(renderer),
-      mUsage(usage),
-      mRevision(0),
-      mBufferSize(0)
</del><ins>+    : mRenderer(renderer), mRevision(0), mUsage(usage), mBufferSize(0)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -768,22 +859,20 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isMappable());
</span><span class="cx"> 
</span><del>-    uint8_t *writePointer = map(offset, size, GL_MAP_WRITE_BIT);
-    if (!writePointer)
-    {
-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to map internal buffer.&quot;);
-    }
</del><ins>+    uint8_t *writePointer = nullptr;
+    ANGLE_TRY(map(offset, size, GL_MAP_WRITE_BIT, &amp;writePointer));
</ins><span class="cx"> 
</span><span class="cx">     memcpy(writePointer, data, size);
</span><span class="cx"> 
</span><span class="cx">     unmap();
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Buffer11::NativeStorage::NativeStorage(Renderer11 *renderer, BufferUsage usage)
-    : BufferStorage(renderer, usage),
-      mNativeStorage(NULL)
</del><ins>+Buffer11::NativeStorage::NativeStorage(Renderer11 *renderer,
+                                       BufferUsage usage,
+                                       const NotificationSet *onStorageChanged)
+    : BufferStorage(renderer, usage), mNativeStorage(nullptr), mOnStorageChanged(onStorageChanged)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -793,13 +882,15 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Returns true if it recreates the direct buffer
</span><del>-bool Buffer11::NativeStorage::copyFromStorage(BufferStorage *source, size_t sourceOffset,
-                                               size_t size, size_t destOffset)
</del><ins>+gl::ErrorOrResult&lt;CopyResult&gt; Buffer11::NativeStorage::copyFromStorage(BufferStorage *source,
+                                                                       size_t sourceOffset,
+                                                                       size_t size,
+                                                                       size_t destOffset)
</ins><span class="cx"> {
</span><span class="cx">     ID3D11DeviceContext *context = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><span class="cx">     size_t requiredSize = destOffset + size;
</span><del>-    bool createBuffer = !mNativeStorage || mBufferSize &lt; requiredSize;
</del><ins>+    bool createBuffer   = !mNativeStorage || mBufferSize &lt; requiredSize;
</ins><span class="cx"> 
</span><span class="cx">     // (Re)initialize D3D buffer if needed
</span><span class="cx">     if (createBuffer)
</span><span class="lines">@@ -813,12 +904,19 @@
</span><span class="cx">     {
</span><span class="cx">         ASSERT(source-&gt;isMappable());
</span><span class="cx"> 
</span><del>-        uint8_t *sourcePointer = source-&gt;map(sourceOffset, size, GL_MAP_READ_BIT);
</del><ins>+        uint8_t *sourcePointer = nullptr;
+        ANGLE_TRY(source-&gt;map(sourceOffset, size, GL_MAP_READ_BIT, &amp;sourcePointer));
</ins><span class="cx"> 
</span><span class="cx">         D3D11_MAPPED_SUBRESOURCE mappedResource;
</span><span class="cx">         HRESULT hr = context-&gt;Map(mNativeStorage, 0, D3D11_MAP_WRITE, 0, &amp;mappedResource);
</span><del>-        UNUSED_ASSERTION_VARIABLE(hr);
</del><span class="cx">         ASSERT(SUCCEEDED(hr));
</span><ins>+        if (FAILED(hr))
+        {
+            source-&gt;unmap();
+            return gl::Error(
+                GL_OUT_OF_MEMORY,
+                &quot;Failed to map native storage in Buffer11::NativeStorage::copyFromStorage&quot;);
+        }
</ins><span class="cx"> 
</span><span class="cx">         uint8_t *destPointer = static_cast&lt;uint8_t *&gt;(mappedResource.pData) + destOffset;
</span><span class="cx"> 
</span><span class="lines">@@ -832,35 +930,37 @@
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         D3D11_BOX srcBox;
</span><del>-        srcBox.left = sourceOffset;
-        srcBox.right = sourceOffset + size;
-        srcBox.top = 0;
</del><ins>+        srcBox.left   = static_cast&lt;unsigned int&gt;(sourceOffset);
+        srcBox.right  = static_cast&lt;unsigned int&gt;(sourceOffset + size);
+        srcBox.top    = 0;
</ins><span class="cx">         srcBox.bottom = 1;
</span><del>-        srcBox.front = 0;
-        srcBox.back = 1;
</del><ins>+        srcBox.front  = 0;
+        srcBox.back   = 1;
</ins><span class="cx"> 
</span><span class="cx">         ID3D11Buffer *sourceBuffer = GetAs&lt;NativeStorage&gt;(source)-&gt;getNativeStorage();
</span><span class="cx"> 
</span><del>-        context-&gt;CopySubresourceRegion(mNativeStorage, 0, destOffset, 0, 0, sourceBuffer, 0, &amp;srcBox);
</del><ins>+        context-&gt;CopySubresourceRegion(mNativeStorage, 0, static_cast&lt;unsigned int&gt;(destOffset), 0,
+                                       0, sourceBuffer, 0, &amp;srcBox);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return createBuffer;
</del><ins>+    return createBuffer ? CopyResult::RECREATED : CopyResult::NOT_RECREATED;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Buffer11::NativeStorage::resize(size_t size, bool preserveData)
</span><span class="cx"> {
</span><del>-    ID3D11Device *device = mRenderer-&gt;getDevice();
</del><ins>+    ID3D11Device *device         = mRenderer-&gt;getDevice();
</ins><span class="cx">     ID3D11DeviceContext *context = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><span class="cx">     D3D11_BUFFER_DESC bufferDesc;
</span><del>-    fillBufferDesc(&amp;bufferDesc, mRenderer, mUsage, size);
</del><ins>+    fillBufferDesc(&amp;bufferDesc, mRenderer, mUsage, static_cast&lt;unsigned int&gt;(size));
</ins><span class="cx"> 
</span><span class="cx">     ID3D11Buffer *newBuffer;
</span><del>-    HRESULT result = device-&gt;CreateBuffer(&amp;bufferDesc, NULL, &amp;newBuffer);
</del><ins>+    HRESULT result = device-&gt;CreateBuffer(&amp;bufferDesc, nullptr, &amp;newBuffer);
</ins><span class="cx"> 
</span><span class="cx">     if (FAILED(result))
</span><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal buffer, result: 0x%X.&quot;, result);
</del><ins>+        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal buffer, result: 0x%X.&quot;,
+                         result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     d3d11::SetDebugName(newBuffer, &quot;Buffer11::NativeStorage&quot;);
</span><span class="lines">@@ -871,12 +971,12 @@
</span><span class="cx">         ASSERT(mBufferSize &lt;= size);
</span><span class="cx"> 
</span><span class="cx">         D3D11_BOX srcBox;
</span><del>-        srcBox.left = 0;
-        srcBox.right = mBufferSize;
-        srcBox.top = 0;
</del><ins>+        srcBox.left   = 0;
+        srcBox.right  = static_cast&lt;unsigned int&gt;(mBufferSize);
+        srcBox.top    = 0;
</ins><span class="cx">         srcBox.bottom = 1;
</span><del>-        srcBox.front = 0;
-        srcBox.back = 1;
</del><ins>+        srcBox.front  = 0;
+        srcBox.back   = 1;
</ins><span class="cx"> 
</span><span class="cx">         context-&gt;CopySubresourceRegion(newBuffer, 0, 0, 0, 0, mNativeStorage, 0, &amp;srcBox);
</span><span class="cx">     }
</span><span class="lines">@@ -887,78 +987,96 @@
</span><span class="cx"> 
</span><span class="cx">     mBufferSize = bufferDesc.ByteWidth;
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    // Notify that the storage has changed.
+    if (mOnStorageChanged)
+    {
+        mOnStorageChanged-&gt;signal();
+    }
+
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Buffer11::NativeStorage::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Renderer11 *renderer,
-                                                     BufferUsage usage, unsigned int bufferSize)
</del><ins>+void Buffer11::NativeStorage::fillBufferDesc(D3D11_BUFFER_DESC *bufferDesc,
+                                             Renderer11 *renderer,
+                                             BufferUsage usage,
+                                             unsigned int bufferSize)
</ins><span class="cx"> {
</span><del>-    bufferDesc-&gt;ByteWidth = bufferSize;
-    bufferDesc-&gt;MiscFlags = 0;
</del><ins>+    bufferDesc-&gt;ByteWidth           = bufferSize;
+    bufferDesc-&gt;MiscFlags           = 0;
</ins><span class="cx">     bufferDesc-&gt;StructureByteStride = 0;
</span><span class="cx"> 
</span><span class="cx">     switch (usage)
</span><span class="cx">     {
</span><del>-      case BUFFER_USAGE_STAGING:
-        bufferDesc-&gt;Usage = D3D11_USAGE_STAGING;
-        bufferDesc-&gt;BindFlags = 0;
-        bufferDesc-&gt;CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
-        break;
</del><ins>+        case BUFFER_USAGE_STAGING:
+            bufferDesc-&gt;Usage          = D3D11_USAGE_STAGING;
+            bufferDesc-&gt;BindFlags      = 0;
+            bufferDesc-&gt;CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
+            break;
</ins><span class="cx"> 
</span><del>-      case BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK:
-        bufferDesc-&gt;Usage = D3D11_USAGE_DEFAULT;
-        bufferDesc-&gt;BindFlags = D3D11_BIND_VERTEX_BUFFER;
</del><ins>+        case BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK:
+            bufferDesc-&gt;Usage     = D3D11_USAGE_DEFAULT;
+            bufferDesc-&gt;BindFlags = D3D11_BIND_VERTEX_BUFFER;
</ins><span class="cx"> 
</span><del>-        if (renderer-&gt;isES3Capable())
-        {
-            bufferDesc-&gt;BindFlags |= D3D11_BIND_STREAM_OUTPUT;
-        }
</del><ins>+            if (renderer-&gt;isES3Capable())
+            {
+                bufferDesc-&gt;BindFlags |= D3D11_BIND_STREAM_OUTPUT;
+            }
</ins><span class="cx"> 
</span><del>-        bufferDesc-&gt;CPUAccessFlags = 0;
-        break;
</del><ins>+            bufferDesc-&gt;CPUAccessFlags = 0;
+            break;
</ins><span class="cx"> 
</span><del>-      case BUFFER_USAGE_INDEX:
-        bufferDesc-&gt;Usage = D3D11_USAGE_DEFAULT;
-        bufferDesc-&gt;BindFlags = D3D11_BIND_INDEX_BUFFER;
-        bufferDesc-&gt;CPUAccessFlags = 0;
-        break;
</del><ins>+        case BUFFER_USAGE_INDEX:
+            bufferDesc-&gt;Usage          = D3D11_USAGE_DEFAULT;
+            bufferDesc-&gt;BindFlags      = D3D11_BIND_INDEX_BUFFER;
+            bufferDesc-&gt;CPUAccessFlags = 0;
+            break;
</ins><span class="cx"> 
</span><del>-      case BUFFER_USAGE_PIXEL_UNPACK:
-        bufferDesc-&gt;Usage = D3D11_USAGE_DEFAULT;
-        bufferDesc-&gt;BindFlags = D3D11_BIND_SHADER_RESOURCE;
-        bufferDesc-&gt;CPUAccessFlags = 0;
-        break;
</del><ins>+        case BUFFER_USAGE_PIXEL_UNPACK:
+            bufferDesc-&gt;Usage          = D3D11_USAGE_DEFAULT;
+            bufferDesc-&gt;BindFlags      = D3D11_BIND_SHADER_RESOURCE;
+            bufferDesc-&gt;CPUAccessFlags = 0;
+            break;
</ins><span class="cx"> 
</span><del>-      case BUFFER_USAGE_UNIFORM:
-        bufferDesc-&gt;Usage = D3D11_USAGE_DYNAMIC;
-        bufferDesc-&gt;BindFlags = D3D11_BIND_CONSTANT_BUFFER;
-        bufferDesc-&gt;CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
</del><ins>+        case BUFFER_USAGE_UNIFORM:
+            bufferDesc-&gt;Usage          = D3D11_USAGE_DYNAMIC;
+            bufferDesc-&gt;BindFlags      = D3D11_BIND_CONSTANT_BUFFER;
+            bufferDesc-&gt;CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
</ins><span class="cx"> 
</span><del>-        // Constant buffers must be of a limited size, and aligned to 16 byte boundaries
-        // For our purposes we ignore any buffer data past the maximum constant buffer size
-        bufferDesc-&gt;ByteWidth = roundUp(bufferDesc-&gt;ByteWidth, 16u);
-        bufferDesc-&gt;ByteWidth = std::min&lt;UINT&gt;(bufferDesc-&gt;ByteWidth, static_cast&lt;UINT&gt;(renderer-&gt;getRendererCaps().maxUniformBlockSize));
-        break;
</del><ins>+            // Constant buffers must be of a limited size, and aligned to 16 byte boundaries
+            // For our purposes we ignore any buffer data past the maximum constant buffer size
+            bufferDesc-&gt;ByteWidth = roundUp(bufferDesc-&gt;ByteWidth, 16u);
+            bufferDesc-&gt;ByteWidth =
+                std::min&lt;UINT&gt;(bufferDesc-&gt;ByteWidth,
+                               static_cast&lt;UINT&gt;(renderer-&gt;getRendererCaps().maxUniformBlockSize));
+            break;
</ins><span class="cx"> 
</span><del>-      default:
-        UNREACHABLE();
</del><ins>+        default:
+            UNREACHABLE();
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-uint8_t *Buffer11::NativeStorage::map(size_t offset, size_t length, GLbitfield access)
</del><ins>+gl::Error Buffer11::NativeStorage::map(size_t offset,
+                                       size_t length,
+                                       GLbitfield access,
+                                       uint8_t **mapPointerOut)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mUsage == BUFFER_USAGE_STAGING);
</span><span class="cx"> 
</span><span class="cx">     D3D11_MAPPED_SUBRESOURCE mappedResource;
</span><span class="cx">     ID3D11DeviceContext *context = mRenderer-&gt;getDeviceContext();
</span><del>-    D3D11_MAP d3dMapType = gl_d3d11::GetD3DMapTypeFromBits(access);
-    UINT d3dMapFlag = ((access &amp; GL_MAP_UNSYNCHRONIZED_BIT) != 0 ? D3D11_MAP_FLAG_DO_NOT_WAIT : 0);
</del><ins>+    D3D11_MAP d3dMapType         = gl_d3d11::GetD3DMapTypeFromBits(access);
+    UINT d3dMapFlag              = ((access &amp; GL_MAP_UNSYNCHRONIZED_BIT) != 0 ? D3D11_MAP_FLAG_DO_NOT_WAIT : 0);
</ins><span class="cx"> 
</span><span class="cx">     HRESULT result = context-&gt;Map(mNativeStorage, 0, d3dMapType, d3dMapFlag, &amp;mappedResource);
</span><del>-    UNUSED_ASSERTION_VARIABLE(result);
</del><span class="cx">     ASSERT(SUCCEEDED(result));
</span><del>-
-    return static_cast&lt;uint8_t*&gt;(mappedResource.pData) + offset;
</del><ins>+    if (FAILED(result))
+    {
+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to map native storage in Buffer11::NativeStorage::map&quot;);
+    }
+    ASSERT(mappedResource.pData);
+    *mapPointerOut = static_cast&lt;uint8_t *&gt;(mappedResource.pData) + offset;
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Buffer11::NativeStorage::unmap()
</span><span class="lines">@@ -968,28 +1086,196 @@
</span><span class="cx">     context-&gt;Unmap(mNativeStorage, 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Buffer11::EmulatedIndexedStorage::EmulatedIndexedStorage(Renderer11 *renderer)
+    : BufferStorage(renderer, BUFFER_USAGE_EMULATED_INDEXED_VERTEX), mNativeStorage(nullptr)
+{
+}
+
+Buffer11::EmulatedIndexedStorage::~EmulatedIndexedStorage()
+{
+    SafeRelease(mNativeStorage);
+}
+
+gl::ErrorOrResult&lt;ID3D11Buffer *&gt; Buffer11::EmulatedIndexedStorage::getNativeStorage(
+    SourceIndexData *indexInfo,
+    const TranslatedAttribute &amp;attribute,
+    GLint startVertex)
+{
+    // If a change in the indices applied from the last draw call is detected, then the emulated
+    // indexed buffer needs to be invalidated.  After invalidation, the change detected flag should
+    // be cleared to avoid unnecessary recreation of the buffer.
+    if (mNativeStorage == nullptr || indexInfo-&gt;srcIndicesChanged)
+    {
+        SafeRelease(mNativeStorage);
+
+        // Copy the source index data. This ensures that the lifetime of the indices pointer
+        // stays with this storage until the next time we invalidate.
+        size_t indicesDataSize = 0;
+        switch (indexInfo-&gt;srcIndexType)
+        {
+            case GL_UNSIGNED_INT:
+                indicesDataSize = sizeof(GLuint) * indexInfo-&gt;srcCount;
+                break;
+            case GL_UNSIGNED_SHORT:
+                indicesDataSize = sizeof(GLushort) * indexInfo-&gt;srcCount;
+                break;
+            case GL_UNSIGNED_BYTE:
+                indicesDataSize = sizeof(GLubyte) * indexInfo-&gt;srcCount;
+                break;
+            default:
+                indicesDataSize = sizeof(GLushort) * indexInfo-&gt;srcCount;
+                break;
+        }
+
+        if (!mIndicesMemoryBuffer.resize(indicesDataSize))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Error resizing index memory buffer in &quot;
+                             &quot;Buffer11::EmulatedIndexedStorage::getNativeStorage&quot;);
+        }
+
+        memcpy(mIndicesMemoryBuffer.data(), indexInfo-&gt;srcIndices, indicesDataSize);
+
+        indexInfo-&gt;srcIndicesChanged = false;
+    }
+
+    if (!mNativeStorage)
+    {
+        unsigned int offset = 0;
+        ANGLE_TRY_RESULT(attribute.computeOffset(startVertex), offset);
+
+        // Expand the memory storage upon request and cache the results.
+        unsigned int expandedDataSize =
+            static_cast&lt;unsigned int&gt;((indexInfo-&gt;srcCount * attribute.stride) + offset);
+        MemoryBuffer expandedData;
+        if (!expandedData.resize(expandedDataSize))
+        {
+            return gl::Error(
+                GL_OUT_OF_MEMORY,
+                &quot;Error resizing buffer in Buffer11::EmulatedIndexedStorage::getNativeStorage&quot;);
+        }
+
+        // Clear the contents of the allocated buffer
+        ZeroMemory(expandedData.data(), expandedDataSize);
+
+        uint8_t *curr      = expandedData.data();
+        const uint8_t *ptr = static_cast&lt;const uint8_t *&gt;(indexInfo-&gt;srcIndices);
+
+        // Ensure that we start in the correct place for the emulated data copy operation to
+        // maintain offset behaviors.
+        curr += offset;
+
+        ReadIndexValueFunction readIndexValue = ReadIndexValueFromIndices&lt;GLushort&gt;;
+
+        switch (indexInfo-&gt;srcIndexType)
+        {
+            case GL_UNSIGNED_INT:
+                readIndexValue = ReadIndexValueFromIndices&lt;GLuint&gt;;
+                break;
+            case GL_UNSIGNED_SHORT:
+                readIndexValue = ReadIndexValueFromIndices&lt;GLushort&gt;;
+                break;
+            case GL_UNSIGNED_BYTE:
+                readIndexValue = ReadIndexValueFromIndices&lt;GLubyte&gt;;
+                break;
+        }
+
+        // Iterate over the cached index data and copy entries indicated into the emulated buffer.
+        for (GLuint i = 0; i &lt; indexInfo-&gt;srcCount; i++)
+        {
+            GLuint idx = readIndexValue(ptr, i);
+            memcpy(curr, mMemoryBuffer.data() + (attribute.stride * idx), attribute.stride);
+            curr += attribute.stride;
+        }
+
+        // Finally, initialize the emulated indexed native storage object with the newly copied data
+        // and free the temporary buffers used.
+        ID3D11Device *device = mRenderer-&gt;getDevice();
+
+        D3D11_BUFFER_DESC bufferDesc;
+        bufferDesc.ByteWidth           = expandedDataSize;
+        bufferDesc.MiscFlags           = 0;
+        bufferDesc.StructureByteStride = 0;
+        bufferDesc.Usage               = D3D11_USAGE_DEFAULT;
+        bufferDesc.BindFlags           = D3D11_BIND_VERTEX_BUFFER;
+        bufferDesc.CPUAccessFlags      = 0;
+
+        D3D11_SUBRESOURCE_DATA subResourceData = {expandedData.data(), 0, 0};
+
+        HRESULT result = device-&gt;CreateBuffer(&amp;bufferDesc, &amp;subResourceData, &amp;mNativeStorage);
+        if (FAILED(result))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY, &quot;Could not create emulated index data buffer: %08lX&quot;,
+                             result);
+        }
+        d3d11::SetDebugName(mNativeStorage, &quot;Buffer11::EmulatedIndexedStorage&quot;);
+    }
+
+    return mNativeStorage;
+}
+
+gl::ErrorOrResult&lt;CopyResult&gt; Buffer11::EmulatedIndexedStorage::copyFromStorage(
+    BufferStorage *source,
+    size_t sourceOffset,
+    size_t size,
+    size_t destOffset)
+{
+    ASSERT(source-&gt;isMappable());
+    uint8_t *sourceData = nullptr;
+    ANGLE_TRY(source-&gt;map(sourceOffset, size, GL_MAP_READ_BIT, &amp;sourceData));
+    ASSERT(destOffset + size &lt;= mMemoryBuffer.size());
+    memcpy(mMemoryBuffer.data() + destOffset, sourceData, size);
+    source-&gt;unmap();
+    return CopyResult::RECREATED;
+}
+
+gl::Error Buffer11::EmulatedIndexedStorage::resize(size_t size, bool preserveData)
+{
+    if (mMemoryBuffer.size() &lt; size)
+    {
+        if (!mMemoryBuffer.resize(size))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to resize EmulatedIndexedStorage&quot;);
+        }
+        mBufferSize = size;
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error Buffer11::EmulatedIndexedStorage::map(size_t offset,
+                                                size_t length,
+                                                GLbitfield access,
+                                                uint8_t **mapPointerOut)
+{
+    ASSERT(!mMemoryBuffer.empty() &amp;&amp; offset + length &lt;= mMemoryBuffer.size());
+    *mapPointerOut = mMemoryBuffer.data() + offset;
+    return gl::Error(GL_NO_ERROR);
+}
+
+void Buffer11::EmulatedIndexedStorage::unmap()
+{
+    // No-op
+}
+
</ins><span class="cx"> Buffer11::PackStorage::PackStorage(Renderer11 *renderer)
</span><del>-    : BufferStorage(renderer, BUFFER_USAGE_PIXEL_PACK),
-      mStagingTexture(NULL),
-      mTextureFormat(DXGI_FORMAT_UNKNOWN),
-      mQueuedPackCommand(NULL),
-      mDataModified(false)
</del><ins>+    : BufferStorage(renderer, BUFFER_USAGE_PIXEL_PACK), mStagingTexture(), mDataModified(false)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Buffer11::PackStorage::~PackStorage()
</span><span class="cx"> {
</span><del>-    SafeRelease(mStagingTexture);
-    SafeDelete(mQueuedPackCommand);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Buffer11::PackStorage::copyFromStorage(BufferStorage *source, size_t sourceOffset,
-                                              size_t size, size_t destOffset)
</del><ins>+gl::ErrorOrResult&lt;CopyResult&gt; Buffer11::PackStorage::copyFromStorage(BufferStorage *source,
+                                                                     size_t sourceOffset,
+                                                                     size_t size,
+                                                                     size_t destOffset)
</ins><span class="cx"> {
</span><span class="cx">     // We copy through a staging buffer when drawing with a pack buffer,
</span><span class="cx">     // or for other cases where we access the pack buffer
</span><span class="cx">     UNREACHABLE();
</span><del>-    return false;
</del><ins>+    return CopyResult::NOT_RECREATED;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Buffer11::PackStorage::resize(size_t size, bool preserveData)
</span><span class="lines">@@ -1006,7 +1292,10 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-uint8_t *Buffer11::PackStorage::map(size_t offset, size_t length, GLbitfield access)
</del><ins>+gl::Error Buffer11::PackStorage::map(size_t offset,
+                                     size_t length,
+                                     GLbitfield access,
+                                     uint8_t **mapPointerOut)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(offset + length &lt;= getSize());
</span><span class="cx">     // TODO: fast path
</span><span class="lines">@@ -1014,15 +1303,12 @@
</span><span class="cx">     //  and if D3D packs the staging texture memory identically to how we would fill
</span><span class="cx">     //  the pack buffer according to the current pack state.
</span><span class="cx"> 
</span><del>-    gl::Error error = flushQueuedPackCommand();
-    if (error.isError())
-    {
-        return NULL;
-    }
</del><ins>+    ANGLE_TRY(flushQueuedPackCommand());
</ins><span class="cx"> 
</span><span class="cx">     mDataModified = (mDataModified || (access &amp; GL_MAP_WRITE_BIT) != 0);
</span><span class="cx"> 
</span><del>-    return mMemoryBuffer.data() + offset;
</del><ins>+    *mapPointerOut = mMemoryBuffer.data() + offset;
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Buffer11::PackStorage::unmap()
</span><span class="lines">@@ -1030,62 +1316,35 @@
</span><span class="cx">     // No-op
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Buffer11::PackStorage::packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &amp;params)
</del><ins>+gl::Error Buffer11::PackStorage::packPixels(const gl::FramebufferAttachment &amp;readAttachment,
+                                            const PackPixelsParams &amp;params)
</ins><span class="cx"> {
</span><del>-    gl::Error error = flushQueuedPackCommand();
-    if (error.isError())
-    {
-        return error;
-    }
</del><ins>+    ANGLE_TRY(flushQueuedPackCommand());
</ins><span class="cx"> 
</span><del>-    mQueuedPackCommand = new PackPixelsParams(params);
</del><ins>+    RenderTarget11 *renderTarget = nullptr;
+    ANGLE_TRY(readAttachment.getRenderTarget(&amp;renderTarget));
</ins><span class="cx"> 
</span><del>-    D3D11_TEXTURE2D_DESC textureDesc;
-    srcTexure-&gt;GetDesc(&amp;textureDesc);
</del><ins>+    ID3D11Resource *renderTargetResource = renderTarget-&gt;getTexture();
+    ASSERT(renderTargetResource);
</ins><span class="cx"> 
</span><del>-    if (mStagingTexture != NULL &amp;&amp;
-        (mTextureFormat != textureDesc.Format ||
-         mTextureSize.width != params.area.width ||
-         mTextureSize.height != params.area.height))
-    {
-        SafeRelease(mStagingTexture);
-        mTextureSize.width = 0;
-        mTextureSize.height = 0;
-        mTextureFormat = DXGI_FORMAT_UNKNOWN;
-    }
</del><ins>+    unsigned int srcSubresource = renderTarget-&gt;getSubresourceIndex();
+    TextureHelper11 srcTexture =
+        TextureHelper11::MakeAndReference(renderTargetResource, renderTarget-&gt;getANGLEFormat());
</ins><span class="cx"> 
</span><del>-    if (mStagingTexture == NULL)
</del><ins>+    mQueuedPackCommand.reset(new PackPixelsParams(params));
+
+    gl::Extents srcTextureSize(params.area.width, params.area.height, 1);
+    if (!mStagingTexture.getResource() || mStagingTexture.getFormat() != srcTexture.getFormat() ||
+        mStagingTexture.getExtents() != srcTextureSize)
</ins><span class="cx">     {
</span><del>-        ID3D11Device *device = mRenderer-&gt;getDevice();
-        HRESULT hr;
-
-        mTextureSize.width = params.area.width;
-        mTextureSize.height = params.area.height;
-        mTextureFormat = textureDesc.Format;
-
-        D3D11_TEXTURE2D_DESC stagingDesc;
-        stagingDesc.Width = params.area.width;
-        stagingDesc.Height = params.area.height;
-        stagingDesc.MipLevels = 1;
-        stagingDesc.ArraySize = 1;
-        stagingDesc.Format = mTextureFormat;
-        stagingDesc.SampleDesc.Count = 1;
-        stagingDesc.SampleDesc.Quality = 0;
-        stagingDesc.Usage = D3D11_USAGE_STAGING;
-        stagingDesc.BindFlags = 0;
-        stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
-        stagingDesc.MiscFlags = 0;
-
-        hr = device-&gt;CreateTexture2D(&amp;stagingDesc, NULL, &amp;mStagingTexture);
-        if (FAILED(hr))
-        {
-            ASSERT(hr == E_OUTOFMEMORY);
-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to allocate internal staging texture.&quot;);
-        }
</del><ins>+        ANGLE_TRY_RESULT(CreateStagingTexture(srcTexture.getTextureType(), srcTexture.getFormat(),
+                                              srcTexture.getANGLEFormat(), srcTextureSize,
+                                              mRenderer-&gt;getDevice()),
+                         mStagingTexture);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // ReadPixels from multisampled FBOs isn't supported in current GL
</span><del>-    ASSERT(textureDesc.SampleDesc.Count &lt;= 1);
</del><ins>+    ASSERT(srcTexture.getSampleCount() &lt;= 1);
</ins><span class="cx"> 
</span><span class="cx">     ID3D11DeviceContext *immediateContext = mRenderer-&gt;getDeviceContext();
</span><span class="cx">     D3D11_BOX srcBox;
</span><span class="lines">@@ -1093,13 +1352,20 @@
</span><span class="cx">     srcBox.right  = params.area.x + params.area.width;
</span><span class="cx">     srcBox.top    = params.area.y;
</span><span class="cx">     srcBox.bottom = params.area.y + params.area.height;
</span><del>-    srcBox.front  = 0;
-    srcBox.back   = 1;
</del><span class="cx"> 
</span><ins>+    // Select the correct layer from a 3D attachment
+    srcBox.front = 0;
+    if (mStagingTexture.getTextureType() == GL_TEXTURE_3D)
+    {
+        srcBox.front = static_cast&lt;UINT&gt;(readAttachment.layer());
+    }
+    srcBox.back = srcBox.front + 1;
+
</ins><span class="cx">     // Asynchronous copy
</span><del>-    immediateContext-&gt;CopySubresourceRegion(mStagingTexture, 0, 0, 0, 0, srcTexure, srcSubresource, &amp;srcBox);
</del><ins>+    immediateContext-&gt;CopySubresourceRegion(mStagingTexture.getResource(), 0, 0, 0, 0,
+                                            srcTexture.getResource(), srcSubresource, &amp;srcBox);
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Buffer11::PackStorage::flushQueuedPackCommand()
</span><span class="lines">@@ -1108,30 +1374,31 @@
</span><span class="cx"> 
</span><span class="cx">     if (mQueuedPackCommand)
</span><span class="cx">     {
</span><del>-        gl::Error error = mRenderer-&gt;packPixels(mStagingTexture, *mQueuedPackCommand, mMemoryBuffer.data());
-        SafeDelete(mQueuedPackCommand);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+        ANGLE_TRY(
+            mRenderer-&gt;packPixels(mStagingTexture, *mQueuedPackCommand, mMemoryBuffer.data()));
+        mQueuedPackCommand.reset(nullptr);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Buffer11::SystemMemoryStorage::SystemMemoryStorage(Renderer11 *renderer)
</span><span class="cx">     : Buffer11::BufferStorage(renderer, BUFFER_USAGE_SYSTEM_MEMORY)
</span><del>-{}
</del><ins>+{
+}
</ins><span class="cx"> 
</span><del>-bool Buffer11::SystemMemoryStorage::copyFromStorage(BufferStorage *source, size_t sourceOffset,
-                                                    size_t size, size_t destOffset)
</del><ins>+gl::ErrorOrResult&lt;CopyResult&gt; Buffer11::SystemMemoryStorage::copyFromStorage(BufferStorage *source,
+                                                                             size_t sourceOffset,
+                                                                             size_t size,
+                                                                             size_t destOffset)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(source-&gt;isMappable());
</span><del>-    const uint8_t *sourceData = source-&gt;map(sourceOffset, size, GL_MAP_READ_BIT);
</del><ins>+    uint8_t *sourceData = nullptr;
+    ANGLE_TRY(source-&gt;map(sourceOffset, size, GL_MAP_READ_BIT, &amp;sourceData));
</ins><span class="cx">     ASSERT(destOffset + size &lt;= mSystemCopy.size());
</span><span class="cx">     memcpy(mSystemCopy.data() + destOffset, sourceData, size);
</span><span class="cx">     source-&gt;unmap();
</span><del>-    return true;
</del><ins>+    return CopyResult::RECREATED;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Buffer11::SystemMemoryStorage::resize(size_t size, bool preserveData)
</span><span class="lines">@@ -1145,18 +1412,21 @@
</span><span class="cx">         mBufferSize = size;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-uint8_t *Buffer11::SystemMemoryStorage::map(size_t offset, size_t length, GLbitfield access)
</del><ins>+gl::Error Buffer11::SystemMemoryStorage::map(size_t offset,
+                                             size_t length,
+                                             GLbitfield access,
+                                             uint8_t **mapPointerOut)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!mSystemCopy.empty() &amp;&amp; offset + length &lt;= mSystemCopy.size());
</span><del>-    return mSystemCopy.data() + offset;
</del><ins>+    *mapPointerOut = mSystemCopy.data() + offset;
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Buffer11::SystemMemoryStorage::unmap()
</span><span class="cx"> {
</span><span class="cx">     // No-op
</span><span class="cx"> }
</span><del>-
-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Buffer11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Buffer11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Buffer11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Buffer11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,12 +9,22 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_
</span><span class="cx"> 
</span><ins>+#include &lt;map&gt;
+
</ins><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/BufferD3D.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</ins><span class="cx"> 
</span><ins>+namespace gl
+{
+class FramebufferAttachment;
+}
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class Renderer11;
</span><ins>+struct SourceIndexData;
+struct TranslatedAttribute;
</ins><span class="cx"> 
</span><span class="cx"> enum BufferUsage
</span><span class="cx"> {
</span><span class="lines">@@ -25,6 +35,9 @@
</span><span class="cx">     BUFFER_USAGE_PIXEL_PACK,
</span><span class="cx">     BUFFER_USAGE_UNIFORM,
</span><span class="cx">     BUFFER_USAGE_SYSTEM_MEMORY,
</span><ins>+    BUFFER_USAGE_EMULATED_INDEXED_VERTEX,
+
+    BUFFER_USAGE_COUNT,
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct PackPixelsParams
</span><span class="lines">@@ -50,39 +63,52 @@
</span><span class="cx">     Buffer11(Renderer11 *renderer);
</span><span class="cx">     virtual ~Buffer11();
</span><span class="cx"> 
</span><del>-    ID3D11Buffer *getBuffer(BufferUsage usage);
-    ID3D11Buffer *getConstantBufferRange(GLintptr offset, GLsizeiptr size);
-    ID3D11ShaderResourceView *getSRV(DXGI_FORMAT srvFormat);
-    bool isMapped() const { return mMappedStorage != NULL; }
-    gl::Error packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &amp;params);
</del><ins>+    gl::ErrorOrResult&lt;ID3D11Buffer *&gt; getBuffer(BufferUsage usage);
+    gl::ErrorOrResult&lt;ID3D11Buffer *&gt; getEmulatedIndexedBuffer(SourceIndexData *indexInfo,
+                                                               const TranslatedAttribute &amp;attribute,
+                                                               GLint startVertex);
+    gl::ErrorOrResult&lt;ID3D11Buffer *&gt; getConstantBufferRange(GLintptr offset, GLsizeiptr size);
+    gl::ErrorOrResult&lt;ID3D11ShaderResourceView *&gt; getSRV(DXGI_FORMAT srvFormat);
+    bool isMapped() const { return mMappedStorage != nullptr; }
+    gl::Error packPixels(const gl::FramebufferAttachment &amp;readAttachment,
+                         const PackPixelsParams &amp;params);
+    size_t getTotalCPUBufferMemoryBytes() const;
</ins><span class="cx"> 
</span><span class="cx">     // BufferD3D implementation
</span><del>-    virtual size_t getSize() const { return mSize; }
-    virtual bool supportsDirectBinding() const;
</del><ins>+    size_t getSize() const override { return mSize; }
+    bool supportsDirectBinding() const override;
+    gl::Error getData(const uint8_t **outData) override;
+    void initializeStaticData() override;
+    void invalidateStaticData() override;
</ins><span class="cx"> 
</span><span class="cx">     // BufferImpl implementation
</span><del>-    virtual gl::Error setData(const void* data, size_t size, GLenum usage);
-    gl::Error getData(const uint8_t **outData) override;
-    virtual gl::Error setSubData(const void* data, size_t size, size_t offset);
-    virtual gl::Error copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size);
-    virtual gl::Error map(GLenum access, GLvoid **mapPtr);
-    virtual gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr);
-    virtual gl::Error unmap(GLboolean *result);
-    virtual void markTransformFeedbackUsage();
</del><ins>+    gl::Error setData(const void *data, size_t size, GLenum usage) override;
+    gl::Error setSubData(const void *data, size_t size, size_t offset) override;
+    gl::Error copySubData(BufferImpl *source,
+                          GLintptr sourceOffset,
+                          GLintptr destOffset,
+                          GLsizeiptr size) override;
+    gl::Error map(GLenum access, GLvoid **mapPtr) override;
+    gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) override;
+    gl::Error unmap(GLboolean *result) override;
+    gl::Error markTransformFeedbackUsage() override;
</ins><span class="cx"> 
</span><ins>+    // We use two set of dirty callbacks for two events. Static buffers are marked dirty whenever
+    // the data is changed, because they must be re-translated. Direct buffers only need to be
+    // updated when the underlying ID3D11Buffer pointer changes - hopefully far less often.
+    void addStaticBufferDirtyCallback(const NotificationCallback *callback);
+    void removeStaticBufferDirtyCallback(const NotificationCallback *callback);
+
+    void addDirectBufferDirtyCallback(const NotificationCallback *callback);
+    void removeDirectBufferDirtyCallback(const NotificationCallback *callback);
+
</ins><span class="cx">   private:
</span><span class="cx">     class BufferStorage;
</span><ins>+    class EmulatedIndexedStorage;
</ins><span class="cx">     class NativeStorage;
</span><span class="cx">     class PackStorage;
</span><span class="cx">     class SystemMemoryStorage;
</span><span class="cx"> 
</span><del>-    Renderer11 *mRenderer;
-    size_t mSize;
-
-    BufferStorage *mMappedStorage;
-
-    std::map&lt;BufferUsage, BufferStorage*&gt; mBufferStorages;
-
</del><span class="cx">     struct ConstantBufferCacheEntry
</span><span class="cx">     {
</span><span class="cx">         ConstantBufferCacheEntry() : storage(nullptr), lruCount(0) { }
</span><span class="lines">@@ -91,6 +117,27 @@
</span><span class="cx">         unsigned int lruCount;
</span><span class="cx">     };
</span><span class="cx"> 
</span><ins>+    gl::Error markBufferUsage();
+    gl::ErrorOrResult&lt;NativeStorage *&gt; getStagingStorage();
+    gl::ErrorOrResult&lt;PackStorage *&gt; getPackStorage();
+    gl::ErrorOrResult&lt;SystemMemoryStorage *&gt; getSystemMemoryStorage();
+
+    gl::Error updateBufferStorage(BufferStorage *storage, size_t sourceOffset, size_t storageSize);
+    gl::ErrorOrResult&lt;BufferStorage *&gt; getBufferStorage(BufferUsage usage);
+    gl::ErrorOrResult&lt;BufferStorage *&gt; getLatestBufferStorage() const;
+
+    gl::ErrorOrResult&lt;BufferStorage *&gt; getConstantBufferRangeStorage(GLintptr offset,
+                                                                     GLsizeiptr size);
+
+    BufferStorage *allocateStorage(BufferUsage usage) const;
+
+    Renderer11 *mRenderer;
+    size_t mSize;
+
+    BufferStorage *mMappedStorage;
+
+    std::vector&lt;BufferStorage *&gt; mBufferStorages;
+
</ins><span class="cx">     // Cache of D3D11 constant buffer for specific ranges of buffer data.
</span><span class="cx">     // This is used to emulate UBO ranges on 11.0 devices.
</span><span class="cx">     // Constant buffers are indexed by there start offset.
</span><span class="lines">@@ -103,20 +150,11 @@
</span><span class="cx">     std::map&lt;DXGI_FORMAT, BufferSRVPair&gt; mBufferResourceViews;
</span><span class="cx"> 
</span><span class="cx">     unsigned int mReadUsageCount;
</span><del>-    bool mHasSystemMemoryStorage;
</del><span class="cx"> 
</span><del>-    void markBufferUsage();
-    NativeStorage *getStagingStorage();
-    PackStorage *getPackStorage();
-    gl::Error getSystemMemoryStorage(SystemMemoryStorage **storageOut);
-
-    void updateBufferStorage(BufferStorage *storage, size_t sourceOffset, size_t storageSize);
-    BufferStorage *getBufferStorage(BufferUsage usage);
-    BufferStorage *getLatestBufferStorage() const;
-
-    BufferStorage *getContantBufferRangeStorage(GLintptr offset, GLsizeiptr size);
</del><ins>+    NotificationSet mStaticBufferDirtyCallbacks;
+    NotificationSet mDirectBufferDirtyCallbacks;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_D3D11_BUFFER11_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Clear11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx">     float bottom = 1.0f;
</span><span class="cx"> 
</span><span class="cx">     // Clip the quad coordinates to the scissor if needed
</span><del>-    if (scissor != NULL)
</del><ins>+    if (scissor != nullptr)
</ins><span class="cx">     {
</span><span class="cx">         left = std::max(left, (scissor-&gt;x / float(framebufferSize.width)) * 2.0f - 1.0f);
</span><span class="cx">         right = std::min(right, ((scissor-&gt;x + scissor-&gt;width) / float(framebufferSize.width)) * 2.0f - 1.0f);
</span><span class="lines">@@ -59,34 +59,43 @@
</span><span class="cx">     d3d11::SetPositionDepthColorVertex&lt;T&gt;(vertices + 3, right, top,    depthClear, color);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;unsigned int vsSize, unsigned int psSize&gt;
-Clear11::ClearShader Clear11::CreateClearShader(ID3D11Device *device, DXGI_FORMAT colorType, const BYTE (&amp;vsByteCode)[vsSize], const BYTE (&amp;psByteCode)[psSize])
</del><ins>+Clear11::ClearShader::ClearShader(DXGI_FORMAT colorType,
+                                  const char *inputLayoutName,
+                                  const BYTE *vsByteCode,
+                                  size_t vsSize,
+                                  const char *vsDebugName,
+                                  const BYTE *psByteCode,
+                                  size_t psSize,
+                                  const char *psDebugName)
+    : inputLayout(nullptr),
+      vertexShader(vsByteCode, vsSize, vsDebugName),
+      pixelShader(psByteCode, psSize, psDebugName)
</ins><span class="cx"> {
</span><del>-    HRESULT result;
-
-    ClearShader shader = { 0 };
-
</del><span class="cx">     D3D11_INPUT_ELEMENT_DESC quadLayout[] =
</span><span class="cx">     {
</span><span class="cx">         { &quot;POSITION&quot;, 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,  0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
</span><span class="cx">         { &quot;COLOR&quot;,    0, colorType,                   0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    result = device-&gt;CreateInputLayout(quadLayout, ArraySize(quadLayout), vsByteCode, vsSize, &amp;shader.inputLayout);
-    ASSERT(SUCCEEDED(result));
</del><ins>+    inputLayout = new d3d11::LazyInputLayout(quadLayout, 2, vsByteCode, vsSize, inputLayoutName);
+}
</ins><span class="cx"> 
</span><del>-    result = device-&gt;CreateVertexShader(vsByteCode, vsSize, NULL, &amp;shader.vertexShader);
-    ASSERT(SUCCEEDED(result));
-
-    result = device-&gt;CreatePixelShader(psByteCode, psSize, NULL, &amp;shader.pixelShader);
-    ASSERT(SUCCEEDED(result));
-
-    return shader;
</del><ins>+Clear11::ClearShader::~ClearShader()
+{
+    SafeDelete(inputLayout);
+    vertexShader.release();
+    pixelShader.release();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Clear11::Clear11(Renderer11 *renderer)
</span><del>-    : mRenderer(renderer), mClearBlendStates(StructLessThan&lt;ClearBlendInfo&gt;), mClearDepthStencilStates(StructLessThan&lt;ClearDepthStencilInfo&gt;),
-      mVertexBuffer(NULL), mRasterizerState(NULL), mSupportsClearView(false)
</del><ins>+    : mRenderer(renderer),
+      mClearBlendStates(StructLessThan&lt;ClearBlendInfo&gt;),
+      mFloatClearShader(nullptr),
+      mUintClearShader(nullptr),
+      mIntClearShader(nullptr),
+      mClearDepthStencilStates(StructLessThan&lt;ClearDepthStencilInfo&gt;),
+      mVertexBuffer(nullptr),
+      mRasterizerState(nullptr)
</ins><span class="cx"> {
</span><span class="cx">     TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;Clear11::Clear11&quot;);
</span><span class="cx"> 
</span><span class="lines">@@ -101,7 +110,7 @@
</span><span class="cx">     vbDesc.MiscFlags = 0;
</span><span class="cx">     vbDesc.StructureByteStride = 0;
</span><span class="cx"> 
</span><del>-    result = device-&gt;CreateBuffer(&amp;vbDesc, NULL, &amp;mVertexBuffer);
</del><ins>+    result = device-&gt;CreateBuffer(&amp;vbDesc, nullptr, &amp;mVertexBuffer);
</ins><span class="cx">     ASSERT(SUCCEEDED(result));
</span><span class="cx">     d3d11::SetDebugName(mVertexBuffer, &quot;Clear11 masked clear vertex buffer&quot;);
</span><span class="cx"> 
</span><span class="lines">@@ -121,27 +130,48 @@
</span><span class="cx">     ASSERT(SUCCEEDED(result));
</span><span class="cx">     d3d11::SetDebugName(mRasterizerState, &quot;Clear11 masked clear rasterizer state&quot;);
</span><span class="cx"> 
</span><del>-    if (renderer-&gt;getFeatureLevel() &lt;= D3D_FEATURE_LEVEL_9_3)
</del><ins>+    if (mRenderer-&gt;getRenderer11DeviceCaps().featureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
</ins><span class="cx">     {
</span><del>-        mFloatClearShader = CreateClearShader(device, DXGI_FORMAT_R32G32B32A32_FLOAT, g_VS_ClearFloat, g_PS_ClearFloat_FL9);
</del><ins>+        mFloatClearShader = new ClearShader(DXGI_FORMAT_R32G32B32A32_FLOAT,
+                                            &quot;Clear11 Float IL&quot;,
+                                            g_VS_ClearFloat,
+                                            ArraySize(g_VS_ClearFloat),
+                                            &quot;Clear11 Float VS&quot;,
+                                            g_PS_ClearFloat_FL9,
+                                            ArraySize(g_PS_ClearFloat_FL9),
+                                            &quot;Clear11 Float PS&quot;);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        mFloatClearShader = CreateClearShader(device, DXGI_FORMAT_R32G32B32A32_FLOAT, g_VS_ClearFloat, g_PS_ClearFloat);
</del><ins>+        mFloatClearShader = new ClearShader(DXGI_FORMAT_R32G32B32A32_FLOAT,
+                                            &quot;Clear11 Float IL&quot;,
+                                            g_VS_ClearFloat,
+                                            ArraySize(g_VS_ClearFloat),
+                                            &quot;Clear11 Float VS&quot;,
+                                            g_PS_ClearFloat,
+                                            ArraySize(g_PS_ClearFloat),
+                                            &quot;Clear11 Float PS&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (renderer-&gt;isES3Capable())
</span><span class="cx">     {
</span><del>-        mUintClearShader  = CreateClearShader(device, DXGI_FORMAT_R32G32B32A32_UINT,  g_VS_ClearUint,  g_PS_ClearUint );
-        mIntClearShader   = CreateClearShader(device, DXGI_FORMAT_R32G32B32A32_SINT,  g_VS_ClearSint,  g_PS_ClearSint );
</del><ins>+        mUintClearShader = new ClearShader(DXGI_FORMAT_R32G32B32A32_UINT,
+                                           &quot;Clear11 UINT IL&quot;,
+                                           g_VS_ClearUint,
+                                           ArraySize(g_VS_ClearUint),
+                                           &quot;Clear11 UINT VS&quot;,
+                                           g_PS_ClearUint,
+                                           ArraySize(g_PS_ClearUint),
+                                           &quot;Clear11 UINT PS&quot;);
+        mIntClearShader = new ClearShader(DXGI_FORMAT_R32G32B32A32_UINT,
+                                          &quot;Clear11 SINT IL&quot;,
+                                          g_VS_ClearSint,
+                                          ArraySize(g_VS_ClearSint),
+                                          &quot;Clear11 SINT VS&quot;,
+                                          g_PS_ClearSint,
+                                          ArraySize(g_PS_ClearSint),
+                                          &quot;Clear11 SINT PS&quot;);
</ins><span class="cx">     }
</span><del>-
-    if (renderer-&gt;getDeviceContext1IfSupported())
-    {
-        D3D11_FEATURE_DATA_D3D11_OPTIONS d3d11Options;
-        device-&gt;CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &amp;d3d11Options, sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS));
-        mSupportsClearView = (d3d11Options.ClearView != FALSE);
-    }
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Clear11::~Clear11()
</span><span class="lines">@@ -152,21 +182,10 @@
</span><span class="cx">     }
</span><span class="cx">     mClearBlendStates.clear();
</span><span class="cx"> 
</span><del>-    SafeRelease(mFloatClearShader.inputLayout);
-    SafeRelease(mFloatClearShader.vertexShader);
-    SafeRelease(mFloatClearShader.pixelShader);
</del><ins>+    SafeDelete(mFloatClearShader);
+    SafeDelete(mUintClearShader);
+    SafeDelete(mIntClearShader);
</ins><span class="cx"> 
</span><del>-    if (mRenderer-&gt;isES3Capable())
-    {
-        SafeRelease(mUintClearShader.inputLayout);
-        SafeRelease(mUintClearShader.vertexShader);
-        SafeRelease(mUintClearShader.pixelShader);
-
-        SafeRelease(mIntClearShader.inputLayout);
-        SafeRelease(mIntClearShader.vertexShader);
-        SafeRelease(mIntClearShader.pixelShader);
-    }
-
</del><span class="cx">     for (ClearDepthStencilStateMap::iterator i = mClearDepthStencilStates.begin(); i != mClearDepthStencilStates.end(); i++)
</span><span class="cx">     {
</span><span class="cx">         SafeRelease(i-&gt;second);
</span><span class="lines">@@ -210,21 +229,15 @@
</span><span class="cx">     const gl::FramebufferAttachment *colorAttachment = fboData.getFirstColorAttachment();
</span><span class="cx">     if (colorAttachment != nullptr)
</span><span class="cx">     {
</span><del>-        framebufferSize.width = colorAttachment-&gt;getWidth();
-        framebufferSize.height = colorAttachment-&gt;getHeight();
-        framebufferSize.depth = 1;
</del><ins>+        framebufferSize = colorAttachment-&gt;getSize();
</ins><span class="cx">     }
</span><span class="cx">     else if (depthAttachment != nullptr)
</span><span class="cx">     {
</span><del>-        framebufferSize.width = depthAttachment-&gt;getWidth();
-        framebufferSize.height = depthAttachment-&gt;getHeight();
-        framebufferSize.depth = 1;
</del><ins>+        framebufferSize = depthAttachment-&gt;getSize();
</ins><span class="cx">     }
</span><span class="cx">     else if (stencilAttachment != nullptr)
</span><span class="cx">     {
</span><del>-        framebufferSize.width = stencilAttachment-&gt;getWidth();
-        framebufferSize.height = stencilAttachment-&gt;getHeight();
-        framebufferSize.depth = 1;
</del><ins>+        framebufferSize = stencilAttachment-&gt;getSize();
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -246,20 +259,21 @@
</span><span class="cx">                                                              clearParams.scissor.y + clearParams.scissor.height &lt; framebufferSize.height);
</span><span class="cx"> 
</span><span class="cx">     std::vector&lt;MaskedRenderTarget&gt; maskedClearRenderTargets;
</span><del>-    RenderTarget11* maskedClearDepthStencil = NULL;
</del><ins>+    RenderTarget11* maskedClearDepthStencil = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
</span><span class="cx">     ID3D11DeviceContext1 *deviceContext1 = mRenderer-&gt;getDeviceContext1IfSupported();
</span><ins>+    ID3D11Device *device = mRenderer-&gt;getDevice();
</ins><span class="cx"> 
</span><del>-    for (size_t colorAttachment = 0; colorAttachment &lt; colorAttachments.size(); colorAttachment++)
</del><ins>+    for (size_t colorAttachmentIndex = 0; colorAttachmentIndex &lt; colorAttachments.size();
+         colorAttachmentIndex++)
</ins><span class="cx">     {
</span><del>-        const gl::FramebufferAttachment &amp;attachment = colorAttachments[colorAttachment];
</del><ins>+        const gl::FramebufferAttachment &amp;attachment = colorAttachments[colorAttachmentIndex];
</ins><span class="cx"> 
</span><del>-        if (clearParams.clearColor[colorAttachment] &amp;&amp;
-            attachment.isAttached() &amp;&amp;
-            drawBufferStates[colorAttachment] != GL_NONE)
</del><ins>+        if (clearParams.clearColor[colorAttachmentIndex] &amp;&amp; attachment.isAttached() &amp;&amp;
+            drawBufferStates[colorAttachmentIndex] != GL_NONE)
</ins><span class="cx">         {
</span><del>-            RenderTarget11 *renderTarget = NULL;
</del><ins>+            RenderTarget11 *renderTarget = nullptr;
</ins><span class="cx">             gl::Error error = attachment.getRenderTarget(&amp;renderTarget);
</span><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="lines">@@ -271,9 +285,12 @@
</span><span class="cx">             if (clearParams.colorClearType == GL_FLOAT &amp;&amp;
</span><span class="cx">                 !(formatInfo.componentType == GL_FLOAT || formatInfo.componentType == GL_UNSIGNED_NORMALIZED || formatInfo.componentType == GL_SIGNED_NORMALIZED))
</span><span class="cx">             {
</span><del>-                ERR(&quot;It is undefined behaviour to clear a render buffer which is not normalized fixed point or floating-&quot;
-                    &quot;point to floating point values (color attachment %u has internal format 0x%X).&quot;, colorAttachment,
-                    attachment.getInternalFormat());
</del><ins>+                ERR(
+                    &quot;It is undefined behaviour to clear a render buffer which is not normalized &quot;
+                    &quot;fixed point or floating-&quot;
+                    &quot;point to floating point values (color attachment %u has internal format &quot;
+                    &quot;0x%X).&quot;,
+                    colorAttachmentIndex, attachment.getInternalFormat());
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if ((formatInfo.redBits == 0 || !clearParams.colorMaskRed) &amp;&amp;
</span><span class="lines">@@ -284,7 +301,7 @@
</span><span class="cx">                 // Every channel either does not exist in the render target or is masked out
</span><span class="cx">                 continue;
</span><span class="cx">             }
</span><del>-            else if ((!mSupportsClearView &amp;&amp; needScissoredClear) || clearParams.colorClearType != GL_FLOAT ||
</del><ins>+            else if ((!(mRenderer-&gt;getRenderer11DeviceCaps().supportsClearView) &amp;&amp; needScissoredClear) || clearParams.colorClearType != GL_FLOAT ||
</ins><span class="cx">                      (formatInfo.redBits   &gt; 0 &amp;&amp; !clearParams.colorMaskRed)   ||
</span><span class="cx">                      (formatInfo.greenBits &gt; 0 &amp;&amp; !clearParams.colorMaskGreen) ||
</span><span class="cx">                      (formatInfo.blueBits  &gt; 0 &amp;&amp; !clearParams.colorMaskBlue) ||
</span><span class="lines">@@ -292,7 +309,7 @@
</span><span class="cx">             {
</span><span class="cx">                 // A masked clear is required, or a scissored clear is required and ID3D11DeviceContext1::ClearView is unavailable
</span><span class="cx">                 MaskedRenderTarget maskAndRt;
</span><del>-                bool clearColor = clearParams.clearColor[colorAttachment];
</del><ins>+                bool clearColor        = clearParams.clearColor[colorAttachmentIndex];
</ins><span class="cx">                 maskAndRt.colorMask[0] = (clearColor &amp;&amp; clearParams.colorMaskRed);
</span><span class="cx">                 maskAndRt.colorMask[1] = (clearColor &amp;&amp; clearParams.colorMaskGreen);
</span><span class="cx">                 maskAndRt.colorMask[2] = (clearColor &amp;&amp; clearParams.colorMaskBlue);
</span><span class="lines">@@ -310,11 +327,12 @@
</span><span class="cx">                     return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal render target view pointer unexpectedly null.&quot;);
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(renderTarget-&gt;getDXGIFormat());
</del><ins>+                const auto &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(
+                    d3d11::GetANGLEFormatSet(renderTarget-&gt;getANGLEFormat()).rtvFormat);
</ins><span class="cx"> 
</span><span class="cx">                 // Check if the actual format has a channel that the internal format does not and set them to the
</span><span class="cx">                 // default values
</span><del>-                const float clearValues[4] =
</del><ins>+                float clearValues[4] =
</ins><span class="cx">                 {
</span><span class="cx">                     ((formatInfo.redBits   == 0 &amp;&amp; dxgiFormatInfo.redBits   &gt; 0) ? 0.0f : clearParams.colorFClearValue.red),
</span><span class="cx">                     ((formatInfo.greenBits == 0 &amp;&amp; dxgiFormatInfo.greenBits &gt; 0) ? 0.0f : clearParams.colorFClearValue.green),
</span><span class="lines">@@ -322,6 +340,14 @@
</span><span class="cx">                     ((formatInfo.alphaBits == 0 &amp;&amp; dxgiFormatInfo.alphaBits &gt; 0) ? 1.0f : clearParams.colorFClearValue.alpha),
</span><span class="cx">                 };
</span><span class="cx"> 
</span><ins>+                if (dxgiFormatInfo.alphaBits == 1)
+                {
+                    // Some drivers do not correctly handle calling Clear() on a format with 1-bit alpha.
+                    // They can incorrectly round all non-zero values up to 1.0f. Note that WARP does not do this.
+                    // We should handle the rounding for them instead.
+                    clearValues[3] = (clearParams.colorFClearValue.alpha &gt;= 0.5f) ? 1.0f : 0.0f;
+                }
+
</ins><span class="cx">                 if (needScissoredClear)
</span><span class="cx">                 {
</span><span class="cx">                     // We shouldn't reach here if deviceContext1 is unavailable.
</span><span class="lines">@@ -348,14 +374,15 @@
</span><span class="cx">         const gl::FramebufferAttachment *attachment = (depthAttachment != nullptr) ? depthAttachment : stencilAttachment;
</span><span class="cx">         ASSERT(attachment != nullptr);
</span><span class="cx"> 
</span><del>-        RenderTarget11 *renderTarget = NULL;
</del><ins>+        RenderTarget11 *renderTarget = nullptr;
</ins><span class="cx">         gl::Error error = attachment-&gt;getRenderTarget(&amp;renderTarget);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(renderTarget-&gt;getDXGIFormat());
</del><ins>+        const auto &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(
+            d3d11::GetANGLEFormatSet(renderTarget-&gt;getANGLEFormat()).dsvFormat);
</ins><span class="cx"> 
</span><span class="cx">         unsigned int stencilUnmasked = (stencilAttachment != nullptr) ? (1 &lt;&lt; dxgiFormatInfo.stencilBits) - 1 : 0;
</span><span class="cx">         bool needMaskedStencilClear = clearParams.clearStencil &amp;&amp; (clearParams.stencilWriteMask &amp; stencilUnmasked) != stencilUnmasked;
</span><span class="lines">@@ -420,7 +447,7 @@
</span><span class="cx"> 
</span><span class="cx">             rtvs[i] = rtv;
</span><span class="cx">         }
</span><del>-        ID3D11DepthStencilView *dsv = maskedClearDepthStencil ? maskedClearDepthStencil-&gt;getDepthStencilView() : NULL;
</del><ins>+        ID3D11DepthStencilView *dsv = maskedClearDepthStencil ? maskedClearDepthStencil-&gt;getDepthStencilView() : nullptr;
</ins><span class="cx"> 
</span><span class="cx">         ID3D11BlendState *blendState = getBlendState(maskedClearRenderTargets);
</span><span class="cx">         const FLOAT blendFactors[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
</span><span class="lines">@@ -432,7 +459,7 @@
</span><span class="cx">         // Set the vertices
</span><span class="cx">         UINT vertexStride = 0;
</span><span class="cx">         const UINT startIdx = 0;
</span><del>-        const ClearShader* shader = NULL;
</del><ins>+        ClearShader *shader = nullptr;
</ins><span class="cx">         D3D11_MAPPED_SUBRESOURCE mappedResource;
</span><span class="cx">         HRESULT result = deviceContext-&gt;Map(mVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &amp;mappedResource);
</span><span class="cx">         if (FAILED(result))
</span><span class="lines">@@ -440,25 +467,25 @@
</span><span class="cx">             return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to map internal masked clear vertex buffer, HRESULT: 0x%X.&quot;, result);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        const gl::Rectangle *scissorPtr = clearParams.scissorEnabled ? &amp;clearParams.scissor : NULL;
</del><ins>+        const gl::Rectangle *scissorPtr = clearParams.scissorEnabled ? &amp;clearParams.scissor : nullptr;
</ins><span class="cx">         switch (clearParams.colorClearType)
</span><span class="cx">         {
</span><span class="cx">           case GL_FLOAT:
</span><span class="cx">             ApplyVertices(framebufferSize, scissorPtr, clearParams.colorFClearValue, clearParams.depthClearValue, mappedResource.pData);
</span><span class="cx">             vertexStride = sizeof(d3d11::PositionDepthColorVertex&lt;float&gt;);
</span><del>-            shader = &amp;mFloatClearShader;
</del><ins>+            shader = mFloatClearShader;
</ins><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           case GL_UNSIGNED_INT:
</span><span class="cx">             ApplyVertices(framebufferSize, scissorPtr, clearParams.colorUIClearValue, clearParams.depthClearValue, mappedResource.pData);
</span><span class="cx">             vertexStride = sizeof(d3d11::PositionDepthColorVertex&lt;unsigned int&gt;);
</span><del>-            shader = &amp;mUintClearShader;
</del><ins>+            shader = mUintClearShader;
</ins><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           case GL_INT:
</span><span class="cx">             ApplyVertices(framebufferSize, scissorPtr, clearParams.colorIClearValue, clearParams.depthClearValue, mappedResource.pData);
</span><span class="cx">             vertexStride = sizeof(d3d11::PositionDepthColorVertex&lt;int&gt;);
</span><del>-            shader = &amp;mIntClearShader;
</del><ins>+            shader = mIntClearShader;
</ins><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           default:
</span><span class="lines">@@ -484,17 +511,17 @@
</span><span class="cx">         deviceContext-&gt;RSSetState(mRasterizerState);
</span><span class="cx"> 
</span><span class="cx">         // Apply shaders
</span><del>-        deviceContext-&gt;IASetInputLayout(shader-&gt;inputLayout);
-        deviceContext-&gt;VSSetShader(shader-&gt;vertexShader, NULL, 0);
-        deviceContext-&gt;PSSetShader(shader-&gt;pixelShader, NULL, 0);
-        deviceContext-&gt;GSSetShader(NULL, NULL, 0);
</del><ins>+        deviceContext-&gt;IASetInputLayout(shader-&gt;inputLayout-&gt;resolve(device));
+        deviceContext-&gt;VSSetShader(shader-&gt;vertexShader.resolve(device), nullptr, 0);
+        deviceContext-&gt;PSSetShader(shader-&gt;pixelShader.resolve(device), nullptr, 0);
+        deviceContext-&gt;GSSetShader(nullptr, nullptr, 0);
</ins><span class="cx"> 
</span><span class="cx">         // Apply vertex buffer
</span><span class="cx">         deviceContext-&gt;IASetVertexBuffers(0, 1, &amp;mVertexBuffer, &amp;vertexStride, &amp;startIdx);
</span><span class="cx">         deviceContext-&gt;IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
</span><span class="cx"> 
</span><span class="cx">         // Apply render targets
</span><del>-        deviceContext-&gt;OMSetRenderTargets(rtvs.size(), (rtvs.empty() ? NULL : &amp;rtvs[0]), dsv);
</del><ins>+        mRenderer-&gt;getStateManager()-&gt;setOneTimeRenderTargets(rtvs, dsv);
</ins><span class="cx"> 
</span><span class="cx">         // Draw the clear quad
</span><span class="cx">         deviceContext-&gt;Draw(4, 0);
</span><span class="lines">@@ -508,7 +535,7 @@
</span><span class="cx"> 
</span><span class="cx"> ID3D11BlendState *Clear11::getBlendState(const std::vector&lt;MaskedRenderTarget&gt;&amp; rts)
</span><span class="cx"> {
</span><del>-    ClearBlendInfo blendKey = { 0 };
</del><ins>+    ClearBlendInfo blendKey = {};
</ins><span class="cx">     for (unsigned int i = 0; i &lt; D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++)
</span><span class="cx">     {
</span><span class="cx">         if (i &lt; rts.size())
</span><span class="lines">@@ -551,12 +578,12 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><del>-        ID3D11BlendState* blendState = NULL;
</del><ins>+        ID3D11BlendState* blendState = nullptr;
</ins><span class="cx">         HRESULT result = device-&gt;CreateBlendState(&amp;blendDesc, &amp;blendState);
</span><span class="cx">         if (FAILED(result) || !blendState)
</span><span class="cx">         {
</span><span class="cx">             ERR(&quot;Unable to create a ID3D11BlendState, HRESULT: 0x%X.&quot;, result);
</span><del>-            return NULL;
</del><ins>+            return nullptr;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         mClearBlendStates[blendKey] = blendState;
</span><span class="lines">@@ -596,12 +623,12 @@
</span><span class="cx">         dsDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
</span><span class="cx"> 
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><del>-        ID3D11DepthStencilState* dsState = NULL;
</del><ins>+        ID3D11DepthStencilState* dsState = nullptr;
</ins><span class="cx">         HRESULT result = device-&gt;CreateDepthStencilState(&amp;dsDesc, &amp;dsState);
</span><span class="cx">         if (FAILED(result) || !dsState)
</span><span class="cx">         {
</span><span class="cx">             ERR(&quot;Unable to create a ID3D11DepthStencilState, HRESULT: 0x%X.&quot;, result);
</span><del>-            return NULL;
</del><ins>+            return nullptr;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         mClearDepthStencilStates[dsKey] = dsState;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Clear11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Clear11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Clear11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Clear11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,6 +15,7 @@
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -41,44 +42,54 @@
</span><span class="cx">     ID3D11BlendState *getBlendState(const std::vector&lt;MaskedRenderTarget&gt; &amp;rts);
</span><span class="cx">     ID3D11DepthStencilState *getDepthStencilState(const ClearParameters &amp;clearParams);
</span><span class="cx"> 
</span><del>-    struct ClearShader
</del><ins>+    struct ClearShader final : public angle::NonCopyable
</ins><span class="cx">     {
</span><del>-        ID3D11InputLayout *inputLayout;
-        ID3D11VertexShader *vertexShader;
-        ID3D11PixelShader *pixelShader;
</del><ins>+        ClearShader(DXGI_FORMAT colorType,
+                    const char *inputLayoutName,
+                    const BYTE *vsByteCode,
+                    size_t vsSize,
+                    const char *vsDebugName,
+                    const BYTE *psByteCode,
+                    size_t psSize,
+                    const char *psDebugName);
+        ~ClearShader();
+
+        d3d11::LazyInputLayout *inputLayout;
+        d3d11::LazyShader&lt;ID3D11VertexShader&gt; vertexShader;
+        d3d11::LazyShader&lt;ID3D11PixelShader&gt; pixelShader;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     template &lt;unsigned int vsSize, unsigned int psSize&gt;
</span><span class="cx">     static ClearShader CreateClearShader(ID3D11Device *device, DXGI_FORMAT colorType, const BYTE(&amp;vsByteCode)[vsSize], const BYTE(&amp;psByteCode)[psSize]);
</span><span class="cx"> 
</span><del>-    Renderer11 *mRenderer;
-
</del><span class="cx">     struct ClearBlendInfo
</span><span class="cx">     {
</span><span class="cx">         bool maskChannels[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT][4];
</span><span class="cx">     };
</span><span class="cx">     typedef bool(*ClearBlendInfoComparisonFunction)(const ClearBlendInfo&amp;, const ClearBlendInfo &amp;);
</span><span class="cx">     typedef std::map&lt;ClearBlendInfo, ID3D11BlendState*, ClearBlendInfoComparisonFunction&gt; ClearBlendStateMap;
</span><del>-    ClearBlendStateMap mClearBlendStates;
</del><span class="cx"> 
</span><del>-    ClearShader mFloatClearShader;
-    ClearShader mUintClearShader;
-    ClearShader mIntClearShader;
-
</del><span class="cx">     struct ClearDepthStencilInfo
</span><span class="cx">     {
</span><span class="cx">         bool clearDepth;
</span><span class="cx">         bool clearStencil;
</span><span class="cx">         UINT8 stencilWriteMask;
</span><span class="cx">     };
</span><del>-    typedef bool (*ClearDepthStencilInfoComparisonFunction)(const ClearDepthStencilInfo&amp;, const ClearDepthStencilInfo &amp;);
</del><ins>+    typedef bool(*ClearDepthStencilInfoComparisonFunction)(const ClearDepthStencilInfo&amp;, const ClearDepthStencilInfo &amp;);
</ins><span class="cx">     typedef std::map&lt;ClearDepthStencilInfo, ID3D11DepthStencilState*, ClearDepthStencilInfoComparisonFunction&gt; ClearDepthStencilStateMap;
</span><ins>+
+    Renderer11 *mRenderer;
+
+    ClearBlendStateMap mClearBlendStates;
+
+    ClearShader *mFloatClearShader;
+    ClearShader *mUintClearShader;
+    ClearShader *mIntClearShader;
+
</ins><span class="cx">     ClearDepthStencilStateMap mClearDepthStencilStates;
</span><span class="cx"> 
</span><span class="cx">     ID3D11Buffer *mVertexBuffer;
</span><span class="cx">     ID3D11RasterizerState *mRasterizerState;
</span><del>-
-    bool mSupportsClearView;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11DebugAnnotator11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -35,44 +35,84 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DebugAnnotator11::beginEvent(const std::wstring &amp;eventName)
</del><ins>+void DebugAnnotator11::beginEvent(const wchar_t *eventName)
</ins><span class="cx"> {
</span><span class="cx">     initializeDevice();
</span><span class="cx"> 
</span><del>-    mUserDefinedAnnotation-&gt;BeginEvent(eventName.c_str());
</del><ins>+    if (mUserDefinedAnnotation != nullptr)
+    {
+        mUserDefinedAnnotation-&gt;BeginEvent(eventName);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DebugAnnotator11::endEvent()
</span><span class="cx"> {
</span><span class="cx">     initializeDevice();
</span><span class="cx"> 
</span><del>-    mUserDefinedAnnotation-&gt;EndEvent();
</del><ins>+    if (mUserDefinedAnnotation != nullptr)
+    {
+        mUserDefinedAnnotation-&gt;EndEvent();
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DebugAnnotator11::setMarker(const std::wstring &amp;markerName)
</del><ins>+void DebugAnnotator11::setMarker(const wchar_t *markerName)
</ins><span class="cx"> {
</span><span class="cx">     initializeDevice();
</span><span class="cx"> 
</span><del>-    mUserDefinedAnnotation-&gt;SetMarker(markerName.c_str());
</del><ins>+    if (mUserDefinedAnnotation != nullptr)
+    {
+        mUserDefinedAnnotation-&gt;SetMarker(markerName);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool DebugAnnotator11::getStatus()
</span><span class="cx"> {
</span><del>-    // ID3DUserDefinedAnnotation::GetStatus doesn't work with the Graphics Diagnostics tools in Visual Studio 2013.
</del><ins>+#if defined(ANGLE_ENABLE_WINDOWS_STORE)
+#if (NTDDI_VERSION == NTDDI_WIN10)
+    initializeDevice();
</ins><span class="cx"> 
</span><del>-#if defined(_DEBUG) &amp;&amp; defined(ANGLE_ENABLE_WINDOWS_STORE)
-    // In the Windows Store, we can use IDXGraphicsAnalysis. The call to GetDebugInterface1 only succeeds if the app is under capture.
</del><ins>+    if (mUserDefinedAnnotation != nullptr)
+    {
+        return !!(mUserDefinedAnnotation-&gt;GetStatus());
+    }
+
+    return true;  // Default if initializeDevice() failed
+#elif defined(_DEBUG)
+    static bool underCapture = true;
+
+    // ID3DUserDefinedAnnotation::GetStatus doesn't work with the Graphics Diagnostics tools in
+    // Windows 8.1/Visual Studio 2013. We can use IDXGraphicsAnalysis, though.
+    // The call to GetDebugInterface1 only succeeds if the app is under capture.
</ins><span class="cx">     // This should only be called in DEBUG mode.
</span><del>-    // If an app links against DXGIGetDebugInterface1 in release mode then it will fail Windows Store ingestion checks.
-    IDXGraphicsAnalysis *graphicsAnalysis;
-    DXGIGetDebugInterface1(0, IID_PPV_ARGS(&amp;graphicsAnalysis));
-    bool underCapture = (graphicsAnalysis != nullptr);
-    SafeRelease(graphicsAnalysis);
</del><ins>+    // If an app links against DXGIGetDebugInterface1 in release mode then it will fail Windows
+    // Store ingestion checks.
+
+    // Cache the result to reduce the number of calls to DXGIGetDebugInterface1
+    static bool triedIDXGraphicsAnalysis = false;
+
+    if (!triedIDXGraphicsAnalysis)
+    {
+        IDXGraphicsAnalysis *graphicsAnalysis = nullptr;
+
+        HRESULT result = DXGIGetDebugInterface1(0, IID_PPV_ARGS(&amp;graphicsAnalysis));
+        if (SUCCEEDED(result))
+        {
+            underCapture = (graphicsAnalysis != nullptr);
+        }
+
+        SafeRelease(graphicsAnalysis);
+        triedIDXGraphicsAnalysis = true;
+    }
+
</ins><span class="cx">     return underCapture;
</span><del>-#endif // _DEBUG &amp;&amp; !ANGLE_ENABLE_WINDOWS_STORE
-
-    // Otherwise, we have to return true here.
</del><ins>+#else
+    // We can't detect GetStatus() on release WinRT 8.1 builds, so always return true.
</ins><span class="cx">     return true;
</span><ins>+#endif  // (NTDDI_VERSION == NTDDI_WIN10) or _DEBUG
+#else
+    // We can't detect GetStatus() on desktop ANGLE builds so always return true.
+    return true;
+#endif  // ANGLE_ENABLE_WINDOWS_STORE
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DebugAnnotator11::initializeDevice()
</span><span class="lines">@@ -95,14 +135,15 @@
</span><span class="cx">         // Create a D3D_DRIVER_TYPE_NULL device, which is much cheaper than other types of device.
</span><span class="cx">         hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_NULL, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &amp;device, nullptr, &amp;context);
</span><span class="cx">         ASSERT(SUCCEEDED(hr));
</span><ins>+        if (SUCCEEDED(hr))
+        {
+            mUserDefinedAnnotation = d3d11::DynamicCastComObject&lt;ID3DUserDefinedAnnotation&gt;(context);
+            ASSERT(mUserDefinedAnnotation != nullptr);
+            mInitialized = true;
+        }
</ins><span class="cx"> 
</span><del>-        mUserDefinedAnnotation = d3d11::DynamicCastComObject&lt;ID3DUserDefinedAnnotation&gt;(context);
-        ASSERT(mUserDefinedAnnotation != nullptr);
-
</del><span class="cx">         SafeRelease(device);
</span><span class="cx">         SafeRelease(context);
</span><del>-
-        mInitialized = true;
</del><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11DebugAnnotator11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -19,9 +19,9 @@
</span><span class="cx">   public:
</span><span class="cx">     DebugAnnotator11();
</span><span class="cx">     ~DebugAnnotator11() override;
</span><del>-    void beginEvent(const std::wstring &amp;eventName) override;
</del><ins>+    void beginEvent(const wchar_t *eventName) override;
</ins><span class="cx">     void endEvent() override;
</span><del>-    void setMarker(const std::wstring &amp;markerName) override;
</del><ins>+    void setMarker(const wchar_t *markerName) override;
</ins><span class="cx">     bool getStatus() override;
</span><span class="cx"> 
</span><span class="cx">   private:
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Fence11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Fence11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -123,7 +123,7 @@
</span><span class="cx">       mRenderer(renderer),
</span><span class="cx">       mQuery(NULL)
</span><span class="cx"> {
</span><del>-    LARGE_INTEGER counterFreqency = { 0 };
</del><ins>+    LARGE_INTEGER counterFreqency = {};
</ins><span class="cx">     BOOL success = QueryPerformanceFrequency(&amp;counterFreqency);
</span><span class="cx">     UNUSED_ASSERTION_VARIABLE(success);
</span><span class="cx">     ASSERT(success);
</span><span class="lines">@@ -168,7 +168,7 @@
</span><span class="cx">         return gl::Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    LARGE_INTEGER currentCounter = { 0 };
</del><ins>+    LARGE_INTEGER currentCounter = {};
</ins><span class="cx">     BOOL success = QueryPerformanceCounter(&amp;currentCounter);
</span><span class="cx">     UNUSED_ASSERTION_VARIABLE(success);
</span><span class="cx">     ASSERT(success);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Framebuffer11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,6 +9,7 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Framebuffer11.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><ins>+#include &quot;common/BitSetIterator.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Buffer11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Clear11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/TextureStorage11.h&quot;
</span><span class="lines">@@ -24,19 +25,10 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-Framebuffer11::Framebuffer11(const gl::Framebuffer::Data &amp;data, Renderer11 *renderer)
-    : FramebufferD3D(data, renderer),
-      mRenderer(renderer)
</del><ins>+namespace
</ins><span class="cx"> {
</span><del>-    ASSERT(mRenderer != nullptr);
-}
-
-Framebuffer11::~Framebuffer11()
</del><ins>+gl::Error InvalidateAttachmentSwizzles(const gl::FramebufferAttachment *attachment)
</ins><span class="cx"> {
</span><del>-}
-
-static gl::Error InvalidateAttachmentSwizzles(const gl::FramebufferAttachment *attachment)
-{
</del><span class="cx">     if (attachment &amp;&amp; attachment-&gt;type() == GL_TEXTURE)
</span><span class="cx">     {
</span><span class="cx">         gl::Texture *texture = attachment-&gt;getTexture();
</span><span class="lines">@@ -62,6 +54,67 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UpdateCachedRenderTarget(const gl::FramebufferAttachment *attachment,
+                              RenderTarget11 *&amp;cachedRenderTarget,
+                              const NotificationCallback &amp;callbackFunc)
+{
+    RenderTarget11 *newRenderTarget = nullptr;
+    if (attachment)
+    {
+        attachment-&gt;getRenderTarget(&amp;newRenderTarget);
+    }
+    if (newRenderTarget != cachedRenderTarget)
+    {
+        if (cachedRenderTarget)
+        {
+            cachedRenderTarget-&gt;removeDirtyCallback(&amp;callbackFunc);
+        }
+
+        if (newRenderTarget)
+        {
+            newRenderTarget-&gt;addDirtyCallback(&amp;callbackFunc);
+        }
+
+        cachedRenderTarget = newRenderTarget;
+    }
+}
+}  // anonymous namespace
+
+Framebuffer11::Framebuffer11(const gl::Framebuffer::Data &amp;data, Renderer11 *renderer)
+    : FramebufferD3D(data, renderer), mRenderer(renderer), mCachedDepthStencilRenderTarget(nullptr)
+{
+    ASSERT(mRenderer != nullptr);
+    mCachedColorRenderTargets.fill(nullptr);
+    for (size_t colorIndex = 0; colorIndex &lt; data.getColorAttachments().size(); ++colorIndex)
+    {
+        auto callback = [this, colorIndex]()
+        {
+            this-&gt;markColorRenderTargetDirty(colorIndex);
+        };
+        mColorRenderTargetsDirty.push_back(callback);
+    }
+    mDepthStencilRenderTargetDirty = [this]()
+    {
+        this-&gt;markDepthStencilRenderTargetDirty();
+    };
+}
+
+Framebuffer11::~Framebuffer11()
+{
+    for (size_t colorIndex = 0; colorIndex &lt; mCachedColorRenderTargets.size(); ++colorIndex)
+    {
+        auto *colorRenderTarget = mCachedColorRenderTargets[colorIndex];
+        if (colorRenderTarget)
+        {
+            colorRenderTarget-&gt;removeDirtyCallback(&amp;mColorRenderTargetsDirty[colorIndex]);
+        }
+    }
+    if (mCachedDepthStencilRenderTarget)
+    {
+        mCachedDepthStencilRenderTarget-&gt;removeDirtyCallback(&amp;mDepthStencilRenderTargetDirty);
+    }
+}
+
</ins><span class="cx"> gl::Error Framebuffer11::invalidateSwizzles() const
</span><span class="cx"> {
</span><span class="cx">     for (const auto &amp;colorAttachment : mData.getColorAttachments())
</span><span class="lines">@@ -91,10 +144,30 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Framebuffer11::clear(const gl::State &amp;state, const ClearParameters &amp;clearParams)
</del><ins>+gl::Error Framebuffer11::clear(const gl::Data &amp;data, const ClearParameters &amp;clearParams)
</ins><span class="cx"> {
</span><span class="cx">     Clear11 *clearer = mRenderer-&gt;getClearer();
</span><del>-    gl::Error error = clearer-&gt;clearFramebuffer(clearParams, mData);
</del><ins>+    gl::Error error(GL_NO_ERROR);
+
+    const gl::FramebufferAttachment *colorAttachment = mData.getFirstColorAttachment();
+    if (clearParams.scissorEnabled == true &amp;&amp; colorAttachment != nullptr &amp;&amp;
+        UsePresentPathFast(mRenderer, colorAttachment))
+    {
+        // If the current framebuffer is using the default colorbuffer, and present path fast is
+        // active, and the scissor rect is enabled, then we should invert the scissor rect
+        // vertically
+        ClearParameters presentPathFastClearParams = clearParams;
+        gl::Extents framebufferSize                = colorAttachment-&gt;getSize();
+        presentPathFastClearParams.scissor.y       = framebufferSize.height -
+                                               presentPathFastClearParams.scissor.y -
+                                               presentPathFastClearParams.scissor.height;
+        error = clearer-&gt;clearFramebuffer(presentPathFastClearParams, mData);
+    }
+    else
+    {
+        error = clearer-&gt;clearFramebuffer(clearParams, mData);
+    }
+
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -109,76 +182,191 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gl::Error getRenderTargetResource(const gl::FramebufferAttachment *colorbuffer, unsigned int *subresourceIndexOut,
-                                         ID3D11Texture2D **texture2DOut)
</del><ins>+gl::Error Framebuffer11::invalidate(size_t count, const GLenum *attachments)
</ins><span class="cx"> {
</span><del>-    ASSERT(colorbuffer);
</del><ins>+    return invalidateBase(count, attachments, false);
+}
</ins><span class="cx"> 
</span><del>-    RenderTarget11 *renderTarget = nullptr;
-    gl::Error error = colorbuffer-&gt;getRenderTarget(&amp;renderTarget);
-    if (error.isError())
</del><ins>+gl::Error Framebuffer11::discard(size_t count, const GLenum *attachments)
+{
+    return invalidateBase(count, attachments, true);
+}
+
+gl::Error Framebuffer11::invalidateBase(size_t count, const GLenum *attachments, bool useEXTBehavior) const
+{
+    ID3D11DeviceContext1 *deviceContext1 = mRenderer-&gt;getDeviceContext1IfSupported();
+
+    if (!deviceContext1)
</ins><span class="cx">     {
</span><del>-        return error;
</del><ins>+        // DiscardView() is only supported on ID3D11DeviceContext1
+        return gl::Error(GL_NO_ERROR);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ID3D11Resource *renderTargetResource = renderTarget-&gt;getTexture();
-    ASSERT(renderTargetResource);
</del><ins>+    bool foundDepth = false;
+    bool foundStencil = false;
</ins><span class="cx"> 
</span><del>-    *subresourceIndexOut = renderTarget-&gt;getSubresourceIndex();
-    *texture2DOut = d3d11::DynamicCastComObject&lt;ID3D11Texture2D&gt;(renderTargetResource);
-
-    if (!(*texture2DOut))
</del><ins>+    for (size_t i = 0; i &lt; count; ++i)
</ins><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to query the ID3D11Texture2D from a RenderTarget&quot;);
-    }
</del><ins>+        switch (attachments[i])
+        {
+          // Handle depth and stencil attachments. Defer discarding until later.
+          case GL_DEPTH_STENCIL_ATTACHMENT:
+            foundDepth = true;
+            foundStencil = true;
+            break;
+          case GL_DEPTH_EXT:
+          case GL_DEPTH_ATTACHMENT:
+            foundDepth = true;
+            break;
+          case GL_STENCIL_EXT:
+          case GL_STENCIL_ATTACHMENT:
+            foundStencil = true;
+            break;
+          default:
+            {
+                // Handle color attachments
+                ASSERT((attachments[i] &gt;= GL_COLOR_ATTACHMENT0 &amp;&amp; attachments[i] &lt;= GL_COLOR_ATTACHMENT15) ||
+                       (attachments[i] == GL_COLOR));
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
-}
</del><ins>+                RenderTarget11 *renderTarget = nullptr;
+                ID3D11View *colorView = nullptr;
+                gl::Error error(GL_NO_ERROR);
+                size_t colorAttachmentID = 0;
</ins><span class="cx"> 
</span><del>-gl::Error Framebuffer11::readPixels(const gl::Rectangle &amp;area, GLenum format, GLenum type, size_t outputPitch, const gl::PixelPackState &amp;pack, uint8_t *pixels) const
-{
-    ID3D11Texture2D *colorBufferTexture = nullptr;
-    unsigned int subresourceIndex = 0;
</del><ins>+                if (attachments[i] == GL_COLOR)
+                {
+                    colorAttachmentID = 0;
+                }
+                else
+                {
+                    colorAttachmentID = attachments[i] - GL_COLOR_ATTACHMENT0;
+                }
</ins><span class="cx"> 
</span><del>-    const gl::FramebufferAttachment *colorbuffer = mData.getReadAttachment();
-    ASSERT(colorbuffer);
</del><ins>+                if (mData.getColorAttachment(static_cast&lt;unsigned int&gt;(colorAttachmentID)))
+                {
+                    error = mData.getColorAttachment(static_cast&lt;unsigned int&gt;(colorAttachmentID))
+                                -&gt;getRenderTarget(&amp;renderTarget);
+                    if (error.isError())
+                    {
+                        return error;
+                    }
</ins><span class="cx"> 
</span><del>-    gl::Error error = getRenderTargetResource(colorbuffer, &amp;subresourceIndex, &amp;colorBufferTexture);
-    if (error.isError())
</del><ins>+                    colorView = renderTarget-&gt;getRenderTargetView();
+
+                    if (colorView != nullptr)
+                    {
+                        deviceContext1-&gt;DiscardView(colorView);
+                    }
+                }
+
+                break;
+            }
+        }
+    }
+
+    bool discardDepth = false;
+    bool discardStencil = false;
+
+    // The D3D11 renderer uses the same view for depth and stencil buffers, so we must be careful.
+    if (useEXTBehavior)
</ins><span class="cx">     {
</span><del>-        return error;
</del><ins>+        // In the extension, if the app discards only one of the depth and stencil attachments, but
+        // those are backed by the same packed_depth_stencil buffer, then both images become undefined.
+        discardDepth = foundDepth;
+
+        // Don't bother discarding the stencil buffer if the depth buffer will already do it
+        discardStencil = foundStencil &amp;&amp; (!discardDepth || mData.getDepthAttachment() == nullptr);
</ins><span class="cx">     }
</span><ins>+    else
+    {
+        // In ES 3.0.4, if a specified attachment has base internal format DEPTH_STENCIL but the
+        // attachments list does not include DEPTH_STENCIL_ATTACHMENT or both DEPTH_ATTACHMENT and
+        // STENCIL_ATTACHMENT, then only the specified portion of every pixel in the subregion of pixels
+        // of the DEPTH_STENCIL buffer may be invalidated, and the other portion must be preserved.
+        discardDepth = (foundDepth &amp;&amp; foundStencil) || (foundDepth &amp;&amp; (mData.getStencilAttachment() == nullptr));
+        discardStencil = (foundStencil &amp;&amp; (mData.getDepthAttachment() == nullptr));
+    }
</ins><span class="cx"> 
</span><del>-    gl::Buffer *packBuffer = pack.pixelBuffer.get();
-    if (packBuffer != nullptr)
</del><ins>+    if (discardDepth &amp;&amp; mData.getDepthAttachment())
</ins><span class="cx">     {
</span><del>-        Buffer11 *packBufferStorage = GetImplAs&lt;Buffer11&gt;(packBuffer);
-        PackPixelsParams packParams(area, format, type, outputPitch, pack, reinterpret_cast&lt;ptrdiff_t&gt;(pixels));
</del><ins>+        RenderTarget11 *renderTarget = nullptr;
+        ID3D11View *depthView = nullptr;
+        gl::Error error(GL_NO_ERROR);
</ins><span class="cx"> 
</span><del>-        error = packBufferStorage-&gt;packPixels(colorBufferTexture, subresourceIndex, packParams);
</del><ins>+        error = mData.getDepthAttachment()-&gt;getRenderTarget(&amp;renderTarget);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><del>-            SafeRelease(colorBufferTexture);
</del><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        packBuffer-&gt;getIndexRangeCache()-&gt;clear();
</del><ins>+        depthView = renderTarget-&gt;getDepthStencilView();
+
+        if (depthView != nullptr)
+        {
+            deviceContext1-&gt;DiscardView(depthView);
+        }
</ins><span class="cx">     }
</span><del>-    else
</del><ins>+
+    if (discardStencil &amp;&amp; mData.getStencilAttachment())
</ins><span class="cx">     {
</span><del>-        error = mRenderer-&gt;readTextureData(colorBufferTexture, subresourceIndex, area, format, type, outputPitch, pack, pixels);
</del><ins>+        RenderTarget11 *renderTarget = nullptr;
+        ID3D11View *stencilView = nullptr;
+        gl::Error error(GL_NO_ERROR);
+
+        error = mData.getStencilAttachment()-&gt;getRenderTarget(&amp;renderTarget);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><del>-            SafeRelease(colorBufferTexture);
</del><span class="cx">             return error;
</span><span class="cx">         }
</span><ins>+
+        stencilView = renderTarget-&gt;getDepthStencilView();
+
+        if (stencilView != nullptr)
+        {
+            deviceContext1-&gt;DiscardView(stencilView);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    SafeRelease(colorBufferTexture);
</del><ins>+    return gl::Error(GL_NO_ERROR);
+}
</ins><span class="cx"> 
</span><ins>+gl::Error Framebuffer11::invalidateSub(size_t, const GLenum *, const gl::Rectangle &amp;)
+{
+    // A no-op implementation conforms to the spec, so don't call UNIMPLEMENTED()
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+gl::Error Framebuffer11::readPixelsImpl(const gl::Rectangle &amp;area,
+                                        GLenum format,
+                                        GLenum type,
+                                        size_t outputPitch,
+                                        const gl::PixelPackState &amp;pack,
+                                        uint8_t *pixels) const
+{
+    const gl::FramebufferAttachment *readAttachment = mData.getReadAttachment();
+    ASSERT(readAttachment);
+
+    gl::Buffer *packBuffer = pack.pixelBuffer.get();
+    if (packBuffer != nullptr)
+    {
+        if (pack.rowLength != 0 || pack.skipRows != 0 || pack.skipPixels != 0)
+        {
+            UNIMPLEMENTED();
+            return gl::Error(GL_INVALID_OPERATION,
+                             &quot;Unimplemented pixel store parameters in readPixelsImpl&quot;);
+        }
+
+        Buffer11 *packBufferStorage = GetImplAs&lt;Buffer11&gt;(packBuffer);
+        PackPixelsParams packParams(area, format, type, static_cast&lt;GLuint&gt;(outputPitch), pack,
+                                    reinterpret_cast&lt;ptrdiff_t&gt;(pixels));
+
+        return packBufferStorage-&gt;packPixels(*readAttachment, packParams);
+    }
+
+    return mRenderer-&gt;readFromAttachment(*readAttachment, area, format, type,
+                                         static_cast&lt;GLuint&gt;(outputPitch), pack, pixels);
+}
+
</ins><span class="cx"> gl::Error Framebuffer11::blit(const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea, const gl::Rectangle *scissor,
</span><span class="cx">                               bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter,
</span><span class="cx">                               const gl::Framebuffer *sourceFramebuffer)
</span><span class="lines">@@ -214,8 +402,27 @@
</span><span class="cx">                 }
</span><span class="cx">                 ASSERT(drawRenderTarget);
</span><span class="cx"> 
</span><del>-                error = mRenderer-&gt;blitRenderbufferRect(sourceArea, destArea, readRenderTarget, drawRenderTarget,
-                                                        filter, scissor, blitRenderTarget, false, false);
</del><ins>+                const bool invertColorSource   = UsePresentPathFast(mRenderer, readBuffer);
+                gl::Rectangle actualSourceArea = sourceArea;
+                if (invertColorSource)
+                {
+                    RenderTarget11 *readRenderTarget11 = GetAs&lt;RenderTarget11&gt;(readRenderTarget);
+                    actualSourceArea.y                 = readRenderTarget11-&gt;getHeight() - sourceArea.y;
+                    actualSourceArea.height            = -sourceArea.height;
+                }
+
+                const bool invertColorDest   = UsePresentPathFast(mRenderer, &amp;drawBuffer);
+                gl::Rectangle actualDestArea = destArea;
+                if (invertColorDest)
+                {
+                    RenderTarget11 *drawRenderTarget11 = GetAs&lt;RenderTarget11&gt;(drawRenderTarget);
+                    actualDestArea.y                   = drawRenderTarget11-&gt;getHeight() - destArea.y;
+                    actualDestArea.height              = -destArea.height;
+                }
+
+                error = mRenderer-&gt;blitRenderbufferRect(actualSourceArea, actualDestArea,
+                                                        readRenderTarget, drawRenderTarget, filter,
+                                                        scissor, blitRenderTarget, false, false);
</ins><span class="cx">                 if (error.isError())
</span><span class="cx">                 {
</span><span class="cx">                     return error;
</span><span class="lines">@@ -268,8 +475,80 @@
</span><span class="cx"> GLenum Framebuffer11::getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const
</span><span class="cx"> {
</span><span class="cx">     RenderTarget11 *renderTarget11 = GetAs&lt;RenderTarget11&gt;(renderTarget);
</span><del>-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(renderTarget11-&gt;getDXGIFormat());
-    return dxgiFormatInfo.internalFormat;
</del><ins>+    return d3d11::GetANGLEFormatSet(renderTarget11-&gt;getANGLEFormat()).glInternalFormat;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Framebuffer11::updateColorRenderTarget(size_t colorIndex)
+{
+    UpdateCachedRenderTarget(mData.getColorAttachment(colorIndex),
+                             mCachedColorRenderTargets[colorIndex],
+                             mColorRenderTargetsDirty[colorIndex]);
</ins><span class="cx"> }
</span><ins>+
+void Framebuffer11::updateDepthStencilRenderTarget()
+{
+    UpdateCachedRenderTarget(mData.getDepthOrStencilAttachment(), mCachedDepthStencilRenderTarget,
+                             mDepthStencilRenderTargetDirty);
+}
+
+void Framebuffer11::syncState(const gl::Framebuffer::DirtyBits &amp;dirtyBits)
+{
+    mRenderer-&gt;getStateManager()-&gt;invalidateRenderTarget();
+
+    const auto &amp;mergedDirtyBits = dirtyBits | mInternalDirtyBits;
+    mInternalDirtyBits.reset();
+
+    for (auto dirtyBit : angle::IterateBitSet(mergedDirtyBits))
+    {
+        switch (dirtyBit)
+        {
+            case gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT:
+            case gl::Framebuffer::DIRTY_BIT_STENCIL_ATTACHMENT:
+                updateDepthStencilRenderTarget();
+                break;
+            case gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS:
+            case gl::Framebuffer::DIRTY_BIT_READ_BUFFER:
+                break;
+            default:
+            {
+                ASSERT(gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 == 0 &amp;&amp;
+                       dirtyBit &lt; gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX);
+                size_t colorIndex =
+                    static_cast&lt;size_t&gt;(dirtyBit - gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0);
+                updateColorRenderTarget(colorIndex);
+                break;
+            }
+        }
+    }
+
+    // We should not have dirtied any additional state during our sync.
+    ASSERT(!mInternalDirtyBits.any());
+
+    FramebufferD3D::syncState(dirtyBits);
+}
+
+void Framebuffer11::markColorRenderTargetDirty(size_t colorIndex)
+{
+    mInternalDirtyBits.set(gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 + colorIndex);
+    mCachedColorRenderTargets[colorIndex] = nullptr;
+}
+
+void Framebuffer11::markDepthStencilRenderTargetDirty()
+{
+    // Stencil is redundant in this case.
+    mInternalDirtyBits.set(gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT);
+    mCachedDepthStencilRenderTarget = nullptr;
+}
+
+bool Framebuffer11::hasAnyInternalDirtyBit() const
+{
+    return mInternalDirtyBits.any();
+}
+
+void Framebuffer11::syncInternalState() const
+{
+    // TODO(jmadill): Clean up this hack.
+    const_cast&lt;Framebuffer11 *&gt;(this)-&gt;syncState(gl::Framebuffer::DirtyBits());
+}
+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Framebuffer11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,6 +10,7 @@
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_D3D11_FRAMBUFFER11_H_
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/FramebufferD3D.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -21,23 +22,60 @@
</span><span class="cx">     Framebuffer11(const gl::Framebuffer::Data &amp;data, Renderer11 *renderer);
</span><span class="cx">     virtual ~Framebuffer11();
</span><span class="cx"> 
</span><ins>+    gl::Error discard(size_t count, const GLenum *attachments) override;
+    gl::Error invalidate(size_t count, const GLenum *attachments) override;
+    gl::Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &amp;area) override;
+
</ins><span class="cx">     // Invalidate the cached swizzles of all bound texture attachments.
</span><span class="cx">     gl::Error invalidateSwizzles() const;
</span><span class="cx"> 
</span><ins>+    void syncState(const gl::Framebuffer::DirtyBits &amp;dirtyBits) override;
+
+    const RenderTargetArray &amp;getCachedColorRenderTargets() const
+    {
+        return mCachedColorRenderTargets;
+    }
+    const RenderTarget11 *getCachedDepthStencilRenderTarget() const
+    {
+        return mCachedDepthStencilRenderTarget;
+    }
+
+    void markColorRenderTargetDirty(size_t colorIndex);
+    void markDepthStencilRenderTargetDirty();
+
+    bool hasAnyInternalDirtyBit() const;
+    // TODO(jmadill): make this non-const
+    void syncInternalState() const;
+
</ins><span class="cx">   private:
</span><del>-    gl::Error clear(const gl::State &amp;state, const ClearParameters &amp;clearParams) override;
</del><ins>+    gl::Error clear(const gl::Data &amp;data, const ClearParameters &amp;clearParams) override;
</ins><span class="cx"> 
</span><del>-    gl::Error readPixels(const gl::Rectangle &amp;area, GLenum format, GLenum type, size_t outputPitch,
-                         const gl::PixelPackState &amp;pack, uint8_t *pixels) const override;
</del><ins>+    gl::Error readPixelsImpl(const gl::Rectangle &amp;area,
+                             GLenum format,
+                             GLenum type,
+                             size_t outputPitch,
+                             const gl::PixelPackState &amp;pack,
+                             uint8_t *pixels) const override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error blit(const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea, const gl::Rectangle *scissor,
</span><span class="cx">                    bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter,
</span><span class="cx">                    const gl::Framebuffer *sourceFramebuffer) override;
</span><span class="cx"> 
</span><ins>+    gl::Error invalidateBase(size_t count, const GLenum *attachments, bool useEXTBehavior) const;
</ins><span class="cx"> 
</span><span class="cx">     GLenum getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const override;
</span><span class="cx"> 
</span><ins>+    void updateColorRenderTarget(size_t colorIndex);
+    void updateDepthStencilRenderTarget();
+
</ins><span class="cx">     Renderer11 *const mRenderer;
</span><ins>+    RenderTargetArray mCachedColorRenderTargets;
+    RenderTarget11 *mCachedDepthStencilRenderTarget;
+
+    std::vector&lt;NotificationCallback&gt; mColorRenderTargetsDirty;
+    NotificationCallback mDepthStencilRenderTargetDirty;
+
+    gl::Framebuffer::DirtyBits mInternalDirtyBits;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Image11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Image11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Image11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Image11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,18 +7,19 @@
</span><span class="cx"> // Image11.h: Implements the rx::Image11 class, which acts as the interface to
</span><span class="cx"> // the actual underlying resources of a Texture
</span><span class="cx"> 
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Image11.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/RenderTarget11.h&quot;
-#include &quot;libANGLE/renderer/d3d/d3d11/TextureStorage11.h&quot;
-#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
-#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</del><ins>+
+#include &quot;common/utilities.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><del>-#include &quot;libANGLE/formatutils.h&quot;
</del><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/RenderTarget11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/TextureStorage11.h&quot;
</ins><span class="cx"> 
</span><del>-#include &quot;common/utilities.h&quot;
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -32,9 +33,6 @@
</span><span class="cx">       mAssociatedImageIndex(gl::ImageIndex::MakeInvalid()),
</span><span class="cx">       mRecoveredFromStorageCount(0)
</span><span class="cx"> {
</span><del>-    // mRenderer should remain unchanged during the lifetime of the Image11 object.
-    // This lets us safely use mRenderer (and its Feature Level) in Image11's methods.
-    mFeatureLevel = renderer-&gt;getFeatureLevel();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Image11::~Image11()
</span><span class="lines">@@ -43,15 +41,14 @@
</span><span class="cx">     releaseStagingTexture();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Image11::generateMipmap(Image11 *dest, Image11 *src)
</del><ins>+gl::Error Image11::generateMipmap(Image11 *dest,
+                                  Image11 *src,
+                                  const Renderer11DeviceCaps &amp;rendererCaps)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(src-&gt;getDXGIFormat() == dest-&gt;getDXGIFormat());
</span><span class="cx">     ASSERT(src-&gt;getWidth() == 1 || src-&gt;getWidth() / 2 == dest-&gt;getWidth());
</span><span class="cx">     ASSERT(src-&gt;getHeight() == 1 || src-&gt;getHeight() / 2 == dest-&gt;getHeight());
</span><span class="cx"> 
</span><del>-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(src-&gt;getDXGIFormat());
-    ASSERT(dxgiFormatInfo.mipGenerationFunction != NULL);
-
</del><span class="cx">     D3D11_MAPPED_SUBRESOURCE destMapped;
</span><span class="cx">     gl::Error error = dest-&gt;map(D3D11_MAP_WRITE, &amp;destMapped);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -70,9 +67,11 @@
</span><span class="cx">     const uint8_t *sourceData = reinterpret_cast&lt;const uint8_t*&gt;(srcMapped.pData);
</span><span class="cx">     uint8_t *destData = reinterpret_cast&lt;uint8_t*&gt;(destMapped.pData);
</span><span class="cx"> 
</span><del>-    dxgiFormatInfo.mipGenerationFunction(src-&gt;getWidth(), src-&gt;getHeight(), src-&gt;getDepth(),
-                                         sourceData, srcMapped.RowPitch, srcMapped.DepthPitch,
-                                         destData, destMapped.RowPitch, destMapped.DepthPitch);
</del><ins>+    auto mipGenerationFunction = d3d11::GetTextureFormatInfo(src-&gt;getInternalFormat(), rendererCaps)
+                                     .formatSet-&gt;mipGenerationFunction;
+    mipGenerationFunction(src-&gt;getWidth(), src-&gt;getHeight(), src-&gt;getDepth(), sourceData,
+                          srcMapped.RowPitch, srcMapped.DepthPitch, destData, destMapped.RowPitch,
+                          destMapped.DepthPitch);
</ins><span class="cx"> 
</span><span class="cx">     dest-&gt;unmap();
</span><span class="cx">     src-&gt;unmap();
</span><span class="lines">@@ -88,9 +87,14 @@
</span><span class="cx">     // AND mStagingTexture doesn't exist AND mStagingTexture doesn't need to be recovered from TextureStorage
</span><span class="cx">     // AND the texture doesn't require init data (i.e. a blank new texture will suffice)
</span><span class="cx">     // then isDirty should still return false.
</span><del>-    if (mDirty &amp;&amp; !mStagingTexture &amp;&amp; !mRecoverFromStorage &amp;&amp; !(d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel).dataInitializerFunction != NULL))
</del><ins>+    if (mDirty &amp;&amp; !mStagingTexture &amp;&amp; !mRecoverFromStorage)
</ins><span class="cx">     {
</span><del>-        return false;
</del><ins>+        const Renderer11DeviceCaps &amp;deviceCaps = mRenderer-&gt;getRenderer11DeviceCaps();
+        const auto &amp;formatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, deviceCaps);
+        if (formatInfo.dataInitializerFunction == nullptr)
+        {
+            return false;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return mDirty;
</span><span class="lines">@@ -216,9 +220,10 @@
</span><span class="cx">         mTarget = target;
</span><span class="cx"> 
</span><span class="cx">         // compute the d3d format that will be used
</span><del>-        const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(internalformat, mFeatureLevel);
-        mDXGIFormat = formatInfo.texFormat;
-        mRenderable = (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN);
</del><ins>+        const d3d11::TextureFormat &amp;formatInfo =
+            d3d11::GetTextureFormatInfo(internalformat, mRenderer-&gt;getRenderer11DeviceCaps());
+        mDXGIFormat = formatInfo.formatSet-&gt;texFormat;
+        mRenderable = (formatInfo.formatSet-&gt;rtvFormat != DXGI_FORMAT_UNKNOWN);
</ins><span class="cx"> 
</span><span class="cx">         releaseStagingTexture();
</span><span class="cx">         mDirty = (formatInfo.dataInitializerFunction != NULL);
</span><span class="lines">@@ -244,13 +249,16 @@
</span><span class="cx"> {
</span><span class="cx">     const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(mInternalFormat);
</span><span class="cx">     GLsizei inputRowPitch = formatInfo.computeRowPitch(type, area.width, unpack.alignment, unpack.rowLength);
</span><del>-    GLsizei inputDepthPitch = formatInfo.computeDepthPitch(type, area.width, area.height, unpack.alignment, unpack.rowLength);
</del><ins>+    GLsizei inputDepthPitch = formatInfo.computeDepthPitch(
+        type, area.width, area.height, unpack.alignment, unpack.rowLength, unpack.imageHeight);
+    GLsizei inputSkipBytes = formatInfo.computeSkipPixels(
+        inputRowPitch, inputDepthPitch, unpack.skipImages, unpack.skipRows, unpack.skipPixels);
</ins><span class="cx"> 
</span><del>-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mDXGIFormat);
</del><ins>+    const d3d11::DXGIFormatSize &amp;dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(mDXGIFormat);
</ins><span class="cx">     GLuint outputPixelSize = dxgiFormatInfo.pixelBytes;
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel);
-    LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(type);
</del><ins>+    const d3d11::TextureFormat &amp;d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, mRenderer-&gt;getRenderer11DeviceCaps());
+    LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(type).loadFunction;
</ins><span class="cx"> 
</span><span class="cx">     D3D11_MAPPED_SUBRESOURCE mappedImage;
</span><span class="cx">     gl::Error error = map(D3D11_MAP_WRITE, &amp;mappedImage);
</span><span class="lines">@@ -261,8 +269,8 @@
</span><span class="cx"> 
</span><span class="cx">     uint8_t *offsetMappedData = (reinterpret_cast&lt;uint8_t*&gt;(mappedImage.pData) + (area.y * mappedImage.RowPitch + area.x * outputPixelSize + area.z * mappedImage.DepthPitch));
</span><span class="cx">     loadFunction(area.width, area.height, area.depth,
</span><del>-                 reinterpret_cast&lt;const uint8_t*&gt;(input), inputRowPitch, inputDepthPitch,
-                 offsetMappedData, mappedImage.RowPitch, mappedImage.DepthPitch);
</del><ins>+                 reinterpret_cast&lt;const uint8_t *&gt;(input) + inputSkipBytes, inputRowPitch,
+                 inputDepthPitch, offsetMappedData, mappedImage.RowPitch, mappedImage.DepthPitch);
</ins><span class="cx"> 
</span><span class="cx">     unmap();
</span><span class="cx"> 
</span><span class="lines">@@ -273,9 +281,10 @@
</span><span class="cx"> {
</span><span class="cx">     const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(mInternalFormat);
</span><span class="cx">     GLsizei inputRowPitch = formatInfo.computeRowPitch(GL_UNSIGNED_BYTE, area.width, 1, 0);
</span><del>-    GLsizei inputDepthPitch = formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, area.width, area.height, 1, 0);
</del><ins>+    GLsizei inputDepthPitch =
+        formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, area.width, area.height, 1, 0, 0);
</ins><span class="cx"> 
</span><del>-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mDXGIFormat);
</del><ins>+    const d3d11::DXGIFormatSize &amp;dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(mDXGIFormat);
</ins><span class="cx">     GLuint outputPixelSize = dxgiFormatInfo.pixelBytes;
</span><span class="cx">     GLuint outputBlockWidth = dxgiFormatInfo.blockWidth;
</span><span class="cx">     GLuint outputBlockHeight = dxgiFormatInfo.blockHeight;
</span><span class="lines">@@ -283,8 +292,8 @@
</span><span class="cx">     ASSERT(area.x % outputBlockWidth == 0);
</span><span class="cx">     ASSERT(area.y % outputBlockHeight == 0);
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel);
-    LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(GL_UNSIGNED_BYTE);
</del><ins>+    const d3d11::TextureFormat &amp;d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, mRenderer-&gt;getRenderer11DeviceCaps());
+    LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(GL_UNSIGNED_BYTE).loadFunction;
</ins><span class="cx"> 
</span><span class="cx">     D3D11_MAPPED_SUBRESOURCE mappedImage;
</span><span class="cx">     gl::Error error = map(D3D11_MAP_WRITE, &amp;mappedImage);
</span><span class="lines">@@ -306,180 +315,161 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Image11::copy(const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea, RenderTargetD3D *source)
</del><ins>+gl::Error Image11::copyFromTexStorage(const gl::ImageIndex &amp;imageIndex, TextureStorage *source)
</ins><span class="cx"> {
</span><del>-    RenderTarget11 *sourceRenderTarget = GetAs&lt;RenderTarget11&gt;(source);
-    ASSERT(sourceRenderTarget-&gt;getTexture());
</del><ins>+    TextureStorage11 *storage11 = GetAs&lt;TextureStorage11&gt;(source);
</ins><span class="cx"> 
</span><del>-    ID3D11Resource *resource = sourceRenderTarget-&gt;getTexture();
-    UINT subresourceIndex = sourceRenderTarget-&gt;getSubresourceIndex();
-
-    gl::Box sourceBox(sourceArea.x, sourceArea.y, 0, sourceArea.width, sourceArea.height, 1);
-    gl::Error error = copy(destOffset, sourceBox, resource, subresourceIndex);
-
-    SafeRelease(resource);
-
-    return error;
-}
-
-gl::Error Image11::copy(const gl::Offset &amp;destOffset, const gl::Box &amp;sourceArea, const gl::ImageIndex &amp;sourceIndex, TextureStorage *source)
-{
-    TextureStorage11 *sourceStorage11 = GetAs&lt;TextureStorage11&gt;(source);
-
-    UINT subresourceIndex = sourceStorage11-&gt;getSubresourceIndex(sourceIndex);
-    ID3D11Resource *resource = NULL;
-    gl::Error error = sourceStorage11-&gt;getResource(&amp;resource);
</del><ins>+    ID3D11Resource *resource = nullptr;
+    gl::Error error = storage11-&gt;getResource(&amp;resource);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    error = copy(destOffset, sourceArea, resource, subresourceIndex);
</del><ins>+    UINT subresourceIndex         = storage11-&gt;getSubresourceIndex(imageIndex);
+    TextureHelper11 textureHelper =
+        TextureHelper11::MakeAndReference(resource, storage11-&gt;getANGLEFormat());
</ins><span class="cx"> 
</span><del>-    SafeRelease(resource);
-
-    return error;
</del><ins>+    gl::Box sourceBox(0, 0, 0, mWidth, mHeight, mDepth);
+    return copyWithoutConversion(gl::Offset(), sourceBox, textureHelper, subresourceIndex);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Image11::copy(const gl::Offset &amp;destOffset, const gl::Box &amp;sourceArea, ID3D11Resource *source, UINT sourceSubResource)
</del><ins>+gl::Error Image11::copyFromFramebuffer(const gl::Offset &amp;destOffset,
+                                       const gl::Rectangle &amp;sourceArea,
+                                       const gl::Framebuffer *sourceFBO)
</ins><span class="cx"> {
</span><del>-    D3D11_RESOURCE_DIMENSION dim;
-    source-&gt;GetType(&amp;dim);
</del><ins>+    const gl::FramebufferAttachment *srcAttachment = sourceFBO-&gt;getReadColorbuffer();
+    ASSERT(srcAttachment);
</ins><span class="cx"> 
</span><del>-    DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN;
-    gl::Extents extents;
-    UINT sampleCount = 0;
</del><ins>+    const auto &amp;d3d11Format = d3d11::GetTextureFormatInfo(srcAttachment-&gt;getInternalFormat(),
+                                                          mRenderer-&gt;getRenderer11DeviceCaps());
</ins><span class="cx"> 
</span><del>-    ID3D11Texture2D *source2D = NULL;
-
-    if (dim == D3D11_RESOURCE_DIMENSION_TEXTURE2D)
</del><ins>+    if (d3d11Format.formatSet-&gt;texFormat == mDXGIFormat)
</ins><span class="cx">     {
</span><del>-        D3D11_TEXTURE2D_DESC textureDesc2D;
-        source2D = d3d11::DynamicCastComObject&lt;ID3D11Texture2D&gt;(source);
-        ASSERT(source2D);
-        source2D-&gt;GetDesc(&amp;textureDesc2D);
</del><ins>+        RenderTargetD3D *renderTarget = nullptr;
+        gl::Error error = srcAttachment-&gt;getRenderTarget(&amp;renderTarget);
+        if (error.isError())
+        {
+            return error;
+        }
</ins><span class="cx"> 
</span><del>-        format = textureDesc2D.Format;
-        extents = gl::Extents(textureDesc2D.Width, textureDesc2D.Height, 1);
-        sampleCount = textureDesc2D.SampleDesc.Count;
-    }
-    else if (dim == D3D11_RESOURCE_DIMENSION_TEXTURE3D)
-    {
-        D3D11_TEXTURE3D_DESC textureDesc3D;
-        ID3D11Texture3D *source3D = d3d11::DynamicCastComObject&lt;ID3D11Texture3D&gt;(source);
-        ASSERT(source3D);
-        source3D-&gt;GetDesc(&amp;textureDesc3D);
</del><ins>+        RenderTarget11 *rt11 = GetAs&lt;RenderTarget11&gt;(renderTarget);
+        ASSERT(rt11-&gt;getTexture());
</ins><span class="cx"> 
</span><del>-        format = textureDesc3D.Format;
-        extents = gl::Extents(textureDesc3D.Width, textureDesc3D.Height, textureDesc3D.Depth);
-        sampleCount = 1;
</del><ins>+        TextureHelper11 textureHelper =
+            TextureHelper11::MakeAndReference(rt11-&gt;getTexture(), rt11-&gt;getANGLEFormat());
+        unsigned int sourceSubResource = rt11-&gt;getSubresourceIndex();
+
+        gl::Box sourceBox(sourceArea.x, sourceArea.y, 0, sourceArea.width, sourceArea.height, 1);
+        return copyWithoutConversion(destOffset, sourceBox, textureHelper, sourceSubResource);
</ins><span class="cx">     }
</span><del>-    else
</del><ins>+
+    // This format requires conversion, so we must copy the texture to staging and manually convert
+    // via readPixels
+    D3D11_MAPPED_SUBRESOURCE mappedImage;
+    gl::Error error = map(D3D11_MAP_WRITE, &amp;mappedImage);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        UNREACHABLE();
</del><ins>+        return error;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (format == mDXGIFormat)
-    {
-        // No conversion needed-- use copyback fastpath
-        ID3D11Resource *stagingTexture = NULL;
-        unsigned int stagingSubresourceIndex = 0;
-        gl::Error error = getStagingTexture(&amp;stagingTexture, &amp;stagingSubresourceIndex);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+    // determine the offset coordinate into the destination buffer
+    const auto &amp;dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(mDXGIFormat);
+    GLsizei rowOffset          = dxgiFormatInfo.pixelBytes * destOffset.x;
</ins><span class="cx"> 
</span><del>-        ID3D11Device *device = mRenderer-&gt;getDevice();
-        ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
</del><ins>+    uint8_t *dataOffset = static_cast&lt;uint8_t *&gt;(mappedImage.pData) +
+                          mappedImage.RowPitch * destOffset.y + rowOffset +
+                          destOffset.z * mappedImage.DepthPitch;
</ins><span class="cx"> 
</span><del>-        UINT subresourceAfterResolve = sourceSubResource;
</del><ins>+    const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(mInternalFormat);
</ins><span class="cx"> 
</span><del>-        ID3D11Resource *srcTex = NULL;
</del><ins>+    error = mRenderer-&gt;readFromAttachment(*srcAttachment, sourceArea, formatInfo.format,
+                                          formatInfo.type, mappedImage.RowPitch,
+                                          gl::PixelPackState(), dataOffset);
</ins><span class="cx"> 
</span><del>-        bool needResolve = (dim == D3D11_RESOURCE_DIMENSION_TEXTURE2D &amp;&amp; sampleCount &gt; 1);
</del><ins>+    unmap();
+    mDirty = true;
</ins><span class="cx"> 
</span><del>-        if (needResolve)
-        {
-            D3D11_TEXTURE2D_DESC resolveDesc;
-            resolveDesc.Width = extents.width;
-            resolveDesc.Height = extents.height;
-            resolveDesc.MipLevels = 1;
-            resolveDesc.ArraySize = 1;
-            resolveDesc.Format = format;
-            resolveDesc.SampleDesc.Count = 1;
-            resolveDesc.SampleDesc.Quality = 0;
-            resolveDesc.Usage = D3D11_USAGE_DEFAULT;
-            resolveDesc.BindFlags = 0;
-            resolveDesc.CPUAccessFlags = 0;
-            resolveDesc.MiscFlags = 0;
</del><ins>+    return error;
+}
</ins><span class="cx"> 
</span><del>-            ID3D11Texture2D *srcTex2D = NULL;
-            HRESULT result = device-&gt;CreateTexture2D(&amp;resolveDesc, NULL, &amp;srcTex2D);
-            if (FAILED(result))
-            {
-                return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create resolve texture for Image11::copy, HRESULT: 0x%X.&quot;, result);
-            }
-            srcTex = srcTex2D;
</del><ins>+gl::Error Image11::copyWithoutConversion(const gl::Offset &amp;destOffset,
+                                         const gl::Box &amp;sourceArea,
+                                         const TextureHelper11 &amp;textureHelper,
+                                         UINT sourceSubResource)
+{
+    // No conversion needed-- use copyback fastpath
+    ID3D11Resource *stagingTexture       = nullptr;
+    unsigned int stagingSubresourceIndex = 0;
+    gl::Error error = getStagingTexture(&amp;stagingTexture, &amp;stagingSubresourceIndex);
+    if (error.isError())
+    {
+        return error;
+    }
</ins><span class="cx"> 
</span><del>-            deviceContext-&gt;ResolveSubresource(srcTex, 0, source, sourceSubResource, format);
-            subresourceAfterResolve = 0;
-        }
-        else
-        {
-            srcTex = source;
-        }
</del><ins>+    ID3D11Device *device               = mRenderer-&gt;getDevice();
+    ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
</ins><span class="cx"> 
</span><del>-        D3D11_BOX srcBox;
-        srcBox.left = sourceArea.x;
-        srcBox.right = sourceArea.x + sourceArea.width;
-        srcBox.top = sourceArea.y;
-        srcBox.bottom = sourceArea.y + sourceArea.height;
-        srcBox.front = sourceArea.z;
-        srcBox.back = sourceArea.z + sourceArea.depth;
</del><ins>+    UINT subresourceAfterResolve = sourceSubResource;
</ins><span class="cx"> 
</span><del>-        deviceContext-&gt;CopySubresourceRegion(stagingTexture, stagingSubresourceIndex, destOffset.x, destOffset.y,
-                                             destOffset.z, srcTex, subresourceAfterResolve, &amp;srcBox);
</del><ins>+    ID3D11Resource *srcTex     = nullptr;
+    const gl::Extents &amp;extents = textureHelper.getExtents();
</ins><span class="cx"> 
</span><del>-        if (needResolve)
</del><ins>+    bool needResolve =
+        (textureHelper.getTextureType() == GL_TEXTURE_2D &amp;&amp; textureHelper.getSampleCount() &gt; 1);
+
+    if (needResolve)
+    {
+        D3D11_TEXTURE2D_DESC resolveDesc;
+        resolveDesc.Width              = extents.width;
+        resolveDesc.Height             = extents.height;
+        resolveDesc.MipLevels          = 1;
+        resolveDesc.ArraySize          = 1;
+        resolveDesc.Format             = textureHelper.getFormat();
+        resolveDesc.SampleDesc.Count   = 1;
+        resolveDesc.SampleDesc.Quality = 0;
+        resolveDesc.Usage              = D3D11_USAGE_DEFAULT;
+        resolveDesc.BindFlags          = 0;
+        resolveDesc.CPUAccessFlags     = 0;
+        resolveDesc.MiscFlags          = 0;
+
+        ID3D11Texture2D *srcTex2D = NULL;
+        HRESULT result = device-&gt;CreateTexture2D(&amp;resolveDesc, NULL, &amp;srcTex2D);
+        if (FAILED(result))
</ins><span class="cx">         {
</span><del>-            SafeRelease(srcTex);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create resolve texture for Image11::copy, HRESULT: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><ins>+        srcTex = srcTex2D;
+
+        deviceContext-&gt;ResolveSubresource(srcTex, 0, textureHelper.getTexture2D(),
+                                          sourceSubResource, textureHelper.getFormat());
+        subresourceAfterResolve = 0;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        // This format requires conversion, so we must copy the texture to staging and manually convert via readPixels
-        D3D11_MAPPED_SUBRESOURCE mappedImage;
-        gl::Error error = map(D3D11_MAP_WRITE, &amp;mappedImage);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+        srcTex = textureHelper.getResource();
+    }
</ins><span class="cx"> 
</span><del>-        // determine the offset coordinate into the destination buffer
-        const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mDXGIFormat);
-        GLsizei rowOffset = dxgiFormatInfo.pixelBytes * destOffset.x;
-        uint8_t *dataOffset = static_cast&lt;uint8_t*&gt;(mappedImage.pData) + mappedImage.RowPitch * destOffset.y + rowOffset + destOffset.z * mappedImage.DepthPitch;
</del><ins>+    D3D11_BOX srcBox;
+    srcBox.left   = sourceArea.x;
+    srcBox.right  = sourceArea.x + sourceArea.width;
+    srcBox.top    = sourceArea.y;
+    srcBox.bottom = sourceArea.y + sourceArea.height;
+    srcBox.front  = sourceArea.z;
+    srcBox.back   = sourceArea.z + sourceArea.depth;
</ins><span class="cx"> 
</span><del>-        const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(mInternalFormat);
</del><ins>+    deviceContext-&gt;CopySubresourceRegion(stagingTexture, stagingSubresourceIndex, destOffset.x,
+                                         destOffset.y, destOffset.z, srcTex,
+                                         subresourceAfterResolve, &amp;srcBox);
</ins><span class="cx"> 
</span><del>-        // Currently in ANGLE, the source data may only need to be converted if the source is the current framebuffer
-        // and OpenGL ES framebuffers must be 2D textures therefore we should not need to convert 3D textures between different formats.
-        ASSERT(dim == D3D11_RESOURCE_DIMENSION_TEXTURE2D);
-        ASSERT(sourceArea.z == 0 &amp;&amp; sourceArea.depth == 1);
-        gl::Rectangle sourceRect(sourceArea.x, sourceArea.y, sourceArea.width, sourceArea.height);
-        error = mRenderer-&gt;readTextureData(source2D, sourceSubResource, sourceRect, formatInfo.format, formatInfo.type, mappedImage.RowPitch, gl::PixelPackState(), dataOffset);
-
-        unmap();
-
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+    if (needResolve)
+    {
+        SafeRelease(srcTex);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mDirty = true;
</span><del>-
</del><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -537,11 +527,11 @@
</span><span class="cx">         desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
</span><span class="cx">         desc.MiscFlags = 0;
</span><span class="cx"> 
</span><del>-        if (d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel).dataInitializerFunction != NULL)
</del><ins>+        if (d3d11::GetTextureFormatInfo(mInternalFormat, mRenderer-&gt;getRenderer11DeviceCaps()).dataInitializerFunction != NULL)
</ins><span class="cx">         {
</span><span class="cx">             std::vector&lt;D3D11_SUBRESOURCE_DATA&gt; initialData;
</span><del>-            std::vector&lt; std::vector&lt;BYTE&gt; &gt; textureData;
-            d3d11::GenerateInitialTextureData(mInternalFormat, mFeatureLevel, width, height, mDepth,
</del><ins>+            std::vector&lt;std::vector&lt;BYTE&gt;&gt; textureData;
+            d3d11::GenerateInitialTextureData(mInternalFormat, mRenderer-&gt;getRenderer11DeviceCaps(), width, height, mDepth,
</ins><span class="cx">                                               lodOffset + 1, &amp;initialData, &amp;textureData);
</span><span class="cx"> 
</span><span class="cx">             result = device-&gt;CreateTexture3D(&amp;desc, initialData.data(), &amp;newTexture);
</span><span class="lines">@@ -577,11 +567,11 @@
</span><span class="cx">         desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
</span><span class="cx">         desc.MiscFlags = 0;
</span><span class="cx"> 
</span><del>-        if (d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel).dataInitializerFunction != NULL)
</del><ins>+        if (d3d11::GetTextureFormatInfo(mInternalFormat, mRenderer-&gt;getRenderer11DeviceCaps()).dataInitializerFunction != NULL)
</ins><span class="cx">         {
</span><span class="cx">             std::vector&lt;D3D11_SUBRESOURCE_DATA&gt; initialData;
</span><del>-            std::vector&lt; std::vector&lt;BYTE&gt; &gt; textureData;
-            d3d11::GenerateInitialTextureData(mInternalFormat, mFeatureLevel, width, height, 1,
</del><ins>+            std::vector&lt;std::vector&lt;BYTE&gt;&gt; textureData;
+            d3d11::GenerateInitialTextureData(mInternalFormat, mRenderer-&gt;getRenderer11DeviceCaps(), width, height, 1,
</ins><span class="cx">                                               lodOffset + 1, &amp;initialData, &amp;textureData);
</span><span class="cx"> 
</span><span class="cx">             result = device-&gt;CreateTexture2D(&amp;desc, initialData.data(), &amp;newTexture);
</span><span class="lines">@@ -631,13 +621,13 @@
</span><span class="cx">     ASSERT(mStagingTexture);
</span><span class="cx">     HRESULT result = deviceContext-&gt;Map(stagingTexture, subresourceIndex, mapType, 0, map);
</span><span class="cx"> 
</span><del>-    // this can fail if the device is removed (from TDR)
-    if (d3d11::isDeviceLostError(result))
</del><ins>+    if (FAILED(result))
</ins><span class="cx">     {
</span><del>-        mRenderer-&gt;notifyDeviceLost();
-    }
-    else if (FAILED(result))
-    {
</del><ins>+        // this can fail if the device is removed (from TDR)
+        if (d3d11::isDeviceLostError(result))
+        {
+            mRenderer-&gt;notifyDeviceLost();
+        }
</ins><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to map staging texture, result: 0x%X.&quot;, result);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -655,4 +645,4 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Image11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Image11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Image11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Image11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -23,7 +23,9 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class Renderer11;
</span><ins>+class TextureHelper11;
</ins><span class="cx"> class TextureStorage11;
</span><ins>+struct Renderer11DeviceCaps;
</ins><span class="cx"> 
</span><span class="cx"> class Image11 : public ImageD3D
</span><span class="cx"> {
</span><span class="lines">@@ -31,7 +33,9 @@
</span><span class="cx">     Image11(Renderer11 *renderer);
</span><span class="cx">     virtual ~Image11();
</span><span class="cx"> 
</span><del>-    static gl::Error generateMipmap(Image11 *dest, Image11 *src);
</del><ins>+    static gl::Error generateMipmap(Image11 *dest,
+                                    Image11 *src,
+                                    const Renderer11DeviceCaps &amp;rendererCaps);
</ins><span class="cx"> 
</span><span class="cx">     virtual bool isDirty() const;
</span><span class="cx"> 
</span><span class="lines">@@ -44,9 +48,10 @@
</span><span class="cx">     virtual gl::Error loadData(const gl::Box &amp;area, const gl::PixelUnpackState &amp;unpack, GLenum type, const void *input);
</span><span class="cx">     virtual gl::Error loadCompressedData(const gl::Box &amp;area, const void *input);
</span><span class="cx"> 
</span><del>-    virtual gl::Error copy(const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea, RenderTargetD3D *source);
-    virtual gl::Error copy(const gl::Offset &amp;destOffset, const gl::Box &amp;sourceArea,
-                           const gl::ImageIndex &amp;sourceIndex, TextureStorage *source);
</del><ins>+    gl::Error copyFromTexStorage(const gl::ImageIndex &amp;imageIndex, TextureStorage *source) override;
+    gl::Error copyFromFramebuffer(const gl::Offset &amp;destOffset,
+                                  const gl::Rectangle &amp;sourceArea,
+                                  const gl::Framebuffer *source) override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error recoverFromAssociatedStorage();
</span><span class="cx">     bool isAssociatedStorageValid(TextureStorage11* textureStorage) const;
</span><span class="lines">@@ -57,15 +62,16 @@
</span><span class="cx">     void unmap();
</span><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    gl::Error copyToStorageImpl(TextureStorage11 *storage11, const gl::ImageIndex &amp;index, const gl::Box &amp;region);
-    gl::Error copy(const gl::Offset &amp;destOffset, const gl::Box &amp;sourceArea, ID3D11Resource *source, UINT sourceSubResource);
</del><ins>+    gl::Error copyWithoutConversion(const gl::Offset &amp;destOffset,
+                                    const gl::Box &amp;sourceArea,
+                                    const TextureHelper11 &amp;textureHelper,
+                                    UINT sourceSubResource);
</ins><span class="cx"> 
</span><span class="cx">     gl::Error getStagingTexture(ID3D11Resource **outStagingTexture, unsigned int *outSubresourceIndex);
</span><span class="cx">     gl::Error createStagingTexture();
</span><span class="cx">     void releaseStagingTexture();
</span><span class="cx"> 
</span><span class="cx">     Renderer11 *mRenderer;
</span><del>-    D3D_FEATURE_LEVEL mFeatureLevel;
</del><span class="cx"> 
</span><span class="cx">     DXGI_FORMAT mDXGIFormat;
</span><span class="cx">     ID3D11Resource *mStagingTexture;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11InputLayoutCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,53 +8,180 @@
</span><span class="cx"> // D3D11 input layouts.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/InputLayoutCache.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/VertexBuffer11.h&quot;
</del><ins>+
+#include &quot;common/BitSetIterator.h&quot;
+#include &quot;common/utilities.h&quot;
+#include &quot;libANGLE/Program.h&quot;
+#include &quot;libANGLE/VertexAttribute.h&quot;
+#include &quot;libANGLE/renderer/d3d/IndexDataManager.h&quot;
+#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/VertexDataManager.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Buffer11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/VertexBuffer11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/VertexDataManager.h&quot;
-#include &quot;libANGLE/Program.h&quot;
-#include &quot;libANGLE/VertexAttribute.h&quot;
-
</del><span class="cx"> #include &quot;third_party/murmurhash/MurmurHash3.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-static void GetInputLayout(const TranslatedAttribute translatedAttributes[gl::MAX_VERTEX_ATTRIBS],
-                           gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS])
</del><ins>+namespace
</ins><span class="cx"> {
</span><del>-    for (unsigned int attributeIndex = 0; attributeIndex &lt; gl::MAX_VERTEX_ATTRIBS; attributeIndex++)
</del><ins>+
+size_t GetReservedBufferCount(bool usesPointSpriteEmulation)
+{
+    return usesPointSpriteEmulation ? 1 : 0;
+}
+
+gl::InputLayout GetInputLayout(const std::vector&lt;const TranslatedAttribute *&gt; &amp;translatedAttributes)
+{
+    gl::InputLayout inputLayout(translatedAttributes.size(), gl::VERTEX_FORMAT_INVALID);
+
+    for (size_t attributeIndex = 0; attributeIndex &lt; translatedAttributes.size(); ++attributeIndex)
</ins><span class="cx">     {
</span><del>-        const TranslatedAttribute &amp;translatedAttribute = translatedAttributes[attributeIndex];
</del><ins>+        const TranslatedAttribute *translatedAttribute = translatedAttributes[attributeIndex];
+        inputLayout[attributeIndex] = gl::GetVertexFormatType(
+            *translatedAttribute-&gt;attribute, translatedAttribute-&gt;currentValueType);
+    }
+    return inputLayout;
+}
</ins><span class="cx"> 
</span><del>-        if (translatedAttributes[attributeIndex].active)
</del><ins>+GLenum GetGLSLAttributeType(const std::vector&lt;sh::Attribute&gt; &amp;shaderAttributes, int index)
+{
+    // Count matrices differently
+    for (const sh::Attribute &amp;attrib : shaderAttributes)
+    {
+        if (attrib.location == -1)
</ins><span class="cx">         {
</span><del>-            inputLayout[attributeIndex] = gl::VertexFormat(*translatedAttribute.attribute,
-                                                           translatedAttribute.currentValueType);
</del><ins>+            continue;
</ins><span class="cx">         }
</span><ins>+
+        GLenum transposedType = gl::TransposeMatrixType(attrib.type);
+        int rows              = gl::VariableRowCount(transposedType);
+
+        if (index &gt;= attrib.location &amp;&amp; index &lt; attrib.location + rows)
+        {
+            return transposedType;
+        }
</ins><span class="cx">     }
</span><ins>+
+    UNREACHABLE();
+    return GL_NONE;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const unsigned int InputLayoutCache::kMaxInputLayouts = 1024;
</del><ins>+const unsigned int kDefaultCacheSize = 1024;
</ins><span class="cx"> 
</span><del>-InputLayoutCache::InputLayoutCache() : mInputLayoutMap(kMaxInputLayouts, hashInputLayout, compareInputLayouts)
</del><ins>+struct PackedAttribute
</ins><span class="cx"> {
</span><del>-    mCounter = 0;
-    mDevice = NULL;
-    mDeviceContext = NULL;
-    mCurrentIL = NULL;
-    for (unsigned int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+    uint8_t attribType;
+    uint8_t semanticIndex;
+    uint8_t vertexFormatType;
+    uint8_t divisor;
+};
+
+Optional&lt;size_t&gt; FindFirstNonInstanced(
+    const std::vector&lt;const TranslatedAttribute *&gt; &amp;currentAttributes)
+{
+    for (size_t index = 0; index &lt; currentAttributes.size(); ++index)
</ins><span class="cx">     {
</span><del>-        mCurrentBuffers[i] = NULL;
-        mCurrentVertexStrides[i] = static_cast&lt;UINT&gt;(-1);
-        mCurrentVertexOffsets[i] = static_cast&lt;UINT&gt;(-1);
</del><ins>+        if (currentAttributes[index]-&gt;divisor == 0)
+        {
+            return Optional&lt;size_t&gt;(index);
+        }
</ins><span class="cx">     }
</span><del>-    mPointSpriteVertexBuffer = NULL;
-    mPointSpriteIndexBuffer = NULL;
</del><ins>+
+    return Optional&lt;size_t&gt;::Invalid();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void SortAttributesByLayout(const gl::Program *program,
+                            const std::vector&lt;TranslatedAttribute&gt; &amp;vertexArrayAttribs,
+                            const std::vector&lt;TranslatedAttribute&gt; &amp;currentValueAttribs,
+                            AttribIndexArray *sortedD3DSemanticsOut,
+                            std::vector&lt;const TranslatedAttribute *&gt; *sortedAttributesOut)
+{
+    sortedAttributesOut-&gt;clear();
+
+    const auto &amp;locationToSemantic =
+        GetImplAs&lt;ProgramD3D&gt;(program)-&gt;getAttribLocationToD3DSemantics();
+
+    for (auto locationIndex : angle::IterateBitSet(program-&gt;getActiveAttribLocationsMask()))
+    {
+        int d3dSemantic = locationToSemantic[locationIndex];
+        if (sortedAttributesOut-&gt;size() &lt;= static_cast&lt;size_t&gt;(d3dSemantic))
+        {
+            sortedAttributesOut-&gt;resize(d3dSemantic + 1);
+        }
+
+        (*sortedD3DSemanticsOut)[d3dSemantic] = d3dSemantic;
+
+        const auto *arrayAttrib = &amp;vertexArrayAttribs[locationIndex];
+        if (arrayAttrib-&gt;attribute &amp;&amp; arrayAttrib-&gt;attribute-&gt;enabled)
+        {
+            (*sortedAttributesOut)[d3dSemantic] = arrayAttrib;
+        }
+        else
+        {
+            ASSERT(currentValueAttribs[locationIndex].attribute);
+            (*sortedAttributesOut)[d3dSemantic] = &amp;currentValueAttribs[locationIndex];
+        }
+    }
+}
+
+} // anonymous namespace
+
+void InputLayoutCache::PackedAttributeLayout::addAttributeData(
+    GLenum glType,
+    UINT semanticIndex,
+    gl::VertexFormatType vertexFormatType,
+    unsigned int divisor)
+{
+    gl::AttributeType attribType = gl::GetAttributeType(glType);
+
+    PackedAttribute packedAttrib;
+    packedAttrib.attribType = static_cast&lt;uint8_t&gt;(attribType);
+    packedAttrib.semanticIndex = static_cast&lt;uint8_t&gt;(semanticIndex);
+    packedAttrib.vertexFormatType = static_cast&lt;uint8_t&gt;(vertexFormatType);
+    packedAttrib.divisor = static_cast&lt;uint8_t&gt;(divisor);
+
+    ASSERT(static_cast&lt;gl::AttributeType&gt;(packedAttrib.attribType) == attribType);
+    ASSERT(static_cast&lt;UINT&gt;(packedAttrib.semanticIndex) == semanticIndex);
+    ASSERT(static_cast&lt;gl::VertexFormatType&gt;(packedAttrib.vertexFormatType) == vertexFormatType);
+    ASSERT(static_cast&lt;unsigned int&gt;(packedAttrib.divisor) == divisor);
+
+    static_assert(sizeof(uint32_t) == sizeof(PackedAttribute), &quot;PackedAttributes must be 32-bits exactly.&quot;);
+
+    attributeData[numAttributes++] = gl::bitCast&lt;uint32_t&gt;(packedAttrib);
+}
+
+bool InputLayoutCache::PackedAttributeLayout::operator&lt;(const PackedAttributeLayout &amp;other) const
+{
+    if (numAttributes != other.numAttributes)
+    {
+        return numAttributes &lt; other.numAttributes;
+    }
+
+    if (flags != other.flags)
+    {
+        return flags &lt; other.flags;
+    }
+
+    return memcmp(attributeData, other.attributeData, sizeof(uint32_t) * numAttributes) &lt; 0;
+}
+
+InputLayoutCache::InputLayoutCache()
+    : mCurrentIL(nullptr),
+      mPointSpriteVertexBuffer(nullptr),
+      mPointSpriteIndexBuffer(nullptr),
+      mCacheSize(kDefaultCacheSize),
+      mDevice(nullptr),
+      mDeviceContext(nullptr)
+{
+    mCurrentBuffers.fill(nullptr);
+    mCurrentVertexStrides.fill(std::numeric_limits&lt;UINT&gt;::max());
+    mCurrentVertexOffsets.fill(std::numeric_limits&lt;UINT&gt;::max());
+    mCurrentAttributes.reserve(gl::MAX_VERTEX_ATTRIBS);
+}
+
</ins><span class="cx"> InputLayoutCache::~InputLayoutCache()
</span><span class="cx"> {
</span><span class="cx">     clear();
</span><span class="lines">@@ -70,11 +197,11 @@
</span><span class="cx"> 
</span><span class="cx"> void InputLayoutCache::clear()
</span><span class="cx"> {
</span><del>-    for (InputLayoutMap::iterator i = mInputLayoutMap.begin(); i != mInputLayoutMap.end(); i++)
</del><ins>+    for (auto &amp;layout : mLayoutMap)
</ins><span class="cx">     {
</span><del>-        SafeRelease(i-&gt;second.inputLayout);
</del><ins>+        SafeRelease(layout.second);
</ins><span class="cx">     }
</span><del>-    mInputLayoutMap.clear();
</del><ins>+    mLayoutMap.clear();
</ins><span class="cx">     SafeRelease(mPointSpriteVertexBuffer);
</span><span class="cx">     SafeRelease(mPointSpriteIndexBuffer);
</span><span class="cx">     markDirty();
</span><span class="lines">@@ -82,243 +209,133 @@
</span><span class="cx"> 
</span><span class="cx"> void InputLayoutCache::markDirty()
</span><span class="cx"> {
</span><del>-    mCurrentIL = NULL;
</del><ins>+    mCurrentIL = nullptr;
</ins><span class="cx">     for (unsigned int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</span><span class="cx">     {
</span><del>-        mCurrentBuffers[i] = NULL;
</del><ins>+        mCurrentBuffers[i]       = nullptr;
</ins><span class="cx">         mCurrentVertexStrides[i] = static_cast&lt;UINT&gt;(-1);
</span><span class="cx">         mCurrentVertexOffsets[i] = static_cast&lt;UINT&gt;(-1);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS],
-                                               GLenum mode, gl::Program *program)
</del><ins>+gl::Error InputLayoutCache::applyVertexBuffers(
+    const gl::State &amp;state,
+    const std::vector&lt;TranslatedAttribute&gt; &amp;vertexArrayAttribs,
+    const std::vector&lt;TranslatedAttribute&gt; &amp;currentValueAttribs,
+    GLenum mode,
+    GLint start,
+    TranslatedIndexData *indexInfo,
+    GLsizei numIndicesPerInstance)
</ins><span class="cx"> {
</span><ins>+    ASSERT(mDevice &amp;&amp; mDeviceContext);
+
+    gl::Program *program   = state.getProgram();
</ins><span class="cx">     ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(program);
</span><span class="cx"> 
</span><del>-    int sortedSemanticIndices[gl::MAX_VERTEX_ATTRIBS];
-    programD3D-&gt;sortAttributesByLayout(attributes, sortedSemanticIndices);
</del><span class="cx">     bool programUsesInstancedPointSprites = programD3D-&gt;usesPointSize() &amp;&amp; programD3D-&gt;usesInstancedPointSpriteEmulation();
</span><span class="cx">     bool instancedPointSpritesActive = programUsesInstancedPointSprites &amp;&amp; (mode == GL_POINTS);
</span><span class="cx"> 
</span><del>-    if (!mDevice || !mDeviceContext)
-    {
-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal input layout cache is not initialized.&quot;);
-    }
</del><ins>+    AttribIndexArray sortedSemanticIndices;
+    SortAttributesByLayout(program, vertexArrayAttribs, currentValueAttribs, &amp;sortedSemanticIndices,
+                           &amp;mCurrentAttributes);
</ins><span class="cx"> 
</span><del>-    InputLayoutKey ilKey = { 0 };
-
-    static const char* semanticName = &quot;TEXCOORD&quot;;
-
-    unsigned int firstIndexedElement = gl::MAX_VERTEX_ATTRIBS;
-    unsigned int firstInstancedElement = gl::MAX_VERTEX_ATTRIBS;
-    unsigned int nextAvailableInputSlot = 0;
-
-    for (unsigned int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+    // If we are using FL 9_3, make sure the first attribute is not instanced
+    if (mFeatureLevel &lt;= D3D_FEATURE_LEVEL_9_3 &amp;&amp; !mCurrentAttributes.empty())
</ins><span class="cx">     {
</span><del>-        if (attributes[i].active)
</del><ins>+        if (mCurrentAttributes[0]-&gt;divisor &gt; 0)
</ins><span class="cx">         {
</span><del>-            D3D11_INPUT_CLASSIFICATION inputClass = attributes[i].divisor &gt; 0 ? D3D11_INPUT_PER_INSTANCE_DATA : D3D11_INPUT_PER_VERTEX_DATA;
-            // If rendering points and instanced pointsprite emulation is being used, the inputClass is required to be configured as per instance data
-            inputClass = instancedPointSpritesActive ? D3D11_INPUT_PER_INSTANCE_DATA : inputClass;
-
-            gl::VertexFormat vertexFormat(*attributes[i].attribute, attributes[i].currentValueType);
-            const d3d11::VertexFormat &amp;vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormat, mFeatureLevel);
-
-            // Record the type of the associated vertex shader vector in our key
-            // This will prevent mismatched vertex shaders from using the same input layout
-            GLint attributeSize;
-            program-&gt;getActiveAttribute(ilKey.elementCount, 0, NULL, &amp;attributeSize, &amp;ilKey.elements[ilKey.elementCount].glslElementType, NULL);
-
-            ilKey.elements[ilKey.elementCount].desc.SemanticName = semanticName;
-            ilKey.elements[ilKey.elementCount].desc.SemanticIndex = sortedSemanticIndices[i];
-            ilKey.elements[ilKey.elementCount].desc.Format = vertexFormatInfo.nativeFormat;
-            ilKey.elements[ilKey.elementCount].desc.InputSlot = i;
-            ilKey.elements[ilKey.elementCount].desc.AlignedByteOffset = 0;
-            ilKey.elements[ilKey.elementCount].desc.InputSlotClass = inputClass;
-            ilKey.elements[ilKey.elementCount].desc.InstanceDataStepRate = instancedPointSpritesActive ? 1 : attributes[i].divisor;
-
-            if (inputClass == D3D11_INPUT_PER_VERTEX_DATA &amp;&amp; firstIndexedElement == gl::MAX_VERTEX_ATTRIBS)
</del><ins>+            Optional&lt;size_t&gt; firstNonInstancedIndex = FindFirstNonInstanced(mCurrentAttributes);
+            if (firstNonInstancedIndex.valid())
</ins><span class="cx">             {
</span><del>-                firstIndexedElement = ilKey.elementCount;
</del><ins>+                size_t index = firstNonInstancedIndex.value();
+                std::swap(mCurrentAttributes[0], mCurrentAttributes[index]);
+                std::swap(sortedSemanticIndices[0], sortedSemanticIndices[index]);
</ins><span class="cx">             }
</span><del>-            else if (inputClass == D3D11_INPUT_PER_INSTANCE_DATA &amp;&amp; firstInstancedElement == gl::MAX_VERTEX_ATTRIBS)
-            {
-                firstInstancedElement = ilKey.elementCount;
-            }
-
-            ilKey.elementCount++;
-            nextAvailableInputSlot = i + 1;
</del><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Instanced PointSprite emulation requires additional entries in the
-    // inputlayout to support the vertices that make up the pointsprite quad.
-    // We do this even if mode != GL_POINTS, since the shader signature has these inputs, and the input layout must match the shader
-    if (programUsesInstancedPointSprites)
-    {
-        ilKey.elements[ilKey.elementCount].desc.SemanticName = &quot;SPRITEPOSITION&quot;;
-        ilKey.elements[ilKey.elementCount].desc.SemanticIndex = 0;
-        ilKey.elements[ilKey.elementCount].desc.Format = DXGI_FORMAT_R32G32B32_FLOAT;
-        ilKey.elements[ilKey.elementCount].desc.InputSlot = nextAvailableInputSlot;
-        ilKey.elements[ilKey.elementCount].desc.AlignedByteOffset = 0;
-        ilKey.elements[ilKey.elementCount].desc.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
-        ilKey.elements[ilKey.elementCount].desc.InstanceDataStepRate = 0;
</del><ins>+    ANGLE_TRY(updateInputLayout(state, mode, sortedSemanticIndices, numIndicesPerInstance));
</ins><span class="cx"> 
</span><del>-        // The new elements are D3D11_INPUT_PER_VERTEX_DATA data so the indexed element
-        // tracking must be applied.  This ensures that the instancing specific
-        // buffer swapping logic continues to work.
-        if (firstIndexedElement == gl::MAX_VERTEX_ATTRIBS)
-        {
-            firstIndexedElement = ilKey.elementCount;
-        }
</del><ins>+    bool dirtyBuffers = false;
+    size_t minDiff    = gl::MAX_VERTEX_ATTRIBS;
+    size_t maxDiff    = 0;
</ins><span class="cx"> 
</span><del>-        ilKey.elementCount++;
</del><ins>+    // Note that if we use instance emulation, we reserve the first buffer slot.
+    size_t reservedBuffers = GetReservedBufferCount(programUsesInstancedPointSprites);
</ins><span class="cx"> 
</span><del>-        ilKey.elements[ilKey.elementCount].desc.SemanticName = &quot;SPRITETEXCOORD&quot;;
-        ilKey.elements[ilKey.elementCount].desc.SemanticIndex = 0;
-        ilKey.elements[ilKey.elementCount].desc.Format = DXGI_FORMAT_R32G32_FLOAT;
-        ilKey.elements[ilKey.elementCount].desc.InputSlot = nextAvailableInputSlot;
-        ilKey.elements[ilKey.elementCount].desc.AlignedByteOffset = sizeof(float) * 3;
-        ilKey.elements[ilKey.elementCount].desc.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
-        ilKey.elements[ilKey.elementCount].desc.InstanceDataStepRate = 0;
-
-        ilKey.elementCount++;
-    }
-
-    // On 9_3, we must ensure that slot 0 contains non-instanced data.
-    // If slot 0 currently contains instanced data then we swap it with a non-instanced element.
-    // Note that instancing is only available on 9_3 via ANGLE_instanced_arrays, since 9_3 doesn't support OpenGL ES 3.0.
-    // As per the spec for ANGLE_instanced_arrays, not all attributes can be instanced simultaneously, so a non-instanced element must exist.
-    ASSERT(!(mFeatureLevel &lt;= D3D_FEATURE_LEVEL_9_3 &amp;&amp; firstIndexedElement == gl::MAX_VERTEX_ATTRIBS));
-    bool moveFirstIndexedIntoSlotZero = mFeatureLevel &lt;= D3D_FEATURE_LEVEL_9_3 &amp;&amp; firstInstancedElement == 0 &amp;&amp; firstIndexedElement != gl::MAX_VERTEX_ATTRIBS;
-
-    if (moveFirstIndexedIntoSlotZero)
</del><ins>+    for (size_t attribIndex = 0; attribIndex &lt; (gl::MAX_VERTEX_ATTRIBS - reservedBuffers);
+         ++attribIndex)
</ins><span class="cx">     {
</span><del>-        ilKey.elements[firstInstancedElement].desc.InputSlot = ilKey.elements[firstIndexedElement].desc.InputSlot;
-        ilKey.elements[firstIndexedElement].desc.InputSlot = 0;
</del><ins>+        ID3D11Buffer *buffer = nullptr;
+        UINT vertexStride    = 0;
+        UINT vertexOffset    = 0;
</ins><span class="cx"> 
</span><del>-        // Instanced PointSprite emulation uses multiple layout entries across a single vertex buffer.
-        // If an index swap is performed, we need to ensure that all elements get the proper InputSlot.
-        if (programUsesInstancedPointSprites)
</del><ins>+        if (attribIndex &lt; mCurrentAttributes.size())
</ins><span class="cx">         {
</span><del>-            ilKey.elements[firstIndexedElement + 1].desc.InputSlot = 0;
-        }
-    }
</del><ins>+            const auto &amp;attrib      = *mCurrentAttributes[attribIndex];
+            Buffer11 *bufferStorage = attrib.storage ? GetAs&lt;Buffer11&gt;(attrib.storage) : nullptr;
</ins><span class="cx"> 
</span><del>-    ID3D11InputLayout *inputLayout = NULL;
-
-    InputLayoutMap::iterator keyIter = mInputLayoutMap.find(ilKey);
-    if (keyIter != mInputLayoutMap.end())
-    {
-        inputLayout = keyIter-&gt;second.inputLayout;
-        keyIter-&gt;second.lastUsedTime = mCounter++;
-    }
-    else
-    {
-        gl::VertexFormat shaderInputLayout[gl::MAX_VERTEX_ATTRIBS];
-        GetInputLayout(attributes, shaderInputLayout);
-
-        ShaderExecutableD3D *shader = NULL;
-        gl::Error error = programD3D-&gt;getVertexExecutableForInputLayout(shaderInputLayout, &amp;shader, nullptr);
-        if (error.isError())
-        {
-            return error;
-        }
-
-        ShaderExecutableD3D *shader11 = GetAs&lt;ShaderExecutable11&gt;(shader);
-
-        D3D11_INPUT_ELEMENT_DESC descs[gl::MAX_VERTEX_ATTRIBS];
-        for (unsigned int j = 0; j &lt; ilKey.elementCount; ++j)
-        {
-            descs[j] = ilKey.elements[j].desc;
-        }
-
-        HRESULT result = mDevice-&gt;CreateInputLayout(descs, ilKey.elementCount, shader11-&gt;getFunction(), shader11-&gt;getLength(), &amp;inputLayout);
-        if (FAILED(result))
-        {
-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal input layout, HRESULT: 0x%08x&quot;, result);
-        }
-
-        if (mInputLayoutMap.size() &gt;= kMaxInputLayouts)
-        {
-            TRACE(&quot;Overflowed the limit of %u input layouts, removing the least recently used &quot;
-                  &quot;to make room.&quot;, kMaxInputLayouts);
-
-            InputLayoutMap::iterator leastRecentlyUsed = mInputLayoutMap.begin();
-            for (InputLayoutMap::iterator i = mInputLayoutMap.begin(); i != mInputLayoutMap.end(); i++)
</del><ins>+            // If indexed pointsprite emulation is active, then we need to take a less efficent code path.
+            // Emulated indexed pointsprite rendering requires that the vertex buffers match exactly to
+            // the indices passed by the caller.  This could expand or shrink the vertex buffer depending
+            // on the number of points indicated by the index list or how many duplicates are found on the index list.
+            if (bufferStorage == nullptr)
</ins><span class="cx">             {
</span><del>-                if (i-&gt;second.lastUsedTime &lt; leastRecentlyUsed-&gt;second.lastUsedTime)
</del><ins>+                ASSERT(attrib.vertexBuffer.get());
+                buffer = GetAs&lt;VertexBuffer11&gt;(attrib.vertexBuffer.get())-&gt;getBuffer();
+            }
+            else if (instancedPointSpritesActive &amp;&amp; (indexInfo != nullptr))
+            {
+                if (indexInfo-&gt;srcIndexData.srcBuffer != nullptr)
</ins><span class="cx">                 {
</span><del>-                    leastRecentlyUsed = i;
</del><ins>+                    const uint8_t *bufferData = nullptr;
+                    ANGLE_TRY(indexInfo-&gt;srcIndexData.srcBuffer-&gt;getData(&amp;bufferData));
+                    ASSERT(bufferData != nullptr);
+
+                    ptrdiff_t offset =
+                        reinterpret_cast&lt;ptrdiff_t&gt;(indexInfo-&gt;srcIndexData.srcIndices);
+                    indexInfo-&gt;srcIndexData.srcBuffer  = nullptr;
+                    indexInfo-&gt;srcIndexData.srcIndices = bufferData + offset;
</ins><span class="cx">                 }
</span><ins>+
+                ANGLE_TRY_RESULT(bufferStorage-&gt;getEmulatedIndexedBuffer(&amp;indexInfo-&gt;srcIndexData,
+                                                                         attrib, start),
+                                 buffer);
</ins><span class="cx">             }
</span><del>-            SafeRelease(leastRecentlyUsed-&gt;second.inputLayout);
-            mInputLayoutMap.erase(leastRecentlyUsed);
-        }
</del><ins>+            else
+            {
+                ANGLE_TRY_RESULT(
+                    bufferStorage-&gt;getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK), buffer);
+            }
</ins><span class="cx"> 
</span><del>-        InputLayoutCounterPair inputCounterPair;
-        inputCounterPair.inputLayout = inputLayout;
-        inputCounterPair.lastUsedTime = mCounter++;
-
-        mInputLayoutMap.insert(std::make_pair(ilKey, inputCounterPair));
-    }
-
-    if (inputLayout != mCurrentIL)
-    {
-        mDeviceContext-&gt;IASetInputLayout(inputLayout);
-        mCurrentIL = inputLayout;
-    }
-
-    bool dirtyBuffers = false;
-    size_t minDiff = gl::MAX_VERTEX_ATTRIBS;
-    size_t maxDiff = 0;
-    unsigned int nextAvailableIndex = 0;
-
-    for (unsigned int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
-    {
-        ID3D11Buffer *buffer = NULL;
-
-        if (attributes[i].active)
-        {
-            VertexBuffer11 *vertexBuffer = GetAs&lt;VertexBuffer11&gt;(attributes[i].vertexBuffer);
-            Buffer11 *bufferStorage = attributes[i].storage ? GetAs&lt;Buffer11&gt;(attributes[i].storage) : NULL;
-
-            buffer = bufferStorage ? bufferStorage-&gt;getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK)
-                                   : vertexBuffer-&gt;getBuffer();
</del><ins>+            vertexStride = attrib.stride;
+            ANGLE_TRY_RESULT(attrib.computeOffset(start), vertexOffset);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        UINT vertexStride = attributes[i].stride;
-        UINT vertexOffset = attributes[i].offset;
</del><ins>+        size_t bufferIndex = reservedBuffers + attribIndex;
</ins><span class="cx"> 
</span><del>-        if (buffer != mCurrentBuffers[i] || vertexStride != mCurrentVertexStrides[i] ||
-            vertexOffset != mCurrentVertexOffsets[i])
</del><ins>+        if (buffer != mCurrentBuffers[bufferIndex] ||
+            vertexStride != mCurrentVertexStrides[bufferIndex] ||
+            vertexOffset != mCurrentVertexOffsets[bufferIndex])
</ins><span class="cx">         {
</span><span class="cx">             dirtyBuffers = true;
</span><del>-            minDiff = std::min(minDiff, static_cast&lt;size_t&gt;(i));
-            maxDiff = std::max(maxDiff, static_cast&lt;size_t&gt;(i));
</del><ins>+            minDiff      = std::min(minDiff, bufferIndex);
+            maxDiff      = std::max(maxDiff, bufferIndex);
</ins><span class="cx"> 
</span><del>-            mCurrentBuffers[i] = buffer;
-            mCurrentVertexStrides[i] = vertexStride;
-            mCurrentVertexOffsets[i] = vertexOffset;
-
-            // If a non null ID3D11Buffer is being assigned to mCurrentBuffers,
-            // then the next available index needs to be tracked to ensure 
-            // that any instanced pointsprite emulation buffers will be properly packed.
-            if (buffer)
-            {
-                nextAvailableIndex = i + 1;
-            }
</del><ins>+            mCurrentBuffers[bufferIndex]       = buffer;
+            mCurrentVertexStrides[bufferIndex] = vertexStride;
+            mCurrentVertexOffsets[bufferIndex] = vertexOffset;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Instanced PointSprite emulation requires two additional ID3D11Buffers.
-    // A vertex buffer needs to be created and added to the list of current buffers, 
-    // strides and offsets collections.  This buffer contains the vertices for a single
-    // PointSprite quad.
-    // An index buffer also needs to be created and applied because rendering instanced
-    // data on D3D11 FL9_3 requires DrawIndexedInstanced() to be used.
-    if (instancedPointSpritesActive)
</del><ins>+    // Instanced PointSprite emulation requires two additional ID3D11Buffers. A vertex buffer needs
+    // to be created and added to the list of current buffers, strides and offsets collections.
+    // This buffer contains the vertices for a single PointSprite quad.
+    // An index buffer also needs to be created and applied because rendering instanced data on
+    // D3D11 FL9_3 requires DrawIndexedInstanced() to be used. Shaders that contain gl_PointSize and
+    // used without the GL_POINTS rendering mode require a vertex buffer because some drivers cannot
+    // handle missing vertex data and will TDR the system.
+    if (programUsesInstancedPointSprites)
</ins><span class="cx">     {
</span><span class="cx">         HRESULT result = S_OK;
</span><span class="cx">         const UINT pointSpriteVertexStride = sizeof(float) * 5;
</span><span class="lines">@@ -352,10 +369,17 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        mCurrentBuffers[nextAvailableIndex] = mPointSpriteVertexBuffer;
-        mCurrentVertexStrides[nextAvailableIndex] = pointSpriteVertexStride;
-        mCurrentVertexOffsets[nextAvailableIndex] = 0;
</del><ins>+        mCurrentBuffers[0] = mPointSpriteVertexBuffer;
+        // Set the stride to 0 if GL_POINTS mode is not being used to instruct the driver to avoid
+        // indexing into the vertex buffer.
+        mCurrentVertexStrides[0] = instancedPointSpritesActive ? pointSpriteVertexStride : 0;
+        mCurrentVertexOffsets[0] = 0;
</ins><span class="cx"> 
</span><ins>+        // Update maxDiff to include the additional point sprite vertex buffer
+        // to ensure that IASetVertexBuffers uses the correct buffer count.
+        minDiff = 0;
+        maxDiff = std::max(maxDiff, static_cast&lt;size_t&gt;(0));
+
</ins><span class="cx">         if (!mPointSpriteIndexBuffer)
</span><span class="cx">         {
</span><span class="cx">             // Create an index buffer and set it for pointsprite rendering
</span><span class="lines">@@ -381,50 +405,246 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // The index buffer is applied here because Instanced PointSprite emulation uses
-        // the a non-indexed rendering path in ANGLE (DrawArrays).  This means that applyIndexBuffer()
-        // on the renderer will not be called and setting this buffer here ensures that the rendering
-        // path will contain the correct index buffers.
-        mDeviceContext-&gt;IASetIndexBuffer(mPointSpriteIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
</del><ins>+        if (instancedPointSpritesActive)
+        {
+            // The index buffer is applied here because Instanced PointSprite emulation uses the a
+            // non-indexed rendering path in ANGLE (DrawArrays). This means that applyIndexBuffer()
+            // on the renderer will not be called and setting this buffer here ensures that the
+            // rendering path will contain the correct index buffers.
+            mDeviceContext-&gt;IASetIndexBuffer(mPointSpriteIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (moveFirstIndexedIntoSlotZero)
</del><ins>+    if (dirtyBuffers)
</ins><span class="cx">     {
</span><del>-        // In this case, we swapped the slots of the first instanced element and the first indexed element, to ensure
-        // that the first slot contains non-instanced data (required by Feature Level 9_3).
-        // We must also swap the corresponding buffers sent to IASetVertexBuffers so that the correct data is sent to each slot.
-        std::swap(mCurrentBuffers[firstIndexedElement], mCurrentBuffers[firstInstancedElement]);
-        std::swap(mCurrentVertexStrides[firstIndexedElement], mCurrentVertexStrides[firstInstancedElement]);
-        std::swap(mCurrentVertexOffsets[firstIndexedElement], mCurrentVertexOffsets[firstInstancedElement]);
</del><ins>+        ASSERT(minDiff &lt;= maxDiff &amp;&amp; maxDiff &lt; gl::MAX_VERTEX_ATTRIBS);
+        mDeviceContext-&gt;IASetVertexBuffers(
+            static_cast&lt;UINT&gt;(minDiff), static_cast&lt;UINT&gt;(maxDiff - minDiff + 1),
+            &amp;mCurrentBuffers[minDiff], &amp;mCurrentVertexStrides[minDiff],
+            &amp;mCurrentVertexOffsets[minDiff]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (dirtyBuffers)
</del><ins>+    return gl::NoError();
+}
+
+gl::Error InputLayoutCache::updateVertexOffsetsForPointSpritesEmulation(GLint startVertex,
+                                                                        GLsizei emulatedInstanceId)
+{
+    size_t reservedBuffers = GetReservedBufferCount(true);
+    for (size_t attribIndex = 0; attribIndex &lt; mCurrentAttributes.size(); ++attribIndex)
</ins><span class="cx">     {
</span><del>-        ASSERT(minDiff &lt;= maxDiff &amp;&amp; maxDiff &lt; gl::MAX_VERTEX_ATTRIBS);
-        mDeviceContext-&gt;IASetVertexBuffers(minDiff, maxDiff - minDiff + 1, mCurrentBuffers + minDiff,
-                                           mCurrentVertexStrides + minDiff, mCurrentVertexOffsets + minDiff);
</del><ins>+        const auto &amp;attrib = *mCurrentAttributes[attribIndex];
+        size_t bufferIndex = reservedBuffers + attribIndex;
+
+        if (attrib.divisor &gt; 0)
+        {
+            unsigned int offset = 0;
+            ANGLE_TRY_RESULT(attrib.computeOffset(startVertex), offset);
+            mCurrentVertexOffsets[bufferIndex] =
+                offset + (attrib.stride * (emulatedInstanceId / attrib.divisor));
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    mDeviceContext-&gt;IASetVertexBuffers(0, gl::MAX_VERTEX_ATTRIBS, mCurrentBuffers.data(),
+                                       mCurrentVertexStrides.data(), mCurrentVertexOffsets.data());
+
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::size_t InputLayoutCache::hashInputLayout(const InputLayoutKey &amp;inputLayout)
</del><ins>+gl::Error InputLayoutCache::updateInputLayout(const gl::State &amp;state,
+                                              GLenum mode,
+                                              const AttribIndexArray &amp;sortedSemanticIndices,
+                                              GLsizei numIndicesPerInstance)
</ins><span class="cx"> {
</span><del>-    static const unsigned int seed = 0xDEADBEEF;
</del><ins>+    gl::Program *program         = state.getProgram();
+    const auto &amp;shaderAttributes = program-&gt;getAttributes();
+    PackedAttributeLayout layout;
</ins><span class="cx"> 
</span><del>-    std::size_t hash = 0;
-    MurmurHash3_x86_32(inputLayout.begin(), static_cast&lt;int&gt;(inputLayout.end() - inputLayout.begin()), seed, &amp;hash);
-    return hash;
</del><ins>+    ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(program);
+    bool programUsesInstancedPointSprites =
+        programD3D-&gt;usesPointSize() &amp;&amp; programD3D-&gt;usesInstancedPointSpriteEmulation();
+    bool instancedPointSpritesActive = programUsesInstancedPointSprites &amp;&amp; (mode == GL_POINTS);
+
+    if (programUsesInstancedPointSprites)
+    {
+        layout.flags |= PackedAttributeLayout::FLAG_USES_INSTANCED_SPRITES;
+    }
+
+    if (instancedPointSpritesActive)
+    {
+        layout.flags |= PackedAttributeLayout::FLAG_INSTANCED_SPRITES_ACTIVE;
+    }
+
+    if (numIndicesPerInstance &gt; 0)
+    {
+        layout.flags |= PackedAttributeLayout::FLAG_INSTANCED_RENDERING_ACTIVE;
+    }
+
+    const auto &amp;attribs            = state.getVertexArray()-&gt;getVertexAttributes();
+    const auto &amp;locationToSemantic = programD3D-&gt;getAttribLocationToD3DSemantics();
+
+    for (unsigned long attribIndex : angle::IterateBitSet(program-&gt;getActiveAttribLocationsMask()))
+    {
+        // Record the type of the associated vertex shader vector in our key
+        // This will prevent mismatched vertex shaders from using the same input layout
+        GLenum glslElementType = GetGLSLAttributeType(shaderAttributes, attribIndex);
+
+        const auto &amp;attrib = attribs[attribIndex];
+        int d3dSemantic    = locationToSemantic[attribIndex];
+
+        const auto &amp;currentValue              = state.getVertexAttribCurrentValue(attribIndex);
+        gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, currentValue.Type);
+
+        layout.addAttributeData(glslElementType, d3dSemantic, vertexFormatType, attrib.divisor);
+    }
+
+    ID3D11InputLayout *inputLayout = nullptr;
+    if (layout.numAttributes &gt; 0 || layout.flags != 0)
+    {
+        auto layoutMapIt = mLayoutMap.find(layout);
+        if (layoutMapIt != mLayoutMap.end())
+        {
+            inputLayout = layoutMapIt-&gt;second;
+        }
+        else
+        {
+            ANGLE_TRY(createInputLayout(sortedSemanticIndices, mode, program, numIndicesPerInstance,
+                                        &amp;inputLayout));
+            if (mLayoutMap.size() &gt;= mCacheSize)
+            {
+                TRACE(&quot;Overflowed the limit of %u input layouts, purging half the cache.&quot;,
+                      mCacheSize);
+
+                // Randomly release every second element
+                auto it = mLayoutMap.begin();
+                while (it != mLayoutMap.end())
+                {
+                    it++;
+                    if (it != mLayoutMap.end())
+                    {
+                        // c++11 erase allows us to easily delete the current iterator.
+                        SafeRelease(it-&gt;second);
+                        it = mLayoutMap.erase(it);
+                    }
+                }
+            }
+
+            mLayoutMap[layout] = inputLayout;
+        }
+    }
+
+    if (inputLayout != mCurrentIL)
+    {
+        mDeviceContext-&gt;IASetInputLayout(inputLayout);
+        mCurrentIL = inputLayout;
+    }
+
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InputLayoutCache::compareInputLayouts(const InputLayoutKey &amp;a, const InputLayoutKey &amp;b)
</del><ins>+gl::Error InputLayoutCache::createInputLayout(const AttribIndexArray &amp;sortedSemanticIndices,
+                                              GLenum mode,
+                                              gl::Program *program,
+                                              GLsizei numIndicesPerInstance,
+                                              ID3D11InputLayout **inputLayoutOut)
</ins><span class="cx"> {
</span><del>-    if (a.elementCount != b.elementCount)
</del><ins>+    ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(program);
+
+    bool programUsesInstancedPointSprites =
+        programD3D-&gt;usesPointSize() &amp;&amp; programD3D-&gt;usesInstancedPointSpriteEmulation();
+
+    unsigned int inputElementCount = 0;
+    std::array&lt;D3D11_INPUT_ELEMENT_DESC, gl::MAX_VERTEX_ATTRIBS&gt; inputElements;
+
+    for (size_t attribIndex = 0; attribIndex &lt; mCurrentAttributes.size(); ++attribIndex)
</ins><span class="cx">     {
</span><del>-        return false;
</del><ins>+        const auto &amp;attrib    = *mCurrentAttributes[attribIndex];
+        const int sortedIndex = sortedSemanticIndices[attribIndex];
+
+        D3D11_INPUT_CLASSIFICATION inputClass =
+            attrib.divisor &gt; 0 ? D3D11_INPUT_PER_INSTANCE_DATA : D3D11_INPUT_PER_VERTEX_DATA;
+
+        const auto &amp;vertexFormatType =
+            gl::GetVertexFormatType(*attrib.attribute, attrib.currentValueType);
+        const auto &amp;vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormatType, mFeatureLevel);
+
+        auto *inputElement = &amp;inputElements[inputElementCount];
+
+        inputElement-&gt;SemanticName         = &quot;TEXCOORD&quot;;
+        inputElement-&gt;SemanticIndex        = sortedIndex;
+        inputElement-&gt;Format               = vertexFormatInfo.nativeFormat;
+        inputElement-&gt;InputSlot            = static_cast&lt;UINT&gt;(attribIndex);
+        inputElement-&gt;AlignedByteOffset    = 0;
+        inputElement-&gt;InputSlotClass       = inputClass;
+        inputElement-&gt;InstanceDataStepRate = attrib.divisor;
+
+        inputElementCount++;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return std::equal(a.begin(), a.end(), b.begin());
</del><ins>+    // Instanced PointSprite emulation requires additional entries in the
+    // inputlayout to support the vertices that make up the pointsprite quad.
+    // We do this even if mode != GL_POINTS, since the shader signature has these inputs, and the
+    // input layout must match the shader
+    if (programUsesInstancedPointSprites)
+    {
+        // On 9_3, we must ensure that slot 0 contains non-instanced data.
+        // If slot 0 currently contains instanced data then we swap it with a non-instanced element.
+        // Note that instancing is only available on 9_3 via ANGLE_instanced_arrays, since 9_3
+        // doesn't support OpenGL ES 3.0.
+        // As per the spec for ANGLE_instanced_arrays, not all attributes can be instanced
+        // simultaneously, so a non-instanced element must exist.
+        for (size_t elementIndex = 0; elementIndex &lt; inputElementCount; ++elementIndex)
+        {
+            // If rendering points and instanced pointsprite emulation is being used, the
+            // inputClass is required to be configured as per instance data
+            if (mode == GL_POINTS)
+            {
+                inputElements[elementIndex].InputSlotClass       = D3D11_INPUT_PER_INSTANCE_DATA;
+                inputElements[elementIndex].InstanceDataStepRate = 1;
+                if (numIndicesPerInstance &gt; 0 &amp;&amp; mCurrentAttributes[elementIndex]-&gt;divisor &gt; 0)
+                {
+                    inputElements[elementIndex].InstanceDataStepRate = numIndicesPerInstance;
+                }
+            }
+            inputElements[elementIndex].InputSlot++;
+        }
+
+        inputElements[inputElementCount].SemanticName         = &quot;SPRITEPOSITION&quot;;
+        inputElements[inputElementCount].SemanticIndex        = 0;
+        inputElements[inputElementCount].Format               = DXGI_FORMAT_R32G32B32_FLOAT;
+        inputElements[inputElementCount].InputSlot            = 0;
+        inputElements[inputElementCount].AlignedByteOffset    = 0;
+        inputElements[inputElementCount].InputSlotClass       = D3D11_INPUT_PER_VERTEX_DATA;
+        inputElements[inputElementCount].InstanceDataStepRate = 0;
+        inputElementCount++;
+
+        inputElements[inputElementCount].SemanticName         = &quot;SPRITETEXCOORD&quot;;
+        inputElements[inputElementCount].SemanticIndex        = 0;
+        inputElements[inputElementCount].Format               = DXGI_FORMAT_R32G32_FLOAT;
+        inputElements[inputElementCount].InputSlot            = 0;
+        inputElements[inputElementCount].AlignedByteOffset    = sizeof(float) * 3;
+        inputElements[inputElementCount].InputSlotClass       = D3D11_INPUT_PER_VERTEX_DATA;
+        inputElements[inputElementCount].InstanceDataStepRate = 0;
+        inputElementCount++;
+    }
+
+    const gl::InputLayout &amp;shaderInputLayout = GetInputLayout(mCurrentAttributes);
+
+    ShaderExecutableD3D *shader = nullptr;
+    ANGLE_TRY(programD3D-&gt;getVertexExecutableForInputLayout(shaderInputLayout, &amp;shader, nullptr));
+
+    ShaderExecutableD3D *shader11 = GetAs&lt;ShaderExecutable11&gt;(shader);
+
+    HRESULT result =
+        mDevice-&gt;CreateInputLayout(inputElements.data(), inputElementCount, shader11-&gt;getFunction(),
+                                   shader11-&gt;getLength(), inputLayoutOut);
+    if (FAILED(result))
+    {
+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to create internal input layout, HRESULT: 0x%08x&quot;, result);
+    }
+
+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11InputLayoutCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/InputLayoutCache.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,15 +10,19 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_
</span><span class="cx"> 
</span><del>-#include &quot;libANGLE/Constants.h&quot;
-#include &quot;libANGLE/Error.h&quot;
-#include &quot;common/angleutils.h&quot;
-
</del><span class="cx"> #include &lt;GLES2/gl2.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;cstddef&gt;
</span><del>-#include &lt;unordered_map&gt;
</del><span class="cx"> 
</span><ins>+#include &lt;array&gt;
+#include &lt;map&gt;
+
+#include &quot;common/angleutils.h&quot;
+#include &quot;libANGLE/Constants.h&quot;
+#include &quot;libANGLE/Error.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
+
</ins><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> class Program;
</span><span class="lines">@@ -27,6 +31,9 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> struct TranslatedAttribute;
</span><ins>+struct TranslatedIndexData;
+struct SourceIndexData;
+class ProgramD3D;
</ins><span class="cx"> 
</span><span class="cx"> class InputLayoutCache : angle::NonCopyable
</span><span class="cx"> {
</span><span class="lines">@@ -38,66 +45,76 @@
</span><span class="cx">     void clear();
</span><span class="cx">     void markDirty();
</span><span class="cx"> 
</span><del>-    gl::Error applyVertexBuffers(TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS],
-                                 GLenum mode, gl::Program *program);
</del><ins>+    gl::Error applyVertexBuffers(const gl::State &amp;state,
+                                 const std::vector&lt;TranslatedAttribute&gt; &amp;vertexArrayAttribs,
+                                 const std::vector&lt;TranslatedAttribute&gt; &amp;currentValueAttribs,
+                                 GLenum mode,
+                                 GLint start,
+                                 TranslatedIndexData *indexInfo,
+                                 GLsizei numIndicesPerInstance);
</ins><span class="cx"> 
</span><ins>+    gl::Error updateVertexOffsetsForPointSpritesEmulation(GLint startVertex,
+                                                          GLsizei emulatedInstanceId);
+
+    // Useful for testing
+    void setCacheSize(unsigned int cacheSize) { mCacheSize = cacheSize; }
+
</ins><span class="cx">   private:
</span><del>-    struct InputLayoutElement
</del><ins>+    struct PackedAttributeLayout
</ins><span class="cx">     {
</span><del>-        D3D11_INPUT_ELEMENT_DESC desc;
-        GLenum glslElementType;
-    };
-
-    struct InputLayoutKey
-    {
-        unsigned int elementCount;
-        InputLayoutElement elements[gl::MAX_VERTEX_ATTRIBS];
-
-        const char *begin() const
</del><ins>+        PackedAttributeLayout()
+            : numAttributes(0),
+              flags(0)
</ins><span class="cx">         {
</span><del>-            return reinterpret_cast&lt;const char*&gt;(&amp;elementCount);
</del><span class="cx">         }
</span><span class="cx"> 
</span><del>-        const char *end() const
</del><ins>+        void addAttributeData(GLenum glType,
+                              UINT semanticIndex,
+                              gl::VertexFormatType vertexFormatType,
+                              unsigned int divisor);
+
+        bool operator&lt;(const PackedAttributeLayout &amp;other) const;
+
+        enum Flags
</ins><span class="cx">         {
</span><del>-            return reinterpret_cast&lt;const char*&gt;(&amp;elements[elementCount]);
-        }
-    };
</del><ins>+            FLAG_USES_INSTANCED_SPRITES     = 0x1,
+            FLAG_INSTANCED_SPRITES_ACTIVE   = 0x2,
+            FLAG_INSTANCED_RENDERING_ACTIVE = 0x4,
+        };
</ins><span class="cx"> 
</span><del>-    struct InputLayoutCounterPair
-    {
-        ID3D11InputLayout *inputLayout;
-        unsigned long long lastUsedTime;
</del><ins>+        size_t numAttributes;
+        unsigned int flags;
+        uint32_t attributeData[gl::MAX_VERTEX_ATTRIBS];
</ins><span class="cx">     };
</span><span class="cx"> 
</span><ins>+    gl::Error updateInputLayout(const gl::State &amp;state,
+                                GLenum mode,
+                                const AttribIndexArray &amp;sortedSemanticIndices,
+                                GLsizei numIndicesPerInstance);
+    gl::Error createInputLayout(const AttribIndexArray &amp;sortedSemanticIndices,
+                                GLenum mode,
+                                gl::Program *program,
+                                GLsizei numIndicesPerInstance,
+                                ID3D11InputLayout **inputLayoutOut);
+
+    std::map&lt;PackedAttributeLayout, ID3D11InputLayout *&gt; mLayoutMap;
+
</ins><span class="cx">     ID3D11InputLayout *mCurrentIL;
</span><del>-    ID3D11Buffer *mCurrentBuffers[gl::MAX_VERTEX_ATTRIBS];
-    UINT mCurrentVertexStrides[gl::MAX_VERTEX_ATTRIBS];
-    UINT mCurrentVertexOffsets[gl::MAX_VERTEX_ATTRIBS];
</del><ins>+    std::array&lt;ID3D11Buffer *, gl::MAX_VERTEX_ATTRIBS&gt; mCurrentBuffers;
+    std::array&lt;UINT, gl::MAX_VERTEX_ATTRIBS&gt; mCurrentVertexStrides;
+    std::array&lt;UINT, gl::MAX_VERTEX_ATTRIBS&gt; mCurrentVertexOffsets;
+    std::vector&lt;const TranslatedAttribute *&gt; mCurrentAttributes;
</ins><span class="cx"> 
</span><span class="cx">     ID3D11Buffer *mPointSpriteVertexBuffer;
</span><span class="cx">     ID3D11Buffer *mPointSpriteIndexBuffer;
</span><span class="cx"> 
</span><del>-    static std::size_t hashInputLayout(const InputLayoutKey &amp;inputLayout);
-    static bool compareInputLayouts(const InputLayoutKey &amp;a, const InputLayoutKey &amp;b);
</del><ins>+    unsigned int mCacheSize;
</ins><span class="cx"> 
</span><del>-    typedef std::size_t (*InputLayoutHashFunction)(const InputLayoutKey &amp;);
-    typedef bool (*InputLayoutEqualityFunction)(const InputLayoutKey &amp;, const InputLayoutKey &amp;);
-    typedef std::unordered_map&lt;InputLayoutKey,
-                               InputLayoutCounterPair,
-                               InputLayoutHashFunction,
-                               InputLayoutEqualityFunction&gt; InputLayoutMap;
-    InputLayoutMap mInputLayoutMap;
-
-    static const unsigned int kMaxInputLayouts;
-
-    unsigned long long mCounter;
-
</del><span class="cx">     ID3D11Device *mDevice;
</span><span class="cx">     ID3D11DeviceContext *mDeviceContext;
</span><span class="cx">     D3D_FEATURE_LEVEL mFeatureLevel;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11NativeWindowh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/NativeWindow.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/NativeWindow.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/NativeWindow.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,6 +16,7 @@
</span><span class="cx"> #include &quot;common/platform.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;EGL/eglplatform.h&gt;
</span><ins>+#include &quot;libANGLE/Config.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> // DXGISwapChain and DXGIFactory are typedef'd to specific required
</span><span class="cx"> // types. The HWND NativeWindow implementation requires IDXGISwapChain
</span><span class="lines">@@ -43,14 +44,21 @@
</span><span class="cx"> typedef IDXGIFactory DXGIFactory;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+typedef interface IDCompositionDevice IDCompositionDevice;
+typedef interface IDCompositionTarget IDCompositionTarget;
+typedef interface IDCompositionVisual IDCompositionVisual;
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> class NativeWindow
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    explicit NativeWindow(EGLNativeWindowType window);
</del><ins>+    explicit NativeWindow(EGLNativeWindowType window,
+                          const egl::Config *config,
+                          bool directComposition);
</ins><span class="cx"> 
</span><ins>+    ~NativeWindow();
</ins><span class="cx">     bool initialize();
</span><span class="cx">     bool getClientRect(LPRECT rect);
</span><span class="cx">     bool isIconic();
</span><span class="lines">@@ -62,9 +70,16 @@
</span><span class="cx"> 
</span><span class="cx">     inline EGLNativeWindowType getNativeWindow() const { return mWindow; }
</span><span class="cx"> 
</span><ins>+    void commitChange();
+
</ins><span class="cx">   private:
</span><span class="cx">     EGLNativeWindowType mWindow;
</span><span class="cx"> 
</span><ins>+    bool mDirectComposition;
+    IDCompositionDevice *mDevice;
+    IDCompositionTarget *mCompositionTarget;
+    IDCompositionVisual *mVisual;
+    const egl::Config *mConfig;
</ins><span class="cx"> #if defined(ANGLE_ENABLE_WINDOWS_STORE)
</span><span class="cx">     std::shared_ptr&lt;InspectableNativeWindow&gt; mImpl;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11PixelTransfer11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,23 +10,25 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/PixelTransfer11.h&quot;
</span><ins>+
+#include &quot;libANGLE/Buffer.h&quot;
+#include &quot;libANGLE/Context.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/Buffer11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
-#include &quot;libANGLE/renderer/d3d/d3d11/Buffer11.h&quot;
-#include &quot;libANGLE/renderer/d3d/d3d11/TextureStorage11.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/RenderTarget11.h&quot;
</span><del>-#include &quot;libANGLE/formatutils.h&quot;
</del><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/TextureStorage11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Texture.h&quot;
</span><del>-#include &quot;libANGLE/Buffer.h&quot;
-#include &quot;libANGLE/Context.h&quot;
</del><span class="cx"> 
</span><span class="cx"> // Precompiled shaders
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -62,7 +64,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (mResourcesLoaded)
</span><span class="cx">     {
</span><del>-        return gl::Error(GL_NO_ERROR);
</del><ins>+        return gl::NoError();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     HRESULT result = S_OK;
</span><span class="lines">@@ -139,17 +141,13 @@
</span><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal buffer to texture geometry shader.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::Error error = buildShaderMap();
-    if (error.isError())
-    {
-        return error;
-    }
</del><ins>+    ANGLE_TRY(buildShaderMap());
</ins><span class="cx"> 
</span><span class="cx">     StructZero(&amp;mParamsData);
</span><span class="cx"> 
</span><span class="cx">     mResourcesLoaded = true;
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PixelTransfer11::setBufferToTextureCopyParams(const gl::Box &amp;destArea, const gl::Extents &amp;destSize, GLenum internalFormat,
</span><span class="lines">@@ -178,11 +176,7 @@
</span><span class="cx"> gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &amp;unpack, unsigned int offset, RenderTargetD3D *destRenderTarget,
</span><span class="cx">                                                GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &amp;destArea)
</span><span class="cx"> {
</span><del>-    gl::Error error = loadResources();
-    if (error.isError())
-    {
-        return error;
-    }
</del><ins>+    ANGLE_TRY(loadResources());
</ins><span class="cx"> 
</span><span class="cx">     gl::Extents destSize = destRenderTarget-&gt;getExtents();
</span><span class="cx"> 
</span><span class="lines">@@ -202,31 +196,33 @@
</span><span class="cx">     GLenum unsizedFormat = gl::GetInternalFormatInfo(destinationFormat).format;
</span><span class="cx">     GLenum sourceFormat = gl::GetSizedInternalFormat(unsizedFormat, sourcePixelsType);
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;sourceFormatInfo = d3d11::GetTextureFormatInfo(sourceFormat, mRenderer-&gt;getFeatureLevel());
-    DXGI_FORMAT srvFormat = sourceFormatInfo.srvFormat;
</del><ins>+    const d3d11::TextureFormat &amp;sourceFormatInfo = d3d11::GetTextureFormatInfo(sourceFormat, mRenderer-&gt;getRenderer11DeviceCaps());
+    DXGI_FORMAT srvFormat = sourceFormatInfo.formatSet-&gt;srvFormat;
</ins><span class="cx">     ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN);
</span><span class="cx">     Buffer11 *bufferStorage11 = GetAs&lt;Buffer11&gt;(sourceBuffer.getImplementation());
</span><del>-    ID3D11ShaderResourceView *bufferSRV = bufferStorage11-&gt;getSRV(srvFormat);
-    ASSERT(bufferSRV != NULL);
</del><ins>+    ID3D11ShaderResourceView *bufferSRV = nullptr;
+    ANGLE_TRY_RESULT(bufferStorage11-&gt;getSRV(srvFormat), bufferSRV);
+    ASSERT(bufferSRV != nullptr);
</ins><span class="cx"> 
</span><span class="cx">     ID3D11RenderTargetView *textureRTV = GetAs&lt;RenderTarget11&gt;(destRenderTarget)-&gt;getRenderTargetView();
</span><del>-    ASSERT(textureRTV != NULL);
</del><ins>+    ASSERT(textureRTV != nullptr);
</ins><span class="cx"> 
</span><span class="cx">     CopyShaderParams shaderParams;
</span><span class="cx">     setBufferToTextureCopyParams(destArea, destSize, sourceFormat, unpack, offset, &amp;shaderParams);
</span><span class="cx"> 
</span><span class="cx">     ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><del>-    ID3D11Buffer *nullBuffer = NULL;
</del><ins>+    ID3D11Buffer *nullBuffer = nullptr;
</ins><span class="cx">     UINT zero = 0;
</span><span class="cx"> 
</span><span class="cx">     // Are we doing a 2D or 3D copy?
</span><span class="cx">     ID3D11GeometryShader *geometryShader = ((destSize.depth &gt; 1) ? mBufferToTextureGS : NULL);
</span><ins>+    auto stateManager                    = mRenderer-&gt;getStateManager();
</ins><span class="cx"> 
</span><span class="cx">     deviceContext-&gt;VSSetShader(mBufferToTextureVS, NULL, 0);
</span><span class="cx">     deviceContext-&gt;GSSetShader(geometryShader, NULL, 0);
</span><span class="cx">     deviceContext-&gt;PSSetShader(pixelShader, NULL, 0);
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, bufferSRV);
</del><ins>+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, bufferSRV);
</ins><span class="cx">     deviceContext-&gt;IASetInputLayout(NULL);
</span><span class="cx">     deviceContext-&gt;IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
</span><span class="cx"> 
</span><span class="lines">@@ -235,7 +231,7 @@
</span><span class="cx">     deviceContext-&gt;OMSetDepthStencilState(mCopyDepthStencilState, 0xFFFFFFFF);
</span><span class="cx">     deviceContext-&gt;RSSetState(mCopyRasterizerState);
</span><span class="cx"> 
</span><del>-    mRenderer-&gt;setOneTimeRenderTarget(textureRTV);
</del><ins>+    stateManager-&gt;setOneTimeRenderTarget(textureRTV, nullptr);
</ins><span class="cx"> 
</span><span class="cx">     if (!StructEquals(mParamsData, shaderParams))
</span><span class="cx">     {
</span><span class="lines">@@ -259,12 +255,12 @@
</span><span class="cx">     deviceContext-&gt;Draw(numPixels, 0);
</span><span class="cx"> 
</span><span class="cx">     // Unbind textures and render targets and vertex buffer
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
</del><ins>+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
</ins><span class="cx">     deviceContext-&gt;VSSetConstantBuffers(0, 1, &amp;nullBuffer);
</span><span class="cx"> 
</span><span class="cx">     mRenderer-&gt;markAllStateDirty();
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error PixelTransfer11::buildShaderMap()
</span><span class="lines">@@ -284,7 +280,7 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ID3D11PixelShader *PixelTransfer11::findBufferToTexturePS(GLenum internalFormat) const
</span><span class="lines">@@ -299,4 +295,4 @@
</span><span class="cx">     return (shaderMapIt == mBufferToTexturePSMap.end() ? NULL : shaderMapIt-&gt;second);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Query11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Query11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Query11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Query11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,102 +13,248 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;GLES2/gl2ext.h&gt;
</span><span class="cx"> 
</span><ins>+namespace
+{
+
+GLuint64 MergeQueryResults(GLenum type, GLuint64 currentResult, GLuint64 newResult)
+{
+    switch (type)
+    {
+        case GL_ANY_SAMPLES_PASSED:
+        case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
+            return (currentResult == GL_TRUE || newResult == GL_TRUE) ? GL_TRUE : GL_FALSE;
+
+        case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
+            return currentResult + newResult;
+
+        case GL_TIME_ELAPSED_EXT:
+            return currentResult + newResult;
+
+        case GL_TIMESTAMP_EXT:
+            return newResult;
+
+        default:
+            UNREACHABLE();
+            return 0;
+    }
+}
+
+}  // anonymous namespace
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+Query11::QueryState::QueryState()
+    : query(nullptr), beginTimestamp(nullptr), endTimestamp(nullptr), finished(false)
+{
+}
+
+Query11::QueryState::~QueryState()
+{
+    SafeRelease(beginTimestamp);
+    SafeRelease(endTimestamp);
+    SafeRelease(query);
+}
+
</ins><span class="cx"> Query11::Query11(Renderer11 *renderer, GLenum type)
</span><del>-    : QueryImpl(type),
-      mResult(0),
-      mQueryFinished(false),
-      mRenderer(renderer),
-      mQuery(NULL)
</del><ins>+    : QueryImpl(type), mResult(0), mResultSum(0), mRenderer(renderer)
</ins><span class="cx"> {
</span><ins>+    mActiveQuery = std::unique_ptr&lt;QueryState&gt;(new QueryState());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Query11::~Query11()
</span><span class="cx"> {
</span><del>-    SafeRelease(mQuery);
</del><ins>+    mRenderer-&gt;getStateManager()-&gt;onDeleteQueryObject(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Query11::begin()
</span><span class="cx"> {
</span><del>-    if (mQuery == NULL)
-    {
-        D3D11_QUERY_DESC queryDesc;
-        queryDesc.Query = gl_d3d11::ConvertQueryType(getType());
-        queryDesc.MiscFlags = 0;
</del><ins>+    mResultSum = 0;
+    mRenderer-&gt;getStateManager()-&gt;onBeginQuery(this);
+    return resume();
+}
</ins><span class="cx"> 
</span><del>-        HRESULT result = mRenderer-&gt;getDevice()-&gt;CreateQuery(&amp;queryDesc, &amp;mQuery);
-        if (FAILED(result))
-        {
-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal query creation failed, result: 0x%X.&quot;, result);
-        }
-    }
</del><ins>+gl::Error Query11::end()
+{
+    return pause();
+}
</ins><span class="cx"> 
</span><del>-    mRenderer-&gt;getDeviceContext()-&gt;Begin(mQuery);
</del><ins>+gl::Error Query11::queryCounter()
+{
+    // This doesn't do anything for D3D11 as we don't support timestamps
+    ASSERT(getType() == GL_TIMESTAMP_EXT);
+    mResultSum = 0;
+    mPendingQueries.push_back(std::unique_ptr&lt;QueryState&gt;(new QueryState()));
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Query11::end()
</del><ins>+template &lt;typename T&gt;
+gl::Error Query11::getResultBase(T *params)
</ins><span class="cx"> {
</span><del>-    ASSERT(mQuery);
-    mRenderer-&gt;getDeviceContext()-&gt;End(mQuery);
</del><ins>+    ASSERT(mActiveQuery-&gt;query == nullptr);
</ins><span class="cx"> 
</span><del>-    mQueryFinished = false;
-    mResult = GL_FALSE;
</del><ins>+    gl::Error error = flush(true);
+    if (error.isError())
+    {
+        return error;
+    }
</ins><span class="cx"> 
</span><ins>+    ASSERT(mPendingQueries.empty());
+    *params = static_cast&lt;T&gt;(mResultSum);
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+gl::Error Query11::getResult(GLint *params)
+{
+    return getResultBase(params);
+}
+
</ins><span class="cx"> gl::Error Query11::getResult(GLuint *params)
</span><span class="cx"> {
</span><del>-    while (!mQueryFinished)
</del><ins>+    return getResultBase(params);
+}
+
+gl::Error Query11::getResult(GLint64 *params)
+{
+    return getResultBase(params);
+}
+
+gl::Error Query11::getResult(GLuint64 *params)
+{
+    return getResultBase(params);
+}
+
+gl::Error Query11::isResultAvailable(bool *available)
+{
+    gl::Error error = flush(false);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        gl::Error error = testQuery();
</del><ins>+        return error;
+    }
+
+    *available = mPendingQueries.empty();
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error Query11::pause()
+{
+    if (mActiveQuery-&gt;query != nullptr)
+    {
+        ID3D11DeviceContext *context = mRenderer-&gt;getDeviceContext();
+
+        // If we are doing time elapsed query the end timestamp
+        if (getType() == GL_TIME_ELAPSED_EXT)
+        {
+            context-&gt;End(mActiveQuery-&gt;endTimestamp);
+        }
+
+        context-&gt;End(mActiveQuery-&gt;query);
+
+        mPendingQueries.push_back(std::move(mActiveQuery));
+        mActiveQuery = std::unique_ptr&lt;QueryState&gt;(new QueryState());
+    }
+
+    return flush(false);
+}
+
+gl::Error Query11::resume()
+{
+    if (mActiveQuery-&gt;query == nullptr)
+    {
+        gl::Error error = flush(false);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!mQueryFinished)
</del><ins>+        D3D11_QUERY_DESC queryDesc;
+        queryDesc.Query     = gl_d3d11::ConvertQueryType(getType());
+        queryDesc.MiscFlags = 0;
+
+        ID3D11Device *device = mRenderer-&gt;getDevice();
+
+        HRESULT result = device-&gt;CreateQuery(&amp;queryDesc, &amp;mActiveQuery-&gt;query);
+        if (FAILED(result))
</ins><span class="cx">         {
</span><del>-            ScheduleYield();
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal query creation failed, result: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><ins>+
+        // If we are doing time elapsed we also need a query to actually query the timestamp
+        if (getType() == GL_TIME_ELAPSED_EXT)
+        {
+            D3D11_QUERY_DESC desc;
+            desc.Query     = D3D11_QUERY_TIMESTAMP;
+            desc.MiscFlags = 0;
+            result = device-&gt;CreateQuery(&amp;desc, &amp;mActiveQuery-&gt;beginTimestamp);
+            if (FAILED(result))
+            {
+                return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal query creation failed, result: 0x%X.&quot;,
+                                 result);
+            }
+            result = device-&gt;CreateQuery(&amp;desc, &amp;mActiveQuery-&gt;endTimestamp);
+            if (FAILED(result))
+            {
+                return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal query creation failed, result: 0x%X.&quot;,
+                                 result);
+            }
+        }
+
+        ID3D11DeviceContext *context = mRenderer-&gt;getDeviceContext();
+
+        context-&gt;Begin(mActiveQuery-&gt;query);
+
+        // If we are doing time elapsed, query the begin timestamp
+        if (getType() == GL_TIME_ELAPSED_EXT)
+        {
+            context-&gt;End(mActiveQuery-&gt;beginTimestamp);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(mQueryFinished);
-    *params = mResult;
-
</del><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Query11::isResultAvailable(GLuint *available)
</del><ins>+gl::Error Query11::flush(bool force)
</ins><span class="cx"> {
</span><del>-    gl::Error error = testQuery();
-    if (error.isError())
</del><ins>+    while (!mPendingQueries.empty())
</ins><span class="cx">     {
</span><del>-        return error;
</del><ins>+        QueryState *query = mPendingQueries.front().get();
+
+        do
+        {
+            gl::Error error = testQuery(query);
+            if (error.isError())
+            {
+                return error;
+            }
+            if (!query-&gt;finished &amp;&amp; !force)
+            {
+                return gl::Error(GL_NO_ERROR);
+            }
+        } while (!query-&gt;finished);
+
+        mResultSum = MergeQueryResults(getType(), mResultSum, mResult);
+        mPendingQueries.pop_front();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    *available = (mQueryFinished ? GL_TRUE : GL_FALSE);
-
</del><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Query11::testQuery()
</del><ins>+gl::Error Query11::testQuery(QueryState *queryState)
</ins><span class="cx"> {
</span><del>-    if (!mQueryFinished)
</del><ins>+    if (!queryState-&gt;finished)
</ins><span class="cx">     {
</span><del>-        ASSERT(mQuery);
-
</del><span class="cx">         ID3D11DeviceContext *context = mRenderer-&gt;getDeviceContext();
</span><span class="cx">         switch (getType())
</span><span class="cx">         {
</span><span class="cx">           case GL_ANY_SAMPLES_PASSED_EXT:
</span><span class="cx">           case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
</span><span class="cx">             {
</span><ins>+                ASSERT(queryState-&gt;query);
</ins><span class="cx">                 UINT64 numPixels = 0;
</span><del>-                HRESULT result = context-&gt;GetData(mQuery, &amp;numPixels, sizeof(numPixels), 0);
</del><ins>+                HRESULT result =
+                    context-&gt;GetData(queryState-&gt;query, &amp;numPixels, sizeof(numPixels), 0);
</ins><span class="cx">                 if (FAILED(result))
</span><span class="cx">                 {
</span><span class="cx">                     return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to get the data of an internal query, result: 0x%X.&quot;, result);
</span><span class="lines">@@ -116,7 +262,7 @@
</span><span class="cx"> 
</span><span class="cx">                 if (result == S_OK)
</span><span class="cx">                 {
</span><del>-                    mQueryFinished = true;
</del><ins>+                    queryState-&gt;finished = true;
</ins><span class="cx">                     mResult = (numPixels &gt; 0) ? GL_TRUE : GL_FALSE;
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="lines">@@ -124,8 +270,9 @@
</span><span class="cx"> 
</span><span class="cx">           case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
</span><span class="cx">             {
</span><ins>+                ASSERT(queryState-&gt;query);
</ins><span class="cx">                 D3D11_QUERY_DATA_SO_STATISTICS soStats = { 0 };
</span><del>-                HRESULT result = context-&gt;GetData(mQuery, &amp;soStats, sizeof(soStats), 0);
</del><ins>+                HRESULT result = context-&gt;GetData(queryState-&gt;query, &amp;soStats, sizeof(soStats), 0);
</ins><span class="cx">                 if (FAILED(result))
</span><span class="cx">                 {
</span><span class="cx">                     return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to get the data of an internal query, result: 0x%X.&quot;, result);
</span><span class="lines">@@ -133,18 +280,90 @@
</span><span class="cx"> 
</span><span class="cx">                 if (result == S_OK)
</span><span class="cx">                 {
</span><del>-                    mQueryFinished = true;
-                    mResult = static_cast&lt;GLuint&gt;(soStats.NumPrimitivesWritten);
</del><ins>+                    queryState-&gt;finished = true;
+                    mResult        = static_cast&lt;GLuint64&gt;(soStats.NumPrimitivesWritten);
</ins><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+            case GL_TIME_ELAPSED_EXT:
+            {
+                ASSERT(queryState-&gt;query);
+                ASSERT(queryState-&gt;beginTimestamp);
+                ASSERT(queryState-&gt;endTimestamp);
+                D3D11_QUERY_DATA_TIMESTAMP_DISJOINT timeStats = {0};
+                HRESULT result =
+                    context-&gt;GetData(queryState-&gt;query, &amp;timeStats, sizeof(timeStats), 0);
+                if (FAILED(result))
+                {
+                    return gl::Error(GL_OUT_OF_MEMORY,
+                                     &quot;Failed to get the data of an internal query, result: 0x%X.&quot;,
+                                     result);
+                }
+
+                if (result == S_OK)
+                {
+                    UINT64 beginTime = 0;
+                    HRESULT beginRes =
+                        context-&gt;GetData(queryState-&gt;beginTimestamp, &amp;beginTime, sizeof(UINT64), 0);
+                    if (FAILED(beginRes))
+                    {
+                        return gl::Error(
+                            GL_OUT_OF_MEMORY,
+                            &quot;Failed to get the data of an internal query, result: 0x%X.&quot;, beginRes);
+                    }
+                    UINT64 endTime = 0;
+                    HRESULT endRes =
+                        context-&gt;GetData(queryState-&gt;endTimestamp, &amp;endTime, sizeof(UINT64), 0);
+                    if (FAILED(endRes))
+                    {
+                        return gl::Error(
+                            GL_OUT_OF_MEMORY,
+                            &quot;Failed to get the data of an internal query, result: 0x%X.&quot;, endRes);
+                    }
+
+                    if (beginRes == S_OK &amp;&amp; endRes == S_OK)
+                    {
+                        queryState-&gt;finished = true;
+                        if (timeStats.Disjoint)
+                        {
+                            mRenderer-&gt;setGPUDisjoint();
+                        }
+                        static_assert(sizeof(UINT64) == sizeof(unsigned long long),
+                                      &quot;D3D UINT64 isn't 64 bits&quot;);
+                        if (rx::IsUnsignedMultiplicationSafe(endTime - beginTime, 1000000000ull))
+                        {
+                            mResult = ((endTime - beginTime) * 1000000000ull) / timeStats.Frequency;
+                        }
+                        else
+                        {
+                            mResult = std::numeric_limits&lt;GLuint64&gt;::max() / timeStats.Frequency;
+                            // If an overflow does somehow occur, there is no way the elapsed time
+                            // is accurate, so we generate a disjoint event
+                            mRenderer-&gt;setGPUDisjoint();
+                        }
+                    }
+                }
+            }
+            break;
+
+            case GL_TIMESTAMP_EXT:
+            {
+                // D3D11 doesn't support GL timestamp queries as D3D timestamps are not guaranteed
+                // to have any sort of continuity outside of a disjoint timestamp query block, which
+                // GL depends on
+                ASSERT(queryState-&gt;query == nullptr);
+                mResult = 0;
+                queryState-&gt;finished = true;
+            }
+            break;
+
</ins><span class="cx">         default:
</span><span class="cx">             UNREACHABLE();
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!mQueryFinished &amp;&amp; mRenderer-&gt;testDeviceLost())
</del><ins>+        if (!queryState-&gt;finished &amp;&amp; mRenderer-&gt;testDeviceLost())
</ins><span class="cx">         {
</span><span class="cx">             mRenderer-&gt;notifyDeviceLost();
</span><span class="cx">             return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to test get query result, device is lost.&quot;);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Query11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Query11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Query11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Query11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,6 +9,8 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_D3D11_QUERY11_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_D3D11_QUERY11_H_
</span><span class="cx"> 
</span><ins>+#include &lt;deque&gt;
+
</ins><span class="cx"> #include &quot;libANGLE/renderer/QueryImpl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="lines">@@ -19,22 +21,45 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     Query11(Renderer11 *renderer, GLenum type);
</span><del>-    virtual ~Query11();
</del><ins>+    ~Query11() override;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error begin();
-    virtual gl::Error end();
-    virtual gl::Error getResult(GLuint *params);
-    virtual gl::Error isResultAvailable(GLuint *available);
</del><ins>+    gl::Error begin() override;
+    gl::Error end() override;
+    gl::Error queryCounter() override;
+    gl::Error getResult(GLint *params) override;
+    gl::Error getResult(GLuint *params) override;
+    gl::Error getResult(GLint64 *params) override;
+    gl::Error getResult(GLuint64 *params) override;
+    gl::Error isResultAvailable(bool *available) override;
</ins><span class="cx"> 
</span><ins>+    gl::Error pause();
+    gl::Error resume();
+
</ins><span class="cx">   private:
</span><del>-    gl::Error testQuery();
</del><ins>+    struct QueryState final : public angle::NonCopyable
+    {
+        QueryState();
+        ~QueryState();
</ins><span class="cx"> 
</span><del>-    GLuint mResult;
</del><ins>+        ID3D11Query *query;
+        ID3D11Query *beginTimestamp;
+        ID3D11Query *endTimestamp;
+        bool finished;
+    };
</ins><span class="cx"> 
</span><del>-    bool mQueryFinished;
</del><ins>+    gl::Error flush(bool force);
+    gl::Error testQuery(QueryState *queryState);
</ins><span class="cx"> 
</span><ins>+    template &lt;typename T&gt;
+    gl::Error getResultBase(T *params);
+
+    GLuint64 mResult;
+    GLuint64 mResultSum;
+
</ins><span class="cx">     Renderer11 *mRenderer;
</span><del>-    ID3D11Query *mQuery;
</del><ins>+
+    std::unique_ptr&lt;QueryState&gt; mActiveQuery;
+    std::deque&lt;std::unique_ptr&lt;QueryState&gt;&gt; mPendingQueries;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11RenderStateCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,6 +21,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+using namespace gl_d3d11;
</ins><span class="cx"> 
</span><span class="cx"> template &lt;typename mapType&gt;
</span><span class="cx"> static void ClearStateMap(mapType &amp;map)
</span><span class="lines">@@ -42,12 +43,12 @@
</span><span class="cx"> 
</span><span class="cx"> RenderStateCache::RenderStateCache(Renderer11 *renderer)
</span><span class="cx">     : mRenderer(renderer),
</span><del>-      mDevice(NULL),
</del><span class="cx">       mCounter(0),
</span><span class="cx">       mBlendStateCache(kMaxBlendStates, hashBlendState, compareBlendStates),
</span><span class="cx">       mRasterizerStateCache(kMaxRasterizerStates, hashRasterizerState, compareRasterizerStates),
</span><span class="cx">       mDepthStencilStateCache(kMaxDepthStencilStates, hashDepthStencilState, compareDepthStencilStates),
</span><del>-      mSamplerStateCache(kMaxSamplerStates, hashSamplerState, compareSamplerStates)
</del><ins>+      mSamplerStateCache(kMaxSamplerStates, hashSamplerState, compareSamplerStates),
+      mDevice(NULL)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -95,9 +96,9 @@
</span><span class="cx">     bool mrt = false;
</span><span class="cx"> 
</span><span class="cx">     const FramebufferD3D *framebufferD3D = GetImplAs&lt;FramebufferD3D&gt;(framebuffer);
</span><del>-    const gl::AttachmentList &amp;colorbuffers = framebufferD3D-&gt;getColorAttachmentsForRender(mRenderer-&gt;getWorkarounds());
</del><ins>+    const gl::AttachmentList &amp;colorbuffers = framebufferD3D-&gt;getColorAttachmentsForRender();
</ins><span class="cx"> 
</span><del>-    BlendStateKey key = { 0 };
</del><ins>+    BlendStateKey key = {};
</ins><span class="cx">     key.blendState = blendState;
</span><span class="cx">     for (size_t colorAttachment = 0; colorAttachment &lt; colorbuffers.size(); ++colorAttachment)
</span><span class="cx">     {
</span><span class="lines">@@ -209,7 +210,7 @@
</span><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal error, RenderStateCache is not initialized.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RasterizerStateKey key = { 0 };
</del><ins>+    RasterizerStateKey key = {};
</ins><span class="cx">     key.rasterizerState = rasterState;
</span><span class="cx">     key.scissorEnabled = scissorEnabled;
</span><span class="cx"> 
</span><span class="lines">@@ -297,14 +298,31 @@
</span><span class="cx">     return memcmp(&amp;a, &amp;b, sizeof(gl::DepthStencilState)) == 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error RenderStateCache::getDepthStencilState(const gl::DepthStencilState &amp;dsState, ID3D11DepthStencilState **outDSState)
</del><ins>+gl::Error RenderStateCache::getDepthStencilState(const gl::DepthStencilState &amp;originalState,
+                                                 bool disableDepth,
+                                                 bool disableStencil,
+                                                 ID3D11DepthStencilState **outDSState)
</ins><span class="cx"> {
</span><span class="cx">     if (!mDevice)
</span><span class="cx">     {
</span><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal error, RenderStateCache is not initialized.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DepthStencilStateMap::iterator keyIter = mDepthStencilStateCache.find(dsState);
</del><ins>+    gl::DepthStencilState glState = originalState;
+    if (disableDepth)
+    {
+        glState.depthTest = false;
+        glState.depthMask = false;
+    }
+
+    if (disableStencil)
+    {
+        glState.stencilWritemask     = 0;
+        glState.stencilBackWritemask = 0;
+        glState.stencilTest          = false;
+    }
+
+    auto keyIter = mDepthStencilStateCache.find(glState);
</ins><span class="cx">     if (keyIter != mDepthStencilStateCache.end())
</span><span class="cx">     {
</span><span class="cx">         DepthStencilStateCounterPair &amp;state = keyIter-&gt;second;
</span><span class="lines">@@ -312,53 +330,55 @@
</span><span class="cx">         *outDSState = state.first;
</span><span class="cx">         return gl::Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><del>-    else
</del><ins>+
+    if (mDepthStencilStateCache.size() &gt;= kMaxDepthStencilStates)
</ins><span class="cx">     {
</span><del>-        if (mDepthStencilStateCache.size() &gt;= kMaxDepthStencilStates)
</del><ins>+        TRACE(
+            &quot;Overflowed the limit of %u depth stencil states, removing the least recently used &quot;
+            &quot;to make room.&quot;,
+            kMaxDepthStencilStates);
+
+        auto leastRecentlyUsed = mDepthStencilStateCache.begin();
+        for (auto i = mDepthStencilStateCache.begin(); i != mDepthStencilStateCache.end(); i++)
</ins><span class="cx">         {
</span><del>-            TRACE(&quot;Overflowed the limit of %u depth stencil states, removing the least recently used &quot;
-                  &quot;to make room.&quot;, kMaxDepthStencilStates);
-
-            DepthStencilStateMap::iterator leastRecentlyUsed = mDepthStencilStateCache.begin();
-            for (DepthStencilStateMap::iterator i = mDepthStencilStateCache.begin(); i != mDepthStencilStateCache.end(); i++)
</del><ins>+            if (i-&gt;second.second &lt; leastRecentlyUsed-&gt;second.second)
</ins><span class="cx">             {
</span><del>-                if (i-&gt;second.second &lt; leastRecentlyUsed-&gt;second.second)
-                {
-                    leastRecentlyUsed = i;
-                }
</del><ins>+                leastRecentlyUsed = i;
</ins><span class="cx">             }
</span><del>-            SafeRelease(leastRecentlyUsed-&gt;second.first);
-            mDepthStencilStateCache.erase(leastRecentlyUsed);
</del><span class="cx">         }
</span><ins>+        SafeRelease(leastRecentlyUsed-&gt;second.first);
+        mDepthStencilStateCache.erase(leastRecentlyUsed);
+    }
</ins><span class="cx"> 
</span><del>-        D3D11_DEPTH_STENCIL_DESC dsDesc = { 0 };
-        dsDesc.DepthEnable = dsState.depthTest ? TRUE : FALSE;
-        dsDesc.DepthWriteMask = gl_d3d11::ConvertDepthMask(dsState.depthMask);
-        dsDesc.DepthFunc = gl_d3d11::ConvertComparison(dsState.depthFunc);
-        dsDesc.StencilEnable = dsState.stencilTest ? TRUE : FALSE;
-        dsDesc.StencilReadMask = gl_d3d11::ConvertStencilMask(dsState.stencilMask);
-        dsDesc.StencilWriteMask = gl_d3d11::ConvertStencilMask(dsState.stencilWritemask);
-        dsDesc.FrontFace.StencilFailOp = gl_d3d11::ConvertStencilOp(dsState.stencilFail);
-        dsDesc.FrontFace.StencilDepthFailOp = gl_d3d11::ConvertStencilOp(dsState.stencilPassDepthFail);
-        dsDesc.FrontFace.StencilPassOp = gl_d3d11::ConvertStencilOp(dsState.stencilPassDepthPass);
-        dsDesc.FrontFace.StencilFunc = gl_d3d11::ConvertComparison(dsState.stencilFunc);
-        dsDesc.BackFace.StencilFailOp = gl_d3d11::ConvertStencilOp(dsState.stencilBackFail);
-        dsDesc.BackFace.StencilDepthFailOp = gl_d3d11::ConvertStencilOp(dsState.stencilBackPassDepthFail);
-        dsDesc.BackFace.StencilPassOp = gl_d3d11::ConvertStencilOp(dsState.stencilBackPassDepthPass);
-        dsDesc.BackFace.StencilFunc = gl_d3d11::ConvertComparison(dsState.stencilBackFunc);
</del><ins>+    D3D11_DEPTH_STENCIL_DESC dsDesc     = {0};
+    dsDesc.DepthEnable                  = glState.depthTest ? TRUE : FALSE;
+    dsDesc.DepthWriteMask               = ConvertDepthMask(glState.depthMask);
+    dsDesc.DepthFunc                    = ConvertComparison(glState.depthFunc);
+    dsDesc.StencilEnable                = glState.stencilTest ? TRUE : FALSE;
+    dsDesc.StencilReadMask              = ConvertStencilMask(glState.stencilMask);
+    dsDesc.StencilWriteMask             = ConvertStencilMask(glState.stencilWritemask);
+    dsDesc.FrontFace.StencilFailOp      = ConvertStencilOp(glState.stencilFail);
+    dsDesc.FrontFace.StencilDepthFailOp = ConvertStencilOp(glState.stencilPassDepthFail);
+    dsDesc.FrontFace.StencilPassOp      = ConvertStencilOp(glState.stencilPassDepthPass);
+    dsDesc.FrontFace.StencilFunc        = ConvertComparison(glState.stencilFunc);
+    dsDesc.BackFace.StencilFailOp       = ConvertStencilOp(glState.stencilBackFail);
+    dsDesc.BackFace.StencilDepthFailOp  = ConvertStencilOp(glState.stencilBackPassDepthFail);
+    dsDesc.BackFace.StencilPassOp       = ConvertStencilOp(glState.stencilBackPassDepthPass);
+    dsDesc.BackFace.StencilFunc         = ConvertComparison(glState.stencilBackFunc);
</ins><span class="cx"> 
</span><del>-        ID3D11DepthStencilState *dx11DepthStencilState = NULL;
-        HRESULT result = mDevice-&gt;CreateDepthStencilState(&amp;dsDesc, &amp;dx11DepthStencilState);
-        if (FAILED(result) || !dx11DepthStencilState)
-        {
-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Unable to create a ID3D11DepthStencilState, HRESULT: 0x%X.&quot;, result);
-        }
</del><ins>+    ID3D11DepthStencilState *dx11DepthStencilState = NULL;
+    HRESULT result = mDevice-&gt;CreateDepthStencilState(&amp;dsDesc, &amp;dx11DepthStencilState);
+    if (FAILED(result) || !dx11DepthStencilState)
+    {
+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Unable to create a ID3D11DepthStencilState, HRESULT: 0x%X.&quot;, result);
+    }
</ins><span class="cx"> 
</span><del>-        mDepthStencilStateCache.insert(std::make_pair(dsState, std::make_pair(dx11DepthStencilState, mCounter++)));
</del><ins>+    mDepthStencilStateCache.insert(
+        std::make_pair(glState, std::make_pair(dx11DepthStencilState, mCounter++)));
</ins><span class="cx"> 
</span><del>-        *outDSState = dx11DepthStencilState;
-        return gl::Error(GL_NO_ERROR);
-    }
</del><ins>+    *outDSState = dx11DepthStencilState;
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> std::size_t RenderStateCache::hashSamplerState(const gl::SamplerState &amp;samplerState)
</span><span class="lines">@@ -425,7 +445,7 @@
</span><span class="cx">         samplerDesc.MinLOD = samplerState.minLod;
</span><span class="cx">         samplerDesc.MaxLOD = samplerState.maxLod;
</span><span class="cx"> 
</span><del>-        if (mRenderer-&gt;getFeatureLevel() &lt;= D3D_FEATURE_LEVEL_9_3)
</del><ins>+        if (mRenderer-&gt;getRenderer11DeviceCaps().featureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
</ins><span class="cx">         {
</span><span class="cx">             // Check that maxLOD is nearly FLT_MAX (1000.0f is the default), since 9_3 doesn't support anything other than FLT_MAX.
</span><span class="cx">             // Note that Feature Level 9_* only supports GL ES 2.0, so the consumer of ANGLE can't modify the Max LOD themselves.
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11RenderStateCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderStateCache.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -36,7 +36,10 @@
</span><span class="cx"> 
</span><span class="cx">     gl::Error getBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &amp;blendState, ID3D11BlendState **outBlendState);
</span><span class="cx">     gl::Error getRasterizerState(const gl::RasterizerState &amp;rasterState, bool scissorEnabled, ID3D11RasterizerState **outRasterizerState);
</span><del>-    gl::Error getDepthStencilState(const gl::DepthStencilState &amp;dsState, ID3D11DepthStencilState **outDSState);
</del><ins>+    gl::Error getDepthStencilState(const gl::DepthStencilState &amp;dsState,
+                                   bool disableDepth,
+                                   bool disableStencil,
+                                   ID3D11DepthStencilState **outDSState);
</ins><span class="cx">     gl::Error getSamplerState(const gl::SamplerState &amp;samplerState, ID3D11SamplerState **outSamplerState);
</span><span class="cx"> 
</span><span class="cx">   private:
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11RenderTarget11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,10 +8,12 @@
</span><span class="cx"> // retained by Renderbuffers.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/RenderTarget11.h&quot;
</span><ins>+
+#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/SwapChain11.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</del><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -176,19 +178,55 @@
</span><span class="cx">     return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TextureRenderTarget11::TextureRenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
-                                             GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples)
-    : mWidth(width),
</del><ins>+RenderTarget11::RenderTarget11(d3d11::ANGLEFormat angleFormat) : mANGLEFormat(angleFormat)
+{
+}
+
+RenderTarget11::~RenderTarget11()
+{
+    signalDirty();
+}
+
+void RenderTarget11::addDirtyCallback(const NotificationCallback *callback)
+{
+    mDirtyCallbacks.add(callback);
+}
+
+void RenderTarget11::removeDirtyCallback(const NotificationCallback *callback)
+{
+    mDirtyCallbacks.remove(callback);
+}
+
+void RenderTarget11::signalDirty()
+{
+    mDirtyCallbacks.signal();
+
+    // Clear the signal list. We can't do this in the callback because it mutates the iterator.
+    mDirtyCallbacks.clear();
+}
+
+TextureRenderTarget11::TextureRenderTarget11(ID3D11RenderTargetView *rtv,
+                                             ID3D11Resource *resource,
+                                             ID3D11ShaderResourceView *srv,
+                                             ID3D11ShaderResourceView *blitSRV,
+                                             GLenum internalFormat,
+                                             d3d11::ANGLEFormat angleFormat,
+                                             GLsizei width,
+                                             GLsizei height,
+                                             GLsizei depth,
+                                             GLsizei samples)
+    : RenderTarget11(angleFormat),
+      mWidth(width),
</ins><span class="cx">       mHeight(height),
</span><span class="cx">       mDepth(depth),
</span><span class="cx">       mInternalFormat(internalFormat),
</span><del>-      mDXGIFormat(DXGI_FORMAT_UNKNOWN),
</del><span class="cx">       mSamples(samples),
</span><span class="cx">       mSubresourceIndex(0),
</span><span class="cx">       mTexture(resource),
</span><span class="cx">       mRenderTarget(rtv),
</span><span class="cx">       mDepthStencil(NULL),
</span><del>-      mShaderResource(srv)
</del><ins>+      mShaderResource(srv),
+      mBlitShaderResource(blitSRV)
</ins><span class="cx"> {
</span><span class="cx">     if (mTexture)
</span><span class="cx">     {
</span><span class="lines">@@ -205,29 +243,39 @@
</span><span class="cx">         mShaderResource-&gt;AddRef();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (mBlitShaderResource)
+    {
+        mBlitShaderResource-&gt;AddRef();
+    }
+
</ins><span class="cx">     if (mRenderTarget &amp;&amp; mTexture)
</span><span class="cx">     {
</span><span class="cx">         mSubresourceIndex = getRTVSubresourceIndex(mTexture, mRenderTarget);
</span><del>-
-        D3D11_RENDER_TARGET_VIEW_DESC desc;
-        mRenderTarget-&gt;GetDesc(&amp;desc);
-        mDXGIFormat = desc.Format;
</del><span class="cx">     }
</span><ins>+    ASSERT(mANGLEFormat != d3d11::ANGLE_FORMAT_NONE || mWidth == 0 || mHeight == 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
-                                             GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples)
-    : mWidth(width),
</del><ins>+TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv,
+                                             ID3D11Resource *resource,
+                                             ID3D11ShaderResourceView *srv,
+                                             GLenum internalFormat,
+                                             d3d11::ANGLEFormat angleFormat,
+                                             GLsizei width,
+                                             GLsizei height,
+                                             GLsizei depth,
+                                             GLsizei samples)
+    : RenderTarget11(angleFormat),
+      mWidth(width),
</ins><span class="cx">       mHeight(height),
</span><span class="cx">       mDepth(depth),
</span><span class="cx">       mInternalFormat(internalFormat),
</span><del>-      mDXGIFormat(DXGI_FORMAT_UNKNOWN),
</del><span class="cx">       mSamples(samples),
</span><span class="cx">       mSubresourceIndex(0),
</span><span class="cx">       mTexture(resource),
</span><span class="cx">       mRenderTarget(NULL),
</span><span class="cx">       mDepthStencil(dsv),
</span><del>-      mShaderResource(srv)
</del><ins>+      mShaderResource(srv),
+      mBlitShaderResource(nullptr)
</ins><span class="cx"> {
</span><span class="cx">     if (mTexture)
</span><span class="cx">     {
</span><span class="lines">@@ -247,11 +295,8 @@
</span><span class="cx">     if (mDepthStencil &amp;&amp; mTexture)
</span><span class="cx">     {
</span><span class="cx">         mSubresourceIndex = getDSVSubresourceIndex(mTexture, mDepthStencil);
</span><del>-
-        D3D11_DEPTH_STENCIL_VIEW_DESC desc;
-        mDepthStencil-&gt;GetDesc(&amp;desc);
-        mDXGIFormat = desc.Format;
</del><span class="cx">     }
</span><ins>+    ASSERT(mANGLEFormat != d3d11::ANGLE_FORMAT_NONE || mWidth == 0 || mHeight == 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureRenderTarget11::~TextureRenderTarget11()
</span><span class="lines">@@ -260,6 +305,7 @@
</span><span class="cx">     SafeRelease(mRenderTarget);
</span><span class="cx">     SafeRelease(mDepthStencil);
</span><span class="cx">     SafeRelease(mShaderResource);
</span><ins>+    SafeRelease(mBlitShaderResource);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ID3D11Resource *TextureRenderTarget11::getTexture() const
</span><span class="lines">@@ -282,6 +328,11 @@
</span><span class="cx">     return mShaderResource;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ID3D11ShaderResourceView *TextureRenderTarget11::getBlitShaderResourceView() const
+{
+    return mBlitShaderResource;
+}
+
</ins><span class="cx"> GLsizei TextureRenderTarget11::getWidth() const
</span><span class="cx"> {
</span><span class="cx">     return mWidth;
</span><span class="lines">@@ -312,17 +363,19 @@
</span><span class="cx">     return mSubresourceIndex;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-DXGI_FORMAT TextureRenderTarget11::getDXGIFormat() const
-{
-    return mDXGIFormat;
-}
-
-SurfaceRenderTarget11::SurfaceRenderTarget11(SwapChain11 *swapChain, Renderer11 *renderer, bool depth)
-    : mSwapChain(swapChain),
</del><ins>+SurfaceRenderTarget11::SurfaceRenderTarget11(SwapChain11 *swapChain,
+                                             Renderer11 *renderer,
+                                             bool depth)
+    : RenderTarget11(d3d11::ANGLE_FORMAT_NONE),  // format will be determined in constructor body
+      mSwapChain(swapChain),
</ins><span class="cx">       mRenderer(renderer),
</span><span class="cx">       mDepth(depth)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(mSwapChain);
</span><ins>+
+    mANGLEFormat = d3d11::GetTextureFormatInfo(getInternalFormatInternal(),
+                                               mRenderer-&gt;getRenderer11DeviceCaps())
+                       .formatSet-&gt;format;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> SurfaceRenderTarget11::~SurfaceRenderTarget11()
</span><span class="lines">@@ -346,9 +399,14 @@
</span><span class="cx"> 
</span><span class="cx"> GLenum SurfaceRenderTarget11::getInternalFormat() const
</span><span class="cx"> {
</span><del>-    return (mDepth ? mSwapChain-&gt;GetDepthBufferInternalFormat() : mSwapChain-&gt;GetBackBufferInternalFormat());
</del><ins>+    return getInternalFormatInternal();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLenum SurfaceRenderTarget11::getInternalFormatInternal() const
+{
+    return (mDepth ? mSwapChain-&gt;GetDepthBufferInternalFormat() : mSwapChain-&gt;GetRenderTargetInternalFormat());
+}
+
</ins><span class="cx"> GLsizei SurfaceRenderTarget11::getSamples() const
</span><span class="cx"> {
</span><span class="cx">     // Our EGL surfaces do not support multisampling.
</span><span class="lines">@@ -372,17 +430,19 @@
</span><span class="cx"> 
</span><span class="cx"> ID3D11ShaderResourceView *SurfaceRenderTarget11::getShaderResourceView() const
</span><span class="cx"> {
</span><del>-    return (mDepth ? mSwapChain-&gt;getDepthStencilShaderResource() : mSwapChain-&gt;getRenderTargetShaderResource());
</del><ins>+    return (mDepth ? mSwapChain-&gt;getDepthStencilShaderResource()
+                   : mSwapChain-&gt;getRenderTargetShaderResource());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned int SurfaceRenderTarget11::getSubresourceIndex() const
</del><ins>+ID3D11ShaderResourceView *SurfaceRenderTarget11::getBlitShaderResourceView() const
</ins><span class="cx"> {
</span><del>-    return 0;
</del><ins>+    // The SurfaceRenderTargetView format should always be such that the normal SRV works for blits.
+    return getShaderResourceView();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-DXGI_FORMAT SurfaceRenderTarget11::getDXGIFormat() const
</del><ins>+unsigned int SurfaceRenderTarget11::getSubresourceIndex() const
</ins><span class="cx"> {
</span><del>-    return d3d11::GetTextureFormatInfo(getInternalFormat(), mRenderer-&gt;getFeatureLevel()).texFormat;
</del><ins>+    return 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11RenderTarget11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/RenderTarget11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,7 +11,10 @@
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RenderTargetD3D.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
</ins><span class="cx"> 
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class SwapChain11;
</span><span class="lines">@@ -20,30 +23,51 @@
</span><span class="cx"> class RenderTarget11 : public RenderTargetD3D
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    RenderTarget11() { }
-    virtual ~RenderTarget11() { }
</del><ins>+    RenderTarget11(d3d11::ANGLEFormat angleFormat);
+    virtual ~RenderTarget11();
</ins><span class="cx"> 
</span><span class="cx">     virtual ID3D11Resource *getTexture() const = 0;
</span><span class="cx">     virtual ID3D11RenderTargetView *getRenderTargetView() const = 0;
</span><span class="cx">     virtual ID3D11DepthStencilView *getDepthStencilView() const = 0;
</span><span class="cx">     virtual ID3D11ShaderResourceView *getShaderResourceView() const = 0;
</span><ins>+    virtual ID3D11ShaderResourceView *getBlitShaderResourceView() const = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual unsigned int getSubresourceIndex() const = 0;
</span><span class="cx"> 
</span><del>-    virtual DXGI_FORMAT getDXGIFormat() const = 0;
</del><ins>+    void addDirtyCallback(const NotificationCallback *callback);
+    void removeDirtyCallback(const NotificationCallback *callback);
+    void signalDirty() override;
</ins><span class="cx"> 
</span><del>-  private:
-    D3D_FEATURE_LEVEL mFeatureLevel;
</del><ins>+    d3d11::ANGLEFormat getANGLEFormat() const { return mANGLEFormat; }
+
+  protected:
+    NotificationSet mDirtyCallbacks;
+    d3d11::ANGLEFormat mANGLEFormat;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class TextureRenderTarget11 : public RenderTarget11
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     // TextureRenderTarget11 takes ownership of any D3D11 resources it is given and will AddRef them
</span><del>-    TextureRenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
-                           GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples);
-    TextureRenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
-                           GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples);
</del><ins>+    TextureRenderTarget11(ID3D11RenderTargetView *rtv,
+                          ID3D11Resource *resource,
+                          ID3D11ShaderResourceView *srv,
+                          ID3D11ShaderResourceView *blitSRV,
+                          GLenum internalFormat,
+                          d3d11::ANGLEFormat angleFormat,
+                          GLsizei width,
+                          GLsizei height,
+                          GLsizei depth,
+                          GLsizei samples);
+    TextureRenderTarget11(ID3D11DepthStencilView *dsv,
+                          ID3D11Resource *resource,
+                          ID3D11ShaderResourceView *srv,
+                          GLenum internalFormat,
+                          d3d11::ANGLEFormat angleFormat,
+                          GLsizei width,
+                          GLsizei height,
+                          GLsizei depth,
+                          GLsizei samples);
</ins><span class="cx">     virtual ~TextureRenderTarget11();
</span><span class="cx"> 
</span><span class="cx">     GLsizei getWidth() const override;
</span><span class="lines">@@ -56,17 +80,15 @@
</span><span class="cx">     ID3D11RenderTargetView *getRenderTargetView() const override;
</span><span class="cx">     ID3D11DepthStencilView *getDepthStencilView() const override;
</span><span class="cx">     ID3D11ShaderResourceView *getShaderResourceView() const override;
</span><ins>+    ID3D11ShaderResourceView *getBlitShaderResourceView() const override;
</ins><span class="cx"> 
</span><span class="cx">     unsigned int getSubresourceIndex() const override;
</span><span class="cx"> 
</span><del>-    DXGI_FORMAT getDXGIFormat() const override;
-
</del><span class="cx">   private:
</span><span class="cx">     GLsizei mWidth;
</span><span class="cx">     GLsizei mHeight;
</span><span class="cx">     GLsizei mDepth;
</span><span class="cx">     GLenum mInternalFormat;
</span><del>-    DXGI_FORMAT mDXGIFormat;
</del><span class="cx">     GLsizei mSamples;
</span><span class="cx"> 
</span><span class="cx">     unsigned int mSubresourceIndex;
</span><span class="lines">@@ -74,6 +96,10 @@
</span><span class="cx">     ID3D11RenderTargetView *mRenderTarget;
</span><span class="cx">     ID3D11DepthStencilView *mDepthStencil;
</span><span class="cx">     ID3D11ShaderResourceView *mShaderResource;
</span><ins>+
+    // Shader resource view to use with internal blit shaders. Not set for depth/stencil render
+    // targets.
+    ID3D11ShaderResourceView *mBlitShaderResource;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class SurfaceRenderTarget11 : public RenderTarget11
</span><span class="lines">@@ -92,12 +118,15 @@
</span><span class="cx">     ID3D11RenderTargetView *getRenderTargetView() const override;
</span><span class="cx">     ID3D11DepthStencilView *getDepthStencilView() const override;
</span><span class="cx">     ID3D11ShaderResourceView *getShaderResourceView() const override;
</span><ins>+    ID3D11ShaderResourceView *getBlitShaderResourceView() const override;
</ins><span class="cx"> 
</span><span class="cx">     unsigned int getSubresourceIndex() const override;
</span><span class="cx"> 
</span><del>-    DXGI_FORMAT getDXGIFormat() const override;
</del><ins>+  private:
+    // The internal versions of the functions are needed so that they can be safely called
+    // from the constructor.
+    GLenum getInternalFormatInternal() const;
</ins><span class="cx"> 
</span><del>-  private:
</del><span class="cx">     SwapChain11 *mSwapChain;
</span><span class="cx">     Renderer11 *mRenderer;
</span><span class="cx">     bool mDepth;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Renderer11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,50 +8,63 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;EGL/eglext.h&gt;
</ins><span class="cx"> #include &lt;sstream&gt;
</span><del>-#include &lt;EGL/eglext.h&gt;
</del><ins>+#include &lt;versionhelpers.h&gt;
</ins><span class="cx"> 
</span><ins>+#include &quot;common/tls.h&quot;
</ins><span class="cx"> #include &quot;common/utilities.h&quot;
</span><del>-#include &quot;common/tls.h&quot;
</del><span class="cx"> #include &quot;libANGLE/Buffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Display.h&quot;
</span><ins>+#include &quot;libANGLE/formatutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><ins>+#include &quot;libANGLE/histogram_macros.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Program.h&quot;
</span><del>-#include &quot;libANGLE/State.h&quot;
-#include &quot;libANGLE/Surface.h&quot;
-#include &quot;libANGLE/formatutils.h&quot;
-#include &quot;libANGLE/histogram_macros.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/CompilerD3D.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/FramebufferD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/IndexDataManager.h&quot;
-#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/RenderbufferD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/ShaderD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/SurfaceD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/TextureD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/TransformFeedbackD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/VertexDataManager.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Blit11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Buffer11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Clear11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/dxgi_support_table.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Fence11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Framebuffer11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Image11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/IndexBuffer11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/PixelTransfer11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Query11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/RenderTarget11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/Stream11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/SwapChain11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/TextureStorage11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Trim11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/VertexArray11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/VertexBuffer11.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
-#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</del><ins>+#include &quot;libANGLE/renderer/d3d/CompilerD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/DeviceD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/FramebufferD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/IndexDataManager.h&quot;
+#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/RenderbufferD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/ShaderD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/SurfaceD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/TextureD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/TransformFeedbackD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/VertexDataManager.h&quot;
+#include &quot;libANGLE/State.h&quot;
+#include &quot;libANGLE/Surface.h&quot;
</ins><span class="cx"> #include &quot;third_party/trace_event/trace_event.h&quot;
</span><span class="cx"> 
</span><ins>+// Include the D3D9 debug annotator header for use by the desktop D3D11 renderer
+// because the D3D11 interface method ID3DUserDefinedAnnotation::GetStatus
+// doesn't work with the Graphics Diagnostics tools in Visual Studio 2013.
+#ifdef ANGLE_ENABLE_D3D9
+#include &quot;libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h&quot;
+#endif
+
</ins><span class="cx"> // Enable ANGLE_SKIP_DXGI_1_2_CHECK if there is not a possibility of using cross-process
</span><span class="cx"> // HWNDs or the Windows 7 Platform Update (KB2670838) is expected to be installed.
</span><span class="cx"> #ifndef ANGLE_SKIP_DXGI_1_2_CHECK
</span><span class="lines">@@ -75,113 +88,311 @@
</span><span class="cx">     MAX_TEXTURE_IMAGE_UNITS_VTF_SM4 = 16
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-// dirtyPointer is a special value that will make the comparison with any valid pointer fail and force the renderer to re-apply the state.
-static const uintptr_t DirtyPointer = static_cast&lt;uintptr_t&gt;(-1);
</del><ins>+void CalculateConstantBufferParams(GLintptr offset, GLsizeiptr size, UINT *outFirstConstant, UINT *outNumConstants)
+{
+    // The offset must be aligned to 256 bytes (should have been enforced by glBindBufferRange).
+    ASSERT(offset % 256 == 0);
</ins><span class="cx"> 
</span><del>-static bool ImageIndexConflictsWithSRV(const gl::ImageIndex &amp;index, D3D11_SHADER_RESOURCE_VIEW_DESC desc)
</del><ins>+    // firstConstant and numConstants are expressed in constants of 16-bytes. Furthermore they must be a multiple of 16 constants.
+    *outFirstConstant = static_cast&lt;UINT&gt;(offset / 16);
+
+    // The GL size is not required to be aligned to a 256 bytes boundary.
+    // Round the size up to a 256 bytes boundary then express the results in constants of 16-bytes.
+    *outNumConstants = static_cast&lt;UINT&gt;(rx::roundUp(size, static_cast&lt;GLsizeiptr&gt;(256)) / 16);
+
+    // Since the size is rounded up, firstConstant + numConstants may be bigger than the actual size of the buffer.
+    // This behaviour is explictly allowed according to the documentation on ID3D11DeviceContext1::PSSetConstantBuffers1
+    // https://msdn.microsoft.com/en-us/library/windows/desktop/hh404649%28v=vs.85%29.aspx
+}
+
+enum ANGLEFeatureLevel
</ins><span class="cx"> {
</span><del>-    unsigned mipLevel = index.mipIndex;
-    unsigned layerIndex = index.layerIndex;
-    GLenum type = index.type;
</del><ins>+    ANGLE_FEATURE_LEVEL_INVALID,
+    ANGLE_FEATURE_LEVEL_9_3,
+    ANGLE_FEATURE_LEVEL_10_0,
+    ANGLE_FEATURE_LEVEL_10_1,
+    ANGLE_FEATURE_LEVEL_11_0,
+    ANGLE_FEATURE_LEVEL_11_1,
+    NUM_ANGLE_FEATURE_LEVELS
+};
</ins><span class="cx"> 
</span><del>-    switch (desc.ViewDimension)
</del><ins>+ANGLEFeatureLevel GetANGLEFeatureLevel(D3D_FEATURE_LEVEL d3dFeatureLevel)
+{
+    switch (d3dFeatureLevel)
</ins><span class="cx">     {
</span><del>-      case D3D11_SRV_DIMENSION_TEXTURE2D:
-        {
-            unsigned maxSrvMip = desc.Texture2D.MipLevels + desc.Texture2D.MostDetailedMip;
-            maxSrvMip = (desc.Texture2D.MipLevels == -1) ? INT_MAX : maxSrvMip;
</del><ins>+      case D3D_FEATURE_LEVEL_9_3: return ANGLE_FEATURE_LEVEL_9_3;
+      case D3D_FEATURE_LEVEL_10_0: return ANGLE_FEATURE_LEVEL_10_0;
+      case D3D_FEATURE_LEVEL_10_1: return ANGLE_FEATURE_LEVEL_10_1;
+      case D3D_FEATURE_LEVEL_11_0: return ANGLE_FEATURE_LEVEL_11_0;
+      // Note: we don't ever request a 11_1 device, because this gives
+      // an E_INVALIDARG error on systems that don't have the platform update.
+      case D3D_FEATURE_LEVEL_11_1: return ANGLE_FEATURE_LEVEL_11_1;
+      default: return ANGLE_FEATURE_LEVEL_INVALID;
+    }
+}
</ins><span class="cx"> 
</span><del>-            unsigned mipMin = index.mipIndex;
-            unsigned mipMax = (layerIndex == -1) ? INT_MAX : layerIndex;
</del><ins>+void SetLineLoopIndices(GLuint *dest, size_t count)
+{
+    for (size_t i = 0; i &lt; count; i++)
+    {
+        dest[i] = static_cast&lt;GLuint&gt;(i);
+    }
+    dest[count] = 0;
+}
</ins><span class="cx"> 
</span><del>-            return type == GL_TEXTURE_2D &amp;&amp; RangeUI(mipMin, mipMax).intersects(RangeUI(desc.Texture2D.MostDetailedMip, maxSrvMip));
-        }
</del><ins>+template &lt;typename T&gt;
+void CopyLineLoopIndices(const GLvoid *indices, GLuint *dest, size_t count)
+{
+    const T *srcPtr = static_cast&lt;const T *&gt;(indices);
+    for (size_t i = 0; i &lt; count; ++i)
+    {
+        dest[i] = static_cast&lt;GLuint&gt;(srcPtr[i]);
+    }
+    dest[count] = static_cast&lt;GLuint&gt;(srcPtr[0]);
+}
</ins><span class="cx"> 
</span><del>-      case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
-        {
-            unsigned maxSrvMip = desc.Texture2DArray.MipLevels + desc.Texture2DArray.MostDetailedMip;
-            maxSrvMip = (desc.Texture2DArray.MipLevels == -1) ? INT_MAX : maxSrvMip;
</del><ins>+void SetTriangleFanIndices(GLuint *destPtr, size_t numTris)
+{
+    for (size_t i = 0; i &lt; numTris; i++)
+    {
+        destPtr[i * 3 + 0] = 0;
+        destPtr[i * 3 + 1] = static_cast&lt;GLuint&gt;(i) + 1;
+        destPtr[i * 3 + 2] = static_cast&lt;GLuint&gt;(i) + 2;
+    }
+}
</ins><span class="cx"> 
</span><del>-            unsigned maxSlice = desc.Texture2DArray.FirstArraySlice + desc.Texture2DArray.ArraySize;
</del><ins>+template &lt;typename T&gt;
+void CopyLineLoopIndicesWithRestart(const GLvoid *indices,
+                                    size_t count,
+                                    GLenum indexType,
+                                    std::vector&lt;GLuint&gt; *bufferOut)
+{
+    GLuint restartIndex    = gl::GetPrimitiveRestartIndex(indexType);
+    GLuint d3dRestartIndex = static_cast&lt;GLuint&gt;(d3d11::GetPrimitiveRestartIndex());
+    const T *srcPtr        = static_cast&lt;const T *&gt;(indices);
+    Optional&lt;GLuint&gt; currentLoopStart;
</ins><span class="cx"> 
</span><del>-            // Cube maps can be mapped to Texture2DArray SRVs
-            return (type == GL_TEXTURE_2D_ARRAY || gl::IsCubeMapTextureTarget(type)) &amp;&amp;
-                   desc.Texture2DArray.MostDetailedMip &lt;= mipLevel &amp;&amp; mipLevel &lt; maxSrvMip &amp;&amp;
-                   desc.Texture2DArray.FirstArraySlice &lt;= layerIndex &amp;&amp; layerIndex &lt; maxSlice;
-        }
</del><ins>+    bufferOut-&gt;clear();
</ins><span class="cx"> 
</span><del>-      case D3D11_SRV_DIMENSION_TEXTURECUBE:
</del><ins>+    for (size_t indexIdx = 0; indexIdx &lt; count; ++indexIdx)
+    {
+        GLuint value = static_cast&lt;GLuint&gt;(srcPtr[indexIdx]);
+
+        if (value == restartIndex)
</ins><span class="cx">         {
</span><del>-            unsigned maxSrvMip = desc.TextureCube.MipLevels + desc.TextureCube.MostDetailedMip;
-            maxSrvMip = (desc.TextureCube.MipLevels == -1) ? INT_MAX : maxSrvMip;
-
-            return gl::IsCubeMapTextureTarget(type) &amp;&amp;
-                   desc.TextureCube.MostDetailedMip &lt;= mipLevel &amp;&amp; mipLevel &lt; maxSrvMip;
</del><ins>+            if (currentLoopStart.valid())
+            {
+                bufferOut-&gt;push_back(currentLoopStart.value());
+                bufferOut-&gt;push_back(d3dRestartIndex);
+                currentLoopStart.reset();
+            }
</ins><span class="cx">         }
</span><ins>+        else
+        {
+            bufferOut-&gt;push_back(value);
+            if (!currentLoopStart.valid())
+            {
+                currentLoopStart = value;
+            }
+        }
+    }
</ins><span class="cx"> 
</span><del>-      case D3D11_SRV_DIMENSION_TEXTURE3D:
</del><ins>+    if (currentLoopStart.valid())
+    {
+        bufferOut-&gt;push_back(currentLoopStart.value());
+    }
+}
+
+void GetLineLoopIndices(const GLvoid *indices,
+                        GLenum indexType,
+                        GLuint count,
+                        bool usePrimitiveRestartFixedIndex,
+                        std::vector&lt;GLuint&gt; *bufferOut)
+{
+    if (indexType != GL_NONE &amp;&amp; usePrimitiveRestartFixedIndex)
+    {
+        switch (indexType)
</ins><span class="cx">         {
</span><del>-            unsigned maxSrvMip = desc.Texture3D.MipLevels + desc.Texture3D.MostDetailedMip;
-            maxSrvMip = (desc.Texture3D.MipLevels == -1) ? INT_MAX : maxSrvMip;
-
-            return type == GL_TEXTURE_3D &amp;&amp;
-                   desc.Texture3D.MostDetailedMip &lt;= mipLevel &amp;&amp; mipLevel &lt; maxSrvMip;
</del><ins>+            case GL_UNSIGNED_BYTE:
+                CopyLineLoopIndicesWithRestart&lt;GLubyte&gt;(indices, count, indexType, bufferOut);
+                break;
+            case GL_UNSIGNED_SHORT:
+                CopyLineLoopIndicesWithRestart&lt;GLushort&gt;(indices, count, indexType, bufferOut);
+                break;
+            case GL_UNSIGNED_INT:
+                CopyLineLoopIndicesWithRestart&lt;GLuint&gt;(indices, count, indexType, bufferOut);
+                break;
+            default:
+                UNREACHABLE();
+                break;
</ins><span class="cx">         }
</span><del>-      default:
-        // We only handle the cases corresponding to valid image indexes
-        UNIMPLEMENTED();
</del><ins>+        return;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return false;
</del><ins>+    // For non-primitive-restart draws, the index count is static.
+    bufferOut-&gt;resize(static_cast&lt;size_t&gt;(count) + 1);
+
+    switch (indexType)
+    {
+        // Non-indexed draw
+        case GL_NONE:
+            SetLineLoopIndices(&amp;(*bufferOut)[0], count);
+            break;
+        case GL_UNSIGNED_BYTE:
+            CopyLineLoopIndices&lt;GLubyte&gt;(indices, &amp;(*bufferOut)[0], count);
+            break;
+        case GL_UNSIGNED_SHORT:
+            CopyLineLoopIndices&lt;GLushort&gt;(indices, &amp;(*bufferOut)[0], count);
+            break;
+        case GL_UNSIGNED_INT:
+            CopyLineLoopIndices&lt;GLuint&gt;(indices, &amp;(*bufferOut)[0], count);
+            break;
+        default:
+            UNREACHABLE();
+            break;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-// Does *not* increment the resource ref count!!
-ID3D11Resource *GetViewResource(ID3D11View *view)
</del><ins>+template &lt;typename T&gt;
+void CopyTriangleFanIndices(const GLvoid *indices, GLuint *destPtr, size_t numTris)
</ins><span class="cx"> {
</span><del>-    ID3D11Resource *resource = NULL;
-    ASSERT(view);
-    view-&gt;GetResource(&amp;resource);
-    resource-&gt;Release();
-    return resource;
</del><ins>+    const T *srcPtr = static_cast&lt;const T *&gt;(indices);
+
+    for (size_t i = 0; i &lt; numTris; i++)
+    {
+        destPtr[i * 3 + 0] = static_cast&lt;GLuint&gt;(srcPtr[0]);
+        destPtr[i * 3 + 1] = static_cast&lt;GLuint&gt;(srcPtr[i + 1]);
+        destPtr[i * 3 + 2] = static_cast&lt;GLuint&gt;(srcPtr[i + 2]);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CalculateConstantBufferParams(GLintptr offset, GLsizeiptr size, UINT *outFirstConstant, UINT *outNumConstants)
</del><ins>+template &lt;typename T&gt;
+void CopyTriangleFanIndicesWithRestart(const GLvoid *indices,
+                                       GLuint indexCount,
+                                       GLenum indexType,
+                                       std::vector&lt;GLuint&gt; *bufferOut)
</ins><span class="cx"> {
</span><del>-    // The offset must be aligned to 256 bytes (should have been enforced by glBindBufferRange).
-    ASSERT(offset % 256 == 0);
</del><ins>+    GLuint restartIndex    = gl::GetPrimitiveRestartIndex(indexType);
+    GLuint d3dRestartIndex = gl::GetPrimitiveRestartIndex(GL_UNSIGNED_INT);
+    const T *srcPtr        = static_cast&lt;const T *&gt;(indices);
+    Optional&lt;GLuint&gt; vertexA;
+    Optional&lt;GLuint&gt; vertexB;
</ins><span class="cx"> 
</span><del>-    // firstConstant and numConstants are expressed in constants of 16-bytes. Furthermore they must be a multiple of 16 constants.
-    *outFirstConstant = static_cast&lt;UINT&gt;(offset / 16);
</del><ins>+    bufferOut-&gt;clear();
</ins><span class="cx"> 
</span><del>-    // The GL size is not required to be aligned to a 256 bytes boundary.
-    // Round the size up to a 256 bytes boundary then express the results in constants of 16-bytes.
-    *outNumConstants = static_cast&lt;UINT&gt;(rx::roundUp(size, static_cast&lt;GLsizeiptr&gt;(256)) / 16);
</del><ins>+    for (size_t indexIdx = 0; indexIdx &lt; indexCount; ++indexIdx)
+    {
+        GLuint value = static_cast&lt;GLuint&gt;(srcPtr[indexIdx]);
</ins><span class="cx"> 
</span><del>-    // Since the size is rounded up, firstConstant + numConstants may be bigger than the actual size of the buffer.
-    // This behaviour is explictly allowed according to the documentation on ID3D11DeviceContext1::PSSetConstantBuffers1
-    // https://msdn.microsoft.com/en-us/library/windows/desktop/hh404649%28v=vs.85%29.aspx
</del><ins>+        if (value == restartIndex)
+        {
+            bufferOut-&gt;push_back(d3dRestartIndex);
+            vertexA.reset();
+            vertexB.reset();
+        }
+        else
+        {
+            if (!vertexA.valid())
+            {
+                vertexA = value;
+            }
+            else if (!vertexB.valid())
+            {
+                vertexB = value;
+            }
+            else
+            {
+                bufferOut-&gt;push_back(vertexA.value());
+                bufferOut-&gt;push_back(vertexB.value());
+                bufferOut-&gt;push_back(value);
+                vertexB = value;
+            }
+        }
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error GenerateD3D11CreateDeviceErr(HRESULT errorCode)
</del><ins>+void GetTriFanIndices(const GLvoid *indices,
+                      GLenum indexType,
+                      GLuint count,
+                      bool usePrimitiveRestartFixedIndex,
+                      std::vector&lt;GLuint&gt; *bufferOut)
</ins><span class="cx"> {
</span><del>-    return egl::Error(EGL_NOT_INITIALIZED, errorCode, &quot;Could not create D3D11 device.&quot;);
</del><ins>+    if (indexType != GL_NONE &amp;&amp; usePrimitiveRestartFixedIndex)
+    {
+        switch (indexType)
+        {
+            case GL_UNSIGNED_BYTE:
+                CopyTriangleFanIndicesWithRestart&lt;GLubyte&gt;(indices, count, indexType, bufferOut);
+                break;
+            case GL_UNSIGNED_SHORT:
+                CopyTriangleFanIndicesWithRestart&lt;GLushort&gt;(indices, count, indexType, bufferOut);
+                break;
+            case GL_UNSIGNED_INT:
+                CopyTriangleFanIndicesWithRestart&lt;GLuint&gt;(indices, count, indexType, bufferOut);
+                break;
+            default:
+                UNREACHABLE();
+                break;
+        }
+        return;
+    }
+
+    // For non-primitive-restart draws, the index count is static.
+    GLuint numTris = count - 2;
+    bufferOut-&gt;resize(numTris * 3);
+
+    switch (indexType)
+    {
+        // Non-indexed draw
+        case GL_NONE:
+            SetTriangleFanIndices(&amp;(*bufferOut)[0], numTris);
+            break;
+        case GL_UNSIGNED_BYTE:
+            CopyTriangleFanIndices&lt;GLubyte&gt;(indices, &amp;(*bufferOut)[0], numTris);
+            break;
+        case GL_UNSIGNED_SHORT:
+            CopyTriangleFanIndices&lt;GLushort&gt;(indices, &amp;(*bufferOut)[0], numTris);
+            break;
+        case GL_UNSIGNED_INT:
+            CopyTriangleFanIndices&lt;GLuint&gt;(indices, &amp;(*bufferOut)[0], numTris);
+            break;
+        default:
+            UNREACHABLE();
+            break;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+int GetWrapBits(GLenum wrap)
+{
+    switch (wrap)
+    {
+        case GL_CLAMP_TO_EDGE:
+            return 0x1;
+        case GL_REPEAT:
+            return 0x2;
+        case GL_MIRRORED_REPEAT:
+            return 0x3;
+        default:
+            UNREACHABLE();
+            return 0;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}  // anonymous namespace
+
</ins><span class="cx"> Renderer11::Renderer11(egl::Display *display)
</span><span class="cx">     : RendererD3D(display),
</span><span class="cx">       mStateCache(this),
</span><ins>+      mStateManager(this),
+      mLastHistogramUpdateTime(ANGLEPlatformCurrent()-&gt;monotonicallyIncreasingTime()),
</ins><span class="cx">       mDebug(nullptr)
</span><span class="cx"> {
</span><del>-    // Initialize global annotator
-    gl::InitializeDebugAnnotations(&amp;mAnnotator);
-
</del><span class="cx">     mVertexDataManager = NULL;
</span><span class="cx">     mIndexDataManager = NULL;
</span><span class="cx"> 
</span><span class="cx">     mLineLoopIB = NULL;
</span><span class="cx">     mTriangleFanIB = NULL;
</span><ins>+    mAppliedIBChanged = false;
</ins><span class="cx"> 
</span><span class="cx">     mBlit = NULL;
</span><span class="cx">     mPixelTransfer = NULL;
</span><span class="lines">@@ -192,10 +403,18 @@
</span><span class="cx"> 
</span><span class="cx">     mSyncQuery = NULL;
</span><span class="cx"> 
</span><del>-    mSupportsConstantBufferOffsets = false;
</del><ins>+    mRenderer11DeviceCaps.supportsClearView = false;
+    mRenderer11DeviceCaps.supportsConstantBufferOffsets = false;
+    mRenderer11DeviceCaps.supportsDXGI1_2 = false;
+    mRenderer11DeviceCaps.B5G6R5support = 0;
+    mRenderer11DeviceCaps.B4G4R4A4support = 0;
+    mRenderer11DeviceCaps.B5G5R5A1support = 0;
</ins><span class="cx"> 
</span><span class="cx">     mD3d11Module = NULL;
</span><span class="cx">     mDxgiModule = NULL;
</span><ins>+    mDCompModule          = NULL;
+    mCreatedWithDeviceEXT = false;
+    mEGLDevice            = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     mDevice = NULL;
</span><span class="cx">     mDeviceContext = NULL;
</span><span class="lines">@@ -212,66 +431,88 @@
</span><span class="cx"> 
</span><span class="cx">     mAppliedNumXFBBindings = static_cast&lt;size_t&gt;(-1);
</span><span class="cx"> 
</span><del>-    const auto &amp;attributes = mDisplay-&gt;getAttributeMap();
</del><ins>+    ZeroMemory(&amp;mAdapterDescription, sizeof(mAdapterDescription));
</ins><span class="cx"> 
</span><del>-    EGLint requestedMajorVersion = attributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE);
-    EGLint requestedMinorVersion = attributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE);
</del><ins>+    if (mDisplay-&gt;getPlatform() == EGL_PLATFORM_ANGLE_ANGLE)
+    {
+        const auto &amp;attributes = mDisplay-&gt;getAttributeMap();
</ins><span class="cx"> 
</span><del>-    if (requestedMajorVersion == EGL_DONT_CARE || requestedMajorVersion &gt;= 11)
-    {
-        if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion &gt;= 0)
</del><ins>+        EGLint requestedMajorVersion = static_cast&lt;EGLint&gt;(
+            attributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE));
+        EGLint requestedMinorVersion = static_cast&lt;EGLint&gt;(
+            attributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE));
+
+        if (requestedMajorVersion == EGL_DONT_CARE || requestedMajorVersion &gt;= 11)
</ins><span class="cx">         {
</span><del>-            mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_11_0);
</del><ins>+            if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion &gt;= 0)
+            {
+                mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_11_0);
+            }
</ins><span class="cx">         }
</span><del>-    }
</del><span class="cx"> 
</span><del>-    if (requestedMajorVersion == EGL_DONT_CARE || requestedMajorVersion &gt;= 10)
-    {
-        if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion &gt;= 1)
</del><ins>+        if (requestedMajorVersion == EGL_DONT_CARE || requestedMajorVersion &gt;= 10)
</ins><span class="cx">         {
</span><del>-            mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_10_1);
</del><ins>+            if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion &gt;= 1)
+            {
+                mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_10_1);
+            }
+            if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion &gt;= 0)
+            {
+                mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_10_0);
+            }
</ins><span class="cx">         }
</span><del>-        if (requestedMinorVersion == EGL_DONT_CARE || requestedMinorVersion &gt;= 0)
</del><ins>+
+        if (requestedMajorVersion == 9 &amp;&amp; requestedMinorVersion == 3)
</ins><span class="cx">         {
</span><del>-            mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_10_0);
</del><ins>+            mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_9_3);
</ins><span class="cx">         }
</span><del>-    }
</del><span class="cx"> 
</span><del>-    if (requestedMajorVersion == 9 &amp;&amp; requestedMinorVersion == 3)
-    {
-        mAvailableFeatureLevels.push_back(D3D_FEATURE_LEVEL_9_3);
-    }
</del><ins>+        EGLint requestedDeviceType = static_cast&lt;EGLint&gt;(attributes.get(
+            EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE));
+        switch (requestedDeviceType)
+        {
+            case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE:
+                mRequestedDriverType = D3D_DRIVER_TYPE_HARDWARE;
+                break;
</ins><span class="cx"> 
</span><del>-    EGLint requestedDeviceType = attributes.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE,
-                                                EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE);
-    switch (requestedDeviceType)
-    {
-      case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE:
-        mDriverType = D3D_DRIVER_TYPE_HARDWARE;
-        break;
</del><ins>+            case EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE:
+                mRequestedDriverType = D3D_DRIVER_TYPE_WARP;
+                break;
</ins><span class="cx"> 
</span><del>-      case EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE:
-        mDriverType = D3D_DRIVER_TYPE_WARP;
-        break;
</del><ins>+            case EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE:
+                mRequestedDriverType = D3D_DRIVER_TYPE_REFERENCE;
+                break;
</ins><span class="cx"> 
</span><del>-      case EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE:
-        mDriverType = D3D_DRIVER_TYPE_REFERENCE;
-        break;
</del><ins>+            case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE:
+                mRequestedDriverType = D3D_DRIVER_TYPE_NULL;
+                break;
</ins><span class="cx"> 
</span><del>-      case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE:
-        mDriverType = D3D_DRIVER_TYPE_NULL;
-        break;
</del><ins>+            default:
+                UNREACHABLE();
+        }
</ins><span class="cx"> 
</span><del>-      default:
-        UNREACHABLE();
</del><ins>+        const EGLenum presentPath = static_cast&lt;EGLenum&gt;(attributes.get(
+            EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE, EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE));
+        mPresentPathFastEnabled = (presentPath == EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE);
</ins><span class="cx">     }
</span><ins>+    else if (display-&gt;getPlatform() == EGL_PLATFORM_DEVICE_EXT)
+    {
+        mEGLDevice = GetImplAs&lt;DeviceD3D&gt;(display-&gt;getDevice());
+        ASSERT(mEGLDevice != nullptr);
+        mCreatedWithDeviceEXT = true;
+
+        // Also set EGL_PLATFORM_ANGLE_ANGLE variables, in case they're used elsewhere in ANGLE
+        // mAvailableFeatureLevels defaults to empty
+        mRequestedDriverType = D3D_DRIVER_TYPE_UNKNOWN;
+        mPresentPathFastEnabled = false;
+    }
+
+    initializeDebugAnnotator();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Renderer11::~Renderer11()
</span><span class="cx"> {
</span><span class="cx">     release();
</span><del>-
-    gl::UninitializeDebugAnnotations();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #ifndef __d3d11_1_h__
</span><span class="lines">@@ -280,118 +521,49 @@
</span><span class="cx"> 
</span><span class="cx"> egl::Error Renderer11::initialize()
</span><span class="cx"> {
</span><del>-    if (!mCompiler.initialize())
</del><ins>+    HRESULT result = S_OK;
+
+    egl::Error error = initializeD3DDevice();
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        return egl::Error(EGL_NOT_INITIALIZED,
-                          D3D11_INIT_COMPILER_ERROR,
-                          &quot;Failed to initialize compiler.&quot;);
</del><ins>+        return error;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if !defined(ANGLE_ENABLE_WINDOWS_STORE)
</span><del>-    PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = nullptr;
</del><ins>+#if !ANGLE_SKIP_DXGI_1_2_CHECK
</ins><span class="cx">     {
</span><del>-        TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;Renderer11::initialize (Load DLLs)&quot;);
-        mDxgiModule = LoadLibrary(TEXT(&quot;dxgi.dll&quot;));
-        mD3d11Module = LoadLibrary(TEXT(&quot;d3d11.dll&quot;));
-
-        if (mD3d11Module == nullptr || mDxgiModule == nullptr)
</del><ins>+        TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;Renderer11::initialize (DXGICheck)&quot;);
+        // In order to create a swap chain for an HWND owned by another process, DXGI 1.2 is required.
+        // The easiest way to check is to query for a IDXGIDevice2.
+        bool requireDXGI1_2 = false;
+        HWND hwnd = WindowFromDC(mDisplay-&gt;getNativeDisplayId());
+        if (hwnd)
</ins><span class="cx">         {
</span><del>-            return egl::Error(EGL_NOT_INITIALIZED,
-                              D3D11_INIT_MISSING_DEP,
-                              &quot;Could not load D3D11 or DXGI library.&quot;);
</del><ins>+            DWORD currentProcessId = GetCurrentProcessId();
+            DWORD wndProcessId;
+            GetWindowThreadProcessId(hwnd, &amp;wndProcessId);
+            requireDXGI1_2 = (currentProcessId != wndProcessId);
</ins><span class="cx">         }
</span><del>-
-        // create the D3D11 device
-        ASSERT(mDevice == nullptr);
-        D3D11CreateDevice = reinterpret_cast&lt;PFN_D3D11_CREATE_DEVICE&gt;(GetProcAddress(mD3d11Module, &quot;D3D11CreateDevice&quot;));
-
-        if (D3D11CreateDevice == nullptr)
</del><ins>+        else
</ins><span class="cx">         {
</span><del>-            return egl::Error(EGL_NOT_INITIALIZED,
-                              D3D11_INIT_MISSING_DEP,
-                              &quot;Could not retrieve D3D11CreateDevice address.&quot;);
</del><ins>+            requireDXGI1_2 = true;
</ins><span class="cx">         }
</span><del>-    }
-#endif
</del><span class="cx"> 
</span><del>-    HRESULT result = S_OK;
-#ifdef _DEBUG
-    {
-        TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;D3D11CreateDevice (Debug)&quot;);
-        result = D3D11CreateDevice(NULL,
-                                   mDriverType,
-                                   NULL,
-                                   D3D11_CREATE_DEVICE_DEBUG,
-                                   mAvailableFeatureLevels.data(),
-                                   mAvailableFeatureLevels.size(),
-                                   D3D11_SDK_VERSION,
-                                   &amp;mDevice,
-                                   &amp;mFeatureLevel,
-                                   &amp;mDeviceContext);
-    }
-
-    if (!mDevice || FAILED(result))
-    {
-        ERR(&quot;Failed creating Debug D3D11 device - falling back to release runtime.\n&quot;);
-    }
-
-    if (!mDevice || FAILED(result))
-#endif
-    {
-        double createDeviceBegin = ANGLEPlatformCurrent()-&gt;currentTime();
-
-        TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;D3D11CreateDevice&quot;);
-        result = D3D11CreateDevice(NULL,
-                                   mDriverType,
-                                   NULL,
-                                   0,
-                                   mAvailableFeatureLevels.data(),
-                                   mAvailableFeatureLevels.size(),
-                                   D3D11_SDK_VERSION,
-                                   &amp;mDevice,
-                                   &amp;mFeatureLevel,
-                                   &amp;mDeviceContext);
-
-        // Cleanup done by destructor
-        if (FAILED(result))
</del><ins>+        if (requireDXGI1_2)
</ins><span class="cx">         {
</span><del>-            // Most likely error codes, see
-            // https://msdn.microsoft.com/en-us/library/windows/desktop/ff476082%28v=vs.85%29.aspx
-            // And https://msdn.microsoft.com/en-us/library/windows/desktop/ff476174(v=vs.85).aspx
-            switch (result)
</del><ins>+            IDXGIDevice2 *dxgiDevice2 = NULL;
+            result = mDevice-&gt;QueryInterface(__uuidof(IDXGIDevice2), (void**)&amp;dxgiDevice2);
+            if (FAILED(result))
</ins><span class="cx">             {
</span><del>-              case E_INVALIDARG:
-                return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_INVALIDARG);
-              case E_FAIL:
-                return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_FAIL);
-              case E_NOTIMPL:
-                return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_NOTIMPL);
-              case E_OUTOFMEMORY:
-                return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_OUTOFMEMORY);
-              case DXGI_ERROR_INVALID_CALL:
-                return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_INVALIDCALL);
-              case DXGI_ERROR_SDK_COMPONENT_MISSING:
-                return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_COMPONENTMISSING);
-              case DXGI_ERROR_WAS_STILL_DRAWING:
-                return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_WASSTILLDRAWING);
-              case DXGI_ERROR_NOT_CURRENTLY_AVAILABLE:
-                return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_NOTAVAILABLE);
-              case DXGI_ERROR_DEVICE_HUNG:
-                return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_DEVICEHUNG);
-              default:
-                return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_ERROR);
</del><ins>+                return egl::Error(EGL_NOT_INITIALIZED,
+                                  D3D11_INIT_INCOMPATIBLE_DXGI,
+                                  &quot;DXGI 1.2 required to present to HWNDs owned by another process.&quot;);
</ins><span class="cx">             }
</span><ins>+            SafeRelease(dxgiDevice2);
</ins><span class="cx">         }
</span><del>-
-        if (!mDevice)
-        {
-            return GenerateD3D11CreateDeviceErr(D3D11_INIT_CREATEDEVICE_NULL);
-        }
-
-        double createDeviceSec = ANGLEPlatformCurrent()-&gt;currentTime() - createDeviceBegin;
-        int createDeviceMS = static_cast&lt;int&gt;(createDeviceSec * 1000);
-        ANGLE_HISTOGRAM_TIMES(&quot;GPU.ANGLE.D3D11CreateDeviceMS&quot;, createDeviceMS);
</del><span class="cx">     }
</span><ins>+#endif
+#endif
</ins><span class="cx"> 
</span><span class="cx">     {
</span><span class="cx">         TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;Renderer11::initialize (ComQueries)&quot;);
</span><span class="lines">@@ -425,29 +597,38 @@
</span><span class="cx"> 
</span><span class="cx">         // On D3D_FEATURE_LEVEL_9_*, IDXGIAdapter::GetDesc returns &quot;Software Adapter&quot; for the description string.
</span><span class="cx">         // If DXGI1.2 is available then IDXGIAdapter2::GetDesc2 can be used to get the actual hardware values.
</span><del>-        if (mFeatureLevel &lt;= D3D_FEATURE_LEVEL_9_3 &amp;&amp; dxgiAdapter2 != NULL)
</del><ins>+        if (mRenderer11DeviceCaps.featureLevel &lt;= D3D_FEATURE_LEVEL_9_3 &amp;&amp; dxgiAdapter2 != NULL)
</ins><span class="cx">         {
</span><del>-            DXGI_ADAPTER_DESC2 adapterDesc2 = { 0 };
-            dxgiAdapter2-&gt;GetDesc2(&amp;adapterDesc2);
-
-            // Copy the contents of the DXGI_ADAPTER_DESC2 into mAdapterDescription (a DXGI_ADAPTER_DESC).
-            memcpy(mAdapterDescription.Description, adapterDesc2.Description, sizeof(mAdapterDescription.Description));
-            mAdapterDescription.VendorId = adapterDesc2.VendorId;
-            mAdapterDescription.DeviceId = adapterDesc2.DeviceId;
-            mAdapterDescription.SubSysId = adapterDesc2.SubSysId;
-            mAdapterDescription.Revision = adapterDesc2.Revision;
-            mAdapterDescription.DedicatedVideoMemory = adapterDesc2.DedicatedVideoMemory;
-            mAdapterDescription.DedicatedSystemMemory = adapterDesc2.DedicatedSystemMemory;
-            mAdapterDescription.SharedSystemMemory = adapterDesc2.SharedSystemMemory;
-            mAdapterDescription.AdapterLuid = adapterDesc2.AdapterLuid;
</del><ins>+            DXGI_ADAPTER_DESC2 adapterDesc2 = {};
+            result = dxgiAdapter2-&gt;GetDesc2(&amp;adapterDesc2);
+            if (SUCCEEDED(result))
+            {
+                // Copy the contents of the DXGI_ADAPTER_DESC2 into mAdapterDescription (a DXGI_ADAPTER_DESC).
+                memcpy(mAdapterDescription.Description, adapterDesc2.Description, sizeof(mAdapterDescription.Description));
+                mAdapterDescription.VendorId = adapterDesc2.VendorId;
+                mAdapterDescription.DeviceId = adapterDesc2.DeviceId;
+                mAdapterDescription.SubSysId = adapterDesc2.SubSysId;
+                mAdapterDescription.Revision = adapterDesc2.Revision;
+                mAdapterDescription.DedicatedVideoMemory = adapterDesc2.DedicatedVideoMemory;
+                mAdapterDescription.DedicatedSystemMemory = adapterDesc2.DedicatedSystemMemory;
+                mAdapterDescription.SharedSystemMemory = adapterDesc2.SharedSystemMemory;
+                mAdapterDescription.AdapterLuid = adapterDesc2.AdapterLuid;
+            }
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            mDxgiAdapter-&gt;GetDesc(&amp;mAdapterDescription);
</del><ins>+            result = mDxgiAdapter-&gt;GetDesc(&amp;mAdapterDescription);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         SafeRelease(dxgiAdapter2);
</span><span class="cx"> 
</span><ins>+        if (FAILED(result))
+        {
+            return egl::Error(EGL_NOT_INITIALIZED,
+                              D3D11_INIT_OTHER_ERROR,
+                              &quot;Could not read DXGI adaptor description.&quot;);
+        }
+
</ins><span class="cx">         memset(mDescription, 0, sizeof(mDescription));
</span><span class="cx">         wcstombs(mDescription, mAdapterDescription.Description, sizeof(mDescription) - 1);
</span><span class="cx"> 
</span><span class="lines">@@ -475,8 +656,8 @@
</span><span class="cx">                 D3D11_MESSAGE_ID_DEVICE_DRAW_RENDERTARGETVIEW_NOT_SET
</span><span class="cx">             };
</span><span class="cx"> 
</span><del>-            D3D11_INFO_QUEUE_FILTER filter = { 0 };
-            filter.DenyList.NumIDs = ArraySize(hideMessages);
</del><ins>+            D3D11_INFO_QUEUE_FILTER filter = {};
+            filter.DenyList.NumIDs         = static_cast&lt;unsigned int&gt;(ArraySize(hideMessages));
</ins><span class="cx">             filter.DenyList.pIDList = hideMessages;
</span><span class="cx"> 
</span><span class="cx">             infoQueue-&gt;AddStorageFilterEntries(&amp;filter);
</span><span class="lines">@@ -494,13 +675,120 @@
</span><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+egl::Error Renderer11::initializeD3DDevice()
+{
+    HRESULT result = S_OK;
+
+    if (!mCreatedWithDeviceEXT)
+    {
+#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
+        PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = nullptr;
+        {
+            SCOPED_ANGLE_HISTOGRAM_TIMER(&quot;GPU.ANGLE.Renderer11InitializeDLLsMS&quot;);
+            TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;Renderer11::initialize (Load DLLs)&quot;);
+            mDxgiModule  = LoadLibrary(TEXT(&quot;dxgi.dll&quot;));
+            mD3d11Module = LoadLibrary(TEXT(&quot;d3d11.dll&quot;));
+            mDCompModule = LoadLibrary(TEXT(&quot;dcomp.dll&quot;));
+
+            if (mD3d11Module == nullptr || mDxgiModule == nullptr)
+            {
+                return egl::Error(EGL_NOT_INITIALIZED, D3D11_INIT_MISSING_DEP,
+                                  &quot;Could not load D3D11 or DXGI library.&quot;);
+            }
+
+            // create the D3D11 device
+            ASSERT(mDevice == nullptr);
+            D3D11CreateDevice = reinterpret_cast&lt;PFN_D3D11_CREATE_DEVICE&gt;(
+                GetProcAddress(mD3d11Module, &quot;D3D11CreateDevice&quot;));
+
+            if (D3D11CreateDevice == nullptr)
+            {
+                return egl::Error(EGL_NOT_INITIALIZED, D3D11_INIT_MISSING_DEP,
+                                  &quot;Could not retrieve D3D11CreateDevice address.&quot;);
+            }
+        }
+#endif
+
+#ifdef _DEBUG
+        {
+            TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;D3D11CreateDevice (Debug)&quot;);
+            result = D3D11CreateDevice(nullptr, mRequestedDriverType, nullptr,
+                                       D3D11_CREATE_DEVICE_DEBUG, mAvailableFeatureLevels.data(),
+                                       static_cast&lt;unsigned int&gt;(mAvailableFeatureLevels.size()),
+                                       D3D11_SDK_VERSION, &amp;mDevice,
+                                       &amp;(mRenderer11DeviceCaps.featureLevel), &amp;mDeviceContext);
+        }
+
+        if (!mDevice || FAILED(result))
+        {
+            ERR(&quot;Failed creating Debug D3D11 device - falling back to release runtime.\n&quot;);
+        }
+
+        if (!mDevice || FAILED(result))
+#endif
+        {
+            SCOPED_ANGLE_HISTOGRAM_TIMER(&quot;GPU.ANGLE.D3D11CreateDeviceMS&quot;);
+            TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;D3D11CreateDevice&quot;);
+
+            result = D3D11CreateDevice(
+                nullptr, mRequestedDriverType, nullptr, 0, mAvailableFeatureLevels.data(),
+                static_cast&lt;unsigned int&gt;(mAvailableFeatureLevels.size()), D3D11_SDK_VERSION,
+                &amp;mDevice, &amp;(mRenderer11DeviceCaps.featureLevel), &amp;mDeviceContext);
+
+            // Cleanup done by destructor
+            if (!mDevice || FAILED(result))
+            {
+                ANGLE_HISTOGRAM_SPARSE_SLOWLY(&quot;GPU.ANGLE.D3D11CreateDeviceError&quot;,
+                                              static_cast&lt;int&gt;(result));
+                return egl::Error(EGL_NOT_INITIALIZED, D3D11_INIT_CREATEDEVICE_ERROR,
+                                  &quot;Could not create D3D11 device.&quot;);
+            }
+        }
+    }
+    else
+    {
+        // We should use the inputted D3D11 device instead
+        void *device     = nullptr;
+        egl::Error error = mEGLDevice-&gt;getDevice(&amp;device);
+        if (error.isError())
+        {
+            return error;
+        }
+
+        ID3D11Device *d3dDevice = reinterpret_cast&lt;ID3D11Device *&gt;(device);
+        if (FAILED(d3dDevice-&gt;GetDeviceRemovedReason()))
+        {
+            return egl::Error(EGL_NOT_INITIALIZED, &quot;Inputted D3D11 device has been lost.&quot;);
+        }
+
+        if (d3dDevice-&gt;GetFeatureLevel() &lt; D3D_FEATURE_LEVEL_9_3)
+        {
+            return egl::Error(EGL_NOT_INITIALIZED,
+                              &quot;Inputted D3D11 device must be Feature Level 9_3 or greater.&quot;);
+        }
+
+        // The Renderer11 adds a ref to the inputted D3D11 device, like D3D11CreateDevice does.
+        mDevice = d3dDevice;
+        mDevice-&gt;AddRef();
+        mDevice-&gt;GetImmediateContext(&amp;mDeviceContext);
+        mRenderer11DeviceCaps.featureLevel = mDevice-&gt;GetFeatureLevel();
+    }
+
+    d3d11::SetDebugName(mDeviceContext, &quot;DeviceContext&quot;);
+
+    return egl::Error(EGL_SUCCESS);
+}
+
</ins><span class="cx"> // do any one-time device initialization
</span><span class="cx"> // NOTE: this is also needed after a device lost/reset
</span><span class="cx"> // to reset the scene status and ensure the default states are reset.
</span><span class="cx"> void Renderer11::initializeDevice()
</span><span class="cx"> {
</span><ins>+    SCOPED_ANGLE_HISTOGRAM_TIMER(&quot;GPU.ANGLE.Renderer11InitializeDeviceMS&quot;);
</ins><span class="cx">     TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;Renderer11::initializeDevice&quot;);
</span><span class="cx"> 
</span><ins>+    populateRenderer11DeviceCaps();
+
</ins><span class="cx">     mStateCache.initialize(mDevice);
</span><span class="cx">     mInputLayoutCache.initialize(mDevice, mDeviceContext);
</span><span class="cx"> 
</span><span class="lines">@@ -518,7 +806,8 @@
</span><span class="cx">     // If automatic trim is enabled, DXGIDevice3::Trim( ) is called for the application
</span><span class="cx">     // automatically when an application is suspended by the OS. This feature is currently
</span><span class="cx">     // only supported for Windows Store applications.
</span><del>-    EGLint enableAutoTrim = attributes.get(EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_FALSE);
</del><ins>+    EGLint enableAutoTrim = static_cast&lt;EGLint&gt;(
+        attributes.get(EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_FALSE));
</ins><span class="cx"> 
</span><span class="cx">     if (enableAutoTrim == EGL_TRUE)
</span><span class="cx">     {
</span><span class="lines">@@ -531,32 +820,97 @@
</span><span class="cx"> 
</span><span class="cx">     const gl::Caps &amp;rendererCaps = getRendererCaps();
</span><span class="cx"> 
</span><del>-    if (getDeviceContext1IfSupported())
-    {
-        D3D11_FEATURE_DATA_D3D11_OPTIONS d3d11Options;
-        mDevice-&gt;CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &amp;d3d11Options, sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS));
-        mSupportsConstantBufferOffsets = (d3d11Options.ConstantBufferOffsetting != FALSE);
-    }
</del><ins>+    mStateManager.initialize(rendererCaps);
</ins><span class="cx"> 
</span><span class="cx">     mForceSetVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits);
</span><span class="cx">     mCurVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits);
</span><ins>+    mSamplerMetadataVS.initData(rendererCaps.maxVertexTextureImageUnits);
</ins><span class="cx"> 
</span><span class="cx">     mForceSetPixelSamplerStates.resize(rendererCaps.maxTextureImageUnits);
</span><span class="cx">     mCurPixelSamplerStates.resize(rendererCaps.maxTextureImageUnits);
</span><ins>+    mSamplerMetadataPS.initData(rendererCaps.maxTextureImageUnits);
</ins><span class="cx"> 
</span><del>-    mCurVertexSRVs.resize(rendererCaps.maxVertexTextureImageUnits);
-    mCurPixelSRVs.resize(rendererCaps.maxTextureImageUnits);
</del><ins>+    mStateManager.initialize(rendererCaps);
</ins><span class="cx"> 
</span><span class="cx">     markAllStateDirty();
</span><ins>+
+    // Gather stats on DXGI and D3D feature level
+    ANGLE_HISTOGRAM_BOOLEAN(&quot;GPU.ANGLE.SupportsDXGI1_2&quot;, mRenderer11DeviceCaps.supportsDXGI1_2);
+
+    ANGLEFeatureLevel angleFeatureLevel = GetANGLEFeatureLevel(mRenderer11DeviceCaps.featureLevel);
+
+    // We don't actually request a 11_1 device, because of complications with the platform
+    // update. Instead we check if the mDeviceContext1 pointer cast succeeded.
+    // Note: we should support D3D11_0 always, but we aren't guaranteed to be at FL11_0
+    // because the app can specify a lower version (such as 9_3) on Display creation.
+    if (mDeviceContext1 != nullptr)
+    {
+        angleFeatureLevel = ANGLE_FEATURE_LEVEL_11_1;
+    }
+
+    ANGLE_HISTOGRAM_ENUMERATION(&quot;GPU.ANGLE.D3D11FeatureLevel&quot;,
+                                angleFeatureLevel,
+                                NUM_ANGLE_FEATURE_LEVELS);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Renderer11::populateRenderer11DeviceCaps()
+{
+    HRESULT hr = S_OK;
+
+    if (mDeviceContext1)
+    {
+        D3D11_FEATURE_DATA_D3D11_OPTIONS d3d11Options;
+        HRESULT result = mDevice-&gt;CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &amp;d3d11Options, sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS));
+        if (SUCCEEDED(result))
+        {
+            mRenderer11DeviceCaps.supportsClearView = (d3d11Options.ClearView != FALSE);
+            mRenderer11DeviceCaps.supportsConstantBufferOffsets = (d3d11Options.ConstantBufferOffsetting != FALSE);
+        }
+    }
+
+    hr = mDevice-&gt;CheckFormatSupport(DXGI_FORMAT_B5G6R5_UNORM, &amp;(mRenderer11DeviceCaps.B5G6R5support));
+    if (FAILED(hr))
+    {
+        mRenderer11DeviceCaps.B5G6R5support = 0;
+    }
+
+    hr = mDevice-&gt;CheckFormatSupport(DXGI_FORMAT_B4G4R4A4_UNORM, &amp;(mRenderer11DeviceCaps.B4G4R4A4support));
+    if (FAILED(hr))
+    {
+        mRenderer11DeviceCaps.B4G4R4A4support = 0;
+    }
+
+    hr = mDevice-&gt;CheckFormatSupport(DXGI_FORMAT_B5G5R5A1_UNORM, &amp;(mRenderer11DeviceCaps.B5G5R5A1support));
+    if (FAILED(hr))
+    {
+        mRenderer11DeviceCaps.B5G5R5A1support = 0;
+    }
+
+    IDXGIAdapter2 *dxgiAdapter2 = d3d11::DynamicCastComObject&lt;IDXGIAdapter2&gt;(mDxgiAdapter);
+    mRenderer11DeviceCaps.supportsDXGI1_2 = (dxgiAdapter2 != nullptr);
+    SafeRelease(dxgiAdapter2);
+}
+
</ins><span class="cx"> egl::ConfigSet Renderer11::generateConfigs() const
</span><span class="cx"> {
</span><del>-    static const GLenum colorBufferFormats[] =
</del><ins>+    std::vector&lt;GLenum&gt; colorBufferFormats;
+
+    // 32-bit supported formats
+    colorBufferFormats.push_back(GL_BGRA8_EXT);
+    colorBufferFormats.push_back(GL_RGBA8_OES);
+
+    // 24-bit supported formats
+    colorBufferFormats.push_back(GL_RGB8_OES);
+
+    if (!mPresentPathFastEnabled)
</ins><span class="cx">     {
</span><del>-        GL_BGRA8_EXT,
-        GL_RGBA8_OES,
-    };
</del><ins>+        // 16-bit supported formats
+        // These aren't valid D3D11 swapchain formats, so don't expose them as configs
+        // if present path fast is active
+        colorBufferFormats.push_back(GL_RGBA4);
+        colorBufferFormats.push_back(GL_RGB5_A1);
+        colorBufferFormats.push_back(GL_RGB565);
+    }
</ins><span class="cx"> 
</span><span class="cx">     static const GLenum depthStencilBufferFormats[] =
</span><span class="cx">     {
</span><span class="lines">@@ -568,64 +922,87 @@
</span><span class="cx">     const gl::Caps &amp;rendererCaps = getRendererCaps();
</span><span class="cx">     const gl::TextureCapsMap &amp;rendererTextureCaps = getRendererTextureCaps();
</span><span class="cx"> 
</span><ins>+    const EGLint optimalSurfaceOrientation =
+        mPresentPathFastEnabled ? 0 : EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE;
+
</ins><span class="cx">     egl::ConfigSet configs;
</span><del>-    for (size_t formatIndex = 0; formatIndex &lt; ArraySize(colorBufferFormats); formatIndex++)
</del><ins>+    for (GLenum colorBufferInternalFormat : colorBufferFormats)
</ins><span class="cx">     {
</span><del>-        GLenum colorBufferInternalFormat = colorBufferFormats[formatIndex];
</del><span class="cx">         const gl::TextureCaps &amp;colorBufferFormatCaps = rendererTextureCaps.get(colorBufferInternalFormat);
</span><del>-        if (colorBufferFormatCaps.renderable)
</del><ins>+        if (!colorBufferFormatCaps.renderable)
</ins><span class="cx">         {
</span><del>-            for (size_t depthStencilIndex = 0; depthStencilIndex &lt; ArraySize(depthStencilBufferFormats); depthStencilIndex++)
</del><ins>+            continue;
+        }
+
+        for (GLenum depthStencilBufferInternalFormat : depthStencilBufferFormats)
+        {
+            const gl::TextureCaps &amp;depthStencilBufferFormatCaps =
+                rendererTextureCaps.get(depthStencilBufferInternalFormat);
+            if (!depthStencilBufferFormatCaps.renderable &amp;&amp;
+                depthStencilBufferInternalFormat != GL_NONE)
</ins><span class="cx">             {
</span><del>-                GLenum depthStencilBufferInternalFormat = depthStencilBufferFormats[depthStencilIndex];
-                const gl::TextureCaps &amp;depthStencilBufferFormatCaps = rendererTextureCaps.get(depthStencilBufferInternalFormat);
-                if (depthStencilBufferFormatCaps.renderable || depthStencilBufferInternalFormat == GL_NONE)
-                {
-                    const gl::InternalFormat &amp;colorBufferFormatInfo = gl::GetInternalFormatInfo(colorBufferInternalFormat);
-                    const gl::InternalFormat &amp;depthStencilBufferFormatInfo = gl::GetInternalFormatInfo(depthStencilBufferInternalFormat);
</del><ins>+                continue;
+            }
</ins><span class="cx"> 
</span><del>-                    egl::Config config;
-                    config.renderTargetFormat = colorBufferInternalFormat;
-                    config.depthStencilFormat = depthStencilBufferInternalFormat;
-                    config.bufferSize = colorBufferFormatInfo.pixelBytes * 8;
-                    config.redSize = colorBufferFormatInfo.redBits;
-                    config.greenSize = colorBufferFormatInfo.greenBits;
-                    config.blueSize = colorBufferFormatInfo.blueBits;
-                    config.luminanceSize = colorBufferFormatInfo.luminanceBits;
-                    config.alphaSize = colorBufferFormatInfo.alphaBits;
-                    config.alphaMaskSize = 0;
-                    config.bindToTextureRGB = (colorBufferFormatInfo.format == GL_RGB);
-                    config.bindToTextureRGBA = (colorBufferFormatInfo.format == GL_RGBA || colorBufferFormatInfo.format == GL_BGRA_EXT);
-                    config.colorBufferType = EGL_RGB_BUFFER;
-                    config.configCaveat = EGL_NONE;
-                    config.configID = static_cast&lt;EGLint&gt;(configs.size() + 1);
-                    // Can only support a conformant ES2 with feature level greater than 10.0.
-                    config.conformant = (mFeatureLevel &gt;= D3D_FEATURE_LEVEL_10_0) ? (EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT_KHR) : EGL_NONE;
-                    config.depthSize = depthStencilBufferFormatInfo.depthBits;
-                    config.level = 0;
-                    config.matchNativePixmap = EGL_NONE;
-                    config.maxPBufferWidth = rendererCaps.max2DTextureSize;
-                    config.maxPBufferHeight = rendererCaps.max2DTextureSize;
-                    config.maxPBufferPixels = rendererCaps.max2DTextureSize * rendererCaps.max2DTextureSize;
-                    config.maxSwapInterval = 4;
-                    config.minSwapInterval = 0;
-                    config.nativeRenderable = EGL_FALSE;
-                    config.nativeVisualID = 0;
-                    config.nativeVisualType = EGL_NONE;
-                    // Can't support ES3 at all without feature level 10.0
-                    config.renderableType = EGL_OPENGL_ES2_BIT | ((mFeatureLevel &gt;= D3D_FEATURE_LEVEL_10_0) ? EGL_OPENGL_ES3_BIT_KHR : 0);
-                    config.sampleBuffers = 0; // FIXME: enumerate multi-sampling
-                    config.samples = 0;
-                    config.stencilSize = depthStencilBufferFormatInfo.stencilBits;
-                    config.surfaceType = EGL_PBUFFER_BIT | EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
-                    config.transparentType = EGL_NONE;
-                    config.transparentRedValue = 0;
-                    config.transparentGreenValue = 0;
-                    config.transparentBlueValue = 0;
</del><ins>+            const gl::InternalFormat &amp;colorBufferFormatInfo =
+                gl::GetInternalFormatInfo(colorBufferInternalFormat);
+            const gl::InternalFormat &amp;depthStencilBufferFormatInfo =
+                gl::GetInternalFormatInfo(depthStencilBufferInternalFormat);
</ins><span class="cx"> 
</span><del>-                    configs.add(config);
-                }
</del><ins>+            egl::Config config;
+            config.renderTargetFormat = colorBufferInternalFormat;
+            config.depthStencilFormat = depthStencilBufferInternalFormat;
+            config.bufferSize         = colorBufferFormatInfo.pixelBytes * 8;
+            config.redSize            = colorBufferFormatInfo.redBits;
+            config.greenSize          = colorBufferFormatInfo.greenBits;
+            config.blueSize           = colorBufferFormatInfo.blueBits;
+            config.luminanceSize      = colorBufferFormatInfo.luminanceBits;
+            config.alphaSize          = colorBufferFormatInfo.alphaBits;
+            config.alphaMaskSize      = 0;
+            config.bindToTextureRGB   = (colorBufferFormatInfo.format == GL_RGB);
+            config.bindToTextureRGBA = (colorBufferFormatInfo.format == GL_RGBA ||
+                                        colorBufferFormatInfo.format == GL_BGRA_EXT);
+            config.colorBufferType = EGL_RGB_BUFFER;
+            config.configCaveat    = EGL_NONE;
+            config.configID        = static_cast&lt;EGLint&gt;(configs.size() + 1);
+            // Can only support a conformant ES2 with feature level greater than 10.0.
+            config.conformant = (mRenderer11DeviceCaps.featureLevel &gt;= D3D_FEATURE_LEVEL_10_0)
+                                    ? (EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT_KHR)
+                                    : 0;
+
+            // PresentPathFast may not be conformant
+            if (mPresentPathFastEnabled)
+            {
+                config.conformant = 0;
</ins><span class="cx">             }
</span><ins>+
+            config.depthSize         = depthStencilBufferFormatInfo.depthBits;
+            config.level             = 0;
+            config.matchNativePixmap = EGL_NONE;
+            config.maxPBufferWidth   = rendererCaps.max2DTextureSize;
+            config.maxPBufferHeight  = rendererCaps.max2DTextureSize;
+            config.maxPBufferPixels  = rendererCaps.max2DTextureSize * rendererCaps.max2DTextureSize;
+            config.maxSwapInterval   = 4;
+            config.minSwapInterval   = 0;
+            config.nativeRenderable  = EGL_FALSE;
+            config.nativeVisualID    = 0;
+            config.nativeVisualType  = EGL_NONE;
+            // Can't support ES3 at all without feature level 10.0
+            config.renderableType =
+                EGL_OPENGL_ES2_BIT | ((mRenderer11DeviceCaps.featureLevel &gt;= D3D_FEATURE_LEVEL_10_0)
+                                          ? EGL_OPENGL_ES3_BIT_KHR
+                                          : 0);
+            config.sampleBuffers         = 0;  // FIXME: enumerate multi-sampling
+            config.samples               = 0;
+            config.stencilSize           = depthStencilBufferFormatInfo.stencilBits;
+            config.surfaceType           = EGL_PBUFFER_BIT | EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
+            config.transparentType       = EGL_NONE;
+            config.transparentRedValue   = 0;
+            config.transparentGreenValue = 0;
+            config.transparentBlueValue  = 0;
+            config.optimalOrientation    = optimalSurfaceOrientation;
+
+            configs.add(config);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -633,6 +1010,44 @@
</span><span class="cx">     return configs;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const
+{
+    outExtensions-&gt;createContextRobustness = true;
+
+    if (getShareHandleSupport())
+    {
+        outExtensions-&gt;d3dShareHandleClientBuffer     = true;
+        outExtensions-&gt;surfaceD3DTexture2DShareHandle = true;
+    }
+
+    outExtensions-&gt;keyedMutex = true;
+    outExtensions-&gt;querySurfacePointer = true;
+    outExtensions-&gt;windowFixedSize     = true;
+
+    // If present path fast is active then the surface orientation extension isn't supported
+    outExtensions-&gt;surfaceOrientation = !mPresentPathFastEnabled;
+
+    // D3D11 does not support present with dirty rectangles until DXGI 1.2.
+    outExtensions-&gt;postSubBuffer = mRenderer11DeviceCaps.supportsDXGI1_2;
+
+    outExtensions-&gt;createContext = true;
+
+    outExtensions-&gt;deviceQuery = true;
+
+    outExtensions-&gt;createContextNoError = true;
+
+    outExtensions-&gt;image                 = true;
+    outExtensions-&gt;imageBase             = true;
+    outExtensions-&gt;glTexture2DImage      = true;
+    outExtensions-&gt;glTextureCubemapImage = true;
+    outExtensions-&gt;glRenderbufferImage   = true;
+
+    outExtensions-&gt;stream = true;
+
+    outExtensions-&gt;flexibleSurfaceCompatibility = true;
+    outExtensions-&gt;directComposition            = !!mDCompModule;
+}
+
</ins><span class="cx"> gl::Error Renderer11::flush()
</span><span class="cx"> {
</span><span class="cx">     mDeviceContext-&gt;Flush();
</span><span class="lines">@@ -682,40 +1097,28 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Renderer11::shouldCreateChildWindowForSurface(EGLNativeWindowType window) const
</del><ins>+SwapChainD3D *Renderer11::createSwapChain(NativeWindow nativeWindow,
+                                          HANDLE shareHandle,
+                                          GLenum backBufferFormat,
+                                          GLenum depthBufferFormat,
+                                          EGLint orientation)
</ins><span class="cx"> {
</span><del>-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
-    // In order to create a swap chain for an HWND owned by another process, DXGI 1.2 is required.
-    // The easiest way to check is to query for a IDXGIDevice2.
-    DWORD currentProcessId = GetCurrentProcessId();
-    DWORD wndProcessId;
-    GetWindowThreadProcessId(window, &amp;wndProcessId);
-    if (currentProcessId == wndProcessId)
</del><ins>+    return new SwapChain11(this, nativeWindow, shareHandle, backBufferFormat, depthBufferFormat,
+                           orientation);
+}
+
+CompilerImpl *Renderer11::createCompiler()
+{
+    if (mRenderer11DeviceCaps.featureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
</ins><span class="cx">     {
</span><del>-        // Window is from this process, can always create a swap chain for it
-        return false;
</del><ins>+        return new CompilerD3D(SH_HLSL_4_0_FL9_3_OUTPUT);
</ins><span class="cx">     }
</span><del>-
-    IDXGIDevice2 *dxgiDevice2 = d3d11::DynamicCastComObject&lt;IDXGIDevice2&gt;(mDevice);
-    if (dxgiDevice2 != nullptr)
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        // DXGI 1.2 is available, can create a swap chain for this cross-process window
-        SafeRelease(dxgiDevice2);
-        return false;
</del><ins>+        return new CompilerD3D(SH_HLSL_4_1_OUTPUT);
</ins><span class="cx">     }
</span><del>-
-    // DXGI 1.2 is not available, need to create a child window.
-    return true;
-#else
-    return false;
-#endif
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-SwapChainD3D *Renderer11::createSwapChain(NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
-{
-    return new SwapChain11(this, nativeWindow, shareHandle, backBufferFormat, depthBufferFormat);
-}
-
</del><span class="cx"> void *Renderer11::getD3DDevice()
</span><span class="cx"> {
</span><span class="cx">     return reinterpret_cast&lt;void*&gt;(mDevice);
</span><span class="lines">@@ -738,10 +1141,10 @@
</span><span class="cx">         if (texStorage)
</span><span class="cx">         {
</span><span class="cx">             TextureStorage11 *storage11 = GetAs&lt;TextureStorage11&gt;(texStorage);
</span><del>-            error = storage11-&gt;generateSwizzles(texture-&gt;getSamplerState().swizzleRed,
-                                                texture-&gt;getSamplerState().swizzleGreen,
-                                                texture-&gt;getSamplerState().swizzleBlue,
-                                                texture-&gt;getSamplerState().swizzleAlpha);
</del><ins>+            const gl::TextureState &amp;textureState = texture-&gt;getTextureState();
+            error =
+                storage11-&gt;generateSwizzles(textureState.swizzleRed, textureState.swizzleGreen,
+                                            textureState.swizzleBlue, textureState.swizzleAlpha);
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 return error;
</span><span class="lines">@@ -752,11 +1155,13 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::setSamplerState(gl::SamplerType type, int index, gl::Texture *texture, const gl::SamplerState &amp;samplerStateParam)
</del><ins>+gl::Error Renderer11::setSamplerState(gl::SamplerType type,
+                                      int index,
+                                      gl::Texture *texture,
+                                      const gl::SamplerState &amp;samplerState)
</ins><span class="cx"> {
</span><span class="cx">     // Make sure to add the level offset for our tiny compressed texture workaround
</span><span class="cx">     TextureD3D *textureD3D = GetImplAs&lt;TextureD3D&gt;(texture);
</span><del>-    gl::SamplerState samplerStateInternal = samplerStateParam;
</del><span class="cx"> 
</span><span class="cx">     TextureStorage *storage = nullptr;
</span><span class="cx">     gl::Error error = textureD3D-&gt;getNativeTexture(&amp;storage);
</span><span class="lines">@@ -768,16 +1173,20 @@
</span><span class="cx">     // Storage should exist, texture should be complete
</span><span class="cx">     ASSERT(storage);
</span><span class="cx"> 
</span><del>-    samplerStateInternal.baseLevel += storage-&gt;getTopLevel();
</del><ins>+    // Sampler metadata that's passed to shaders in uniforms is stored separately from rest of the
+    // sampler state since having it in contiguous memory makes it possible to memcpy to a constant
+    // buffer, and it doesn't affect the state set by PSSetSamplers/VSSetSamplers.
+    SamplerMetadataD3D11 *metadata = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     if (type == gl::SAMPLER_PIXEL)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(static_cast&lt;unsigned int&gt;(index) &lt; getRendererCaps().maxTextureImageUnits);
</span><span class="cx"> 
</span><del>-        if (mForceSetPixelSamplerStates[index] || memcmp(&amp;samplerStateInternal, &amp;mCurPixelSamplerStates[index], sizeof(gl::SamplerState)) != 0)
</del><ins>+        if (mForceSetPixelSamplerStates[index] ||
+            memcmp(&amp;samplerState, &amp;mCurPixelSamplerStates[index], sizeof(gl::SamplerState)) != 0)
</ins><span class="cx">         {
</span><span class="cx">             ID3D11SamplerState *dxSamplerState = NULL;
</span><del>-            error = mStateCache.getSamplerState(samplerStateInternal, &amp;dxSamplerState);
</del><ins>+            error = mStateCache.getSamplerState(samplerState, &amp;dxSamplerState);
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 return error;
</span><span class="lines">@@ -786,19 +1195,22 @@
</span><span class="cx">             ASSERT(dxSamplerState != NULL);
</span><span class="cx">             mDeviceContext-&gt;PSSetSamplers(index, 1, &amp;dxSamplerState);
</span><span class="cx"> 
</span><del>-            mCurPixelSamplerStates[index] = samplerStateInternal;
</del><ins>+            mCurPixelSamplerStates[index] = samplerState;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         mForceSetPixelSamplerStates[index] = false;
</span><ins>+
+        metadata = &amp;mSamplerMetadataPS;
</ins><span class="cx">     }
</span><span class="cx">     else if (type == gl::SAMPLER_VERTEX)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(static_cast&lt;unsigned int&gt;(index) &lt; getRendererCaps().maxVertexTextureImageUnits);
</span><span class="cx"> 
</span><del>-        if (mForceSetVertexSamplerStates[index] || memcmp(&amp;samplerStateInternal, &amp;mCurVertexSamplerStates[index], sizeof(gl::SamplerState)) != 0)
</del><ins>+        if (mForceSetVertexSamplerStates[index] ||
+            memcmp(&amp;samplerState, &amp;mCurVertexSamplerStates[index], sizeof(gl::SamplerState)) != 0)
</ins><span class="cx">         {
</span><span class="cx">             ID3D11SamplerState *dxSamplerState = NULL;
</span><del>-            error = mStateCache.getSamplerState(samplerStateInternal, &amp;dxSamplerState);
</del><ins>+            error = mStateCache.getSamplerState(samplerState, &amp;dxSamplerState);
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 return error;
</span><span class="lines">@@ -807,13 +1219,18 @@
</span><span class="cx">             ASSERT(dxSamplerState != NULL);
</span><span class="cx">             mDeviceContext-&gt;VSSetSamplers(index, 1, &amp;dxSamplerState);
</span><span class="cx"> 
</span><del>-            mCurVertexSamplerStates[index] = samplerStateInternal;
</del><ins>+            mCurVertexSamplerStates[index] = samplerState;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         mForceSetVertexSamplerStates[index] = false;
</span><ins>+
+        metadata = &amp;mSamplerMetadataVS;
</ins><span class="cx">     }
</span><span class="cx">     else UNREACHABLE();
</span><span class="cx"> 
</span><ins>+    ASSERT(metadata != nullptr);
+    metadata-&gt;update(index, *texture);
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -838,10 +1255,10 @@
</span><span class="cx">         TextureStorage11 *storage11 = GetAs&lt;TextureStorage11&gt;(texStorage);
</span><span class="cx"> 
</span><span class="cx">         // Make sure to add the level offset for our tiny compressed texture workaround
</span><del>-        gl::SamplerState samplerState = texture-&gt;getSamplerState();
-        samplerState.baseLevel += storage11-&gt;getTopLevel();
</del><ins>+        gl::TextureState textureState = texture-&gt;getTextureState();
+        textureState.baseLevel += storage11-&gt;getTopLevel();
</ins><span class="cx"> 
</span><del>-        error = storage11-&gt;getSRV(samplerState, &amp;textureSRV);
</del><ins>+        error = storage11-&gt;getSRV(textureState, &amp;textureSRV);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -857,16 +1274,16 @@
</span><span class="cx">     ASSERT((type == gl::SAMPLER_PIXEL &amp;&amp; static_cast&lt;unsigned int&gt;(index) &lt; getRendererCaps().maxTextureImageUnits) ||
</span><span class="cx">            (type == gl::SAMPLER_VERTEX &amp;&amp; static_cast&lt;unsigned int&gt;(index) &lt; getRendererCaps().maxVertexTextureImageUnits));
</span><span class="cx"> 
</span><del>-    setShaderResource(type, index, textureSRV);
</del><ins>+    mStateManager.setShaderResource(type, index, textureSRV);
</ins><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Renderer11::setUniformBuffers(const gl::Data &amp;data,
</span><del>-                                        const GLint vertexUniformBuffers[],
-                                        const GLint fragmentUniformBuffers[])
</del><ins>+                                        const std::vector&lt;GLint&gt; &amp;vertexUniformBuffers,
+                                        const std::vector&lt;GLint&gt; &amp;fragmentUniformBuffers)
</ins><span class="cx"> {
</span><del>-    for (unsigned int uniformBufferIndex = 0; uniformBufferIndex &lt; data.caps-&gt;maxVertexUniformBlocks; uniformBufferIndex++)
</del><ins>+    for (size_t uniformBufferIndex = 0; uniformBufferIndex &lt; vertexUniformBuffers.size(); uniformBufferIndex++)
</ins><span class="cx">     {
</span><span class="cx">         GLint binding = vertexUniformBuffers[uniformBufferIndex];
</span><span class="cx"> 
</span><span class="lines">@@ -875,22 +1292,34 @@
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        gl::Buffer *uniformBuffer = data.state-&gt;getIndexedUniformBuffer(binding);
-        GLintptr uniformBufferOffset = data.state-&gt;getIndexedUniformBufferOffset(binding);
-        GLsizeiptr uniformBufferSize = data.state-&gt;getIndexedUniformBufferSize(binding);
</del><ins>+        const OffsetBindingPointer&lt;gl::Buffer&gt; &amp;uniformBuffer =
+            data.state-&gt;getIndexedUniformBuffer(binding);
+        GLintptr uniformBufferOffset = uniformBuffer.getOffset();
+        GLsizeiptr uniformBufferSize = uniformBuffer.getSize();
</ins><span class="cx"> 
</span><del>-        if (uniformBuffer)
</del><ins>+        if (uniformBuffer.get() != nullptr)
</ins><span class="cx">         {
</span><del>-            Buffer11 *bufferStorage = GetImplAs&lt;Buffer11&gt;(uniformBuffer);
</del><ins>+            Buffer11 *bufferStorage = GetImplAs&lt;Buffer11&gt;(uniformBuffer.get());
</ins><span class="cx">             ID3D11Buffer *constantBuffer;
</span><span class="cx"> 
</span><del>-            if (mSupportsConstantBufferOffsets)
</del><ins>+            if (mRenderer11DeviceCaps.supportsConstantBufferOffsets)
</ins><span class="cx">             {
</span><del>-                constantBuffer = bufferStorage-&gt;getBuffer(BUFFER_USAGE_UNIFORM);
</del><ins>+                auto bufferOrError = bufferStorage-&gt;getBuffer(BUFFER_USAGE_UNIFORM);
+                if (bufferOrError.isError())
+                {
+                    return bufferOrError.getError();
+                }
+                constantBuffer = bufferOrError.getResult();
</ins><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><del>-                constantBuffer = bufferStorage-&gt;getConstantBufferRange(uniformBufferOffset, uniformBufferSize);
</del><ins>+                auto bufferOrError =
+                    bufferStorage-&gt;getConstantBufferRange(uniformBufferOffset, uniformBufferSize);
+                if (bufferOrError.isError())
+                {
+                    return bufferOrError.getError();
+                }
+                constantBuffer = bufferOrError.getResult();
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (!constantBuffer)
</span><span class="lines">@@ -902,17 +1331,21 @@
</span><span class="cx">                 mCurrentConstantBufferVSOffset[uniformBufferIndex] != uniformBufferOffset ||
</span><span class="cx">                 mCurrentConstantBufferVSSize[uniformBufferIndex] != uniformBufferSize)
</span><span class="cx">             {
</span><del>-                if (mSupportsConstantBufferOffsets &amp;&amp; uniformBufferSize != 0)
</del><ins>+                if (mRenderer11DeviceCaps.supportsConstantBufferOffsets &amp;&amp; uniformBufferSize != 0)
</ins><span class="cx">                 {
</span><span class="cx">                     UINT firstConstant = 0, numConstants = 0;
</span><span class="cx">                     CalculateConstantBufferParams(uniformBufferOffset, uniformBufferSize, &amp;firstConstant, &amp;numConstants);
</span><del>-                    mDeviceContext1-&gt;VSSetConstantBuffers1(getReservedVertexUniformBuffers() + uniformBufferIndex,
-                                                           1, &amp;constantBuffer, &amp;firstConstant, &amp;numConstants);
</del><ins>+                    mDeviceContext1-&gt;VSSetConstantBuffers1(
+                        getReservedVertexUniformBuffers() +
+                            static_cast&lt;unsigned int&gt;(uniformBufferIndex),
+                        1, &amp;constantBuffer, &amp;firstConstant, &amp;numConstants);
</ins><span class="cx">                 }
</span><span class="cx">                 else
</span><span class="cx">                 {
</span><del>-                    mDeviceContext-&gt;VSSetConstantBuffers(getReservedVertexUniformBuffers() + uniformBufferIndex,
-                                                         1, &amp;constantBuffer);
</del><ins>+                    mDeviceContext-&gt;VSSetConstantBuffers(
+                        getReservedVertexUniformBuffers() +
+                            static_cast&lt;unsigned int&gt;(uniformBufferIndex),
+                        1, &amp;constantBuffer);
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 mCurrentConstantBufferVS[uniformBufferIndex] = bufferStorage-&gt;getSerial();
</span><span class="lines">@@ -922,7 +1355,7 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (unsigned int uniformBufferIndex = 0; uniformBufferIndex &lt; data.caps-&gt;maxFragmentUniformBlocks; uniformBufferIndex++)
</del><ins>+    for (size_t uniformBufferIndex = 0; uniformBufferIndex &lt; fragmentUniformBuffers.size(); uniformBufferIndex++)
</ins><span class="cx">     {
</span><span class="cx">         GLint binding = fragmentUniformBuffers[uniformBufferIndex];
</span><span class="cx"> 
</span><span class="lines">@@ -931,22 +1364,34 @@
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        gl::Buffer *uniformBuffer = data.state-&gt;getIndexedUniformBuffer(binding);
-        GLintptr uniformBufferOffset = data.state-&gt;getIndexedUniformBufferOffset(binding);
-        GLsizeiptr uniformBufferSize = data.state-&gt;getIndexedUniformBufferSize(binding);
</del><ins>+        const OffsetBindingPointer&lt;gl::Buffer&gt; &amp;uniformBuffer =
+            data.state-&gt;getIndexedUniformBuffer(binding);
+        GLintptr uniformBufferOffset = uniformBuffer.getOffset();
+        GLsizeiptr uniformBufferSize = uniformBuffer.getSize();
</ins><span class="cx"> 
</span><del>-        if (uniformBuffer)
</del><ins>+        if (uniformBuffer.get() != nullptr)
</ins><span class="cx">         {
</span><del>-            Buffer11 *bufferStorage = GetImplAs&lt;Buffer11&gt;(uniformBuffer);
</del><ins>+            Buffer11 *bufferStorage = GetImplAs&lt;Buffer11&gt;(uniformBuffer.get());
</ins><span class="cx">             ID3D11Buffer *constantBuffer;
</span><span class="cx"> 
</span><del>-            if (mSupportsConstantBufferOffsets)
</del><ins>+            if (mRenderer11DeviceCaps.supportsConstantBufferOffsets)
</ins><span class="cx">             {
</span><del>-                constantBuffer = bufferStorage-&gt;getBuffer(BUFFER_USAGE_UNIFORM);
</del><ins>+                auto bufferOrError = bufferStorage-&gt;getBuffer(BUFFER_USAGE_UNIFORM);
+                if (bufferOrError.isError())
+                {
+                    return bufferOrError.getError();
+                }
+                constantBuffer = bufferOrError.getResult();
</ins><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><del>-                constantBuffer = bufferStorage-&gt;getConstantBufferRange(uniformBufferOffset, uniformBufferSize);
</del><ins>+                auto bufferOrError =
+                    bufferStorage-&gt;getConstantBufferRange(uniformBufferOffset, uniformBufferSize);
+                if (bufferOrError.isError())
+                {
+                    return bufferOrError.getError();
+                }
+                constantBuffer = bufferOrError.getResult();
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             if (!constantBuffer)
</span><span class="lines">@@ -958,17 +1403,21 @@
</span><span class="cx">                 mCurrentConstantBufferPSOffset[uniformBufferIndex] != uniformBufferOffset ||
</span><span class="cx">                 mCurrentConstantBufferPSSize[uniformBufferIndex] != uniformBufferSize)
</span><span class="cx">             {
</span><del>-                if (mSupportsConstantBufferOffsets &amp;&amp; uniformBufferSize != 0)
</del><ins>+                if (mRenderer11DeviceCaps.supportsConstantBufferOffsets &amp;&amp; uniformBufferSize != 0)
</ins><span class="cx">                 {
</span><span class="cx">                     UINT firstConstant = 0, numConstants = 0;
</span><span class="cx">                     CalculateConstantBufferParams(uniformBufferOffset, uniformBufferSize, &amp;firstConstant, &amp;numConstants);
</span><del>-                    mDeviceContext1-&gt;PSSetConstantBuffers1(getReservedFragmentUniformBuffers() + uniformBufferIndex,
-                                                           1, &amp;constantBuffer, &amp;firstConstant, &amp;numConstants);
</del><ins>+                    mDeviceContext1-&gt;PSSetConstantBuffers1(
+                        getReservedFragmentUniformBuffers() +
+                            static_cast&lt;unsigned int&gt;(uniformBufferIndex),
+                        1, &amp;constantBuffer, &amp;firstConstant, &amp;numConstants);
</ins><span class="cx">                 }
</span><span class="cx">                 else
</span><span class="cx">                 {
</span><del>-                    mDeviceContext-&gt;PSSetConstantBuffers(getReservedFragmentUniformBuffers() + uniformBufferIndex,
-                                                         1, &amp;constantBuffer);
</del><ins>+                    mDeviceContext-&gt;PSSetConstantBuffers(
+                        getReservedFragmentUniformBuffers() +
+                            static_cast&lt;unsigned int&gt;(uniformBufferIndex),
+                        1, &amp;constantBuffer);
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 mCurrentConstantBufferPS[uniformBufferIndex] = bufferStorage-&gt;getSerial();
</span><span class="lines">@@ -981,229 +1430,60 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::setRasterizerState(const gl::RasterizerState &amp;rasterState)
</del><ins>+gl::Error Renderer11::updateState(const gl::Data &amp;data, GLenum drawMode)
</ins><span class="cx"> {
</span><del>-    if (mForceSetRasterState || memcmp(&amp;rasterState, &amp;mCurRasterState, sizeof(gl::RasterizerState)) != 0)
</del><ins>+    // Applies the render target surface, depth stencil surface, viewport rectangle and
+    // scissor rectangle to the renderer
+    const gl::Framebuffer *framebufferObject = data.state-&gt;getDrawFramebuffer();
+    ASSERT(framebufferObject &amp;&amp; framebufferObject-&gt;checkStatus(data) == GL_FRAMEBUFFER_COMPLETE);
+    gl::Error error = applyRenderTarget(framebufferObject);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        ID3D11RasterizerState *dxRasterState = NULL;
-        gl::Error error = mStateCache.getRasterizerState(rasterState, mScissorEnabled, &amp;dxRasterState);
-        if (error.isError())
-        {
-            return error;
-        }
-
-        mDeviceContext-&gt;RSSetState(dxRasterState);
-
-        mCurRasterState = rasterState;
</del><ins>+        return error;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mForceSetRasterState = false;
</del><ins>+    // Set the present path state
+    const bool presentPathFastActive =
+        UsePresentPathFast(this, framebufferObject-&gt;getFirstColorbuffer());
+    mStateManager.updatePresentPath(presentPathFastActive,
+                                    framebufferObject-&gt;getFirstColorbuffer());
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
-}
</del><ins>+    // Setting viewport state
+    mStateManager.setViewport(data.caps, data.state-&gt;getViewport(), data.state-&gt;getNearPlane(),
+                              data.state-&gt;getFarPlane());
</ins><span class="cx"> 
</span><del>-gl::Error Renderer11::setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &amp;blendState, const gl::ColorF &amp;blendColor,
-                                    unsigned int sampleMask)
-{
-    if (mForceSetBlendState ||
-        memcmp(&amp;blendState, &amp;mCurBlendState, sizeof(gl::BlendState)) != 0 ||
-        memcmp(&amp;blendColor, &amp;mCurBlendColor, sizeof(gl::ColorF)) != 0 ||
-        sampleMask != mCurSampleMask)
-    {
-        ID3D11BlendState *dxBlendState = NULL;
-        gl::Error error = mStateCache.getBlendState(framebuffer, blendState, &amp;dxBlendState);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+    // Setting scissor state
+    mStateManager.setScissorRectangle(data.state-&gt;getScissor(), data.state-&gt;isScissorTestEnabled());
</ins><span class="cx"> 
</span><del>-        ASSERT(dxBlendState != NULL);
</del><ins>+    // Applying rasterizer state to D3D11 device
+    int samples                    = framebufferObject-&gt;getSamples(data);
+    gl::RasterizerState rasterizer = data.state-&gt;getRasterizerState();
+    rasterizer.pointDrawMode       = (drawMode == GL_POINTS);
+    rasterizer.multiSample         = (samples != 0);
</ins><span class="cx"> 
</span><del>-        float blendColors[4] = {0.0f};
-        if (blendState.sourceBlendRGB != GL_CONSTANT_ALPHA &amp;&amp; blendState.sourceBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA &amp;&amp;
-            blendState.destBlendRGB != GL_CONSTANT_ALPHA &amp;&amp; blendState.destBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA)
-        {
-            blendColors[0] = blendColor.red;
-            blendColors[1] = blendColor.green;
-            blendColors[2] = blendColor.blue;
-            blendColors[3] = blendColor.alpha;
-        }
-        else
-        {
-            blendColors[0] = blendColor.alpha;
-            blendColors[1] = blendColor.alpha;
-            blendColors[2] = blendColor.alpha;
-            blendColors[3] = blendColor.alpha;
-        }
-
-        mDeviceContext-&gt;OMSetBlendState(dxBlendState, blendColors, sampleMask);
-
-        mCurBlendState = blendState;
-        mCurBlendColor = blendColor;
-        mCurSampleMask = sampleMask;
-    }
-
-    mForceSetBlendState = false;
-
-    return gl::Error(GL_NO_ERROR);
-}
-
-gl::Error Renderer11::setDepthStencilState(const gl::DepthStencilState &amp;depthStencilState, int stencilRef,
-                                           int stencilBackRef, bool frontFaceCCW)
-{
-    if (mForceSetDepthStencilState ||
-        memcmp(&amp;depthStencilState, &amp;mCurDepthStencilState, sizeof(gl::DepthStencilState)) != 0 ||
-        stencilRef != mCurStencilRef || stencilBackRef != mCurStencilBackRef)
</del><ins>+    error = mStateManager.setRasterizerState(rasterizer);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        ASSERT(depthStencilState.stencilWritemask == depthStencilState.stencilBackWritemask);
-        ASSERT(stencilRef == stencilBackRef);
-        ASSERT(depthStencilState.stencilMask == depthStencilState.stencilBackMask);
-
-        ID3D11DepthStencilState *dxDepthStencilState = NULL;
-        gl::Error error = mStateCache.getDepthStencilState(depthStencilState, &amp;dxDepthStencilState);
-        if (error.isError())
-        {
-            return error;
-        }
-
-        ASSERT(dxDepthStencilState);
-
-        // Max D3D11 stencil reference value is 0xFF, corresponding to the max 8 bits in a stencil buffer
-        // GL specifies we should clamp the ref value to the nearest bit depth when doing stencil ops
-        static_assert(D3D11_DEFAULT_STENCIL_READ_MASK == 0xFF, &quot;Unexpected value of D3D11_DEFAULT_STENCIL_READ_MASK&quot;);
-        static_assert(D3D11_DEFAULT_STENCIL_WRITE_MASK == 0xFF, &quot;Unexpected value of D3D11_DEFAULT_STENCIL_WRITE_MASK&quot;);
-        UINT dxStencilRef = std::min&lt;UINT&gt;(stencilRef, 0xFFu);
-
-        mDeviceContext-&gt;OMSetDepthStencilState(dxDepthStencilState, dxStencilRef);
-
-        mCurDepthStencilState = depthStencilState;
-        mCurStencilRef = stencilRef;
-        mCurStencilBackRef = stencilBackRef;
</del><ins>+        return error;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mForceSetDepthStencilState = false;
-
-    return gl::Error(GL_NO_ERROR);
-}
-
-void Renderer11::setScissorRectangle(const gl::Rectangle &amp;scissor, bool enabled)
-{
-    if (mForceSetScissor || memcmp(&amp;scissor, &amp;mCurScissor, sizeof(gl::Rectangle)) != 0 ||
-        enabled != mScissorEnabled)
</del><ins>+    // Setting blend state
+    unsigned int mask = GetBlendSampleMask(data, samples);
+    error = mStateManager.setBlendState(framebufferObject, data.state-&gt;getBlendState(),
+                                        data.state-&gt;getBlendColor(), mask);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        if (enabled)
-        {
-            D3D11_RECT rect;
-            rect.left = std::max(0, scissor.x);
-            rect.top = std::max(0, scissor.y);
-            rect.right = scissor.x + std::max(0, scissor.width);
-            rect.bottom = scissor.y + std::max(0, scissor.height);
-
-            mDeviceContext-&gt;RSSetScissorRects(1, &amp;rect);
-        }
-
-        if (enabled != mScissorEnabled)
-        {
-            mForceSetRasterState = true;
-        }
-
-        mCurScissor = scissor;
-        mScissorEnabled = enabled;
</del><ins>+        return error;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mForceSetScissor = false;
</del><ins>+    // Setting depth stencil state
+    error = mStateManager.setDepthStencilState(*data.state);
+    return error;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer11::setViewport(const gl::Rectangle &amp;viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace,
-                             bool ignoreViewport)
</del><ins>+void Renderer11::syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;bitmask)
</ins><span class="cx"> {
</span><del>-    gl::Rectangle actualViewport = viewport;
-    float actualZNear = gl::clamp01(zNear);
-    float actualZFar = gl::clamp01(zFar);
-    if (ignoreViewport)
-    {
-        actualViewport.x = 0;
-        actualViewport.y = 0;
-        actualViewport.width = mRenderTargetDesc.width;
-        actualViewport.height = mRenderTargetDesc.height;
-        actualZNear = 0.0f;
-        actualZFar = 1.0f;
-    }
-
-    bool viewportChanged = mForceSetViewport || memcmp(&amp;actualViewport, &amp;mCurViewport, sizeof(gl::Rectangle)) != 0 ||
-                           actualZNear != mCurNear || actualZFar != mCurFar;
-
-    if (viewportChanged)
-    {
-        const gl::Caps&amp; caps = getRendererCaps();
-
-        int dxMaxViewportBoundsX = static_cast&lt;int&gt;(caps.maxViewportWidth);
-        int dxMaxViewportBoundsY = static_cast&lt;int&gt;(caps.maxViewportHeight);
-        int dxMinViewportBoundsX = -dxMaxViewportBoundsX;
-        int dxMinViewportBoundsY = -dxMaxViewportBoundsY;
-
-        if (mFeatureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
-        {
-            // Feature Level 9 viewports shouldn't exceed the dimensions of the rendertarget.
-            dxMaxViewportBoundsX = mRenderTargetDesc.width;
-            dxMaxViewportBoundsY = mRenderTargetDesc.height;
-            dxMinViewportBoundsX = 0;
-            dxMinViewportBoundsY = 0;
-        }
-
-        int dxViewportTopLeftX = gl::clamp(actualViewport.x, dxMinViewportBoundsX, dxMaxViewportBoundsX);
-        int dxViewportTopLeftY = gl::clamp(actualViewport.y, dxMinViewportBoundsY, dxMaxViewportBoundsY);
-        int dxViewportWidth =    gl::clamp(actualViewport.width, 0, dxMaxViewportBoundsX - dxViewportTopLeftX);
-        int dxViewportHeight =   gl::clamp(actualViewport.height, 0, dxMaxViewportBoundsY - dxViewportTopLeftY);
-
-        D3D11_VIEWPORT dxViewport;
-        dxViewport.TopLeftX = static_cast&lt;float&gt;(dxViewportTopLeftX);
-        dxViewport.TopLeftY = static_cast&lt;float&gt;(dxViewportTopLeftY);
-        dxViewport.Width =    static_cast&lt;float&gt;(dxViewportWidth);
-        dxViewport.Height =   static_cast&lt;float&gt;(dxViewportHeight);
-        dxViewport.MinDepth = actualZNear;
-        dxViewport.MaxDepth = actualZFar;
-
-        mDeviceContext-&gt;RSSetViewports(1, &amp;dxViewport);
-
-        mCurViewport = actualViewport;
-        mCurNear = actualZNear;
-        mCurFar = actualZFar;
-
-        // On Feature Level 9_*, we must emulate large and/or negative viewports in the shaders using viewAdjust (like the D3D9 renderer).
-        if (mFeatureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
-        {
-            mVertexConstants.viewAdjust[0] = static_cast&lt;float&gt;((actualViewport.width  - dxViewportWidth)  + 2 * (actualViewport.x - dxViewportTopLeftX)) / dxViewport.Width;
-            mVertexConstants.viewAdjust[1] = static_cast&lt;float&gt;((actualViewport.height - dxViewportHeight) + 2 * (actualViewport.y - dxViewportTopLeftY)) / dxViewport.Height;
-            mVertexConstants.viewAdjust[2] = static_cast&lt;float&gt;(actualViewport.width) / dxViewport.Width;
-            mVertexConstants.viewAdjust[3] = static_cast&lt;float&gt;(actualViewport.height) / dxViewport.Height;
-        }
-
-        mPixelConstants.viewCoords[0] = actualViewport.width  * 0.5f;
-        mPixelConstants.viewCoords[1] = actualViewport.height * 0.5f;
-        mPixelConstants.viewCoords[2] = actualViewport.x + (actualViewport.width  * 0.5f);
-        mPixelConstants.viewCoords[3] = actualViewport.y + (actualViewport.height * 0.5f);
-
-        // Instanced pointsprite emulation requires ViewCoords to be defined in the
-        // the vertex shader.
-        mVertexConstants.viewCoords[0] = mPixelConstants.viewCoords[0];
-        mVertexConstants.viewCoords[1] = mPixelConstants.viewCoords[1];
-        mVertexConstants.viewCoords[2] = mPixelConstants.viewCoords[2];
-        mVertexConstants.viewCoords[3] = mPixelConstants.viewCoords[3];
-
-        mPixelConstants.depthFront[0] = (actualZFar - actualZNear) * 0.5f;
-        mPixelConstants.depthFront[1] = (actualZNear + actualZFar) * 0.5f;
-
-        mVertexConstants.depthRange[0] = actualZNear;
-        mVertexConstants.depthRange[1] = actualZFar;
-        mVertexConstants.depthRange[2] = actualZFar - actualZNear;
-
-        mPixelConstants.depthRange[0] = actualZNear;
-        mPixelConstants.depthRange[1] = actualZFar;
-        mPixelConstants.depthRange[2] = actualZFar - actualZNear;
-    }
-
-    mForceSetViewport = false;
</del><ins>+    mStateManager.syncState(state, bitmask);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Renderer11::applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize)
</span><span class="lines">@@ -1244,174 +1524,74 @@
</span><span class="cx">     return count &gt;= minCount;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer11::unsetConflictingSRVs(gl::SamplerType samplerType, uintptr_t resource, const gl::ImageIndex &amp;index)
</del><ins>+gl::Error Renderer11::applyRenderTarget(const gl::Framebuffer *framebuffer)
</ins><span class="cx"> {
</span><del>-    auto &amp;currentSRVs = (samplerType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
-
-    for (size_t resourceIndex = 0; resourceIndex &lt; currentSRVs.size(); ++resourceIndex)
-    {
-        auto &amp;record = currentSRVs[resourceIndex];
-
-        if (record.srv &amp;&amp; record.resource == resource &amp;&amp; ImageIndexConflictsWithSRV(index, record.desc))
-        {
-            setShaderResource(samplerType, static_cast&lt;UINT&gt;(resourceIndex), NULL);
-        }
-    }
</del><ins>+    return mStateManager.syncFramebuffer(framebuffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::applyRenderTarget(const gl::Framebuffer *framebuffer)
</del><ins>+gl::Error Renderer11::applyVertexBuffer(const gl::State &amp;state,
+                                        GLenum mode,
+                                        GLint first,
+                                        GLsizei count,
+                                        GLsizei instances,
+                                        TranslatedIndexData *indexInfo)
</ins><span class="cx"> {
</span><del>-    // Get the color render buffer and serial
-    // Also extract the render target dimensions and view
-    unsigned int renderTargetWidth = 0;
-    unsigned int renderTargetHeight = 0;
-    DXGI_FORMAT renderTargetFormat = DXGI_FORMAT_UNKNOWN;
-    ID3D11RenderTargetView* framebufferRTVs[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS] = {NULL};
-    bool missingColorRenderTarget = true;
</del><ins>+    const auto &amp;vertexArray = state.getVertexArray();
+    auto *vertexArray11     = GetImplAs&lt;VertexArray11&gt;(vertexArray);
</ins><span class="cx"> 
</span><del>-    const FramebufferD3D *framebufferD3D = GetImplAs&lt;FramebufferD3D&gt;(framebuffer);
-    const gl::AttachmentList &amp;colorbuffers = framebufferD3D-&gt;getColorAttachmentsForRender(getWorkarounds());
-
-    for (size_t colorAttachment = 0; colorAttachment &lt; colorbuffers.size(); ++colorAttachment)
</del><ins>+    gl::Error error = vertexArray11-&gt;updateDirtyAndDynamicAttribs(mVertexDataManager, state, first,
+                                                                  count, instances);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        const gl::FramebufferAttachment *colorbuffer = colorbuffers[colorAttachment];
-
-        if (colorbuffer)
-        {
-            // the draw buffer must be either &quot;none&quot;, &quot;back&quot; for the default buffer or the same index as this color (in order)
-
-            // check for zero-sized default framebuffer, which is a special case.
-            // in this case we do not wish to modify any state and just silently return false.
-            // this will not report any gl error but will cause the calling method to return.
-            if (colorbuffer-&gt;getWidth() == 0 || colorbuffer-&gt;getHeight() == 0)
-            {
-                return gl::Error(GL_NO_ERROR);
-            }
-
-            // Extract the render target dimensions and view
-            RenderTarget11 *renderTarget = NULL;
-            gl::Error error = colorbuffer-&gt;getRenderTarget(&amp;renderTarget);
-            if (error.isError())
-            {
-                return error;
-            }
-            ASSERT(renderTarget);
-
-            framebufferRTVs[colorAttachment] = renderTarget-&gt;getRenderTargetView();
-            ASSERT(framebufferRTVs[colorAttachment]);
-
-            if (missingColorRenderTarget)
-            {
-                renderTargetWidth = renderTarget-&gt;getWidth();
-                renderTargetHeight = renderTarget-&gt;getHeight();
-                renderTargetFormat = renderTarget-&gt;getDXGIFormat();
-                missingColorRenderTarget = false;
-            }
-
-            // Unbind render target SRVs from the shader here to prevent D3D11 warnings.
-            if (colorbuffer-&gt;type() == GL_TEXTURE)
-            {
-                uintptr_t rtResource = reinterpret_cast&lt;uintptr_t&gt;(GetViewResource(framebufferRTVs[colorAttachment]));
-                const gl::ImageIndex &amp;index = colorbuffer-&gt;getTextureImageIndex();
-                // The index doesn't need to be corrected for the small compressed texture workaround
-                // because a rendertarget is never compressed.
-                unsetConflictingSRVs(gl::SAMPLER_VERTEX, rtResource, index);
-                unsetConflictingSRVs(gl::SAMPLER_PIXEL, rtResource, index);
-            }
-        }
</del><ins>+        return error;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Get the depth stencil buffers
-    ID3D11DepthStencilView* framebufferDSV = NULL;
-    const gl::FramebufferAttachment *depthStencil = framebuffer-&gt;getDepthOrStencilbuffer();
-    if (depthStencil)
</del><ins>+    error = mStateManager.updateCurrentValueAttribs(state, mVertexDataManager);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        RenderTarget11 *depthStencilRenderTarget = NULL;
-        gl::Error error = depthStencil-&gt;getRenderTarget(&amp;depthStencilRenderTarget);
-        if (error.isError())
-        {
-            SafeRelease(framebufferRTVs);
-            return error;
-        }
-        ASSERT(depthStencilRenderTarget);
-
-        framebufferDSV = depthStencilRenderTarget-&gt;getDepthStencilView();
-        ASSERT(framebufferDSV);
-
-        // If there is no render buffer, the width, height and format values come from
-        // the depth stencil
-        if (missingColorRenderTarget)
-        {
-            renderTargetWidth = depthStencilRenderTarget-&gt;getWidth();
-            renderTargetHeight = depthStencilRenderTarget-&gt;getHeight();
-            renderTargetFormat = depthStencilRenderTarget-&gt;getDXGIFormat();
-        }
-
-        // Unbind render target SRVs from the shader here to prevent D3D11 warnings.
-        if (depthStencil-&gt;type() == GL_TEXTURE)
-        {
-            uintptr_t depthStencilResource = reinterpret_cast&lt;uintptr_t&gt;(GetViewResource(framebufferDSV));
-            const gl::ImageIndex &amp;index = depthStencil-&gt;getTextureImageIndex();
-            // The index doesn't need to be corrected for the small compressed texture workaround
-            // because a rendertarget is never compressed.
-            unsetConflictingSRVs(gl::SAMPLER_VERTEX, depthStencilResource, index);
-            unsetConflictingSRVs(gl::SAMPLER_PIXEL, depthStencilResource, index);
-        }
</del><ins>+        return error;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Apply the render target and depth stencil
-    if (!mRenderTargetDescInitialized || !mDepthStencilInitialized ||
-        memcmp(framebufferRTVs, mAppliedRTVs, sizeof(framebufferRTVs)) != 0 ||
-        reinterpret_cast&lt;uintptr_t&gt;(framebufferDSV) != mAppliedDSV)
</del><ins>+    // If index information is passed, mark it with the current changed status.
+    if (indexInfo)
</ins><span class="cx">     {
</span><del>-        mDeviceContext-&gt;OMSetRenderTargets(getRendererCaps().maxDrawBuffers, framebufferRTVs, framebufferDSV);
-
-        mRenderTargetDesc.width = renderTargetWidth;
-        mRenderTargetDesc.height = renderTargetHeight;
-        mRenderTargetDesc.format = renderTargetFormat;
-        mForceSetViewport = true;
-        mForceSetScissor = true;
-        mForceSetBlendState = true;
-
-        if (!mDepthStencilInitialized)
-        {
-            mForceSetRasterState = true;
-        }
-
-        for (size_t rtIndex = 0; rtIndex &lt; ArraySize(framebufferRTVs); rtIndex++)
-        {
-            mAppliedRTVs[rtIndex] = reinterpret_cast&lt;uintptr_t&gt;(framebufferRTVs[rtIndex]);
-        }
-        mAppliedDSV = reinterpret_cast&lt;uintptr_t&gt;(framebufferDSV);
-        mRenderTargetDescInitialized = true;
-        mDepthStencilInitialized = true;
</del><ins>+        indexInfo-&gt;srcIndexData.srcIndicesChanged = mAppliedIBChanged;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const Framebuffer11 *framebuffer11 = GetImplAs&lt;Framebuffer11&gt;(framebuffer);
-    gl::Error error = framebuffer11-&gt;invalidateSwizzles();
-    if (error.isError())
</del><ins>+    GLsizei numIndicesPerInstance = 0;
+    if (instances &gt; 0)
</ins><span class="cx">     {
</span><del>-        return error;
</del><ins>+        numIndicesPerInstance = count;
</ins><span class="cx">     }
</span><ins>+    const auto &amp;vertexArrayAttribs  = vertexArray11-&gt;getTranslatedAttribs();
+    const auto &amp;currentValueAttribs = mStateManager.getCurrentValueAttribs();
+    ANGLE_TRY(mInputLayoutCache.applyVertexBuffers(state, vertexArrayAttribs, currentValueAttribs,
+                                                   mode, first, indexInfo, numIndicesPerInstance));
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
-}
</del><ins>+    // InputLayoutCache::applyVertexBuffers calls through to the Bufer11 to get the native vertex
+    // buffer (ID3D11Buffer *). Because we allocate these buffers lazily, this will trigger
+    // allocation. This in turn will signal that the buffer is dirty. Since we just resolved the
+    // dirty-ness in VertexArray11::updateDirtyAndDynamicAttribs, this can make us do a needless
+    // update on the second draw call.
+    // Hence we clear the flags here, after we've applied vertex data, since we know everything
+    // is clean. This is a bit of a hack.
+    vertexArray11-&gt;clearDirtyAndPromoteDynamicAttribs(state, count);
</ins><span class="cx"> 
</span><del>-gl::Error Renderer11::applyVertexBuffer(const gl::State &amp;state, GLenum mode, GLint first, GLsizei count, GLsizei instances)
-{
-    TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS];
-    gl::Error error = mVertexDataManager-&gt;prepareVertexData(state, first, count, attributes, instances);
-    if (error.isError())
-    {
-        return error;
-    }
-
-    return mInputLayoutCache.applyVertexBuffers(attributes, mode, state.getProgram());
</del><ins>+    return gl::NoError();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo)
</del><ins>+gl::Error Renderer11::applyIndexBuffer(const gl::Data &amp;data,
+                                       const GLvoid *indices,
+                                       GLsizei count,
+                                       GLenum mode,
+                                       GLenum type,
+                                       TranslatedIndexData *indexInfo)
</ins><span class="cx"> {
</span><del>-    gl::Error error = mIndexDataManager-&gt;prepareIndexData(type, count, elementArrayBuffer, indices, indexInfo);
</del><ins>+    gl::VertexArray *vao           = data.state-&gt;getVertexArray();
+    gl::Buffer *elementArrayBuffer = vao-&gt;getElementArrayBuffer().get();
+    gl::Error error =
+        mIndexDataManager-&gt;prepareIndexData(type, count, elementArrayBuffer, indices, indexInfo,
+                                            data.state-&gt;isPrimitiveRestartEnabled());
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -1423,7 +1603,12 @@
</span><span class="cx">     if (indexInfo-&gt;storage)
</span><span class="cx">     {
</span><span class="cx">         Buffer11 *storage = GetAs&lt;Buffer11&gt;(indexInfo-&gt;storage);
</span><del>-        buffer = storage-&gt;getBuffer(BUFFER_USAGE_INDEX);
</del><ins>+        auto indexOrError = storage-&gt;getBuffer(BUFFER_USAGE_INDEX);
+        if (indexOrError.isError())
+        {
+            return indexOrError.getError();
+        }
+        buffer = indexOrError.getResult();
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="lines">@@ -1431,6 +1616,7 @@
</span><span class="cx">         buffer = indexBuffer-&gt;getBuffer();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    mAppliedIBChanged = false;
</ins><span class="cx">     if (buffer != mAppliedIB || bufferFormat != mAppliedIBFormat || indexInfo-&gt;startOffset != mAppliedIBOffset)
</span><span class="cx">     {
</span><span class="cx">         mDeviceContext-&gt;IASetIndexBuffer(buffer, bufferFormat, indexInfo-&gt;startOffset);
</span><span class="lines">@@ -1438,12 +1624,13 @@
</span><span class="cx">         mAppliedIB = buffer;
</span><span class="cx">         mAppliedIBFormat = bufferFormat;
</span><span class="cx">         mAppliedIBOffset = indexInfo-&gt;startOffset;
</span><ins>+        mAppliedIBChanged = true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer11::applyTransformFeedbackBuffers(const gl::State &amp;state)
</del><ins>+gl::Error Renderer11::applyTransformFeedbackBuffers(const gl::State &amp;state)
</ins><span class="cx"> {
</span><span class="cx">     size_t numXFBBindings = 0;
</span><span class="cx">     bool requiresUpdate = false;
</span><span class="lines">@@ -1458,11 +1645,16 @@
</span><span class="cx">         {
</span><span class="cx">             const OffsetBindingPointer&lt;gl::Buffer&gt; &amp;binding = transformFeedback-&gt;getIndexedBuffer(i);
</span><span class="cx"> 
</span><del>-            ID3D11Buffer *d3dBuffer = NULL;
</del><ins>+            ID3D11Buffer *d3dBuffer = nullptr;
</ins><span class="cx">             if (binding.get() != nullptr)
</span><span class="cx">             {
</span><span class="cx">                 Buffer11 *storage = GetImplAs&lt;Buffer11&gt;(binding.get());
</span><del>-                d3dBuffer = storage-&gt;getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
</del><ins>+                auto bufferOrError = storage-&gt;getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
+                if (bufferOrError.isError())
+                {
+                    return bufferOrError.getError();
+                }
+                d3dBuffer = bufferOrError.getResult();
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             // TODO: mAppliedTFBuffers and friends should also be kept in a vector.
</span><span class="lines">@@ -1482,7 +1674,12 @@
</span><span class="cx">             if (binding.get() != nullptr)
</span><span class="cx">             {
</span><span class="cx">                 Buffer11 *storage = GetImplAs&lt;Buffer11&gt;(binding.get());
</span><del>-                ID3D11Buffer *d3dBuffer = storage-&gt;getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
</del><ins>+                auto bufferOrError = storage-&gt;getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
+                if (bufferOrError.isError())
+                {
+                    return bufferOrError.getError();
+                }
+                ID3D11Buffer *d3dBuffer = bufferOrError.getResult();
</ins><span class="cx"> 
</span><span class="cx">                 mCurrentD3DOffsets[i] = (mAppliedTFBuffers[i] != d3dBuffer || mAppliedTFOffsets[i] != binding.getOffset()) ?
</span><span class="cx">                                         static_cast&lt;UINT&gt;(binding.getOffset()) : -1;
</span><span class="lines">@@ -1490,7 +1687,7 @@
</span><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><del>-                mAppliedTFBuffers[i] = NULL;
</del><ins>+                mAppliedTFBuffers[i]  = nullptr;
</ins><span class="cx">                 mCurrentD3DOffsets[i] = 0;
</span><span class="cx">             }
</span><span class="cx">             mAppliedTFOffsets[i] = binding.getOffset();
</span><span class="lines">@@ -1498,22 +1695,29 @@
</span><span class="cx"> 
</span><span class="cx">         mAppliedNumXFBBindings = numXFBBindings;
</span><span class="cx"> 
</span><del>-        mDeviceContext-&gt;SOSetTargets(numXFBBindings, mAppliedTFBuffers, mCurrentD3DOffsets);
</del><ins>+        mDeviceContext-&gt;SOSetTargets(static_cast&lt;unsigned int&gt;(numXFBBindings), mAppliedTFBuffers,
+                                     mCurrentD3DOffsets);
</ins><span class="cx">     }
</span><ins>+
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::drawArrays(const gl::Data &amp;data, GLenum mode, GLsizei count, GLsizei instances, bool usesPointSize)
</del><ins>+gl::Error Renderer11::drawArraysImpl(const gl::Data &amp;data,
+                                     GLenum mode,
+                                     GLint startVertex,
+                                     GLsizei count,
+                                     GLsizei instances)
</ins><span class="cx"> {
</span><del>-    bool useInstancedPointSpriteEmulation = usesPointSize &amp;&amp; getWorkarounds().useInstancedPointSpriteEmulation;
-    if (mode == GL_POINTS &amp;&amp; data.state-&gt;isTransformFeedbackActiveUnpaused())
</del><ins>+    ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(data.state-&gt;getProgram());
+
+    if (programD3D-&gt;usesGeometryShader(mode) &amp;&amp; data.state-&gt;isTransformFeedbackActiveUnpaused())
</ins><span class="cx">     {
</span><del>-        // Since point sprites are generated with a geometry shader, too many vertices will
-        // be written if transform feedback is active.  To work around this, draw only the points
-        // with the stream out shader and no pixel shader to feed the stream out buffers and then 
-        // draw again with the point sprite geometry shader to rasterize the point sprites.
</del><ins>+        // Since we use a geometry if-and-only-if we rewrite vertex streams, transform feedback
+        // won't get the correct output. To work around this, draw with *only* the stream out
+        // first (no pixel shader) to feed the stream out buffers and then draw again with the
+        // geometry shader + pixel shader to rasterize the primitives.
+        mDeviceContext-&gt;PSSetShader(nullptr, nullptr, 0);
</ins><span class="cx"> 
</span><del>-        mDeviceContext-&gt;PSSetShader(NULL, NULL, 0);
-
</del><span class="cx">         if (instances &gt; 0)
</span><span class="cx">         {
</span><span class="cx">             mDeviceContext-&gt;DrawInstanced(count, instances, 0, 0);
</span><span class="lines">@@ -1523,98 +1727,194 @@
</span><span class="cx">             mDeviceContext-&gt;Draw(count, 0);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(data.state-&gt;getProgram());
-
-        rx::ShaderExecutableD3D *pixelExe = NULL;
</del><ins>+        rx::ShaderExecutableD3D *pixelExe = nullptr;
</ins><span class="cx">         gl::Error error = programD3D-&gt;getPixelExecutableForFramebuffer(data.state-&gt;getDrawFramebuffer(), &amp;pixelExe);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // Skip this step if we're doing rasterizer discard.
-        if (pixelExe &amp;&amp; !data.state-&gt;getRasterizerState().rasterizerDiscard &amp;&amp; usesPointSize)
</del><ins>+        // Skip the draw call if rasterizer discard is enabled (or no fragment shader).
+        if (!pixelExe || data.state-&gt;getRasterizerState().rasterizerDiscard)
</ins><span class="cx">         {
</span><del>-            ID3D11PixelShader *pixelShader = GetAs&lt;ShaderExecutable11&gt;(pixelExe)-&gt;getPixelShader();
-            ASSERT(reinterpret_cast&lt;uintptr_t&gt;(pixelShader) == mAppliedPixelShader);
-            mDeviceContext-&gt;PSSetShader(pixelShader, NULL, 0);
</del><ins>+            return gl::Error(GL_NO_ERROR);
+        }
</ins><span class="cx"> 
</span><del>-            // Retrieve the point sprite geometry shader
-            rx::ShaderExecutableD3D *geometryExe = programD3D-&gt;getGeometryExecutable();
-            ID3D11GeometryShader *geometryShader = (geometryExe ? GetAs&lt;ShaderExecutable11&gt;(geometryExe)-&gt;getGeometryShader() : NULL);
-            mAppliedGeometryShader = reinterpret_cast&lt;uintptr_t&gt;(geometryShader);
-            ASSERT(geometryShader);
-            mDeviceContext-&gt;GSSetShader(geometryShader, NULL, 0);
</del><ins>+        ID3D11PixelShader *pixelShader = GetAs&lt;ShaderExecutable11&gt;(pixelExe)-&gt;getPixelShader();
+        ASSERT(reinterpret_cast&lt;uintptr_t&gt;(pixelShader) == mAppliedPixelShader);
+        mDeviceContext-&gt;PSSetShader(pixelShader, NULL, 0);
</ins><span class="cx"> 
</span><del>-            if (instances &gt; 0)
-            {
-                mDeviceContext-&gt;DrawInstanced(count, instances, 0, 0);
-            }
-            else
-            {
-                mDeviceContext-&gt;Draw(count, 0);
-            }
</del><ins>+        // Retrieve the geometry shader.
+        rx::ShaderExecutableD3D *geometryExe = nullptr;
+        error =
+            programD3D-&gt;getGeometryExecutableForPrimitiveType(data, mode, &amp;geometryExe, nullptr);
+        if (error.isError())
+        {
+            return error;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        ID3D11GeometryShader *geometryShader =
+            (geometryExe ? GetAs&lt;ShaderExecutable11&gt;(geometryExe)-&gt;getGeometryShader() : NULL);
+        mAppliedGeometryShader = reinterpret_cast&lt;uintptr_t&gt;(geometryShader);
+        ASSERT(geometryShader);
+        mDeviceContext-&gt;GSSetShader(geometryShader, NULL, 0);
+
+        if (instances &gt; 0)
+        {
+            mDeviceContext-&gt;DrawInstanced(count, instances, 0, 0);
+        }
+        else
+        {
+            mDeviceContext-&gt;Draw(count, 0);
+        }
</ins><span class="cx">         return gl::Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><del>-    else if (mode == GL_LINE_LOOP)
</del><ins>+
+    if (mode == GL_LINE_LOOP)
</ins><span class="cx">     {
</span><del>-        return drawLineLoop(count, GL_NONE, NULL, 0, NULL);
</del><ins>+        return drawLineLoop(data, count, GL_NONE, nullptr, nullptr, instances);
</ins><span class="cx">     }
</span><del>-    else if (mode == GL_TRIANGLE_FAN)
</del><ins>+
+    if (mode == GL_TRIANGLE_FAN)
</ins><span class="cx">     {
</span><del>-        return drawTriangleFan(count, GL_NONE, NULL, 0, NULL, instances);
</del><ins>+        return drawTriangleFan(data, count, GL_NONE, nullptr, 0, instances);
</ins><span class="cx">     }
</span><del>-    else if (instances &gt; 0)
</del><ins>+
+    bool useInstancedPointSpriteEmulation =
+        programD3D-&gt;usesPointSize() &amp;&amp; getWorkarounds().useInstancedPointSpriteEmulation;
+
+    if (instances &gt; 0)
</ins><span class="cx">     {
</span><del>-        mDeviceContext-&gt;DrawInstanced(count, instances, 0, 0);
-        return gl::Error(GL_NO_ERROR);
-    }
-    else
-    {
-        // If gl_PointSize is used and GL_POINTS is specified, then it is expected to render pointsprites.
-        // If instanced pointsprite emulation is being used the topology is expexted to be 
-        // D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST and DrawIndexedInstanced must be used.
</del><span class="cx">         if (mode == GL_POINTS &amp;&amp; useInstancedPointSpriteEmulation)
</span><span class="cx">         {
</span><del>-            mDeviceContext-&gt;DrawIndexedInstanced(6, count, 0, 0, 0);
</del><ins>+            // If pointsprite emulation is used with glDrawArraysInstanced then we need to take a
+            // less efficent code path.
+            // Instanced rendering of emulated pointsprites requires a loop to draw each batch of
+            // points. An offset into the instanced data buffer is calculated and applied on each
+            // iteration to ensure all instances are rendered correctly.
+
+            // Each instance being rendered requires the inputlayout cache to reapply buffers and
+            // offsets.
+            for (GLsizei i = 0; i &lt; instances; i++)
+            {
+                gl::Error error =
+                    mInputLayoutCache.updateVertexOffsetsForPointSpritesEmulation(startVertex, i);
+                if (error.isError())
+                {
+                    return error;
+                }
+
+                mDeviceContext-&gt;DrawIndexedInstanced(6, count, 0, 0, 0);
+            }
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            mDeviceContext-&gt;Draw(count, 0);
</del><ins>+            mDeviceContext-&gt;DrawInstanced(count, instances, 0, 0);
</ins><span class="cx">         }
</span><span class="cx">         return gl::Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><ins>+
+    // If the shader is writing to gl_PointSize, then pointsprites are being rendered.
+    // Emulating instanced point sprites for FL9_3 requires the topology to be
+    // D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST and DrawIndexedInstanced is called instead.
+    if (mode == GL_POINTS &amp;&amp; useInstancedPointSpriteEmulation)
+    {
+        mDeviceContext-&gt;DrawIndexedInstanced(6, count, 0, 0, 0);
+    }
+    else
+    {
+        mDeviceContext-&gt;Draw(count, 0);
+    }
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
-                                   gl::Buffer *elementArrayBuffer, const TranslatedIndexData &amp;indexInfo, GLsizei instances)
</del><ins>+gl::Error Renderer11::drawElementsImpl(const gl::Data &amp;data,
+                                       const TranslatedIndexData &amp;indexInfo,
+                                       GLenum mode,
+                                       GLsizei count,
+                                       GLenum type,
+                                       const GLvoid *indices,
+                                       GLsizei instances)
</ins><span class="cx"> {
</span><span class="cx">     int minIndex = static_cast&lt;int&gt;(indexInfo.indexRange.start);
</span><span class="cx"> 
</span><span class="cx">     if (mode == GL_LINE_LOOP)
</span><span class="cx">     {
</span><del>-        return drawLineLoop(count, type, indices, minIndex, elementArrayBuffer);
</del><ins>+        return drawLineLoop(data, count, type, indices, &amp;indexInfo, instances);
</ins><span class="cx">     }
</span><del>-    else if (mode == GL_TRIANGLE_FAN)
</del><ins>+
+    if (mode == GL_TRIANGLE_FAN)
</ins><span class="cx">     {
</span><del>-        return drawTriangleFan(count, type, indices, minIndex, elementArrayBuffer, instances);
</del><ins>+        return drawTriangleFan(data, count, type, indices, minIndex, instances);
</ins><span class="cx">     }
</span><del>-    else if (instances &gt; 0)
</del><ins>+
+    const ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(data.state-&gt;getProgram());
+    if (instances &gt; 0)
</ins><span class="cx">     {
</span><del>-        mDeviceContext-&gt;DrawIndexedInstanced(count, instances, 0, -minIndex, 0);
</del><ins>+        if (mode == GL_POINTS &amp;&amp; programD3D-&gt;usesInstancedPointSpriteEmulation())
+        {
+            // If pointsprite emulation is used with glDrawElementsInstanced then we need to take a
+            // less efficent code path.
+            // Instanced rendering of emulated pointsprites requires a loop to draw each batch of
+            // points. An offset into the instanced data buffer is calculated and applied on each
+            // iteration to ensure all instances are rendered correctly.
+            GLsizei elementsToRender = static_cast&lt;GLsizei&gt;(indexInfo.indexRange.vertexCount());
+
+            // Each instance being rendered requires the inputlayout cache to reapply buffers and
+            // offsets.
+            for (GLsizei i = 0; i &lt; instances; i++)
+            {
+                gl::Error error =
+                    mInputLayoutCache.updateVertexOffsetsForPointSpritesEmulation(minIndex, i);
+                if (error.isError())
+                {
+                    return error;
+                }
+
+                mDeviceContext-&gt;DrawIndexedInstanced(6, elementsToRender, 0, 0, 0);
+            }
+        }
+        else
+        {
+            mDeviceContext-&gt;DrawIndexedInstanced(count, instances, 0, -minIndex, 0);
+        }
</ins><span class="cx">         return gl::Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><ins>+
+    // If the shader is writing to gl_PointSize, then pointsprites are being rendered.
+    // Emulating instanced point sprites for FL9_3 requires the topology to be
+    // D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST and DrawIndexedInstanced is called instead.
+    if (mode == GL_POINTS &amp;&amp; programD3D-&gt;usesInstancedPointSpriteEmulation())
+    {
+        // The count parameter passed to drawElements represents the total number of instances
+        // to be rendered. Each instance is referenced by the bound index buffer from the
+        // the caller.
+        //
+        // Indexed pointsprite emulation replicates data for duplicate entries found
+        // in the index buffer.
+        // This is not an efficent rendering mechanism and is only used on downlevel renderers
+        // that do not support geometry shaders.
+        mDeviceContext-&gt;DrawIndexedInstanced(6, count, 0, 0, 0);
+    }
</ins><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         mDeviceContext-&gt;DrawIndexed(count, 0, -minIndex);
</span><del>-        return gl::Error(GL_NO_ERROR);
</del><span class="cx">     }
</span><ins>+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer)
</del><ins>+gl::Error Renderer11::drawLineLoop(const gl::Data &amp;data,
+                                   GLsizei count,
+                                   GLenum type,
+                                   const GLvoid *indexPointer,
+                                   const TranslatedIndexData *indexInfo,
+                                   int instances)
</ins><span class="cx"> {
</span><ins>+    gl::VertexArray *vao           = data.state-&gt;getVertexArray();
+    gl::Buffer *elementArrayBuffer = vao-&gt;getElementArrayBuffer().get();
+
+    const GLvoid *indices = indexPointer;
+
</ins><span class="cx">     // Get the raw indices for an indexed draw
</span><span class="cx">     if (type != GL_NONE &amp;&amp; elementArrayBuffer)
</span><span class="cx">     {
</span><span class="lines">@@ -1650,7 +1950,11 @@
</span><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create a 32-bit looping index buffer for GL_LINE_LOOP, too many indices required.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const unsigned int spaceNeeded = (static_cast&lt;unsigned int&gt;(count) + 1) * sizeof(unsigned int);
</del><ins>+    GetLineLoopIndices(indices, type, static_cast&lt;GLuint&gt;(count),
+                       data.state-&gt;isPrimitiveRestartEnabled(), &amp;mScratchIndexDataBuffer);
+
+    unsigned int spaceNeeded =
+        static_cast&lt;unsigned int&gt;(sizeof(GLuint) * mScratchIndexDataBuffer.size());
</ins><span class="cx">     gl::Error error = mLineLoopIB-&gt;reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="lines">@@ -1665,42 +1969,10 @@
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    unsigned int *data = reinterpret_cast&lt;unsigned int*&gt;(mappedMemory);
-    unsigned int indexBufferOffset = offset;
</del><ins>+    // Copy over the converted index data.
+    memcpy(mappedMemory, &amp;mScratchIndexDataBuffer[0],
+           sizeof(GLuint) * mScratchIndexDataBuffer.size());
</ins><span class="cx"> 
</span><del>-    switch (type)
-    {
-      case GL_NONE:   // Non-indexed draw
-        for (int i = 0; i &lt; count; i++)
-        {
-            data[i] = i;
-        }
-        data[count] = 0;
-        break;
-      case GL_UNSIGNED_BYTE:
-        for (int i = 0; i &lt; count; i++)
-        {
-            data[i] = static_cast&lt;const GLubyte*&gt;(indices)[i];
-        }
-        data[count] = static_cast&lt;const GLubyte*&gt;(indices)[0];
-        break;
-      case GL_UNSIGNED_SHORT:
-        for (int i = 0; i &lt; count; i++)
-        {
-            data[i] = static_cast&lt;const GLushort*&gt;(indices)[i];
-        }
-        data[count] = static_cast&lt;const GLushort*&gt;(indices)[0];
-        break;
-      case GL_UNSIGNED_INT:
-        for (int i = 0; i &lt; count; i++)
-        {
-            data[i] = static_cast&lt;const GLuint*&gt;(indices)[i];
-        }
-        data[count] = static_cast&lt;const GLuint*&gt;(indices)[0];
-        break;
-      default: UNREACHABLE();
-    }
-
</del><span class="cx">     error = mLineLoopIB-&gt;unmapBuffer();
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="lines">@@ -1711,21 +1983,42 @@
</span><span class="cx">     ID3D11Buffer *d3dIndexBuffer = indexBuffer-&gt;getBuffer();
</span><span class="cx">     DXGI_FORMAT indexFormat = indexBuffer-&gt;getIndexFormat();
</span><span class="cx"> 
</span><del>-    if (mAppliedIB != d3dIndexBuffer || mAppliedIBFormat != indexFormat || mAppliedIBOffset != indexBufferOffset)
</del><ins>+    if (mAppliedIB != d3dIndexBuffer || mAppliedIBFormat != indexFormat ||
+        mAppliedIBOffset != offset)
</ins><span class="cx">     {
</span><del>-        mDeviceContext-&gt;IASetIndexBuffer(d3dIndexBuffer, indexFormat, indexBufferOffset);
</del><ins>+        mDeviceContext-&gt;IASetIndexBuffer(d3dIndexBuffer, indexFormat, offset);
</ins><span class="cx">         mAppliedIB = d3dIndexBuffer;
</span><span class="cx">         mAppliedIBFormat = indexFormat;
</span><del>-        mAppliedIBOffset = indexBufferOffset;
</del><ins>+        mAppliedIBOffset = offset;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mDeviceContext-&gt;DrawIndexed(count + 1, 0, -minIndex);
</del><ins>+    INT baseVertexLocation = (indexInfo ? -static_cast&lt;int&gt;(indexInfo-&gt;indexRange.start) : 0);
+    UINT indexCount = static_cast&lt;UINT&gt;(mScratchIndexDataBuffer.size());
</ins><span class="cx"> 
</span><ins>+    if (instances &gt; 0)
+    {
+        mDeviceContext-&gt;DrawIndexedInstanced(indexCount, instances, 0, baseVertexLocation, 0);
+    }
+    else
+    {
+        mDeviceContext-&gt;DrawIndexed(indexCount, 0, baseVertexLocation);
+    }
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer, int instances)
</del><ins>+gl::Error Renderer11::drawTriangleFan(const gl::Data &amp;data,
+                                      GLsizei count,
+                                      GLenum type,
+                                      const GLvoid *indices,
+                                      int minIndex,
+                                      int instances)
</ins><span class="cx"> {
</span><ins>+    gl::VertexArray *vao           = data.state-&gt;getVertexArray();
+    gl::Buffer *elementArrayBuffer = vao-&gt;getElementArrayBuffer().get();
+
+    const GLvoid *indexPointer = indices;
+
</ins><span class="cx">     // Get the raw indices for an indexed draw
</span><span class="cx">     if (type != GL_NONE &amp;&amp; elementArrayBuffer)
</span><span class="cx">     {
</span><span class="lines">@@ -1739,7 +2032,7 @@
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        indices = bufferData + offset;
</del><ins>+        indexPointer = bufferData + offset;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (!mTriangleFanIB)
</span><span class="lines">@@ -1756,21 +2049,25 @@
</span><span class="cx">     // Checked by Renderer11::applyPrimitiveType
</span><span class="cx">     ASSERT(count &gt;= 3);
</span><span class="cx"> 
</span><del>-    const unsigned int numTris = count - 2;
</del><ins>+    const GLuint numTris = count - 2;
</ins><span class="cx"> 
</span><span class="cx">     if (numTris &gt; (std::numeric_limits&lt;unsigned int&gt;::max() / (sizeof(unsigned int) * 3)))
</span><span class="cx">     {
</span><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create a scratch index buffer for GL_TRIANGLE_FAN, too many indices required.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const unsigned int spaceNeeded = (numTris * 3) * sizeof(unsigned int);
</del><ins>+    GetTriFanIndices(indexPointer, type, count, data.state-&gt;isPrimitiveRestartEnabled(),
+                     &amp;mScratchIndexDataBuffer);
+
+    const unsigned int spaceNeeded =
+        static_cast&lt;unsigned int&gt;(mScratchIndexDataBuffer.size() * sizeof(unsigned int));
</ins><span class="cx">     gl::Error error = mTriangleFanIB-&gt;reserveBufferSpace(spaceNeeded, GL_UNSIGNED_INT);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void* mappedMemory = NULL;
</del><ins>+    void *mappedMemory = nullptr;
</ins><span class="cx">     unsigned int offset;
</span><span class="cx">     error = mTriangleFanIB-&gt;mapBuffer(spaceNeeded, &amp;mappedMemory, &amp;offset);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -1778,46 +2075,8 @@
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    unsigned int *data = reinterpret_cast&lt;unsigned int*&gt;(mappedMemory);
-    unsigned int indexBufferOffset = offset;
</del><ins>+    memcpy(mappedMemory, &amp;mScratchIndexDataBuffer[0], spaceNeeded);
</ins><span class="cx"> 
</span><del>-    switch (type)
-    {
-      case GL_NONE:   // Non-indexed draw
-        for (unsigned int i = 0; i &lt; numTris; i++)
-        {
-            data[i*3 + 0] = 0;
-            data[i*3 + 1] = i + 1;
-            data[i*3 + 2] = i + 2;
-        }
-        break;
-      case GL_UNSIGNED_BYTE:
-        for (unsigned int i = 0; i &lt; numTris; i++)
-        {
-            data[i*3 + 0] = static_cast&lt;const GLubyte*&gt;(indices)[0];
-            data[i*3 + 1] = static_cast&lt;const GLubyte*&gt;(indices)[i + 1];
-            data[i*3 + 2] = static_cast&lt;const GLubyte*&gt;(indices)[i + 2];
-        }
-        break;
-      case GL_UNSIGNED_SHORT:
-        for (unsigned int i = 0; i &lt; numTris; i++)
-        {
-            data[i*3 + 0] = static_cast&lt;const GLushort*&gt;(indices)[0];
-            data[i*3 + 1] = static_cast&lt;const GLushort*&gt;(indices)[i + 1];
-            data[i*3 + 2] = static_cast&lt;const GLushort*&gt;(indices)[i + 2];
-        }
-        break;
-      case GL_UNSIGNED_INT:
-        for (unsigned int i = 0; i &lt; numTris; i++)
-        {
-            data[i*3 + 0] = static_cast&lt;const GLuint*&gt;(indices)[0];
-            data[i*3 + 1] = static_cast&lt;const GLuint*&gt;(indices)[i + 1];
-            data[i*3 + 2] = static_cast&lt;const GLuint*&gt;(indices)[i + 2];
-        }
-        break;
-      default: UNREACHABLE();
-    }
-
</del><span class="cx">     error = mTriangleFanIB-&gt;unmapBuffer();
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="lines">@@ -1828,30 +2087,33 @@
</span><span class="cx">     ID3D11Buffer *d3dIndexBuffer = indexBuffer-&gt;getBuffer();
</span><span class="cx">     DXGI_FORMAT indexFormat = indexBuffer-&gt;getIndexFormat();
</span><span class="cx"> 
</span><del>-    if (mAppliedIB != d3dIndexBuffer || mAppliedIBFormat != indexFormat || mAppliedIBOffset != indexBufferOffset)
</del><ins>+    if (mAppliedIB != d3dIndexBuffer || mAppliedIBFormat != indexFormat ||
+        mAppliedIBOffset != offset)
</ins><span class="cx">     {
</span><del>-        mDeviceContext-&gt;IASetIndexBuffer(d3dIndexBuffer, indexFormat, indexBufferOffset);
</del><ins>+        mDeviceContext-&gt;IASetIndexBuffer(d3dIndexBuffer, indexFormat, offset);
</ins><span class="cx">         mAppliedIB = d3dIndexBuffer;
</span><span class="cx">         mAppliedIBFormat = indexFormat;
</span><del>-        mAppliedIBOffset = indexBufferOffset;
</del><ins>+        mAppliedIBOffset = offset;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    UINT indexCount = static_cast&lt;UINT&gt;(mScratchIndexDataBuffer.size());
+
</ins><span class="cx">     if (instances &gt; 0)
</span><span class="cx">     {
</span><del>-        mDeviceContext-&gt;DrawIndexedInstanced(numTris * 3, instances, 0, -minIndex, 0);
</del><ins>+        mDeviceContext-&gt;DrawIndexedInstanced(indexCount, instances, 0, -minIndex, 0);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        mDeviceContext-&gt;DrawIndexed(numTris * 3, 0, -minIndex);
</del><ins>+        mDeviceContext-&gt;DrawIndexed(indexCount, 0, -minIndex);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::applyShaders(gl::Program *program, const gl::VertexFormat inputLayout[], const gl::Framebuffer *framebuffer,
-                                   bool rasterizerDiscard, bool transformFeedbackActive)
</del><ins>+gl::Error Renderer11::applyShadersImpl(const gl::Data &amp;data, GLenum drawMode)
</ins><span class="cx"> {
</span><del>-    ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(program);
</del><ins>+    ProgramD3D *programD3D  = GetImplAs&lt;ProgramD3D&gt;(data.state-&gt;getProgram());
+    const auto &amp;inputLayout = programD3D-&gt;getCachedInputLayout();
</ins><span class="cx"> 
</span><span class="cx">     ShaderExecutableD3D *vertexExe = NULL;
</span><span class="cx">     gl::Error error = programD3D-&gt;getVertexExecutableForInputLayout(inputLayout, &amp;vertexExe, nullptr);
</span><span class="lines">@@ -1860,30 +2122,39 @@
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    const gl::Framebuffer *drawFramebuffer = data.state-&gt;getDrawFramebuffer();
</ins><span class="cx">     ShaderExecutableD3D *pixelExe = NULL;
</span><del>-    error = programD3D-&gt;getPixelExecutableForFramebuffer(framebuffer, &amp;pixelExe);
</del><ins>+    error = programD3D-&gt;getPixelExecutableForFramebuffer(drawFramebuffer, &amp;pixelExe);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ShaderExecutableD3D *geometryExe = programD3D-&gt;getGeometryExecutable();
</del><ins>+    ShaderExecutableD3D *geometryExe = nullptr;
+    error =
+        programD3D-&gt;getGeometryExecutableForPrimitiveType(data, drawMode, &amp;geometryExe, nullptr);
+    if (error.isError())
+    {
+        return error;
+    }
</ins><span class="cx"> 
</span><span class="cx">     ID3D11VertexShader *vertexShader = (vertexExe ? GetAs&lt;ShaderExecutable11&gt;(vertexExe)-&gt;getVertexShader() : NULL);
</span><span class="cx"> 
</span><span class="cx">     ID3D11PixelShader *pixelShader = NULL;
</span><span class="cx">     // Skip pixel shader if we're doing rasterizer discard.
</span><ins>+    bool rasterizerDiscard = data.state-&gt;getRasterizerState().rasterizerDiscard;
</ins><span class="cx">     if (!rasterizerDiscard)
</span><span class="cx">     {
</span><span class="cx">         pixelShader = (pixelExe ? GetAs&lt;ShaderExecutable11&gt;(pixelExe)-&gt;getPixelShader() : NULL);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ID3D11GeometryShader *geometryShader = NULL;
</span><ins>+    bool transformFeedbackActive = data.state-&gt;isTransformFeedbackActiveUnpaused();
</ins><span class="cx">     if (transformFeedbackActive)
</span><span class="cx">     {
</span><span class="cx">         geometryShader = (vertexExe ? GetAs&lt;ShaderExecutable11&gt;(vertexExe)-&gt;getStreamOutShader() : NULL);
</span><span class="cx">     }
</span><del>-    else if (mCurRasterState.pointDrawMode)
</del><ins>+    else
</ins><span class="cx">     {
</span><span class="cx">         geometryShader = (geometryExe ? GetAs&lt;ShaderExecutable11&gt;(geometryExe)-&gt;getGeometryShader() : NULL);
</span><span class="cx">     }
</span><span class="lines">@@ -1919,7 +2190,9 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::applyUniforms(const ProgramImpl &amp;program, const std::vector&lt;gl::LinkedUniform*&gt; &amp;uniformArray)
</del><ins>+gl::Error Renderer11::applyUniforms(const ProgramD3D &amp;programD3D,
+                                    GLenum drawMode,
+                                    const std::vector&lt;D3DUniform *&gt; &amp;uniformArray)
</ins><span class="cx"> {
</span><span class="cx">     unsigned int totalRegisterCountVS = 0;
</span><span class="cx">     unsigned int totalRegisterCountPS = 0;
</span><span class="lines">@@ -1927,26 +2200,25 @@
</span><span class="cx">     bool vertexUniformsDirty = false;
</span><span class="cx">     bool pixelUniformsDirty = false;
</span><span class="cx"> 
</span><del>-    for (size_t uniformIndex = 0; uniformIndex &lt; uniformArray.size(); uniformIndex++)
</del><ins>+    for (const D3DUniform *uniform : uniformArray)
</ins><span class="cx">     {
</span><del>-        const gl::LinkedUniform &amp;uniform = *uniformArray[uniformIndex];
-
-        if (uniform.isReferencedByVertexShader() &amp;&amp; !uniform.isSampler())
</del><ins>+        if (uniform-&gt;isReferencedByVertexShader() &amp;&amp; !uniform-&gt;isSampler())
</ins><span class="cx">         {
</span><del>-            totalRegisterCountVS += uniform.registerCount;
-            vertexUniformsDirty = (vertexUniformsDirty || uniform.dirty);
</del><ins>+            totalRegisterCountVS += uniform-&gt;registerCount;
+            vertexUniformsDirty = (vertexUniformsDirty || uniform-&gt;dirty);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (uniform.isReferencedByFragmentShader() &amp;&amp; !uniform.isSampler())
</del><ins>+        if (uniform-&gt;isReferencedByFragmentShader() &amp;&amp; !uniform-&gt;isSampler())
</ins><span class="cx">         {
</span><del>-            totalRegisterCountPS += uniform.registerCount;
-            pixelUniformsDirty = (pixelUniformsDirty || uniform.dirty);
</del><ins>+            totalRegisterCountPS += uniform-&gt;registerCount;
+            pixelUniformsDirty = (pixelUniformsDirty || uniform-&gt;dirty);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const ProgramD3D *programD3D = GetAs&lt;ProgramD3D&gt;(&amp;program);
-    const UniformStorage11 *vertexUniformStorage = GetAs&lt;UniformStorage11&gt;(&amp;programD3D-&gt;getVertexUniformStorage());
-    const UniformStorage11 *fragmentUniformStorage = GetAs&lt;UniformStorage11&gt;(&amp;programD3D-&gt;getFragmentUniformStorage());
</del><ins>+    const UniformStorage11 *vertexUniformStorage =
+        GetAs&lt;UniformStorage11&gt;(&amp;programD3D.getVertexUniformStorage());
+    const UniformStorage11 *fragmentUniformStorage =
+        GetAs&lt;UniformStorage11&gt;(&amp;programD3D.getFragmentUniformStorage());
</ins><span class="cx">     ASSERT(vertexUniformStorage);
</span><span class="cx">     ASSERT(fragmentUniformStorage);
</span><span class="cx"> 
</span><span class="lines">@@ -1974,26 +2246,26 @@
</span><span class="cx">         mapPS = (float(*)[4])map.pData;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (size_t uniformIndex = 0; uniformIndex &lt; uniformArray.size(); uniformIndex++)
</del><ins>+    for (const D3DUniform *uniform : uniformArray)
</ins><span class="cx">     {
</span><del>-        gl::LinkedUniform *uniform = uniformArray[uniformIndex];
</del><ins>+        if (uniform-&gt;isSampler())
+            continue;
</ins><span class="cx"> 
</span><del>-        if (!uniform-&gt;isSampler())
-        {
-            unsigned int componentCount = (4 - uniform-&gt;registerElement);
</del><ins>+        unsigned int componentCount = (4 - uniform-&gt;registerElement);
</ins><span class="cx"> 
</span><del>-            // we assume that uniforms from structs are arranged in struct order in our uniforms list. otherwise we would
-            // overwrite previously written regions of memory.
</del><ins>+        // we assume that uniforms from structs are arranged in struct order in our uniforms list.
+        // otherwise we would overwrite previously written regions of memory.
</ins><span class="cx"> 
</span><del>-            if (uniform-&gt;isReferencedByVertexShader() &amp;&amp; mapVS)
-            {
-                memcpy(&amp;mapVS[uniform-&gt;vsRegisterIndex][uniform-&gt;registerElement], uniform-&gt;data, uniform-&gt;registerCount * sizeof(float) * componentCount);
-            }
</del><ins>+        if (uniform-&gt;isReferencedByVertexShader() &amp;&amp; mapVS)
+        {
+            memcpy(&amp;mapVS[uniform-&gt;vsRegisterIndex][uniform-&gt;registerElement], uniform-&gt;data,
+                   uniform-&gt;registerCount * sizeof(float) * componentCount);
+        }
</ins><span class="cx"> 
</span><del>-            if (uniform-&gt;isReferencedByFragmentShader() &amp;&amp; mapPS)
-            {
-                memcpy(&amp;mapPS[uniform-&gt;psRegisterIndex][uniform-&gt;registerElement], uniform-&gt;data, uniform-&gt;registerCount * sizeof(float) * componentCount);
-            }
</del><ins>+        if (uniform-&gt;isReferencedByFragmentShader() &amp;&amp; mapPS)
+        {
+            memcpy(&amp;mapPS[uniform-&gt;psRegisterIndex][uniform-&gt;registerElement], uniform-&gt;data,
+                   uniform-&gt;registerCount * sizeof(float) * componentCount);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -2009,69 +2281,71 @@
</span><span class="cx"> 
</span><span class="cx">     if (mCurrentVertexConstantBuffer != vertexConstantBuffer)
</span><span class="cx">     {
</span><del>-        mDeviceContext-&gt;VSSetConstantBuffers(0, 1, &amp;vertexConstantBuffer);
</del><ins>+        mDeviceContext-&gt;VSSetConstantBuffers(
+            d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &amp;vertexConstantBuffer);
</ins><span class="cx">         mCurrentVertexConstantBuffer = vertexConstantBuffer;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (mCurrentPixelConstantBuffer != pixelConstantBuffer)
</span><span class="cx">     {
</span><del>-        mDeviceContext-&gt;PSSetConstantBuffers(0, 1, &amp;pixelConstantBuffer);
</del><ins>+        mDeviceContext-&gt;PSSetConstantBuffers(
+            d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK, 1, &amp;pixelConstantBuffer);
</ins><span class="cx">         mCurrentPixelConstantBuffer = pixelConstantBuffer;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Driver uniforms
</del><span class="cx">     if (!mDriverConstantBufferVS)
</span><span class="cx">     {
</span><span class="cx">         D3D11_BUFFER_DESC constantBufferDescription = {0};
</span><del>-        constantBufferDescription.ByteWidth = sizeof(dx_VertexConstants);
-        constantBufferDescription.Usage = D3D11_USAGE_DEFAULT;
-        constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
-        constantBufferDescription.CPUAccessFlags = 0;
-        constantBufferDescription.MiscFlags = 0;
-        constantBufferDescription.StructureByteStride = 0;
-
-        HRESULT result = mDevice-&gt;CreateBuffer(&amp;constantBufferDescription, NULL, &amp;mDriverConstantBufferVS);
-        UNUSED_ASSERTION_VARIABLE(result);
</del><ins>+        d3d11::InitConstantBufferDesc(
+            &amp;constantBufferDescription,
+            sizeof(dx_VertexConstants11) + mSamplerMetadataVS.sizeBytes());
+        HRESULT result =
+            mDevice-&gt;CreateBuffer(&amp;constantBufferDescription, nullptr, &amp;mDriverConstantBufferVS);
</ins><span class="cx">         ASSERT(SUCCEEDED(result));
</span><del>-
-        mDeviceContext-&gt;VSSetConstantBuffers(1, 1, &amp;mDriverConstantBufferVS);
</del><ins>+        if (FAILED(result))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create vertex shader constant buffer, result: 0x%X.&quot;, result);
+        }
+        mDeviceContext-&gt;VSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
+                                             &amp;mDriverConstantBufferVS);
</ins><span class="cx">     }
</span><del>-
</del><span class="cx">     if (!mDriverConstantBufferPS)
</span><span class="cx">     {
</span><span class="cx">         D3D11_BUFFER_DESC constantBufferDescription = {0};
</span><del>-        constantBufferDescription.ByteWidth = sizeof(dx_PixelConstants);
-        constantBufferDescription.Usage = D3D11_USAGE_DEFAULT;
-        constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
-        constantBufferDescription.CPUAccessFlags = 0;
-        constantBufferDescription.MiscFlags = 0;
-        constantBufferDescription.StructureByteStride = 0;
-
-        HRESULT result = mDevice-&gt;CreateBuffer(&amp;constantBufferDescription, NULL, &amp;mDriverConstantBufferPS);
-        UNUSED_ASSERTION_VARIABLE(result);
</del><ins>+        d3d11::InitConstantBufferDesc(&amp;constantBufferDescription,
+                                      sizeof(dx_PixelConstants11) + mSamplerMetadataPS.sizeBytes());
+        HRESULT result =
+            mDevice-&gt;CreateBuffer(&amp;constantBufferDescription, nullptr, &amp;mDriverConstantBufferPS);
</ins><span class="cx">         ASSERT(SUCCEEDED(result));
</span><del>-
-        mDeviceContext-&gt;PSSetConstantBuffers(1, 1, &amp;mDriverConstantBufferPS);
</del><ins>+        if (FAILED(result))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create pixel shader constant buffer, result: 0x%X.&quot;, result);
+        }
+        mDeviceContext-&gt;PSSetConstantBuffers(d3d11::RESERVED_CONSTANT_BUFFER_SLOT_DRIVER, 1,
+                                             &amp;mDriverConstantBufferPS);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (memcmp(&amp;mVertexConstants, &amp;mAppliedVertexConstants, sizeof(dx_VertexConstants)) != 0)
-    {
-        mDeviceContext-&gt;UpdateSubresource(mDriverConstantBufferVS, 0, NULL, &amp;mVertexConstants, 16, 0);
-        memcpy(&amp;mAppliedVertexConstants, &amp;mVertexConstants, sizeof(dx_VertexConstants));
-    }
</del><ins>+    // Sampler metadata and driver constants need to coexist in the same constant buffer to conserve
+    // constant buffer slots. We update both in the constant buffer if needed.
+    const dx_VertexConstants11 &amp;vertexConstants = mStateManager.getVertexConstants();
+    size_t samplerMetadataReferencedBytesVS = sizeof(SamplerMetadataD3D11::dx_SamplerMetadata) *
+                                              programD3D.getUsedSamplerRange(gl::SAMPLER_VERTEX);
+    applyDriverConstantsIfNeeded(&amp;mAppliedVertexConstants, vertexConstants, &amp;mSamplerMetadataVS,
+                                 samplerMetadataReferencedBytesVS, mDriverConstantBufferVS);
</ins><span class="cx"> 
</span><del>-    if (memcmp(&amp;mPixelConstants, &amp;mAppliedPixelConstants, sizeof(dx_PixelConstants)) != 0)
-    {
-        mDeviceContext-&gt;UpdateSubresource(mDriverConstantBufferPS, 0, NULL, &amp;mPixelConstants, 16, 0);
-        memcpy(&amp;mAppliedPixelConstants, &amp;mPixelConstants, sizeof(dx_PixelConstants));
-    }
</del><ins>+    const dx_PixelConstants11 &amp;pixelConstants = mStateManager.getPixelConstants();
+    size_t samplerMetadataReferencedBytesPS = sizeof(SamplerMetadataD3D11::dx_SamplerMetadata) *
+                                              programD3D.getUsedSamplerRange(gl::SAMPLER_PIXEL);
+    applyDriverConstantsIfNeeded(&amp;mAppliedPixelConstants, pixelConstants, &amp;mSamplerMetadataPS,
+                                 samplerMetadataReferencedBytesPS, mDriverConstantBufferPS);
</ins><span class="cx"> 
</span><span class="cx">     // GSSetConstantBuffers triggers device removal on 9_3, so we should only call it if necessary
</span><del>-    if (programD3D-&gt;usesGeometryShader())
</del><ins>+    if (programD3D.usesGeometryShader(drawMode))
</ins><span class="cx">     {
</span><span class="cx">         // needed for the point sprite geometry shader
</span><span class="cx">         if (mCurrentGeometryConstantBuffer != mDriverConstantBufferPS)
</span><span class="cx">         {
</span><ins>+            ASSERT(mDriverConstantBufferPS != nullptr);
</ins><span class="cx">             mDeviceContext-&gt;GSSetConstantBuffers(0, 1, &amp;mDriverConstantBufferPS);
</span><span class="cx">             mCurrentGeometryConstantBuffer = mDriverConstantBufferPS;
</span><span class="cx">         }
</span><span class="lines">@@ -2080,49 +2354,175 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer11::markAllStateDirty()
</del><ins>+// SamplerMetadataD3D11 implementation
+
+Renderer11::SamplerMetadataD3D11::SamplerMetadataD3D11() : mDirty(true)
</ins><span class="cx"> {
</span><del>-    TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;Renderer11::markAllStateDirty&quot;);
</del><ins>+}
</ins><span class="cx"> 
</span><del>-    for (size_t rtIndex = 0; rtIndex &lt; ArraySize(mAppliedRTVs); rtIndex++)
</del><ins>+Renderer11::SamplerMetadataD3D11::~SamplerMetadataD3D11()
+{
+}
+
+void Renderer11::SamplerMetadataD3D11::initData(unsigned int samplerCount)
+{
+    mSamplerMetadata.resize(samplerCount);
+}
+
+void Renderer11::SamplerMetadataD3D11::update(unsigned int samplerIndex, const gl::Texture &amp;texture)
+{
+    unsigned int baseLevel = texture.getBaseLevel();
+    GLenum internalFormat = texture.getInternalFormat(texture.getTarget(), texture.getBaseLevel());
+    if (mSamplerMetadata[samplerIndex].baseLevel != static_cast&lt;int&gt;(baseLevel))
</ins><span class="cx">     {
</span><del>-        mAppliedRTVs[rtIndex] = DirtyPointer;
</del><ins>+        mSamplerMetadata[samplerIndex].baseLevel = static_cast&lt;int&gt;(baseLevel);
+        mDirty                                   = true;
</ins><span class="cx">     }
</span><del>-    mAppliedDSV = DirtyPointer;
-    mDepthStencilInitialized = false;
-    mRenderTargetDescInitialized = false;
</del><span class="cx"> 
</span><del>-    // We reset the current SRV data because it might not be in sync with D3D's state
-    // anymore. For example when a currently used SRV is used as an RTV, D3D silently
-    // remove it from its state.
-    memset(mCurVertexSRVs.data(), 0, sizeof(SRVRecord) * mCurVertexSRVs.size());
-    memset(mCurPixelSRVs.data(), 0, sizeof(SRVRecord) * mCurPixelSRVs.size());
</del><ins>+    // Some metadata is needed only for integer textures. We avoid updating the constant buffer
+    // unnecessarily by changing the data only in case the texture is an integer texture and
+    // the values have changed.
+    bool needIntegerTextureMetadata = false;
+    // internalFormatBits == 0 means a 32-bit texture in the case of integer textures.
+    int internalFormatBits = 0;
+    switch (internalFormat)
+    {
+        case GL_RGBA32I:
+        case GL_RGBA32UI:
+        case GL_RGB32I:
+        case GL_RGB32UI:
+        case GL_RG32I:
+        case GL_RG32UI:
+        case GL_R32I:
+        case GL_R32UI:
+            needIntegerTextureMetadata = true;
+            break;
+        case GL_RGBA16I:
+        case GL_RGBA16UI:
+        case GL_RGB16I:
+        case GL_RGB16UI:
+        case GL_RG16I:
+        case GL_RG16UI:
+        case GL_R16I:
+        case GL_R16UI:
+            needIntegerTextureMetadata = true;
+            internalFormatBits     = 16;
+            break;
+        case GL_RGBA8I:
+        case GL_RGBA8UI:
+        case GL_RGB8I:
+        case GL_RGB8UI:
+        case GL_RG8I:
+        case GL_RG8UI:
+        case GL_R8I:
+        case GL_R8UI:
+            needIntegerTextureMetadata = true;
+            internalFormatBits     = 8;
+            break;
+        case GL_RGB10_A2UI:
+            needIntegerTextureMetadata = true;
+            internalFormatBits     = 10;
+            break;
+        default:
+            break;
+    }
+    if (needIntegerTextureMetadata)
+    {
+        if (mSamplerMetadata[samplerIndex].internalFormatBits != internalFormatBits)
+        {
+            mSamplerMetadata[samplerIndex].internalFormatBits = internalFormatBits;
+            mDirty                                            = true;
+        }
+        // Pack the wrap values into one integer so we can fit all the metadata in one 4-integer
+        // vector.
+        GLenum wrapS  = texture.getWrapS();
+        GLenum wrapT  = texture.getWrapT();
+        GLenum wrapR  = texture.getWrapR();
+        int wrapModes = GetWrapBits(wrapS) | (GetWrapBits(wrapT) &lt;&lt; 2) | (GetWrapBits(wrapR) &lt;&lt; 4);
+        if (mSamplerMetadata[samplerIndex].wrapModes != wrapModes)
+        {
+            mSamplerMetadata[samplerIndex].wrapModes = wrapModes;
+            mDirty                                   = true;
+        }
+    }
+}
</ins><span class="cx"> 
</span><del>-    ASSERT(mForceSetVertexSamplerStates.size() == mCurVertexSRVs.size());
</del><ins>+const Renderer11::SamplerMetadataD3D11::dx_SamplerMetadata *
+Renderer11::SamplerMetadataD3D11::getData() const
+{
+    return mSamplerMetadata.data();
+}
+
+size_t Renderer11::SamplerMetadataD3D11::sizeBytes() const
+{
+    return sizeof(SamplerMetadataD3D11::dx_SamplerMetadata) * mSamplerMetadata.size();
+}
+
+template &lt;class TShaderConstants&gt;
+void Renderer11::applyDriverConstantsIfNeeded(TShaderConstants *appliedConstants,
+                                              const TShaderConstants &amp;constants,
+                                              SamplerMetadataD3D11 *samplerMetadata,
+                                              size_t samplerMetadataReferencedBytes,
+                                              ID3D11Buffer *driverConstantBuffer)
+{
+    ASSERT(driverConstantBuffer != nullptr);
+    if (memcmp(appliedConstants, &amp;constants, sizeof(TShaderConstants)) != 0 ||
+        samplerMetadata-&gt;isDirty())
+    {
+        memcpy(appliedConstants, &amp;constants, sizeof(TShaderConstants));
+
+        D3D11_MAPPED_SUBRESOURCE mapping = {0};
+        HRESULT result =
+            mDeviceContext-&gt;Map(driverConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &amp;mapping);
+        ASSERT(SUCCEEDED(result));
+        UNUSED_ASSERTION_VARIABLE(result);
+        memcpy(mapping.pData, appliedConstants, sizeof(TShaderConstants));
+        // Previous buffer contents were discarded, so we need to refresh also the area of the
+        // buffer that isn't used by this program.
+        memcpy(&amp;reinterpret_cast&lt;uint8_t *&gt;(mapping.pData)[sizeof(TShaderConstants)],
+               samplerMetadata-&gt;getData(), samplerMetadata-&gt;sizeBytes());
+        mDeviceContext-&gt;Unmap(driverConstantBuffer, 0);
+
+        samplerMetadata-&gt;markClean();
+    }
+}
+
+template void Renderer11::applyDriverConstantsIfNeeded&lt;dx_VertexConstants11&gt;(
+    dx_VertexConstants11 *appliedConstants,
+    const dx_VertexConstants11 &amp;constants,
+    SamplerMetadataD3D11 *samplerMetadata,
+    size_t samplerMetadataReferencedBytes,
+    ID3D11Buffer *driverConstantBuffer);
+template void Renderer11::applyDriverConstantsIfNeeded&lt;dx_PixelConstants11&gt;(
+    dx_PixelConstants11 *appliedConstants,
+    const dx_PixelConstants11 &amp;constants,
+    SamplerMetadataD3D11 *samplerMetadata,
+    size_t samplerMetadataReferencedBytes,
+    ID3D11Buffer *driverConstantBuffer);
+
+void Renderer11::markAllStateDirty()
+{
+    TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;Renderer11::markAllStateDirty&quot;);
+
</ins><span class="cx">     for (size_t vsamplerId = 0; vsamplerId &lt; mForceSetVertexSamplerStates.size(); ++vsamplerId)
</span><span class="cx">     {
</span><span class="cx">         mForceSetVertexSamplerStates[vsamplerId] = true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(mForceSetPixelSamplerStates.size() == mCurPixelSRVs.size());
</del><span class="cx">     for (size_t fsamplerId = 0; fsamplerId &lt; mForceSetPixelSamplerStates.size(); ++fsamplerId)
</span><span class="cx">     {
</span><span class="cx">         mForceSetPixelSamplerStates[fsamplerId] = true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mForceSetBlendState = true;
-    mForceSetRasterState = true;
-    mForceSetDepthStencilState = true;
-    mForceSetScissor = true;
-    mForceSetViewport = true;
</del><ins>+    mStateManager.invalidateEverything();
</ins><span class="cx"> 
</span><span class="cx">     mAppliedIB = NULL;
</span><span class="cx">     mAppliedIBFormat = DXGI_FORMAT_UNKNOWN;
</span><span class="cx">     mAppliedIBOffset = 0;
</span><span class="cx"> 
</span><del>-    mAppliedVertexShader = DirtyPointer;
-    mAppliedGeometryShader = DirtyPointer;
-    mAppliedPixelShader = DirtyPointer;
</del><ins>+    mAppliedVertexShader   = angle::DirtyPointer;
+    mAppliedGeometryShader = angle::DirtyPointer;
+    mAppliedPixelShader    = angle::DirtyPointer;
</ins><span class="cx"> 
</span><span class="cx">     mAppliedNumXFBBindings = static_cast&lt;size_t&gt;(-1);
</span><span class="cx"> 
</span><span class="lines">@@ -2132,8 +2532,8 @@
</span><span class="cx">         mAppliedTFOffsets[i] = 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    memset(&amp;mAppliedVertexConstants, 0, sizeof(dx_VertexConstants));
-    memset(&amp;mAppliedPixelConstants, 0, sizeof(dx_PixelConstants));
</del><ins>+    memset(&amp;mAppliedVertexConstants, 0, sizeof(dx_VertexConstants11));
+    memset(&amp;mAppliedPixelConstants, 0, sizeof(dx_PixelConstants11));
</ins><span class="cx"> 
</span><span class="cx">     mInputLayoutCache.markDirty();
</span><span class="cx"> 
</span><span class="lines">@@ -2156,6 +2556,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Renderer11::releaseDeviceResources()
</span><span class="cx"> {
</span><ins>+    mStateManager.deinitialize();
</ins><span class="cx">     mStateCache.clear();
</span><span class="cx">     mInputLayoutCache.clear();
</span><span class="cx"> 
</span><span class="lines">@@ -2215,20 +2616,16 @@
</span><span class="cx">     D3D_FEATURE_LEVEL dummyFeatureLevel;
</span><span class="cx">     ID3D11DeviceContext* dummyContext;
</span><span class="cx"> 
</span><del>-    HRESULT result = D3D11CreateDevice(NULL,
-                                       mDriverType,
-                                       NULL,
</del><ins>+    ASSERT(mRequestedDriverType != D3D_DRIVER_TYPE_UNKNOWN);
+    HRESULT result = D3D11CreateDevice(
+        NULL, mRequestedDriverType, NULL,
</ins><span class="cx">                                        #if defined(_DEBUG)
</span><del>-                                       D3D11_CREATE_DEVICE_DEBUG,
</del><ins>+        D3D11_CREATE_DEVICE_DEBUG,
</ins><span class="cx">                                        #else
</span><del>-                                       0,
</del><ins>+        0,
</ins><span class="cx">                                        #endif
</span><del>-                                       mAvailableFeatureLevels.data(),
-                                       mAvailableFeatureLevels.size(),
-                                       D3D11_SDK_VERSION,
-                                       &amp;dummyDevice,
-                                       &amp;dummyFeatureLevel,
-                                       &amp;dummyContext);
</del><ins>+        mAvailableFeatureLevels.data(), static_cast&lt;unsigned int&gt;(mAvailableFeatureLevels.size()),
+        D3D11_SDK_VERSION, &amp;dummyDevice, &amp;dummyFeatureLevel, &amp;dummyContext);
</ins><span class="cx"> 
</span><span class="cx">     if (!mDevice || FAILED(result))
</span><span class="cx">     {
</span><span class="lines">@@ -2247,6 +2644,13 @@
</span><span class="cx"> 
</span><span class="cx">     releaseDeviceResources();
</span><span class="cx"> 
</span><ins>+    if (!mCreatedWithDeviceEXT)
+    {
+        // Only delete the device if the Renderer11 owns it
+        // Otherwise we should keep it around in case we try to reinitialize the renderer later
+        SafeDelete(mEGLDevice);
+    }
+
</ins><span class="cx">     SafeRelease(mDxgiFactory);
</span><span class="cx">     SafeRelease(mDxgiAdapter);
</span><span class="cx"> 
</span><span class="lines">@@ -2274,7 +2678,15 @@
</span><span class="cx">         mDxgiModule = NULL;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (mDCompModule)
+    {
+        FreeLibrary(mDCompModule);
+        mDCompModule = NULL;
+    }
+
</ins><span class="cx">     mCompiler.release();
</span><ins>+
+    mSupportsShareHandles.reset();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Renderer11::resetDevice()
</span><span class="lines">@@ -2294,11 +2706,6 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-VendorID Renderer11::getVendorId() const
-{
-    return static_cast&lt;VendorID&gt;(mAdapterDescription.VendorId);
-}
-
</del><span class="cx"> std::string Renderer11::getRendererDescription() const
</span><span class="cx"> {
</span><span class="cx">     std::ostringstream rendererString;
</span><span class="lines">@@ -2312,24 +2719,29 @@
</span><span class="cx">     return rendererString.str();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GUID Renderer11::getAdapterIdentifier() const
</del><ins>+DeviceIdentifier Renderer11::getAdapterIdentifier() const
</ins><span class="cx"> {
</span><del>-    // Use the adapter LUID as our adapter ID
-    // This number is local to a machine is only guaranteed to be unique between restarts
-    static_assert(sizeof(LUID) &lt;= sizeof(GUID), &quot;Size of GUID must be at least as large as LUID.&quot;);
-    GUID adapterId = {0};
-    memcpy(&amp;adapterId, &amp;mAdapterDescription.AdapterLuid, sizeof(LUID));
-    return adapterId;
</del><ins>+    // Don't use the AdapterLuid here, since that doesn't persist across reboot.
+    DeviceIdentifier deviceIdentifier = { 0 };
+    deviceIdentifier.VendorId = mAdapterDescription.VendorId;
+    deviceIdentifier.DeviceId = mAdapterDescription.DeviceId;
+    deviceIdentifier.SubSysId = mAdapterDescription.SubSysId;
+    deviceIdentifier.Revision = mAdapterDescription.Revision;
+    deviceIdentifier.FeatureLevel = static_cast&lt;UINT&gt;(mRenderer11DeviceCaps.featureLevel);
+
+    return deviceIdentifier;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned int Renderer11::getReservedVertexUniformVectors() const
</span><span class="cx"> {
</span><del>-    return 0;   // Driver uniforms are stored in a separate constant buffer
</del><ins>+    // Driver uniforms are stored in a separate constant buffer
+    return d3d11_gl::GetReservedVertexUniformVectors(mRenderer11DeviceCaps.featureLevel);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned int Renderer11::getReservedFragmentUniformVectors() const
</span><span class="cx"> {
</span><del>-    return 0;   // Driver uniforms are stored in a separate constant buffer
</del><ins>+    // Driver uniforms are stored in a separate constant buffer
+    return d3d11_gl::GetReservedFragmentUniformVectors(mRenderer11DeviceCaps.featureLevel);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned int Renderer11::getReservedVertexUniformBuffers() const
</span><span class="lines">@@ -2344,45 +2756,100 @@
</span><span class="cx">     return 2;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+d3d11::ANGLED3D11DeviceType Renderer11::getDeviceType() const
+{
+    if (mCreatedWithDeviceEXT)
+    {
+        return d3d11::GetDeviceType(mDevice);
+    }
+
+    if ((mRequestedDriverType == D3D_DRIVER_TYPE_SOFTWARE) ||
+        (mRequestedDriverType == D3D_DRIVER_TYPE_REFERENCE) ||
+        (mRequestedDriverType == D3D_DRIVER_TYPE_NULL))
+    {
+        return d3d11::ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL;
+    }
+
+    if (mRequestedDriverType == D3D_DRIVER_TYPE_WARP)
+    {
+        return d3d11::ANGLE_D3D11_DEVICE_TYPE_WARP;
+    }
+
+    return d3d11::ANGLE_D3D11_DEVICE_TYPE_HARDWARE;
+}
+
</ins><span class="cx"> bool Renderer11::getShareHandleSupport() const
</span><span class="cx"> {
</span><ins>+    if (mSupportsShareHandles.valid())
+    {
+        return mSupportsShareHandles.value();
+    }
+
</ins><span class="cx">     // We only currently support share handles with BGRA surfaces, because
</span><span class="cx">     // chrome needs BGRA. Once chrome fixes this, we should always support them.
</span><span class="cx">     if (!getRendererExtensions().textureFormatBGRA8888)
</span><span class="cx">     {
</span><ins>+        mSupportsShareHandles = false;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // PIX doesn't seem to support using share handles, so disable them.
</span><span class="cx">     if (gl::DebugAnnotationsActive())
</span><span class="cx">     {
</span><ins>+        mSupportsShareHandles = false;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Also disable share handles on Feature Level 9_3, since it doesn't support share handles on RGBA8 textures/swapchains.
</span><del>-    if (mFeatureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
</del><ins>+    if (mRenderer11DeviceCaps.featureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
</ins><span class="cx">     {
</span><ins>+        mSupportsShareHandles = false;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Also disable on non-hardware drivers, since sharing doesn't work cross-driver.
-    if (mDriverType != D3D_DRIVER_TYPE_HARDWARE)
</del><ins>+    // Find out which type of D3D11 device the Renderer11 is using
+    d3d11::ANGLED3D11DeviceType deviceType = getDeviceType();
+    if (deviceType == d3d11::ANGLE_D3D11_DEVICE_TYPE_UNKNOWN)
</ins><span class="cx">     {
</span><ins>+        mSupportsShareHandles = false;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (deviceType == d3d11::ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL)
+    {
+        // Software/Reference/NULL devices don't support share handles
+        mSupportsShareHandles = false;
+        return false;
+    }
+
+    if (deviceType == d3d11::ANGLE_D3D11_DEVICE_TYPE_WARP)
+    {
+#ifndef ANGLE_ENABLE_WINDOWS_STORE
+        if (!IsWindows8OrGreater())
+        {
+            // WARP on Windows 7 doesn't support shared handles
+            mSupportsShareHandles = false;
+            return false;
+        }
+#endif  // ANGLE_ENABLE_WINDOWS_STORE
+
+        // WARP on Windows 8.0+ supports shared handles when shared with another WARP device
+        // TODO: allow applications to query for HARDWARE or WARP-specific share handles,
+        //       to prevent them trying to use a WARP share handle with an a HW device (or
+        //       vice-versa)
+        //       e.g. by creating EGL_D3D11_[HARDWARE/WARP]_DEVICE_SHARE_HANDLE_ANGLE
+        mSupportsShareHandles = true;
+        return true;
+    }
+
+    ASSERT(mCreatedWithDeviceEXT || mRequestedDriverType == D3D_DRIVER_TYPE_HARDWARE);
+    mSupportsShareHandles = true;
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Renderer11::getPostSubBufferSupport() const
-{
-    // D3D11 does not support present with dirty rectangles until D3D11.1 and DXGI 1.2.
-    return false;
-}
-
</del><span class="cx"> int Renderer11::getMajorShaderModel() const
</span><span class="cx"> {
</span><del>-    switch (mFeatureLevel)
</del><ins>+    switch (mRenderer11DeviceCaps.featureLevel)
</ins><span class="cx">     {
</span><span class="cx">       case D3D_FEATURE_LEVEL_11_0: return D3D11_SHADER_MAJOR_VERSION;   // 5
</span><span class="cx">       case D3D_FEATURE_LEVEL_10_1: return D3D10_1_SHADER_MAJOR_VERSION; // 4
</span><span class="lines">@@ -2394,7 +2861,7 @@
</span><span class="cx"> 
</span><span class="cx"> int Renderer11::getMinorShaderModel() const
</span><span class="cx"> {
</span><del>-    switch (mFeatureLevel)
</del><ins>+    switch (mRenderer11DeviceCaps.featureLevel)
</ins><span class="cx">     {
</span><span class="cx">       case D3D_FEATURE_LEVEL_11_0: return D3D11_SHADER_MINOR_VERSION;   // 0
</span><span class="cx">       case D3D_FEATURE_LEVEL_10_1: return D3D10_1_SHADER_MINOR_VERSION; // 1
</span><span class="lines">@@ -2406,7 +2873,7 @@
</span><span class="cx"> 
</span><span class="cx"> std::string Renderer11::getShaderModelSuffix() const
</span><span class="cx"> {
</span><del>-    switch (mFeatureLevel)
</del><ins>+    switch (mRenderer11DeviceCaps.featureLevel)
</ins><span class="cx">     {
</span><span class="cx">       case D3D_FEATURE_LEVEL_11_0: return &quot;&quot;;
</span><span class="cx">       case D3D_FEATURE_LEVEL_10_1: return &quot;&quot;;
</span><span class="lines">@@ -2416,6 +2883,17 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const WorkaroundsD3D &amp;RendererD3D::getWorkarounds() const
+{
+    if (!mWorkaroundsInitialized)
+    {
+        mWorkarounds            = generateWorkarounds();
+        mWorkaroundsInitialized = true;
+    }
+
+    return mWorkarounds;
+}
+
</ins><span class="cx"> gl::Error Renderer11::copyImage2D(const gl::Framebuffer *framebuffer, const gl::Rectangle &amp;sourceRect, GLenum destFormat,
</span><span class="cx">                                   const gl::Offset &amp;destOffset, TextureStorage *storage, GLint level)
</span><span class="cx"> {
</span><span class="lines">@@ -2430,7 +2908,7 @@
</span><span class="cx">     }
</span><span class="cx">     ASSERT(sourceRenderTarget);
</span><span class="cx"> 
</span><del>-    ID3D11ShaderResourceView *source = sourceRenderTarget-&gt;getShaderResourceView();
</del><ins>+    ID3D11ShaderResourceView *source = sourceRenderTarget-&gt;getBlitShaderResourceView();
</ins><span class="cx">     ASSERT(source);
</span><span class="cx"> 
</span><span class="cx">     TextureStorage11_2D *storage11 = GetAs&lt;TextureStorage11_2D&gt;(storage);
</span><span class="lines">@@ -2451,12 +2929,20 @@
</span><span class="cx">     gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1);
</span><span class="cx">     gl::Extents sourceSize(sourceRenderTarget-&gt;getWidth(), sourceRenderTarget-&gt;getHeight(), 1);
</span><span class="cx"> 
</span><ins>+    const bool invertSource = UsePresentPathFast(this, colorbuffer);
+    if (invertSource)
+    {
+        sourceArea.y      = sourceSize.height - sourceRect.y;
+        sourceArea.height = -sourceArea.height;
+    }
+
</ins><span class="cx">     gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1);
</span><span class="cx">     gl::Extents destSize(destRenderTarget-&gt;getWidth(), destRenderTarget-&gt;getHeight(), 1);
</span><span class="cx"> 
</span><span class="cx">     // Use nearest filtering because source and destination are the same size for the direct
</span><span class="cx">     // copy
</span><del>-    mBlit-&gt;copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL, destFormat, GL_NEAREST);
</del><ins>+    error = mBlit-&gt;copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
+                               destFormat, GL_NEAREST, false);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -2481,7 +2967,7 @@
</span><span class="cx">     }
</span><span class="cx">     ASSERT(sourceRenderTarget);
</span><span class="cx"> 
</span><del>-    ID3D11ShaderResourceView *source = sourceRenderTarget-&gt;getShaderResourceView();
</del><ins>+    ID3D11ShaderResourceView *source = sourceRenderTarget-&gt;getBlitShaderResourceView();
</ins><span class="cx">     ASSERT(source);
</span><span class="cx"> 
</span><span class="cx">     TextureStorage11_Cube *storage11 = GetAs&lt;TextureStorage11_Cube&gt;(storage);
</span><span class="lines">@@ -2502,12 +2988,20 @@
</span><span class="cx">     gl::Box sourceArea(sourceRect.x, sourceRect.y, 0, sourceRect.width, sourceRect.height, 1);
</span><span class="cx">     gl::Extents sourceSize(sourceRenderTarget-&gt;getWidth(), sourceRenderTarget-&gt;getHeight(), 1);
</span><span class="cx"> 
</span><ins>+    const bool invertSource = UsePresentPathFast(this, colorbuffer);
+    if (invertSource)
+    {
+        sourceArea.y      = sourceSize.height - sourceRect.y;
+        sourceArea.height = -sourceArea.height;
+    }
+
</ins><span class="cx">     gl::Box destArea(destOffset.x, destOffset.y, 0, sourceRect.width, sourceRect.height, 1);
</span><span class="cx">     gl::Extents destSize(destRenderTarget-&gt;getWidth(), destRenderTarget-&gt;getHeight(), 1);
</span><span class="cx"> 
</span><span class="cx">     // Use nearest filtering because source and destination are the same size for the direct
</span><span class="cx">     // copy
</span><del>-    error = mBlit-&gt;copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL, destFormat, GL_NEAREST);
</del><ins>+    error = mBlit-&gt;copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
+                               destFormat, GL_NEAREST, false);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -2532,7 +3026,7 @@
</span><span class="cx">     }
</span><span class="cx">     ASSERT(sourceRenderTarget);
</span><span class="cx"> 
</span><del>-    ID3D11ShaderResourceView *source = sourceRenderTarget-&gt;getShaderResourceView();
</del><ins>+    ID3D11ShaderResourceView *source = sourceRenderTarget-&gt;getBlitShaderResourceView();
</ins><span class="cx">     ASSERT(source);
</span><span class="cx"> 
</span><span class="cx">     TextureStorage11_3D *storage11 = GetAs&lt;TextureStorage11_3D&gt;(storage);
</span><span class="lines">@@ -2558,7 +3052,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Use nearest filtering because source and destination are the same size for the direct
</span><span class="cx">     // copy
</span><del>-    error = mBlit-&gt;copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL, destFormat, GL_NEAREST);
</del><ins>+    error = mBlit-&gt;copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
+                               destFormat, GL_NEAREST, false);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -2583,7 +3078,7 @@
</span><span class="cx">     }
</span><span class="cx">     ASSERT(sourceRenderTarget);
</span><span class="cx"> 
</span><del>-    ID3D11ShaderResourceView *source = sourceRenderTarget-&gt;getShaderResourceView();
</del><ins>+    ID3D11ShaderResourceView *source = sourceRenderTarget-&gt;getBlitShaderResourceView();
</ins><span class="cx">     ASSERT(source);
</span><span class="cx"> 
</span><span class="cx">     TextureStorage11_2DArray *storage11 = GetAs&lt;TextureStorage11_2DArray&gt;(storage);
</span><span class="lines">@@ -2609,7 +3104,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Use nearest filtering because source and destination are the same size for the direct
</span><span class="cx">     // copy
</span><del>-    error = mBlit-&gt;copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL, destFormat, GL_NEAREST);
</del><ins>+    error = mBlit-&gt;copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
+                               destFormat, GL_NEAREST, false);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -2620,31 +3116,9 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer11::unapplyRenderTargets()
-{
-    setOneTimeRenderTarget(NULL);
-}
-
-// When finished with this rendertarget, markAllStateDirty must be called.
-void Renderer11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView)
-{
-    ID3D11RenderTargetView *rtvArray[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS] = {NULL};
-
-    rtvArray[0] = renderTargetView;
-
-    mDeviceContext-&gt;OMSetRenderTargets(getRendererCaps().maxDrawBuffers, rtvArray, NULL);
-
-    // Do not preserve the serial for this one-time-use render target
-    for (size_t rtIndex = 0; rtIndex &lt; ArraySize(mAppliedRTVs); rtIndex++)
-    {
-        mAppliedRTVs[rtIndex] = DirtyPointer;
-    }
-    mAppliedDSV = DirtyPointer;
-}
-
</del><span class="cx"> gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTargetD3D **outRT)
</span><span class="cx"> {
</span><del>-    const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(format, mFeatureLevel);
</del><ins>+    const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(format, mRenderer11DeviceCaps);
</ins><span class="cx"> 
</span><span class="cx">     const gl::TextureCaps &amp;textureCaps = getRendererTextureCaps().get(format);
</span><span class="cx">     GLuint supportedSamples = textureCaps.getNearestSamples(samples);
</span><span class="lines">@@ -2657,7 +3131,7 @@
</span><span class="cx">         desc.Height = height;
</span><span class="cx">         desc.MipLevels = 1;
</span><span class="cx">         desc.ArraySize = 1;
</span><del>-        desc.Format = formatInfo.texFormat;
</del><ins>+        desc.Format             = formatInfo.formatSet-&gt;texFormat;
</ins><span class="cx">         desc.SampleDesc.Count = (supportedSamples == 0) ? 1 : supportedSamples;
</span><span class="cx">         desc.SampleDesc.Quality = 0;
</span><span class="cx">         desc.Usage = D3D11_USAGE_DEFAULT;
</span><span class="lines">@@ -2668,14 +3142,15 @@
</span><span class="cx">         // we'll flag it to allow binding that way. Shader resource views are a little
</span><span class="cx">         // more complicated.
</span><span class="cx">         bool bindRTV = false, bindDSV = false, bindSRV = false;
</span><del>-        bindRTV = (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN);
-        bindDSV = (formatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN);
-        if (formatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
</del><ins>+        bindRTV = (formatInfo.formatSet-&gt;rtvFormat != DXGI_FORMAT_UNKNOWN);
+        bindDSV = (formatInfo.formatSet-&gt;dsvFormat != DXGI_FORMAT_UNKNOWN);
+        if (formatInfo.formatSet-&gt;srvFormat != DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">         {
</span><span class="cx">             // Multisample targets flagged for binding as depth stencil cannot also be
</span><span class="cx">             // flagged for binding as SRV, so make certain not to add the SRV flag for
</span><span class="cx">             // these targets.
</span><del>-            bindSRV = !(formatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN &amp;&amp; desc.SampleDesc.Count &gt; 1);
</del><ins>+            bindSRV = !(formatInfo.formatSet-&gt;dsvFormat != DXGI_FORMAT_UNKNOWN &amp;&amp;
+                        desc.SampleDesc.Count &gt; 1);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         desc.BindFlags = (bindRTV ? D3D11_BIND_RENDER_TARGET   : 0) |
</span><span class="lines">@@ -2693,11 +3168,12 @@
</span><span class="cx">             return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create render target texture, result: 0x%X.&quot;, result);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        ID3D11ShaderResourceView *srv = NULL;
</del><ins>+        ID3D11ShaderResourceView *srv     = nullptr;
+        ID3D11ShaderResourceView *blitSRV = nullptr;
</ins><span class="cx">         if (bindSRV)
</span><span class="cx">         {
</span><span class="cx">             D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
</span><del>-            srvDesc.Format = formatInfo.srvFormat;
</del><ins>+            srvDesc.Format                    = formatInfo.formatSet-&gt;srvFormat;
</ins><span class="cx">             srvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS;
</span><span class="cx">             srvDesc.Texture2D.MostDetailedMip = 0;
</span><span class="cx">             srvDesc.Texture2D.MipLevels = 1;
</span><span class="lines">@@ -2709,12 +3185,40 @@
</span><span class="cx">                 SafeRelease(texture);
</span><span class="cx">                 return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create render target shader resource view, result: 0x%X.&quot;, result);
</span><span class="cx">             }
</span><ins>+
+            if (formatInfo.formatSet-&gt;blitSRVFormat != formatInfo.formatSet-&gt;srvFormat)
+            {
+                D3D11_SHADER_RESOURCE_VIEW_DESC blitSRVDesc;
+                blitSRVDesc.Format        = formatInfo.formatSet-&gt;blitSRVFormat;
+                blitSRVDesc.ViewDimension = (supportedSamples == 0)
+                                                ? D3D11_SRV_DIMENSION_TEXTURE2D
+                                                : D3D11_SRV_DIMENSION_TEXTURE2DMS;
+                blitSRVDesc.Texture2D.MostDetailedMip = 0;
+                blitSRVDesc.Texture2D.MipLevels       = 1;
+
+                result = mDevice-&gt;CreateShaderResourceView(texture, &amp;blitSRVDesc, &amp;blitSRV);
+                if (FAILED(result))
+                {
+                    ASSERT(result == E_OUTOFMEMORY);
+                    SafeRelease(texture);
+                    SafeRelease(srv);
+                    return gl::Error(GL_OUT_OF_MEMORY,
+                                     &quot;Failed to create render target shader resource view for &quot;
+                                     &quot;blits, result: 0x%X.&quot;,
+                                     result);
+                }
+            }
+            else
+            {
+                blitSRV = srv;
+                srv-&gt;AddRef();
+            }
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (bindDSV)
</span><span class="cx">         {
</span><span class="cx">             D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
</span><del>-            dsvDesc.Format = formatInfo.dsvFormat;
</del><ins>+            dsvDesc.Format             = formatInfo.formatSet-&gt;dsvFormat;
</ins><span class="cx">             dsvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_DSV_DIMENSION_TEXTURE2D : D3D11_DSV_DIMENSION_TEXTURE2DMS;
</span><span class="cx">             dsvDesc.Texture2D.MipSlice = 0;
</span><span class="cx">             dsvDesc.Flags = 0;
</span><span class="lines">@@ -2726,17 +3230,20 @@
</span><span class="cx">                 ASSERT(result == E_OUTOFMEMORY);
</span><span class="cx">                 SafeRelease(texture);
</span><span class="cx">                 SafeRelease(srv);
</span><ins>+                SafeRelease(blitSRV);
</ins><span class="cx">                 return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create render target depth stencil view, result: 0x%X.&quot;, result);
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            *outRT = new TextureRenderTarget11(dsv, texture, srv, format, width, height, 1, supportedSamples);
</del><ins>+            *outRT =
+                new TextureRenderTarget11(dsv, texture, srv, format, formatInfo.formatSet-&gt;format,
+                                          width, height, 1, supportedSamples);
</ins><span class="cx"> 
</span><span class="cx">             SafeRelease(dsv);
</span><span class="cx">         }
</span><span class="cx">         else if (bindRTV)
</span><span class="cx">         {
</span><span class="cx">             D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-            rtvDesc.Format = formatInfo.rtvFormat;
</del><ins>+            rtvDesc.Format             = formatInfo.formatSet-&gt;rtvFormat;
</ins><span class="cx">             rtvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_RTV_DIMENSION_TEXTURE2D : D3D11_RTV_DIMENSION_TEXTURE2DMS;
</span><span class="cx">             rtvDesc.Texture2D.MipSlice = 0;
</span><span class="cx"> 
</span><span class="lines">@@ -2747,6 +3254,7 @@
</span><span class="cx">                 ASSERT(result == E_OUTOFMEMORY);
</span><span class="cx">                 SafeRelease(texture);
</span><span class="cx">                 SafeRelease(srv);
</span><ins>+                SafeRelease(blitSRV);
</ins><span class="cx">                 return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create render target render target view, result: 0x%X.&quot;, result);
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="lines">@@ -2756,7 +3264,9 @@
</span><span class="cx">                 mDeviceContext-&gt;ClearRenderTargetView(rtv, clearValues);
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            *outRT = new TextureRenderTarget11(rtv, texture, srv, format, width, height, 1, supportedSamples);
</del><ins>+            *outRT = new TextureRenderTarget11(rtv, texture, srv, blitSRV, format,
+                                               formatInfo.formatSet-&gt;format, width, height, 1,
+                                               supportedSamples);
</ins><span class="cx"> 
</span><span class="cx">             SafeRelease(rtv);
</span><span class="cx">         }
</span><span class="lines">@@ -2767,18 +3277,38 @@
</span><span class="cx"> 
</span><span class="cx">         SafeRelease(texture);
</span><span class="cx">         SafeRelease(srv);
</span><ins>+        SafeRelease(blitSRV);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        *outRT = new TextureRenderTarget11(reinterpret_cast&lt;ID3D11RenderTargetView*&gt;(NULL), NULL, NULL, format, width, height, 1, supportedSamples);
</del><ins>+        *outRT = new TextureRenderTarget11(static_cast&lt;ID3D11RenderTargetView *&gt;(nullptr), nullptr,
+                                           nullptr, nullptr, format, d3d11::ANGLE_FORMAT_NONE,
+                                           width, height, 1, supportedSamples);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FramebufferImpl *Renderer11::createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data)
</del><ins>+gl::Error Renderer11::createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT)
</ins><span class="cx"> {
</span><del>-    return createFramebuffer(data);
</del><ins>+    ASSERT(source != nullptr);
+
+    RenderTargetD3D *newRT = nullptr;
+    gl::Error error = createRenderTarget(source-&gt;getWidth(), source-&gt;getHeight(),
+                                         source-&gt;getInternalFormat(), source-&gt;getSamples(), &amp;newRT);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    RenderTarget11 *source11 = GetAs&lt;RenderTarget11&gt;(source);
+    RenderTarget11 *dest11   = GetAs&lt;RenderTarget11&gt;(newRT);
+
+    mDeviceContext-&gt;CopySubresourceRegion(dest11-&gt;getTexture(), dest11-&gt;getSubresourceIndex(), 0, 0,
+                                          0, source11-&gt;getTexture(),
+                                          source11-&gt;getSubresourceIndex(), nullptr);
+    *outRT = newRT;
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FramebufferImpl *Renderer11::createFramebuffer(const gl::Framebuffer::Data &amp;data)
</span><span class="lines">@@ -2786,25 +3316,23 @@
</span><span class="cx">     return new Framebuffer11(data, this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CompilerImpl *Renderer11::createCompiler(const gl::Data &amp;data)
</del><ins>+ShaderImpl *Renderer11::createShader(const gl::Shader::Data &amp;data)
</ins><span class="cx"> {
</span><del>-    return new CompilerD3D(data, SH_HLSL11_OUTPUT);
</del><ins>+    return new ShaderD3D(data);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ShaderImpl *Renderer11::createShader(GLenum type)
</del><ins>+ProgramImpl *Renderer11::createProgram(const gl::Program::Data &amp;data)
</ins><span class="cx"> {
</span><del>-    return new ShaderD3D(type);
</del><ins>+    return new ProgramD3D(data, this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ProgramImpl *Renderer11::createProgram()
</del><ins>+gl::Error Renderer11::loadExecutable(const void *function,
+                                     size_t length,
+                                     ShaderType type,
+                                     const std::vector&lt;D3DVarying&gt; &amp;streamOutVaryings,
+                                     bool separatedOutputBuffers,
+                                     ShaderExecutableD3D **outExecutable)
</ins><span class="cx"> {
</span><del>-    return new ProgramD3D(this);
-}
-
-gl::Error Renderer11::loadExecutable(const void *function, size_t length, ShaderType type,
-                                     const std::vector&lt;gl::LinkedVarying&gt; &amp;transformFeedbackVaryings,
-                                     bool separatedOutputBuffers, ShaderExecutableD3D **outExecutable)
-{
</del><span class="cx">     switch (type)
</span><span class="cx">     {
</span><span class="cx">       case SHADER_VERTEX:
</span><span class="lines">@@ -2819,29 +3347,28 @@
</span><span class="cx">                 return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create vertex shader, result: 0x%X.&quot;, result);
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            if (transformFeedbackVaryings.size() &gt; 0)
</del><ins>+            if (!streamOutVaryings.empty())
</ins><span class="cx">             {
</span><span class="cx">                 std::vector&lt;D3D11_SO_DECLARATION_ENTRY&gt; soDeclaration;
</span><del>-                for (size_t i = 0; i &lt; transformFeedbackVaryings.size(); i++)
</del><ins>+                soDeclaration.reserve(streamOutVaryings.size());
+
+                for (const auto &amp;streamOutVarying : streamOutVaryings)
</ins><span class="cx">                 {
</span><del>-                    const gl::LinkedVarying &amp;varying = transformFeedbackVaryings[i];
-                    GLenum transposedType = gl::TransposeMatrixType(varying.type);
-
-                    for (size_t j = 0; j &lt; varying.semanticIndexCount; j++)
-                    {
-                        D3D11_SO_DECLARATION_ENTRY entry = { 0 };
-                        entry.Stream = 0;
-                        entry.SemanticName = varying.semanticName.c_str();
-                        entry.SemanticIndex = varying.semanticIndex + j;
-                        entry.StartComponent = 0;
-                        entry.ComponentCount = static_cast&lt;BYTE&gt;(gl::VariableColumnCount(transposedType));
-                        entry.OutputSlot = static_cast&lt;BYTE&gt;((separatedOutputBuffers ? i : 0));
-                        soDeclaration.push_back(entry);
-                    }
</del><ins>+                    D3D11_SO_DECLARATION_ENTRY entry = {0};
+                    entry.Stream                     = 0;
+                    entry.SemanticName               = streamOutVarying.semanticName.c_str();
+                    entry.SemanticIndex              = streamOutVarying.semanticIndex;
+                    entry.StartComponent             = 0;
+                    entry.ComponentCount             = static_cast&lt;BYTE&gt;(streamOutVarying.componentCount);
+                    entry.OutputSlot = static_cast&lt;BYTE&gt;(
+                        (separatedOutputBuffers ? streamOutVarying.outputSlot : 0));
+                    soDeclaration.push_back(entry);
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                result = mDevice-&gt;CreateGeometryShaderWithStreamOutput(function, length, soDeclaration.data(), soDeclaration.size(),
-                                                                       NULL, 0, 0, NULL, &amp;streamOutShader);
</del><ins>+                result = mDevice-&gt;CreateGeometryShaderWithStreamOutput(
+                    function, static_cast&lt;unsigned int&gt;(length), soDeclaration.data(),
+                    static_cast&lt;unsigned int&gt;(soDeclaration.size()), NULL, 0, 0, NULL,
+                    &amp;streamOutShader);
</ins><span class="cx">                 ASSERT(SUCCEEDED(result));
</span><span class="cx">                 if (FAILED(result))
</span><span class="cx">                 {
</span><span class="lines">@@ -2888,9 +3415,12 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::compileToExecutable(gl::InfoLog &amp;infoLog, const std::string &amp;shaderHLSL, ShaderType type,
-                                          const std::vector&lt;gl::LinkedVarying&gt; &amp;transformFeedbackVaryings,
-                                          bool separatedOutputBuffers, const D3DCompilerWorkarounds &amp;workarounds,
</del><ins>+gl::Error Renderer11::compileToExecutable(gl::InfoLog &amp;infoLog,
+                                          const std::string &amp;shaderHLSL,
+                                          ShaderType type,
+                                          const std::vector&lt;D3DVarying&gt; &amp;streamOutVaryings,
+                                          bool separatedOutputBuffers,
+                                          const D3DCompilerWorkarounds &amp;workarounds,
</ins><span class="cx">                                           ShaderExecutableD3D **outExectuable)
</span><span class="cx"> {
</span><span class="cx">     const char *profileType = NULL;
</span><span class="lines">@@ -2933,6 +3463,15 @@
</span><span class="cx">     configs.push_back(CompileConfig(flags | D3DCOMPILE_SKIP_VALIDATION,   &quot;skip validation&quot;  ));
</span><span class="cx">     configs.push_back(CompileConfig(flags | D3DCOMPILE_SKIP_OPTIMIZATION, &quot;skip optimization&quot;));
</span><span class="cx"> 
</span><ins>+    if (getMajorShaderModel() == 4 &amp;&amp; getShaderModelSuffix() != &quot;&quot;)
+    {
+        // Some shaders might cause a &quot;blob content mismatch between level9 and d3d10 shader&quot;.
+        // e.g. dEQP-GLES2.functional.shaders.struct.local.loop_nested_struct_array_*.
+        // Using the [unroll] directive works around this, as does this D3DCompile flag.
+        configs.push_back(
+            CompileConfig(flags | D3DCOMPILE_AVOID_FLOW_CONTROL, &quot;avoid flow control&quot;));
+    }
+
</ins><span class="cx">     D3D_SHADER_MACRO loopMacros[] = { {&quot;ANGLE_ENABLE_LOOP_FLATTEN&quot;, &quot;1&quot;}, {0, 0} };
</span><span class="cx"> 
</span><span class="cx">     ID3DBlob *binary = NULL;
</span><span class="lines">@@ -2952,7 +3491,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     error = loadExecutable(binary-&gt;GetBufferPointer(), binary-&gt;GetBufferSize(), type,
</span><del>-                           transformFeedbackVaryings, separatedOutputBuffers, outExectuable);
</del><ins>+                           streamOutVaryings, separatedOutputBuffers, outExectuable);
</ins><span class="cx"> 
</span><span class="cx">     SafeRelease(binary);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -2985,12 +3524,14 @@
</span><span class="cx"> 
</span><span class="cx"> BufferImpl *Renderer11::createBuffer()
</span><span class="cx"> {
</span><del>-    return new Buffer11(this);
</del><ins>+    Buffer11 *buffer = new Buffer11(this);
+    mAliveBuffers.insert(buffer);
+    return buffer;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-VertexArrayImpl *Renderer11::createVertexArray()
</del><ins>+VertexArrayImpl *Renderer11::createVertexArray(const gl::VertexArray::Data &amp;data)
</ins><span class="cx"> {
</span><del>-    return new VertexArray11(this);
</del><ins>+    return new VertexArray11(data);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> QueryImpl *Renderer11::createQuery(GLenum type)
</span><span class="lines">@@ -3013,13 +3554,17 @@
</span><span class="cx">     return new TransformFeedbackD3D();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+StreamImpl *Renderer11::createStream(const egl::AttributeMap &amp;attribs)
+{
+    return new Stream11(this);
+}
+
</ins><span class="cx"> bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(getRendererExtensions().pixelBufferObject);
</span><span class="cx"> 
</span><span class="cx">     const gl::InternalFormat &amp;internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
</span><del>-    const d3d11::TextureFormat &amp;d3d11FormatInfo = d3d11::GetTextureFormatInfo(internalFormat, mFeatureLevel);
-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3d11FormatInfo.texFormat);
</del><ins>+    const d3d11::TextureFormat &amp;d3d11FormatInfo = d3d11::GetTextureFormatInfo(internalFormat, mRenderer11DeviceCaps);
</ins><span class="cx"> 
</span><span class="cx">     // sRGB formats do not work with D3D11 buffer SRVs
</span><span class="cx">     if (internalFormatInfo.colorEncoding == GL_SRGB)
</span><span class="lines">@@ -3028,7 +3573,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // We cannot support direct copies to non-color-renderable formats
</span><del>-    if (d3d11FormatInfo.rtvFormat == DXGI_FORMAT_UNKNOWN)
</del><ins>+    if (d3d11FormatInfo.formatSet-&gt;rtvFormat == DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -3040,7 +3585,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // We don't support formats which we can't represent without conversion
</span><del>-    if (dxgiFormatInfo.internalFormat != internalFormat)
</del><ins>+    if (d3d11FormatInfo.formatSet-&gt;glInternalFormat != internalFormat)
</ins><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -3064,10 +3609,11 @@
</span><span class="cx"> {
</span><span class="cx">     Image11 *dest11 = GetAs&lt;Image11&gt;(dest);
</span><span class="cx">     Image11 *src11 = GetAs&lt;Image11&gt;(src);
</span><del>-    return Image11::generateMipmap(dest11, src11);
</del><ins>+    return Image11::generateMipmap(dest11, src11, mRenderer11DeviceCaps);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::generateMipmapsUsingD3D(TextureStorage *storage, const gl::SamplerState &amp;samplerState)
</del><ins>+gl::Error Renderer11::generateMipmapsUsingD3D(TextureStorage *storage,
+                                              const gl::TextureState &amp;textureState)
</ins><span class="cx"> {
</span><span class="cx">     TextureStorage11 *storage11 = GetAs&lt;TextureStorage11&gt;(storage);
</span><span class="cx"> 
</span><span class="lines">@@ -3075,7 +3621,7 @@
</span><span class="cx">     ASSERT(storage11-&gt;supportsNativeMipmapFunction());
</span><span class="cx"> 
</span><span class="cx">     ID3D11ShaderResourceView *srv;
</span><del>-    gl::Error error = storage11-&gt;getSRVLevels(samplerState.baseLevel, samplerState.maxLevel, &amp;srv);
</del><ins>+    gl::Error error = storage11-&gt;getSRVLevels(textureState.baseLevel, textureState.maxLevel, &amp;srv);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -3092,6 +3638,11 @@
</span><span class="cx">     return new TextureStorage11_2D(this, swapChain11);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TextureStorage *Renderer11::createTextureStorageEGLImage(EGLImageD3D *eglImage)
+{
+    return new TextureStorage11_EGLImage(this, eglImage);
+}
+
</ins><span class="cx"> TextureStorage *Renderer11::createTextureStorage2D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly)
</span><span class="cx"> {
</span><span class="cx">     return new TextureStorage11_2D(this, internalformat, renderTarget, width, height, levels, hintLevelZeroOnly);
</span><span class="lines">@@ -3133,28 +3684,54 @@
</span><span class="cx">     return renderbuffer;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::readTextureData(ID3D11Texture2D *texture, unsigned int subResource, const gl::Rectangle &amp;area, GLenum format,
-                                      GLenum type, GLuint outputPitch, const gl::PixelPackState &amp;pack, uint8_t *pixels)
</del><ins>+gl::Error Renderer11::readFromAttachment(const gl::FramebufferAttachment &amp;srcAttachment,
+                                         const gl::Rectangle &amp;sourceArea,
+                                         GLenum format,
+                                         GLenum type,
+                                         GLuint outputPitch,
+                                         const gl::PixelPackState &amp;pack,
+                                         uint8_t *pixelsOut)
</ins><span class="cx"> {
</span><del>-    ASSERT(area.width &gt;= 0);
-    ASSERT(area.height &gt;= 0);
</del><ins>+    ASSERT(sourceArea.width &gt;= 0);
+    ASSERT(sourceArea.height &gt;= 0);
</ins><span class="cx"> 
</span><del>-    D3D11_TEXTURE2D_DESC textureDesc;
-    texture-&gt;GetDesc(&amp;textureDesc);
</del><ins>+    const bool invertTexture = UsePresentPathFast(this, &amp;srcAttachment);
</ins><span class="cx"> 
</span><ins>+    RenderTargetD3D *renderTarget = nullptr;
+    gl::Error error = srcAttachment.getRenderTarget(&amp;renderTarget);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    RenderTarget11 *rt11 = GetAs&lt;RenderTarget11&gt;(renderTarget);
+    ASSERT(rt11-&gt;getTexture());
+
+    TextureHelper11 textureHelper =
+        TextureHelper11::MakeAndReference(rt11-&gt;getTexture(), rt11-&gt;getANGLEFormat());
+    unsigned int sourceSubResource = rt11-&gt;getSubresourceIndex();
+
+    const gl::Extents &amp;texSize = textureHelper.getExtents();
+
+    gl::Rectangle actualArea = sourceArea;
+    if (invertTexture)
+    {
+        actualArea.y = texSize.height - actualArea.y - actualArea.height;
+    }
+
</ins><span class="cx">     // Clamp read region to the defined texture boundaries, preventing out of bounds reads
</span><span class="cx">     // and reads of uninitialized data.
</span><span class="cx">     gl::Rectangle safeArea;
</span><del>-    safeArea.x      = gl::clamp(area.x, 0, static_cast&lt;int&gt;(textureDesc.Width));
-    safeArea.y      = gl::clamp(area.y, 0, static_cast&lt;int&gt;(textureDesc.Height));
-    safeArea.width  = gl::clamp(area.width + std::min(area.x, 0), 0,
-                                static_cast&lt;int&gt;(textureDesc.Width) - safeArea.x);
-    safeArea.height = gl::clamp(area.height + std::min(area.y, 0), 0,
-                                static_cast&lt;int&gt;(textureDesc.Height) - safeArea.y);
</del><ins>+    safeArea.x = gl::clamp(actualArea.x, 0, texSize.width);
+    safeArea.y = gl::clamp(actualArea.y, 0, texSize.height);
+    safeArea.width =
+        gl::clamp(actualArea.width + std::min(actualArea.x, 0), 0, texSize.width - safeArea.x);
+    safeArea.height =
+        gl::clamp(actualArea.height + std::min(actualArea.y, 0), 0, texSize.height - safeArea.y);
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(safeArea.x &gt;= 0 &amp;&amp; safeArea.y &gt;= 0);
</span><del>-    ASSERT(safeArea.x + safeArea.width  &lt;= static_cast&lt;int&gt;(textureDesc.Width));
-    ASSERT(safeArea.y + safeArea.height &lt;= static_cast&lt;int&gt;(textureDesc.Height));
</del><ins>+    ASSERT(safeArea.x + safeArea.width &lt;= texSize.width);
+    ASSERT(safeArea.y + safeArea.height &lt;= texSize.height);
</ins><span class="cx"> 
</span><span class="cx">     if (safeArea.width == 0 || safeArea.height == 0)
</span><span class="cx">     {
</span><span class="lines">@@ -3162,35 +3739,30 @@
</span><span class="cx">         return gl::Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    D3D11_TEXTURE2D_DESC stagingDesc;
-    stagingDesc.Width = safeArea.width;
-    stagingDesc.Height = safeArea.height;
-    stagingDesc.MipLevels = 1;
-    stagingDesc.ArraySize = 1;
-    stagingDesc.Format = textureDesc.Format;
-    stagingDesc.SampleDesc.Count = 1;
-    stagingDesc.SampleDesc.Quality = 0;
-    stagingDesc.Usage = D3D11_USAGE_STAGING;
-    stagingDesc.BindFlags = 0;
-    stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
-    stagingDesc.MiscFlags = 0;
-
-    ID3D11Texture2D* stagingTex = NULL;
-    HRESULT result = mDevice-&gt;CreateTexture2D(&amp;stagingDesc, NULL, &amp;stagingTex);
-    if (FAILED(result))
</del><ins>+    gl::Extents safeSize(safeArea.width, safeArea.height, 1);
+    auto errorOrResult =
+        CreateStagingTexture(textureHelper.getTextureType(), textureHelper.getFormat(),
+                             textureHelper.getANGLEFormat(), safeSize, mDevice);
+    if (errorOrResult.isError())
</ins><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal staging texture for ReadPixels, HRESULT: 0x%X.&quot;, result);
</del><ins>+        return errorOrResult.getError();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ID3D11Texture2D* srcTex = NULL;
-    if (textureDesc.SampleDesc.Count &gt; 1)
</del><ins>+    TextureHelper11 stagingHelper(errorOrResult.getResult());
+    TextureHelper11 resolvedTextureHelper;
+
+    // &quot;srcTexture&quot; usually points to the source texture.
+    // For 2D multisampled textures, it points to the multisampled resolve texture.
+    const TextureHelper11 *srcTexture = &amp;textureHelper;
+
+    if (textureHelper.getTextureType() == GL_TEXTURE_2D &amp;&amp; textureHelper.getSampleCount() &gt; 1)
</ins><span class="cx">     {
</span><span class="cx">         D3D11_TEXTURE2D_DESC resolveDesc;
</span><del>-        resolveDesc.Width = textureDesc.Width;
-        resolveDesc.Height = textureDesc.Height;
</del><ins>+        resolveDesc.Width              = static_cast&lt;UINT&gt;(texSize.width);
+        resolveDesc.Height             = static_cast&lt;UINT&gt;(texSize.height);
</ins><span class="cx">         resolveDesc.MipLevels = 1;
</span><span class="cx">         resolveDesc.ArraySize = 1;
</span><del>-        resolveDesc.Format = textureDesc.Format;
</del><ins>+        resolveDesc.Format             = textureHelper.getFormat();
</ins><span class="cx">         resolveDesc.SampleDesc.Count = 1;
</span><span class="cx">         resolveDesc.SampleDesc.Quality = 0;
</span><span class="cx">         resolveDesc.Usage = D3D11_USAGE_DEFAULT;
</span><span class="lines">@@ -3198,49 +3770,76 @@
</span><span class="cx">         resolveDesc.CPUAccessFlags = 0;
</span><span class="cx">         resolveDesc.MiscFlags = 0;
</span><span class="cx"> 
</span><del>-        result = mDevice-&gt;CreateTexture2D(&amp;resolveDesc, NULL, &amp;srcTex);
</del><ins>+        ID3D11Texture2D *resolveTex2D = nullptr;
+        HRESULT result = mDevice-&gt;CreateTexture2D(&amp;resolveDesc, nullptr, &amp;resolveTex2D);
</ins><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><del>-            SafeRelease(stagingTex);
-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal resolve texture for ReadPixels, HRESULT: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Renderer11::readTextureData failed to create internal resolve &quot;
+                             &quot;texture for ReadPixels, HRESULT: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        mDeviceContext-&gt;ResolveSubresource(srcTex, 0, texture, subResource, textureDesc.Format);
-        subResource = 0;
</del><ins>+        mDeviceContext-&gt;ResolveSubresource(resolveTex2D, 0, textureHelper.getTexture2D(),
+                                           sourceSubResource, textureHelper.getFormat());
+        resolvedTextureHelper =
+            TextureHelper11::MakeAndReference(resolveTex2D, textureHelper.getANGLEFormat());
+
+        sourceSubResource = 0;
+        srcTexture        = &amp;resolvedTextureHelper;
</ins><span class="cx">     }
</span><del>-    else
-    {
-        srcTex = texture;
-        srcTex-&gt;AddRef();
-    }
</del><span class="cx"> 
</span><span class="cx">     D3D11_BOX srcBox;
</span><span class="cx">     srcBox.left   = static_cast&lt;UINT&gt;(safeArea.x);
</span><span class="cx">     srcBox.right  = static_cast&lt;UINT&gt;(safeArea.x + safeArea.width);
</span><span class="cx">     srcBox.top    = static_cast&lt;UINT&gt;(safeArea.y);
</span><span class="cx">     srcBox.bottom = static_cast&lt;UINT&gt;(safeArea.y + safeArea.height);
</span><del>-    srcBox.front  = 0;
-    srcBox.back   = 1;
</del><span class="cx"> 
</span><del>-    mDeviceContext-&gt;CopySubresourceRegion(stagingTex, 0, 0, 0, 0, srcTex, subResource, &amp;srcBox);
</del><ins>+    // Select the correct layer from a 3D attachment
+    srcBox.front = 0;
+    if (textureHelper.getTextureType() == GL_TEXTURE_3D)
+    {
+        srcBox.front = static_cast&lt;UINT&gt;(srcAttachment.layer());
+    }
+    srcBox.back = srcBox.front + 1;
</ins><span class="cx"> 
</span><del>-    SafeRelease(srcTex);
</del><ins>+    mDeviceContext-&gt;CopySubresourceRegion(stagingHelper.getResource(), 0, 0, 0, 0,
+                                          srcTexture-&gt;getResource(), sourceSubResource, &amp;srcBox);
</ins><span class="cx"> 
</span><del>-    PackPixelsParams packParams(safeArea, format, type, outputPitch, pack, 0);
-    gl::Error error = packPixels(stagingTex, packParams, pixels);
</del><ins>+    if (invertTexture)
+    {
+        gl::PixelPackState invertTexturePack;
</ins><span class="cx"> 
</span><del>-    SafeRelease(stagingTex);
</del><ins>+        // Create a new PixelPackState with reversed row order. Note that we can't just assign
+        // 'invertTexturePack' to be 'pack' (or memcpy) since that breaks the ref counting/object
+        // tracking in the 'pixelBuffer' members, causing leaks. Instead we must use
+        // pixelBuffer.set() twice, which performs the addRef/release correctly
+        invertTexturePack.alignment = pack.alignment;
+        invertTexturePack.pixelBuffer.set(pack.pixelBuffer.get());
+        invertTexturePack.reverseRowOrder = !pack.reverseRowOrder;
</ins><span class="cx"> 
</span><del>-    return error;
</del><ins>+        PackPixelsParams packParams(safeArea, format, type, outputPitch, invertTexturePack, 0);
+        error = packPixels(stagingHelper, packParams, pixelsOut);
+
+        invertTexturePack.pixelBuffer.set(nullptr);
+
+        return error;
+    }
+    else
+    {
+        PackPixelsParams packParams(safeArea, format, type, outputPitch, pack, 0);
+        return packPixels(stagingHelper, packParams, pixelsOut);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::packPixels(ID3D11Texture2D *readTexture, const PackPixelsParams &amp;params, uint8_t *pixelsOut)
</del><ins>+gl::Error Renderer11::packPixels(const TextureHelper11 &amp;textureHelper,
+                                 const PackPixelsParams &amp;params,
+                                 uint8_t *pixelsOut)
</ins><span class="cx"> {
</span><del>-    D3D11_TEXTURE2D_DESC textureDesc;
-    readTexture-&gt;GetDesc(&amp;textureDesc);
</del><ins>+    ID3D11Resource *readResource = textureHelper.getResource();
</ins><span class="cx"> 
</span><span class="cx">     D3D11_MAPPED_SUBRESOURCE mapping;
</span><del>-    HRESULT hr = mDeviceContext-&gt;Map(readTexture, 0, D3D11_MAP_READ, 0, &amp;mapping);
</del><ins>+    HRESULT hr = mDeviceContext-&gt;Map(readResource, 0, D3D11_MAP_READ, 0, &amp;mapping);
</ins><span class="cx">     if (FAILED(hr))
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hr == E_OUTOFMEMORY);
</span><span class="lines">@@ -3260,8 +3859,9 @@
</span><span class="cx">         inputPitch = static_cast&lt;int&gt;(mapping.RowPitch);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(textureDesc.Format);
-    const gl::InternalFormat &amp;sourceFormatInfo = gl::GetInternalFormatInfo(dxgiFormatInfo.internalFormat);
</del><ins>+    const auto &amp;angleFormatInfo = d3d11::GetANGLEFormatSet(textureHelper.getANGLEFormat());
+    const gl::InternalFormat &amp;sourceFormatInfo =
+        gl::GetInternalFormatInfo(angleFormatInfo.glInternalFormat);
</ins><span class="cx">     if (sourceFormatInfo.format == params.format &amp;&amp; sourceFormatInfo.type == params.type)
</span><span class="cx">     {
</span><span class="cx">         uint8_t *dest = pixelsOut + params.offset;
</span><span class="lines">@@ -3272,9 +3872,10 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        const d3d11::DXGIFormat &amp;sourceDXGIFormatInfo = d3d11::GetDXGIFormatInfo(textureDesc.Format);
-        ColorCopyFunction fastCopyFunc = sourceDXGIFormatInfo.getFastCopyFunction(params.format, params.type);
-
</del><ins>+        const d3d11::DXGIFormat &amp;dxgiFormatInfo =
+            d3d11::GetDXGIFormatInfo(textureHelper.getFormat());
+        ColorCopyFunction fastCopyFunc =
+            dxgiFormatInfo.getFastCopyFunction(params.format, params.type);
</ins><span class="cx">         GLenum sizedDestInternalFormat = gl::GetSizedInternalFormat(params.format, params.type);
</span><span class="cx">         const gl::InternalFormat &amp;destFormatInfo = gl::GetInternalFormatInfo(sizedDestInternalFormat);
</span><span class="cx"> 
</span><span class="lines">@@ -3294,7 +3895,7 @@
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            ColorReadFunction colorReadFunction = sourceDXGIFormatInfo.colorReadFunction;
</del><ins>+            ColorReadFunction colorReadFunction   = angleFormatInfo.colorReadFunction;
</ins><span class="cx">             ColorWriteFunction colorWriteFunction = GetColorWriteFunction(params.format, params.type);
</span><span class="cx"> 
</span><span class="cx">             uint8_t temp[16]; // Maximum size of any Color&lt;T&gt; type used.
</span><span class="lines">@@ -3319,14 +3920,20 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mDeviceContext-&gt;Unmap(readTexture, 0);
</del><ins>+    mDeviceContext-&gt;Unmap(readResource, 0);
</ins><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &amp;readRect, const gl::Rectangle &amp;drawRect, RenderTargetD3D *readRenderTarget,
-                                           RenderTargetD3D *drawRenderTarget, GLenum filter, const gl::Rectangle *scissor,
-                                           bool colorBlit, bool depthBlit, bool stencilBlit)
</del><ins>+gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &amp;readRectIn,
+                                           const gl::Rectangle &amp;drawRectIn,
+                                           RenderTargetD3D *readRenderTarget,
+                                           RenderTargetD3D *drawRenderTarget,
+                                           GLenum filter,
+                                           const gl::Rectangle *scissor,
+                                           bool colorBlit,
+                                           bool depthBlit,
+                                           bool stencilBlit)
</ins><span class="cx"> {
</span><span class="cx">     // Since blitRenderbufferRect is called for each render buffer that needs to be blitted,
</span><span class="cx">     // it should never be the case that both color and depth/stencil need to be blitted at
</span><span class="lines">@@ -3378,7 +3985,12 @@
</span><span class="cx">         readTexture = readRenderTarget11-&gt;getTexture();
</span><span class="cx">         readTexture-&gt;AddRef();
</span><span class="cx">         readSubresource = readRenderTarget11-&gt;getSubresourceIndex();
</span><del>-        readSRV = readRenderTarget11-&gt;getShaderResourceView();
</del><ins>+        readSRV = readRenderTarget11-&gt;getBlitShaderResourceView();
+        if (readSRV == nullptr)
+        {
+            ASSERT(depthBlit || stencilBlit);
+            readSRV = readRenderTarget11-&gt;getShaderResourceView();
+        }
</ins><span class="cx">         readSRV-&gt;AddRef();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -3392,14 +4004,97 @@
</span><span class="cx">     gl::Extents readSize(readRenderTarget-&gt;getWidth(), readRenderTarget-&gt;getHeight(), 1);
</span><span class="cx">     gl::Extents drawSize(drawRenderTarget-&gt;getWidth(), drawRenderTarget-&gt;getHeight(), 1);
</span><span class="cx"> 
</span><ins>+    // From the spec:
+    // &quot;The actual region taken from the read framebuffer is limited to the intersection of the
+    // source buffers being transferred, which may include the color buffer selected by the read
+    // buffer, the depth buffer, and / or the stencil buffer depending on mask.&quot;
+    // This means negative x and y are out of bounds, and not to be read from. We handle this here
+    // by internally scaling the read and draw rectangles.
+    gl::Rectangle readRect = readRectIn;
+    gl::Rectangle drawRect = drawRectIn;
+    auto readToDrawX       = [&amp;drawRectIn, &amp;readRectIn](int readOffset)
+    {
+        double readToDrawScale =
+            static_cast&lt;double&gt;(drawRectIn.width) / static_cast&lt;double&gt;(readRectIn.width);
+        return static_cast&lt;int&gt;(round(static_cast&lt;double&gt;(readOffset) * readToDrawScale));
+    };
+    if (readRect.x &lt; 0)
+    {
+        int readOffset = -readRect.x;
+        readRect.x += readOffset;
+        readRect.width -= readOffset;
+
+        int drawOffset = readToDrawX(readOffset);
+        drawRect.x += drawOffset;
+        drawRect.width -= drawOffset;
+    }
+
+    auto readToDrawY = [&amp;drawRectIn, &amp;readRectIn](int readOffset)
+    {
+        double readToDrawScale =
+            static_cast&lt;double&gt;(drawRectIn.height) / static_cast&lt;double&gt;(readRectIn.height);
+        return static_cast&lt;int&gt;(round(static_cast&lt;double&gt;(readOffset) * readToDrawScale));
+    };
+    if (readRect.y &lt; 0)
+    {
+        int readOffset = -readRect.y;
+        readRect.y += readOffset;
+        readRect.height -= readOffset;
+
+        int drawOffset = readToDrawY(readOffset);
+        drawRect.y += drawOffset;
+        drawRect.height -= drawOffset;
+    }
+
+    if (readRect.x1() &lt; 0)
+    {
+        int readOffset = -readRect.x1();
+        readRect.width += readOffset;
+
+        int drawOffset = readToDrawX(readOffset);
+        drawRect.width += drawOffset;
+    }
+
+    if (readRect.y1() &lt; 0)
+    {
+        int readOffset = -readRect.y1();
+        readRect.height += readOffset;
+
+        int drawOffset = readToDrawY(readOffset);
+        drawRect.height += drawOffset;
+    }
+
</ins><span class="cx">     bool scissorNeeded = scissor &amp;&amp; gl::ClipRectangle(drawRect, *scissor, NULL);
</span><span class="cx"> 
</span><del>-    bool wholeBufferCopy = !scissorNeeded &amp;&amp;
-                           readRect.x == 0 &amp;&amp; readRect.width == readSize.width &amp;&amp;
-                           readRect.y == 0 &amp;&amp; readRect.height == readSize.height &amp;&amp;
-                           drawRect.x == 0 &amp;&amp; drawRect.width == drawSize.width &amp;&amp;
-                           drawRect.y == 0 &amp;&amp; drawRect.height == drawSize.height;
</del><ins>+    const auto &amp;destFormatInfo = gl::GetInternalFormatInfo(drawRenderTarget-&gt;getInternalFormat());
+    const auto &amp;srcFormatInfo  = gl::GetInternalFormatInfo(readRenderTarget-&gt;getInternalFormat());
+    const auto &amp;formatSet            = d3d11::GetANGLEFormatSet(drawRenderTarget11-&gt;getANGLEFormat());
+    const DXGI_FORMAT drawDXGIFormat = colorBlit ? formatSet.rtvFormat : formatSet.dsvFormat;
+    const auto &amp;dxgiFormatInfo       = d3d11::GetDXGIFormatInfo(drawDXGIFormat);
</ins><span class="cx"> 
</span><ins>+    // Some blits require masking off emulated texture channels. eg: from RGBA8 to RGB8, we
+    // emulate RGB8 with RGBA8, so we need to mask off the alpha channel when we copy.
+
+    gl::Color&lt;bool&gt; colorMask;
+    colorMask.red = (srcFormatInfo.redBits &gt; 0) &amp;&amp; (destFormatInfo.redBits == 0) &amp;&amp;
+                    (dxgiFormatInfo.redBits &gt; 0);
+    colorMask.green = (srcFormatInfo.greenBits &gt; 0) &amp;&amp; (destFormatInfo.greenBits == 0) &amp;&amp;
+                      (dxgiFormatInfo.greenBits &gt; 0);
+    colorMask.blue = (srcFormatInfo.blueBits &gt; 0) &amp;&amp; (destFormatInfo.blueBits == 0) &amp;&amp;
+                     (dxgiFormatInfo.blueBits &gt; 0);
+    colorMask.alpha = (srcFormatInfo.alphaBits &gt; 0) &amp;&amp; (destFormatInfo.alphaBits == 0) &amp;&amp;
+                      (dxgiFormatInfo.alphaBits &gt; 0);
+
+    // We only currently support masking off the alpha channel.
+    bool colorMaskingNeeded = colorMask.alpha;
+    ASSERT(!colorMask.red &amp;&amp; !colorMask.green &amp;&amp; !colorMask.blue);
+
+    bool wholeBufferCopy = !scissorNeeded &amp;&amp; !colorMaskingNeeded &amp;&amp; readRect.x == 0 &amp;&amp;
+                           readRect.width == readSize.width &amp;&amp; readRect.y == 0 &amp;&amp;
+                           readRect.height == readSize.height &amp;&amp; drawRect.x == 0 &amp;&amp;
+                           drawRect.width == drawSize.width &amp;&amp; drawRect.y == 0 &amp;&amp;
+                           drawRect.height == drawSize.height;
+
</ins><span class="cx">     bool stretchRequired = readRect.width != drawRect.width || readRect.height != drawRect.height;
</span><span class="cx"> 
</span><span class="cx">     bool flipRequired = readRect.width &lt; 0 || readRect.height &lt; 0 || drawRect.width &lt; 0 || drawRect.height &lt; 0;
</span><span class="lines">@@ -3409,14 +4104,13 @@
</span><span class="cx">                        drawRect.x &lt; 0 || drawRect.x + drawRect.width &gt; drawSize.width ||
</span><span class="cx">                        drawRect.y &lt; 0 || drawRect.y + drawRect.height &gt; drawSize.height;
</span><span class="cx"> 
</span><del>-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(drawRenderTarget11-&gt;getDXGIFormat());
</del><span class="cx">     bool partialDSBlit = (dxgiFormatInfo.depthBits &gt; 0 &amp;&amp; depthBlit) != (dxgiFormatInfo.stencilBits &gt; 0 &amp;&amp; stencilBlit);
</span><span class="cx"> 
</span><span class="cx">     gl::Error result(GL_NO_ERROR);
</span><span class="cx"> 
</span><del>-    if (readRenderTarget11-&gt;getDXGIFormat() == drawRenderTarget11-&gt;getDXGIFormat() &amp;&amp;
</del><ins>+    if (readRenderTarget11-&gt;getANGLEFormat() == drawRenderTarget11-&gt;getANGLEFormat() &amp;&amp;
</ins><span class="cx">         !stretchRequired &amp;&amp; !outOfBounds &amp;&amp; !flipRequired &amp;&amp; !partialDSBlit &amp;&amp;
</span><del>-        (!(depthBlit || stencilBlit) || wholeBufferCopy))
</del><ins>+        !colorMaskingNeeded &amp;&amp; (!(depthBlit || stencilBlit) || wholeBufferCopy))
</ins><span class="cx">     {
</span><span class="cx">         UINT dstX = drawRect.x;
</span><span class="cx">         UINT dstY = drawRect.y;
</span><span class="lines">@@ -3486,9 +4180,10 @@
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            GLenum format = gl::GetInternalFormatInfo(drawRenderTarget-&gt;getInternalFormat()).format;
</del><ins>+            // We don't currently support masking off any other channel than alpha
+            bool maskOffAlpha = colorMaskingNeeded &amp;&amp; colorMask.alpha;
</ins><span class="cx">             result = mBlit-&gt;copyTexture(readSRV, readArea, readSize, drawRTV, drawArea, drawSize,
</span><del>-                                        scissor, format, filter);
</del><ins>+                                        scissor, destFormatInfo.format, filter, maskOffAlpha);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -3500,9 +4195,49 @@
</span><span class="cx"> 
</span><span class="cx"> bool Renderer11::isES3Capable() const
</span><span class="cx"> {
</span><del>-    return (d3d11_gl::GetMaximumClientVersion(mFeatureLevel) &gt; 2);
</del><ins>+    return (d3d11_gl::GetMaximumClientVersion(mRenderer11DeviceCaps.featureLevel) &gt; 2);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+void Renderer11::onSwap()
+{
+    // Send histogram updates every half hour
+    const double kHistogramUpdateInterval = 30 * 60;
+
+    const double currentTime = ANGLEPlatformCurrent()-&gt;monotonicallyIncreasingTime();
+    const double timeSinceLastUpdate = currentTime - mLastHistogramUpdateTime;
+
+    if (timeSinceLastUpdate &gt; kHistogramUpdateInterval)
+    {
+        updateHistograms();
+        mLastHistogramUpdateTime = currentTime;
+    }
+}
+
+void Renderer11::updateHistograms()
+{
+    // Update the buffer CPU memory histogram
+    {
+        size_t sizeSum = 0;
+        for (auto &amp;buffer : mAliveBuffers)
+        {
+            sizeSum += buffer-&gt;getTotalCPUBufferMemoryBytes();
+        }
+        const int kOneMegaByte = 1024 * 1024;
+        ANGLE_HISTOGRAM_MEMORY_MB(&quot;GPU.ANGLE.Buffer11CPUMemoryMB&quot;,
+                                  static_cast&lt;int&gt;(sizeSum) / kOneMegaByte);
+    }
+}
+
+void Renderer11::onBufferDelete(const Buffer11 *deleted)
+{
+    mAliveBuffers.erase(deleted);
+}
+
+void Renderer11::onMakeCurrent(const gl::Data &amp;data)
+{
+    mStateManager.onMakeCurrent(data);
+}
+
</ins><span class="cx"> ID3D11Texture2D *Renderer11::resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource)
</span><span class="cx"> {
</span><span class="cx">     D3D11_TEXTURE2D_DESC textureDesc;
</span><span class="lines">@@ -3561,54 +4296,101 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-VertexConversionType Renderer11::getVertexConversionType(const gl::VertexFormat &amp;vertexFormat) const
</del><ins>+VertexConversionType Renderer11::getVertexConversionType(gl::VertexFormatType vertexFormatType) const
</ins><span class="cx"> {
</span><del>-    return d3d11::GetVertexFormatInfo(vertexFormat, mFeatureLevel).conversionType;
</del><ins>+    return d3d11::GetVertexFormatInfo(vertexFormatType, mRenderer11DeviceCaps.featureLevel).conversionType;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLenum Renderer11::getVertexComponentType(const gl::VertexFormat &amp;vertexFormat) const
</del><ins>+GLenum Renderer11::getVertexComponentType(gl::VertexFormatType vertexFormatType) const
</ins><span class="cx"> {
</span><del>-    return d3d11::GetDXGIFormatInfo(d3d11::GetVertexFormatInfo(vertexFormat, mFeatureLevel).nativeFormat).componentType;
</del><ins>+    return d3d11::GetDXGIFormatInfo(d3d11::GetVertexFormatInfo(vertexFormatType, mRenderer11DeviceCaps.featureLevel).nativeFormat).componentType;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer11::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap *outTextureCaps, gl::Extensions *outExtensions) const
</del><ins>+gl::ErrorOrResult&lt;unsigned int&gt; Renderer11::getVertexSpaceRequired(
+    const gl::VertexAttribute &amp;attrib,
+    GLsizei count,
+    GLsizei instances) const
</ins><span class="cx"> {
</span><del>-    d3d11_gl::GenerateCaps(mDevice, mDeviceContext, outCaps, outTextureCaps, outExtensions);
</del><ins>+    if (!attrib.enabled)
+    {
+        return 16u;
+    }
+
+    unsigned int elementCount = 0;
+    if (instances == 0 || attrib.divisor == 0)
+    {
+        elementCount = count;
+    }
+    else
+    {
+        // Round up to divisor, if possible
+        elementCount = UnsignedCeilDivide(static_cast&lt;unsigned int&gt;(instances), attrib.divisor);
+    }
+
+    gl::VertexFormatType formatType      = gl::GetVertexFormatType(attrib);
+    const D3D_FEATURE_LEVEL featureLevel = mRenderer11DeviceCaps.featureLevel;
+    const d3d11::VertexFormat &amp;vertexFormatInfo =
+        d3d11::GetVertexFormatInfo(formatType, featureLevel);
+    const d3d11::DXGIFormatSize &amp;dxgiFormatInfo =
+        d3d11::GetDXGIFormatSizeInfo(vertexFormatInfo.nativeFormat);
+    unsigned int elementSize = dxgiFormatInfo.pixelBytes;
+    if (elementSize &gt; std::numeric_limits&lt;unsigned int&gt;::max() / elementCount)
+    {
+        return gl::Error(GL_OUT_OF_MEMORY, &quot;New vertex buffer size would result in an overflow.&quot;);
+    }
+
+    return elementSize * elementCount;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Workarounds Renderer11::generateWorkarounds() const
</del><ins>+void Renderer11::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap *outTextureCaps,
+                              gl::Extensions *outExtensions, gl::Limitations *outLimitations) const
</ins><span class="cx"> {
</span><del>-    return d3d11::GenerateWorkarounds(mFeatureLevel);
</del><ins>+    d3d11_gl::GenerateCaps(mDevice, mDeviceContext, mRenderer11DeviceCaps, outCaps, outTextureCaps,
+                           outExtensions, outLimitations);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer11::setShaderResource(gl::SamplerType shaderType, UINT resourceSlot, ID3D11ShaderResourceView *srv)
</del><ins>+WorkaroundsD3D Renderer11::generateWorkarounds() const
</ins><span class="cx"> {
</span><del>-    auto &amp;currentSRVs = (shaderType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
</del><ins>+    return d3d11::GenerateWorkarounds(mRenderer11DeviceCaps.featureLevel);
+}
</ins><span class="cx"> 
</span><del>-    ASSERT(static_cast&lt;size_t&gt;(resourceSlot) &lt; currentSRVs.size());
-    auto &amp;record = currentSRVs[resourceSlot];
</del><ins>+void Renderer11::createAnnotator()
+{
+    // The D3D11 renderer must choose the D3D9 debug annotator because the D3D11 interface
+    // method ID3DUserDefinedAnnotation::GetStatus on desktop builds doesn't work with the Graphics
+    // Diagnostics tools in Visual Studio 2013.
+    // The D3D9 annotator works properly for both D3D11 and D3D9.
+    // Incorrect status reporting can cause ANGLE to log unnecessary debug events.
+#ifdef ANGLE_ENABLE_D3D9
+    mAnnotator = new DebugAnnotator9();
+#else
+    mAnnotator = new DebugAnnotator11();
+#endif
+}
</ins><span class="cx"> 
</span><del>-    if (record.srv != reinterpret_cast&lt;uintptr_t&gt;(srv))
</del><ins>+gl::Error Renderer11::clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd)
+{
+    return mStateManager.clearTextures(samplerType, rangeStart, rangeEnd);
+}
+
+egl::Error Renderer11::getEGLDevice(DeviceImpl **device)
+{
+    if (mEGLDevice == nullptr)
</ins><span class="cx">     {
</span><del>-        if (shaderType == gl::SAMPLER_VERTEX)
-        {
-            mDeviceContext-&gt;VSSetShaderResources(resourceSlot, 1, &amp;srv);
-        }
-        else
-        {
-            mDeviceContext-&gt;PSSetShaderResources(resourceSlot, 1, &amp;srv);
-        }
</del><ins>+        ASSERT(mDevice != nullptr);
+        mEGLDevice       = new DeviceD3D();
+        egl::Error error = mEGLDevice-&gt;initialize(reinterpret_cast&lt;void *&gt;(mDevice),
+                                                  EGL_D3D11_DEVICE_ANGLE, EGL_FALSE);
</ins><span class="cx"> 
</span><del>-        record.srv = reinterpret_cast&lt;uintptr_t&gt;(srv);
-        if (srv)
</del><ins>+        if (error.isError())
</ins><span class="cx">         {
</span><del>-            record.resource = reinterpret_cast&lt;uintptr_t&gt;(GetViewResource(srv));
-            srv-&gt;GetDesc(&amp;record.desc);
</del><ins>+            SafeDelete(mEGLDevice);
+            return error;
</ins><span class="cx">         }
</span><del>-        else
-        {
-            record.resource = 0;
-        }
</del><span class="cx">     }
</span><ins>+
+    *device = static_cast&lt;DeviceImpl *&gt;(mEGLDevice);
+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><del>-}
</del><ins>+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Renderer11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,11 +14,14 @@
</span><span class="cx"> #include &quot;libANGLE/AttributeMap.h&quot;
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/HLSLCompiler.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/RenderTargetD3D.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/InputLayoutCache.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/RenderStateCache.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/StateManager11.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="lines">@@ -33,12 +36,24 @@
</span><span class="cx"> class IndexDataManager;
</span><span class="cx"> class StreamingIndexBufferInterface;
</span><span class="cx"> class Blit11;
</span><ins>+class Buffer11;
</ins><span class="cx"> class Clear11;
</span><span class="cx"> class PixelTransfer11;
</span><span class="cx"> class RenderTarget11;
</span><span class="cx"> class Trim11;
</span><span class="cx"> struct PackPixelsParams;
</span><span class="cx"> 
</span><ins>+struct Renderer11DeviceCaps
+{
+    D3D_FEATURE_LEVEL featureLevel;
+    bool supportsDXGI1_2;               // Support for DXGI 1.2
+    bool supportsClearView;             // Support for ID3D11DeviceContext1::ClearView
+    bool supportsConstantBufferOffsets; // Support for Constant buffer offset
+    UINT B5G6R5support;                 // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B5G6R5_UNORM
+    UINT B4G4R4A4support;               // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B4G4R4A4_UNORM
+    UINT B5G5R5A1support;               // Bitfield of D3D11_FORMAT_SUPPORT values for DXGI_FORMAT_B5G5R5A1_UNORM
+};
+
</ins><span class="cx"> enum
</span><span class="cx"> {
</span><span class="cx">     MAX_VERTEX_UNIFORM_VECTORS_D3D11 = 1024,
</span><span class="lines">@@ -93,62 +108,62 @@
</span><span class="cx">     virtual bool resetDevice();
</span><span class="cx"> 
</span><span class="cx">     egl::ConfigSet generateConfigs() const override;
</span><ins>+    void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error flush() override;
</span><span class="cx">     gl::Error finish() override;
</span><span class="cx"> 
</span><del>-    bool shouldCreateChildWindowForSurface(EGLNativeWindowType window) const override;
-    virtual SwapChainD3D *createSwapChain(NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
</del><ins>+    SwapChainD3D *createSwapChain(NativeWindow nativeWindow,
+                                  HANDLE shareHandle,
+                                  GLenum backBufferFormat,
+                                  GLenum depthBufferFormat,
+                                  EGLint orientation) override;
</ins><span class="cx"> 
</span><ins>+    CompilerImpl *createCompiler() override;
+
</ins><span class="cx">     virtual gl::Error generateSwizzle(gl::Texture *texture);
</span><span class="cx">     virtual gl::Error setSamplerState(gl::SamplerType type, int index, gl::Texture *texture, const gl::SamplerState &amp;sampler);
</span><span class="cx">     virtual gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture);
</span><span class="cx"> 
</span><span class="cx">     gl::Error setUniformBuffers(const gl::Data &amp;data,
</span><del>-                                const GLint vertexUniformBuffers[],
-                                const GLint fragmentUniformBuffers[]) override;
</del><ins>+                                const std::vector&lt;GLint&gt; &amp;vertexUniformBuffers,
+                                const std::vector&lt;GLint&gt; &amp;fragmentUniformBuffers) override;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error setRasterizerState(const gl::RasterizerState &amp;rasterState);
-    gl::Error setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &amp;blendState, const gl::ColorF &amp;blendColor,
-                            unsigned int sampleMask) override;
-    virtual gl::Error setDepthStencilState(const gl::DepthStencilState &amp;depthStencilState, int stencilRef,
-                                           int stencilBackRef, bool frontFaceCCW);
</del><ins>+    gl::Error updateState(const gl::Data &amp;data, GLenum drawMode) override;
</ins><span class="cx"> 
</span><del>-    virtual void setScissorRectangle(const gl::Rectangle &amp;scissor, bool enabled);
-    virtual void setViewport(const gl::Rectangle &amp;viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace,
-                             bool ignoreViewport);
-
</del><span class="cx">     virtual bool applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize);
</span><span class="cx">     gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) override;
</span><del>-    virtual gl::Error applyShaders(gl::Program *program, const gl::VertexFormat inputLayout[], const gl::Framebuffer *framebuffer,
-                                   bool rasterizerDiscard, bool transformFeedbackActive);
</del><ins>+    gl::Error applyUniforms(const ProgramD3D &amp;programD3D,
+                            GLenum drawMode,
+                            const std::vector&lt;D3DUniform *&gt; &amp;uniformArray) override;
+    virtual gl::Error applyVertexBuffer(const gl::State &amp;state,
+                                        GLenum mode,
+                                        GLint first,
+                                        GLsizei count,
+                                        GLsizei instances,
+                                        TranslatedIndexData *indexInfo);
+    gl::Error applyIndexBuffer(const gl::Data &amp;data,
+                               const GLvoid *indices,
+                               GLsizei count,
+                               GLenum mode,
+                               GLenum type,
+                               TranslatedIndexData *indexInfo) override;
+    gl::Error applyTransformFeedbackBuffers(const gl::State &amp;state) override;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error applyUniforms(const ProgramImpl &amp;program, const std::vector&lt;gl::LinkedUniform*&gt; &amp;uniformArray);
-    virtual gl::Error applyVertexBuffer(const gl::State &amp;state, GLenum mode, GLint first, GLsizei count, GLsizei instances);
-    virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
-    void applyTransformFeedbackBuffers(const gl::State &amp;state) override;
-
-    gl::Error drawArrays(const gl::Data &amp;data, GLenum mode, GLsizei count, GLsizei instances, bool usesPointSize) override;
-    virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
-                                   gl::Buffer *elementArrayBuffer, const TranslatedIndexData &amp;indexInfo, GLsizei instances);
-
-    virtual void markAllStateDirty();
-
</del><span class="cx">     // lost device
</span><span class="cx">     bool testDeviceLost() override;
</span><span class="cx">     bool testDeviceResettable() override;
</span><span class="cx"> 
</span><del>-    VendorID getVendorId() const override;
</del><span class="cx">     std::string getRendererDescription() const override;
</span><del>-    GUID getAdapterIdentifier() const override;
</del><ins>+    DeviceIdentifier getAdapterIdentifier() const override;
</ins><span class="cx"> 
</span><span class="cx">     virtual unsigned int getReservedVertexUniformVectors() const;
</span><span class="cx">     virtual unsigned int getReservedFragmentUniformVectors() const;
</span><span class="cx">     virtual unsigned int getReservedVertexUniformBuffers() const;
</span><span class="cx">     virtual unsigned int getReservedFragmentUniformBuffers() const;
</span><del>-    virtual bool getShareHandleSupport() const;
-    virtual bool getPostSubBufferSupport() const;
</del><span class="cx"> 
</span><ins>+    bool getShareHandleSupport() const;
+
</ins><span class="cx">     virtual int getMajorShaderModel() const;
</span><span class="cx">     int getMinorShaderModel() const override;
</span><span class="cx">     std::string getShaderModelSuffix() const override;
</span><span class="lines">@@ -165,31 +180,38 @@
</span><span class="cx"> 
</span><span class="cx">     // RenderTarget creation
</span><span class="cx">     virtual gl::Error createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTargetD3D **outRT);
</span><ins>+    gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override;
</ins><span class="cx"> 
</span><span class="cx">     // Framebuffer creation
</span><del>-    FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data) override;
</del><span class="cx">     FramebufferImpl *createFramebuffer(const gl::Framebuffer::Data &amp;data) override;
</span><span class="cx"> 
</span><span class="cx">     // Shader creation
</span><del>-    virtual CompilerImpl *createCompiler(const gl::Data &amp;data);
-    virtual ShaderImpl *createShader(GLenum type);
-    virtual ProgramImpl *createProgram();
</del><ins>+    ShaderImpl *createShader(const gl::Shader::Data &amp;data) override;
+    ProgramImpl *createProgram(const gl::Program::Data &amp;data) override;
</ins><span class="cx"> 
</span><span class="cx">     // Shader operations
</span><del>-    virtual gl::Error loadExecutable(const void *function, size_t length, ShaderType type,
-                                     const std::vector&lt;gl::LinkedVarying&gt; &amp;transformFeedbackVaryings,
-                                     bool separatedOutputBuffers, ShaderExecutableD3D **outExecutable);
-    virtual gl::Error compileToExecutable(gl::InfoLog &amp;infoLog, const std::string &amp;shaderHLSL, ShaderType type,
-                                          const std::vector&lt;gl::LinkedVarying&gt; &amp;transformFeedbackVaryings,
-                                          bool separatedOutputBuffers, const D3DCompilerWorkarounds &amp;workarounds,
-                                          ShaderExecutableD3D **outExectuable);
-    virtual UniformStorageD3D *createUniformStorage(size_t storageSize);
</del><ins>+    gl::Error loadExecutable(const void *function,
+                             size_t length,
+                             ShaderType type,
+                             const std::vector&lt;D3DVarying&gt; &amp;streamOutVaryings,
+                             bool separatedOutputBuffers,
+                             ShaderExecutableD3D **outExecutable) override;
+    gl::Error compileToExecutable(gl::InfoLog &amp;infoLog,
+                                  const std::string &amp;shaderHLSL,
+                                  ShaderType type,
+                                  const std::vector&lt;D3DVarying&gt; &amp;streamOutVaryings,
+                                  bool separatedOutputBuffers,
+                                  const D3DCompilerWorkarounds &amp;workarounds,
+                                  ShaderExecutableD3D **outExectuable) override;
+    UniformStorageD3D *createUniformStorage(size_t storageSize) override;
</ins><span class="cx"> 
</span><span class="cx">     // Image operations
</span><span class="cx">     virtual ImageD3D *createImage();
</span><span class="cx">     gl::Error generateMipmap(ImageD3D *dest, ImageD3D *source) override;
</span><del>-    gl::Error generateMipmapsUsingD3D(TextureStorage *storage, const gl::SamplerState &amp;samplerState) override;
</del><ins>+    gl::Error generateMipmapsUsingD3D(TextureStorage *storage,
+                                      const gl::TextureState &amp;textureState) override;
</ins><span class="cx">     virtual TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain);
</span><ins>+    TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage) override;
</ins><span class="cx">     virtual TextureStorage *createTextureStorage2D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly);
</span><span class="cx">     virtual TextureStorage *createTextureStorageCube(GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly);
</span><span class="cx">     virtual TextureStorage *createTextureStorage3D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels);
</span><span class="lines">@@ -207,7 +229,7 @@
</span><span class="cx">     virtual IndexBuffer *createIndexBuffer();
</span><span class="cx"> 
</span><span class="cx">     // Vertex Array creation
</span><del>-    virtual VertexArrayImpl *createVertexArray();
</del><ins>+    VertexArrayImpl *createVertexArray(const gl::VertexArray::Data &amp;data) override;
</ins><span class="cx"> 
</span><span class="cx">     // Query and Fence creation
</span><span class="cx">     virtual QueryImpl *createQuery(GLenum type);
</span><span class="lines">@@ -217,6 +239,9 @@
</span><span class="cx">     // Transform Feedback creation
</span><span class="cx">     virtual TransformFeedbackImpl* createTransformFeedback();
</span><span class="cx"> 
</span><ins>+    // Stream Creation
+    StreamImpl *createStream(const egl::AttributeMap &amp;attribs) override;
+
</ins><span class="cx">     // D3D11-renderer specific methods
</span><span class="cx">     ID3D11Device *getDevice() { return mDevice; }
</span><span class="cx">     void *getD3DDevice() override;
</span><span class="lines">@@ -224,6 +249,8 @@
</span><span class="cx">     ID3D11DeviceContext1 *getDeviceContext1IfSupported() { return mDeviceContext1; };
</span><span class="cx">     DXGIFactory *getDxgiFactory() { return mDxgiFactory; };
</span><span class="cx"> 
</span><ins>+    RenderStateCache &amp;getStateCache() { return mStateCache; }
+
</ins><span class="cx">     Blit11 *getBlitter() { return mBlit; }
</span><span class="cx">     Clear11 *getClearer() { return mClear; }
</span><span class="cx"> 
</span><span class="lines">@@ -232,65 +259,144 @@
</span><span class="cx">     virtual gl::Error fastCopyBufferToTexture(const gl::PixelUnpackState &amp;unpack, unsigned int offset, RenderTargetD3D *destRenderTarget,
</span><span class="cx">                                               GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &amp;destArea);
</span><span class="cx"> 
</span><del>-    void unapplyRenderTargets();
-    void setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView);
-    gl::Error packPixels(ID3D11Texture2D *readTexture, const PackPixelsParams &amp;params, uint8_t *pixelsOut);
</del><ins>+    void markAllStateDirty();
+    gl::Error packPixels(const TextureHelper11 &amp;textureHelper,
+                         const PackPixelsParams &amp;params,
+                         uint8_t *pixelsOut);
</ins><span class="cx"> 
</span><span class="cx">     bool getLUID(LUID *adapterLuid) const override;
</span><del>-    virtual VertexConversionType getVertexConversionType(const gl::VertexFormat &amp;vertexFormat) const;
-    virtual GLenum getVertexComponentType(const gl::VertexFormat &amp;vertexFormat) const;
</del><ins>+    VertexConversionType getVertexConversionType(gl::VertexFormatType vertexFormatType) const override;
+    GLenum getVertexComponentType(gl::VertexFormatType vertexFormatType) const override;
+    gl::ErrorOrResult&lt;unsigned int&gt; getVertexSpaceRequired(const gl::VertexAttribute &amp;attrib,
+                                                           GLsizei count,
+                                                           GLsizei instances) const override;
</ins><span class="cx"> 
</span><del>-    gl::Error readTextureData(ID3D11Texture2D *texture, unsigned int subResource, const gl::Rectangle &amp;area, GLenum format,
-                              GLenum type, GLuint outputPitch, const gl::PixelPackState &amp;pack, uint8_t *pixels);
</del><ins>+    gl::Error readFromAttachment(const gl::FramebufferAttachment &amp;srcAttachment,
+                                 const gl::Rectangle &amp;sourceArea,
+                                 GLenum format,
+                                 GLenum type,
+                                 GLuint outputPitch,
+                                 const gl::PixelPackState &amp;pack,
+                                 uint8_t *pixels);
</ins><span class="cx"> 
</span><del>-    void setShaderResource(gl::SamplerType shaderType, UINT resourceSlot, ID3D11ShaderResourceView *srv);
-
</del><span class="cx">     gl::Error blitRenderbufferRect(const gl::Rectangle &amp;readRect, const gl::Rectangle &amp;drawRect, RenderTargetD3D *readRenderTarget,
</span><span class="cx">                                    RenderTargetD3D *drawRenderTarget, GLenum filter, const gl::Rectangle *scissor,
</span><span class="cx">                                    bool colorBlit, bool depthBlit, bool stencilBlit);
</span><span class="cx"> 
</span><span class="cx">     bool isES3Capable() const;
</span><del>-    D3D_FEATURE_LEVEL getFeatureLevel() const { return mFeatureLevel; };
</del><ins>+    const Renderer11DeviceCaps &amp;getRenderer11DeviceCaps() { return mRenderer11DeviceCaps; };
</ins><span class="cx"> 
</span><span class="cx">     RendererClass getRendererClass() const override { return RENDERER_D3D11; }
</span><ins>+    InputLayoutCache *getInputLayoutCache() { return &amp;mInputLayoutCache; }
+    StateManager11 *getStateManager() { return &amp;mStateManager; }
</ins><span class="cx"> 
</span><ins>+    void onSwap();
+    void onBufferDelete(const Buffer11 *deleted);
+    void onMakeCurrent(const gl::Data &amp;data) override;
+
+    egl::Error getEGLDevice(DeviceImpl **device) override;
+
+  protected:
+    void createAnnotator() override;
+    gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override;
+    gl::Error applyShadersImpl(const gl::Data &amp;data, GLenum drawMode) override;
+
+    void syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;bitmask) override;
+
</ins><span class="cx">   private:
</span><del>-    void generateCaps(gl::Caps *outCaps, gl::TextureCapsMap *outTextureCaps, gl::Extensions *outExtensions) const override;
-    Workarounds generateWorkarounds() const override;
</del><ins>+    gl::Error drawArraysImpl(const gl::Data &amp;data,
+                             GLenum mode,
+                             GLint startVertex,
+                             GLsizei count,
+                             GLsizei instances) override;
+    gl::Error drawElementsImpl(const gl::Data &amp;data,
+                               const TranslatedIndexData &amp;indexInfo,
+                               GLenum mode,
+                               GLsizei count,
+                               GLenum type,
+                               const GLvoid *indices,
+                               GLsizei instances) override;
</ins><span class="cx"> 
</span><del>-    gl::Error drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
-    gl::Error drawTriangleFan(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer, int instances);
</del><ins>+    void generateCaps(gl::Caps *outCaps, gl::TextureCapsMap *outTextureCaps,
+                      gl::Extensions *outExtensions,
+                      gl::Limitations *outLimitations) const override;
</ins><span class="cx"> 
</span><ins>+    WorkaroundsD3D generateWorkarounds() const override;
+
+    gl::Error drawLineLoop(const gl::Data &amp;data,
+                           GLsizei count,
+                           GLenum type,
+                           const GLvoid *indices,
+                           const TranslatedIndexData *indexInfo,
+                           int instances);
+    gl::Error drawTriangleFan(const gl::Data &amp;data,
+                              GLsizei count,
+                              GLenum type,
+                              const GLvoid *indices,
+                              int minIndex,
+                              int instances);
+
</ins><span class="cx">     ID3D11Texture2D *resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource);
</span><del>-    void unsetConflictingSRVs(gl::SamplerType shaderType, uintptr_t resource, const gl::ImageIndex &amp;index);
</del><span class="cx"> 
</span><ins>+    void populateRenderer11DeviceCaps();
+
+    void updateHistograms();
+
+    class SamplerMetadataD3D11 final : angle::NonCopyable
+    {
+      public:
+        SamplerMetadataD3D11();
+        ~SamplerMetadataD3D11();
+
+        struct dx_SamplerMetadata
+        {
+            int baseLevel;
+            int internalFormatBits;
+            int wrapModes;
+            int padding;  // This just pads the struct to 16 bytes
+        };
+        static_assert(sizeof(dx_SamplerMetadata) == 16u,
+                      &quot;Sampler metadata struct must be one 4-vec / 16 bytes.&quot;);
+
+        void initData(unsigned int samplerCount);
+        void update(unsigned int samplerIndex, const gl::Texture &amp;texture);
+
+        const dx_SamplerMetadata *getData() const;
+        size_t sizeBytes() const;
+        bool isDirty() const { return mDirty; }
+        void markClean() { mDirty = false; }
+
+      private:
+        std::vector&lt;dx_SamplerMetadata&gt; mSamplerMetadata;
+        bool mDirty;
+    };
+
+    template &lt;class TShaderConstants&gt;
+    void applyDriverConstantsIfNeeded(TShaderConstants *appliedConstants,
+                                      const TShaderConstants &amp;constants,
+                                      SamplerMetadataD3D11 *samplerMetadata,
+                                      size_t samplerMetadataReferencedBytes,
+                                      ID3D11Buffer *driverConstantBuffer);
+
</ins><span class="cx">     HMODULE mD3d11Module;
</span><span class="cx">     HMODULE mDxgiModule;
</span><ins>+    HMODULE mDCompModule;
</ins><span class="cx">     std::vector&lt;D3D_FEATURE_LEVEL&gt; mAvailableFeatureLevels;
</span><del>-    D3D_DRIVER_TYPE mDriverType;
</del><ins>+    D3D_DRIVER_TYPE mRequestedDriverType;
+    bool mCreatedWithDeviceEXT;
+    DeviceD3D *mEGLDevice;
</ins><span class="cx"> 
</span><span class="cx">     HLSLCompiler mCompiler;
</span><span class="cx"> 
</span><ins>+    egl::Error initializeD3DDevice();
</ins><span class="cx">     void initializeDevice();
</span><span class="cx">     void releaseDeviceResources();
</span><span class="cx">     void release();
</span><span class="cx"> 
</span><ins>+    d3d11::ANGLED3D11DeviceType getDeviceType() const;
+
</ins><span class="cx">     RenderStateCache mStateCache;
</span><span class="cx"> 
</span><del>-    // current render target states
-    uintptr_t mAppliedRTVs[gl::IMPLEMENTATION_MAX_DRAW_BUFFERS];
-    uintptr_t mAppliedDSV;
-    bool mDepthStencilInitialized;
-    bool mRenderTargetDescInitialized;
-
-    struct RenderTargetDesc
-    {
-        size_t width;
-        size_t height;
-        DXGI_FORMAT format;
-    };
-    RenderTargetDesc mRenderTargetDesc;
-
</del><span class="cx">     // Currently applied sampler states
</span><span class="cx">     std::vector&lt;bool&gt; mForceSetVertexSamplerStates;
</span><span class="cx">     std::vector&lt;gl::SamplerState&gt; mCurVertexSamplerStates;
</span><span class="lines">@@ -298,43 +404,8 @@
</span><span class="cx">     std::vector&lt;bool&gt; mForceSetPixelSamplerStates;
</span><span class="cx">     std::vector&lt;gl::SamplerState&gt; mCurPixelSamplerStates;
</span><span class="cx"> 
</span><del>-    // Currently applied textures
-    struct SRVRecord
-    {
-        uintptr_t srv;
-        uintptr_t resource;
-        D3D11_SHADER_RESOURCE_VIEW_DESC desc;
-    };
-    std::vector&lt;SRVRecord&gt; mCurVertexSRVs;
-    std::vector&lt;SRVRecord&gt; mCurPixelSRVs;
</del><ins>+    StateManager11 mStateManager;
</ins><span class="cx"> 
</span><del>-    // Currently applied blend state
-    bool mForceSetBlendState;
-    gl::BlendState mCurBlendState;
-    gl::ColorF mCurBlendColor;
-    unsigned int mCurSampleMask;
-
-    // Currently applied rasterizer state
-    bool mForceSetRasterState;
-    gl::RasterizerState mCurRasterState;
-
-    // Currently applied depth stencil state
-    bool mForceSetDepthStencilState;
-    gl::DepthStencilState mCurDepthStencilState;
-    int mCurStencilRef;
-    int mCurStencilBackRef;
-
-    // Currently applied scissor rectangle
-    bool mForceSetScissor;
-    bool mScissorEnabled;
-    gl::Rectangle mCurScissor;
-
-    // Currently applied viewport
-    bool mForceSetViewport;
-    gl::Rectangle mCurViewport;
-    float mCurNear;
-    float mCurFar;
-
</del><span class="cx">     // Currently applied primitive topology
</span><span class="cx">     D3D11_PRIMITIVE_TOPOLOGY mCurrentPrimitiveTopology;
</span><span class="cx"> 
</span><span class="lines">@@ -342,6 +413,7 @@
</span><span class="cx">     ID3D11Buffer *mAppliedIB;
</span><span class="cx">     DXGI_FORMAT mAppliedIBFormat;
</span><span class="cx">     unsigned int mAppliedIBOffset;
</span><ins>+    bool mAppliedIBChanged;
</ins><span class="cx"> 
</span><span class="cx">     // Currently applied transform feedback buffers
</span><span class="cx">     size_t mAppliedNumXFBBindings;
</span><span class="lines">@@ -359,17 +431,17 @@
</span><span class="cx">     uintptr_t mAppliedGeometryShader;
</span><span class="cx">     uintptr_t mAppliedPixelShader;
</span><span class="cx"> 
</span><del>-    dx_VertexConstants mVertexConstants;
-    dx_VertexConstants mAppliedVertexConstants;
</del><ins>+    dx_VertexConstants11 mAppliedVertexConstants;
</ins><span class="cx">     ID3D11Buffer *mDriverConstantBufferVS;
</span><ins>+    SamplerMetadataD3D11 mSamplerMetadataVS;
</ins><span class="cx">     ID3D11Buffer *mCurrentVertexConstantBuffer;
</span><span class="cx">     unsigned int mCurrentConstantBufferVS[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
</span><span class="cx">     GLintptr mCurrentConstantBufferVSOffset[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
</span><span class="cx">     GLsizeiptr mCurrentConstantBufferVSSize[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS];
</span><span class="cx"> 
</span><del>-    dx_PixelConstants mPixelConstants;
-    dx_PixelConstants mAppliedPixelConstants;
</del><ins>+    dx_PixelConstants11 mAppliedPixelConstants;
</ins><span class="cx">     ID3D11Buffer *mDriverConstantBufferPS;
</span><ins>+    SamplerMetadataD3D11 mSamplerMetadataPS;
</ins><span class="cx">     ID3D11Buffer *mCurrentPixelConstantBuffer;
</span><span class="cx">     unsigned int mCurrentConstantBufferPS[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
</span><span class="cx">     GLintptr mCurrentConstantBufferPSOffset[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS];
</span><span class="lines">@@ -398,11 +470,13 @@
</span><span class="cx">     // Sync query
</span><span class="cx">     ID3D11Query *mSyncQuery;
</span><span class="cx"> 
</span><del>-    // Constant buffer offset support
-    bool mSupportsConstantBufferOffsets;
</del><ins>+    // Created objects state tracking
+    std::set&lt;const Buffer11*&gt; mAliveBuffers;
</ins><span class="cx"> 
</span><ins>+    double mLastHistogramUpdateTime;
+
</ins><span class="cx">     ID3D11Device *mDevice;
</span><del>-    D3D_FEATURE_LEVEL mFeatureLevel;
</del><ins>+    Renderer11DeviceCaps mRenderer11DeviceCaps;
</ins><span class="cx">     ID3D11DeviceContext *mDeviceContext;
</span><span class="cx">     ID3D11DeviceContext1 *mDeviceContext1;
</span><span class="cx">     IDXGIAdapter *mDxgiAdapter;
</span><span class="lines">@@ -411,7 +485,9 @@
</span><span class="cx">     DXGIFactory *mDxgiFactory;
</span><span class="cx">     ID3D11Debug *mDebug;
</span><span class="cx"> 
</span><del>-    DebugAnnotator11 mAnnotator;
</del><ins>+    std::vector&lt;GLuint&gt; mScratchIndexDataBuffer;
+
+    mutable Optional&lt;bool&gt; mSupportsShareHandles;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11ShaderExecutable11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/ShaderExecutable11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -77,7 +77,7 @@
</span><span class="cx">     if (initialSize &gt; 0)
</span><span class="cx">     {
</span><span class="cx">         D3D11_BUFFER_DESC constantBufferDescription = {0};
</span><del>-        constantBufferDescription.ByteWidth = initialSize;
</del><ins>+        constantBufferDescription.ByteWidth           = static_cast&lt;unsigned int&gt;(initialSize);
</ins><span class="cx">         constantBufferDescription.Usage = D3D11_USAGE_DYNAMIC;
</span><span class="cx">         constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
</span><span class="cx">         constantBufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11StateManager11cpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,1136 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// StateManager11.cpp: Defines a class for caching D3D11 state
+
+#include &quot;libANGLE/renderer/d3d/d3d11/StateManager11.h&quot;
+
+#include &quot;common/BitSetIterator.h&quot;
+#include &quot;common/utilities.h&quot;
+#include &quot;libANGLE/Query.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/Framebuffer11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/RenderTarget11.h&quot;
+
+namespace rx
+{
+
+namespace
+{
+bool ImageIndexConflictsWithSRV(const gl::ImageIndex &amp;index, D3D11_SHADER_RESOURCE_VIEW_DESC desc)
+{
+    unsigned mipLevel   = index.mipIndex;
+    unsigned layerIndex = index.layerIndex;
+    GLenum type         = index.type;
+
+    switch (desc.ViewDimension)
+    {
+        case D3D11_SRV_DIMENSION_TEXTURE2D:
+        {
+            unsigned maxSrvMip = desc.Texture2D.MipLevels + desc.Texture2D.MostDetailedMip;
+            maxSrvMip          = (desc.Texture2D.MipLevels == -1) ? INT_MAX : maxSrvMip;
+
+            unsigned mipMin = index.mipIndex;
+            unsigned mipMax = (layerIndex == -1) ? INT_MAX : layerIndex;
+
+            return type == GL_TEXTURE_2D &amp;&amp;
+                   gl::RangeUI(mipMin, mipMax)
+                       .intersects(gl::RangeUI(desc.Texture2D.MostDetailedMip, maxSrvMip));
+        }
+
+        case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
+        {
+            unsigned maxSrvMip =
+                desc.Texture2DArray.MipLevels + desc.Texture2DArray.MostDetailedMip;
+            maxSrvMip = (desc.Texture2DArray.MipLevels == -1) ? INT_MAX : maxSrvMip;
+
+            unsigned maxSlice = desc.Texture2DArray.FirstArraySlice + desc.Texture2DArray.ArraySize;
+
+            // Cube maps can be mapped to Texture2DArray SRVs
+            return (type == GL_TEXTURE_2D_ARRAY || gl::IsCubeMapTextureTarget(type)) &amp;&amp;
+                   desc.Texture2DArray.MostDetailedMip &lt;= mipLevel &amp;&amp; mipLevel &lt; maxSrvMip &amp;&amp;
+                   desc.Texture2DArray.FirstArraySlice &lt;= layerIndex &amp;&amp; layerIndex &lt; maxSlice;
+        }
+
+        case D3D11_SRV_DIMENSION_TEXTURECUBE:
+        {
+            unsigned maxSrvMip = desc.TextureCube.MipLevels + desc.TextureCube.MostDetailedMip;
+            maxSrvMip          = (desc.TextureCube.MipLevels == -1) ? INT_MAX : maxSrvMip;
+
+            return gl::IsCubeMapTextureTarget(type) &amp;&amp;
+                   desc.TextureCube.MostDetailedMip &lt;= mipLevel &amp;&amp; mipLevel &lt; maxSrvMip;
+        }
+
+        case D3D11_SRV_DIMENSION_TEXTURE3D:
+        {
+            unsigned maxSrvMip = desc.Texture3D.MipLevels + desc.Texture3D.MostDetailedMip;
+            maxSrvMip          = (desc.Texture3D.MipLevels == -1) ? INT_MAX : maxSrvMip;
+
+            return type == GL_TEXTURE_3D &amp;&amp; desc.Texture3D.MostDetailedMip &lt;= mipLevel &amp;&amp;
+                   mipLevel &lt; maxSrvMip;
+        }
+        default:
+            // We only handle the cases corresponding to valid image indexes
+            UNIMPLEMENTED();
+    }
+
+    return false;
+}
+
+// Does *not* increment the resource ref count!!
+ID3D11Resource *GetViewResource(ID3D11View *view)
+{
+    ID3D11Resource *resource = NULL;
+    ASSERT(view);
+    view-&gt;GetResource(&amp;resource);
+    resource-&gt;Release();
+    return resource;
+}
+
+}  // anonymous namespace
+
+void StateManager11::SRVCache::update(size_t resourceIndex, ID3D11ShaderResourceView *srv)
+{
+    ASSERT(resourceIndex &lt; mCurrentSRVs.size());
+    SRVRecord *record = &amp;mCurrentSRVs[resourceIndex];
+
+    record-&gt;srv = reinterpret_cast&lt;uintptr_t&gt;(srv);
+    if (srv)
+    {
+        record-&gt;resource = reinterpret_cast&lt;uintptr_t&gt;(GetViewResource(srv));
+        srv-&gt;GetDesc(&amp;record-&gt;desc);
+        mHighestUsedSRV = std::max(resourceIndex + 1, mHighestUsedSRV);
+    }
+    else
+    {
+        record-&gt;resource = 0;
+
+        if (resourceIndex + 1 == mHighestUsedSRV)
+        {
+            do
+            {
+                --mHighestUsedSRV;
+            } while (mHighestUsedSRV &gt; 0 &amp;&amp; mCurrentSRVs[mHighestUsedSRV].srv == 0);
+        }
+    }
+}
+
+void StateManager11::SRVCache::clear()
+{
+    if (mCurrentSRVs.empty())
+    {
+        return;
+    }
+
+    memset(&amp;mCurrentSRVs[0], 0, sizeof(SRVRecord) * mCurrentSRVs.size());
+    mHighestUsedSRV = 0;
+}
+
+static const GLenum QueryTypes[] = {GL_ANY_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED_CONSERVATIVE,
+                                    GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, GL_TIME_ELAPSED_EXT};
+
+StateManager11::StateManager11(Renderer11 *renderer)
+    : mRenderer(renderer),
+      mBlendStateIsDirty(false),
+      mCurBlendColor(0, 0, 0, 0),
+      mCurSampleMask(0),
+      mDepthStencilStateIsDirty(false),
+      mCurStencilRef(0),
+      mCurStencilBackRef(0),
+      mCurStencilSize(0),
+      mRasterizerStateIsDirty(false),
+      mScissorStateIsDirty(false),
+      mCurScissorEnabled(false),
+      mCurScissorRect(),
+      mViewportStateIsDirty(false),
+      mCurViewport(),
+      mCurNear(0.0f),
+      mCurFar(0.0f),
+      mViewportBounds(),
+      mRenderTargetIsDirty(false),
+      mDirtyCurrentValueAttribs(),
+      mCurrentValueAttribs()
+{
+    mCurBlendState.blend                 = false;
+    mCurBlendState.sourceBlendRGB        = GL_ONE;
+    mCurBlendState.destBlendRGB          = GL_ZERO;
+    mCurBlendState.sourceBlendAlpha      = GL_ONE;
+    mCurBlendState.destBlendAlpha        = GL_ZERO;
+    mCurBlendState.blendEquationRGB      = GL_FUNC_ADD;
+    mCurBlendState.blendEquationAlpha    = GL_FUNC_ADD;
+    mCurBlendState.colorMaskRed          = true;
+    mCurBlendState.colorMaskBlue         = true;
+    mCurBlendState.colorMaskGreen        = true;
+    mCurBlendState.colorMaskAlpha        = true;
+    mCurBlendState.sampleAlphaToCoverage = false;
+    mCurBlendState.dither                = false;
+
+    mCurDepthStencilState.depthTest                = false;
+    mCurDepthStencilState.depthFunc                = GL_LESS;
+    mCurDepthStencilState.depthMask                = true;
+    mCurDepthStencilState.stencilTest              = false;
+    mCurDepthStencilState.stencilMask              = true;
+    mCurDepthStencilState.stencilFail              = GL_KEEP;
+    mCurDepthStencilState.stencilPassDepthFail     = GL_KEEP;
+    mCurDepthStencilState.stencilPassDepthPass     = GL_KEEP;
+    mCurDepthStencilState.stencilWritemask         = static_cast&lt;GLuint&gt;(-1);
+    mCurDepthStencilState.stencilBackFunc          = GL_ALWAYS;
+    mCurDepthStencilState.stencilBackMask          = static_cast&lt;GLuint&gt;(-1);
+    mCurDepthStencilState.stencilBackFail          = GL_KEEP;
+    mCurDepthStencilState.stencilBackPassDepthFail = GL_KEEP;
+    mCurDepthStencilState.stencilBackPassDepthPass = GL_KEEP;
+    mCurDepthStencilState.stencilBackWritemask     = static_cast&lt;GLuint&gt;(-1);
+
+    mCurRasterState.rasterizerDiscard   = false;
+    mCurRasterState.cullFace            = false;
+    mCurRasterState.cullMode            = GL_BACK;
+    mCurRasterState.frontFace           = GL_CCW;
+    mCurRasterState.polygonOffsetFill   = false;
+    mCurRasterState.polygonOffsetFactor = 0.0f;
+    mCurRasterState.polygonOffsetUnits  = 0.0f;
+    mCurRasterState.pointDrawMode       = false;
+    mCurRasterState.multiSample         = false;
+
+    // Initially all current value attributes must be updated on first use.
+    mDirtyCurrentValueAttribs.flip();
+}
+
+StateManager11::~StateManager11()
+{
+}
+
+void StateManager11::updateStencilSizeIfChanged(bool depthStencilInitialized,
+                                                unsigned int stencilSize)
+{
+    if (!depthStencilInitialized || stencilSize != mCurStencilSize)
+    {
+        mCurStencilSize           = stencilSize;
+        mDepthStencilStateIsDirty = true;
+    }
+}
+
+void StateManager11::setViewportBounds(const int width, const int height)
+{
+    if (mRenderer-&gt;getRenderer11DeviceCaps().featureLevel &lt;= D3D_FEATURE_LEVEL_9_3 &amp;&amp;
+        (mViewportBounds.width != width || mViewportBounds.height != height))
+    {
+        mViewportBounds       = gl::Extents(width, height, 1);
+        mViewportStateIsDirty = true;
+    }
+}
+
+void StateManager11::updatePresentPath(bool presentPathFastActive,
+                                       const gl::FramebufferAttachment *framebufferAttachment)
+{
+    const int colorBufferHeight =
+        framebufferAttachment ? framebufferAttachment-&gt;getSize().height : 0;
+
+    if ((mCurPresentPathFastEnabled != presentPathFastActive) ||
+        (presentPathFastActive &amp;&amp; (colorBufferHeight != mCurPresentPathFastColorBufferHeight)))
+    {
+        mCurPresentPathFastEnabled           = presentPathFastActive;
+        mCurPresentPathFastColorBufferHeight = colorBufferHeight;
+        mViewportStateIsDirty                = true;  // Viewport may need to be vertically inverted
+        mScissorStateIsDirty                 = true;  // Scissor rect may need to be vertically inverted
+        mRasterizerStateIsDirty              = true;  // Cull Mode may need to be inverted
+    }
+}
+
+void StateManager11::syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;dirtyBits)
+{
+    if (!dirtyBits.any())
+    {
+        return;
+    }
+
+    for (auto dirtyBit : angle::IterateBitSet(dirtyBits))
+    {
+        switch (dirtyBit)
+        {
+            case gl::State::DIRTY_BIT_BLEND_EQUATIONS:
+            {
+                const gl::BlendState &amp;blendState = state.getBlendState();
+                if (blendState.blendEquationRGB != mCurBlendState.blendEquationRGB ||
+                    blendState.blendEquationAlpha != mCurBlendState.blendEquationAlpha)
+                {
+                    mBlendStateIsDirty = true;
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_BLEND_FUNCS:
+            {
+                const gl::BlendState &amp;blendState = state.getBlendState();
+                if (blendState.sourceBlendRGB != mCurBlendState.sourceBlendRGB ||
+                    blendState.destBlendRGB != mCurBlendState.destBlendRGB ||
+                    blendState.sourceBlendAlpha != mCurBlendState.sourceBlendAlpha ||
+                    blendState.destBlendAlpha != mCurBlendState.destBlendAlpha)
+                {
+                    mBlendStateIsDirty = true;
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_BLEND_ENABLED:
+                if (state.getBlendState().blend != mCurBlendState.blend)
+                {
+                    mBlendStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED:
+                if (state.getBlendState().sampleAlphaToCoverage !=
+                    mCurBlendState.sampleAlphaToCoverage)
+                {
+                    mBlendStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_DITHER_ENABLED:
+                if (state.getBlendState().dither != mCurBlendState.dither)
+                {
+                    mBlendStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_COLOR_MASK:
+            {
+                const gl::BlendState &amp;blendState = state.getBlendState();
+                if (blendState.colorMaskRed != mCurBlendState.colorMaskRed ||
+                    blendState.colorMaskGreen != mCurBlendState.colorMaskGreen ||
+                    blendState.colorMaskBlue != mCurBlendState.colorMaskBlue ||
+                    blendState.colorMaskAlpha != mCurBlendState.colorMaskAlpha)
+                {
+                    mBlendStateIsDirty = true;
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_BLEND_COLOR:
+                if (state.getBlendColor() != mCurBlendColor)
+                {
+                    mBlendStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_MASK:
+                if (state.getDepthStencilState().depthMask != mCurDepthStencilState.depthMask)
+                {
+                    mDepthStencilStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
+                if (state.getDepthStencilState().depthTest != mCurDepthStencilState.depthTest)
+                {
+                    mDepthStencilStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_FUNC:
+                if (state.getDepthStencilState().depthFunc != mCurDepthStencilState.depthFunc)
+                {
+                    mDepthStencilStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED:
+                if (state.getDepthStencilState().stencilTest != mCurDepthStencilState.stencilTest)
+                {
+                    mDepthStencilStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT:
+            {
+                const gl::DepthStencilState &amp;depthStencil = state.getDepthStencilState();
+                if (depthStencil.stencilFunc != mCurDepthStencilState.stencilFunc ||
+                    depthStencil.stencilMask != mCurDepthStencilState.stencilMask ||
+                    state.getStencilRef() != mCurStencilRef)
+                {
+                    mDepthStencilStateIsDirty = true;
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK:
+            {
+                const gl::DepthStencilState &amp;depthStencil = state.getDepthStencilState();
+                if (depthStencil.stencilBackFunc != mCurDepthStencilState.stencilBackFunc ||
+                    depthStencil.stencilBackMask != mCurDepthStencilState.stencilBackMask ||
+                    state.getStencilBackRef() != mCurStencilBackRef)
+                {
+                    mDepthStencilStateIsDirty = true;
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
+                if (state.getDepthStencilState().stencilWritemask !=
+                    mCurDepthStencilState.stencilWritemask)
+                {
+                    mDepthStencilStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK:
+                if (state.getDepthStencilState().stencilBackWritemask !=
+                    mCurDepthStencilState.stencilBackWritemask)
+                {
+                    mDepthStencilStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT:
+            {
+                const gl::DepthStencilState &amp;depthStencil = state.getDepthStencilState();
+                if (depthStencil.stencilFail != mCurDepthStencilState.stencilFail ||
+                    depthStencil.stencilPassDepthFail !=
+                        mCurDepthStencilState.stencilPassDepthFail ||
+                    depthStencil.stencilPassDepthPass != mCurDepthStencilState.stencilPassDepthPass)
+                {
+                    mDepthStencilStateIsDirty = true;
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_STENCIL_OPS_BACK:
+            {
+                const gl::DepthStencilState &amp;depthStencil = state.getDepthStencilState();
+                if (depthStencil.stencilBackFail != mCurDepthStencilState.stencilBackFail ||
+                    depthStencil.stencilBackPassDepthFail !=
+                        mCurDepthStencilState.stencilBackPassDepthFail ||
+                    depthStencil.stencilBackPassDepthPass !=
+                        mCurDepthStencilState.stencilBackPassDepthPass)
+                {
+                    mDepthStencilStateIsDirty = true;
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
+                if (state.getRasterizerState().cullFace != mCurRasterState.cullFace)
+                {
+                    mRasterizerStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_CULL_FACE:
+                if (state.getRasterizerState().cullMode != mCurRasterState.cullMode)
+                {
+                    mRasterizerStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_FRONT_FACE:
+                if (state.getRasterizerState().frontFace != mCurRasterState.frontFace)
+                {
+                    mRasterizerStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
+                if (state.getRasterizerState().polygonOffsetFill !=
+                    mCurRasterState.polygonOffsetFill)
+                {
+                    mRasterizerStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_POLYGON_OFFSET:
+            {
+                const gl::RasterizerState &amp;rasterState = state.getRasterizerState();
+                if (rasterState.polygonOffsetFactor != mCurRasterState.polygonOffsetFactor ||
+                    rasterState.polygonOffsetUnits != mCurRasterState.polygonOffsetUnits)
+                {
+                    mRasterizerStateIsDirty = true;
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED:
+                if (state.getRasterizerState().rasterizerDiscard !=
+                    mCurRasterState.rasterizerDiscard)
+                {
+                    mRasterizerStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_SCISSOR:
+                if (state.getScissor() != mCurScissorRect)
+                {
+                    mScissorStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED:
+                if (state.isScissorTestEnabled() != mCurScissorEnabled)
+                {
+                    mScissorStateIsDirty = true;
+                    // Rasterizer state update needs mCurScissorsEnabled and updates when it changes
+                    mRasterizerStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_RANGE:
+                if (state.getNearPlane() != mCurNear || state.getFarPlane() != mCurFar)
+                {
+                    mViewportStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_VIEWPORT:
+                if (state.getViewport() != mCurViewport)
+                {
+                    mViewportStateIsDirty = true;
+                }
+                break;
+            case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
+                mRenderTargetIsDirty = true;
+                break;
+            default:
+                if (dirtyBit &gt;= gl::State::DIRTY_BIT_CURRENT_VALUE_0 &amp;&amp;
+                    dirtyBit &lt; gl::State::DIRTY_BIT_CURRENT_VALUE_MAX)
+                {
+                    size_t attribIndex =
+                        static_cast&lt;size_t&gt;(dirtyBit - gl::State::DIRTY_BIT_CURRENT_VALUE_0);
+                    mDirtyCurrentValueAttribs.set(attribIndex);
+                }
+                break;
+        }
+    }
+}
+
+gl::Error StateManager11::setBlendState(const gl::Framebuffer *framebuffer,
+                                        const gl::BlendState &amp;blendState,
+                                        const gl::ColorF &amp;blendColor,
+                                        unsigned int sampleMask)
+{
+    if (!mBlendStateIsDirty &amp;&amp; sampleMask == mCurSampleMask)
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    ID3D11BlendState *dxBlendState = nullptr;
+    gl::Error error =
+        mRenderer-&gt;getStateCache().getBlendState(framebuffer, blendState, &amp;dxBlendState);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    ASSERT(dxBlendState != nullptr);
+
+    float blendColors[4] = {0.0f};
+    if (blendState.sourceBlendRGB != GL_CONSTANT_ALPHA &amp;&amp;
+        blendState.sourceBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA &amp;&amp;
+        blendState.destBlendRGB != GL_CONSTANT_ALPHA &amp;&amp;
+        blendState.destBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA)
+    {
+        blendColors[0] = blendColor.red;
+        blendColors[1] = blendColor.green;
+        blendColors[2] = blendColor.blue;
+        blendColors[3] = blendColor.alpha;
+    }
+    else
+    {
+        blendColors[0] = blendColor.alpha;
+        blendColors[1] = blendColor.alpha;
+        blendColors[2] = blendColor.alpha;
+        blendColors[3] = blendColor.alpha;
+    }
+
+    mRenderer-&gt;getDeviceContext()-&gt;OMSetBlendState(dxBlendState, blendColors, sampleMask);
+
+    mCurBlendState = blendState;
+    mCurBlendColor = blendColor;
+    mCurSampleMask = sampleMask;
+
+    mBlendStateIsDirty = false;
+
+    return error;
+}
+
+gl::Error StateManager11::setDepthStencilState(const gl::State &amp;glState)
+{
+    const auto &amp;fbo = *glState.getDrawFramebuffer();
+
+    // Disable the depth test/depth write if we are using a stencil-only attachment.
+    // This is because ANGLE emulates stencil-only with D24S8 on D3D11 - we should neither read
+    // nor write to the unused depth part of this emulated texture.
+    bool disableDepth = (!fbo.hasDepth() &amp;&amp; fbo.hasStencil());
+
+    // Similarly we disable the stencil portion of the DS attachment if the app only binds depth.
+    bool disableStencil = (fbo.hasDepth() &amp;&amp; !fbo.hasStencil());
+
+    // CurDisableDepth/Stencil are reset automatically after we call forceSetDepthStencilState.
+    if (!mDepthStencilStateIsDirty &amp;&amp; mCurDisableDepth.valid() &amp;&amp;
+        disableDepth == mCurDisableDepth.value() &amp;&amp; mCurDisableStencil.valid() &amp;&amp;
+        disableStencil == mCurDisableStencil.value())
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    const auto &amp;depthStencilState = glState.getDepthStencilState();
+    int stencilRef                = glState.getStencilRef();
+    int stencilBackRef            = glState.getStencilBackRef();
+
+    // get the maximum size of the stencil ref
+    unsigned int maxStencil = 0;
+    if (depthStencilState.stencilTest &amp;&amp; mCurStencilSize &gt; 0)
+    {
+        maxStencil = (1 &lt;&lt; mCurStencilSize) - 1;
+    }
+    ASSERT((depthStencilState.stencilWritemask &amp; maxStencil) ==
+           (depthStencilState.stencilBackWritemask &amp; maxStencil));
+    ASSERT(stencilRef == stencilBackRef);
+    ASSERT((depthStencilState.stencilMask &amp; maxStencil) ==
+           (depthStencilState.stencilBackMask &amp; maxStencil));
+
+    ID3D11DepthStencilState *dxDepthStencilState = NULL;
+    gl::Error error = mRenderer-&gt;getStateCache().getDepthStencilState(
+        depthStencilState, disableDepth, disableStencil, &amp;dxDepthStencilState);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    ASSERT(dxDepthStencilState);
+
+    // Max D3D11 stencil reference value is 0xFF,
+    // corresponding to the max 8 bits in a stencil buffer
+    // GL specifies we should clamp the ref value to the
+    // nearest bit depth when doing stencil ops
+    static_assert(D3D11_DEFAULT_STENCIL_READ_MASK == 0xFF,
+                  &quot;Unexpected value of D3D11_DEFAULT_STENCIL_READ_MASK&quot;);
+    static_assert(D3D11_DEFAULT_STENCIL_WRITE_MASK == 0xFF,
+                  &quot;Unexpected value of D3D11_DEFAULT_STENCIL_WRITE_MASK&quot;);
+    UINT dxStencilRef = std::min&lt;UINT&gt;(stencilRef, 0xFFu);
+
+    mRenderer-&gt;getDeviceContext()-&gt;OMSetDepthStencilState(dxDepthStencilState, dxStencilRef);
+
+    mCurDepthStencilState = depthStencilState;
+    mCurStencilRef        = stencilRef;
+    mCurStencilBackRef    = stencilBackRef;
+    mCurDisableDepth      = disableDepth;
+    mCurDisableStencil    = disableStencil;
+
+    mDepthStencilStateIsDirty = false;
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error StateManager11::setRasterizerState(const gl::RasterizerState &amp;rasterState)
+{
+    // TODO: Remove pointDrawMode and multiSample from gl::RasterizerState.
+    if (!mRasterizerStateIsDirty &amp;&amp; rasterState.pointDrawMode == mCurRasterState.pointDrawMode &amp;&amp;
+        rasterState.multiSample == mCurRasterState.multiSample)
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    ID3D11RasterizerState *dxRasterState = nullptr;
+    gl::Error error(GL_NO_ERROR);
+
+    if (mCurPresentPathFastEnabled)
+    {
+        gl::RasterizerState modifiedRasterState = rasterState;
+
+        // If prseent path fast is active then we need invert the front face state.
+        // This ensures that both gl_FrontFacing is correct, and front/back culling
+        // is performed correctly.
+        if (modifiedRasterState.frontFace == GL_CCW)
+        {
+            modifiedRasterState.frontFace = GL_CW;
+        }
+        else
+        {
+            ASSERT(modifiedRasterState.frontFace == GL_CW);
+            modifiedRasterState.frontFace = GL_CCW;
+        }
+
+        error = mRenderer-&gt;getStateCache().getRasterizerState(modifiedRasterState,
+                                                              mCurScissorEnabled, &amp;dxRasterState);
+    }
+    else
+    {
+        error = mRenderer-&gt;getStateCache().getRasterizerState(rasterState, mCurScissorEnabled,
+                                                              &amp;dxRasterState);
+    }
+
+    if (error.isError())
+    {
+        return error;
+    }
+
+    mRenderer-&gt;getDeviceContext()-&gt;RSSetState(dxRasterState);
+
+    mCurRasterState         = rasterState;
+    mRasterizerStateIsDirty = false;
+
+    return error;
+}
+
+void StateManager11::setScissorRectangle(const gl::Rectangle &amp;scissor, bool enabled)
+{
+    if (!mScissorStateIsDirty)
+        return;
+
+    int modifiedScissorY = scissor.y;
+    if (mCurPresentPathFastEnabled)
+    {
+        modifiedScissorY = mCurPresentPathFastColorBufferHeight - scissor.height - scissor.y;
+    }
+
+    if (enabled)
+    {
+        D3D11_RECT rect;
+        rect.left   = std::max(0, scissor.x);
+        rect.top    = std::max(0, modifiedScissorY);
+        rect.right  = scissor.x + std::max(0, scissor.width);
+        rect.bottom = modifiedScissorY + std::max(0, scissor.height);
+
+        mRenderer-&gt;getDeviceContext()-&gt;RSSetScissorRects(1, &amp;rect);
+    }
+
+    mCurScissorRect      = scissor;
+    mCurScissorEnabled   = enabled;
+    mScissorStateIsDirty = false;
+}
+
+void StateManager11::setViewport(const gl::Caps *caps,
+                                 const gl::Rectangle &amp;viewport,
+                                 float zNear,
+                                 float zFar)
+{
+    if (!mViewportStateIsDirty)
+        return;
+
+    float actualZNear = gl::clamp01(zNear);
+    float actualZFar  = gl::clamp01(zFar);
+
+    int dxMaxViewportBoundsX = static_cast&lt;int&gt;(caps-&gt;maxViewportWidth);
+    int dxMaxViewportBoundsY = static_cast&lt;int&gt;(caps-&gt;maxViewportHeight);
+    int dxMinViewportBoundsX = -dxMaxViewportBoundsX;
+    int dxMinViewportBoundsY = -dxMaxViewportBoundsY;
+
+    if (mRenderer-&gt;getRenderer11DeviceCaps().featureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
+    {
+        // Feature Level 9 viewports shouldn't exceed the dimensions of the rendertarget.
+        dxMaxViewportBoundsX = static_cast&lt;int&gt;(mViewportBounds.width);
+        dxMaxViewportBoundsY = static_cast&lt;int&gt;(mViewportBounds.height);
+        dxMinViewportBoundsX = 0;
+        dxMinViewportBoundsY = 0;
+    }
+
+    int dxViewportTopLeftX = gl::clamp(viewport.x, dxMinViewportBoundsX, dxMaxViewportBoundsX);
+    int dxViewportTopLeftY = gl::clamp(viewport.y, dxMinViewportBoundsY, dxMaxViewportBoundsY);
+    int dxViewportWidth    = gl::clamp(viewport.width, 0, dxMaxViewportBoundsX - dxViewportTopLeftX);
+    int dxViewportHeight   = gl::clamp(viewport.height, 0, dxMaxViewportBoundsY - dxViewportTopLeftY);
+
+    D3D11_VIEWPORT dxViewport;
+    dxViewport.TopLeftX = static_cast&lt;float&gt;(dxViewportTopLeftX);
+
+    if (mCurPresentPathFastEnabled)
+    {
+        // When present path fast is active and we're rendering to framebuffer 0, we must invert
+        // the viewport in Y-axis.
+        // NOTE: We delay the inversion until right before the call to RSSetViewports, and leave
+        // dxViewportTopLeftY unchanged. This allows us to calculate viewAdjust below using the
+        // unaltered dxViewportTopLeftY value.
+        dxViewport.TopLeftY = static_cast&lt;float&gt;(mCurPresentPathFastColorBufferHeight -
+                                                 dxViewportTopLeftY - dxViewportHeight);
+    }
+    else
+    {
+        dxViewport.TopLeftY = static_cast&lt;float&gt;(dxViewportTopLeftY);
+    }
+
+    dxViewport.Width    = static_cast&lt;float&gt;(dxViewportWidth);
+    dxViewport.Height   = static_cast&lt;float&gt;(dxViewportHeight);
+    dxViewport.MinDepth = actualZNear;
+    dxViewport.MaxDepth = actualZFar;
+
+    mRenderer-&gt;getDeviceContext()-&gt;RSSetViewports(1, &amp;dxViewport);
+
+    mCurViewport = viewport;
+    mCurNear     = actualZNear;
+    mCurFar      = actualZFar;
+
+    // On Feature Level 9_*, we must emulate large and/or negative viewports in the shaders
+    // using viewAdjust (like the D3D9 renderer).
+    if (mRenderer-&gt;getRenderer11DeviceCaps().featureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
+    {
+        mVertexConstants.viewAdjust[0] = static_cast&lt;float&gt;((viewport.width - dxViewportWidth) +
+                                                            2 * (viewport.x - dxViewportTopLeftX)) /
+                                         dxViewport.Width;
+        mVertexConstants.viewAdjust[1] = static_cast&lt;float&gt;((viewport.height - dxViewportHeight) +
+                                                            2 * (viewport.y - dxViewportTopLeftY)) /
+                                         dxViewport.Height;
+        mVertexConstants.viewAdjust[2] = static_cast&lt;float&gt;(viewport.width) / dxViewport.Width;
+        mVertexConstants.viewAdjust[3] = static_cast&lt;float&gt;(viewport.height) / dxViewport.Height;
+    }
+
+    mPixelConstants.viewCoords[0] = viewport.width * 0.5f;
+    mPixelConstants.viewCoords[1] = viewport.height * 0.5f;
+    mPixelConstants.viewCoords[2] = viewport.x + (viewport.width * 0.5f);
+    mPixelConstants.viewCoords[3] = viewport.y + (viewport.height * 0.5f);
+
+    // Instanced pointsprite emulation requires ViewCoords to be defined in the
+    // the vertex shader.
+    mVertexConstants.viewCoords[0] = mPixelConstants.viewCoords[0];
+    mVertexConstants.viewCoords[1] = mPixelConstants.viewCoords[1];
+    mVertexConstants.viewCoords[2] = mPixelConstants.viewCoords[2];
+    mVertexConstants.viewCoords[3] = mPixelConstants.viewCoords[3];
+
+    mPixelConstants.depthFront[0] = (actualZFar - actualZNear) * 0.5f;
+    mPixelConstants.depthFront[1] = (actualZNear + actualZFar) * 0.5f;
+
+    mVertexConstants.depthRange[0] = actualZNear;
+    mVertexConstants.depthRange[1] = actualZFar;
+    mVertexConstants.depthRange[2] = actualZFar - actualZNear;
+
+    mPixelConstants.depthRange[0] = actualZNear;
+    mPixelConstants.depthRange[1] = actualZFar;
+    mPixelConstants.depthRange[2] = actualZFar - actualZNear;
+
+    mPixelConstants.viewScale[0] = 1.0f;
+    mPixelConstants.viewScale[1] = mCurPresentPathFastEnabled ? 1.0f : -1.0f;
+    mPixelConstants.viewScale[2] = 1.0f;
+    mPixelConstants.viewScale[3] = 1.0f;
+
+    mVertexConstants.viewScale[0] = mPixelConstants.viewScale[0];
+    mVertexConstants.viewScale[1] = mPixelConstants.viewScale[1];
+    mVertexConstants.viewScale[2] = mPixelConstants.viewScale[2];
+    mVertexConstants.viewScale[3] = mPixelConstants.viewScale[3];
+
+    mViewportStateIsDirty = false;
+}
+
+void StateManager11::invalidateRenderTarget()
+{
+    mRenderTargetIsDirty = true;
+}
+
+void StateManager11::invalidateBoundViews()
+{
+    mCurVertexSRVs.clear();
+    mCurPixelSRVs.clear();
+
+    invalidateRenderTarget();
+}
+
+void StateManager11::invalidateEverything()
+{
+    mBlendStateIsDirty        = true;
+    mDepthStencilStateIsDirty = true;
+    mRasterizerStateIsDirty   = true;
+    mScissorStateIsDirty      = true;
+    mViewportStateIsDirty     = true;
+
+    // We reset the current SRV data because it might not be in sync with D3D's state
+    // anymore. For example when a currently used SRV is used as an RTV, D3D silently
+    // remove it from its state.
+    invalidateBoundViews();
+}
+
+void StateManager11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTarget,
+                                            ID3D11DepthStencilView *depthStencil)
+{
+    mRenderer-&gt;getDeviceContext()-&gt;OMSetRenderTargets(1, &amp;renderTarget, depthStencil);
+    mRenderTargetIsDirty = true;
+}
+
+void StateManager11::setOneTimeRenderTargets(
+    const std::vector&lt;ID3D11RenderTargetView *&gt; &amp;renderTargets,
+    ID3D11DepthStencilView *depthStencil)
+{
+    UINT count               = static_cast&lt;UINT&gt;(renderTargets.size());
+    auto renderTargetPointer = (!renderTargets.empty() ? renderTargets.data() : nullptr);
+
+    mRenderer-&gt;getDeviceContext()-&gt;OMSetRenderTargets(count, renderTargetPointer, depthStencil);
+    mRenderTargetIsDirty = true;
+}
+
+void StateManager11::onBeginQuery(Query11 *query)
+{
+    mCurrentQueries.insert(query);
+}
+
+void StateManager11::onDeleteQueryObject(Query11 *query)
+{
+    mCurrentQueries.erase(query);
+}
+
+gl::Error StateManager11::onMakeCurrent(const gl::Data &amp;data)
+{
+    const gl::State &amp;state = *data.state;
+
+    for (Query11 *query : mCurrentQueries)
+    {
+        query-&gt;pause();
+    }
+    mCurrentQueries.clear();
+
+    for (GLenum queryType : QueryTypes)
+    {
+        gl::Query *query = state.getActiveQuery(queryType);
+        if (query != nullptr)
+        {
+            Query11 *query11 = GetImplAs&lt;Query11&gt;(query);
+            query11-&gt;resume();
+            mCurrentQueries.insert(query11);
+        }
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+void StateManager11::setShaderResource(gl::SamplerType shaderType,
+                                       UINT resourceSlot,
+                                       ID3D11ShaderResourceView *srv)
+{
+    auto &amp;currentSRVs = (shaderType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
+
+    ASSERT(static_cast&lt;size_t&gt;(resourceSlot) &lt; currentSRVs.size());
+    const SRVRecord &amp;record = currentSRVs[resourceSlot];
+
+    if (record.srv != reinterpret_cast&lt;uintptr_t&gt;(srv))
+    {
+        auto deviceContext = mRenderer-&gt;getDeviceContext();
+        if (shaderType == gl::SAMPLER_VERTEX)
+        {
+            deviceContext-&gt;VSSetShaderResources(resourceSlot, 1, &amp;srv);
+        }
+        else
+        {
+            deviceContext-&gt;PSSetShaderResources(resourceSlot, 1, &amp;srv);
+        }
+
+        currentSRVs.update(resourceSlot, srv);
+    }
+}
+
+gl::Error StateManager11::clearTextures(gl::SamplerType samplerType,
+                                        size_t rangeStart,
+                                        size_t rangeEnd)
+{
+    if (rangeStart == rangeEnd)
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    auto &amp;currentSRVs = (samplerType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
+
+    gl::Range&lt;size_t&gt; clearRange(rangeStart, rangeStart);
+    clearRange.extend(std::min(rangeEnd, currentSRVs.highestUsed()));
+
+    if (clearRange.empty())
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    auto deviceContext = mRenderer-&gt;getDeviceContext();
+    if (samplerType == gl::SAMPLER_VERTEX)
+    {
+        deviceContext-&gt;VSSetShaderResources(static_cast&lt;unsigned int&gt;(rangeStart),
+                                            static_cast&lt;unsigned int&gt;(rangeEnd - rangeStart),
+                                            &amp;mNullSRVs[0]);
+    }
+    else
+    {
+        deviceContext-&gt;PSSetShaderResources(static_cast&lt;unsigned int&gt;(rangeStart),
+                                            static_cast&lt;unsigned int&gt;(rangeEnd - rangeStart),
+                                            &amp;mNullSRVs[0]);
+    }
+
+    for (size_t samplerIndex = rangeStart; samplerIndex &lt; rangeEnd; ++samplerIndex)
+    {
+        currentSRVs.update(samplerIndex, nullptr);
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+void StateManager11::unsetConflictingSRVs(gl::SamplerType samplerType,
+                                          uintptr_t resource,
+                                          const gl::ImageIndex &amp;index)
+{
+    auto &amp;currentSRVs = (samplerType == gl::SAMPLER_VERTEX ? mCurVertexSRVs : mCurPixelSRVs);
+
+    for (size_t resourceIndex = 0; resourceIndex &lt; currentSRVs.size(); ++resourceIndex)
+    {
+        auto &amp;record = currentSRVs[resourceIndex];
+
+        if (record.srv &amp;&amp; record.resource == resource &amp;&amp;
+            ImageIndexConflictsWithSRV(index, record.desc))
+        {
+            setShaderResource(samplerType, static_cast&lt;UINT&gt;(resourceIndex), NULL);
+        }
+    }
+}
+
+void StateManager11::unsetConflictingAttachmentResources(
+    const gl::FramebufferAttachment *attachment,
+    ID3D11Resource *resource)
+{
+    // Unbind render target SRVs from the shader here to prevent D3D11 warnings.
+    if (attachment-&gt;type() == GL_TEXTURE)
+    {
+        uintptr_t resourcePtr       = reinterpret_cast&lt;uintptr_t&gt;(resource);
+        const gl::ImageIndex &amp;index = attachment-&gt;getTextureImageIndex();
+        // The index doesn't need to be corrected for the small compressed texture workaround
+        // because a rendertarget is never compressed.
+        unsetConflictingSRVs(gl::SAMPLER_VERTEX, resourcePtr, index);
+        unsetConflictingSRVs(gl::SAMPLER_PIXEL, resourcePtr, index);
+    }
+}
+
+void StateManager11::initialize(const gl::Caps &amp;caps)
+{
+    mCurVertexSRVs.initialize(caps.maxVertexTextureImageUnits);
+    mCurPixelSRVs.initialize(caps.maxTextureImageUnits);
+
+    // Initialize cached NULL SRV block
+    mNullSRVs.resize(caps.maxTextureImageUnits, nullptr);
+
+    mCurrentValueAttribs.resize(caps.maxVertexAttributes);
+}
+
+void StateManager11::deinitialize()
+{
+    mCurrentValueAttribs.clear();
+}
+
+gl::Error StateManager11::syncFramebuffer(const gl::Framebuffer *framebuffer)
+{
+    const Framebuffer11 *framebuffer11 = GetImplAs&lt;Framebuffer11&gt;(framebuffer);
+    gl::Error error = framebuffer11-&gt;invalidateSwizzles();
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (framebuffer11-&gt;hasAnyInternalDirtyBit())
+    {
+        ASSERT(framebuffer-&gt;id() != 0);
+        framebuffer11-&gt;syncInternalState();
+    }
+
+    if (!mRenderTargetIsDirty)
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
+    mRenderTargetIsDirty = false;
+
+    // Check for zero-sized default framebuffer, which is a special case.
+    // in this case we do not wish to modify any state and just silently return false.
+    // this will not report any gl error but will cause the calling method to return.
+    if (framebuffer-&gt;id() == 0)
+    {
+        ASSERT(!framebuffer11-&gt;hasAnyInternalDirtyBit());
+        const gl::Extents &amp;size = framebuffer-&gt;getFirstColorbuffer()-&gt;getSize();
+        if (size.width == 0 || size.height == 0)
+        {
+            return gl::Error(GL_NO_ERROR);
+        }
+    }
+
+    // Get the color render buffer and serial
+    // Also extract the render target dimensions and view
+    unsigned int renderTargetWidth  = 0;
+    unsigned int renderTargetHeight = 0;
+    RTVArray framebufferRTVs;
+    bool missingColorRenderTarget = true;
+
+    framebufferRTVs.fill(nullptr);
+
+    const auto &amp;colorRTs = framebuffer11-&gt;getCachedColorRenderTargets();
+
+    size_t appliedRTIndex  = 0;
+    bool skipInactiveRTs   = mRenderer-&gt;getWorkarounds().mrtPerfWorkaround;
+    const auto &amp;drawStates = framebuffer-&gt;getDrawBufferStates();
+
+    for (size_t rtIndex = 0; rtIndex &lt; colorRTs.size(); ++rtIndex)
+    {
+        const RenderTarget11 *renderTarget = colorRTs[rtIndex];
+
+        // Skip inactive rendertargets if the workaround is enabled.
+        if (skipInactiveRTs &amp;&amp; (!renderTarget || drawStates[rtIndex] == GL_NONE))
+        {
+            continue;
+        }
+
+        if (renderTarget)
+        {
+            framebufferRTVs[appliedRTIndex] = renderTarget-&gt;getRenderTargetView();
+            ASSERT(framebufferRTVs[appliedRTIndex]);
+
+            if (missingColorRenderTarget)
+            {
+                renderTargetWidth        = renderTarget-&gt;getWidth();
+                renderTargetHeight       = renderTarget-&gt;getHeight();
+                missingColorRenderTarget = false;
+            }
+        }
+
+        // Unset conflicting texture SRVs
+        const auto *attachment = framebuffer-&gt;getColorbuffer(rtIndex);
+        ASSERT(attachment);
+        unsetConflictingAttachmentResources(attachment, renderTarget-&gt;getTexture());
+
+        appliedRTIndex++;
+    }
+
+    // Get the depth stencil buffers
+    ID3D11DepthStencilView *framebufferDSV = nullptr;
+    const auto *depthStencilRenderTarget = framebuffer11-&gt;getCachedDepthStencilRenderTarget();
+    if (depthStencilRenderTarget)
+    {
+        framebufferDSV = depthStencilRenderTarget-&gt;getDepthStencilView();
+        ASSERT(framebufferDSV);
+
+        // If there is no render buffer, the width, height and format values come from
+        // the depth stencil
+        if (missingColorRenderTarget)
+        {
+            renderTargetWidth  = depthStencilRenderTarget-&gt;getWidth();
+            renderTargetHeight = depthStencilRenderTarget-&gt;getHeight();
+        }
+
+        // Unset conflicting texture SRVs
+        const auto *attachment = framebuffer-&gt;getDepthOrStencilbuffer();
+        ASSERT(attachment);
+        unsetConflictingAttachmentResources(attachment, depthStencilRenderTarget-&gt;getTexture());
+    }
+
+    // TODO(jmadill): Use context caps?
+    UINT drawBuffers = mRenderer-&gt;getRendererCaps().maxDrawBuffers;
+
+    // Apply the render target and depth stencil
+    mRenderer-&gt;getDeviceContext()-&gt;OMSetRenderTargets(drawBuffers, framebufferRTVs.data(),
+                                                      framebufferDSV);
+
+    // The D3D11 blend state is heavily dependent on the current render target.
+    mBlendStateIsDirty = true;
+
+    setViewportBounds(renderTargetWidth, renderTargetHeight);
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error StateManager11::updateCurrentValueAttribs(const gl::State &amp;state,
+                                                    VertexDataManager *vertexDataManager)
+{
+    const auto &amp;activeAttribsMask  = state.getProgram()-&gt;getActiveAttribLocationsMask();
+    const auto &amp;dirtyActiveAttribs = (activeAttribsMask &amp; mDirtyCurrentValueAttribs);
+    const auto &amp;vertexAttributes   = state.getVertexArray()-&gt;getVertexAttributes();
+
+    for (auto attribIndex : angle::IterateBitSet(dirtyActiveAttribs))
+    {
+        if (vertexAttributes[attribIndex].enabled)
+            continue;
+
+        mDirtyCurrentValueAttribs.reset(attribIndex);
+
+        const auto &amp;currentValue =
+            state.getVertexAttribCurrentValue(static_cast&lt;unsigned int&gt;(attribIndex));
+        auto currentValueAttrib              = &amp;mCurrentValueAttribs[attribIndex];
+        currentValueAttrib-&gt;currentValueType = currentValue.Type;
+        currentValueAttrib-&gt;attribute        = &amp;vertexAttributes[attribIndex];
+
+        gl::Error error = vertexDataManager-&gt;storeCurrentValue(currentValue, currentValueAttrib,
+                                                               static_cast&lt;size_t&gt;(attribIndex));
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+const std::vector&lt;TranslatedAttribute&gt; &amp;StateManager11::getCurrentValueAttribs() const
+{
+    return mCurrentValueAttribs;
+}
+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11StateManager11h"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/StateManager11.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/StateManager11.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/StateManager11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,202 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// StateManager11.h: Defines a class for caching D3D11 state
+
+#ifndef LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_
+#define LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_
+
+#include &lt;array&gt;
+
+#include &quot;libANGLE/angletypes.h&quot;
+#include &quot;libANGLE/Data.h&quot;
+#include &quot;libANGLE/State.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/RenderStateCache.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/Query11.h&quot;
+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
+
+namespace rx
+{
+
+struct RenderTargetDesc;
+struct Renderer11DeviceCaps;
+
+struct dx_VertexConstants11
+{
+    float depthRange[4];
+    float viewAdjust[4];
+    float viewCoords[4];
+    float viewScale[4];
+};
+
+struct dx_PixelConstants11
+{
+    float depthRange[4];
+    float viewCoords[4];
+    float depthFront[4];
+    float viewScale[4];
+};
+
+class StateManager11 final : angle::NonCopyable
+{
+  public:
+    StateManager11(Renderer11 *renderer);
+    ~StateManager11();
+
+    void initialize(const gl::Caps &amp;caps);
+    void deinitialize();
+    void syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;dirtyBits);
+
+    gl::Error setBlendState(const gl::Framebuffer *framebuffer,
+                            const gl::BlendState &amp;blendState,
+                            const gl::ColorF &amp;blendColor,
+                            unsigned int sampleMask);
+
+    gl::Error setDepthStencilState(const gl::State &amp;glState);
+
+    gl::Error setRasterizerState(const gl::RasterizerState &amp;rasterState);
+
+    void setScissorRectangle(const gl::Rectangle &amp;scissor, bool enabled);
+
+    void setViewport(const gl::Caps *caps, const gl::Rectangle &amp;viewport, float zNear, float zFar);
+
+    void updatePresentPath(bool presentPathFastActive,
+                           const gl::FramebufferAttachment *framebufferAttachment);
+
+    const dx_VertexConstants11 &amp;getVertexConstants() const { return mVertexConstants; }
+    const dx_PixelConstants11 &amp;getPixelConstants() const { return mPixelConstants; }
+
+    void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize);
+
+    void setShaderResource(gl::SamplerType shaderType,
+                           UINT resourceSlot,
+                           ID3D11ShaderResourceView *srv);
+    gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd);
+
+    gl::Error syncFramebuffer(const gl::Framebuffer *framebuffer);
+
+    void invalidateRenderTarget();
+    void invalidateBoundViews();
+    void invalidateEverything();
+
+    void setOneTimeRenderTarget(ID3D11RenderTargetView *renderTarget,
+                                ID3D11DepthStencilView *depthStencil);
+    void setOneTimeRenderTargets(const std::vector&lt;ID3D11RenderTargetView *&gt; &amp;renderTargets,
+                                 ID3D11DepthStencilView *depthStencil);
+
+    void onBeginQuery(Query11 *query);
+    void onDeleteQueryObject(Query11 *query);
+    gl::Error onMakeCurrent(const gl::Data &amp;data);
+
+    gl::Error updateCurrentValueAttribs(const gl::State &amp;state,
+                                        VertexDataManager *vertexDataManager);
+
+    const std::vector&lt;TranslatedAttribute&gt; &amp;getCurrentValueAttribs() const;
+
+  private:
+    void setViewportBounds(const int width, const int height);
+    void unsetConflictingSRVs(gl::SamplerType shaderType,
+                              uintptr_t resource,
+                              const gl::ImageIndex &amp;index);
+    void unsetConflictingAttachmentResources(const gl::FramebufferAttachment *attachment,
+                                             ID3D11Resource *resource);
+
+    Renderer11 *mRenderer;
+
+    // Blend State
+    bool mBlendStateIsDirty;
+    // TODO(dianx) temporary representation of a dirty bit. once we move enough states in,
+    // try experimenting with dirty bit instead of a bool
+    gl::BlendState mCurBlendState;
+    gl::ColorF mCurBlendColor;
+    unsigned int mCurSampleMask;
+
+    // Currently applied depth stencil state
+    bool mDepthStencilStateIsDirty;
+    gl::DepthStencilState mCurDepthStencilState;
+    int mCurStencilRef;
+    int mCurStencilBackRef;
+    unsigned int mCurStencilSize;
+    Optional&lt;bool&gt; mCurDisableDepth;
+    Optional&lt;bool&gt; mCurDisableStencil;
+
+    // Currently applied rasterizer state
+    bool mRasterizerStateIsDirty;
+    gl::RasterizerState mCurRasterState;
+
+    // Currently applied scissor rectangle state
+    bool mScissorStateIsDirty;
+    bool mCurScissorEnabled;
+    gl::Rectangle mCurScissorRect;
+
+    // Currently applied viewport state
+    bool mViewportStateIsDirty;
+    gl::Rectangle mCurViewport;
+    float mCurNear;
+    float mCurFar;
+
+    // Things needed in viewport state
+    dx_VertexConstants11 mVertexConstants;
+    dx_PixelConstants11 mPixelConstants;
+
+    // Render target variables
+    gl::Extents mViewportBounds;
+
+    // EGL_ANGLE_experimental_present_path variables
+    bool mCurPresentPathFastEnabled;
+    int mCurPresentPathFastColorBufferHeight;
+
+    // Current RenderTarget state
+    bool mRenderTargetIsDirty;
+
+    // Queries that are currently active in this state
+    std::set&lt;Query11 *&gt; mCurrentQueries;
+
+    // Currently applied textures
+    struct SRVRecord
+    {
+        uintptr_t srv;
+        uintptr_t resource;
+        D3D11_SHADER_RESOURCE_VIEW_DESC desc;
+    };
+
+    // A cache of current SRVs that also tracks the highest 'used' (non-NULL) SRV
+    // We might want to investigate a more robust approach that is also fast when there's
+    // a large gap between used SRVs (e.g. if SRV 0 and 7 are non-NULL, this approach will
+    // waste time on SRVs 1-6.)
+    class SRVCache : angle::NonCopyable
+    {
+      public:
+        SRVCache() : mHighestUsedSRV(0) {}
+
+        void initialize(size_t size) { mCurrentSRVs.resize(size); }
+
+        size_t size() const { return mCurrentSRVs.size(); }
+        size_t highestUsed() const { return mHighestUsedSRV; }
+
+        const SRVRecord &amp;operator[](size_t index) const { return mCurrentSRVs[index]; }
+        void clear();
+        void update(size_t resourceIndex, ID3D11ShaderResourceView *srv);
+
+      private:
+        std::vector&lt;SRVRecord&gt; mCurrentSRVs;
+        size_t mHighestUsedSRV;
+    };
+
+    SRVCache mCurVertexSRVs;
+    SRVCache mCurPixelSRVs;
+
+    // A block of NULL pointers, cached so we don't re-allocate every draw call
+    std::vector&lt;ID3D11ShaderResourceView *&gt; mNullSRVs;
+
+    // Current translations of &quot;Current-Value&quot; data - owned by Context, not VertexArray.
+    gl::AttributesMask mDirtyCurrentValueAttribs;
+    std::vector&lt;TranslatedAttribute&gt; mCurrentValueAttribs;
+};
+
+}  // namespace rx
+#endif  // LIBANGLE_RENDERER_D3D11_STATEMANAGER11_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Stream11cpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Stream11.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Stream11.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Stream11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,26 @@
</span><ins>+//
+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Stream11.cpp: Defines the rx::Stream11 class which implements rx::StreamImpl.
+
+#include &quot;libANGLE/renderer/d3d/d3d11/Stream11.h&quot;
+
+#include &quot;common/utilities.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
+
+namespace rx
+{
+
+Stream11::Stream11(Renderer11 *renderer) : mRenderer(renderer)
+{
+    UNUSED_VARIABLE(mRenderer);
+}
+
+Stream11::~Stream11()
+{
+}
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Stream11h"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Stream11.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Stream11.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Stream11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,29 @@
</span><ins>+//
+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Stream11.h: Defines the rx::Stream11 class which implements rx::StreamImpl.
+
+#ifndef LIBANGLE_RENDERER_D3D_D3D11_STREAM11_H_
+#define LIBANGLE_RENDERER_D3D_D3D11_STREAM11_H_
+
+#include &quot;libANGLE/renderer/StreamImpl.h&quot;
+
+namespace rx
+{
+class Renderer11;
+
+class Stream11 : public StreamImpl
+{
+  public:
+    Stream11(Renderer11 *renderer);
+    ~Stream11() override;
+
+  private:
+    Renderer11 *mRenderer;
+};
+}  // namespace rx
+
+#endif  // LIBANGLE_RENDERER_D3D_D3D11_STREAM11_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11SwapChain11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,46 +8,79 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/SwapChain11.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;EGL/eglext.h&gt;
+
</ins><span class="cx"> #include &quot;libANGLE/features.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/NativeWindow.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
</ins><span class="cx"> #include &quot;third_party/trace_event/trace_event.h&quot;
</span><span class="cx"> 
</span><span class="cx"> // Precompiled shaders
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h&quot;
</span><span class="cx"> 
</span><ins>+#ifdef ANGLE_ENABLE_KEYEDMUTEX
+#define ANGLE_RESOURCE_SHARE_TYPE D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX
+#else
+#define ANGLE_RESOURCE_SHARE_TYPE D3D11_RESOURCE_MISC_SHARED
+#endif
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-SwapChain11::SwapChain11(Renderer11 *renderer, NativeWindow nativeWindow, HANDLE shareHandle,
-                         GLenum backBufferFormat, GLenum depthBufferFormat)
-    : mRenderer(renderer),
-      SwapChainD3D(nativeWindow, shareHandle, backBufferFormat, depthBufferFormat),
</del><ins>+namespace
+{
+bool NeedsOffscreenTexture(Renderer11 *renderer, NativeWindow nativeWindow, EGLint orientation)
+{
+    // We don't need an offscreen texture if either orientation = INVERT_Y,
+    // or present path fast is enabled and we're not rendering onto an offscreen surface.
+    return orientation != EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE &amp;&amp;
+           !(renderer-&gt;presentPathFastEnabled() &amp;&amp; nativeWindow.getNativeWindow());
+}
+}  // anonymous namespace
+
+SwapChain11::SwapChain11(Renderer11 *renderer,
+                         NativeWindow nativeWindow,
+                         HANDLE shareHandle,
+                         GLenum backBufferFormat,
+                         GLenum depthBufferFormat,
+                         EGLint orientation)
+    : SwapChainD3D(nativeWindow, shareHandle, backBufferFormat, depthBufferFormat),
+      mRenderer(renderer),
+      mWidth(-1),
+      mHeight(-1),
+      mOrientation(orientation),
+      mAppCreatedShareHandle(mShareHandle != nullptr),
+      mSwapInterval(0),
+      mPassThroughResourcesInit(false),
+      mFirstSwap(true),
+      mSwapChain(nullptr),
+      mSwapChain1(nullptr),
+      mKeyedMutex(nullptr),
+      mBackBufferTexture(nullptr),
+      mBackBufferRTView(nullptr),
+      mBackBufferSRView(nullptr),
+      mNeedsOffscreenTexture(NeedsOffscreenTexture(renderer, nativeWindow, orientation)),
+      mOffscreenTexture(nullptr),
+      mOffscreenRTView(nullptr),
+      mOffscreenSRView(nullptr),
+      mDepthStencilTexture(nullptr),
+      mDepthStencilDSView(nullptr),
+      mDepthStencilSRView(nullptr),
+      mQuadVB(nullptr),
+      mPassThroughSampler(nullptr),
+      mPassThroughIL(nullptr),
+      mPassThroughVS(nullptr),
+      mPassThroughPS(nullptr),
+      mPassThroughRS(nullptr),
</ins><span class="cx">       mColorRenderTarget(this, renderer, false),
</span><span class="cx">       mDepthStencilRenderTarget(this, renderer, true)
</span><span class="cx"> {
</span><del>-    mSwapChain = NULL;
-    mBackBufferTexture = NULL;
-    mBackBufferRTView = NULL;
-    mOffscreenTexture = NULL;
-    mOffscreenRTView = NULL;
-    mOffscreenSRView = NULL;
-    mDepthStencilTexture = NULL;
-    mDepthStencilDSView = NULL;
-    mDepthStencilSRView = NULL;
-    mQuadVB = NULL;
-    mPassThroughSampler = NULL;
-    mPassThroughIL = NULL;
-    mPassThroughVS = NULL;
-    mPassThroughPS = NULL;
-    mWidth = -1;
-    mHeight = -1;
-    mSwapInterval = 0;
-    mAppCreatedShareHandle = mShareHandle != NULL;
-    mPassThroughResourcesInit = false;
</del><ins>+    // Sanity check that if present path fast is active then we're using the default orientation
+    ASSERT(!mRenderer-&gt;presentPathFastEnabled() || orientation == 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> SwapChain11::~SwapChain11()
</span><span class="lines">@@ -57,9 +90,12 @@
</span><span class="cx"> 
</span><span class="cx"> void SwapChain11::release()
</span><span class="cx"> {
</span><ins>+    SafeRelease(mSwapChain1);
</ins><span class="cx">     SafeRelease(mSwapChain);
</span><ins>+    SafeRelease(mKeyedMutex);
</ins><span class="cx">     SafeRelease(mBackBufferTexture);
</span><span class="cx">     SafeRelease(mBackBufferRTView);
</span><ins>+    SafeRelease(mBackBufferSRView);
</ins><span class="cx">     SafeRelease(mOffscreenTexture);
</span><span class="cx">     SafeRelease(mOffscreenRTView);
</span><span class="cx">     SafeRelease(mOffscreenSRView);
</span><span class="lines">@@ -71,6 +107,7 @@
</span><span class="cx">     SafeRelease(mPassThroughIL);
</span><span class="cx">     SafeRelease(mPassThroughVS);
</span><span class="cx">     SafeRelease(mPassThroughPS);
</span><ins>+    SafeRelease(mPassThroughRS);
</ins><span class="cx"> 
</span><span class="cx">     if (!mAppCreatedShareHandle)
</span><span class="cx">     {
</span><span class="lines">@@ -78,18 +115,47 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SwapChain11::releaseOffscreenTexture()
</del><ins>+void SwapChain11::releaseOffscreenColorBuffer()
</ins><span class="cx"> {
</span><span class="cx">     SafeRelease(mOffscreenTexture);
</span><span class="cx">     SafeRelease(mOffscreenRTView);
</span><span class="cx">     SafeRelease(mOffscreenSRView);
</span><ins>+}
+
+void SwapChain11::releaseOffscreenDepthBuffer()
+{
</ins><span class="cx">     SafeRelease(mDepthStencilTexture);
</span><span class="cx">     SafeRelease(mDepthStencilDSView);
</span><span class="cx">     SafeRelease(mDepthStencilSRView);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHeight)
</del><ins>+EGLint SwapChain11::resetOffscreenBuffers(int backbufferWidth, int backbufferHeight)
</ins><span class="cx"> {
</span><ins>+    if (mNeedsOffscreenTexture)
+    {
+        EGLint result = resetOffscreenColorBuffer(backbufferWidth, backbufferHeight);
+        if (result != EGL_SUCCESS)
+        {
+            return result;
+        }
+    }
+
+    EGLint result = resetOffscreenDepthBuffer(backbufferWidth, backbufferHeight);
+    if (result != EGL_SUCCESS)
+    {
+        return result;
+    }
+
+    mWidth  = backbufferWidth;
+    mHeight = backbufferHeight;
+
+    return EGL_SUCCESS;
+}
+
+EGLint SwapChain11::resetOffscreenColorBuffer(int backbufferWidth, int backbufferHeight)
+{
+    ASSERT(mNeedsOffscreenTexture);
+
</ins><span class="cx">     TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;SwapChain11::resetOffscreenTexture&quot;);
</span><span class="cx">     ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="lines">@@ -108,9 +174,9 @@
</span><span class="cx">     const int previousWidth = mWidth;
</span><span class="cx">     const int previousHeight = mHeight;
</span><span class="cx"> 
</span><del>-    releaseOffscreenTexture();
</del><ins>+    releaseOffscreenColorBuffer();
</ins><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer-&gt;getFeatureLevel());
</del><ins>+    const d3d11::TextureFormat &amp;backbufferFormatInfo = d3d11::GetTextureFormatInfo(mOffscreenRenderTargetFormat, mRenderer-&gt;getRenderer11DeviceCaps());
</ins><span class="cx"> 
</span><span class="cx">     // If the app passed in a share handle, open the resource
</span><span class="cx">     // See EGL_ANGLE_d3d_share_handle_client_buffer
</span><span class="lines">@@ -142,9 +208,8 @@
</span><span class="cx"> 
</span><span class="cx">         if (offscreenTextureDesc.Width != (UINT)backbufferWidth ||
</span><span class="cx">             offscreenTextureDesc.Height != (UINT)backbufferHeight ||
</span><del>-            offscreenTextureDesc.Format != backbufferFormatInfo.texFormat ||
-            offscreenTextureDesc.MipLevels != 1 ||
-            offscreenTextureDesc.ArraySize != 1)
</del><ins>+            offscreenTextureDesc.Format != backbufferFormatInfo.formatSet-&gt;texFormat ||
+            offscreenTextureDesc.MipLevels != 1 || offscreenTextureDesc.ArraySize != 1)
</ins><span class="cx">         {
</span><span class="cx">             ERR(&quot;Invalid texture parameters in the shared offscreen texture pbuffer&quot;);
</span><span class="cx">             release();
</span><span class="lines">@@ -158,7 +223,7 @@
</span><span class="cx">         D3D11_TEXTURE2D_DESC offscreenTextureDesc = {0};
</span><span class="cx">         offscreenTextureDesc.Width = backbufferWidth;
</span><span class="cx">         offscreenTextureDesc.Height = backbufferHeight;
</span><del>-        offscreenTextureDesc.Format = backbufferFormatInfo.texFormat;
</del><ins>+        offscreenTextureDesc.Format               = backbufferFormatInfo.formatSet-&gt;texFormat;
</ins><span class="cx">         offscreenTextureDesc.MipLevels = 1;
</span><span class="cx">         offscreenTextureDesc.ArraySize = 1;
</span><span class="cx">         offscreenTextureDesc.SampleDesc.Count = 1;
</span><span class="lines">@@ -166,7 +231,7 @@
</span><span class="cx">         offscreenTextureDesc.Usage = D3D11_USAGE_DEFAULT;
</span><span class="cx">         offscreenTextureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
</span><span class="cx">         offscreenTextureDesc.CPUAccessFlags = 0;
</span><del>-        offscreenTextureDesc.MiscFlags = useSharedResource ? D3D11_RESOURCE_MISC_SHARED : 0;
</del><ins>+        offscreenTextureDesc.MiscFlags = useSharedResource ? ANGLE_RESOURCE_SHARE_TYPE : 0;
</ins><span class="cx"> 
</span><span class="cx">         HRESULT result = device-&gt;CreateTexture2D(&amp;offscreenTextureDesc, NULL, &amp;mOffscreenTexture);
</span><span class="cx"> 
</span><span class="lines">@@ -212,9 +277,11 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // This may return null if the original texture was created without a keyed mutex.
+    mKeyedMutex = d3d11::DynamicCastComObject&lt;IDXGIKeyedMutex&gt;(mOffscreenTexture);
</ins><span class="cx"> 
</span><span class="cx">     D3D11_RENDER_TARGET_VIEW_DESC offscreenRTVDesc;
</span><del>-    offscreenRTVDesc.Format = backbufferFormatInfo.rtvFormat;
</del><ins>+    offscreenRTVDesc.Format             = backbufferFormatInfo.formatSet-&gt;rtvFormat;
</ins><span class="cx">     offscreenRTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
</span><span class="cx">     offscreenRTVDesc.Texture2D.MipSlice = 0;
</span><span class="cx"> 
</span><span class="lines">@@ -223,7 +290,7 @@
</span><span class="cx">     d3d11::SetDebugName(mOffscreenRTView, &quot;Offscreen back buffer render target&quot;);
</span><span class="cx"> 
</span><span class="cx">     D3D11_SHADER_RESOURCE_VIEW_DESC offscreenSRVDesc;
</span><del>-    offscreenSRVDesc.Format = backbufferFormatInfo.srvFormat;
</del><ins>+    offscreenSRVDesc.Format                    = backbufferFormatInfo.formatSet-&gt;srvFormat;
</ins><span class="cx">     offscreenSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
</span><span class="cx">     offscreenSRVDesc.Texture2D.MostDetailedMip = 0;
</span><span class="cx">     offscreenSRVDesc.Texture2D.MipLevels = static_cast&lt;UINT&gt;(-1);
</span><span class="lines">@@ -232,14 +299,45 @@
</span><span class="cx">     ASSERT(SUCCEEDED(result));
</span><span class="cx">     d3d11::SetDebugName(mOffscreenSRView, &quot;Offscreen back buffer shader resource&quot;);
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;depthBufferFormatInfo = d3d11::GetTextureFormatInfo(mDepthBufferFormat, mRenderer-&gt;getFeatureLevel());
</del><ins>+    if (previousOffscreenTexture != nullptr)
+    {
+        D3D11_BOX sourceBox = {0};
+        sourceBox.left      = 0;
+        sourceBox.right     = std::min(previousWidth, backbufferWidth);
+        sourceBox.top       = std::max(previousHeight - backbufferHeight, 0);
+        sourceBox.bottom    = previousHeight;
+        sourceBox.front     = 0;
+        sourceBox.back      = 1;
</ins><span class="cx"> 
</span><ins>+        ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
+        const int yoffset = std::max(backbufferHeight - previousHeight, 0);
+        deviceContext-&gt;CopySubresourceRegion(mOffscreenTexture, 0, 0, yoffset, 0,
+                                             previousOffscreenTexture, 0, &amp;sourceBox);
+
+        SafeRelease(previousOffscreenTexture);
+
+        if (mSwapChain)
+        {
+            swapRect(0, 0, backbufferWidth, backbufferHeight);
+        }
+    }
+
+    return EGL_SUCCESS;
+}
+
+EGLint SwapChain11::resetOffscreenDepthBuffer(int backbufferWidth, int backbufferHeight)
+{
+    releaseOffscreenDepthBuffer();
+
</ins><span class="cx">     if (mDepthBufferFormat != GL_NONE)
</span><span class="cx">     {
</span><ins>+        const d3d11::TextureFormat &amp;depthBufferFormatInfo =
+            d3d11::GetTextureFormatInfo(mDepthBufferFormat, mRenderer-&gt;getRenderer11DeviceCaps());
+
</ins><span class="cx">         D3D11_TEXTURE2D_DESC depthStencilTextureDesc;
</span><span class="cx">         depthStencilTextureDesc.Width = backbufferWidth;
</span><span class="cx">         depthStencilTextureDesc.Height = backbufferHeight;
</span><del>-        depthStencilTextureDesc.Format = depthBufferFormatInfo.texFormat;
</del><ins>+        depthStencilTextureDesc.Format             = depthBufferFormatInfo.formatSet-&gt;texFormat;
</ins><span class="cx">         depthStencilTextureDesc.MipLevels = 1;
</span><span class="cx">         depthStencilTextureDesc.ArraySize = 1;
</span><span class="cx">         depthStencilTextureDesc.SampleDesc.Count = 1;
</span><span class="lines">@@ -247,7 +345,7 @@
</span><span class="cx">         depthStencilTextureDesc.Usage = D3D11_USAGE_DEFAULT;
</span><span class="cx">         depthStencilTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
</span><span class="cx"> 
</span><del>-        if (depthBufferFormatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
</del><ins>+        if (depthBufferFormatInfo.formatSet-&gt;srvFormat != DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">         {
</span><span class="cx">             depthStencilTextureDesc.BindFlags |= D3D11_BIND_SHADER_RESOURCE;
</span><span class="cx">         }
</span><span class="lines">@@ -255,7 +353,9 @@
</span><span class="cx">         depthStencilTextureDesc.CPUAccessFlags = 0;
</span><span class="cx">         depthStencilTextureDesc.MiscFlags = 0;
</span><span class="cx"> 
</span><del>-        result = device-&gt;CreateTexture2D(&amp;depthStencilTextureDesc, NULL, &amp;mDepthStencilTexture);
</del><ins>+        ID3D11Device *device = mRenderer-&gt;getDevice();
+        HRESULT result =
+            device-&gt;CreateTexture2D(&amp;depthStencilTextureDesc, NULL, &amp;mDepthStencilTexture);
</ins><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><span class="cx">             ERR(&quot;Could not create depthstencil surface for new swap chain: 0x%08X&quot;, result);
</span><span class="lines">@@ -273,7 +373,7 @@
</span><span class="cx">         d3d11::SetDebugName(mDepthStencilTexture, &quot;Offscreen depth stencil texture&quot;);
</span><span class="cx"> 
</span><span class="cx">         D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilDesc;
</span><del>-        depthStencilDesc.Format = depthBufferFormatInfo.dsvFormat;
</del><ins>+        depthStencilDesc.Format             = depthBufferFormatInfo.formatSet-&gt;dsvFormat;
</ins><span class="cx">         depthStencilDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
</span><span class="cx">         depthStencilDesc.Flags = 0;
</span><span class="cx">         depthStencilDesc.Texture2D.MipSlice = 0;
</span><span class="lines">@@ -282,10 +382,10 @@
</span><span class="cx">         ASSERT(SUCCEEDED(result));
</span><span class="cx">         d3d11::SetDebugName(mDepthStencilDSView, &quot;Offscreen depth stencil view&quot;);
</span><span class="cx"> 
</span><del>-        if (depthBufferFormatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
</del><ins>+        if (depthBufferFormatInfo.formatSet-&gt;srvFormat != DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">         {
</span><span class="cx">             D3D11_SHADER_RESOURCE_VIEW_DESC depthStencilSRVDesc;
</span><del>-            depthStencilSRVDesc.Format = depthBufferFormatInfo.srvFormat;
</del><ins>+            depthStencilSRVDesc.Format                    = depthBufferFormatInfo.formatSet-&gt;srvFormat;
</ins><span class="cx">             depthStencilSRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
</span><span class="cx">             depthStencilSRVDesc.Texture2D.MostDetailedMip = 0;
</span><span class="cx">             depthStencilSRVDesc.Texture2D.MipLevels = static_cast&lt;UINT&gt;(-1);
</span><span class="lines">@@ -296,31 +396,6 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mWidth = backbufferWidth;
-    mHeight = backbufferHeight;
-
-    if (previousOffscreenTexture != NULL)
-    {
-        D3D11_BOX sourceBox = {0};
-        sourceBox.left = 0;
-        sourceBox.right = std::min(previousWidth, mWidth);
-        sourceBox.top = std::max(previousHeight - mHeight, 0);
-        sourceBox.bottom = previousHeight;
-        sourceBox.front = 0;
-        sourceBox.back = 1;
-
-        ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
-        const int yoffset = std::max(mHeight - previousHeight, 0);
-        deviceContext-&gt;CopySubresourceRegion(mOffscreenTexture, 0, 0, yoffset, 0, previousOffscreenTexture, 0, &amp;sourceBox);
-
-        SafeRelease(previousOffscreenTexture);
-
-        if (mSwapChain)
-        {
-            swapRect(0, 0, mWidth, mHeight);
-        }
-    }
-
</del><span class="cx">     return EGL_SUCCESS;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -340,18 +415,31 @@
</span><span class="cx">         return EGL_SUCCESS;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Don't resize unnecessarily
+    if (mWidth == backbufferWidth &amp;&amp; mHeight == backbufferHeight)
+    {
+        return EGL_SUCCESS;
+    }
+
</ins><span class="cx">     // Can only call resize if we have already created our swap buffer and resources
</span><del>-    ASSERT(mSwapChain &amp;&amp; mBackBufferTexture &amp;&amp; mBackBufferRTView);
</del><ins>+    ASSERT(mSwapChain &amp;&amp; mBackBufferTexture &amp;&amp; mBackBufferRTView &amp;&amp; mBackBufferSRView);
</ins><span class="cx"> 
</span><span class="cx">     SafeRelease(mBackBufferTexture);
</span><span class="cx">     SafeRelease(mBackBufferRTView);
</span><ins>+    SafeRelease(mBackBufferSRView);
</ins><span class="cx"> 
</span><span class="cx">     // Resize swap chain
</span><span class="cx">     DXGI_SWAP_CHAIN_DESC desc;
</span><del>-    mSwapChain-&gt;GetDesc(&amp;desc);
-    const d3d11::TextureFormat &amp;backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer-&gt;getFeatureLevel());
-    HRESULT result = mSwapChain-&gt;ResizeBuffers(desc.BufferCount, backbufferWidth, backbufferHeight, backbufferFormatInfo.texFormat, 0);
</del><ins>+    HRESULT result = mSwapChain-&gt;GetDesc(&amp;desc);
+    if (FAILED(result))
+    {
+        ERR(&quot;Error reading swap chain description: 0x%08X&quot;, result);
+        release();
+        return EGL_BAD_ALLOC;
+    }
</ins><span class="cx"> 
</span><ins>+    result = mSwapChain-&gt;ResizeBuffers(desc.BufferCount, backbufferWidth, backbufferHeight, getSwapChainNativeFormat(), 0);
+
</ins><span class="cx">     if (FAILED(result))
</span><span class="cx">     {
</span><span class="cx">         ERR(&quot;Error resizing swap chain buffers: 0x%08X&quot;, result);
</span><span class="lines">@@ -372,20 +460,49 @@
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="cx">     {
</span><span class="cx">         d3d11::SetDebugName(mBackBufferTexture, &quot;Back buffer texture&quot;);
</span><del>-    }
</del><ins>+        result = device-&gt;CreateRenderTargetView(mBackBufferTexture, NULL, &amp;mBackBufferRTView);
+        ASSERT(SUCCEEDED(result));
+        if (SUCCEEDED(result))
+        {
+            d3d11::SetDebugName(mBackBufferRTView, &quot;Back buffer render target&quot;);
+        }
</ins><span class="cx"> 
</span><del>-    result = device-&gt;CreateRenderTargetView(mBackBufferTexture, NULL, &amp;mBackBufferRTView);
-    ASSERT(SUCCEEDED(result));
-    if (SUCCEEDED(result))
-    {
-        d3d11::SetDebugName(mBackBufferRTView, &quot;Back buffer render target&quot;);
</del><ins>+        result = device-&gt;CreateShaderResourceView(mBackBufferTexture, nullptr, &amp;mBackBufferSRView);
+        ASSERT(SUCCEEDED(result));
+        if (SUCCEEDED(result))
+        {
+            d3d11::SetDebugName(mBackBufferSRView, &quot;Back buffer shader resource&quot;);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return resetOffscreenTexture(backbufferWidth, backbufferHeight);
</del><ins>+    mFirstSwap = true;
+
+    return resetOffscreenBuffers(backbufferWidth, backbufferHeight);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+DXGI_FORMAT SwapChain11::getSwapChainNativeFormat() const
+{
+    // Return a render target format for offscreen rendering is supported by IDXGISwapChain.
+    // MSDN https://msdn.microsoft.com/en-us/library/windows/desktop/bb173064(v=vs.85).aspx
+    return (mOffscreenRenderTargetFormat == GL_BGRA8_EXT) ? DXGI_FORMAT_B8G8R8A8_UNORM : DXGI_FORMAT_R8G8B8A8_UNORM;
+}
+
</ins><span class="cx"> EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swapInterval)
</span><span class="cx"> {
</span><ins>+    mSwapInterval = static_cast&lt;unsigned int&gt;(swapInterval);
+    if (mSwapInterval &gt; 4)
+    {
+        // IDXGISwapChain::Present documentation states that valid sync intervals are in the [0,4]
+        // range
+        return EGL_BAD_PARAMETER;
+    }
+
+    // If the swap chain already exists, just resize
+    if (mSwapChain != nullptr)
+    {
+        return resize(backbufferWidth, backbufferHeight);
+    }
+
</ins><span class="cx">     TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;SwapChain11::reset&quot;);
</span><span class="cx">     ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="lines">@@ -396,30 +513,22 @@
</span><span class="cx"> 
</span><span class="cx">     // Release specific resources to free up memory for the new render target, while the
</span><span class="cx">     // old render target still exists for the purpose of preserving its contents.
</span><ins>+    SafeRelease(mSwapChain1);
</ins><span class="cx">     SafeRelease(mSwapChain);
</span><span class="cx">     SafeRelease(mBackBufferTexture);
</span><span class="cx">     SafeRelease(mBackBufferRTView);
</span><span class="cx"> 
</span><del>-    mSwapInterval = static_cast&lt;unsigned int&gt;(swapInterval);
-    if (mSwapInterval &gt; 4)
-    {
-        // IDXGISwapChain::Present documentation states that valid sync intervals are in the [0,4] range
-        return EGL_BAD_PARAMETER;
-    }
-
</del><span class="cx">     // EGL allows creating a surface with 0x0 dimension, however, DXGI does not like 0x0 swapchains
</span><span class="cx">     if (backbufferWidth &lt; 1 || backbufferHeight &lt; 1)
</span><span class="cx">     {
</span><del>-        releaseOffscreenTexture();
</del><ins>+        releaseOffscreenColorBuffer();
</ins><span class="cx">         return EGL_SUCCESS;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (mNativeWindow.getNativeWindow())
</span><span class="cx">     {
</span><del>-        const d3d11::TextureFormat &amp;backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer-&gt;getFeatureLevel());
-
</del><span class="cx">         HRESULT result = mNativeWindow.createSwapChain(device, mRenderer-&gt;getDxgiFactory(),
</span><del>-                                               backbufferFormatInfo.texFormat,
</del><ins>+                                               getSwapChainNativeFormat(),
</ins><span class="cx">                                                backbufferWidth, backbufferHeight, &amp;mSwapChain);
</span><span class="cx"> 
</span><span class="cx">         if (FAILED(result))
</span><span class="lines">@@ -437,6 +546,11 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        if (mRenderer-&gt;getRenderer11DeviceCaps().supportsDXGI1_2)
+        {
+            mSwapChain1 = d3d11::DynamicCastComObject&lt;IDXGISwapChain1&gt;(mSwapChain);
+        }
+
</ins><span class="cx">         result = mSwapChain-&gt;GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&amp;mBackBufferTexture);
</span><span class="cx">         ASSERT(SUCCEEDED(result));
</span><span class="cx">         d3d11::SetDebugName(mBackBufferTexture, &quot;Back buffer texture&quot;);
</span><span class="lines">@@ -444,20 +558,24 @@
</span><span class="cx">         result = device-&gt;CreateRenderTargetView(mBackBufferTexture, NULL, &amp;mBackBufferRTView);
</span><span class="cx">         ASSERT(SUCCEEDED(result));
</span><span class="cx">         d3d11::SetDebugName(mBackBufferRTView, &quot;Back buffer render target&quot;);
</span><del>-    }
</del><span class="cx"> 
</span><del>-    // If we are resizing the swap chain, we don't wish to recreate all the static resources
-    if (!mPassThroughResourcesInit)
-    {
-        mPassThroughResourcesInit = true;
-        initPassThroughResources();
</del><ins>+        result = device-&gt;CreateShaderResourceView(mBackBufferTexture, nullptr, &amp;mBackBufferSRView);
+        ASSERT(SUCCEEDED(result));
+        d3d11::SetDebugName(mBackBufferSRView, &quot;Back buffer shader resource view&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return resetOffscreenTexture(backbufferWidth, backbufferHeight);
</del><ins>+    mFirstSwap = true;
+
+    return resetOffscreenBuffers(backbufferWidth, backbufferHeight);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SwapChain11::initPassThroughResources()
</span><span class="cx"> {
</span><ins>+    if (mPassThroughResourcesInit)
+    {
+        return;
+    }
+
</ins><span class="cx">     TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;SwapChain11::initPassThroughResources&quot;);
</span><span class="cx">     ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="lines">@@ -515,17 +633,58 @@
</span><span class="cx">     result = device-&gt;CreatePixelShader(g_PS_PassthroughRGBA2D, sizeof(g_PS_PassthroughRGBA2D), NULL, &amp;mPassThroughPS);
</span><span class="cx">     ASSERT(SUCCEEDED(result));
</span><span class="cx">     d3d11::SetDebugName(mPassThroughPS, &quot;Swap chain pass through pixel shader&quot;);
</span><ins>+
+    // Use the default rasterizer state but without culling
+    D3D11_RASTERIZER_DESC rasterizerDesc;
+    rasterizerDesc.FillMode              = D3D11_FILL_SOLID;
+    rasterizerDesc.CullMode              = D3D11_CULL_NONE;
+    rasterizerDesc.FrontCounterClockwise = FALSE;
+    rasterizerDesc.DepthBias             = 0;
+    rasterizerDesc.SlopeScaledDepthBias  = 0.0f;
+    rasterizerDesc.DepthBiasClamp        = 0.0f;
+    rasterizerDesc.DepthClipEnable       = TRUE;
+    rasterizerDesc.ScissorEnable         = FALSE;
+    rasterizerDesc.MultisampleEnable     = FALSE;
+    rasterizerDesc.AntialiasedLineEnable = FALSE;
+    result = device-&gt;CreateRasterizerState(&amp;rasterizerDesc, &amp;mPassThroughRS);
+    ASSERT(SUCCEEDED(result));
+    d3d11::SetDebugName(mPassThroughRS, &quot;Swap chain pass through rasterizer state&quot;);
+
+    mPassThroughResourcesInit = true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // parameters should be validated/clamped by caller
</span><span class="cx"> EGLint SwapChain11::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
</span><span class="cx"> {
</span><ins>+    if (mNeedsOffscreenTexture)
+    {
+        EGLint result = copyOffscreenToBackbuffer(x, y, width, height);
+        if (result != EGL_SUCCESS)
+        {
+            return result;
+        }
+    }
+
+    EGLint result = present(x, y, width, height);
+    if (result != EGL_SUCCESS)
+    {
+        return result;
+    }
+
+    mRenderer-&gt;onSwap();
+
+    return EGL_SUCCESS;
+}
+
+EGLint SwapChain11::copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+{
</ins><span class="cx">     if (!mSwapChain)
</span><span class="cx">     {
</span><span class="cx">         return EGL_SUCCESS;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ID3D11Device *device = mRenderer-&gt;getDevice();
</del><ins>+    initPassThroughResources();
+
</ins><span class="cx">     ID3D11DeviceContext *deviceContext = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><span class="cx">     // Set vertices
</span><span class="lines">@@ -549,6 +708,16 @@
</span><span class="cx">     float u2 = (x + width) / float(mWidth);
</span><span class="cx">     float v2 = (y + height) / float(mHeight);
</span><span class="cx"> 
</span><ins>+    // Invert the quad vertices depending on the surface orientation.
+    if ((mOrientation &amp; EGL_SURFACE_ORIENTATION_INVERT_X_ANGLE) != 0)
+    {
+        std::swap(x1, x2);
+    }
+    if ((mOrientation &amp; EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE) != 0)
+    {
+        std::swap(y1, y2);
+    }
+
</ins><span class="cx">     d3d11::SetPositionTexCoordVertex(&amp;vertices[0], x1, y1, u1, v1);
</span><span class="cx">     d3d11::SetPositionTexCoordVertex(&amp;vertices[1], x1, y2, u1, v2);
</span><span class="cx">     d3d11::SetPositionTexCoordVertex(&amp;vertices[2], x2, y1, u2, v1);
</span><span class="lines">@@ -566,7 +735,7 @@
</span><span class="cx">     static const float blendFactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
</span><span class="cx">     deviceContext-&gt;OMSetBlendState(NULL, blendFactor, 0xFFFFFFF);
</span><span class="cx"> 
</span><del>-    deviceContext-&gt;RSSetState(NULL);
</del><ins>+    deviceContext-&gt;RSSetState(mPassThroughRS);
</ins><span class="cx"> 
</span><span class="cx">     // Apply shaders
</span><span class="cx">     deviceContext-&gt;IASetInputLayout(mPassThroughIL);
</span><span class="lines">@@ -575,8 +744,10 @@
</span><span class="cx">     deviceContext-&gt;PSSetShader(mPassThroughPS, NULL, 0);
</span><span class="cx">     deviceContext-&gt;GSSetShader(NULL, NULL, 0);
</span><span class="cx"> 
</span><ins>+    auto stateManager = mRenderer-&gt;getStateManager();
+
</ins><span class="cx">     // Apply render targets
</span><del>-    mRenderer-&gt;setOneTimeRenderTarget(mBackBufferRTView);
</del><ins>+    stateManager-&gt;setOneTimeRenderTarget(mBackBufferRTView, nullptr);
</ins><span class="cx"> 
</span><span class="cx">     // Set the viewport
</span><span class="cx">     D3D11_VIEWPORT viewport;
</span><span class="lines">@@ -589,23 +760,68 @@
</span><span class="cx">     deviceContext-&gt;RSSetViewports(1, &amp;viewport);
</span><span class="cx"> 
</span><span class="cx">     // Apply textures
</span><del>-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, mOffscreenSRView);
</del><ins>+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, mOffscreenSRView);
</ins><span class="cx">     deviceContext-&gt;PSSetSamplers(0, 1, &amp;mPassThroughSampler);
</span><span class="cx"> 
</span><span class="cx">     // Draw
</span><span class="cx">     deviceContext-&gt;Draw(4, 0);
</span><span class="cx"> 
</span><ins>+    // Rendering to the swapchain is now complete. Now we can call Present().
+    // Before that, we perform any cleanup on the D3D device. We do this before Present() to make sure the
+    // cleanup is caught under the current eglSwapBuffers() PIX/Graphics Diagnostics call rather than the next one.
+    stateManager-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
+
+    mRenderer-&gt;markAllStateDirty();
+
+    return EGL_SUCCESS;
+}
+
+EGLint SwapChain11::present(EGLint x, EGLint y, EGLint width, EGLint height)
+{
+    if (!mSwapChain)
+    {
+        return EGL_SUCCESS;
+    }
+
+    UINT swapInterval = mSwapInterval;
</ins><span class="cx"> #if ANGLE_VSYNC == ANGLE_DISABLED
</span><del>-    result = mSwapChain-&gt;Present(0, 0);
-#else
-    result = mSwapChain-&gt;Present(mSwapInterval, 0);
</del><ins>+    swapInterval = 0;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    HRESULT result = S_OK;
+
+    // Use IDXGISwapChain1::Present1 with a dirty rect if DXGI 1.2 is available.
+    if (mSwapChain1 != nullptr)
+    {
+        if (mFirstSwap)
+        {
+            // Can't swap with a dirty rect if this swap chain has never swapped before
+            DXGI_PRESENT_PARAMETERS params = {0, nullptr, nullptr, nullptr};
+            result                         = mSwapChain1-&gt;Present1(swapInterval, 0, &amp;params);
+        }
+        else
+        {
+            RECT rect = {static_cast&lt;LONG&gt;(x), static_cast&lt;LONG&gt;(mHeight - y - height),
+                         static_cast&lt;LONG&gt;(x + width), static_cast&lt;LONG&gt;(mHeight - y)};
+            DXGI_PRESENT_PARAMETERS params = {1, &amp;rect, nullptr, nullptr};
+            result                         = mSwapChain1-&gt;Present1(swapInterval, 0, &amp;params);
+        }
+    }
+    else
+    {
+        result = mSwapChain-&gt;Present(swapInterval, 0);
+    }
+
+    mFirstSwap = false;
+
+    // Some swapping mechanisms such as DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL unbind the current render
+    // target.  Mark it dirty.
+    mRenderer-&gt;getStateManager()-&gt;invalidateRenderTarget();
+
</ins><span class="cx">     if (result == DXGI_ERROR_DEVICE_REMOVED)
</span><span class="cx">     {
</span><del>-        HRESULT removedReason = device-&gt;GetDeviceRemovedReason();
-        UNUSED_TRACE_VARIABLE(removedReason);
-        ERR(&quot;Present failed: the D3D11 device was removed: 0x%08X&quot;, removedReason);
</del><ins>+        ERR(&quot;Present failed: the D3D11 device was removed: 0x%08X&quot;,
+            mRenderer-&gt;getDevice()-&gt;GetDeviceRemovedReason());
</ins><span class="cx">         return EGL_CONTEXT_LOST;
</span><span class="cx">     }
</span><span class="cx">     else if (result == DXGI_ERROR_DEVICE_RESET)
</span><span class="lines">@@ -618,28 +834,24 @@
</span><span class="cx">         ERR(&quot;Present failed with error code 0x%08X&quot;, result);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Unbind
-    mRenderer-&gt;setShaderResource(gl::SAMPLER_PIXEL, 0, NULL);
</del><ins>+    mNativeWindow.commitChange();
</ins><span class="cx"> 
</span><del>-    mRenderer-&gt;unapplyRenderTargets();
-    mRenderer-&gt;markAllStateDirty();
-
</del><span class="cx">     return EGL_SUCCESS;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ID3D11Texture2D *SwapChain11::getOffscreenTexture()
</span><span class="cx"> {
</span><del>-    return mOffscreenTexture;
</del><ins>+    return mNeedsOffscreenTexture ? mOffscreenTexture : mBackBufferTexture;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ID3D11RenderTargetView *SwapChain11::getRenderTarget()
</span><span class="cx"> {
</span><del>-    return mOffscreenRTView;
</del><ins>+    return mNeedsOffscreenTexture ? mOffscreenRTView : mBackBufferRTView;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ID3D11ShaderResourceView *SwapChain11::getRenderTargetShaderResource()
</span><span class="cx"> {
</span><del>-    return mOffscreenSRView;
</del><ins>+    return mNeedsOffscreenTexture ? mOffscreenSRView : mBackBufferSRView;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ID3D11DepthStencilView *SwapChain11::getDepthStencil()
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11SwapChain11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -20,8 +20,12 @@
</span><span class="cx"> class SwapChain11 : public SwapChainD3D
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    SwapChain11(Renderer11 *renderer, NativeWindow nativeWindow, HANDLE shareHandle,
-                GLenum backBufferFormat, GLenum depthBufferFormat);
</del><ins>+    SwapChain11(Renderer11 *renderer,
+                NativeWindow nativeWindow,
+                HANDLE shareHandle,
+                GLenum backBufferFormat,
+                GLenum depthBufferFormat,
+                EGLint orientation);
</ins><span class="cx">     virtual ~SwapChain11();
</span><span class="cx"> 
</span><span class="cx">     EGLint resize(EGLint backbufferWidth, EGLint backbufferHeight);
</span><span class="lines">@@ -42,25 +46,41 @@
</span><span class="cx"> 
</span><span class="cx">     EGLint getWidth() const { return mWidth; }
</span><span class="cx">     EGLint getHeight() const { return mHeight; }
</span><ins>+    void *getKeyedMutex() override { return mKeyedMutex; }
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     void release();
</span><span class="cx">     void initPassThroughResources();
</span><del>-    void releaseOffscreenTexture();
-    EGLint resetOffscreenTexture(int backbufferWidth, int backbufferHeight);
</del><span class="cx"> 
</span><ins>+    void releaseOffscreenColorBuffer();
+    void releaseOffscreenDepthBuffer();
+    EGLint resetOffscreenBuffers(int backbufferWidth, int backbufferHeight);
+    EGLint resetOffscreenColorBuffer(int backbufferWidth, int backbufferHeight);
+    EGLint resetOffscreenDepthBuffer(int backbufferWidth, int backbufferHeight);
+
+    DXGI_FORMAT getSwapChainNativeFormat() const;
+
+    EGLint copyOffscreenToBackbuffer(EGLint x, EGLint y, EGLint width, EGLint height);
+    EGLint present(EGLint x, EGLint y, EGLint width, EGLint height);
+
</ins><span class="cx">     Renderer11 *mRenderer;
</span><ins>+    EGLint mWidth;
</ins><span class="cx">     EGLint mHeight;
</span><del>-    EGLint mWidth;
</del><ins>+    const EGLint mOrientation;
</ins><span class="cx">     bool mAppCreatedShareHandle;
</span><span class="cx">     unsigned int mSwapInterval;
</span><span class="cx">     bool mPassThroughResourcesInit;
</span><span class="cx"> 
</span><ins>+    bool mFirstSwap;
</ins><span class="cx">     DXGISwapChain *mSwapChain;
</span><ins>+    IDXGISwapChain1 *mSwapChain1;
+    IDXGIKeyedMutex *mKeyedMutex;
</ins><span class="cx"> 
</span><span class="cx">     ID3D11Texture2D *mBackBufferTexture;
</span><span class="cx">     ID3D11RenderTargetView *mBackBufferRTView;
</span><ins>+    ID3D11ShaderResourceView *mBackBufferSRView;
</ins><span class="cx"> 
</span><ins>+    const bool mNeedsOffscreenTexture;
</ins><span class="cx">     ID3D11Texture2D *mOffscreenTexture;
</span><span class="cx">     ID3D11RenderTargetView *mOffscreenRTView;
</span><span class="cx">     ID3D11ShaderResourceView *mOffscreenSRView;
</span><span class="lines">@@ -74,6 +94,7 @@
</span><span class="cx">     ID3D11InputLayout *mPassThroughIL;
</span><span class="cx">     ID3D11VertexShader *mPassThroughVS;
</span><span class="cx">     ID3D11PixelShader *mPassThroughPS;
</span><ins>+    ID3D11RasterizerState *mPassThroughRS;
</ins><span class="cx"> 
</span><span class="cx">     SurfaceRenderTarget11 mColorRenderTarget;
</span><span class="cx">     SurfaceRenderTarget11 mDepthStencilRenderTarget;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11TextureStorage11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -5,7 +5,8 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> // TextureStorage11.cpp: Implements the abstract rx::TextureStorage11 class and its concrete derived
</span><del>-// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11 texture.
</del><ins>+// classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11
+// texture.
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/TextureStorage11.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -13,36 +14,42 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/MemoryBuffer.h&quot;
</span><span class="cx"> #include &quot;common/utilities.h&quot;
</span><ins>+#include &quot;libANGLE/formatutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/ImageIndex.h&quot;
</span><del>-#include &quot;libANGLE/formatutils.h&quot;
-#include &quot;libANGLE/renderer/d3d/TextureD3D.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Blit11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Image11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/RenderTarget11.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/SwapChain11.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
-#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</del><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
+#include &quot;libANGLE/renderer/d3d/EGLImageD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/TextureD3D.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> TextureStorage11::SwizzleCacheValue::SwizzleCacheValue()
</span><del>-    : swizzleRed(GL_NONE), swizzleGreen(GL_NONE), swizzleBlue(GL_NONE), swizzleAlpha(GL_NONE)
</del><ins>+    : swizzleRed(GL_INVALID_INDEX),
+      swizzleGreen(GL_INVALID_INDEX),
+      swizzleBlue(GL_INVALID_INDEX),
+      swizzleAlpha(GL_INVALID_INDEX)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TextureStorage11::SwizzleCacheValue::SwizzleCacheValue(GLenum red, GLenum green, GLenum blue, GLenum alpha)
</del><ins>+TextureStorage11::SwizzleCacheValue::SwizzleCacheValue(GLenum red,
+                                                       GLenum green,
+                                                       GLenum blue,
+                                                       GLenum alpha)
</ins><span class="cx">     : swizzleRed(red), swizzleGreen(green), swizzleBlue(blue), swizzleAlpha(alpha)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool TextureStorage11::SwizzleCacheValue::operator==(const SwizzleCacheValue &amp;other) const
</span><span class="cx"> {
</span><del>-    return swizzleRed == other.swizzleRed &amp;&amp;
-           swizzleGreen == other.swizzleGreen &amp;&amp;
-           swizzleBlue == other.swizzleBlue &amp;&amp;
-           swizzleAlpha == other.swizzleAlpha;
</del><ins>+    return swizzleRed == other.swizzleRed &amp;&amp; swizzleGreen == other.swizzleGreen &amp;&amp;
+           swizzleBlue == other.swizzleBlue &amp;&amp; swizzleAlpha == other.swizzleAlpha;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool TextureStorage11::SwizzleCacheValue::operator!=(const SwizzleCacheValue &amp;other) const
</span><span class="lines">@@ -57,28 +64,25 @@
</span><span class="cx"> 
</span><span class="cx"> bool TextureStorage11::SRVKey::operator&lt;(const SRVKey &amp;rhs) const
</span><span class="cx"> {
</span><del>-    return std::tie(baseLevel, mipLevels, swizzle) &lt; std::tie(rhs.baseLevel, rhs.mipLevels, rhs.swizzle);
</del><ins>+    return std::tie(baseLevel, mipLevels, swizzle) &lt;
+           std::tie(rhs.baseLevel, rhs.mipLevels, rhs.swizzle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureStorage11::TextureStorage11(Renderer11 *renderer, UINT bindFlags, UINT miscFlags)
</span><span class="cx">     : mRenderer(renderer),
</span><del>-      mBindFlags(bindFlags),
-      mMiscFlags(miscFlags),
</del><span class="cx">       mTopLevel(0),
</span><span class="cx">       mMipLevels(0),
</span><span class="cx">       mInternalFormat(GL_NONE),
</span><del>-      mTextureFormat(DXGI_FORMAT_UNKNOWN),
-      mShaderResourceFormat(DXGI_FORMAT_UNKNOWN),
-      mRenderTargetFormat(DXGI_FORMAT_UNKNOWN),
-      mDepthStencilFormat(DXGI_FORMAT_UNKNOWN),
</del><ins>+      mTextureFormatSet(nullptr),
+      mSwizzleFormatSet(nullptr),
</ins><span class="cx">       mTextureWidth(0),
</span><span class="cx">       mTextureHeight(0),
</span><del>-      mTextureDepth(0)
</del><ins>+      mTextureDepth(0),
+      mBindFlags(bindFlags),
+      mMiscFlags(miscFlags)
</ins><span class="cx"> {
</span><del>-    for (unsigned int i = 0; i &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
-    {
-        mLevelSRVs[i] = nullptr;
-    }
</del><ins>+    mLevelSRVs.fill(nullptr);
+    mLevelBlitSRVs.fill(nullptr);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureStorage11::~TextureStorage11()
</span><span class="lines">@@ -86,6 +90,7 @@
</span><span class="cx">     for (unsigned int level = 0; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
</span><span class="cx">     {
</span><span class="cx">         SafeRelease(mLevelSRVs[level]);
</span><ins>+        SafeRelease(mLevelBlitSRVs[level]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     for (SRVCache::iterator i = mSrvCache.begin(); i != mSrvCache.end(); i++)
</span><span class="lines">@@ -95,20 +100,23 @@
</span><span class="cx">     mSrvCache.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel, bool renderTarget)
</del><ins>+DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat,
+                                            const Renderer11DeviceCaps &amp;renderer11DeviceCaps,
+                                            bool renderTarget)
</ins><span class="cx"> {
</span><span class="cx">     UINT bindFlags = 0;
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(internalFormat, featureLevel);
-    if (formatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
</del><ins>+    const d3d11::TextureFormat &amp;formatInfo =
+        d3d11::GetTextureFormatInfo(internalFormat, renderer11DeviceCaps);
+    if (formatInfo.formatSet-&gt;srvFormat != DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">     {
</span><span class="cx">         bindFlags |= D3D11_BIND_SHADER_RESOURCE;
</span><span class="cx">     }
</span><del>-    if (formatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN)
</del><ins>+    if (formatInfo.formatSet-&gt;dsvFormat != DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">     {
</span><span class="cx">         bindFlags |= D3D11_BIND_DEPTH_STENCIL;
</span><span class="cx">     }
</span><del>-    if (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN &amp;&amp; renderTarget)
</del><ins>+    if (formatInfo.formatSet-&gt;rtvFormat != DXGI_FORMAT_UNKNOWN &amp;&amp; renderTarget)
</ins><span class="cx">     {
</span><span class="cx">         bindFlags |= D3D11_BIND_RENDER_TARGET;
</span><span class="cx">     }
</span><span class="lines">@@ -116,16 +124,21 @@
</span><span class="cx">     return bindFlags;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-DWORD TextureStorage11::GetTextureMiscFlags(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel, bool renderTarget, int levels)
</del><ins>+DWORD TextureStorage11::GetTextureMiscFlags(GLenum internalFormat,
+                                            const Renderer11DeviceCaps &amp;renderer11DeviceCaps,
+                                            bool renderTarget,
+                                            int levels)
</ins><span class="cx"> {
</span><span class="cx">     UINT miscFlags = 0;
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(internalFormat, featureLevel);
</del><ins>+    const d3d11::TextureFormat &amp;formatInfo =
+        d3d11::GetTextureFormatInfo(internalFormat, renderer11DeviceCaps);
</ins><span class="cx">     if (renderTarget &amp;&amp; levels &gt; 1)
</span><span class="cx">     {
</span><del>-        const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(formatInfo.srvFormat);
</del><ins>+        const d3d11::DXGIFormat &amp;dxgiFormatInfo =
+            d3d11::GetDXGIFormatInfo(formatInfo.formatSet-&gt;texFormat);
</ins><span class="cx"> 
</span><del>-        if (dxgiFormatInfo.nativeMipmapSupport(featureLevel))
</del><ins>+        if (dxgiFormatInfo.nativeMipmapSupport(renderer11DeviceCaps.featureLevel))
</ins><span class="cx">         {
</span><span class="cx">             miscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS;
</span><span class="cx">         }
</span><span class="lines">@@ -186,23 +199,25 @@
</span><span class="cx"> 
</span><span class="cx"> UINT TextureStorage11::getSubresourceIndex(const gl::ImageIndex &amp;index) const
</span><span class="cx"> {
</span><del>-    UINT mipSlice = static_cast&lt;UINT&gt;(index.mipIndex + mTopLevel);
-    UINT arraySlice = static_cast&lt;UINT&gt;(index.hasLayer() ? index.layerIndex : 0);
</del><ins>+    UINT mipSlice    = static_cast&lt;UINT&gt;(index.mipIndex + mTopLevel);
+    UINT arraySlice  = static_cast&lt;UINT&gt;(index.hasLayer() ? index.layerIndex : 0);
</ins><span class="cx">     UINT subresource = D3D11CalcSubresource(mipSlice, arraySlice, mMipLevels);
</span><span class="cx">     ASSERT(subresource != std::numeric_limits&lt;UINT&gt;::max());
</span><span class="cx">     return subresource;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11::getSRV(const gl::SamplerState &amp;samplerState, ID3D11ShaderResourceView **outSRV)
</del><ins>+gl::Error TextureStorage11::getSRV(const gl::TextureState &amp;textureState,
+                                   ID3D11ShaderResourceView **outSRV)
</ins><span class="cx"> {
</span><del>-    bool swizzleRequired = samplerState.swizzleRequired();
-    bool mipmapping = gl::IsMipmapFiltered(samplerState);
-    unsigned int mipLevels = mipmapping ? (samplerState.maxLevel - samplerState.baseLevel + 1) : 1;
</del><ins>+    bool swizzleRequired   = textureState.swizzleRequired();
+    bool mipmapping        = gl::IsMipmapFiltered(textureState.samplerState);
+    unsigned int mipLevels = mipmapping ? (textureState.maxLevel - textureState.baseLevel + 1) : 1;
</ins><span class="cx"> 
</span><del>-    // Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level, which corresponds to GL level 0)
-    mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - samplerState.baseLevel);
</del><ins>+    // Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level,
+    // which corresponds to GL level 0)
+    mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - textureState.baseLevel);
</ins><span class="cx"> 
</span><del>-    if (mRenderer-&gt;getFeatureLevel() &lt;= D3D_FEATURE_LEVEL_9_3)
</del><ins>+    if (mRenderer-&gt;getRenderer11DeviceCaps().featureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
</ins><span class="cx">     {
</span><span class="cx">         ASSERT(!swizzleRequired);
</span><span class="cx">         ASSERT(mipLevels == 1 || mipLevels == mMipLevels);
</span><span class="lines">@@ -220,10 +235,11 @@
</span><span class="cx"> 
</span><span class="cx">     if (swizzleRequired)
</span><span class="cx">     {
</span><del>-        verifySwizzleExists(samplerState.swizzleRed, samplerState.swizzleGreen, samplerState.swizzleBlue, samplerState.swizzleAlpha);
</del><ins>+        verifySwizzleExists(textureState.swizzleRed, textureState.swizzleGreen,
+                            textureState.swizzleBlue, textureState.swizzleAlpha);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    SRVKey key(samplerState.baseLevel, mipLevels, swizzleRequired);
</del><ins>+    SRVKey key(textureState.baseLevel, mipLevels, swizzleRequired);
</ins><span class="cx">     auto iter = mSrvCache.find(key);
</span><span class="cx">     if (iter != mSrvCache.end())
</span><span class="cx">     {
</span><span class="lines">@@ -250,8 +266,9 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ID3D11ShaderResourceView *srv = nullptr;
</span><del>-    DXGI_FORMAT format = (swizzleRequired ? mSwizzleShaderResourceFormat : mShaderResourceFormat);
-    gl::Error error = createSRV(samplerState.baseLevel, mipLevels, format, texture, &amp;srv);
</del><ins>+    DXGI_FORMAT format =
+        (swizzleRequired ? mSwizzleFormatSet-&gt;srvFormat : mTextureFormatSet-&gt;srvFormat);
+    gl::Error error = createSRV(textureState.baseLevel, mipLevels, format, texture, &amp;srv);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -263,39 +280,59 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11::getSRVLevel(int mipLevel, ID3D11ShaderResourceView **outSRV)
</del><ins>+gl::Error TextureStorage11::getSRVLevel(int mipLevel,
+                                        bool blitSRV,
+                                        ID3D11ShaderResourceView **outSRV)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mipLevel &gt;= 0 &amp;&amp; mipLevel &lt; getLevelCount());
</span><span class="cx"> 
</span><del>-    if (!mLevelSRVs[mipLevel])
</del><ins>+    auto &amp;levelSRVs      = (blitSRV) ? mLevelBlitSRVs : mLevelSRVs;
+    auto &amp;otherLevelSRVs = (blitSRV) ? mLevelSRVs : mLevelBlitSRVs;
+
+    if (!levelSRVs[mipLevel])
</ins><span class="cx">     {
</span><del>-        ID3D11Resource *resource = NULL;
-        gl::Error error = getResource(&amp;resource);
-        if (error.isError())
</del><ins>+        // Only create a different SRV for blit if blit format is different from regular srv format
+        if (otherLevelSRVs[mipLevel] &amp;&amp;
+            mTextureFormatSet-&gt;srvFormat == mTextureFormatSet-&gt;blitSRVFormat)
</ins><span class="cx">         {
</span><del>-            return error;
</del><ins>+            levelSRVs[mipLevel] = otherLevelSRVs[mipLevel];
+            levelSRVs[mipLevel]-&gt;AddRef();
</ins><span class="cx">         }
</span><ins>+        else
+        {
+            ID3D11Resource *resource = nullptr;
+            gl::Error error = getResource(&amp;resource);
+            if (error.isError())
+            {
+                return error;
+            }
</ins><span class="cx"> 
</span><del>-        error = createSRV(mipLevel, 1, mShaderResourceFormat, resource, &amp;mLevelSRVs[mipLevel]);
-        if (error.isError())
-        {
-            return error;
</del><ins>+            DXGI_FORMAT resourceFormat =
+                blitSRV ? mTextureFormatSet-&gt;blitSRVFormat : mTextureFormatSet-&gt;srvFormat;
+            error = createSRV(mipLevel, 1, resourceFormat, resource, &amp;levelSRVs[mipLevel]);
+            if (error.isError())
+            {
+                return error;
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    *outSRV = mLevelSRVs[mipLevel];
</del><ins>+    *outSRV = levelSRVs[mipLevel];
</ins><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11::getSRVLevels(GLint baseLevel, GLint maxLevel, ID3D11ShaderResourceView **outSRV)
</del><ins>+gl::Error TextureStorage11::getSRVLevels(GLint baseLevel,
+                                         GLint maxLevel,
+                                         ID3D11ShaderResourceView **outSRV)
</ins><span class="cx"> {
</span><span class="cx">     unsigned int mipLevels = maxLevel - baseLevel + 1;
</span><span class="cx"> 
</span><del>-    // Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level, which corresponds to GL level 0)
</del><ins>+    // Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level,
+    // which corresponds to GL level 0)
</ins><span class="cx">     mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - baseLevel);
</span><span class="cx"> 
</span><del>-    if (mRenderer-&gt;getFeatureLevel() &lt;= D3D_FEATURE_LEVEL_9_3)
</del><ins>+    if (mRenderer-&gt;getRenderer11DeviceCaps().featureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
</ins><span class="cx">     {
</span><span class="cx">         ASSERT(mipLevels == 1 || mipLevels == mMipLevels);
</span><span class="cx">     }
</span><span class="lines">@@ -326,20 +363,28 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ID3D11ShaderResourceView *srv = nullptr;
</span><del>-    error = createSRV(baseLevel, mipLevels, mShaderResourceFormat, texture, &amp;srv);
</del><ins>+    error = createSRV(baseLevel, mipLevels, mTextureFormatSet-&gt;srvFormat, texture, &amp;srv);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mSrvCache[key] = srv;
</span><del>-    *outSRV = srv;
</del><ins>+    *outSRV        = srv;
</ins><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11::generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha)
</del><ins>+d3d11::ANGLEFormat TextureStorage11::getANGLEFormat() const
</ins><span class="cx"> {
</span><ins>+    return mTextureFormatSet-&gt;format;
+}
+
+gl::Error TextureStorage11::generateSwizzles(GLenum swizzleRed,
+                                             GLenum swizzleGreen,
+                                             GLenum swizzleBlue,
+                                             GLenum swizzleAlpha)
+{
</ins><span class="cx">     SwizzleCacheValue swizzleTarget(swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha);
</span><span class="cx">     for (int level = 0; level &lt; getLevelCount(); level++)
</span><span class="cx">     {
</span><span class="lines">@@ -347,14 +392,15 @@
</span><span class="cx">         if (mSwizzleCache[level] != swizzleTarget)
</span><span class="cx">         {
</span><span class="cx">             // Need to re-render the swizzle for this level
</span><del>-            ID3D11ShaderResourceView *sourceSRV = NULL;
-            gl::Error error = getSRVLevel(level, &amp;sourceSRV);
</del><ins>+            ID3D11ShaderResourceView *sourceSRV = nullptr;
+            gl::Error error                     = getSRVLevel(level, true, &amp;sourceSRV);
+
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 return error;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            ID3D11RenderTargetView *destRTV = NULL;
</del><ins>+            ID3D11RenderTargetView *destRTV = nullptr;
</ins><span class="cx">             error = getSwizzleRenderTarget(level, &amp;destRTV);
</span><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="lines">@@ -365,7 +411,8 @@
</span><span class="cx"> 
</span><span class="cx">             Blit11 *blitter = mRenderer-&gt;getBlitter();
</span><span class="cx"> 
</span><del>-            error = blitter-&gt;swizzleTexture(sourceSRV, destRTV, size, swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha);
</del><ins>+            error = blitter-&gt;swizzleTexture(sourceSRV, destRTV, size, swizzleRed, swizzleGreen,
+                                            swizzleBlue, swizzleAlpha);
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 return error;
</span><span class="lines">@@ -396,29 +443,28 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture, unsigned int sourceSubresource,
-                                                   const gl::ImageIndex &amp;index, const gl::Box &amp;copyArea)
</del><ins>+gl::Error TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture,
+                                                   unsigned int sourceSubresource,
+                                                   const gl::ImageIndex &amp;index,
+                                                   const gl::Box &amp;copyArea)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(srcTexture);
</span><span class="cx"> 
</span><del>-    GLint level = index.mipIndex;
</del><ins>+    const GLint level = index.mipIndex;
</ins><span class="cx"> 
</span><span class="cx">     invalidateSwizzleCacheLevel(level);
</span><span class="cx"> 
</span><span class="cx">     gl::Extents texSize(getLevelWidth(level), getLevelHeight(level), getLevelDepth(level));
</span><span class="cx"> 
</span><del>-    bool fullCopy = copyArea.x == 0 &amp;&amp;
-                    copyArea.y == 0 &amp;&amp;
-                    copyArea.z == 0 &amp;&amp;
-                    copyArea.width  == texSize.width &amp;&amp;
-                    copyArea.height == texSize.height &amp;&amp;
-                    copyArea.depth  == texSize.depth;
</del><ins>+    bool fullCopy = copyArea.x == 0 &amp;&amp; copyArea.y == 0 &amp;&amp; copyArea.z == 0 &amp;&amp;
+                    copyArea.width == texSize.width &amp;&amp; copyArea.height == texSize.height &amp;&amp;
+                    copyArea.depth == texSize.depth;
</ins><span class="cx"> 
</span><del>-    ID3D11Resource *dstTexture = NULL;
</del><ins>+    ID3D11Resource *dstTexture = nullptr;
</ins><span class="cx">     gl::Error error(GL_NO_ERROR);
</span><span class="cx"> 
</span><del>-    // If the zero-LOD workaround is active and we want to update a level greater than zero, then we should
-    // update the mipmapped texture, even if mapmaps are currently disabled.
</del><ins>+    // If the zero-LOD workaround is active and we want to update a level greater than zero, then we
+    // should update the mipmapped texture, even if mapmaps are currently disabled.
</ins><span class="cx">     if (index.mipIndex &gt; 0 &amp;&amp; mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround)
</span><span class="cx">     {
</span><span class="cx">         error = getMippedResource(&amp;dstTexture);
</span><span class="lines">@@ -437,44 +483,49 @@
</span><span class="cx"> 
</span><span class="cx">     ASSERT(dstTexture);
</span><span class="cx"> 
</span><del>-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mTextureFormat);
-    if (!fullCopy &amp;&amp; (dxgiFormatInfo.depthBits &gt; 0 || dxgiFormatInfo.stencilBits &gt; 0))
</del><ins>+    const d3d11::DXGIFormatSize &amp;dxgiFormatSizeInfo =
+        d3d11::GetDXGIFormatSizeInfo(mTextureFormatSet-&gt;texFormat);
+    if (!fullCopy &amp;&amp; mTextureFormatSet-&gt;dsvFormat != DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">     {
</span><span class="cx">         // CopySubresourceRegion cannot copy partial depth stencils, use the blitter instead
</span><span class="cx">         Blit11 *blitter = mRenderer-&gt;getBlitter();
</span><span class="cx"> 
</span><span class="cx">         return blitter-&gt;copyDepthStencil(srcTexture, sourceSubresource, copyArea, texSize,
</span><del>-                                         dstTexture, dstSubresource, copyArea, texSize,
-                                         NULL);
</del><ins>+                                         dstTexture, dstSubresource, copyArea, texSize, nullptr);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         D3D11_BOX srcBox;
</span><span class="cx">         srcBox.left = copyArea.x;
</span><span class="cx">         srcBox.top = copyArea.y;
</span><del>-        srcBox.right = copyArea.x + roundUp(static_cast&lt;UINT&gt;(copyArea.width), dxgiFormatInfo.blockWidth);
-        srcBox.bottom = copyArea.y + roundUp(static_cast&lt;UINT&gt;(copyArea.height), dxgiFormatInfo.blockHeight);
</del><ins>+        srcBox.right =
+            copyArea.x + roundUp(static_cast&lt;UINT&gt;(copyArea.width), dxgiFormatSizeInfo.blockWidth);
+        srcBox.bottom = copyArea.y +
+                        roundUp(static_cast&lt;UINT&gt;(copyArea.height), dxgiFormatSizeInfo.blockHeight);
</ins><span class="cx">         srcBox.front = copyArea.z;
</span><del>-        srcBox.back = copyArea.z + copyArea.depth;
</del><ins>+        srcBox.back  = copyArea.z + copyArea.depth;
</ins><span class="cx"> 
</span><span class="cx">         ID3D11DeviceContext *context = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><del>-        context-&gt;CopySubresourceRegion(dstTexture, dstSubresource, copyArea.x, copyArea.y, copyArea.z,
-                                       srcTexture, sourceSubresource, fullCopy ? NULL : &amp;srcBox);
</del><ins>+        context-&gt;CopySubresourceRegion(dstTexture, dstSubresource, copyArea.x, copyArea.y,
+                                       copyArea.z, srcTexture, sourceSubresource,
+                                       fullCopy ? nullptr : &amp;srcBox);
</ins><span class="cx">         return gl::Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11::copySubresourceLevel(ID3D11Resource* dstTexture, unsigned int dstSubresource,
-                                                 const gl::ImageIndex &amp;index, const gl::Box &amp;region)
</del><ins>+gl::Error TextureStorage11::copySubresourceLevel(ID3D11Resource *dstTexture,
+                                                 unsigned int dstSubresource,
+                                                 const gl::ImageIndex &amp;index,
+                                                 const gl::Box &amp;region)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(dstTexture);
</span><span class="cx"> 
</span><del>-    ID3D11Resource *srcTexture = NULL;
</del><ins>+    ID3D11Resource *srcTexture = nullptr;
</ins><span class="cx">     gl::Error error(GL_NO_ERROR);
</span><span class="cx"> 
</span><del>-    // If the zero-LOD workaround is active and we want to update a level greater than zero, then we should
-    // update the mipmapped texture, even if mapmaps are currently disabled.
</del><ins>+    // If the zero-LOD workaround is active and we want to update a level greater than zero, then we
+    // should update the mipmapped texture, even if mapmaps are currently disabled.
</ins><span class="cx">     if (index.mipIndex &gt; 0 &amp;&amp; mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround)
</span><span class="cx">     {
</span><span class="cx">         error = getMippedResource(&amp;srcTexture);
</span><span class="lines">@@ -495,23 +546,23 @@
</span><span class="cx"> 
</span><span class="cx">     ID3D11DeviceContext *context = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><del>-    // D3D11 can't perform partial CopySubresourceRegion on depth/stencil textures, so pSrcBox should be NULL.
</del><ins>+    // D3D11 can't perform partial CopySubresourceRegion on depth/stencil textures, so pSrcBox
+    // should be nullptr.
</ins><span class="cx">     D3D11_BOX srcBox;
</span><del>-    D3D11_BOX *pSrcBox = NULL;
-    if (mRenderer-&gt;getFeatureLevel() &lt;= D3D_FEATURE_LEVEL_9_3)
</del><ins>+    D3D11_BOX *pSrcBox = nullptr;
+    if (mRenderer-&gt;getRenderer11DeviceCaps().featureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
</ins><span class="cx">     {
</span><del>-        // However, D3D10Level9 doesn't always perform CopySubresourceRegion correctly unless the source box
-        // is specified. This is okay, since we don't perform CopySubresourceRegion on depth/stencil
-        // textures on 9_3.
-        ASSERT(d3d11::GetDXGIFormatInfo(mTextureFormat).depthBits == 0);
-        ASSERT(d3d11::GetDXGIFormatInfo(mTextureFormat).stencilBits == 0);
-        srcBox.left = region.x;
-        srcBox.right = region.x + region.width;
-        srcBox.top = region.y;
</del><ins>+        // However, D3D10Level9 doesn't always perform CopySubresourceRegion correctly unless the
+        // source box is specified. This is okay, since we don't perform CopySubresourceRegion on
+        // depth/stencil textures on 9_3.
+        ASSERT(mTextureFormatSet-&gt;dsvFormat == DXGI_FORMAT_UNKNOWN);
+        srcBox.left   = region.x;
+        srcBox.right  = region.x + region.width;
+        srcBox.top    = region.y;
</ins><span class="cx">         srcBox.bottom = region.y + region.height;
</span><del>-        srcBox.front = region.z;
-        srcBox.back = region.z + region.depth;
-        pSrcBox = &amp;srcBox;
</del><ins>+        srcBox.front  = region.z;
+        srcBox.back   = region.z + region.depth;
+        pSrcBox       = &amp;srcBox;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     context-&gt;CopySubresourceRegion(dstTexture, dstSubresource, region.x, region.y, region.z,
</span><span class="lines">@@ -520,28 +571,30 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11::generateMipmap(const gl::ImageIndex &amp;sourceIndex, const gl::ImageIndex &amp;destIndex)
</del><ins>+gl::Error TextureStorage11::generateMipmap(const gl::ImageIndex &amp;sourceIndex,
+                                           const gl::ImageIndex &amp;destIndex)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(sourceIndex.layerIndex == destIndex.layerIndex);
</span><span class="cx"> 
</span><span class="cx">     invalidateSwizzleCacheLevel(destIndex.mipIndex);
</span><span class="cx"> 
</span><del>-    RenderTargetD3D *source = NULL;
</del><ins>+    RenderTargetD3D *source = nullptr;
</ins><span class="cx">     gl::Error error = getRenderTarget(sourceIndex, &amp;source);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RenderTargetD3D *dest = NULL;
</del><ins>+    RenderTargetD3D *dest = nullptr;
</ins><span class="cx">     error = getRenderTarget(destIndex, &amp;dest);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ID3D11ShaderResourceView *sourceSRV = GetAs&lt;RenderTarget11&gt;(source)-&gt;getShaderResourceView();
-    ID3D11RenderTargetView *destRTV = GetAs&lt;RenderTarget11&gt;(dest)-&gt;getRenderTargetView();
</del><ins>+    ID3D11ShaderResourceView *sourceSRV =
+        GetAs&lt;RenderTarget11&gt;(source)-&gt;getBlitShaderResourceView();
+    ID3D11RenderTargetView *destRTV     = GetAs&lt;RenderTarget11&gt;(dest)-&gt;getRenderTargetView();
</ins><span class="cx"> 
</span><span class="cx">     gl::Box sourceArea(0, 0, 0, source-&gt;getWidth(), source-&gt;getHeight(), source-&gt;getDepth());
</span><span class="cx">     gl::Extents sourceSize(source-&gt;getWidth(), source-&gt;getHeight(), source-&gt;getDepth());
</span><span class="lines">@@ -550,11 +603,15 @@
</span><span class="cx">     gl::Extents destSize(dest-&gt;getWidth(), dest-&gt;getHeight(), dest-&gt;getDepth());
</span><span class="cx"> 
</span><span class="cx">     Blit11 *blitter = mRenderer-&gt;getBlitter();
</span><del>-    return blitter-&gt;copyTexture(sourceSRV, sourceArea, sourceSize, destRTV, destArea, destSize, NULL,
-                                gl::GetInternalFormatInfo(source-&gt;getInternalFormat()).format, GL_LINEAR);
</del><ins>+    return blitter-&gt;copyTexture(
+        sourceSRV, sourceArea, sourceSize, destRTV, destArea, destSize, nullptr,
+        gl::GetInternalFormatInfo(source-&gt;getInternalFormat()).format, GL_LINEAR, false);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TextureStorage11::verifySwizzleExists(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha)
</del><ins>+void TextureStorage11::verifySwizzleExists(GLenum swizzleRed,
+                                           GLenum swizzleGreen,
+                                           GLenum swizzleBlue,
+                                           GLenum swizzleAlpha)
</ins><span class="cx"> {
</span><span class="cx">     SwizzleCacheValue swizzleTarget(swizzleRed, swizzleGreen, swizzleBlue, swizzleAlpha);
</span><span class="cx">     for (unsigned int level = 0; level &lt; mMipLevels; level++)
</span><span class="lines">@@ -563,19 +620,44 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TextureStorage11::clearSRVCache()
+{
+    invalidateSwizzleCache();
+
+    auto iter = mSrvCache.begin();
+    while (iter != mSrvCache.end())
+    {
+        if (!iter-&gt;first.swizzle)
+        {
+            SafeRelease(iter-&gt;second);
+            iter = mSrvCache.erase(iter);
+        }
+        else
+        {
+            iter++;
+        }
+    }
+
+    for (size_t level = 0; level &lt; mLevelSRVs.size(); level++)
+    {
+        SafeRelease(mLevelSRVs[level]);
+        SafeRelease(mLevelBlitSRVs[level]);
+    }
+}
+
</ins><span class="cx"> gl::Error TextureStorage11::copyToStorage(TextureStorage *destStorage)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(destStorage);
</span><span class="cx"> 
</span><del>-    ID3D11Resource *sourceResouce = NULL;
</del><ins>+    ID3D11Resource *sourceResouce = nullptr;
</ins><span class="cx">     gl::Error error = getResource(&amp;sourceResouce);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    TextureStorage11 *dest11 = GetAs&lt;TextureStorage11&gt;(destStorage);
-    ID3D11Resource *destResource = NULL;
</del><ins>+    TextureStorage11 *dest11     = GetAs&lt;TextureStorage11&gt;(destStorage);
+    ID3D11Resource *destResource = nullptr;
</ins><span class="cx">     error = dest11-&gt;getResource(&amp;destResource);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="lines">@@ -590,12 +672,16 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11::setData(const gl::ImageIndex &amp;index, ImageD3D *image, const gl::Box *destBox, GLenum type,
-                                    const gl::PixelUnpackState &amp;unpack, const uint8_t *pixelData)
</del><ins>+gl::Error TextureStorage11::setData(const gl::ImageIndex &amp;index,
+                                    ImageD3D *image,
+                                    const gl::Box *destBox,
+                                    GLenum type,
+                                    const gl::PixelUnpackState &amp;unpack,
+                                    const uint8_t *pixelData)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!image-&gt;isDirty());
</span><span class="cx"> 
</span><del>-    ID3D11Resource *resource = NULL;
</del><ins>+    ID3D11Resource *resource = nullptr;
</ins><span class="cx">     gl::Error error = getResource(&amp;resource);
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="lines">@@ -605,10 +691,12 @@
</span><span class="cx"> 
</span><span class="cx">     UINT destSubresource = getSubresourceIndex(index);
</span><span class="cx"> 
</span><del>-    const gl::InternalFormat &amp;internalFormatInfo = gl::GetInternalFormatInfo(image-&gt;getInternalFormat());
</del><ins>+    const gl::InternalFormat &amp;internalFormatInfo =
+        gl::GetInternalFormatInfo(image-&gt;getInternalFormat());
</ins><span class="cx"> 
</span><del>-    gl::Box levelBox(0, 0, 0, getLevelWidth(index.mipIndex), getLevelHeight(index.mipIndex), getLevelDepth(index.mipIndex));
-    bool fullUpdate = (destBox == NULL || *destBox == levelBox);
</del><ins>+    gl::Box levelBox(0, 0, 0, getLevelWidth(index.mipIndex), getLevelHeight(index.mipIndex),
+                     getLevelDepth(index.mipIndex));
+    bool fullUpdate = (destBox == nullptr || *destBox == levelBox);
</ins><span class="cx">     ASSERT(internalFormatInfo.depthBits == 0 || fullUpdate);
</span><span class="cx"> 
</span><span class="cx">     // TODO(jmadill): Handle compressed formats
</span><span class="lines">@@ -617,34 +705,51 @@
</span><span class="cx">     // with compressed formats in the calling logic.
</span><span class="cx">     ASSERT(!internalFormatInfo.compressed);
</span><span class="cx"> 
</span><del>-    int width = destBox ? destBox-&gt;width : static_cast&lt;int&gt;(image-&gt;getWidth());
-    int height = destBox ? destBox-&gt;height : static_cast&lt;int&gt;(image-&gt;getHeight());
-    int depth = destBox ? destBox-&gt;depth : static_cast&lt;int&gt;(image-&gt;getDepth());
-    UINT srcRowPitch = internalFormatInfo.computeRowPitch(type, width, unpack.alignment, unpack.rowLength);
-    UINT srcDepthPitch = internalFormatInfo.computeDepthPitch(type, width, height, unpack.alignment, unpack.rowLength);
</del><ins>+    const int width  = destBox ? destBox-&gt;width : static_cast&lt;int&gt;(image-&gt;getWidth());
+    const int height = destBox ? destBox-&gt;height : static_cast&lt;int&gt;(image-&gt;getHeight());
+    const int depth = destBox ? destBox-&gt;depth : static_cast&lt;int&gt;(image-&gt;getDepth());
+    const UINT srcRowPitch =
+        internalFormatInfo.computeRowPitch(type, width, unpack.alignment, unpack.rowLength);
+    const UINT srcDepthPitch = internalFormatInfo.computeDepthPitch(
+        type, width, height, unpack.alignment, unpack.rowLength, unpack.imageHeight);
+    const GLsizei srcSkipBytes = internalFormatInfo.computeSkipPixels(
+        srcRowPitch, srcDepthPitch, unpack.skipImages, unpack.skipRows, unpack.skipPixels);
</ins><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;d3d11Format = d3d11::GetTextureFormatInfo(image-&gt;getInternalFormat(), mRenderer-&gt;getFeatureLevel());
-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3d11Format.texFormat);
</del><ins>+    const d3d11::TextureFormat &amp;d3d11Format = d3d11::GetTextureFormatInfo(
+        image-&gt;getInternalFormat(), mRenderer-&gt;getRenderer11DeviceCaps());
+    const d3d11::DXGIFormatSize &amp;dxgiFormatInfo =
+        d3d11::GetDXGIFormatSizeInfo(d3d11Format.formatSet-&gt;texFormat);
</ins><span class="cx"> 
</span><del>-    size_t outputPixelSize = dxgiFormatInfo.pixelBytes;
</del><ins>+    const size_t outputPixelSize = dxgiFormatInfo.pixelBytes;
</ins><span class="cx"> 
</span><del>-    UINT bufferRowPitch = outputPixelSize * width;
</del><ins>+    UINT bufferRowPitch   = static_cast&lt;unsigned int&gt;(outputPixelSize) * width;
</ins><span class="cx">     UINT bufferDepthPitch = bufferRowPitch * height;
</span><span class="cx"> 
</span><del>-    size_t neededSize = bufferDepthPitch * depth;
-    MemoryBuffer *conversionBuffer = NULL;
-    error = mRenderer-&gt;getScratchMemoryBuffer(neededSize, &amp;conversionBuffer);
-    if (error.isError())
</del><ins>+    const size_t neededSize        = bufferDepthPitch * depth;
+    MemoryBuffer *conversionBuffer = nullptr;
+    const uint8_t *data            = nullptr;
+
+    d3d11::LoadImageFunctionInfo loadFunctionInfo = d3d11Format.loadFunctions.at(type);
+    if (loadFunctionInfo.requiresConversion)
</ins><span class="cx">     {
</span><del>-        return error;
</del><ins>+        error = mRenderer-&gt;getScratchMemoryBuffer(neededSize, &amp;conversionBuffer);
+        if (error.isError())
+        {
+            return error;
+        }
+
+        loadFunctionInfo.loadFunction(width, height, depth, pixelData + srcSkipBytes, srcRowPitch,
+                                      srcDepthPitch, conversionBuffer-&gt;data(), bufferRowPitch,
+                                      bufferDepthPitch);
+        data = conversionBuffer-&gt;data();
</ins><span class="cx">     }
</span><ins>+    else
+    {
+        data             = pixelData + srcSkipBytes;
+        bufferRowPitch   = srcRowPitch;
+        bufferDepthPitch = srcDepthPitch;
+    }
</ins><span class="cx"> 
</span><del>-    // TODO: fast path
-    LoadImageFunction loadFunction = d3d11Format.loadFunctions.at(type);
-    loadFunction(width, height, depth,
-                 pixelData, srcRowPitch, srcDepthPitch,
-                 conversionBuffer-&gt;data(), bufferRowPitch, bufferDepthPitch);
-
</del><span class="cx">     ID3D11DeviceContext *immediateContext = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><span class="cx">     if (!fullUpdate)
</span><span class="lines">@@ -652,21 +757,19 @@
</span><span class="cx">         ASSERT(destBox);
</span><span class="cx"> 
</span><span class="cx">         D3D11_BOX destD3DBox;
</span><del>-        destD3DBox.left = destBox-&gt;x;
-        destD3DBox.right = destBox-&gt;x + destBox-&gt;width;
-        destD3DBox.top = destBox-&gt;y;
</del><ins>+        destD3DBox.left   = destBox-&gt;x;
+        destD3DBox.right  = destBox-&gt;x + destBox-&gt;width;
+        destD3DBox.top    = destBox-&gt;y;
</ins><span class="cx">         destD3DBox.bottom = destBox-&gt;y + destBox-&gt;height;
</span><del>-        destD3DBox.front = destBox-&gt;z;
-        destD3DBox.back = destBox-&gt;z + destBox-&gt;depth;
</del><ins>+        destD3DBox.front  = destBox-&gt;z;
+        destD3DBox.back   = destBox-&gt;z + destBox-&gt;depth;
</ins><span class="cx"> 
</span><del>-        immediateContext-&gt;UpdateSubresource(resource, destSubresource,
-                                            &amp;destD3DBox, conversionBuffer-&gt;data(),
</del><ins>+        immediateContext-&gt;UpdateSubresource(resource, destSubresource, &amp;destD3DBox, data,
</ins><span class="cx">                                             bufferRowPitch, bufferDepthPitch);
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        immediateContext-&gt;UpdateSubresource(resource, destSubresource,
-                                            NULL, conversionBuffer-&gt;data(),
</del><ins>+        immediateContext-&gt;UpdateSubresource(resource, destSubresource, nullptr, data,
</ins><span class="cx">                                             bufferRowPitch, bufferDepthPitch);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -676,107 +779,94 @@
</span><span class="cx"> TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain)
</span><span class="cx">     : TextureStorage11(renderer, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, 0),
</span><span class="cx">       mTexture(swapchain-&gt;getOffscreenTexture()),
</span><del>-      mSwizzleTexture(NULL),
-      mLevelZeroTexture(NULL),
-      mLevelZeroRenderTarget(NULL),
-      mUseLevelZeroTexture(false)
</del><ins>+      mLevelZeroTexture(nullptr),
+      mLevelZeroRenderTarget(nullptr),
+      mUseLevelZeroTexture(false),
+      mSwizzleTexture(nullptr)
</ins><span class="cx"> {
</span><span class="cx">     mTexture-&gt;AddRef();
</span><span class="cx"> 
</span><span class="cx">     for (unsigned int i = 0; i &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
</span><span class="cx">     {
</span><del>-        mAssociatedImages[i] = NULL;
-        mRenderTarget[i] = NULL;
-        mSwizzleRenderTargets[i] = NULL;
</del><ins>+        mAssociatedImages[i]     = nullptr;
+        mRenderTarget[i]         = nullptr;
+        mSwizzleRenderTargets[i] = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     D3D11_TEXTURE2D_DESC texDesc;
</span><span class="cx">     mTexture-&gt;GetDesc(&amp;texDesc);
</span><del>-    mMipLevels = texDesc.MipLevels;
-    mTextureFormat = texDesc.Format;
-    mTextureWidth = texDesc.Width;
</del><ins>+    mMipLevels     = texDesc.MipLevels;
+    mTextureWidth  = texDesc.Width;
</ins><span class="cx">     mTextureHeight = texDesc.Height;
</span><del>-    mTextureDepth = 1;
</del><ins>+    mTextureDepth  = 1;
+    mHasKeyedMutex = (texDesc.MiscFlags &amp; D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) != 0;
</ins><span class="cx"> 
</span><del>-    mInternalFormat = swapchain-&gt;GetBackBufferInternalFormat();
</del><ins>+    mInternalFormat = swapchain-&gt;GetRenderTargetInternalFormat();
</ins><span class="cx"> 
</span><del>-    ID3D11ShaderResourceView *srv = swapchain-&gt;getRenderTargetShaderResource();
-    D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
-    srv-&gt;GetDesc(&amp;srvDesc);
-    mShaderResourceFormat = srvDesc.Format;
-
-    ID3D11RenderTargetView* offscreenRTV = swapchain-&gt;getRenderTarget();
-    D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
-    offscreenRTV-&gt;GetDesc(&amp;rtvDesc);
-    mRenderTargetFormat = rtvDesc.Format;
-
-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mTextureFormat);
-    const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(dxgiFormatInfo.internalFormat, mRenderer-&gt;getFeatureLevel());
-    mSwizzleTextureFormat = formatInfo.swizzleTexFormat;
-    mSwizzleShaderResourceFormat = formatInfo.swizzleSRVFormat;
-    mSwizzleRenderTargetFormat = formatInfo.swizzleRTVFormat;
-
-    mDepthStencilFormat = DXGI_FORMAT_UNKNOWN;
-
-    initializeSerials(1, 1);
</del><ins>+    const auto &amp;formatInfo =
+        d3d11::GetTextureFormatInfo(mInternalFormat, mRenderer-&gt;getRenderer11DeviceCaps());
+    mTextureFormatSet = formatInfo.formatSet;
+    mSwizzleFormatSet = formatInfo.swizzleFormatSet;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly)
-    : TextureStorage11(renderer,
-                       GetTextureBindFlags(internalformat, renderer-&gt;getFeatureLevel(), renderTarget),
-                       GetTextureMiscFlags(internalformat, renderer-&gt;getFeatureLevel(), renderTarget, levels)),
-      mTexture(NULL),
-      mSwizzleTexture(NULL),
-      mLevelZeroTexture(NULL),
-      mLevelZeroRenderTarget(NULL),
-      mUseLevelZeroTexture(false)
</del><ins>+TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer,
+                                         GLenum internalformat,
+                                         bool renderTarget,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         int levels,
+                                         bool hintLevelZeroOnly)
+    : TextureStorage11(
+          renderer,
+          GetTextureBindFlags(internalformat, renderer-&gt;getRenderer11DeviceCaps(), renderTarget),
+          GetTextureMiscFlags(internalformat,
+                              renderer-&gt;getRenderer11DeviceCaps(),
+                              renderTarget,
+                              levels)),
+      mTexture(nullptr),
+      mHasKeyedMutex(false),
+      mLevelZeroTexture(nullptr),
+      mLevelZeroRenderTarget(nullptr),
+      mUseLevelZeroTexture(hintLevelZeroOnly &amp;&amp; levels &gt; 1),
+      mSwizzleTexture(nullptr)
</ins><span class="cx"> {
</span><span class="cx">     for (unsigned int i = 0; i &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
</span><span class="cx">     {
</span><del>-        mAssociatedImages[i] = NULL;
-        mRenderTarget[i] = NULL;
-        mSwizzleRenderTargets[i] = NULL;
</del><ins>+        mAssociatedImages[i]     = nullptr;
+        mRenderTarget[i]         = nullptr;
+        mSwizzleRenderTargets[i] = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mInternalFormat = internalformat;
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer-&gt;getFeatureLevel());
-    mTextureFormat = formatInfo.texFormat;
-    mShaderResourceFormat = formatInfo.srvFormat;
-    mDepthStencilFormat = formatInfo.dsvFormat;
-    mRenderTargetFormat = formatInfo.rtvFormat;
-    mSwizzleTextureFormat = formatInfo.swizzleTexFormat;
-    mSwizzleShaderResourceFormat = formatInfo.swizzleSRVFormat;
-    mSwizzleRenderTargetFormat = formatInfo.swizzleRTVFormat;
</del><ins>+    const d3d11::TextureFormat &amp;formatInfo =
+        d3d11::GetTextureFormatInfo(internalformat, renderer-&gt;getRenderer11DeviceCaps());
+    mTextureFormatSet = formatInfo.formatSet;
+    mSwizzleFormatSet = formatInfo.swizzleFormatSet;
</ins><span class="cx"> 
</span><del>-    d3d11::MakeValidSize(false, mTextureFormat, &amp;width, &amp;height, &amp;mTopLevel);
-    mMipLevels = mTopLevel + levels;
-    mTextureWidth = width;
</del><ins>+    d3d11::MakeValidSize(false, mTextureFormatSet-&gt;texFormat, &amp;width, &amp;height, &amp;mTopLevel);
+    mMipLevels     = mTopLevel + levels;
+    mTextureWidth  = width;
</ins><span class="cx">     mTextureHeight = height;
</span><del>-    mTextureDepth = 1;
</del><ins>+    mTextureDepth  = 1;
</ins><span class="cx"> 
</span><del>-    if (hintLevelZeroOnly &amp;&amp; levels &gt; 1)
-    {
-        //The LevelZeroOnly hint should only be true if the zero max LOD workaround is active.
-        ASSERT(mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround);
-        mUseLevelZeroTexture = true;
-    }
-
-    initializeSerials(getLevelCount(), 1);
</del><ins>+    // The LevelZeroOnly hint should only be true if the zero max LOD workaround is active.
+    ASSERT(!mUseLevelZeroTexture || mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureStorage11_2D::~TextureStorage11_2D()
</span><span class="cx"> {
</span><span class="cx">     for (unsigned i = 0; i &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
</span><span class="cx">     {
</span><del>-        if (mAssociatedImages[i] != NULL)
</del><ins>+        if (mAssociatedImages[i] != nullptr)
</ins><span class="cx">         {
</span><span class="cx">             bool imageAssociationCorrect = mAssociatedImages[i]-&gt;isAssociatedStorageValid(this);
</span><span class="cx">             ASSERT(imageAssociationCorrect);
</span><span class="cx"> 
</span><span class="cx">             if (imageAssociationCorrect)
</span><span class="cx">             {
</span><del>-                // We must let the Images recover their data before we delete it from the TextureStorage.
</del><ins>+                // We must let the Images recover their data before we delete it from the
+                // TextureStorage.
</ins><span class="cx">                 gl::Error error = mAssociatedImages[i]-&gt;recoverFromAssociatedStorage();
</span><span class="cx">                 if (error.isError())
</span><span class="cx">                 {
</span><span class="lines">@@ -797,19 +887,26 @@
</span><span class="cx">         SafeDelete(mRenderTarget[i]);
</span><span class="cx">         SafeRelease(mSwizzleRenderTargets[i]);
</span><span class="cx">     }
</span><ins>+
+    if (mHasKeyedMutex)
+    {
+        // If the keyed mutex is released that will unbind it and cause the state cache to become
+        // desynchronized.
+        mRenderer-&gt;getStateManager()-&gt;invalidateBoundViews();
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureStorage11_2D::copyToStorage(TextureStorage *destStorage)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(destStorage);
</span><span class="cx"> 
</span><del>-    TextureStorage11_2D *dest11 = GetAs&lt;TextureStorage11_2D&gt;(destStorage);
</del><ins>+    TextureStorage11_2D *dest11           = GetAs&lt;TextureStorage11_2D&gt;(destStorage);
+    ID3D11DeviceContext *immediateContext = mRenderer-&gt;getDeviceContext();
</ins><span class="cx"> 
</span><span class="cx">     if (mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround)
</span><span class="cx">     {
</span><del>-        ID3D11DeviceContext *immediateContext = mRenderer-&gt;getDeviceContext();
-
-        // If either mTexture or mLevelZeroTexture exist, then we need to copy them into the corresponding textures in destStorage.
</del><ins>+        // If either mTexture or mLevelZeroTexture exist, then we need to copy them into the
+        // corresponding textures in destStorage.
</ins><span class="cx">         if (mTexture)
</span><span class="cx">         {
</span><span class="cx">             gl::Error error = dest11-&gt;useLevelZeroWorkaroundTexture(false);
</span><span class="lines">@@ -818,7 +915,7 @@
</span><span class="cx">                 return error;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            ID3D11Resource *destResource = NULL;
</del><ins>+            ID3D11Resource *destResource = nullptr;
</ins><span class="cx">             error = dest11-&gt;getResource(&amp;destResource);
</span><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="lines">@@ -836,7 +933,7 @@
</span><span class="cx">                 return error;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            ID3D11Resource *destResource = NULL;
</del><ins>+            ID3D11Resource *destResource = nullptr;
</ins><span class="cx">             error = dest11-&gt;getResource(&amp;destResource);
</span><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="lines">@@ -845,34 +942,36 @@
</span><span class="cx"> 
</span><span class="cx">             immediateContext-&gt;CopyResource(destResource, mLevelZeroTexture);
</span><span class="cx">         }
</span><ins>+
+        return gl::Error(GL_NO_ERROR);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        ID3D11Resource *sourceResouce = NULL;
</del><ins>+        ID3D11Resource *sourceResouce = nullptr;
</ins><span class="cx">         gl::Error error = getResource(&amp;sourceResouce);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        ID3D11Resource *destResource = NULL;
</del><ins>+        ID3D11Resource *destResource = nullptr;
</ins><span class="cx">         error = dest11-&gt;getResource(&amp;destResource);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        ID3D11DeviceContext *immediateContext = mRenderer-&gt;getDeviceContext();
</del><span class="cx">         immediateContext-&gt;CopyResource(destResource, sourceResouce);
</span><ins>+        dest11-&gt;invalidateSwizzleCache();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    dest11-&gt;invalidateSwizzleCache();
-
</del><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureStorage11_2D::useLevelZeroWorkaroundTexture(bool useLevelZeroTexture)
</span><span class="cx"> {
</span><ins>+    bool lastSetting = mUseLevelZeroTexture;
+
</ins><span class="cx">     if (useLevelZeroTexture &amp;&amp; mMipLevels &gt; 1)
</span><span class="cx">     {
</span><span class="cx">         if (!mUseLevelZeroTexture &amp;&amp; mTexture)
</span><span class="lines">@@ -886,7 +985,7 @@
</span><span class="cx">             // Pull data back from the mipped texture if necessary.
</span><span class="cx">             ASSERT(mLevelZeroTexture);
</span><span class="cx">             ID3D11DeviceContext *context = mRenderer-&gt;getDeviceContext();
</span><del>-            context-&gt;CopySubresourceRegion(mLevelZeroTexture, 0, 0, 0, 0, mTexture, 0, NULL);
</del><ins>+            context-&gt;CopySubresourceRegion(mLevelZeroTexture, 0, 0, 0, 0, mTexture, 0, nullptr);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         mUseLevelZeroTexture = true;
</span><span class="lines">@@ -904,18 +1003,34 @@
</span><span class="cx">             // Pull data back from the level zero texture if necessary.
</span><span class="cx">             ASSERT(mTexture);
</span><span class="cx">             ID3D11DeviceContext *context = mRenderer-&gt;getDeviceContext();
</span><del>-            context-&gt;CopySubresourceRegion(mTexture, 0, 0, 0, 0, mLevelZeroTexture, 0, NULL);
</del><ins>+            context-&gt;CopySubresourceRegion(mTexture, 0, 0, 0, 0, mLevelZeroTexture, 0, nullptr);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         mUseLevelZeroTexture = false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (lastSetting != mUseLevelZeroTexture)
+    {
+        // Mark everything as dirty to be conservative.
+        if (mLevelZeroRenderTarget)
+        {
+            mLevelZeroRenderTarget-&gt;signalDirty();
+        }
+        for (auto *renderTarget : mRenderTarget)
+        {
+            if (renderTarget)
+            {
+                renderTarget-&gt;signalDirty();
+            }
+        }
+    }
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TextureStorage11_2D::associateImage(Image11* image, const gl::ImageIndex &amp;index)
</del><ins>+void TextureStorage11_2D::associateImage(Image11 *image, const gl::ImageIndex &amp;index)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
</del><ins>+    const GLint level = index.mipIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
</span><span class="cx"> 
</span><span class="lines">@@ -925,13 +1040,15 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TextureStorage11_2D::isAssociatedImageValid(const gl::ImageIndex &amp;index, Image11* expectedImage)
</del><ins>+bool TextureStorage11_2D::isAssociatedImageValid(const gl::ImageIndex &amp;index,
+                                                 Image11 *expectedImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
</del><ins>+    const GLint level = index.mipIndex;
</ins><span class="cx"> 
</span><span class="cx">     if (0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
</span><span class="cx">     {
</span><del>-        // This validation check should never return false. It means the Image/TextureStorage association is broken.
</del><ins>+        // This validation check should never return false. It means the Image/TextureStorage
+        // association is broken.
</ins><span class="cx">         bool retValue = (mAssociatedImages[level] == expectedImage);
</span><span class="cx">         ASSERT(retValue);
</span><span class="cx">         return retValue;
</span><span class="lines">@@ -941,9 +1058,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // disassociateImage allows an Image to end its association with a Storage.
</span><del>-void TextureStorage11_2D::disassociateImage(const gl::ImageIndex &amp;index, Image11* expectedImage)
</del><ins>+void TextureStorage11_2D::disassociateImage(const gl::ImageIndex &amp;index, Image11 *expectedImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
</del><ins>+    const GLint level = index.mipIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
</span><span class="cx"> 
</span><span class="lines">@@ -953,31 +1070,34 @@
</span><span class="cx"> 
</span><span class="cx">         if (mAssociatedImages[level] == expectedImage)
</span><span class="cx">         {
</span><del>-            mAssociatedImages[level] = NULL;
</del><ins>+            mAssociatedImages[level] = nullptr;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image recover its data before ending the association.
-gl::Error TextureStorage11_2D::releaseAssociatedImage(const gl::ImageIndex &amp;index, Image11* incomingImage)
</del><ins>+// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image
+// recover its data before ending the association.
+gl::Error TextureStorage11_2D::releaseAssociatedImage(const gl::ImageIndex &amp;index,
+                                                      Image11 *incomingImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
</del><ins>+    const GLint level = index.mipIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
</span><span class="cx"> 
</span><span class="cx">     if (0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
</span><span class="cx">     {
</span><span class="cx">         // No need to let the old Image recover its data, if it is also the incoming Image.
</span><del>-        if (mAssociatedImages[level] != NULL &amp;&amp; mAssociatedImages[level] != incomingImage)
</del><ins>+        if (mAssociatedImages[level] != nullptr &amp;&amp; mAssociatedImages[level] != incomingImage)
</ins><span class="cx">         {
</span><del>-            // Ensure that the Image is still associated with this TextureStorage. This should be true.
</del><ins>+            // Ensure that the Image is still associated with this TextureStorage. This should be
+            // true.
</ins><span class="cx">             bool imageAssociationCorrect = mAssociatedImages[level]-&gt;isAssociatedStorageValid(this);
</span><span class="cx">             ASSERT(imageAssociationCorrect);
</span><span class="cx"> 
</span><span class="cx">             if (imageAssociationCorrect)
</span><span class="cx">             {
</span><span class="cx">                 // Force the image to recover from storage before its data is overwritten.
</span><del>-                // This will reset mAssociatedImages[level] to NULL too.
</del><ins>+                // This will reset mAssociatedImages[level] to nullptr too.
</ins><span class="cx">                 gl::Error error = mAssociatedImages[level]-&gt;recoverFromAssociatedStorage();
</span><span class="cx">                 if (error.isError())
</span><span class="cx">                 {
</span><span class="lines">@@ -1034,43 +1154,49 @@
</span><span class="cx"> gl::Error TextureStorage11_2D::ensureTextureExists(int mipLevels)
</span><span class="cx"> {
</span><span class="cx">     // If mMipLevels = 1 then always use mTexture rather than mLevelZeroTexture.
</span><del>-    bool useLevelZeroTexture = mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround ? (mipLevels == 1) &amp;&amp; (mMipLevels &gt; 1) : false;
</del><ins>+    bool useLevelZeroTexture = mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround
+                                   ? (mipLevels == 1) &amp;&amp; (mMipLevels &gt; 1)
+                                   : false;
</ins><span class="cx">     ID3D11Texture2D **outputTexture = useLevelZeroTexture ? &amp;mLevelZeroTexture : &amp;mTexture;
</span><span class="cx"> 
</span><span class="cx">     // if the width or height is not positive this should be treated as an incomplete texture
</span><span class="cx">     // we handle that here by skipping the d3d texture creation
</span><del>-    if (*outputTexture == NULL &amp;&amp; mTextureWidth &gt; 0 &amp;&amp; mTextureHeight &gt; 0)
</del><ins>+    if (*outputTexture == nullptr &amp;&amp; mTextureWidth &gt; 0 &amp;&amp; mTextureHeight &gt; 0)
</ins><span class="cx">     {
</span><span class="cx">         ASSERT(mipLevels &gt; 0);
</span><span class="cx"> 
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_TEXTURE2D_DESC desc;
</span><del>-        desc.Width = mTextureWidth;      // Compressed texture size constraints?
-        desc.Height = mTextureHeight;
-        desc.MipLevels = mipLevels;
-        desc.ArraySize = 1;
-        desc.Format = mTextureFormat;
-        desc.SampleDesc.Count = 1;
</del><ins>+        desc.Width              = mTextureWidth;  // Compressed texture size constraints?
+        desc.Height             = mTextureHeight;
+        desc.MipLevels          = mipLevels;
+        desc.ArraySize          = 1;
+        desc.Format             = mTextureFormatSet-&gt;texFormat;
+        desc.SampleDesc.Count   = 1;
</ins><span class="cx">         desc.SampleDesc.Quality = 0;
</span><del>-        desc.Usage = D3D11_USAGE_DEFAULT;
-        desc.BindFlags = getBindFlags();
-        desc.CPUAccessFlags = 0;
-        desc.MiscFlags = getMiscFlags();
</del><ins>+        desc.Usage              = D3D11_USAGE_DEFAULT;
+        desc.BindFlags          = getBindFlags();
+        desc.CPUAccessFlags     = 0;
+        desc.MiscFlags          = getMiscFlags();
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, NULL, outputTexture);
</del><ins>+        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, nullptr, outputTexture);
</ins><span class="cx"> 
</span><span class="cx">         // this can happen from windows TDR
</span><span class="cx">         if (d3d11::isDeviceLostError(result))
</span><span class="cx">         {
</span><span class="cx">             mRenderer-&gt;notifyDeviceLost();
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create 2D texture storage, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create 2D texture storage, result: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><span class="cx">         else if (FAILED(result))
</span><span class="cx">         {
</span><span class="cx">             ASSERT(result == E_OUTOFMEMORY);
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create 2D texture storage, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create 2D texture storage, result: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><ins>+
+        d3d11::SetDebugName(*outputTexture, &quot;TexStorage2D.Texture&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="lines">@@ -1080,131 +1206,155 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!index.hasLayer());
</span><span class="cx"> 
</span><del>-    int level = index.mipIndex;
</del><ins>+    const int level = index.mipIndex;
</ins><span class="cx">     ASSERT(level &gt;= 0 &amp;&amp; level &lt; getLevelCount());
</span><span class="cx"> 
</span><del>-    // In GL ES 2.0, the application can only render to level zero of the texture (Section 4.4.3 of the GLES 2.0 spec, page 113 of version 2.0.25).
-    // Other parts of TextureStorage11_2D could create RTVs on non-zero levels of the texture (e.g. generateMipmap).
-    // On Feature Level 9_3, this is unlikely to be useful. The renderer can't create SRVs on the individual levels of the texture,
-    // so methods like generateMipmap can't do anything useful with non-zero-level RTVs.
-    // Therefore if level &gt; 0 on 9_3 then there's almost certainly something wrong.
-    ASSERT(!(mRenderer-&gt;getFeatureLevel() &lt;= D3D_FEATURE_LEVEL_9_3 &amp;&amp; level &gt; 0));
</del><ins>+    // In GL ES 2.0, the application can only render to level zero of the texture (Section 4.4.3 of
+    // the GLES 2.0 spec, page 113 of version 2.0.25). Other parts of TextureStorage11_2D could
+    // create RTVs on non-zero levels of the texture (e.g. generateMipmap).
+    // On Feature Level 9_3, this is unlikely to be useful. The renderer can't create SRVs on the
+    // individual levels of the texture, so methods like generateMipmap can't do anything useful
+    // with non-zero-level RTVs. Therefore if level &gt; 0 on 9_3 then there's almost certainly
+    // something wrong.
+    ASSERT(
+        !(mRenderer-&gt;getRenderer11DeviceCaps().featureLevel &lt;= D3D_FEATURE_LEVEL_9_3 &amp;&amp; level &gt; 0));
+    ASSERT(outRT);
+    if (mRenderTarget[level])
+    {
+        *outRT = mRenderTarget[level];
+        return gl::Error(GL_NO_ERROR);
+    }
</ins><span class="cx"> 
</span><del>-    if (!mRenderTarget[level])
</del><ins>+    ID3D11Resource *texture = nullptr;
+    gl::Error error = getResource(&amp;texture);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        ID3D11Resource *texture = NULL;
-        gl::Error error = getResource(&amp;texture);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+        return error;
+    }
</ins><span class="cx"> 
</span><del>-        ID3D11ShaderResourceView *srv = NULL;
-        error = getSRVLevel(level, &amp;srv);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+    ID3D11ShaderResourceView *srv = nullptr;
+    error = getSRVLevel(level, false, &amp;srv);
+    if (error.isError())
+    {
+        return error;
+    }
</ins><span class="cx"> 
</span><del>-        if (mUseLevelZeroTexture)
-        {
-            if (!mLevelZeroRenderTarget)
-            {
-                ID3D11Device *device = mRenderer-&gt;getDevice();
</del><ins>+    ID3D11ShaderResourceView *blitSRV = nullptr;
+    error = getSRVLevel(level, true, &amp;blitSRV);
+    if (error.isError())
+    {
+        return error;
+    }
</ins><span class="cx"> 
</span><del>-                D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
-                rtvDesc.Format = mRenderTargetFormat;
-                rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
-                rtvDesc.Texture2D.MipSlice = mTopLevel + level;
</del><ins>+    ID3D11Device *device = mRenderer-&gt;getDevice();
</ins><span class="cx"> 
</span><del>-                ID3D11RenderTargetView *rtv;
-                HRESULT result = device-&gt;CreateRenderTargetView(mLevelZeroTexture, &amp;rtvDesc, &amp;rtv);
-
-                if (result == E_OUTOFMEMORY)
-                {
-                    return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal render target view for texture storage, result: 0x%X.&quot;, result);
-                }
-                ASSERT(SUCCEEDED(result));
-
-                mLevelZeroRenderTarget = new TextureRenderTarget11(rtv, mLevelZeroTexture, NULL, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
-
-                // RenderTarget will take ownership of these resources
-                SafeRelease(rtv);
-            }
-
-            ASSERT(outRT);
-            *outRT = mLevelZeroRenderTarget;
-            return gl::Error(GL_NO_ERROR);
-        }
-
-        if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN)
</del><ins>+    if (mUseLevelZeroTexture)
+    {
+        if (!mLevelZeroRenderTarget)
</ins><span class="cx">         {
</span><del>-            ID3D11Device *device = mRenderer-&gt;getDevice();
-
</del><span class="cx">             D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-            rtvDesc.Format = mRenderTargetFormat;
-            rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
</del><ins>+            rtvDesc.Format             = mTextureFormatSet-&gt;rtvFormat;
+            rtvDesc.ViewDimension      = D3D11_RTV_DIMENSION_TEXTURE2D;
</ins><span class="cx">             rtvDesc.Texture2D.MipSlice = mTopLevel + level;
</span><span class="cx"> 
</span><span class="cx">             ID3D11RenderTargetView *rtv;
</span><del>-            HRESULT result = device-&gt;CreateRenderTargetView(texture, &amp;rtvDesc, &amp;rtv);
</del><ins>+            HRESULT result = device-&gt;CreateRenderTargetView(mLevelZeroTexture, &amp;rtvDesc, &amp;rtv);
</ins><span class="cx"> 
</span><del>-            ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
-            if (FAILED(result))
</del><ins>+            if (result == E_OUTOFMEMORY)
</ins><span class="cx">             {
</span><del>-                return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal render target view for texture storage, result: 0x%X.&quot;, result);
</del><ins>+                return gl::Error(GL_OUT_OF_MEMORY,
+                                 &quot;Failed to create internal render target view for texture &quot;
+                                 &quot;storage, result: 0x%X.&quot;,
+                                 result);
</ins><span class="cx">             }
</span><ins>+            ASSERT(SUCCEEDED(result));
</ins><span class="cx"> 
</span><del>-            mRenderTarget[level] = new TextureRenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
</del><ins>+            mLevelZeroRenderTarget = new TextureRenderTarget11(
+                rtv, mLevelZeroTexture, nullptr, nullptr, mInternalFormat,
+                mTextureFormatSet-&gt;format, getLevelWidth(level), getLevelHeight(level), 1, 0);
</ins><span class="cx"> 
</span><span class="cx">             // RenderTarget will take ownership of these resources
</span><span class="cx">             SafeRelease(rtv);
</span><span class="cx">         }
</span><del>-        else if (mDepthStencilFormat != DXGI_FORMAT_UNKNOWN)
-        {
-            ID3D11Device *device = mRenderer-&gt;getDevice();
</del><span class="cx"> 
</span><del>-            D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
-            dsvDesc.Format = mDepthStencilFormat;
-            dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
-            dsvDesc.Texture2D.MipSlice = mTopLevel + level;
-            dsvDesc.Flags = 0;
</del><ins>+        *outRT = mLevelZeroRenderTarget;
+        return gl::Error(GL_NO_ERROR);
+    }
</ins><span class="cx"> 
</span><del>-            ID3D11DepthStencilView *dsv;
-            HRESULT result = device-&gt;CreateDepthStencilView(texture, &amp;dsvDesc, &amp;dsv);
</del><ins>+    if (mTextureFormatSet-&gt;rtvFormat != DXGI_FORMAT_UNKNOWN)
+    {
+        D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
+        rtvDesc.Format             = mTextureFormatSet-&gt;rtvFormat;
+        rtvDesc.ViewDimension      = D3D11_RTV_DIMENSION_TEXTURE2D;
+        rtvDesc.Texture2D.MipSlice = mTopLevel + level;
</ins><span class="cx"> 
</span><del>-            ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
-            if (FAILED(result))
-            {
-                return gl::Error(GL_OUT_OF_MEMORY,&quot;Failed to create internal depth stencil view for texture storage, result: 0x%X.&quot;, result);
-            }
</del><ins>+        ID3D11RenderTargetView *rtv;
+        HRESULT result = device-&gt;CreateRenderTargetView(texture, &amp;rtvDesc, &amp;rtv);
</ins><span class="cx"> 
</span><del>-            mRenderTarget[level] = new TextureRenderTarget11(dsv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
-
-            // RenderTarget will take ownership of these resources
-            SafeRelease(dsv);
-        }
-        else
</del><ins>+        ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
+        if (FAILED(result))
</ins><span class="cx">         {
</span><del>-            UNREACHABLE();
</del><ins>+            return gl::Error(
+                GL_OUT_OF_MEMORY,
+                &quot;Failed to create internal render target view for texture storage, result: 0x%X.&quot;,
+                result);
</ins><span class="cx">         }
</span><ins>+
+        mRenderTarget[level] = new TextureRenderTarget11(
+            rtv, texture, srv, blitSRV, mInternalFormat, mTextureFormatSet-&gt;format,
+            getLevelWidth(level), getLevelHeight(level), 1, 0);
+
+        // RenderTarget will take ownership of these resources
+        SafeRelease(rtv);
+
+        *outRT = mRenderTarget[level];
+        return gl::Error(GL_NO_ERROR);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(outRT);
</del><ins>+    ASSERT(mTextureFormatSet-&gt;dsvFormat != DXGI_FORMAT_UNKNOWN);
+
+    D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
+    dsvDesc.Format             = mTextureFormatSet-&gt;dsvFormat;
+    dsvDesc.ViewDimension      = D3D11_DSV_DIMENSION_TEXTURE2D;
+    dsvDesc.Texture2D.MipSlice = mTopLevel + level;
+    dsvDesc.Flags              = 0;
+
+    ID3D11DepthStencilView *dsv;
+    HRESULT result = device-&gt;CreateDepthStencilView(texture, &amp;dsvDesc, &amp;dsv);
+
+    ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
+    if (FAILED(result))
+    {
+        return gl::Error(
+            GL_OUT_OF_MEMORY,
+            &quot;Failed to create internal depth stencil view for texture storage, result: 0x%X.&quot;,
+            result);
+    }
+
+    mRenderTarget[level] =
+        new TextureRenderTarget11(dsv, texture, srv, mInternalFormat, mTextureFormatSet-&gt;format,
+                                  getLevelWidth(level), getLevelHeight(level), 1, 0);
+
+    // RenderTarget will take ownership of these resources
+    SafeRelease(dsv);
+
</ins><span class="cx">     *outRT = mRenderTarget[level];
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11_2D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
</del><ins>+gl::Error TextureStorage11_2D::createSRV(int baseLevel,
+                                         int mipLevels,
+                                         DXGI_FORMAT format,
+                                         ID3D11Resource *texture,
</ins><span class="cx">                                          ID3D11ShaderResourceView **outSRV) const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(outSRV);
</span><span class="cx"> 
</span><span class="cx">     D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
</span><del>-    srvDesc.Format = format;
-    srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
</del><ins>+    srvDesc.Format                    = format;
+    srvDesc.ViewDimension             = D3D11_SRV_DIMENSION_TEXTURE2D;
</ins><span class="cx">     srvDesc.Texture2D.MostDetailedMip = mTopLevel + baseLevel;
</span><del>-    srvDesc.Texture2D.MipLevels = mipLevels;
</del><ins>+    srvDesc.Texture2D.MipLevels       = mipLevels;
</ins><span class="cx"> 
</span><span class="cx">     ID3D11Resource *srvTexture = texture;
</span><span class="cx"> 
</span><span class="lines">@@ -1212,31 +1362,35 @@
</span><span class="cx">     {
</span><span class="cx">         ASSERT(mTopLevel == 0);
</span><span class="cx">         ASSERT(baseLevel == 0);
</span><del>-        // This code also assumes that the incoming texture equals either mLevelZeroTexture or mTexture.
</del><ins>+        // This code also assumes that the incoming texture equals either mLevelZeroTexture or
+        // mTexture.
</ins><span class="cx"> 
</span><span class="cx">         if (mipLevels == 1 &amp;&amp; mMipLevels &gt; 1)
</span><span class="cx">         {
</span><span class="cx">             // We must use a SRV on the level-zero-only texture.
</span><del>-            ASSERT(mLevelZeroTexture != NULL &amp;&amp; texture == mLevelZeroTexture);
</del><ins>+            ASSERT(mLevelZeroTexture != nullptr &amp;&amp; texture == mLevelZeroTexture);
</ins><span class="cx">             srvTexture = mLevelZeroTexture;
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="cx">             ASSERT(mipLevels == static_cast&lt;int&gt;(mMipLevels));
</span><del>-            ASSERT(mTexture != NULL &amp;&amp; texture == mTexture);
</del><ins>+            ASSERT(mTexture != nullptr &amp;&amp; texture == mTexture);
</ins><span class="cx">             srvTexture = mTexture;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ID3D11Device *device = mRenderer-&gt;getDevice();
</span><del>-    HRESULT result = device-&gt;CreateShaderResourceView(srvTexture, &amp;srvDesc, outSRV);
</del><ins>+    HRESULT result       = device-&gt;CreateShaderResourceView(srvTexture, &amp;srvDesc, outSRV);
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">     if (FAILED(result))
</span><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal texture storage SRV, result: 0x%X.&quot;, result);
</del><ins>+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to create internal texture storage SRV, result: 0x%X.&quot;, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    d3d11::SetDebugName(*outSRV, &quot;TexStorage2D.SRV&quot;);
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1249,25 +1403,28 @@
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_TEXTURE2D_DESC desc;
</span><del>-        desc.Width = mTextureWidth;
-        desc.Height = mTextureHeight;
-        desc.MipLevels = mMipLevels;
-        desc.ArraySize = 1;
-        desc.Format = mSwizzleTextureFormat;
-        desc.SampleDesc.Count = 1;
</del><ins>+        desc.Width              = mTextureWidth;
+        desc.Height             = mTextureHeight;
+        desc.MipLevels          = mMipLevels;
+        desc.ArraySize          = 1;
+        desc.Format             = mSwizzleFormatSet-&gt;texFormat;
+        desc.SampleDesc.Count   = 1;
</ins><span class="cx">         desc.SampleDesc.Quality = 0;
</span><del>-        desc.Usage = D3D11_USAGE_DEFAULT;
-        desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
-        desc.CPUAccessFlags = 0;
-        desc.MiscFlags = 0;
</del><ins>+        desc.Usage              = D3D11_USAGE_DEFAULT;
+        desc.BindFlags          = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
+        desc.CPUAccessFlags     = 0;
+        desc.MiscFlags          = 0;
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, NULL, &amp;mSwizzleTexture);
</del><ins>+        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, nullptr, &amp;mSwizzleTexture);
</ins><span class="cx"> 
</span><span class="cx">         ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal swizzle texture, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal swizzle texture, result: 0x%X.&quot;, result);
</ins><span class="cx">         }
</span><ins>+
+        d3d11::SetDebugName(mSwizzleTexture, &quot;TexStorage2D.SwizzleTexture&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     *outTexture = mSwizzleTexture;
</span><span class="lines">@@ -1281,7 +1438,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!mSwizzleRenderTargets[mipLevel])
</span><span class="cx">     {
</span><del>-        ID3D11Resource *swizzleTexture = NULL;
</del><ins>+        ID3D11Resource *swizzleTexture = nullptr;
</ins><span class="cx">         gl::Error error = getSwizzleTexture(&amp;swizzleTexture);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="lines">@@ -1291,16 +1448,19 @@
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-        rtvDesc.Format = mSwizzleRenderTargetFormat;
-        rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
</del><ins>+        rtvDesc.Format             = mSwizzleFormatSet-&gt;rtvFormat;
+        rtvDesc.ViewDimension      = D3D11_RTV_DIMENSION_TEXTURE2D;
</ins><span class="cx">         rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel;
</span><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateRenderTargetView(mSwizzleTexture, &amp;rtvDesc, &amp;mSwizzleRenderTargets[mipLevel]);
</del><ins>+        HRESULT result = device-&gt;CreateRenderTargetView(mSwizzleTexture, &amp;rtvDesc,
+                                                        &amp;mSwizzleRenderTargets[mipLevel]);
</ins><span class="cx"> 
</span><span class="cx">         ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal swizzle render target view, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal swizzle render target view, result: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1308,60 +1468,349 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly)
-    : TextureStorage11(renderer,
-                       GetTextureBindFlags(internalformat, renderer-&gt;getFeatureLevel(), renderTarget),
-                       GetTextureMiscFlags(internalformat, renderer-&gt;getFeatureLevel(), renderTarget, levels))
</del><ins>+TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer, EGLImageD3D *eglImage)
+    : TextureStorage11(renderer, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, 0),
+      mImage(eglImage),
+      mCurrentRenderTarget(0),
+      mSwizzleTexture(nullptr),
+      mSwizzleRenderTargets(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS, nullptr)
</ins><span class="cx"> {
</span><del>-    mTexture = NULL;
-    mSwizzleTexture = NULL;
</del><ins>+    RenderTargetD3D *renderTargetD3D = nullptr;
+    mImage-&gt;getRenderTarget(&amp;renderTargetD3D);
+    RenderTarget11 *renderTarget11 = GetAs&lt;RenderTarget11&gt;(renderTargetD3D);
+    mCurrentRenderTarget           = reinterpret_cast&lt;uintptr_t&gt;(renderTarget11);
</ins><span class="cx"> 
</span><ins>+    mMipLevels      = 1;
+    mTextureFormatSet = &amp;d3d11::GetANGLEFormatSet(renderTarget11-&gt;getANGLEFormat());
+    mSwizzleFormatSet = &amp;d3d11::GetANGLEFormatSet(mTextureFormatSet-&gt;swizzleFormat);
+    mTextureWidth   = renderTarget11-&gt;getWidth();
+    mTextureHeight  = renderTarget11-&gt;getHeight();
+    mTextureDepth   = 1;
+    mInternalFormat = renderTarget11-&gt;getInternalFormat();
+}
+
+TextureStorage11_EGLImage::~TextureStorage11_EGLImage()
+{
+    SafeRelease(mSwizzleTexture);
+    for (size_t i = 0; i &lt; mSwizzleRenderTargets.size(); i++)
+    {
+        SafeRelease(mSwizzleRenderTargets[i]);
+    }
+}
+
+gl::Error TextureStorage11_EGLImage::getResource(ID3D11Resource **outResource)
+{
+    gl::Error error = checkForUpdatedRenderTarget();
+    if (error.isError())
+    {
+        return error;
+    }
+
+    RenderTarget11 *renderTarget11 = nullptr;
+    error = getImageRenderTarget(&amp;renderTarget11);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    *outResource = renderTarget11-&gt;getTexture();
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error TextureStorage11_EGLImage::getSRV(const gl::TextureState &amp;textureState,
+                                            ID3D11ShaderResourceView **outSRV)
+{
+    gl::Error error = checkForUpdatedRenderTarget();
+    if (error.isError())
+    {
+        return error;
+    }
+
+    return TextureStorage11::getSRV(textureState, outSRV);
+}
+
+gl::Error TextureStorage11_EGLImage::getMippedResource(ID3D11Resource **)
+{
+    // This shouldn't be called unless the zero max LOD workaround is active.
+    // EGL images are unavailable in this configuration.
+    UNREACHABLE();
+    return gl::Error(GL_INVALID_OPERATION);
+}
+
+gl::Error TextureStorage11_EGLImage::getRenderTarget(const gl::ImageIndex &amp;index,
+                                                     RenderTargetD3D **outRT)
+{
+    ASSERT(!index.hasLayer());
+    ASSERT(index.mipIndex == 0);
+    UNUSED_ASSERTION_VARIABLE(index);
+
+    gl::Error error = checkForUpdatedRenderTarget();
+    if (error.isError())
+    {
+        return error;
+    }
+
+    return mImage-&gt;getRenderTarget(outRT);
+}
+
+gl::Error TextureStorage11_EGLImage::copyToStorage(TextureStorage *destStorage)
+{
+    ID3D11Resource *sourceResouce = nullptr;
+    gl::Error error = getResource(&amp;sourceResouce);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    ASSERT(destStorage);
+    TextureStorage11_2D *dest11  = GetAs&lt;TextureStorage11_2D&gt;(destStorage);
+    ID3D11Resource *destResource = nullptr;
+    error = dest11-&gt;getResource(&amp;destResource);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    ID3D11DeviceContext *immediateContext = mRenderer-&gt;getDeviceContext();
+    immediateContext-&gt;CopyResource(destResource, sourceResouce);
+
+    dest11-&gt;invalidateSwizzleCache();
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+void TextureStorage11_EGLImage::associateImage(Image11 *, const gl::ImageIndex &amp;)
+{
+}
+
+void TextureStorage11_EGLImage::disassociateImage(const gl::ImageIndex &amp;, Image11 *)
+{
+}
+
+bool TextureStorage11_EGLImage::isAssociatedImageValid(const gl::ImageIndex &amp;, Image11 *)
+{
+    return false;
+}
+
+gl::Error TextureStorage11_EGLImage::releaseAssociatedImage(const gl::ImageIndex &amp;, Image11 *)
+{
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error TextureStorage11_EGLImage::useLevelZeroWorkaroundTexture(bool)
+{
+    UNREACHABLE();
+    return gl::Error(GL_INVALID_OPERATION);
+}
+
+gl::Error TextureStorage11_EGLImage::getSwizzleTexture(ID3D11Resource **outTexture)
+{
+    ASSERT(outTexture);
+
+    if (!mSwizzleTexture)
+    {
+        ID3D11Device *device = mRenderer-&gt;getDevice();
+
+        D3D11_TEXTURE2D_DESC desc;
+        desc.Width              = mTextureWidth;
+        desc.Height             = mTextureHeight;
+        desc.MipLevels          = mMipLevels;
+        desc.ArraySize          = 1;
+        desc.Format             = mSwizzleFormatSet-&gt;texFormat;
+        desc.SampleDesc.Count   = 1;
+        desc.SampleDesc.Quality = 0;
+        desc.Usage              = D3D11_USAGE_DEFAULT;
+        desc.BindFlags          = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
+        desc.CPUAccessFlags     = 0;
+        desc.MiscFlags          = 0;
+
+        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, nullptr, &amp;mSwizzleTexture);
+
+        ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
+        if (FAILED(result))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal swizzle texture, result: 0x%X.&quot;, result);
+        }
+
+        d3d11::SetDebugName(mSwizzleTexture, &quot;TexStorageEGLImage.SwizzleTexture&quot;);
+    }
+
+    *outTexture = mSwizzleTexture;
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error TextureStorage11_EGLImage::getSwizzleRenderTarget(int mipLevel,
+                                                            ID3D11RenderTargetView **outRTV)
+{
+    ASSERT(mipLevel &gt;= 0 &amp;&amp; mipLevel &lt; getLevelCount());
+    ASSERT(outRTV);
+
+    if (!mSwizzleRenderTargets[mipLevel])
+    {
+        ID3D11Resource *swizzleTexture = nullptr;
+        gl::Error error = getSwizzleTexture(&amp;swizzleTexture);
+        if (error.isError())
+        {
+            return error;
+        }
+
+        ID3D11Device *device = mRenderer-&gt;getDevice();
+
+        D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
+        rtvDesc.Format             = mSwizzleFormatSet-&gt;rtvFormat;
+        rtvDesc.ViewDimension      = D3D11_RTV_DIMENSION_TEXTURE2D;
+        rtvDesc.Texture2D.MipSlice = mTopLevel + mipLevel;
+
+        HRESULT result = device-&gt;CreateRenderTargetView(mSwizzleTexture, &amp;rtvDesc,
+                                                        &amp;mSwizzleRenderTargets[mipLevel]);
+
+        ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
+        if (FAILED(result))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal swizzle render target view, result: 0x%X.&quot;,
+                             result);
+        }
+    }
+
+    *outRTV = mSwizzleRenderTargets[mipLevel];
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error TextureStorage11_EGLImage::checkForUpdatedRenderTarget()
+{
+    RenderTarget11 *renderTarget11 = nullptr;
+    gl::Error error = getImageRenderTarget(&amp;renderTarget11);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (mCurrentRenderTarget != reinterpret_cast&lt;uintptr_t&gt;(renderTarget11))
+    {
+        clearSRVCache();
+        mCurrentRenderTarget = reinterpret_cast&lt;uintptr_t&gt;(renderTarget11);
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error TextureStorage11_EGLImage::createSRV(int baseLevel,
+                                               int mipLevels,
+                                               DXGI_FORMAT format,
+                                               ID3D11Resource *texture,
+                                               ID3D11ShaderResourceView **outSRV) const
+{
+    ASSERT(baseLevel == 0);
+    ASSERT(mipLevels == 1);
+    ASSERT(outSRV);
+
+    // Create a new SRV only for the swizzle texture.  Otherwise just return the Image's
+    // RenderTarget's SRV.
+    if (texture == mSwizzleTexture)
+    {
+        D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
+        srvDesc.Format                    = format;
+        srvDesc.ViewDimension             = D3D11_SRV_DIMENSION_TEXTURE2D;
+        srvDesc.Texture2D.MostDetailedMip = mTopLevel + baseLevel;
+        srvDesc.Texture2D.MipLevels       = mipLevels;
+
+        ID3D11Device *device = mRenderer-&gt;getDevice();
+        HRESULT result       = device-&gt;CreateShaderResourceView(texture, &amp;srvDesc, outSRV);
+
+        ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
+        if (FAILED(result))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal texture storage SRV, result: 0x%X.&quot;,
+                             result);
+        }
+
+        d3d11::SetDebugName(*outSRV, &quot;TexStorageEGLImage.SRV&quot;);
+    }
+    else
+    {
+        RenderTarget11 *renderTarget = nullptr;
+        gl::Error error = getImageRenderTarget(&amp;renderTarget);
+        if (error.isError())
+        {
+            return error;
+        }
+
+        ASSERT(texture == renderTarget-&gt;getTexture());
+
+        *outSRV = renderTarget-&gt;getShaderResourceView();
+        (*outSRV)-&gt;AddRef();
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error TextureStorage11_EGLImage::getImageRenderTarget(RenderTarget11 **outRT) const
+{
+    RenderTargetD3D *renderTargetD3D = nullptr;
+    gl::Error error = mImage-&gt;getRenderTarget(&amp;renderTargetD3D);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    *outRT = GetAs&lt;RenderTarget11&gt;(renderTargetD3D);
+    return gl::Error(GL_NO_ERROR);
+}
+
+TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer,
+                                             GLenum internalformat,
+                                             bool renderTarget,
+                                             int size,
+                                             int levels,
+                                             bool hintLevelZeroOnly)
+    : TextureStorage11(
+          renderer,
+          GetTextureBindFlags(internalformat, renderer-&gt;getRenderer11DeviceCaps(), renderTarget),
+          GetTextureMiscFlags(internalformat,
+                              renderer-&gt;getRenderer11DeviceCaps(),
+                              renderTarget,
+                              levels)),
+      mTexture(nullptr),
+      mLevelZeroTexture(nullptr),
+      mUseLevelZeroTexture(hintLevelZeroOnly &amp;&amp; levels &gt; 1),
+      mSwizzleTexture(nullptr)
+{
</ins><span class="cx">     for (unsigned int level = 0; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
</span><span class="cx">     {
</span><del>-        mSwizzleRenderTargets[level] = NULL;
</del><ins>+        mSwizzleRenderTargets[level] = nullptr;
</ins><span class="cx">         for (unsigned int face = 0; face &lt; CUBE_FACE_COUNT; face++)
</span><span class="cx">         {
</span><del>-            mAssociatedImages[face][level] = NULL;
-            mRenderTarget[face][level] = NULL;
</del><ins>+            mAssociatedImages[face][level] = nullptr;
+            mRenderTarget[face][level]     = nullptr;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mLevelZeroTexture = NULL;
-    mUseLevelZeroTexture = false;
-
</del><span class="cx">     for (unsigned int face = 0; face &lt; CUBE_FACE_COUNT; face++)
</span><span class="cx">     {
</span><del>-        mLevelZeroRenderTarget[face] = NULL;
</del><ins>+        mLevelZeroRenderTarget[face] = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mInternalFormat = internalformat;
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer-&gt;getFeatureLevel());
-    mTextureFormat = formatInfo.texFormat;
-    mShaderResourceFormat = formatInfo.srvFormat;
-    mDepthStencilFormat = formatInfo.dsvFormat;
-    mRenderTargetFormat = formatInfo.rtvFormat;
-    mSwizzleTextureFormat = formatInfo.swizzleTexFormat;
-    mSwizzleShaderResourceFormat = formatInfo.swizzleSRVFormat;
-    mSwizzleRenderTargetFormat = formatInfo.swizzleRTVFormat;
</del><ins>+    const d3d11::TextureFormat &amp;formatInfo =
+        d3d11::GetTextureFormatInfo(internalformat, renderer-&gt;getRenderer11DeviceCaps());
+    mTextureFormatSet = formatInfo.formatSet;
+    mSwizzleFormatSet = formatInfo.swizzleFormatSet;
</ins><span class="cx"> 
</span><span class="cx">     // adjust size if needed for compressed textures
</span><span class="cx">     int height = size;
</span><del>-    d3d11::MakeValidSize(false, mTextureFormat, &amp;size, &amp;height, &amp;mTopLevel);
</del><ins>+    d3d11::MakeValidSize(false, mTextureFormatSet-&gt;texFormat, &amp;size, &amp;height, &amp;mTopLevel);
</ins><span class="cx"> 
</span><del>-    mMipLevels = mTopLevel + levels;
-    mTextureWidth = size;
</del><ins>+    mMipLevels     = mTopLevel + levels;
+    mTextureWidth  = size;
</ins><span class="cx">     mTextureHeight = size;
</span><del>-    mTextureDepth = 1;
</del><ins>+    mTextureDepth  = 1;
</ins><span class="cx"> 
</span><del>-    if (hintLevelZeroOnly &amp;&amp; levels &gt; 1)
-    {
-        //The LevelZeroOnly hint should only be true if the zero max LOD workaround is active.
-        ASSERT(mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround);
-        mUseLevelZeroTexture = true;
-    }
-
-    initializeSerials(getLevelCount() * CUBE_FACE_COUNT, CUBE_FACE_COUNT);
</del><ins>+    // The LevelZeroOnly hint should only be true if the zero max LOD workaround is active.
+    ASSERT(!mUseLevelZeroTexture || mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureStorage11_Cube::~TextureStorage11_Cube()
</span><span class="lines">@@ -1370,14 +1819,16 @@
</span><span class="cx">     {
</span><span class="cx">         for (unsigned int face = 0; face &lt; CUBE_FACE_COUNT; face++)
</span><span class="cx">         {
</span><del>-            if (mAssociatedImages[face][level] != NULL)
</del><ins>+            if (mAssociatedImages[face][level] != nullptr)
</ins><span class="cx">             {
</span><del>-                bool imageAssociationCorrect = mAssociatedImages[face][level]-&gt;isAssociatedStorageValid(this);
</del><ins>+                bool imageAssociationCorrect =
+                    mAssociatedImages[face][level]-&gt;isAssociatedStorageValid(this);
</ins><span class="cx">                 ASSERT(imageAssociationCorrect);
</span><span class="cx"> 
</span><span class="cx">                 if (imageAssociationCorrect)
</span><span class="cx">                 {
</span><del>-                    // We must let the Images recover their data before we delete it from the TextureStorage.
</del><ins>+                    // We must let the Images recover their data before we delete it from the
+                    // TextureStorage.
</ins><span class="cx">                     mAssociatedImages[face][level]-&gt;recoverFromAssociatedStorage();
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="lines">@@ -1405,17 +1856,18 @@
</span><span class="cx"> 
</span><span class="cx"> UINT TextureStorage11_Cube::getSubresourceIndex(const gl::ImageIndex &amp;index) const
</span><span class="cx"> {
</span><del>-    if (mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround &amp;&amp; mUseLevelZeroTexture &amp;&amp; index.mipIndex == 0)
</del><ins>+    if (mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround &amp;&amp; mUseLevelZeroTexture &amp;&amp;
+        index.mipIndex == 0)
</ins><span class="cx">     {
</span><del>-        UINT arraySlice = static_cast&lt;UINT&gt;(index.hasLayer() ? index.layerIndex : 0);
</del><ins>+        UINT arraySlice  = static_cast&lt;UINT&gt;(index.hasLayer() ? index.layerIndex : 0);
</ins><span class="cx">         UINT subresource = D3D11CalcSubresource(0, arraySlice, 1);
</span><span class="cx">         ASSERT(subresource != std::numeric_limits&lt;UINT&gt;::max());
</span><span class="cx">         return subresource;
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        UINT mipSlice = static_cast&lt;UINT&gt;(index.mipIndex + mTopLevel);
-        UINT arraySlice = static_cast&lt;UINT&gt;(index.hasLayer() ? index.layerIndex : 0);
</del><ins>+        UINT mipSlice    = static_cast&lt;UINT&gt;(index.mipIndex + mTopLevel);
+        UINT arraySlice  = static_cast&lt;UINT&gt;(index.hasLayer() ? index.layerIndex : 0);
</ins><span class="cx">         UINT subresource = D3D11CalcSubresource(mipSlice, arraySlice, mMipLevels);
</span><span class="cx">         ASSERT(subresource != std::numeric_limits&lt;UINT&gt;::max());
</span><span class="cx">         return subresource;
</span><span class="lines">@@ -1432,7 +1884,8 @@
</span><span class="cx">     {
</span><span class="cx">         ID3D11DeviceContext *immediateContext = mRenderer-&gt;getDeviceContext();
</span><span class="cx"> 
</span><del>-        // If either mTexture or mLevelZeroTexture exist, then we need to copy them into the corresponding textures in destStorage.
</del><ins>+        // If either mTexture or mLevelZeroTexture exist, then we need to copy them into the
+        // corresponding textures in destStorage.
</ins><span class="cx">         if (mTexture)
</span><span class="cx">         {
</span><span class="cx">             gl::Error error = dest11-&gt;useLevelZeroWorkaroundTexture(false);
</span><span class="lines">@@ -1441,7 +1894,7 @@
</span><span class="cx">                 return error;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            ID3D11Resource *destResource = NULL;
</del><ins>+            ID3D11Resource *destResource = nullptr;
</ins><span class="cx">             error = dest11-&gt;getResource(&amp;destResource);
</span><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="lines">@@ -1459,7 +1912,7 @@
</span><span class="cx">                 return error;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            ID3D11Resource *destResource = NULL;
</del><ins>+            ID3D11Resource *destResource = nullptr;
</ins><span class="cx">             error = dest11-&gt;getResource(&amp;destResource);
</span><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="lines">@@ -1471,14 +1924,14 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        ID3D11Resource *sourceResouce = NULL;
</del><ins>+        ID3D11Resource *sourceResouce = nullptr;
</ins><span class="cx">         gl::Error error = getResource(&amp;sourceResouce);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        ID3D11Resource *destResource = NULL;
</del><ins>+        ID3D11Resource *destResource = nullptr;
</ins><span class="cx">         error = dest11-&gt;getResource(&amp;destResource);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="lines">@@ -1512,7 +1965,8 @@
</span><span class="cx"> 
</span><span class="cx">             for (int face = 0; face &lt; 6; face++)
</span><span class="cx">             {
</span><del>-                context-&gt;CopySubresourceRegion(mLevelZeroTexture, D3D11CalcSubresource(0, face, 1), 0, 0, 0, mTexture, face * mMipLevels, NULL);
</del><ins>+                context-&gt;CopySubresourceRegion(mLevelZeroTexture, D3D11CalcSubresource(0, face, 1),
+                                               0, 0, 0, mTexture, face * mMipLevels, nullptr);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1534,7 +1988,8 @@
</span><span class="cx"> 
</span><span class="cx">             for (int face = 0; face &lt; 6; face++)
</span><span class="cx">             {
</span><del>-                context-&gt;CopySubresourceRegion(mTexture, D3D11CalcSubresource(0, face, mMipLevels), 0, 0, 0, mLevelZeroTexture, face, NULL);
</del><ins>+                context-&gt;CopySubresourceRegion(mTexture, D3D11CalcSubresource(0, face, mMipLevels),
+                                               0, 0, 0, mLevelZeroTexture, face, nullptr);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1544,10 +1999,10 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TextureStorage11_Cube::associateImage(Image11* image, const gl::ImageIndex &amp;index)
</del><ins>+void TextureStorage11_Cube::associateImage(Image11 *image, const gl::ImageIndex &amp;index)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
-    GLint layerTarget = index.layerIndex;
</del><ins>+    const GLint level       = index.mipIndex;
+    const GLint layerTarget = index.layerIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
</span><span class="cx">     ASSERT(0 &lt;= layerTarget &amp;&amp; layerTarget &lt; CUBE_FACE_COUNT);
</span><span class="lines">@@ -1561,16 +2016,18 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TextureStorage11_Cube::isAssociatedImageValid(const gl::ImageIndex &amp;index, Image11* expectedImage)
</del><ins>+bool TextureStorage11_Cube::isAssociatedImageValid(const gl::ImageIndex &amp;index,
+                                                   Image11 *expectedImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
-    GLint layerTarget = index.layerIndex;
</del><ins>+    const GLint level       = index.mipIndex;
+    const GLint layerTarget = index.layerIndex;
</ins><span class="cx"> 
</span><span class="cx">     if (0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
</span><span class="cx">     {
</span><span class="cx">         if (0 &lt;= layerTarget &amp;&amp; layerTarget &lt; CUBE_FACE_COUNT)
</span><span class="cx">         {
</span><del>-            // This validation check should never return false. It means the Image/TextureStorage association is broken.
</del><ins>+            // This validation check should never return false. It means the Image/TextureStorage
+            // association is broken.
</ins><span class="cx">             bool retValue = (mAssociatedImages[layerTarget][level] == expectedImage);
</span><span class="cx">             ASSERT(retValue);
</span><span class="cx">             return retValue;
</span><span class="lines">@@ -1581,10 +2038,10 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // disassociateImage allows an Image to end its association with a Storage.
</span><del>-void TextureStorage11_Cube::disassociateImage(const gl::ImageIndex &amp;index, Image11* expectedImage)
</del><ins>+void TextureStorage11_Cube::disassociateImage(const gl::ImageIndex &amp;index, Image11 *expectedImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
-    GLint layerTarget = index.layerIndex;
</del><ins>+    const GLint level       = index.mipIndex;
+    const GLint layerTarget = index.layerIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
</span><span class="cx">     ASSERT(0 &lt;= layerTarget &amp;&amp; layerTarget &lt; CUBE_FACE_COUNT);
</span><span class="lines">@@ -1597,17 +2054,19 @@
</span><span class="cx"> 
</span><span class="cx">             if (mAssociatedImages[layerTarget][level] == expectedImage)
</span><span class="cx">             {
</span><del>-                mAssociatedImages[layerTarget][level] = NULL;
</del><ins>+                mAssociatedImages[layerTarget][level] = nullptr;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image recover its data before ending the association.
-gl::Error TextureStorage11_Cube::releaseAssociatedImage(const gl::ImageIndex &amp;index, Image11* incomingImage)
</del><ins>+// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image
+// recover its data before ending the association.
+gl::Error TextureStorage11_Cube::releaseAssociatedImage(const gl::ImageIndex &amp;index,
+                                                        Image11 *incomingImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
-    GLint layerTarget = index.layerIndex;
</del><ins>+    const GLint level       = index.mipIndex;
+    const GLint layerTarget = index.layerIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
</span><span class="cx">     ASSERT(0 &lt;= layerTarget &amp;&amp; layerTarget &lt; CUBE_FACE_COUNT);
</span><span class="lines">@@ -1617,17 +2076,21 @@
</span><span class="cx">         if (0 &lt;= layerTarget &amp;&amp; layerTarget &lt; CUBE_FACE_COUNT)
</span><span class="cx">         {
</span><span class="cx">             // No need to let the old Image recover its data, if it is also the incoming Image.
</span><del>-            if (mAssociatedImages[layerTarget][level] != NULL &amp;&amp; mAssociatedImages[layerTarget][level] != incomingImage)
</del><ins>+            if (mAssociatedImages[layerTarget][level] != nullptr &amp;&amp;
+                mAssociatedImages[layerTarget][level] != incomingImage)
</ins><span class="cx">             {
</span><del>-                // Ensure that the Image is still associated with this TextureStorage. This should be true.
-                bool imageAssociationCorrect = mAssociatedImages[layerTarget][level]-&gt;isAssociatedStorageValid(this);
</del><ins>+                // Ensure that the Image is still associated with this TextureStorage. This should
+                // be true.
+                bool imageAssociationCorrect =
+                    mAssociatedImages[layerTarget][level]-&gt;isAssociatedStorageValid(this);
</ins><span class="cx">                 ASSERT(imageAssociationCorrect);
</span><span class="cx"> 
</span><span class="cx">                 if (imageAssociationCorrect)
</span><span class="cx">                 {
</span><span class="cx">                     // Force the image to recover from storage before its data is overwritten.
</span><del>-                    // This will reset mAssociatedImages[level] to NULL too.
-                    gl::Error error = mAssociatedImages[layerTarget][level]-&gt;recoverFromAssociatedStorage();
</del><ins>+                    // This will reset mAssociatedImages[level] to nullptr too.
+                    gl::Error error =
+                        mAssociatedImages[layerTarget][level]-&gt;recoverFromAssociatedStorage();
</ins><span class="cx">                     if (error.isError())
</span><span class="cx">                     {
</span><span class="cx">                         return error;
</span><span class="lines">@@ -1684,53 +2147,96 @@
</span><span class="cx"> gl::Error TextureStorage11_Cube::ensureTextureExists(int mipLevels)
</span><span class="cx"> {
</span><span class="cx">     // If mMipLevels = 1 then always use mTexture rather than mLevelZeroTexture.
</span><del>-    bool useLevelZeroTexture = mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround ? (mipLevels == 1) &amp;&amp; (mMipLevels &gt; 1) : false;
</del><ins>+    bool useLevelZeroTexture = mRenderer-&gt;getWorkarounds().zeroMaxLodWorkaround
+                                   ? (mipLevels == 1) &amp;&amp; (mMipLevels &gt; 1)
+                                   : false;
</ins><span class="cx">     ID3D11Texture2D **outputTexture = useLevelZeroTexture ? &amp;mLevelZeroTexture : &amp;mTexture;
</span><span class="cx"> 
</span><span class="cx">     // if the size is not positive this should be treated as an incomplete texture
</span><span class="cx">     // we handle that here by skipping the d3d texture creation
</span><del>-    if (*outputTexture == NULL &amp;&amp; mTextureWidth &gt; 0 &amp;&amp; mTextureHeight &gt; 0)
</del><ins>+    if (*outputTexture == nullptr &amp;&amp; mTextureWidth &gt; 0 &amp;&amp; mTextureHeight &gt; 0)
</ins><span class="cx">     {
</span><span class="cx">         ASSERT(mMipLevels &gt; 0);
</span><span class="cx"> 
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_TEXTURE2D_DESC desc;
</span><del>-        desc.Width = mTextureWidth;
-        desc.Height = mTextureHeight;
-        desc.MipLevels = mipLevels;
-        desc.ArraySize = CUBE_FACE_COUNT;
-        desc.Format = mTextureFormat;
-        desc.SampleDesc.Count = 1;
</del><ins>+        desc.Width              = mTextureWidth;
+        desc.Height             = mTextureHeight;
+        desc.MipLevels          = mipLevels;
+        desc.ArraySize          = CUBE_FACE_COUNT;
+        desc.Format             = mTextureFormatSet-&gt;texFormat;
+        desc.SampleDesc.Count   = 1;
</ins><span class="cx">         desc.SampleDesc.Quality = 0;
</span><del>-        desc.Usage = D3D11_USAGE_DEFAULT;
-        desc.BindFlags = getBindFlags();
-        desc.CPUAccessFlags = 0;
-        desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE | getMiscFlags();
</del><ins>+        desc.Usage              = D3D11_USAGE_DEFAULT;
+        desc.BindFlags          = getBindFlags();
+        desc.CPUAccessFlags     = 0;
+        desc.MiscFlags          = D3D11_RESOURCE_MISC_TEXTURECUBE | getMiscFlags();
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, NULL, outputTexture);
</del><ins>+        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, nullptr, outputTexture);
</ins><span class="cx"> 
</span><span class="cx">         // this can happen from windows TDR
</span><span class="cx">         if (d3d11::isDeviceLostError(result))
</span><span class="cx">         {
</span><span class="cx">             mRenderer-&gt;notifyDeviceLost();
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create cube texture storage, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create cube texture storage, result: 0x%X.&quot;, result);
</ins><span class="cx">         }
</span><span class="cx">         else if (FAILED(result))
</span><span class="cx">         {
</span><span class="cx">             ASSERT(result == E_OUTOFMEMORY);
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create cube texture storage, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create cube texture storage, result: 0x%X.&quot;, result);
</ins><span class="cx">         }
</span><ins>+
+        d3d11::SetDebugName(*outputTexture, &quot;TexStorageCube.Texture&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT)
</del><ins>+gl::Error TextureStorage11_Cube::createRenderTargetSRV(ID3D11Resource *texture,
+                                                       const gl::ImageIndex &amp;index,
+                                                       DXGI_FORMAT resourceFormat,
+                                                       ID3D11ShaderResourceView **srv) const
</ins><span class="cx"> {
</span><del>-    int faceIndex = index.layerIndex;
-    int level = index.mipIndex;
</del><ins>+    ID3D11Device *device = mRenderer-&gt;getDevice();
+    D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
+    srvDesc.Format                         = resourceFormat;
+    srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + index.mipIndex;
+    srvDesc.Texture2DArray.MipLevels       = 1;
+    srvDesc.Texture2DArray.FirstArraySlice = index.layerIndex;
+    srvDesc.Texture2DArray.ArraySize       = 1;
</ins><span class="cx"> 
</span><ins>+    if (mRenderer-&gt;getRenderer11DeviceCaps().featureLevel &lt;= D3D_FEATURE_LEVEL_9_3)
+    {
+        srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
+    }
+    else
+    {
+        // Will be used with Texture2D sampler, not TextureCube
+        srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
+    }
+
+    HRESULT result = device-&gt;CreateShaderResourceView(texture, &amp;srvDesc, srv);
+
+    ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
+    if (FAILED(result))
+    {
+        return gl::Error(
+            GL_OUT_OF_MEMORY,
+            &quot;Failed to create internal shader resource view for texture storage, result: 0x%X.&quot;,
+            result);
+    }
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &amp;index,
+                                                 RenderTargetD3D **outRT)
+{
+    const int faceIndex = index.layerIndex;
+    const int level     = index.mipIndex;
+
</ins><span class="cx">     ASSERT(level &gt;= 0 &amp;&amp; level &lt; getLevelCount());
</span><span class="cx">     ASSERT(faceIndex &gt;= 0 &amp;&amp; faceIndex &lt; CUBE_FACE_COUNT);
</span><span class="cx"> 
</span><span class="lines">@@ -1739,7 +2245,7 @@
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx">         HRESULT result;
</span><span class="cx"> 
</span><del>-        ID3D11Resource *texture = NULL;
</del><ins>+        ID3D11Resource *texture = nullptr;
</ins><span class="cx">         gl::Error error = getResource(&amp;texture);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="lines">@@ -1751,22 +2257,27 @@
</span><span class="cx">             if (!mLevelZeroRenderTarget[faceIndex])
</span><span class="cx">             {
</span><span class="cx">                 D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-                rtvDesc.Format = mRenderTargetFormat;
-                rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
-                rtvDesc.Texture2DArray.MipSlice = mTopLevel + level;
</del><ins>+                rtvDesc.Format                         = mTextureFormatSet-&gt;rtvFormat;
+                rtvDesc.ViewDimension                  = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
+                rtvDesc.Texture2DArray.MipSlice        = mTopLevel + level;
</ins><span class="cx">                 rtvDesc.Texture2DArray.FirstArraySlice = faceIndex;
</span><del>-                rtvDesc.Texture2DArray.ArraySize = 1;
</del><ins>+                rtvDesc.Texture2DArray.ArraySize       = 1;
</ins><span class="cx"> 
</span><span class="cx">                 ID3D11RenderTargetView *rtv;
</span><span class="cx">                 result = device-&gt;CreateRenderTargetView(mLevelZeroTexture, &amp;rtvDesc, &amp;rtv);
</span><span class="cx"> 
</span><span class="cx">                 if (result == E_OUTOFMEMORY)
</span><span class="cx">                 {
</span><del>-                    return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal render target view for texture storage, result: 0x%X.&quot;, result);
</del><ins>+                    return gl::Error(GL_OUT_OF_MEMORY,
+                                     &quot;Failed to create internal render target view for texture &quot;
+                                     &quot;storage, result: 0x%X.&quot;,
+                                     result);
</ins><span class="cx">                 }
</span><span class="cx">                 ASSERT(SUCCEEDED(result));
</span><span class="cx"> 
</span><del>-                mLevelZeroRenderTarget[faceIndex] = new TextureRenderTarget11(rtv, mLevelZeroTexture, NULL, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
</del><ins>+                mLevelZeroRenderTarget[faceIndex] = new TextureRenderTarget11(
+                    rtv, mLevelZeroTexture, nullptr, nullptr, mInternalFormat,
+                    mTextureFormatSet-&gt;format, getLevelWidth(level), getLevelHeight(level), 1, 0);
</ins><span class="cx"> 
</span><span class="cx">                 // RenderTarget will take ownership of these resources
</span><span class="cx">                 SafeRelease(rtv);
</span><span class="lines">@@ -1777,39 +2288,39 @@
</span><span class="cx">             return gl::Error(GL_NO_ERROR);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
-        srvDesc.Format = mShaderResourceFormat;
-        srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + level;
-        srvDesc.Texture2DArray.MipLevels = 1;
-        srvDesc.Texture2DArray.FirstArraySlice = faceIndex;
-        srvDesc.Texture2DArray.ArraySize = 1;
-
-        if (mRenderer-&gt;getFeatureLevel() &lt;= D3D_FEATURE_LEVEL_9_3)
</del><ins>+        ID3D11ShaderResourceView *srv = nullptr;
+        error = createRenderTargetSRV(texture, index, mTextureFormatSet-&gt;srvFormat, &amp;srv);
+        if (error.isError())
</ins><span class="cx">         {
</span><del>-            srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
</del><ins>+            return error;
</ins><span class="cx">         }
</span><ins>+        ID3D11ShaderResourceView *blitSRV = nullptr;
+        if (mTextureFormatSet-&gt;blitSRVFormat != mTextureFormatSet-&gt;srvFormat)
+        {
+            error =
+                createRenderTargetSRV(texture, index, mTextureFormatSet-&gt;blitSRVFormat, &amp;blitSRV);
+            if (error.isError())
+            {
+                SafeRelease(srv);
+                return error;
+            }
+        }
</ins><span class="cx">         else
</span><span class="cx">         {
</span><del>-            srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; // Will be used with Texture2D sampler, not TextureCube
</del><ins>+            blitSRV = srv;
+            blitSRV-&gt;AddRef();
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        ID3D11ShaderResourceView *srv;
-        result = device-&gt;CreateShaderResourceView(texture, &amp;srvDesc, &amp;srv);
</del><ins>+        d3d11::SetDebugName(srv, &quot;TexStorageCube.RenderTargetSRV&quot;);
</ins><span class="cx"> 
</span><del>-        ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
-        if (FAILED(result))
</del><ins>+        if (mTextureFormatSet-&gt;rtvFormat != DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">         {
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal shader resource view for texture storage, result: 0x%X.&quot;, result);
-        }
-
-        if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN)
-        {
</del><span class="cx">             D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-            rtvDesc.Format = mRenderTargetFormat;
-            rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
-            rtvDesc.Texture2DArray.MipSlice = mTopLevel + level;
</del><ins>+            rtvDesc.Format                         = mTextureFormatSet-&gt;rtvFormat;
+            rtvDesc.ViewDimension                  = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
+            rtvDesc.Texture2DArray.MipSlice        = mTopLevel + level;
</ins><span class="cx">             rtvDesc.Texture2DArray.FirstArraySlice = faceIndex;
</span><del>-            rtvDesc.Texture2DArray.ArraySize = 1;
</del><ins>+            rtvDesc.Texture2DArray.ArraySize       = 1;
</ins><span class="cx"> 
</span><span class="cx">             ID3D11RenderTargetView *rtv;
</span><span class="cx">             result = device-&gt;CreateRenderTargetView(texture, &amp;rtvDesc, &amp;rtv);
</span><span class="lines">@@ -1818,24 +2329,33 @@
</span><span class="cx">             if (FAILED(result))
</span><span class="cx">             {
</span><span class="cx">                 SafeRelease(srv);
</span><del>-                return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal render target view for texture storage, result: 0x%X.&quot;, result);
</del><ins>+                SafeRelease(blitSRV);
+                return gl::Error(GL_OUT_OF_MEMORY,
+                                 &quot;Failed to create internal render target view for texture &quot;
+                                 &quot;storage, result: 0x%X.&quot;,
+                                 result);
</ins><span class="cx">             }
</span><span class="cx"> 
</span><del>-            mRenderTarget[faceIndex][level] = new TextureRenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
</del><ins>+            d3d11::SetDebugName(rtv, &quot;TexStorageCube.RenderTargetRTV&quot;);
</ins><span class="cx"> 
</span><ins>+            mRenderTarget[faceIndex][level] = new TextureRenderTarget11(
+                rtv, texture, srv, blitSRV, mInternalFormat, mTextureFormatSet-&gt;format,
+                getLevelWidth(level), getLevelHeight(level), 1, 0);
+
</ins><span class="cx">             // RenderTarget will take ownership of these resources
</span><span class="cx">             SafeRelease(rtv);
</span><span class="cx">             SafeRelease(srv);
</span><ins>+            SafeRelease(blitSRV);
</ins><span class="cx">         }
</span><del>-        else if (mDepthStencilFormat != DXGI_FORMAT_UNKNOWN)
</del><ins>+        else if (mTextureFormatSet-&gt;dsvFormat != DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">         {
</span><span class="cx">             D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
</span><del>-            dsvDesc.Format = mDepthStencilFormat;
-            dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
-            dsvDesc.Flags = 0;
-            dsvDesc.Texture2DArray.MipSlice = mTopLevel + level;
</del><ins>+            dsvDesc.Format                         = mTextureFormatSet-&gt;dsvFormat;
+            dsvDesc.ViewDimension                  = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
+            dsvDesc.Flags                          = 0;
+            dsvDesc.Texture2DArray.MipSlice        = mTopLevel + level;
</ins><span class="cx">             dsvDesc.Texture2DArray.FirstArraySlice = faceIndex;
</span><del>-            dsvDesc.Texture2DArray.ArraySize = 1;
</del><ins>+            dsvDesc.Texture2DArray.ArraySize       = 1;
</ins><span class="cx"> 
</span><span class="cx">             ID3D11DepthStencilView *dsv;
</span><span class="cx">             result = device-&gt;CreateDepthStencilView(texture, &amp;dsvDesc, &amp;dsv);
</span><span class="lines">@@ -1844,14 +2364,23 @@
</span><span class="cx">             if (FAILED(result))
</span><span class="cx">             {
</span><span class="cx">                 SafeRelease(srv);
</span><del>-                return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal depth stencil view for texture storage, result: 0x%X.&quot;, result);
</del><ins>+                SafeRelease(blitSRV);
+                return gl::Error(GL_OUT_OF_MEMORY,
+                                 &quot;Failed to create internal depth stencil view for texture &quot;
+                                 &quot;storage, result: 0x%X.&quot;,
+                                 result);
</ins><span class="cx">             }
</span><span class="cx"> 
</span><del>-            mRenderTarget[faceIndex][level] = new TextureRenderTarget11(dsv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
</del><ins>+            d3d11::SetDebugName(dsv, &quot;TexStorageCube.RenderTargetDSV&quot;);
</ins><span class="cx"> 
</span><ins>+            mRenderTarget[faceIndex][level] = new TextureRenderTarget11(
+                dsv, texture, srv, mInternalFormat, mTextureFormatSet-&gt;format, getLevelWidth(level),
+                getLevelHeight(level), 1, 0);
+
</ins><span class="cx">             // RenderTarget will take ownership of these resources
</span><span class="cx">             SafeRelease(dsv);
</span><span class="cx">             SafeRelease(srv);
</span><ins>+            SafeRelease(blitSRV);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="lines">@@ -1864,7 +2393,10 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11_Cube::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
</del><ins>+gl::Error TextureStorage11_Cube::createSRV(int baseLevel,
+                                           int mipLevels,
+                                           DXGI_FORMAT format,
+                                           ID3D11Resource *texture,
</ins><span class="cx">                                            ID3D11ShaderResourceView **outSRV) const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(outSRV);
</span><span class="lines">@@ -1872,20 +2404,21 @@
</span><span class="cx">     D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
</span><span class="cx">     srvDesc.Format = format;
</span><span class="cx"> 
</span><del>-    // Unnormalized integer cube maps are not supported by DX11; we emulate them as an array of six 2D textures
</del><ins>+    // Unnormalized integer cube maps are not supported by DX11; we emulate them as an array of six
+    // 2D textures
</ins><span class="cx">     const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(format);
</span><span class="cx">     if (dxgiFormatInfo.componentType == GL_INT || dxgiFormatInfo.componentType == GL_UNSIGNED_INT)
</span><span class="cx">     {
</span><del>-        srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
</del><ins>+        srvDesc.ViewDimension                  = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
</ins><span class="cx">         srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + baseLevel;
</span><del>-        srvDesc.Texture2DArray.MipLevels = 1;
</del><ins>+        srvDesc.Texture2DArray.MipLevels       = mipLevels;
</ins><span class="cx">         srvDesc.Texture2DArray.FirstArraySlice = 0;
</span><del>-        srvDesc.Texture2DArray.ArraySize = CUBE_FACE_COUNT;
</del><ins>+        srvDesc.Texture2DArray.ArraySize       = CUBE_FACE_COUNT;
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
-        srvDesc.TextureCube.MipLevels = mipLevels;
</del><ins>+        srvDesc.ViewDimension               = D3D11_SRV_DIMENSION_TEXTURECUBE;
+        srvDesc.TextureCube.MipLevels       = mipLevels;
</ins><span class="cx">         srvDesc.TextureCube.MostDetailedMip = mTopLevel + baseLevel;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1895,31 +2428,35 @@
</span><span class="cx">     {
</span><span class="cx">         ASSERT(mTopLevel == 0);
</span><span class="cx">         ASSERT(baseLevel == 0);
</span><del>-        // This code also assumes that the incoming texture equals either mLevelZeroTexture or mTexture.
</del><ins>+        // This code also assumes that the incoming texture equals either mLevelZeroTexture or
+        // mTexture.
</ins><span class="cx"> 
</span><span class="cx">         if (mipLevels == 1 &amp;&amp; mMipLevels &gt; 1)
</span><span class="cx">         {
</span><span class="cx">             // We must use a SRV on the level-zero-only texture.
</span><del>-            ASSERT(mLevelZeroTexture != NULL &amp;&amp; texture == mLevelZeroTexture);
</del><ins>+            ASSERT(mLevelZeroTexture != nullptr &amp;&amp; texture == mLevelZeroTexture);
</ins><span class="cx">             srvTexture = mLevelZeroTexture;
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="cx">             ASSERT(mipLevels == static_cast&lt;int&gt;(mMipLevels));
</span><del>-            ASSERT(mTexture != NULL &amp;&amp; texture == mTexture);
</del><ins>+            ASSERT(mTexture != nullptr &amp;&amp; texture == mTexture);
</ins><span class="cx">             srvTexture = mTexture;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ID3D11Device *device = mRenderer-&gt;getDevice();
</span><del>-    HRESULT result = device-&gt;CreateShaderResourceView(srvTexture, &amp;srvDesc, outSRV);
</del><ins>+    HRESULT result       = device-&gt;CreateShaderResourceView(srvTexture, &amp;srvDesc, outSRV);
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">     if (FAILED(result))
</span><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal texture storage SRV, result: 0x%X.&quot;, result);
</del><ins>+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to create internal texture storage SRV, result: 0x%X.&quot;, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    d3d11::SetDebugName(*outSRV, &quot;TexStorageCube.SRV&quot;);
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1932,39 +2469,43 @@
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_TEXTURE2D_DESC desc;
</span><del>-        desc.Width = mTextureWidth;
-        desc.Height = mTextureHeight;
-        desc.MipLevels = mMipLevels;
-        desc.ArraySize = CUBE_FACE_COUNT;
-        desc.Format = mSwizzleTextureFormat;
-        desc.SampleDesc.Count = 1;
</del><ins>+        desc.Width              = mTextureWidth;
+        desc.Height             = mTextureHeight;
+        desc.MipLevels          = mMipLevels;
+        desc.ArraySize          = CUBE_FACE_COUNT;
+        desc.Format             = mSwizzleFormatSet-&gt;texFormat;
+        desc.SampleDesc.Count   = 1;
</ins><span class="cx">         desc.SampleDesc.Quality = 0;
</span><del>-        desc.Usage = D3D11_USAGE_DEFAULT;
-        desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
-        desc.CPUAccessFlags = 0;
-        desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;
</del><ins>+        desc.Usage              = D3D11_USAGE_DEFAULT;
+        desc.BindFlags          = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
+        desc.CPUAccessFlags     = 0;
+        desc.MiscFlags          = D3D11_RESOURCE_MISC_TEXTURECUBE;
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, NULL, &amp;mSwizzleTexture);
</del><ins>+        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, nullptr, &amp;mSwizzleTexture);
</ins><span class="cx"> 
</span><span class="cx">         ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal swizzle texture, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal swizzle texture, result: 0x%X.&quot;, result);
</ins><span class="cx">         }
</span><ins>+
+        d3d11::SetDebugName(*outTexture, &quot;TexStorageCube.SwizzleTexture&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     *outTexture = mSwizzleTexture;
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV)
</del><ins>+gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel,
+                                                        ID3D11RenderTargetView **outRTV)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mipLevel &gt;= 0 &amp;&amp; mipLevel &lt; getLevelCount());
</span><span class="cx">     ASSERT(outRTV);
</span><span class="cx"> 
</span><span class="cx">     if (!mSwizzleRenderTargets[mipLevel])
</span><span class="cx">     {
</span><del>-        ID3D11Resource *swizzleTexture = NULL;
</del><ins>+        ID3D11Resource *swizzleTexture = nullptr;
</ins><span class="cx">         gl::Error error = getSwizzleTexture(&amp;swizzleTexture);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="lines">@@ -1974,18 +2515,21 @@
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-        rtvDesc.Format = mSwizzleRenderTargetFormat;
-        rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
-        rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
</del><ins>+        rtvDesc.Format                         = mSwizzleFormatSet-&gt;rtvFormat;
+        rtvDesc.ViewDimension                  = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
+        rtvDesc.Texture2DArray.MipSlice        = mTopLevel + mipLevel;
</ins><span class="cx">         rtvDesc.Texture2DArray.FirstArraySlice = 0;
</span><del>-        rtvDesc.Texture2DArray.ArraySize = CUBE_FACE_COUNT;
</del><ins>+        rtvDesc.Texture2DArray.ArraySize       = CUBE_FACE_COUNT;
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateRenderTargetView(mSwizzleTexture, &amp;rtvDesc, &amp;mSwizzleRenderTargets[mipLevel]);
</del><ins>+        HRESULT result = device-&gt;CreateRenderTargetView(mSwizzleTexture, &amp;rtvDesc,
+                                                        &amp;mSwizzleRenderTargets[mipLevel]);
</ins><span class="cx"> 
</span><span class="cx">         ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal swizzle render target view, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal swizzle render target view, result: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1993,56 +2537,60 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
-                                         GLsizei width, GLsizei height, GLsizei depth, int levels)
-    : TextureStorage11(renderer,
-                       GetTextureBindFlags(internalformat, renderer-&gt;getFeatureLevel(), renderTarget),
-                       GetTextureMiscFlags(internalformat, renderer-&gt;getFeatureLevel(), renderTarget, levels))
</del><ins>+TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer,
+                                         GLenum internalformat,
+                                         bool renderTarget,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth,
+                                         int levels)
+    : TextureStorage11(
+          renderer,
+          GetTextureBindFlags(internalformat, renderer-&gt;getRenderer11DeviceCaps(), renderTarget),
+          GetTextureMiscFlags(internalformat,
+                              renderer-&gt;getRenderer11DeviceCaps(),
+                              renderTarget,
+                              levels))
</ins><span class="cx"> {
</span><del>-    mTexture = NULL;
-    mSwizzleTexture = NULL;
</del><ins>+    mTexture        = nullptr;
+    mSwizzleTexture = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     for (unsigned int i = 0; i &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
</span><span class="cx">     {
</span><del>-        mAssociatedImages[i] = NULL;
-        mLevelRenderTargets[i] = NULL;
-        mSwizzleRenderTargets[i] = NULL;
</del><ins>+        mAssociatedImages[i]     = nullptr;
+        mLevelRenderTargets[i]   = nullptr;
+        mSwizzleRenderTargets[i] = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mInternalFormat = internalformat;
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer-&gt;getFeatureLevel());
-    mTextureFormat = formatInfo.texFormat;
-    mShaderResourceFormat = formatInfo.srvFormat;
-    mDepthStencilFormat = formatInfo.dsvFormat;
-    mRenderTargetFormat = formatInfo.rtvFormat;
-    mSwizzleTextureFormat = formatInfo.swizzleTexFormat;
-    mSwizzleShaderResourceFormat = formatInfo.swizzleSRVFormat;
-    mSwizzleRenderTargetFormat = formatInfo.swizzleRTVFormat;
</del><ins>+    const d3d11::TextureFormat &amp;formatInfo =
+        d3d11::GetTextureFormatInfo(internalformat, renderer-&gt;getRenderer11DeviceCaps());
+    mTextureFormatSet = formatInfo.formatSet;
+    mSwizzleFormatSet = formatInfo.swizzleFormatSet;
</ins><span class="cx"> 
</span><span class="cx">     // adjust size if needed for compressed textures
</span><del>-    d3d11::MakeValidSize(false, mTextureFormat, &amp;width, &amp;height, &amp;mTopLevel);
</del><ins>+    d3d11::MakeValidSize(false, mTextureFormatSet-&gt;texFormat, &amp;width, &amp;height, &amp;mTopLevel);
</ins><span class="cx"> 
</span><del>-    mMipLevels = mTopLevel + levels;
-    mTextureWidth = width;
</del><ins>+    mMipLevels     = mTopLevel + levels;
+    mTextureWidth  = width;
</ins><span class="cx">     mTextureHeight = height;
</span><del>-    mTextureDepth = depth;
-
-    initializeSerials(getLevelCount() * depth, depth);
</del><ins>+    mTextureDepth  = depth;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureStorage11_3D::~TextureStorage11_3D()
</span><span class="cx"> {
</span><span class="cx">     for (unsigned i = 0; i &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
</span><span class="cx">     {
</span><del>-        if (mAssociatedImages[i] != NULL)
</del><ins>+        if (mAssociatedImages[i] != nullptr)
</ins><span class="cx">         {
</span><span class="cx">             bool imageAssociationCorrect = mAssociatedImages[i]-&gt;isAssociatedStorageValid(this);
</span><span class="cx">             ASSERT(imageAssociationCorrect);
</span><span class="cx"> 
</span><span class="cx">             if (imageAssociationCorrect)
</span><span class="cx">             {
</span><del>-                // We must let the Images recover their data before we delete it from the TextureStorage.
</del><ins>+                // We must let the Images recover their data before we delete it from the
+                // TextureStorage.
</ins><span class="cx">                 mAssociatedImages[i]-&gt;recoverFromAssociatedStorage();
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -2051,7 +2599,8 @@
</span><span class="cx">     SafeRelease(mTexture);
</span><span class="cx">     SafeRelease(mSwizzleTexture);
</span><span class="cx"> 
</span><del>-    for (RenderTargetMap::iterator i = mLevelLayerRenderTargets.begin(); i != mLevelLayerRenderTargets.end(); i++)
</del><ins>+    for (RenderTargetMap::iterator i = mLevelLayerRenderTargets.begin();
+         i != mLevelLayerRenderTargets.end(); i++)
</ins><span class="cx">     {
</span><span class="cx">         SafeDelete(i-&gt;second);
</span><span class="cx">     }
</span><span class="lines">@@ -2064,9 +2613,9 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TextureStorage11_3D::associateImage(Image11* image, const gl::ImageIndex &amp;index)
</del><ins>+void TextureStorage11_3D::associateImage(Image11 *image, const gl::ImageIndex &amp;index)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
</del><ins>+    const GLint level = index.mipIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
</span><span class="cx"> 
</span><span class="lines">@@ -2076,13 +2625,15 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TextureStorage11_3D::isAssociatedImageValid(const gl::ImageIndex &amp;index, Image11* expectedImage)
</del><ins>+bool TextureStorage11_3D::isAssociatedImageValid(const gl::ImageIndex &amp;index,
+                                                 Image11 *expectedImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
</del><ins>+    const GLint level = index.mipIndex;
</ins><span class="cx"> 
</span><span class="cx">     if (0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
</span><span class="cx">     {
</span><del>-        // This validation check should never return false. It means the Image/TextureStorage association is broken.
</del><ins>+        // This validation check should never return false. It means the Image/TextureStorage
+        // association is broken.
</ins><span class="cx">         bool retValue = (mAssociatedImages[level] == expectedImage);
</span><span class="cx">         ASSERT(retValue);
</span><span class="cx">         return retValue;
</span><span class="lines">@@ -2092,9 +2643,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // disassociateImage allows an Image to end its association with a Storage.
</span><del>-void TextureStorage11_3D::disassociateImage(const gl::ImageIndex &amp;index, Image11* expectedImage)
</del><ins>+void TextureStorage11_3D::disassociateImage(const gl::ImageIndex &amp;index, Image11 *expectedImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
</del><ins>+    const GLint level = index.mipIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
</span><span class="cx"> 
</span><span class="lines">@@ -2104,31 +2655,34 @@
</span><span class="cx"> 
</span><span class="cx">         if (mAssociatedImages[level] == expectedImage)
</span><span class="cx">         {
</span><del>-            mAssociatedImages[level] = NULL;
</del><ins>+            mAssociatedImages[level] = nullptr;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image recover its data before ending the association.
-gl::Error TextureStorage11_3D::releaseAssociatedImage(const gl::ImageIndex &amp;index, Image11* incomingImage)
</del><ins>+// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image
+// recover its data before ending the association.
+gl::Error TextureStorage11_3D::releaseAssociatedImage(const gl::ImageIndex &amp;index,
+                                                      Image11 *incomingImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
</del><ins>+    const GLint level = index.mipIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT((0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS));
</span><span class="cx"> 
</span><span class="cx">     if (0 &lt;= level &amp;&amp; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
</span><span class="cx">     {
</span><span class="cx">         // No need to let the old Image recover its data, if it is also the incoming Image.
</span><del>-        if (mAssociatedImages[level] != NULL &amp;&amp; mAssociatedImages[level] != incomingImage)
</del><ins>+        if (mAssociatedImages[level] != nullptr &amp;&amp; mAssociatedImages[level] != incomingImage)
</ins><span class="cx">         {
</span><del>-            // Ensure that the Image is still associated with this TextureStorage. This should be true.
</del><ins>+            // Ensure that the Image is still associated with this TextureStorage. This should be
+            // true.
</ins><span class="cx">             bool imageAssociationCorrect = mAssociatedImages[level]-&gt;isAssociatedStorageValid(this);
</span><span class="cx">             ASSERT(imageAssociationCorrect);
</span><span class="cx"> 
</span><span class="cx">             if (imageAssociationCorrect)
</span><span class="cx">             {
</span><span class="cx">                 // Force the image to recover from storage before its data is overwritten.
</span><del>-                // This will reset mAssociatedImages[level] to NULL too.
</del><ins>+                // This will reset mAssociatedImages[level] to nullptr too.
</ins><span class="cx">                 gl::Error error = mAssociatedImages[level]-&gt;recoverFromAssociatedStorage();
</span><span class="cx">                 if (error.isError())
</span><span class="cx">                 {
</span><span class="lines">@@ -2143,100 +2697,117 @@
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureStorage11_3D::getResource(ID3D11Resource **outResource)
</span><span class="cx"> {
</span><del>-    // If the width, height or depth are not positive this should be treated as an incomplete texture
-    // we handle that here by skipping the d3d texture creation
-    if (mTexture == NULL &amp;&amp; mTextureWidth &gt; 0 &amp;&amp; mTextureHeight &gt; 0 &amp;&amp; mTextureDepth &gt; 0)
</del><ins>+    // If the width, height or depth are not positive this should be treated as an incomplete
+    // texture. We handle that here by skipping the d3d texture creation.
+    if (mTexture == nullptr &amp;&amp; mTextureWidth &gt; 0 &amp;&amp; mTextureHeight &gt; 0 &amp;&amp; mTextureDepth &gt; 0)
</ins><span class="cx">     {
</span><span class="cx">         ASSERT(mMipLevels &gt; 0);
</span><span class="cx"> 
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_TEXTURE3D_DESC desc;
</span><del>-        desc.Width = mTextureWidth;
-        desc.Height = mTextureHeight;
-        desc.Depth = mTextureDepth;
-        desc.MipLevels = mMipLevels;
-        desc.Format = mTextureFormat;
-        desc.Usage = D3D11_USAGE_DEFAULT;
-        desc.BindFlags = getBindFlags();
</del><ins>+        desc.Width          = mTextureWidth;
+        desc.Height         = mTextureHeight;
+        desc.Depth          = mTextureDepth;
+        desc.MipLevels      = mMipLevels;
+        desc.Format         = mTextureFormatSet-&gt;texFormat;
+        desc.Usage          = D3D11_USAGE_DEFAULT;
+        desc.BindFlags      = getBindFlags();
</ins><span class="cx">         desc.CPUAccessFlags = 0;
</span><del>-        desc.MiscFlags = getMiscFlags();
</del><ins>+        desc.MiscFlags      = getMiscFlags();
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateTexture3D(&amp;desc, NULL, &amp;mTexture);
</del><ins>+        HRESULT result = device-&gt;CreateTexture3D(&amp;desc, nullptr, &amp;mTexture);
</ins><span class="cx"> 
</span><span class="cx">         // this can happen from windows TDR
</span><span class="cx">         if (d3d11::isDeviceLostError(result))
</span><span class="cx">         {
</span><span class="cx">             mRenderer-&gt;notifyDeviceLost();
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create 3D texture storage, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create 3D texture storage, result: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><span class="cx">         else if (FAILED(result))
</span><span class="cx">         {
</span><span class="cx">             ASSERT(result == E_OUTOFMEMORY);
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create 3D texture storage, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create 3D texture storage, result: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><ins>+
+        d3d11::SetDebugName(mTexture, &quot;TexStorage3D.Texture&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     *outResource = mTexture;
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11_3D::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
</del><ins>+gl::Error TextureStorage11_3D::createSRV(int baseLevel,
+                                         int mipLevels,
+                                         DXGI_FORMAT format,
+                                         ID3D11Resource *texture,
</ins><span class="cx">                                          ID3D11ShaderResourceView **outSRV) const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(outSRV);
</span><span class="cx"> 
</span><span class="cx">     D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
</span><del>-    srvDesc.Format = format;
-    srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
</del><ins>+    srvDesc.Format                    = format;
+    srvDesc.ViewDimension             = D3D11_SRV_DIMENSION_TEXTURE3D;
</ins><span class="cx">     srvDesc.Texture3D.MostDetailedMip = baseLevel;
</span><del>-    srvDesc.Texture3D.MipLevels = mipLevels;
</del><ins>+    srvDesc.Texture3D.MipLevels       = mipLevels;
</ins><span class="cx"> 
</span><span class="cx">     ID3D11Device *device = mRenderer-&gt;getDevice();
</span><del>-    HRESULT result = device-&gt;CreateShaderResourceView(texture, &amp;srvDesc, outSRV);
</del><ins>+    HRESULT result       = device-&gt;CreateShaderResourceView(texture, &amp;srvDesc, outSRV);
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">     if (FAILED(result))
</span><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal texture storage SRV, result: 0x%X.&quot;, result);
</del><ins>+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to create internal texture storage SRV, result: 0x%X.&quot;, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    d3d11::SetDebugName(*outSRV, &quot;TexStorage3D.SRV&quot;);
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT)
</span><span class="cx"> {
</span><del>-    int mipLevel = index.mipIndex;
</del><ins>+    const int mipLevel = index.mipIndex;
</ins><span class="cx">     ASSERT(mipLevel &gt;= 0 &amp;&amp; mipLevel &lt; getLevelCount());
</span><span class="cx"> 
</span><del>-    ASSERT(mRenderTargetFormat != DXGI_FORMAT_UNKNOWN);
</del><ins>+    ASSERT(mTextureFormatSet-&gt;rtvFormat != DXGI_FORMAT_UNKNOWN);
</ins><span class="cx"> 
</span><span class="cx">     if (!index.hasLayer())
</span><span class="cx">     {
</span><span class="cx">         if (!mLevelRenderTargets[mipLevel])
</span><span class="cx">         {
</span><del>-            ID3D11Resource *texture = NULL;
</del><ins>+            ID3D11Resource *texture = nullptr;
</ins><span class="cx">             gl::Error error = getResource(&amp;texture);
</span><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 return error;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            ID3D11ShaderResourceView *srv = NULL;
-            error = getSRVLevel(mipLevel, &amp;srv);
</del><ins>+            ID3D11ShaderResourceView *srv = nullptr;
+            error = getSRVLevel(mipLevel, false, &amp;srv);
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 return error;
</span><span class="cx">             }
</span><span class="cx"> 
</span><ins>+            ID3D11ShaderResourceView *blitSRV = nullptr;
+            error = getSRVLevel(mipLevel, true, &amp;blitSRV);
+            if (error.isError())
+            {
+                return error;
+            }
+
</ins><span class="cx">             ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">             D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-            rtvDesc.Format = mRenderTargetFormat;
-            rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
-            rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
</del><ins>+            rtvDesc.Format                = mTextureFormatSet-&gt;rtvFormat;
+            rtvDesc.ViewDimension         = D3D11_RTV_DIMENSION_TEXTURE3D;
+            rtvDesc.Texture3D.MipSlice    = mTopLevel + mipLevel;
</ins><span class="cx">             rtvDesc.Texture3D.FirstWSlice = 0;
</span><del>-            rtvDesc.Texture3D.WSize = static_cast&lt;UINT&gt;(-1);
</del><ins>+            rtvDesc.Texture3D.WSize       = static_cast&lt;UINT&gt;(-1);
</ins><span class="cx"> 
</span><span class="cx">             ID3D11RenderTargetView *rtv;
</span><span class="cx">             HRESULT result = device-&gt;CreateRenderTargetView(texture, &amp;rtvDesc, &amp;rtv);
</span><span class="lines">@@ -2245,11 +2816,19 @@
</span><span class="cx">             if (FAILED(result))
</span><span class="cx">             {
</span><span class="cx">                 SafeRelease(srv);
</span><del>-                return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal render target view for texture storage, result: 0x%X.&quot;, result);
</del><ins>+                SafeRelease(blitSRV);
+                return gl::Error(GL_OUT_OF_MEMORY,
+                                 &quot;Failed to create internal render target view for texture &quot;
+                                 &quot;storage, result: 0x%X.&quot;,
+                                 result);
</ins><span class="cx">             }
</span><span class="cx"> 
</span><del>-            mLevelRenderTargets[mipLevel] = new TextureRenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(mipLevel), getLevelHeight(mipLevel), getLevelDepth(mipLevel), 0);
</del><ins>+            d3d11::SetDebugName(rtv, &quot;TexStorage3D.RTV&quot;);
</ins><span class="cx"> 
</span><ins>+            mLevelRenderTargets[mipLevel] = new TextureRenderTarget11(
+                rtv, texture, srv, blitSRV, mInternalFormat, mTextureFormatSet-&gt;format,
+                getLevelWidth(mipLevel), getLevelHeight(mipLevel), getLevelDepth(mipLevel), 0);
+
</ins><span class="cx">             // RenderTarget will take ownership of these resources
</span><span class="cx">             SafeRelease(rtv);
</span><span class="cx">         }
</span><span class="lines">@@ -2260,7 +2839,7 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        int layer = index.layerIndex;
</del><ins>+        const int layer = index.layerIndex;
</ins><span class="cx"> 
</span><span class="cx">         LevelLayerKey key(mipLevel, layer);
</span><span class="cx">         if (mLevelLayerRenderTargets.find(key) == mLevelLayerRenderTargets.end())
</span><span class="lines">@@ -2268,7 +2847,7 @@
</span><span class="cx">             ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx">             HRESULT result;
</span><span class="cx"> 
</span><del>-            ID3D11Resource *texture = NULL;
</del><ins>+            ID3D11Resource *texture = nullptr;
</ins><span class="cx">             gl::Error error = getResource(&amp;texture);
</span><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="lines">@@ -2276,14 +2855,15 @@
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             // TODO, what kind of SRV is expected here?
</span><del>-            ID3D11ShaderResourceView *srv = NULL;
</del><ins>+            ID3D11ShaderResourceView *srv = nullptr;
+            ID3D11ShaderResourceView *blitSRV = nullptr;
</ins><span class="cx"> 
</span><span class="cx">             D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-            rtvDesc.Format = mRenderTargetFormat;
-            rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
-            rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
</del><ins>+            rtvDesc.Format                = mTextureFormatSet-&gt;rtvFormat;
+            rtvDesc.ViewDimension         = D3D11_RTV_DIMENSION_TEXTURE3D;
+            rtvDesc.Texture3D.MipSlice    = mTopLevel + mipLevel;
</ins><span class="cx">             rtvDesc.Texture3D.FirstWSlice = layer;
</span><del>-            rtvDesc.Texture3D.WSize = 1;
</del><ins>+            rtvDesc.Texture3D.WSize       = 1;
</ins><span class="cx"> 
</span><span class="cx">             ID3D11RenderTargetView *rtv;
</span><span class="cx">             result = device-&gt;CreateRenderTargetView(texture, &amp;rtvDesc, &amp;rtv);
</span><span class="lines">@@ -2291,12 +2871,21 @@
</span><span class="cx">             ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">             if (FAILED(result))
</span><span class="cx">             {
</span><del>-                SafeRelease(srv); return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal render target view for texture storage, result: 0x%X.&quot;, result);
</del><ins>+                SafeRelease(srv);
+                SafeRelease(blitSRV);
+                return gl::Error(GL_OUT_OF_MEMORY,
+                                 &quot;Failed to create internal render target view for texture &quot;
+                                 &quot;storage, result: 0x%X.&quot;,
+                                 result);
</ins><span class="cx">             }
</span><span class="cx">             ASSERT(SUCCEEDED(result));
</span><span class="cx"> 
</span><del>-            mLevelLayerRenderTargets[key] = new TextureRenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
</del><ins>+            d3d11::SetDebugName(rtv, &quot;TexStorage3D.LayerRTV&quot;);
</ins><span class="cx"> 
</span><ins>+            mLevelLayerRenderTargets[key] = new TextureRenderTarget11(
+                rtv, texture, srv, blitSRV, mInternalFormat, mTextureFormatSet-&gt;format,
+                getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
+
</ins><span class="cx">             // RenderTarget will take ownership of these resources
</span><span class="cx">             SafeRelease(rtv);
</span><span class="cx">         }
</span><span class="lines">@@ -2316,23 +2905,26 @@
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_TEXTURE3D_DESC desc;
</span><del>-        desc.Width = mTextureWidth;
-        desc.Height = mTextureHeight;
-        desc.Depth = mTextureDepth;
-        desc.MipLevels = mMipLevels;
-        desc.Format = mSwizzleTextureFormat;
-        desc.Usage = D3D11_USAGE_DEFAULT;
-        desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
</del><ins>+        desc.Width          = mTextureWidth;
+        desc.Height         = mTextureHeight;
+        desc.Depth          = mTextureDepth;
+        desc.MipLevels      = mMipLevels;
+        desc.Format         = mSwizzleFormatSet-&gt;texFormat;
+        desc.Usage          = D3D11_USAGE_DEFAULT;
+        desc.BindFlags      = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
</ins><span class="cx">         desc.CPUAccessFlags = 0;
</span><del>-        desc.MiscFlags = 0;
</del><ins>+        desc.MiscFlags      = 0;
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateTexture3D(&amp;desc, NULL, &amp;mSwizzleTexture);
</del><ins>+        HRESULT result = device-&gt;CreateTexture3D(&amp;desc, nullptr, &amp;mSwizzleTexture);
</ins><span class="cx"> 
</span><span class="cx">         ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal swizzle texture, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal swizzle texture, result: 0x%X.&quot;, result);
</ins><span class="cx">         }
</span><ins>+
+        d3d11::SetDebugName(mSwizzleTexture, &quot;TexStorage3D.SwizzleTexture&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     *outTexture = mSwizzleTexture;
</span><span class="lines">@@ -2346,7 +2938,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!mSwizzleRenderTargets[mipLevel])
</span><span class="cx">     {
</span><del>-        ID3D11Resource *swizzleTexture = NULL;
</del><ins>+        ID3D11Resource *swizzleTexture = nullptr;
</ins><span class="cx">         gl::Error error = getSwizzleTexture(&amp;swizzleTexture);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="lines">@@ -2356,59 +2948,67 @@
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-        rtvDesc.Format = mSwizzleRenderTargetFormat;
-        rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
-        rtvDesc.Texture3D.MipSlice = mTopLevel + mipLevel;
</del><ins>+        rtvDesc.Format                = mSwizzleFormatSet-&gt;rtvFormat;
+        rtvDesc.ViewDimension         = D3D11_RTV_DIMENSION_TEXTURE3D;
+        rtvDesc.Texture3D.MipSlice    = mTopLevel + mipLevel;
</ins><span class="cx">         rtvDesc.Texture3D.FirstWSlice = 0;
</span><del>-        rtvDesc.Texture3D.WSize = static_cast&lt;UINT&gt;(-1);
</del><ins>+        rtvDesc.Texture3D.WSize       = static_cast&lt;UINT&gt;(-1);
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateRenderTargetView(mSwizzleTexture, &amp;rtvDesc, &amp;mSwizzleRenderTargets[mipLevel]);
</del><ins>+        HRESULT result = device-&gt;CreateRenderTargetView(mSwizzleTexture, &amp;rtvDesc,
+                                                        &amp;mSwizzleRenderTargets[mipLevel]);
</ins><span class="cx"> 
</span><span class="cx">         ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal swizzle render target view, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal swizzle render target view, result: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><ins>+
+        d3d11::SetDebugName(mSwizzleTexture, &quot;TexStorage3D.SwizzleRTV&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     *outRTV = mSwizzleRenderTargets[mipLevel];
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
-                                                   GLsizei width, GLsizei height, GLsizei depth, int levels)
-    : TextureStorage11(renderer,
-                       GetTextureBindFlags(internalformat, renderer-&gt;getFeatureLevel(), renderTarget),
-                       GetTextureMiscFlags(internalformat, renderer-&gt;getFeatureLevel(), renderTarget, levels))
</del><ins>+TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer,
+                                                   GLenum internalformat,
+                                                   bool renderTarget,
+                                                   GLsizei width,
+                                                   GLsizei height,
+                                                   GLsizei depth,
+                                                   int levels)
+    : TextureStorage11(
+          renderer,
+          GetTextureBindFlags(internalformat, renderer-&gt;getRenderer11DeviceCaps(), renderTarget),
+          GetTextureMiscFlags(internalformat,
+                              renderer-&gt;getRenderer11DeviceCaps(),
+                              renderTarget,
+                              levels))
</ins><span class="cx"> {
</span><del>-    mTexture = NULL;
-    mSwizzleTexture = NULL;
</del><ins>+    mTexture        = nullptr;
+    mSwizzleTexture = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     for (unsigned int level = 0; level &lt; gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
</span><span class="cx">     {
</span><del>-        mSwizzleRenderTargets[level] = NULL;
</del><ins>+        mSwizzleRenderTargets[level] = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mInternalFormat = internalformat;
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer-&gt;getFeatureLevel());
-    mTextureFormat = formatInfo.texFormat;
-    mShaderResourceFormat = formatInfo.srvFormat;
-    mDepthStencilFormat = formatInfo.dsvFormat;
-    mRenderTargetFormat = formatInfo.rtvFormat;
-    mSwizzleTextureFormat = formatInfo.swizzleTexFormat;
-    mSwizzleShaderResourceFormat = formatInfo.swizzleSRVFormat;
-    mSwizzleRenderTargetFormat = formatInfo.swizzleRTVFormat;
</del><ins>+    const d3d11::TextureFormat &amp;formatInfo =
+        d3d11::GetTextureFormatInfo(internalformat, renderer-&gt;getRenderer11DeviceCaps());
+    mTextureFormatSet = formatInfo.formatSet;
+    mSwizzleFormatSet = formatInfo.swizzleFormatSet;
</ins><span class="cx"> 
</span><span class="cx">     // adjust size if needed for compressed textures
</span><del>-    d3d11::MakeValidSize(false, mTextureFormat, &amp;width, &amp;height, &amp;mTopLevel);
</del><ins>+    d3d11::MakeValidSize(false, mTextureFormatSet-&gt;texFormat, &amp;width, &amp;height, &amp;mTopLevel);
</ins><span class="cx"> 
</span><del>-    mMipLevels = mTopLevel + levels;
-    mTextureWidth = width;
</del><ins>+    mMipLevels     = mTopLevel + levels;
+    mTextureWidth  = width;
</ins><span class="cx">     mTextureHeight = height;
</span><del>-    mTextureDepth = depth;
-
-    initializeSerials(getLevelCount() * depth, depth);
</del><ins>+    mTextureDepth  = depth;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureStorage11_2DArray::~TextureStorage11_2DArray()
</span><span class="lines">@@ -2422,7 +3022,8 @@
</span><span class="cx"> 
</span><span class="cx">             if (imageAssociationCorrect)
</span><span class="cx">             {
</span><del>-                // We must let the Images recover their data before we delete it from the TextureStorage.
</del><ins>+                // We must let the Images recover their data before we delete it from the
+                // TextureStorage.
</ins><span class="cx">                 i-&gt;second-&gt;recoverFromAssociatedStorage();
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -2444,10 +3045,10 @@
</span><span class="cx">     mRenderTargets.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TextureStorage11_2DArray::associateImage(Image11* image, const gl::ImageIndex &amp;index)
</del><ins>+void TextureStorage11_2DArray::associateImage(Image11 *image, const gl::ImageIndex &amp;index)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
-    GLint layerTarget = index.layerIndex;
</del><ins>+    const GLint level       = index.mipIndex;
+    const GLint layerTarget = index.layerIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(0 &lt;= level &amp;&amp; level &lt; getLevelCount());
</span><span class="cx"> 
</span><span class="lines">@@ -2458,56 +3059,64 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool TextureStorage11_2DArray::isAssociatedImageValid(const gl::ImageIndex &amp;index, Image11* expectedImage)
</del><ins>+bool TextureStorage11_2DArray::isAssociatedImageValid(const gl::ImageIndex &amp;index,
+                                                      Image11 *expectedImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
-    GLint layerTarget = index.layerIndex;
</del><ins>+    const GLint level       = index.mipIndex;
+    const GLint layerTarget = index.layerIndex;
</ins><span class="cx"> 
</span><span class="cx">     LevelLayerKey key(level, layerTarget);
</span><span class="cx"> 
</span><del>-    // This validation check should never return false. It means the Image/TextureStorage association is broken.
-    bool retValue = (mAssociatedImages.find(key) != mAssociatedImages.end() &amp;&amp; (mAssociatedImages[key] == expectedImage));
</del><ins>+    // This validation check should never return false. It means the Image/TextureStorage
+    // association is broken.
+    bool retValue = (mAssociatedImages.find(key) != mAssociatedImages.end() &amp;&amp;
+                     (mAssociatedImages[key] == expectedImage));
</ins><span class="cx">     ASSERT(retValue);
</span><span class="cx">     return retValue;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // disassociateImage allows an Image to end its association with a Storage.
</span><del>-void TextureStorage11_2DArray::disassociateImage(const gl::ImageIndex &amp;index, Image11* expectedImage)
</del><ins>+void TextureStorage11_2DArray::disassociateImage(const gl::ImageIndex &amp;index,
+                                                 Image11 *expectedImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
-    GLint layerTarget = index.layerIndex;
</del><ins>+    const GLint level       = index.mipIndex;
+    const GLint layerTarget = index.layerIndex;
</ins><span class="cx"> 
</span><span class="cx">     LevelLayerKey key(level, layerTarget);
</span><span class="cx"> 
</span><del>-    bool imageAssociationCorrect = (mAssociatedImages.find(key) != mAssociatedImages.end() &amp;&amp; (mAssociatedImages[key] == expectedImage));
</del><ins>+    bool imageAssociationCorrect = (mAssociatedImages.find(key) != mAssociatedImages.end() &amp;&amp;
+                                    (mAssociatedImages[key] == expectedImage));
</ins><span class="cx">     ASSERT(imageAssociationCorrect);
</span><span class="cx"> 
</span><span class="cx">     if (imageAssociationCorrect)
</span><span class="cx">     {
</span><del>-        mAssociatedImages[key] = NULL;
</del><ins>+        mAssociatedImages[key] = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image recover its data before ending the association.
-gl::Error TextureStorage11_2DArray::releaseAssociatedImage(const gl::ImageIndex &amp;index, Image11* incomingImage)
</del><ins>+// releaseAssociatedImage prepares the Storage for a new Image association. It lets the old Image
+// recover its data before ending the association.
+gl::Error TextureStorage11_2DArray::releaseAssociatedImage(const gl::ImageIndex &amp;index,
+                                                           Image11 *incomingImage)
</ins><span class="cx"> {
</span><del>-    GLint level = index.mipIndex;
-    GLint layerTarget = index.layerIndex;
</del><ins>+    const GLint level       = index.mipIndex;
+    const GLint layerTarget = index.layerIndex;
</ins><span class="cx"> 
</span><span class="cx">     LevelLayerKey key(level, layerTarget);
</span><span class="cx"> 
</span><span class="cx">     if (mAssociatedImages.find(key) != mAssociatedImages.end())
</span><span class="cx">     {
</span><del>-        if (mAssociatedImages[key] != NULL &amp;&amp; mAssociatedImages[key] != incomingImage)
</del><ins>+        if (mAssociatedImages[key] != nullptr &amp;&amp; mAssociatedImages[key] != incomingImage)
</ins><span class="cx">         {
</span><del>-            // Ensure that the Image is still associated with this TextureStorage. This should be true.
</del><ins>+            // Ensure that the Image is still associated with this TextureStorage. This should be
+            // true.
</ins><span class="cx">             bool imageAssociationCorrect = mAssociatedImages[key]-&gt;isAssociatedStorageValid(this);
</span><span class="cx">             ASSERT(imageAssociationCorrect);
</span><span class="cx"> 
</span><span class="cx">             if (imageAssociationCorrect)
</span><span class="cx">             {
</span><span class="cx">                 // Force the image to recover from storage before its data is overwritten.
</span><del>-                // This will reset mAssociatedImages[level] to NULL too.
</del><ins>+                // This will reset mAssociatedImages[level] to nullptr too.
</ins><span class="cx">                 gl::Error error = mAssociatedImages[key]-&gt;recoverFromAssociatedStorage();
</span><span class="cx">                 if (error.isError())
</span><span class="cx">                 {
</span><span class="lines">@@ -2524,73 +3133,112 @@
</span><span class="cx"> {
</span><span class="cx">     // if the width, height or depth is not positive this should be treated as an incomplete texture
</span><span class="cx">     // we handle that here by skipping the d3d texture creation
</span><del>-    if (mTexture == NULL &amp;&amp; mTextureWidth &gt; 0 &amp;&amp; mTextureHeight &gt; 0 &amp;&amp; mTextureDepth &gt; 0)
</del><ins>+    if (mTexture == nullptr &amp;&amp; mTextureWidth &gt; 0 &amp;&amp; mTextureHeight &gt; 0 &amp;&amp; mTextureDepth &gt; 0)
</ins><span class="cx">     {
</span><span class="cx">         ASSERT(mMipLevels &gt; 0);
</span><span class="cx"> 
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_TEXTURE2D_DESC desc;
</span><del>-        desc.Width = mTextureWidth;
-        desc.Height = mTextureHeight;
-        desc.MipLevels = mMipLevels;
-        desc.ArraySize = mTextureDepth;
-        desc.Format = mTextureFormat;
-        desc.SampleDesc.Count = 1;
</del><ins>+        desc.Width              = mTextureWidth;
+        desc.Height             = mTextureHeight;
+        desc.MipLevels          = mMipLevels;
+        desc.ArraySize          = mTextureDepth;
+        desc.Format             = mTextureFormatSet-&gt;texFormat;
+        desc.SampleDesc.Count   = 1;
</ins><span class="cx">         desc.SampleDesc.Quality = 0;
</span><del>-        desc.Usage = D3D11_USAGE_DEFAULT;
-        desc.BindFlags = getBindFlags();
-        desc.CPUAccessFlags = 0;
-        desc.MiscFlags = getMiscFlags();
</del><ins>+        desc.Usage              = D3D11_USAGE_DEFAULT;
+        desc.BindFlags          = getBindFlags();
+        desc.CPUAccessFlags     = 0;
+        desc.MiscFlags          = getMiscFlags();
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, NULL, &amp;mTexture);
</del><ins>+        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, nullptr, &amp;mTexture);
</ins><span class="cx"> 
</span><span class="cx">         // this can happen from windows TDR
</span><span class="cx">         if (d3d11::isDeviceLostError(result))
</span><span class="cx">         {
</span><span class="cx">             mRenderer-&gt;notifyDeviceLost();
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create 2D array texture storage, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create 2D array texture storage, result: 0x%X.&quot;, result);
</ins><span class="cx">         }
</span><span class="cx">         else if (FAILED(result))
</span><span class="cx">         {
</span><span class="cx">             ASSERT(result == E_OUTOFMEMORY);
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create 2D array texture storage, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create 2D array texture storage, result: 0x%X.&quot;, result);
</ins><span class="cx">         }
</span><ins>+
+        d3d11::SetDebugName(mTexture, &quot;TexStorage2DArray.Texture&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     *outResource = mTexture;
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11_2DArray::createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
</del><ins>+gl::Error TextureStorage11_2DArray::createSRV(int baseLevel,
+                                              int mipLevels,
+                                              DXGI_FORMAT format,
+                                              ID3D11Resource *texture,
</ins><span class="cx">                                               ID3D11ShaderResourceView **outSRV) const
</span><span class="cx"> {
</span><span class="cx">     D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
</span><del>-    srvDesc.Format = format;
-    srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
</del><ins>+    srvDesc.Format                         = format;
+    srvDesc.ViewDimension                  = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
</ins><span class="cx">     srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + baseLevel;
</span><del>-    srvDesc.Texture2DArray.MipLevels = mipLevels;
</del><ins>+    srvDesc.Texture2DArray.MipLevels       = mipLevels;
</ins><span class="cx">     srvDesc.Texture2DArray.FirstArraySlice = 0;
</span><del>-    srvDesc.Texture2DArray.ArraySize = mTextureDepth;
</del><ins>+    srvDesc.Texture2DArray.ArraySize       = mTextureDepth;
</ins><span class="cx"> 
</span><span class="cx">     ID3D11Device *device = mRenderer-&gt;getDevice();
</span><del>-    HRESULT result = device-&gt;CreateShaderResourceView(texture, &amp;srvDesc, outSRV);
</del><ins>+    HRESULT result       = device-&gt;CreateShaderResourceView(texture, &amp;srvDesc, outSRV);
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">     if (FAILED(result))
</span><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal texture storage SRV, result: 0x%X.&quot;, result);
</del><ins>+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to create internal texture storage SRV, result: 0x%X.&quot;, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    d3d11::SetDebugName(*outSRV, &quot;TexStorage2DArray.SRV&quot;);
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT)
</del><ins>+gl::Error TextureStorage11_2DArray::createRenderTargetSRV(ID3D11Resource *texture,
+                                                          const gl::ImageIndex &amp;index,
+                                                          DXGI_FORMAT resourceFormat,
+                                                          ID3D11ShaderResourceView **srv) const
</ins><span class="cx"> {
</span><ins>+    ID3D11Device *device = mRenderer-&gt;getDevice();
+    D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
+    srvDesc.Format                         = resourceFormat;
+    srvDesc.ViewDimension                  = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
+    srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + index.mipIndex;
+    srvDesc.Texture2DArray.MipLevels       = 1;
+    srvDesc.Texture2DArray.FirstArraySlice = index.layerIndex;
+    srvDesc.Texture2DArray.ArraySize       = 1;
+
+    HRESULT result = device-&gt;CreateShaderResourceView(texture, &amp;srvDesc, srv);
+
+    ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
+    if (FAILED(result))
+    {
+        return gl::Error(
+            GL_OUT_OF_MEMORY,
+            &quot;Failed to create internal shader resource view for texture storage, result: 0x%X.&quot;,
+            result);
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &amp;index,
+                                                    RenderTargetD3D **outRT)
+{
</ins><span class="cx">     ASSERT(index.hasLayer());
</span><span class="cx"> 
</span><del>-    int mipLevel = index.mipIndex;
-    int layer = index.layerIndex;
</del><ins>+    const int mipLevel = index.mipIndex;
+    const int layer    = index.layerIndex;
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(mipLevel &gt;= 0 &amp;&amp; mipLevel &lt; getLevelCount());
</span><span class="cx"> 
</span><span class="lines">@@ -2600,38 +3248,45 @@
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx">         HRESULT result;
</span><span class="cx"> 
</span><del>-        ID3D11Resource *texture = NULL;
</del><ins>+        ID3D11Resource *texture = nullptr;
</ins><span class="cx">         gl::Error error = getResource(&amp;texture);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><del>-
-        D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
-        srvDesc.Format = mShaderResourceFormat;
-        srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
-        srvDesc.Texture2DArray.MostDetailedMip = mTopLevel + mipLevel;
-        srvDesc.Texture2DArray.MipLevels = 1;
-        srvDesc.Texture2DArray.FirstArraySlice = layer;
-        srvDesc.Texture2DArray.ArraySize = 1;
-
</del><span class="cx">         ID3D11ShaderResourceView *srv;
</span><del>-        result = device-&gt;CreateShaderResourceView(texture, &amp;srvDesc, &amp;srv);
-
-        ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
-        if (FAILED(result))
</del><ins>+        error = createRenderTargetSRV(texture, index, mTextureFormatSet-&gt;srvFormat, &amp;srv);
+        if (error.isError())
</ins><span class="cx">         {
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal shader resource view for texture storage, result: 0x%X.&quot;, result);
</del><ins>+            return error;
</ins><span class="cx">         }
</span><ins>+        ID3D11ShaderResourceView *blitSRV;
+        if (mTextureFormatSet-&gt;blitSRVFormat != mTextureFormatSet-&gt;srvFormat)
+        {
+            error =
+                createRenderTargetSRV(texture, index, mTextureFormatSet-&gt;blitSRVFormat, &amp;blitSRV);
+            if (error.isError())
+            {
+                SafeRelease(srv);
+                return error;
+            }
+        }
+        else
+        {
+            blitSRV = srv;
+            blitSRV-&gt;AddRef();
+        }
</ins><span class="cx"> 
</span><del>-        if (mRenderTargetFormat != DXGI_FORMAT_UNKNOWN)
</del><ins>+        d3d11::SetDebugName(srv, &quot;TexStorage2DArray.RenderTargetSRV&quot;);
+
+        if (mTextureFormatSet-&gt;rtvFormat != DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">         {
</span><span class="cx">             D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-            rtvDesc.Format = mRenderTargetFormat;
-            rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
-            rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
</del><ins>+            rtvDesc.Format                         = mTextureFormatSet-&gt;rtvFormat;
+            rtvDesc.ViewDimension                  = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
+            rtvDesc.Texture2DArray.MipSlice        = mTopLevel + mipLevel;
</ins><span class="cx">             rtvDesc.Texture2DArray.FirstArraySlice = layer;
</span><del>-            rtvDesc.Texture2DArray.ArraySize = 1;
</del><ins>+            rtvDesc.Texture2DArray.ArraySize       = 1;
</ins><span class="cx"> 
</span><span class="cx">             ID3D11RenderTargetView *rtv;
</span><span class="cx">             result = device-&gt;CreateRenderTargetView(texture, &amp;rtvDesc, &amp;rtv);
</span><span class="lines">@@ -2640,18 +3295,58 @@
</span><span class="cx">             if (FAILED(result))
</span><span class="cx">             {
</span><span class="cx">                 SafeRelease(srv);
</span><del>-                return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal render target view for texture storage, result: 0x%X.&quot;, result);
</del><ins>+                SafeRelease(blitSRV);
+                return gl::Error(GL_OUT_OF_MEMORY,
+                                 &quot;Failed to create internal render target view for texture &quot;
+                                 &quot;storage, result: 0x%X.&quot;,
+                                 result);
</ins><span class="cx">             }
</span><span class="cx"> 
</span><del>-            mRenderTargets[key] = new TextureRenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
</del><ins>+            d3d11::SetDebugName(rtv, &quot;TexStorage2DArray.RenderTargetRTV&quot;);
</ins><span class="cx"> 
</span><ins>+            mRenderTargets[key] = new TextureRenderTarget11(
+                rtv, texture, srv, blitSRV, mInternalFormat, mTextureFormatSet-&gt;format,
+                getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
+
</ins><span class="cx">             // RenderTarget will take ownership of these resources
</span><span class="cx">             SafeRelease(rtv);
</span><span class="cx">             SafeRelease(srv);
</span><ins>+            SafeRelease(blitSRV);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            UNREACHABLE();
</del><ins>+            ASSERT(mTextureFormatSet-&gt;dsvFormat != DXGI_FORMAT_UNKNOWN);
+
+            D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
+            dsvDesc.Format                         = mTextureFormatSet-&gt;dsvFormat;
+            dsvDesc.ViewDimension                  = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
+            dsvDesc.Texture2DArray.MipSlice        = mTopLevel + mipLevel;
+            dsvDesc.Texture2DArray.FirstArraySlice = layer;
+            dsvDesc.Texture2DArray.ArraySize       = 1;
+            dsvDesc.Flags                          = 0;
+
+            ID3D11DepthStencilView *dsv;
+            result = device-&gt;CreateDepthStencilView(texture, &amp;dsvDesc, &amp;dsv);
+
+            ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
+            if (FAILED(result))
+            {
+                SafeRelease(srv);
+                SafeRelease(blitSRV);
+                return gl::Error(GL_OUT_OF_MEMORY,
+                                 &quot;Failed to create TexStorage2DArray DSV. Result: 0x%X.&quot;, result);
+            }
+
+            d3d11::SetDebugName(dsv, &quot;TexStorage2DArray.RenderTargetDSV&quot;);
+
+            mRenderTargets[key] = new TextureRenderTarget11(
+                dsv, texture, srv, mInternalFormat, mTextureFormatSet-&gt;format,
+                getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
+
+            // RenderTarget will take ownership of these resources
+            SafeRelease(dsv);
+            SafeRelease(srv);
+            SafeRelease(blitSRV);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -2667,39 +3362,43 @@
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_TEXTURE2D_DESC desc;
</span><del>-        desc.Width = mTextureWidth;
-        desc.Height = mTextureHeight;
-        desc.MipLevels = mMipLevels;
-        desc.ArraySize = mTextureDepth;
-        desc.Format = mSwizzleTextureFormat;
-        desc.SampleDesc.Count = 1;
</del><ins>+        desc.Width              = mTextureWidth;
+        desc.Height             = mTextureHeight;
+        desc.MipLevels          = mMipLevels;
+        desc.ArraySize          = mTextureDepth;
+        desc.Format             = mSwizzleFormatSet-&gt;texFormat;
+        desc.SampleDesc.Count   = 1;
</ins><span class="cx">         desc.SampleDesc.Quality = 0;
</span><del>-        desc.Usage = D3D11_USAGE_DEFAULT;
-        desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
-        desc.CPUAccessFlags = 0;
-        desc.MiscFlags = 0;
</del><ins>+        desc.Usage              = D3D11_USAGE_DEFAULT;
+        desc.BindFlags          = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
+        desc.CPUAccessFlags     = 0;
+        desc.MiscFlags          = 0;
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, NULL, &amp;mSwizzleTexture);
</del><ins>+        HRESULT result = device-&gt;CreateTexture2D(&amp;desc, nullptr, &amp;mSwizzleTexture);
</ins><span class="cx"> 
</span><span class="cx">         ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal swizzle texture, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal swizzle texture, result: 0x%X.&quot;, result);
</ins><span class="cx">         }
</span><ins>+
+        d3d11::SetDebugName(*outTexture, &quot;TexStorage2DArray.SwizzleTexture&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     *outTexture = mSwizzleTexture;
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV)
</del><ins>+gl::Error TextureStorage11_2DArray::getSwizzleRenderTarget(int mipLevel,
+                                                           ID3D11RenderTargetView **outRTV)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mipLevel &gt;= 0 &amp;&amp; mipLevel &lt; getLevelCount());
</span><span class="cx">     ASSERT(outRTV);
</span><span class="cx"> 
</span><span class="cx">     if (!mSwizzleRenderTargets[mipLevel])
</span><span class="cx">     {
</span><del>-        ID3D11Resource *swizzleTexture = NULL;
</del><ins>+        ID3D11Resource *swizzleTexture = nullptr;
</ins><span class="cx">         gl::Error error = getSwizzleTexture(&amp;swizzleTexture);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="lines">@@ -2709,23 +3408,25 @@
</span><span class="cx">         ID3D11Device *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><span class="cx">         D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
</span><del>-        rtvDesc.Format = mSwizzleRenderTargetFormat;
-        rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
-        rtvDesc.Texture2DArray.MipSlice = mTopLevel + mipLevel;
</del><ins>+        rtvDesc.Format                         = mSwizzleFormatSet-&gt;rtvFormat;
+        rtvDesc.ViewDimension                  = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
+        rtvDesc.Texture2DArray.MipSlice        = mTopLevel + mipLevel;
</ins><span class="cx">         rtvDesc.Texture2DArray.FirstArraySlice = 0;
</span><del>-        rtvDesc.Texture2DArray.ArraySize = mTextureDepth;
</del><ins>+        rtvDesc.Texture2DArray.ArraySize       = mTextureDepth;
</ins><span class="cx"> 
</span><del>-        HRESULT result = device-&gt;CreateRenderTargetView(mSwizzleTexture, &amp;rtvDesc, &amp;mSwizzleRenderTargets[mipLevel]);
</del><ins>+        HRESULT result = device-&gt;CreateRenderTargetView(mSwizzleTexture, &amp;rtvDesc,
+                                                        &amp;mSwizzleRenderTargets[mipLevel]);
</ins><span class="cx"> 
</span><span class="cx">         ASSERT(result == E_OUTOFMEMORY || SUCCEEDED(result));
</span><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><del>-            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to create internal swizzle render target view, result: 0x%X.&quot;, result);
</del><ins>+            return gl::Error(GL_OUT_OF_MEMORY,
+                             &quot;Failed to create internal swizzle render target view, result: 0x%X.&quot;,
+                             result);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     *outRTV = mSwizzleRenderTargets[mipLevel];
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><del>-
-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11TextureStorage11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,7 +13,9 @@
</span><span class="cx"> #include &quot;libANGLE/Texture.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/TextureStorage.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
</ins><span class="cx"> 
</span><ins>+#include &lt;array&gt;
</ins><span class="cx"> #include &lt;map&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="lines">@@ -23,25 +25,28 @@
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+class EGLImageD3D;
</ins><span class="cx"> class RenderTargetD3D;
</span><span class="cx"> class RenderTarget11;
</span><span class="cx"> class Renderer11;
</span><span class="cx"> class SwapChain11;
</span><span class="cx"> class Image11;
</span><ins>+struct Renderer11DeviceCaps;
</ins><span class="cx"> 
</span><span class="cx"> class TextureStorage11 : public TextureStorage
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     virtual ~TextureStorage11();
</span><span class="cx"> 
</span><del>-    static DWORD GetTextureBindFlags(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel, bool renderTarget);
-    static DWORD GetTextureMiscFlags(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel, bool renderTarget, int levels);
</del><ins>+    static DWORD GetTextureBindFlags(GLenum internalFormat, const Renderer11DeviceCaps &amp;renderer11DeviceCaps, bool renderTarget);
+    static DWORD GetTextureMiscFlags(GLenum internalFormat, const Renderer11DeviceCaps &amp;renderer11DeviceCaps, bool renderTarget, int levels);
</ins><span class="cx"> 
</span><span class="cx">     UINT getBindFlags() const;
</span><span class="cx">     UINT getMiscFlags() const;
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error getResource(ID3D11Resource **outResource) = 0;
</span><del>-    virtual gl::Error getSRV(const gl::SamplerState &amp;samplerState, ID3D11ShaderResourceView **outSRV);
</del><ins>+    virtual gl::Error getSRV(const gl::TextureState &amp;textureState,
+                             ID3D11ShaderResourceView **outSRV);
</ins><span class="cx">     virtual gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error generateMipmap(const gl::ImageIndex &amp;sourceIndex, const gl::ImageIndex &amp;destIndex);
</span><span class="lines">@@ -74,6 +79,8 @@
</span><span class="cx"> 
</span><span class="cx">     gl::Error getSRVLevels(GLint baseLevel, GLint maxLevel, ID3D11ShaderResourceView **outSRV);
</span><span class="cx"> 
</span><ins>+    d3d11::ANGLEFormat getANGLEFormat() const;
+
</ins><span class="cx">   protected:
</span><span class="cx">     TextureStorage11(Renderer11 *renderer, UINT bindFlags, UINT miscFlags);
</span><span class="cx">     int getLevelWidth(int mipLevel) const;
</span><span class="lines">@@ -85,25 +92,23 @@
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture) = 0;
</span><span class="cx">     virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV) = 0;
</span><del>-    gl::Error getSRVLevel(int mipLevel, ID3D11ShaderResourceView **outSRV);
</del><ins>+    gl::Error getSRVLevel(int mipLevel, bool blitSRV, ID3D11ShaderResourceView **outSRV);
</ins><span class="cx"> 
</span><span class="cx">     virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
</span><span class="cx">                                 ID3D11ShaderResourceView **outSRV) const = 0;
</span><span class="cx"> 
</span><span class="cx">     void verifySwizzleExists(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
</span><span class="cx"> 
</span><ins>+    // Clear all cached non-swizzle SRVs and invalidate the swizzle cache.
+    void clearSRVCache();
+
</ins><span class="cx">     Renderer11 *mRenderer;
</span><span class="cx">     int mTopLevel;
</span><span class="cx">     unsigned int mMipLevels;
</span><span class="cx"> 
</span><span class="cx">     GLenum mInternalFormat;
</span><del>-    DXGI_FORMAT mTextureFormat;
-    DXGI_FORMAT mShaderResourceFormat;
-    DXGI_FORMAT mRenderTargetFormat;
-    DXGI_FORMAT mDepthStencilFormat;
-    DXGI_FORMAT mSwizzleTextureFormat;
-    DXGI_FORMAT mSwizzleShaderResourceFormat;
-    DXGI_FORMAT mSwizzleRenderTargetFormat;
</del><ins>+    const d3d11::ANGLEFormatSet *mTextureFormatSet;
+    const d3d11::ANGLEFormatSet *mSwizzleFormatSet;
</ins><span class="cx">     unsigned int mTextureWidth;
</span><span class="cx">     unsigned int mTextureHeight;
</span><span class="cx">     unsigned int mTextureDepth;
</span><span class="lines">@@ -140,7 +145,8 @@
</span><span class="cx">     typedef std::map&lt;SRVKey, ID3D11ShaderResourceView *&gt; SRVCache;
</span><span class="cx"> 
</span><span class="cx">     SRVCache mSrvCache;
</span><del>-    ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
</del><ins>+    std::array&lt;ID3D11ShaderResourceView *, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS&gt; mLevelSRVs;
+    std::array&lt;ID3D11ShaderResourceView *, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS&gt; mLevelBlitSRVs;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class TextureStorage11_2D : public TextureStorage11
</span><span class="lines">@@ -175,6 +181,7 @@
</span><span class="cx"> 
</span><span class="cx">     ID3D11Texture2D *mTexture;
</span><span class="cx">     RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
</span><ins>+    bool mHasKeyedMutex;
</ins><span class="cx"> 
</span><span class="cx">     // These are members related to the zero max-LOD workaround.
</span><span class="cx">     // D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from level zero).
</span><span class="lines">@@ -196,6 +203,52 @@
</span><span class="cx">     Image11 *mAssociatedImages[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+class TextureStorage11_EGLImage final : public TextureStorage11
+{
+  public:
+    TextureStorage11_EGLImage(Renderer11 *renderer, EGLImageD3D *eglImage);
+    ~TextureStorage11_EGLImage() override;
+
+    gl::Error getResource(ID3D11Resource **outResource) override;
+    gl::Error getSRV(const gl::TextureState &amp;textureState,
+                     ID3D11ShaderResourceView **outSRV) override;
+    gl::Error getMippedResource(ID3D11Resource **outResource) override;
+    gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT) override;
+
+    gl::Error copyToStorage(TextureStorage *destStorage) override;
+
+    void associateImage(Image11 *image, const gl::ImageIndex &amp;index) override;
+    void disassociateImage(const gl::ImageIndex &amp;index, Image11 *expectedImage) override;
+    bool isAssociatedImageValid(const gl::ImageIndex &amp;index, Image11 *expectedImage) override;
+    gl::Error releaseAssociatedImage(const gl::ImageIndex &amp;index, Image11 *incomingImage) override;
+
+    gl::Error useLevelZeroWorkaroundTexture(bool useLevelZeroTexture) override;
+
+  protected:
+    gl::Error getSwizzleTexture(ID3D11Resource **outTexture) override;
+    gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV) override;
+
+  private:
+    // Check if the EGL image's render target has been updated due to orphaning and delete
+    // any SRVs and other resources based on the image's old render target.
+    gl::Error checkForUpdatedRenderTarget();
+
+    gl::Error createSRV(int baseLevel,
+                        int mipLevels,
+                        DXGI_FORMAT format,
+                        ID3D11Resource *texture,
+                        ID3D11ShaderResourceView **outSRV) const override;
+
+    gl::Error getImageRenderTarget(RenderTarget11 **outRT) const;
+
+    EGLImageD3D *mImage;
+    uintptr_t mCurrentRenderTarget;
+
+    // Swizzle-related variables
+    ID3D11Texture2D *mSwizzleTexture;
+    std::vector&lt;ID3D11RenderTargetView *&gt; mSwizzleRenderTargets;
+};
+
</ins><span class="cx"> class TextureStorage11_Cube : public TextureStorage11
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="lines">@@ -226,6 +279,10 @@
</span><span class="cx">   private:
</span><span class="cx">     virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
</span><span class="cx">                                 ID3D11ShaderResourceView **outSRV) const;
</span><ins>+    gl::Error createRenderTargetSRV(ID3D11Resource *texture,
+                                    const gl::ImageIndex &amp;index,
+                                    DXGI_FORMAT resourceFormat,
+                                    ID3D11ShaderResourceView **srv) const;
</ins><span class="cx"> 
</span><span class="cx">     static const size_t CUBE_FACE_COUNT = 6;
</span><span class="cx"> 
</span><span class="lines">@@ -303,6 +360,10 @@
</span><span class="cx">   private:
</span><span class="cx">     virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
</span><span class="cx">                                 ID3D11ShaderResourceView **outSRV) const;
</span><ins>+    gl::Error createRenderTargetSRV(ID3D11Resource *texture,
+                                    const gl::ImageIndex &amp;index,
+                                    DXGI_FORMAT resourceFormat,
+                                    ID3D11ShaderResourceView **srv) const;
</ins><span class="cx"> 
</span><span class="cx">     typedef std::pair&lt;int, int&gt; LevelLayerKey;
</span><span class="cx">     typedef std::map&lt;LevelLayerKey, RenderTarget11*&gt; RenderTargetMap;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11Trim11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Trim11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Trim11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Trim11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -31,7 +31,9 @@
</span><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     Renderer11 *mRenderer;
</span><ins>+#if defined (ANGLE_ENABLE_WINDOWS_STORE)
</ins><span class="cx">     EventRegistrationToken mApplicationSuspendedEventToken;
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">     void trim();
</span><span class="cx">     bool registerForRendererTrimRequest();
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11VertexArray11cpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,265 @@
</span><ins>+//
+// Copyright 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// VertexArray11:
+//   Implementation of rx::VertexArray11.
+//
+
+#include &quot;libANGLE/renderer/d3d/d3d11/VertexArray11.h&quot;
+
+#include &quot;common/BitSetIterator.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/Buffer11.h&quot;
+
+namespace rx
+{
+
+namespace
+{
+size_t GetAttribIndex(unsigned long dirtyBit)
+{
+    if (dirtyBit &gt;= gl::VertexArray::DIRTY_BIT_ATTRIB_0_ENABLED &amp;&amp;
+        dirtyBit &lt; gl::VertexArray::DIRTY_BIT_ATTRIB_MAX_ENABLED)
+    {
+        return dirtyBit - gl::VertexArray::DIRTY_BIT_ATTRIB_0_ENABLED;
+    }
+
+    if (dirtyBit &gt;= gl::VertexArray::DIRTY_BIT_ATTRIB_0_POINTER &amp;&amp;
+        dirtyBit &lt; gl::VertexArray::DIRTY_BIT_ATTRIB_MAX_POINTER)
+    {
+        return dirtyBit - gl::VertexArray::DIRTY_BIT_ATTRIB_0_POINTER;
+    }
+
+    ASSERT(dirtyBit &gt;= gl::VertexArray::DIRTY_BIT_ATTRIB_0_DIVISOR &amp;&amp;
+           dirtyBit &lt; gl::VertexArray::DIRTY_BIT_ATTRIB_MAX_DIVISOR);
+    return static_cast&lt;size_t&gt;(dirtyBit) - gl::VertexArray::DIRTY_BIT_ATTRIB_0_DIVISOR;
+}
+}  // anonymous namespace
+
+VertexArray11::VertexArray11(const gl::VertexArray::Data &amp;data)
+    : VertexArrayImpl(data),
+      mAttributeStorageTypes(data.getVertexAttributes().size(), VertexStorageType::CURRENT_VALUE),
+      mTranslatedAttribs(data.getVertexAttributes().size()),
+      mCurrentBuffers(data.getVertexAttributes().size())
+{
+    for (size_t attribIndex = 0; attribIndex &lt; mCurrentBuffers.size(); ++attribIndex)
+    {
+        auto callback = [this, attribIndex]()
+        {
+            this-&gt;markBufferDataDirty(attribIndex);
+        };
+        mOnBufferDataDirty.push_back(callback);
+    }
+}
+
+VertexArray11::~VertexArray11()
+{
+    for (size_t attribIndex = 0; attribIndex &lt; mCurrentBuffers.size(); ++attribIndex)
+    {
+        if (mCurrentBuffers[attribIndex].get())
+        {
+            unlinkBuffer(attribIndex, mAttributeStorageTypes[attribIndex]);
+            mCurrentBuffers[attribIndex].set(nullptr);
+        }
+    }
+}
+
+void VertexArray11::syncState(const gl::VertexArray::DirtyBits &amp;dirtyBits)
+{
+    for (auto dirtyBit : angle::IterateBitSet(dirtyBits))
+    {
+        if (dirtyBit == gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER)
+            continue;
+
+        size_t attribIndex = GetAttribIndex(dirtyBit);
+        mAttribsToUpdate.set(attribIndex);
+    }
+}
+
+void VertexArray11::updateVertexAttribStorage(size_t attribIndex)
+{
+    const auto &amp;attrib = mData.getVertexAttribute(attribIndex);
+
+    // Note: having an unchanged storage type doesn't mean the attribute is clean.
+    auto oldStorageType = mAttributeStorageTypes[attribIndex];
+    auto newStorageType = ClassifyAttributeStorage(attrib);
+
+    mAttributeStorageTypes[attribIndex] = newStorageType;
+
+    if (newStorageType == VertexStorageType::DYNAMIC)
+    {
+        if (oldStorageType != VertexStorageType::DYNAMIC)
+        {
+            // Sync dynamic attribs in a different set.
+            mAttribsToTranslate.reset(attribIndex);
+            mDynamicAttribsMask.set(attribIndex);
+        }
+    }
+    else
+    {
+        mAttribsToTranslate.set(attribIndex);
+
+        if (oldStorageType == VertexStorageType::DYNAMIC)
+        {
+            ASSERT(mDynamicAttribsMask[attribIndex]);
+            mDynamicAttribsMask.reset(attribIndex);
+        }
+    }
+
+    gl::Buffer *oldBufferGL = mCurrentBuffers[attribIndex].get();
+    gl::Buffer *newBufferGL = attrib.buffer.get();
+    Buffer11 *oldBuffer11   = oldBufferGL ? GetImplAs&lt;Buffer11&gt;(oldBufferGL) : nullptr;
+    Buffer11 *newBuffer11   = newBufferGL ? GetImplAs&lt;Buffer11&gt;(newBufferGL) : nullptr;
+
+    if (oldBuffer11 != newBuffer11 || oldStorageType != newStorageType)
+    {
+        // Note that for static callbacks, promotion to a static buffer from a dynamic buffer means
+        // we need to tag dynamic buffers with static callbacks.
+        if (oldBuffer11 != nullptr)
+        {
+            unlinkBuffer(attribIndex, oldStorageType);
+        }
+        if (newBuffer11 != nullptr)
+        {
+            if (newStorageType == VertexStorageType::DIRECT)
+            {
+                newBuffer11-&gt;addDirectBufferDirtyCallback(&amp;mOnBufferDataDirty[attribIndex]);
+            }
+            else if (newStorageType == VertexStorageType::STATIC ||
+                     newStorageType == VertexStorageType::DYNAMIC)
+            {
+                newBuffer11-&gt;addStaticBufferDirtyCallback(&amp;mOnBufferDataDirty[attribIndex]);
+            }
+        }
+        mCurrentBuffers[attribIndex] = attrib.buffer;
+    }
+}
+
+gl::Error VertexArray11::updateDirtyAndDynamicAttribs(VertexDataManager *vertexDataManager,
+                                                      const gl::State &amp;state,
+                                                      GLint start,
+                                                      GLsizei count,
+                                                      GLsizei instances)
+{
+    const gl::Program *program  = state.getProgram();
+    const auto &amp;activeLocations = program-&gt;getActiveAttribLocationsMask();
+
+    if (mAttribsToUpdate.any())
+    {
+        // Skip attrib locations the program doesn't use.
+        const auto &amp;activeToUpdate = (mAttribsToUpdate &amp; activeLocations);
+
+        for (auto toUpdateIndex : angle::IterateBitSet(activeToUpdate))
+        {
+            mAttribsToUpdate.reset(toUpdateIndex);
+            updateVertexAttribStorage(toUpdateIndex);
+        }
+    }
+
+    const auto &amp;attribs = mData.getVertexAttributes();
+
+    if (mAttribsToTranslate.any())
+    {
+        // Skip attrib locations the program doesn't use, saving for the next frame.
+        const auto &amp;dirtyActiveAttribs = (mAttribsToTranslate &amp; activeLocations);
+
+        for (auto dirtyAttribIndex : angle::IterateBitSet(dirtyActiveAttribs))
+        {
+            mAttribsToTranslate.reset(dirtyAttribIndex);
+
+            auto *translatedAttrib = &amp;mTranslatedAttribs[dirtyAttribIndex];
+            const auto &amp;currentValue =
+                state.getVertexAttribCurrentValue(static_cast&lt;unsigned int&gt;(dirtyAttribIndex));
+
+            // Record basic attrib info
+            translatedAttrib-&gt;attribute        = &amp;attribs[dirtyAttribIndex];
+            translatedAttrib-&gt;currentValueType = currentValue.Type;
+            translatedAttrib-&gt;divisor          = translatedAttrib-&gt;attribute-&gt;divisor;
+
+            switch (mAttributeStorageTypes[dirtyAttribIndex])
+            {
+                case VertexStorageType::DIRECT:
+                    VertexDataManager::StoreDirectAttrib(translatedAttrib);
+                    break;
+                case VertexStorageType::STATIC:
+                {
+                    auto error =
+                        VertexDataManager::StoreStaticAttrib(translatedAttrib, count, instances);
+                    if (error.isError())
+                    {
+                        return error;
+                    }
+                    break;
+                }
+                case VertexStorageType::CURRENT_VALUE:
+                    // Current value attribs are managed by the StateManager11.
+                    break;
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        }
+    }
+
+    if (mDynamicAttribsMask.any())
+    {
+        auto activeDynamicAttribs = (mDynamicAttribsMask &amp; activeLocations);
+
+        for (auto dynamicAttribIndex : angle::IterateBitSet(activeDynamicAttribs))
+        {
+            auto *dynamicAttrib = &amp;mTranslatedAttribs[dynamicAttribIndex];
+            const auto &amp;currentValue =
+                state.getVertexAttribCurrentValue(static_cast&lt;unsigned int&gt;(dynamicAttribIndex));
+
+            // Record basic attrib info
+            dynamicAttrib-&gt;attribute        = &amp;attribs[dynamicAttribIndex];
+            dynamicAttrib-&gt;currentValueType = currentValue.Type;
+            dynamicAttrib-&gt;divisor          = dynamicAttrib-&gt;attribute-&gt;divisor;
+        }
+
+        return vertexDataManager-&gt;storeDynamicAttribs(&amp;mTranslatedAttribs, activeDynamicAttribs,
+                                                      start, count, instances);
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+const std::vector&lt;TranslatedAttribute&gt; &amp;VertexArray11::getTranslatedAttribs() const
+{
+    return mTranslatedAttribs;
+}
+
+void VertexArray11::markBufferDataDirty(size_t attribIndex)
+{
+    ASSERT(mAttributeStorageTypes[attribIndex] != VertexStorageType::CURRENT_VALUE);
+
+    // This can change a buffer's storage, we'll need to re-check.
+    mAttribsToUpdate.set(attribIndex);
+}
+
+void VertexArray11::clearDirtyAndPromoteDynamicAttribs(const gl::State &amp;state, GLsizei count)
+{
+    const gl::Program *program  = state.getProgram();
+    const auto &amp;activeLocations = program-&gt;getActiveAttribLocationsMask();
+    mAttribsToUpdate &amp;= ~activeLocations;
+
+    // Promote to static after we clear the dirty attributes, otherwise we can lose dirtyness.
+    auto activeDynamicAttribs = (mDynamicAttribsMask &amp; activeLocations);
+    VertexDataManager::PromoteDynamicAttribs(mTranslatedAttribs, activeDynamicAttribs, count);
+}
+
+void VertexArray11::unlinkBuffer(size_t attribIndex, VertexStorageType storageType)
+{
+    Buffer11 *buffer = GetImplAs&lt;Buffer11&gt;(mCurrentBuffers[attribIndex].get());
+    if (storageType == VertexStorageType::DIRECT)
+    {
+        buffer-&gt;removeDirectBufferDirtyCallback(&amp;mOnBufferDataDirty[attribIndex]);
+    }
+    else if (storageType == VertexStorageType::STATIC || storageType == VertexStorageType::DYNAMIC)
+    {
+        buffer-&gt;removeStaticBufferDirtyCallback(&amp;mOnBufferDataDirty[attribIndex]);
+    }
+}
+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11VertexArray11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -19,22 +19,42 @@
</span><span class="cx"> class VertexArray11 : public VertexArrayImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    VertexArray11(Renderer11 *renderer)
-        : VertexArrayImpl(),
-          mRenderer(renderer)
-    {
-    }
-    virtual ~VertexArray11() { }
</del><ins>+    VertexArray11(const gl::VertexArray::Data &amp;data);
+    ~VertexArray11() override;
</ins><span class="cx"> 
</span><del>-    virtual void setElementArrayBuffer(const gl::Buffer *buffer) { }
-    virtual void setAttribute(size_t idx, const gl::VertexAttribute &amp;attr) { }
-    virtual void setAttributeDivisor(size_t idx, GLuint divisor) { }
-    virtual void enableAttribute(size_t idx, bool enabledState) { }
</del><ins>+    void syncState(const gl::VertexArray::DirtyBits &amp;dirtyBits) override;
+    gl::Error updateDirtyAndDynamicAttribs(VertexDataManager *vertexDataManager,
+                                           const gl::State &amp;state,
+                                           GLint start,
+                                           GLsizei count,
+                                           GLsizei instances);
+    void clearDirtyAndPromoteDynamicAttribs(const gl::State &amp;state, GLsizei count);
</ins><span class="cx"> 
</span><ins>+    const std::vector&lt;TranslatedAttribute&gt; &amp;getTranslatedAttribs() const;
+
</ins><span class="cx">   private:
</span><del>-    Renderer11 *mRenderer;
</del><ins>+    void updateVertexAttribStorage(size_t attribIndex);
+    void markBufferDataDirty(size_t attribIndex);
+    void unlinkBuffer(size_t attribIndex, VertexStorageType storageType);
+
+    std::vector&lt;VertexStorageType&gt; mAttributeStorageTypes;
+    std::vector&lt;TranslatedAttribute&gt; mTranslatedAttribs;
+
+    // The mask of attributes marked as dynamic.
+    gl::AttributesMask mDynamicAttribsMask;
+
+    // A mask of attributes that need to be re-evaluated.
+    gl::AttributesMask mAttribsToUpdate;
+
+    // A set of attributes we know are dirty, and need to be re-translated.
+    gl::AttributesMask mAttribsToTranslate;
+
+    // We need to keep a safe pointer to the Buffer so we can attach the correct dirty callbacks.
+    std::vector&lt;BindingPointer&lt;gl::Buffer&gt;&gt; mCurrentBuffers;
+
+    std::vector&lt;NotificationCallback&gt; mOnBufferDataDirty;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_D3D11_VERTEXARRAY11_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11VertexBuffer11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,6 +10,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Buffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/VertexAttribute.h&quot;
</span><ins>+#include &quot;libANGLE/formatutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Buffer11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
</span><span class="lines">@@ -103,16 +104,20 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &amp;attrib, const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                                GLint start, GLsizei count, GLsizei instances, unsigned int offset)
</del><ins>+gl::Error VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &amp;attrib,
+                                                GLenum currentValueType,
+                                                GLint start,
+                                                GLsizei count,
+                                                GLsizei instances,
+                                                unsigned int offset,
+                                                const uint8_t *sourceData)
</ins><span class="cx"> {
</span><span class="cx">     if (!mBuffer)
</span><span class="cx">     {
</span><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal vertex buffer is not initialized.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::Buffer *buffer = attrib.buffer.get();
-    int inputStride = ComputeVertexAttributeStride(attrib);
</del><ins>+    int inputStride = static_cast&lt;int&gt;(ComputeVertexAttributeStride(attrib));
</ins><span class="cx"> 
</span><span class="cx">     // This will map the resource if it isn't already mapped.
</span><span class="cx">     gl::Error error = mapResource();
</span><span class="lines">@@ -123,86 +128,22 @@
</span><span class="cx"> 
</span><span class="cx">     uint8_t *output = mMappedResourceData + offset;
</span><span class="cx"> 
</span><del>-    const uint8_t *input = NULL;
-    if (attrib.enabled)
-    {
-        if (buffer)
-        {
-            BufferD3D *storage = GetImplAs&lt;BufferD3D&gt;(buffer);
-            error = storage-&gt;getData(&amp;input);
-            if (error.isError())
-            {
-                return error;
-            }
-            input += static_cast&lt;int&gt;(attrib.offset);
-        }
-        else
-        {
-            input = static_cast&lt;const uint8_t*&gt;(attrib.pointer);
-        }
-    }
-    else
-    {
-        input = reinterpret_cast&lt;const uint8_t*&gt;(currentValue.FloatValues);
-    }
</del><ins>+    const uint8_t *input = sourceData;
</ins><span class="cx"> 
</span><span class="cx">     if (instances == 0 || attrib.divisor == 0)
</span><span class="cx">     {
</span><span class="cx">         input += inputStride * start;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::VertexFormat vertexFormat(attrib, currentValue.Type);
-    const d3d11::VertexFormat &amp;vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormat, mRenderer-&gt;getFeatureLevel());
</del><ins>+    gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, currentValueType);
+    const D3D_FEATURE_LEVEL featureLevel = mRenderer-&gt;getRenderer11DeviceCaps().featureLevel;
+    const d3d11::VertexFormat &amp;vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormatType, featureLevel);
</ins><span class="cx">     ASSERT(vertexFormatInfo.copyFunction != NULL);
</span><span class="cx">     vertexFormatInfo.copyFunction(input, inputStride, count, output);
</span><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexBuffer11::getSpaceRequired(const gl::VertexAttribute &amp;attrib, GLsizei count,
-                                           GLsizei instances, unsigned int *outSpaceRequired) const
-{
-    unsigned int elementCount = 0;
-    if (attrib.enabled)
-    {
-        if (instances == 0 || attrib.divisor == 0)
-        {
-            elementCount = count;
-        }
-        else
-        {
-            // Round up to divisor, if possible
-            elementCount = UnsignedCeilDivide(static_cast&lt;unsigned int&gt;(instances), attrib.divisor);
-        }
-
-        gl::VertexFormat vertexFormat(attrib);
-        const d3d11::VertexFormat &amp;vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormat, mRenderer-&gt;getFeatureLevel());
-        const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(vertexFormatInfo.nativeFormat);
-        unsigned int elementSize = dxgiFormatInfo.pixelBytes;
-        if (elementSize &lt;= std::numeric_limits&lt;unsigned int&gt;::max() / elementCount)
-        {
-            if (outSpaceRequired)
-            {
-                *outSpaceRequired = elementSize * elementCount;
-            }
-            return gl::Error(GL_NO_ERROR);
-        }
-        else
-        {
-            return gl::Error(GL_OUT_OF_MEMORY, &quot;New vertex buffer size would result in an overflow.&quot;);
-        }
-    }
-    else
-    {
-        const unsigned int elementSize = 4;
-        if (outSpaceRequired)
-        {
-            *outSpaceRequired = elementSize * 4;
-        }
-        return gl::Error(GL_NO_ERROR);
-    }
-}
-
</del><span class="cx"> unsigned int VertexBuffer11::getBufferSize() const
</span><span class="cx"> {
</span><span class="cx">     return mBufferSize;
</span><span class="lines">@@ -246,4 +187,4 @@
</span><span class="cx">     return mBuffer;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11VertexBuffer11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/VertexBuffer11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,25 +21,27 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     explicit VertexBuffer11(Renderer11 *const renderer);
</span><del>-    virtual ~VertexBuffer11();
</del><span class="cx"> 
</span><del>-    virtual gl::Error initialize(unsigned int size, bool dynamicUsage);
</del><ins>+    gl::Error initialize(unsigned int size, bool dynamicUsage) override;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &amp;attrib, const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                            GLint start, GLsizei count, GLsizei instances, unsigned int offset);
</del><ins>+    gl::Error storeVertexAttributes(const gl::VertexAttribute &amp;attrib,
+                                    GLenum currentValueType,
+                                    GLint start,
+                                    GLsizei count,
+                                    GLsizei instances,
+                                    unsigned int offset,
+                                    const uint8_t *sourceData) override;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error getSpaceRequired(const gl::VertexAttribute &amp;attrib, GLsizei count, GLsizei instances,
-                                       unsigned int *outSpaceRequired) const;
</del><ins>+    unsigned int getBufferSize() const override;
+    gl::Error setBufferSize(unsigned int size) override;
+    gl::Error discard() override;
</ins><span class="cx"> 
</span><del>-    virtual unsigned int getBufferSize() const;
-    virtual gl::Error setBufferSize(unsigned int size);
-    virtual gl::Error discard();
</del><ins>+    void hintUnmapResource() override;
</ins><span class="cx"> 
</span><del>-    virtual void hintUnmapResource();
-
</del><span class="cx">     ID3D11Buffer *getBuffer() const;
</span><span class="cx"> 
</span><span class="cx">   private:
</span><ins>+    ~VertexBuffer11() override;
</ins><span class="cx">     gl::Error mapResource();
</span><span class="cx"> 
</span><span class="cx">     Renderer11 *const mRenderer;
</span><span class="lines">@@ -51,6 +53,6 @@
</span><span class="cx">     uint8_t *mMappedResourceData;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_D3D11_VERTEXBUFFER11_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11copyvertexinl"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/copyvertex.inl        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,34 +15,43 @@
</span><span class="cx">     if (attribSize == stride &amp;&amp; inputComponentCount == outputComponentCount)
</span><span class="cx">     {
</span><span class="cx">         memcpy(output, input, count * attribSize);
</span><ins>+        return;
</ins><span class="cx">     }
</span><del>-    else
</del><ins>+
+    if (inputComponentCount == outputComponentCount)
</ins><span class="cx">     {
</span><del>-        const T defaultAlphaValue = gl::bitCast&lt;T&gt;(alphaDefaultValueBits);
-        const size_t lastNonAlphaOutputComponent = std::min&lt;size_t&gt;(outputComponentCount, 3);
-
</del><span class="cx">         for (size_t i = 0; i &lt; count; i++)
</span><span class="cx">         {
</span><span class="cx">             const T *offsetInput = reinterpret_cast&lt;const T*&gt;(input + (i * stride));
</span><span class="cx">             T *offsetOutput = reinterpret_cast&lt;T*&gt;(output) + i * outputComponentCount;
</span><span class="cx"> 
</span><del>-            for (size_t j = 0; j &lt; inputComponentCount; j++)
-            {
-                offsetOutput[j] = offsetInput[j];
-            }
</del><ins>+            memcpy(offsetOutput, offsetInput, attribSize);
+        }
+        return;
+    }
</ins><span class="cx"> 
</span><del>-            for (size_t j = inputComponentCount; j &lt; lastNonAlphaOutputComponent; j++)
-            {
-                // Set the remaining G/B channels to 0.
-                offsetOutput[j] = 0;
-            }
</del><ins>+    const T defaultAlphaValue = gl::bitCast&lt;T&gt;(alphaDefaultValueBits);
+    const size_t lastNonAlphaOutputComponent = std::min&lt;size_t&gt;(outputComponentCount, 3);
</ins><span class="cx"> 
</span><del>-            if (inputComponentCount &lt; outputComponentCount &amp;&amp; outputComponentCount == 4)
-            {
-                // Set the remaining alpha channel to the defaultAlphaValue.
-                offsetOutput[3] = defaultAlphaValue;
-            }
</del><ins>+    for (size_t i = 0; i &lt; count; i++)
+    {
+        const T *offsetInput = reinterpret_cast&lt;const T*&gt;(input + (i * stride));
+        T *offsetOutput = reinterpret_cast&lt;T*&gt;(output) + i * outputComponentCount;
+
+        memcpy(offsetOutput, offsetInput, attribSize);
+
+        if (inputComponentCount &lt; lastNonAlphaOutputComponent)
+        {
+            // Set the remaining G/B channels to 0.
+            size_t numComponents = (lastNonAlphaOutputComponent - inputComponentCount);
+            memset(&amp;offsetOutput[inputComponentCount], 0, numComponents * sizeof(T));
</ins><span class="cx">         }
</span><ins>+
+        if (inputComponentCount &lt; outputComponentCount &amp;&amp; outputComponentCount == 4)
+        {
+            // Set the remaining alpha channel to the defaultAlphaValue.
+            offsetOutput[3] = defaultAlphaValue;
+        }
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11dxgi_support_datajson"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,1164 @@
</span><ins>+[
+  {
+    &quot;DXGI_FORMAT_UNKNOWN&quot;:
+    {
+      &quot;texture2D&quot;: &quot;never&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32B32A32_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32B32A32_FLOAT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0check10_1always&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32B32A32_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32B32A32_SINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32B32_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32B32_FLOAT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;11_0check&quot;,
+      &quot;renderTarget&quot;: &quot;check&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32B32_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;check&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32B32_SINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;check&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16B16A16_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16B16A16_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16B16A16_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16B16A16_SNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16B16A16_SINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32_FLOAT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0check10_1always&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G32_SINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32G8X24_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_D32_FLOAT_S8X24_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;always&quot;
+    },
+    &quot;DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0check10_1always&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_X32_TYPELESS_G8X24_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R10G10B10A2_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R10G10B10A2_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R10G10B10A2_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R11G11B10_FLOAT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8B8A8_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8B8A8_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8B8A8_SNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8B8A8_SINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16_FLOAT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16_SNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16G16_SINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_D32_FLOAT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;always&quot;
+    },
+    &quot;DXGI_FORMAT_R32_FLOAT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0check10_1always&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R32_SINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R24G8_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_D24_UNORM_S8_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;always&quot;
+    },
+    &quot;DXGI_FORMAT_R24_UNORM_X8_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0check10_1always&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_X24_TYPELESS_G8_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8_SNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8_SINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16_FLOAT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_D16_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;always&quot;
+    },
+    &quot;DXGI_FORMAT_R16_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16_SNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R16_SINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8_UINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8_SNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8_SINT&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_A8_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R1_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;11_0&quot;,
+      &quot;textureCube&quot;: &quot;11_0&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R9G9B9E5_SHAREDEXP&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R8G8_B8G8_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_G8R8_G8B8_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC1_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC1_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC1_UNORM_SRGB&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC2_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC2_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC2_UNORM_SRGB&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC3_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC3_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC3_UNORM_SRGB&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC4_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC4_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC4_SNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC5_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC5_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC5_SNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;always&quot;,
+      &quot;texture3D&quot;: &quot;always&quot;,
+      &quot;textureCube&quot;: &quot;always&quot;,
+      &quot;shaderSample&quot;: &quot;10_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_B5G6R5_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;dxgi1_2&quot;,
+      &quot;texture3D&quot;: &quot;dxgi1_2&quot;,
+      &quot;textureCube&quot;: &quot;dxgi1_2&quot;,
+      &quot;shaderSample&quot;: &quot;dxgi1_2&quot;,
+      &quot;renderTarget&quot;: &quot;dxgi1_2&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_B5G5R5A1_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;dxgi1_2&quot;,
+      &quot;texture3D&quot;: &quot;dxgi1_2&quot;,
+      &quot;textureCube&quot;: &quot;dxgi1_2&quot;,
+      &quot;shaderSample&quot;: &quot;dxgi1_2&quot;,
+      &quot;renderTarget&quot;: &quot;check&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_B8G8R8A8_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;check&quot;,
+      &quot;texture3D&quot;: &quot;check&quot;,
+      &quot;textureCube&quot;: &quot;check&quot;,
+      &quot;shaderSample&quot;: &quot;10_0check11_0always&quot;,
+      &quot;renderTarget&quot;: &quot;10_0check11_0always&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_B8G8R8X8_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;check&quot;,
+      &quot;texture3D&quot;: &quot;check&quot;,
+      &quot;textureCube&quot;: &quot;check&quot;,
+      &quot;shaderSample&quot;: &quot;10_0check11_0always&quot;,
+      &quot;renderTarget&quot;: &quot;11_0&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;check&quot;,
+      &quot;texture3D&quot;: &quot;check&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_B8G8R8A8_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;check&quot;,
+      &quot;texture3D&quot;: &quot;check&quot;,
+      &quot;textureCube&quot;: &quot;check&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_B8G8R8A8_UNORM_SRGB&quot;:
+    {
+      &quot;texture2D&quot;: &quot;check&quot;,
+      &quot;texture3D&quot;: &quot;check&quot;,
+      &quot;textureCube&quot;: &quot;check&quot;,
+      &quot;shaderSample&quot;: &quot;10_0check11_0always&quot;,
+      &quot;renderTarget&quot;: &quot;11_0&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_B8G8R8X8_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;check&quot;,
+      &quot;texture3D&quot;: &quot;check&quot;,
+      &quot;textureCube&quot;: &quot;check&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_B8G8R8X8_UNORM_SRGB&quot;:
+    {
+      &quot;texture2D&quot;: &quot;check&quot;,
+      &quot;texture3D&quot;: &quot;check&quot;,
+      &quot;textureCube&quot;: &quot;check&quot;,
+      &quot;shaderSample&quot;: &quot;10_0check11_0always&quot;,
+      &quot;renderTarget&quot;: &quot;11_0&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC6H_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_0&quot;,
+      &quot;texture3D&quot;: &quot;11_0&quot;,
+      &quot;textureCube&quot;: &quot;11_0&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC6H_UF16&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_0&quot;,
+      &quot;texture3D&quot;: &quot;11_0&quot;,
+      &quot;textureCube&quot;: &quot;11_0&quot;,
+      &quot;shaderSample&quot;: &quot;11_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC6H_SF16&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_0&quot;,
+      &quot;texture3D&quot;: &quot;11_0&quot;,
+      &quot;textureCube&quot;: &quot;11_0&quot;,
+      &quot;shaderSample&quot;: &quot;11_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC7_TYPELESS&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_0&quot;,
+      &quot;texture3D&quot;: &quot;11_0&quot;,
+      &quot;textureCube&quot;: &quot;11_0&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC7_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_0&quot;,
+      &quot;texture3D&quot;: &quot;11_0&quot;,
+      &quot;textureCube&quot;: &quot;11_0&quot;,
+      &quot;shaderSample&quot;: &quot;11_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_BC7_UNORM_SRGB&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_0&quot;,
+      &quot;texture3D&quot;: &quot;11_0&quot;,
+      &quot;textureCube&quot;: &quot;11_0&quot;,
+      &quot;shaderSample&quot;: &quot;11_0&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_AYUV&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;11_1&quot;,
+      &quot;renderTarget&quot;: &quot;11_1&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_Y410&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;11_1&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_Y416&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;11_1&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_NV12&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;11_1&quot;,
+      &quot;renderTarget&quot;: &quot;11_1&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_P010&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;11_1&quot;,
+      &quot;renderTarget&quot;: &quot;11_1&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_P016&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;11_1&quot;,
+      &quot;renderTarget&quot;: &quot;11_1&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_420_OPAQUE&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_YUY2&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;11_1&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_Y210&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;11_1&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_Y216&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;11_1&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_NV11&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;11_1&quot;,
+      &quot;renderTarget&quot;: &quot;11_1&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_AI44&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_IA44&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_P8&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_A8P8&quot;:
+    {
+      &quot;texture2D&quot;: &quot;11_1&quot;,
+      &quot;texture3D&quot;: &quot;never&quot;,
+      &quot;textureCube&quot;: &quot;never&quot;,
+      &quot;shaderSample&quot;: &quot;never&quot;,
+      &quot;renderTarget&quot;: &quot;never&quot;,
+      &quot;multisampleRT&quot;: &quot;never&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    },
+    &quot;DXGI_FORMAT_B4G4R4A4_UNORM&quot;:
+    {
+      &quot;texture2D&quot;: &quot;dxgi1_2&quot;,
+      &quot;texture3D&quot;: &quot;dxgi1_2&quot;,
+      &quot;textureCube&quot;: &quot;dxgi1_2&quot;,
+      &quot;shaderSample&quot;: &quot;dxgi1_2&quot;,
+      &quot;renderTarget&quot;: &quot;check&quot;,
+      &quot;multisampleRT&quot;: &quot;check&quot;,
+      &quot;depthStencil&quot;: &quot;never&quot;
+    }
+  }
+]
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11dxgi_support_tablecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,1846 @@
</span><ins>+// GENERATED FILE - DO NOT EDIT. See dxgi_support_data.json.
+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// dxgi_support_table:
+//   Queries for DXGI support of various texture formats. Depends on DXGI
+//   version, D3D feature level, and is sometimes guaranteed or optional.
+//
+
+#include &quot;libANGLE/renderer/d3d/d3d11/dxgi_support_table.h&quot;
+
+#include &quot;common/debug.h&quot;
+
+namespace rx
+{
+
+namespace d3d11
+{
+
+#define F_2D D3D11_FORMAT_SUPPORT_TEXTURE2D
+#define F_3D D3D11_FORMAT_SUPPORT_TEXTURE3D
+#define F_CUBE D3D11_FORMAT_SUPPORT_TEXTURECUBE
+#define F_SAMPLE D3D11_FORMAT_SUPPORT_SHADER_SAMPLE
+#define F_RT D3D11_FORMAT_SUPPORT_RENDER_TARGET
+#define F_MS D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET
+#define F_DS D3D11_FORMAT_SUPPORT_DEPTH_STENCIL
+
+namespace
+{
+
+const DXGISupport &amp;GetDefaultSupport()
+{
+    static UINT AllSupportFlags = D3D11_FORMAT_SUPPORT_TEXTURE2D |
+                                  D3D11_FORMAT_SUPPORT_TEXTURE3D |
+                                  D3D11_FORMAT_SUPPORT_TEXTURECUBE |
+                                  D3D11_FORMAT_SUPPORT_SHADER_SAMPLE |
+                                  D3D11_FORMAT_SUPPORT_RENDER_TARGET |
+                                  D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET |
+                                  D3D11_FORMAT_SUPPORT_DEPTH_STENCIL;
+    static const DXGISupport defaultSupport(0, 0, AllSupportFlags);
+    return defaultSupport;
+}
+
+const DXGISupport &amp;GetDXGISupport_10_0(DXGI_FORMAT dxgiFormat)
+{
+    switch (dxgiFormat)
+    {
+        case DXGI_FORMAT_420_OPAQUE:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_A8P8:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_A8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_AI44:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_AYUV:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_B4G4R4A4_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_B5G5R5A1_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_B5G6R5_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8A8_TYPELESS:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8A8_UNORM:
+        {
+            static const DXGISupport info(0, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_RT | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
+        {
+            static const DXGISupport info(0, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8X8_TYPELESS:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8X8_UNORM:
+        {
+            static const DXGISupport info(0, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
+        {
+            static const DXGISupport info(0, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_BC1_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC1_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC1_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC2_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC2_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC2_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC3_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC3_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC3_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC4_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC4_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC4_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC5_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC5_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC5_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC6H_SF16:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC6H_TYPELESS:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC6H_UF16:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC7_TYPELESS:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC7_UNORM:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC7_UNORM_SRGB:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_D16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_D24_UNORM_S8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_D32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_G8R8_G8B8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_IA44:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_NV11:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_NV12:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_P010:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_P016:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_P8:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10A2_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10A2_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10A2_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
+        {
+            static const DXGISupport info(0, F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, F_2D | F_3D);
+            return info;
+        }
+        case DXGI_FORMAT_R11G11B10_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R16_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R1_UNORM:
+        {
+            static const DXGISupport info(F_2D, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R24G8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT, F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS, F_MS | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_SAMPLE, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_SAMPLE, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS, F_MS | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G8X24_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS, F_MS | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT, F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_R32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_B8G8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_UNKNOWN:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y210:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y216:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y410:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y416:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_YUY2:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+
+        default:
+            UNREACHABLE();
+            return GetDefaultSupport();
+    }
+}
+
+const DXGISupport &amp;GetDXGISupport_10_1(DXGI_FORMAT dxgiFormat)
+{
+    switch (dxgiFormat)
+    {
+        case DXGI_FORMAT_420_OPAQUE:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_A8P8:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_A8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_AI44:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_AYUV:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_B4G4R4A4_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_B5G5R5A1_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_B5G6R5_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8A8_TYPELESS:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8A8_UNORM:
+        {
+            static const DXGISupport info(0, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_RT | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
+        {
+            static const DXGISupport info(0, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8X8_TYPELESS:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8X8_UNORM:
+        {
+            static const DXGISupport info(0, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
+        {
+            static const DXGISupport info(0, F_DS, F_2D | F_3D | F_CUBE | F_MS | F_SAMPLE);
+            return info;
+        }
+        case DXGI_FORMAT_BC1_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC1_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC1_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC2_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC2_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC2_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC3_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC3_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC3_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC4_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC4_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC4_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC5_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC5_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC5_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC6H_SF16:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC6H_TYPELESS:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC6H_UF16:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC7_TYPELESS:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC7_UNORM:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC7_UNORM_SRGB:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_D16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_D24_UNORM_S8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_D32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_G8R8_G8B8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_IA44:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_NV11:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_NV12:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_P010:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_P016:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_P8:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10A2_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10A2_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10A2_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
+        {
+            static const DXGISupport info(0, F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, F_2D | F_3D);
+            return info;
+        }
+        case DXGI_FORMAT_R11G11B10_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R16_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R1_UNORM:
+        {
+            static const DXGISupport info(F_2D, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R24G8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_SAMPLE, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_SAMPLE, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G8X24_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_B8G8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_UNKNOWN:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y210:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y216:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y410:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y416:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_YUY2:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+
+        default:
+            UNREACHABLE();
+            return GetDefaultSupport();
+    }
+}
+
+const DXGISupport &amp;GetDXGISupport_11_0(DXGI_FORMAT dxgiFormat)
+{
+    switch (dxgiFormat)
+    {
+        case DXGI_FORMAT_420_OPAQUE:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_A8P8:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_A8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_AI44:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_AYUV:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_B4G4R4A4_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_B5G5R5A1_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_B5G6R5_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8A8_TYPELESS:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8A8_UNORM:
+        {
+            static const DXGISupport info(F_RT | F_SAMPLE, F_DS, F_2D | F_3D | F_CUBE | F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_RT | F_SAMPLE, F_DS, F_2D | F_3D | F_CUBE | F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8X8_TYPELESS:
+        {
+            static const DXGISupport info(0, F_DS | F_MS | F_RT | F_SAMPLE, F_2D | F_3D | F_CUBE);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8X8_UNORM:
+        {
+            static const DXGISupport info(F_RT | F_SAMPLE, F_DS, F_2D | F_3D | F_CUBE | F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_RT | F_SAMPLE, F_DS, F_2D | F_3D | F_CUBE | F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_BC1_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC1_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC1_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC2_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC2_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC2_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC3_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC3_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC3_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC4_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC4_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC4_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC5_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC5_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC5_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC6H_SF16:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC6H_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC6H_UF16:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC7_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC7_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_BC7_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_D16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_D24_UNORM_S8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_D32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_DS, F_3D | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_G8R8_G8B8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_IA44:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_NV11:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_NV12:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_P010:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_P016:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_RT | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_P8:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10A2_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10A2_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10A2_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
+        {
+            static const DXGISupport info(0, F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, F_2D | F_3D);
+            return info;
+        }
+        case DXGI_FORMAT_R11G11B10_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16B16A16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16G16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R16_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R16_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R1_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R24G8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32A32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_SAMPLE, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32B32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_SAMPLE, F_MS | F_RT);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32G32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32G8X24_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32_FLOAT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_CUBE | F_SAMPLE, F_3D | F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R32_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R32_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_B8G8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8G8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_SINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_SNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_TYPELESS:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE, F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_R8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT, F_DS | F_SAMPLE, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R8_UNORM:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_RT | F_SAMPLE, F_DS, F_MS);
+            return info;
+        }
+        case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
+        {
+            static const DXGISupport info(F_2D | F_3D | F_CUBE | F_SAMPLE, F_DS | F_MS | F_RT, 0);
+            return info;
+        }
+        case DXGI_FORMAT_UNKNOWN:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
+        {
+            static const DXGISupport info(F_2D | F_CUBE, F_3D | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y210:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y216:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y410:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_Y416:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+        case DXGI_FORMAT_YUY2:
+        {
+            static const DXGISupport info(0, F_2D | F_3D | F_CUBE | F_DS | F_MS | F_RT | F_SAMPLE, 0);
+            return info;
+        }
+
+        default:
+            UNREACHABLE();
+            return GetDefaultSupport();
+    }
+}
+
+}
+
+#undef F_2D
+#undef F_3D
+#undef F_CUBE
+#undef F_SAMPLE
+#undef F_RT
+#undef F_MS
+#undef F_DS
+
+const DXGISupport &amp;GetDXGISupport(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel)
+{
+    switch (featureLevel)
+    {
+        case D3D_FEATURE_LEVEL_10_0:
+            return GetDXGISupport_10_0(dxgiFormat);
+        case D3D_FEATURE_LEVEL_10_1:
+            return GetDXGISupport_10_1(dxgiFormat);
+        case D3D_FEATURE_LEVEL_11_0:
+            return GetDXGISupport_11_0(dxgiFormat);
+        default:
+            return GetDefaultSupport();
+    }
+}
+
+} // namespace d3d11
+
+} // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11dxgi_support_tableh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// dxgi_support_table:
+//   Queries for DXGI support of various texture formats. Depends on DXGI
+//   version, D3D feature level, and is sometimes guaranteed or optional.
+//
+
+#include &quot;common/platform.h&quot;
+
+namespace rx
+{
+
+namespace d3d11
+{
+
+struct DXGISupport
+{
+    DXGISupport()
+        : alwaysSupportedFlags(0),
+          neverSupportedFlags(0),
+          optionallySupportedFlags(0)
+    {
+    }
+
+    DXGISupport(UINT alwaysSupportedIn, UINT neverSupportedIn, UINT optionallySupportedIn)
+        : alwaysSupportedFlags(alwaysSupportedIn),
+          neverSupportedFlags(neverSupportedIn),
+          optionallySupportedFlags(optionallySupportedIn)
+    {
+    }
+
+    UINT alwaysSupportedFlags;
+    UINT neverSupportedFlags;
+    UINT optionallySupportedFlags;
+};
+
+const DXGISupport &amp;GetDXGISupport(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel);
+
+} // namespace d3d11
+
+} // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11formatutils11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,11 +10,13 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><del>-#include &quot;libANGLE/renderer/Renderer.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/copyimage.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/copyvertex.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/generatemip.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/loadimage.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d11/copyvertex.h&quot;
</del><ins>+#include &quot;libANGLE/renderer/Renderer.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -22,86 +24,6 @@
</span><span class="cx"> namespace d3d11
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-typedef std::map&lt;DXGI_FORMAT, GLenum&gt; DXGIToESFormatMap;
-
-inline void AddDXGIToESEntry(DXGIToESFormatMap *map, DXGI_FORMAT key, GLenum value)
-{
-    map-&gt;insert(std::make_pair(key, value));
-}
-
-static DXGIToESFormatMap BuildDXGIToESFormatMap()
-{
-    DXGIToESFormatMap map;
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_UNKNOWN,                  GL_NONE);
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_A8_UNORM,                 GL_ALPHA8_EXT);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8_UNORM,                 GL_R8);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8G8_UNORM,               GL_RG8);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8G8B8A8_UNORM,           GL_RGBA8);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,      GL_SRGB8_ALPHA8);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_B8G8R8A8_UNORM,           GL_BGRA8_EXT);
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8_SNORM,                 GL_R8_SNORM);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8G8_SNORM,               GL_RG8_SNORM);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8G8B8A8_SNORM,           GL_RGBA8_SNORM);
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8_UINT,                  GL_R8UI);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16_UINT,                 GL_R16UI);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32_UINT,                 GL_R32UI);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8G8_UINT,                GL_RG8UI);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16G16_UINT,              GL_RG16UI);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32G32_UINT,              GL_RG32UI);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32G32B32_UINT,           GL_RGB32UI);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8G8B8A8_UINT,            GL_RGBA8UI);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16G16B16A16_UINT,        GL_RGBA16UI);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32G32B32A32_UINT,        GL_RGBA32UI);
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8_SINT,                  GL_R8I);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16_SINT,                 GL_R16I);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32_SINT,                 GL_R32I);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8G8_SINT,                GL_RG8I);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16G16_SINT,              GL_RG16I);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32G32_SINT,              GL_RG32I);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32G32B32_SINT,           GL_RGB32I);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R8G8B8A8_SINT,            GL_RGBA8I);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16G16B16A16_SINT,        GL_RGBA16I);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32G32B32A32_SINT,        GL_RGBA32I);
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R10G10B10A2_UNORM,        GL_RGB10_A2);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R10G10B10A2_UINT,         GL_RGB10_A2UI);
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16_FLOAT,                GL_R16F);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16G16_FLOAT,             GL_RG16F);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16G16B16A16_FLOAT,       GL_RGBA16F);
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32_FLOAT,                GL_R32F);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32G32_FLOAT,             GL_RG32F);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32G32B32_FLOAT,          GL_RGB32F);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32G32B32A32_FLOAT,       GL_RGBA32F);
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R9G9B9E5_SHAREDEXP,       GL_RGB9_E5);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R11G11B10_FLOAT,          GL_R11F_G11F_B10F);
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16_TYPELESS,             GL_DEPTH_COMPONENT16);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R16_UNORM,                GL_DEPTH_COMPONENT16);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_D16_UNORM,                GL_DEPTH_COMPONENT16);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R24G8_TYPELESS,           GL_DEPTH24_STENCIL8_OES);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    GL_DEPTH24_STENCIL8_OES);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_D24_UNORM_S8_UINT,        GL_DEPTH24_STENCIL8_OES);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32G8X24_TYPELESS,        GL_DEPTH32F_STENCIL8);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, GL_DEPTH32F_STENCIL8);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_D32_FLOAT_S8X24_UINT,     GL_DEPTH32F_STENCIL8);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_R32_TYPELESS,             GL_DEPTH_COMPONENT32F);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_D32_FLOAT,                GL_DEPTH_COMPONENT32F);
-
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_BC1_UNORM,                GL_COMPRESSED_RGBA_S3TC_DXT1_EXT);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_BC2_UNORM,                GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE);
-    AddDXGIToESEntry(&amp;map, DXGI_FORMAT_BC3_UNORM,                GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE);
-
-    return map;
-}
-
</del><span class="cx"> struct D3D11FastCopyFormat
</span><span class="cx"> {
</span><span class="cx">     GLenum destFormat;
</span><span class="lines">@@ -161,6 +83,7 @@
</span><span class="cx"> {
</span><span class="cx">     ColorFormatInfoMap map;
</span><span class="cx"> 
</span><ins>+    // clang-format off
</ins><span class="cx">     //                             | DXGI format                         | R | G | B | A | S |
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_A8_UNORM,                  0,  0,  0,  8,  0);
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R8_UNORM,                  8,  0,  0,  0,  0);
</span><span class="lines">@@ -168,10 +91,16 @@
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R8G8B8A8_UNORM,            8,  8,  8,  8,  0);
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,       8,  8,  8,  8,  0);
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_B8G8R8A8_UNORM,            8,  8,  8,  8,  0);
</span><ins>+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16_UNORM,                16,  0,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16G16_UNORM,             16, 16,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16G16B16A16_UNORM,       16, 16, 16, 16,  0);
</ins><span class="cx"> 
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R8_SNORM,                  8,  0,  0,  0,  0);
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R8G8_SNORM,                8,  8,  0,  0,  0);
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R8G8B8A8_SNORM,            8,  8,  8,  8,  0);
</span><ins>+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16_SNORM,                16,  0,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16G16_SNORM,             16, 16,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16G16B16A16_SNORM,       16, 16, 16, 16,  0);
</ins><span class="cx"> 
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R8_UINT,                   8,  0,  0,  0,  0);
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16_UINT,                 16,  0,  0,  0,  0);
</span><span class="lines">@@ -195,6 +124,7 @@
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16G16B16A16_SINT,        16, 16, 16, 16,  0);
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R32G32B32A32_SINT,        32, 32, 32, 32,  0);
</span><span class="cx"> 
</span><ins>+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R10G10B10A2_TYPELESS,     10, 10, 10,  2,  0);
</ins><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R10G10B10A2_UNORM,        10, 10, 10,  2,  0);
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R10G10B10A2_UINT,         10, 10, 10,  2,  0);
</span><span class="cx"> 
</span><span class="lines">@@ -210,28 +140,47 @@
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R9G9B9E5_SHAREDEXP,        9,  9,  9,  0,  5);
</span><span class="cx">     InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R11G11B10_FLOAT,          11, 11, 10,  0,  0);
</span><span class="cx"> 
</span><ins>+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_B5G6R5_UNORM,              5,  6,  5,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_B4G4R4A4_UNORM,            4,  4,  4,  4,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_B5G5R5A1_UNORM,            5,  5,  5,  1,  0);
+
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R8_TYPELESS,               8,  0,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16_TYPELESS,             16,  0,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R32_TYPELESS,             32,  0,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R8G8_TYPELESS,             8,  8,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16G16_TYPELESS,          16, 16,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R32G32_TYPELESS,          32, 32,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R32G32B32_TYPELESS,       32, 32, 32,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R8G8B8A8_TYPELESS,         8,  8,  8,  8,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R16G16B16A16_TYPELESS,    16, 16, 16, 16,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R32G32B32A32_TYPELESS,    32, 32, 32, 32,  0);
+
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R24G8_TYPELESS,           24,  8,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    24,  0,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R32G8X24_TYPELESS,        32,  8,  0,  0,  0);
+    InsertDXGIColorFormatInfo(&amp;map, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, 32,  0,  0,  0,  0);
+    // clang-format on
+
</ins><span class="cx">     return map;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> struct DXGIDepthStencilInfo
</span><span class="cx"> {
</span><span class="cx">     unsigned int depthBits;
</span><del>-    unsigned int depthOffset;
</del><span class="cx">     unsigned int stencilBits;
</span><del>-    unsigned int stencilOffset;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> typedef std::map&lt;DXGI_FORMAT, DXGIDepthStencilInfo&gt; DepthStencilInfoMap;
</span><span class="cx"> typedef std::pair&lt;DXGI_FORMAT, DXGIDepthStencilInfo&gt; DepthStencilInfoPair;
</span><span class="cx"> 
</span><del>-static inline void InsertDXGIDepthStencilInfo(DepthStencilInfoMap *map, DXGI_FORMAT format, unsigned int depthBits,
-                                              unsigned int depthOffset, unsigned int stencilBits, unsigned int stencilOffset)
</del><ins>+static inline void InsertDXGIDepthStencilInfo(DepthStencilInfoMap *map,
+                                              DXGI_FORMAT format,
+                                              unsigned int depthBits,
+                                              unsigned int stencilBits)
</ins><span class="cx"> {
</span><span class="cx">     DXGIDepthStencilInfo info;
</span><span class="cx">     info.depthBits = depthBits;
</span><del>-    info.depthOffset = depthOffset;
</del><span class="cx">     info.stencilBits = stencilBits;
</span><del>-    info.stencilOffset = stencilOffset;
</del><span class="cx"> 
</span><span class="cx">     map-&gt;insert(std::make_pair(format, info));
</span><span class="cx"> }
</span><span class="lines">@@ -240,44 +189,27 @@
</span><span class="cx"> {
</span><span class="cx">     DepthStencilInfoMap map;
</span><span class="cx"> 
</span><del>-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_R16_TYPELESS,             16, 0, 0,  0);
-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_R16_UNORM,                16, 0, 0,  0);
-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_D16_UNORM,                16, 0, 0,  0);
</del><ins>+    // clang-format off
+    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_D16_UNORM,                16, 0);
+    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_D24_UNORM_S8_UINT,        24, 8);
+    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_D32_FLOAT,                32, 0);
+    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_D32_FLOAT_S8X24_UINT,     32, 8);
+    // clang-format on
</ins><span class="cx"> 
</span><del>-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_R24G8_TYPELESS,           24, 0, 8, 24);
-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    24, 0, 8, 24);
-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_D24_UNORM_S8_UINT,        24, 0, 8, 24);
-
-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_R32_TYPELESS,             32, 0, 0,  0);
-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_R32_FLOAT,                32, 0, 0,  0);
-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_D32_FLOAT,                32, 0, 0,  0);
-
-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_R32G8X24_TYPELESS,        32, 0, 8, 32);
-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, 32, 0, 8, 32);
-    InsertDXGIDepthStencilInfo(&amp;map, DXGI_FORMAT_D32_FLOAT_S8X24_UINT,     32, 0, 8, 32);
-
</del><span class="cx">     return map;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> typedef std::map&lt;DXGI_FORMAT, DXGIFormat&gt; DXGIFormatInfoMap;
</span><span class="cx"> 
</span><span class="cx"> DXGIFormat::DXGIFormat()
</span><del>-    : pixelBytes(0),
-      blockWidth(0),
-      blockHeight(0),
-      redBits(0),
</del><ins>+    : redBits(0),
</ins><span class="cx">       greenBits(0),
</span><span class="cx">       blueBits(0),
</span><span class="cx">       alphaBits(0),
</span><span class="cx">       sharedBits(0),
</span><span class="cx">       depthBits(0),
</span><del>-      depthOffset(0),
</del><span class="cx">       stencilBits(0),
</span><del>-      stencilOffset(0),
-      internalFormat(GL_NONE),
</del><span class="cx">       componentType(GL_NONE),
</span><del>-      mipGenerationFunction(NULL),
-      colorReadFunction(NULL),
</del><span class="cx">       fastCopyFunctions(),
</span><span class="cx">       nativeMipmapSupport(NULL)
</span><span class="cx"> {
</span><span class="lines">@@ -300,24 +232,23 @@
</span><span class="cx">     return (iter != fastCopyFunctions.end()) ? iter-&gt;second : NULL;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AddDXGIFormat(DXGIFormatInfoMap *map, DXGI_FORMAT dxgiFormat, GLuint pixelBits, GLuint blockWidth, GLuint blockHeight,
-                   GLenum componentType, MipGenerationFunction mipFunc, ColorReadFunction readFunc, NativeMipmapGenerationSupportFunction nativeMipmapSupport)
</del><ins>+void AddDXGIFormat(DXGIFormatInfoMap *map,
+                   DXGI_FORMAT dxgiFormat,
+                   GLenum componentType,
+                   NativeMipmapGenerationSupportFunction nativeMipmapSupport)
</ins><span class="cx"> {
</span><span class="cx">     DXGIFormat info;
</span><del>-    info.pixelBytes = pixelBits / 8;
-    info.blockWidth = blockWidth;
-    info.blockHeight = blockHeight;
</del><span class="cx"> 
</span><span class="cx">     static const ColorFormatInfoMap colorInfoMap = BuildColorFormatInfoMap();
</span><span class="cx">     ColorFormatInfoMap::const_iterator colorInfoIter = colorInfoMap.find(dxgiFormat);
</span><span class="cx">     if (colorInfoIter != colorInfoMap.end())
</span><span class="cx">     {
</span><span class="cx">         const DXGIColorFormatInfo &amp;colorInfo = colorInfoIter-&gt;second;
</span><del>-        info.redBits = colorInfo.redBits;
-        info.greenBits = colorInfo.greenBits;
-        info.blueBits = colorInfo.blueBits;
-        info.alphaBits = colorInfo.alphaBits;
-        info.sharedBits = colorInfo.sharedBits;
</del><ins>+        info.redBits                         = static_cast&lt;GLuint&gt;(colorInfo.redBits);
+        info.greenBits                       = static_cast&lt;GLuint&gt;(colorInfo.greenBits);
+        info.blueBits                        = static_cast&lt;GLuint&gt;(colorInfo.blueBits);
+        info.alphaBits                       = static_cast&lt;GLuint&gt;(colorInfo.alphaBits);
+        info.sharedBits                      = static_cast&lt;GLuint&gt;(colorInfo.sharedBits);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static const DepthStencilInfoMap dsInfoMap = BuildDepthStencilInfoMap();
</span><span class="lines">@@ -326,20 +257,11 @@
</span><span class="cx">     {
</span><span class="cx">         const DXGIDepthStencilInfo &amp;dsInfo = dsInfoIter-&gt;second;
</span><span class="cx">         info.depthBits = dsInfo.depthBits;
</span><del>-        info.depthOffset = dsInfo.depthOffset;
</del><span class="cx">         info.stencilBits = dsInfo.stencilBits;
</span><del>-        info.stencilOffset = dsInfo.stencilOffset;
</del><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static const DXGIToESFormatMap dxgiToESMap = BuildDXGIToESFormatMap();
-    DXGIToESFormatMap::const_iterator dxgiToESIter = dxgiToESMap.find(dxgiFormat);
-    info.internalFormat = (dxgiToESIter != dxgiToESMap.end()) ? dxgiToESIter-&gt;second : GL_NONE;
-
</del><span class="cx">     info.componentType = componentType;
</span><span class="cx"> 
</span><del>-    info.mipGenerationFunction = mipFunc;
-    info.colorReadFunction = readFunc;
-
</del><span class="cx">     static const D3D11FastCopyMap fastCopyMap = BuildFastCopyMap();
</span><span class="cx">     std::pair&lt;D3D11FastCopyMap::const_iterator, D3D11FastCopyMap::const_iterator&gt; fastCopyIter = fastCopyMap.equal_range(dxgiFormat);
</span><span class="cx">     for (D3D11FastCopyMap::const_iterator i = fastCopyIter.first; i != fastCopyIter.second; i++)
</span><span class="lines">@@ -352,86 +274,105 @@
</span><span class="cx">     map-&gt;insert(std::make_pair(dxgiFormat, info));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// A map to determine the pixel size and mipmap generation function of a given DXGI format
</del><ins>+// A map to determine the color read function and mipmap generation function of a given DXGI format
</ins><span class="cx"> static DXGIFormatInfoMap BuildDXGIFormatInfoMap()
</span><span class="cx"> {
</span><span class="cx">     DXGIFormatInfoMap map;
</span><span class="cx"> 
</span><del>-    //                | DXGI format                          |S   |W |H |Component Type         | Mip generation function   | Color read function               | Native mipmap function
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_UNKNOWN,                  0,   0, 0, GL_NONE,                NULL,                       NULL,                              NeverSupported);
</del><ins>+    // clang-format off
+    //                | DXGI format                         | Component Type        | Color read function              | Native mipmap function
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_UNKNOWN,                  GL_NONE,                NeverSupported);
</ins><span class="cx"> 
</span><del>-    AddDXGIFormat(&amp;map, DXGI_FORMAT_A8_UNORM,                 8,   1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip&lt;A8&gt;,            ReadColor&lt;A8, GLfloat&gt;,            RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8_UNORM,                 8,   1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip&lt;R8&gt;,            ReadColor&lt;R8, GLfloat&gt;,            RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8_UNORM,               16,  1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip&lt;R8G8&gt;,          ReadColor&lt;R8G8, GLfloat&gt;,          RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_UNORM,           32,  1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip&lt;R8G8B8A8&gt;,      ReadColor&lt;R8G8B8A8, GLfloat&gt;,      RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_1&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,      32,  1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip&lt;R8G8B8A8&gt;,      ReadColor&lt;R8G8B8A8, GLfloat&gt;,      RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_1&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_B8G8R8A8_UNORM,           32,  1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip&lt;B8G8R8A8&gt;,      ReadColor&lt;B8G8R8A8, GLfloat&gt;,      RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_1&gt;);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_A8_UNORM,                 GL_UNSIGNED_NORMALIZED, RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8_UNORM,                 GL_UNSIGNED_NORMALIZED, RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_UNORM,                GL_UNSIGNED_NORMALIZED, NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8_UNORM,               GL_UNSIGNED_NORMALIZED, RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_UNORM,             GL_UNSIGNED_NORMALIZED, NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_UNORM,           GL_UNSIGNED_NORMALIZED, RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_1&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,      GL_UNSIGNED_NORMALIZED, RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_1&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_B8G8R8A8_UNORM,           GL_UNSIGNED_NORMALIZED, RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_1&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_UNORM,       GL_UNSIGNED_NORMALIZED, NeverSupported);
</ins><span class="cx"> 
</span><del>-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8_SNORM,                 8,   1, 1, GL_SIGNED_NORMALIZED,   GenerateMip&lt;R8S&gt;,           ReadColor&lt;R8S, GLfloat&gt;      ,     RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8_SNORM,               16,  1, 1, GL_SIGNED_NORMALIZED,   GenerateMip&lt;R8G8S&gt;,         ReadColor&lt;R8G8S, GLfloat&gt;    ,     RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_SNORM,           32,  1, 1, GL_SIGNED_NORMALIZED,   GenerateMip&lt;R8G8B8A8S&gt;,     ReadColor&lt;R8G8B8A8S, GLfloat&gt;,     RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8_SNORM,                 GL_SIGNED_NORMALIZED,   RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_SNORM,                GL_SIGNED_NORMALIZED,   NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8_SNORM,               GL_SIGNED_NORMALIZED,   RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_SNORM,             GL_SIGNED_NORMALIZED,   NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_SNORM,           GL_SIGNED_NORMALIZED,   RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_SNORM,       GL_SIGNED_NORMALIZED,   NeverSupported);
</ins><span class="cx"> 
</span><del>-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8_UINT,                  8,   1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R8&gt;,            ReadColor&lt;R8, GLuint&gt;,             NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_UINT,                 16,  1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R16&gt;,           ReadColor&lt;R16, GLuint&gt;,            NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32_UINT,                 32,  1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R32&gt;,           ReadColor&lt;R32, GLuint&gt;,            NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8_UINT,                16,  1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R8G8&gt;,          ReadColor&lt;R8G8, GLuint&gt;,           NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_UINT,              32,  1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R16G16&gt;,        ReadColor&lt;R16G16, GLuint&gt;,         NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32_UINT,              64,  1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R32G32&gt;,        ReadColor&lt;R32G32, GLuint&gt;,         NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32_UINT,           96,  1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R32G32B32&gt;,     ReadColor&lt;R32G32B32, GLuint&gt;,      NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_UINT,            32,  1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R8G8B8A8&gt;,      ReadColor&lt;R8G8B8A8, GLuint&gt;,       NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_UINT,        64,  1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R16G16B16A16&gt;,  ReadColor&lt;R16G16B16A16, GLuint&gt;,   NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32A32_UINT,        128, 1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R32G32B32A32&gt;,  ReadColor&lt;R32G32B32A32, GLuint&gt;,   NeverSupported);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8_UINT,                  GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_UINT,                 GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32_UINT,                 GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8_UINT,                GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_UINT,              GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32_UINT,              GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32_UINT,           GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_UINT,            GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_UINT,        GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32A32_UINT,        GL_UNSIGNED_INT,        NeverSupported);
</ins><span class="cx"> 
</span><del>-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8_SINT,                  8,   1, 1, GL_INT,                 GenerateMip&lt;R8S&gt;,           ReadColor&lt;R8S, GLint&gt;,             NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_SINT,                 16,  1, 1, GL_INT,                 GenerateMip&lt;R16S&gt;,          ReadColor&lt;R16S, GLint&gt;,            NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32_SINT,                 32,  1, 1, GL_INT,                 GenerateMip&lt;R32S&gt;,          ReadColor&lt;R32S, GLint&gt;,            NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8_SINT,                16,  1, 1, GL_INT,                 GenerateMip&lt;R8G8S&gt;,         ReadColor&lt;R8G8S, GLint&gt;,           NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_SINT,              32,  1, 1, GL_INT,                 GenerateMip&lt;R16G16S&gt;,       ReadColor&lt;R16G16S, GLint&gt;,         NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32_SINT,              64,  1, 1, GL_INT,                 GenerateMip&lt;R32G32S&gt;,       ReadColor&lt;R32G32S, GLint&gt;,         NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32_SINT,           96,  1, 1, GL_INT,                 GenerateMip&lt;R32G32B32S&gt;,    ReadColor&lt;R32G32B32S, GLint&gt;,      NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_SINT,            32,  1, 1, GL_INT,                 GenerateMip&lt;R8G8B8A8S&gt;,     ReadColor&lt;R8G8B8A8S, GLint&gt;,       NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_SINT,        64,  1, 1, GL_INT,                 GenerateMip&lt;R16G16B16A16S&gt;, ReadColor&lt;R16G16B16A16S, GLint&gt;,   NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32A32_SINT,        128, 1, 1, GL_INT,                 GenerateMip&lt;R32G32B32A32S&gt;, ReadColor&lt;R32G32B32A32S, GLint&gt;,   NeverSupported);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8_SINT,                  GL_INT,                 NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_SINT,                 GL_INT,                 NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32_SINT,                 GL_INT,                 NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8_SINT,                GL_INT,                 NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_SINT,              GL_INT,                 NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32_SINT,              GL_INT,                 NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32_SINT,           GL_INT,                 NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_SINT,            GL_INT,                 NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_SINT,        GL_INT,                 NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32A32_SINT,        GL_INT,                 NeverSupported);
</ins><span class="cx"> 
</span><del>-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R10G10B10A2_UNORM,        32,  1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip&lt;R10G10B10A2&gt;,   ReadColor&lt;R10G10B10A2, GLfloat&gt;,   RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R10G10B10A2_UINT,         32,  1, 1, GL_UNSIGNED_INT,        GenerateMip&lt;R10G10B10A2&gt;,   ReadColor&lt;R10G10B10A2, GLuint&gt;,    NeverSupported);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R10G10B10A2_TYPELESS,     GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R10G10B10A2_UNORM,        GL_UNSIGNED_NORMALIZED, RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R10G10B10A2_UINT,         GL_UNSIGNED_INT,        NeverSupported);
</ins><span class="cx"> 
</span><del>-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_FLOAT,                16,  1, 1, GL_FLOAT,               GenerateMip&lt;R16F&gt;,          ReadColor&lt;R16F, GLfloat&gt;,          RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_FLOAT,             32,  1, 1, GL_FLOAT,               GenerateMip&lt;R16G16F&gt;,       ReadColor&lt;R16G16F, GLfloat&gt;,       RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_2&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_FLOAT,       64,  1, 1, GL_FLOAT,               GenerateMip&lt;R16G16B16A16F&gt;, ReadColor&lt;R16G16B16A16F, GLfloat&gt;, RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_2&gt;);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_FLOAT,                GL_FLOAT,               RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_FLOAT,             GL_FLOAT,               RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_2&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_FLOAT,       GL_FLOAT,               RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_2&gt;);
</ins><span class="cx"> 
</span><del>-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32_FLOAT,                32,  1, 1, GL_FLOAT,               GenerateMip&lt;R32F&gt;,          ReadColor&lt;R32F, GLfloat&gt;,          RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_2&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32_FLOAT,             64,  1, 1, GL_FLOAT,               GenerateMip&lt;R32G32F&gt;,       ReadColor&lt;R32G32F, GLfloat&gt;,       RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32_FLOAT,          96,  1, 1, GL_FLOAT,               NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32A32_FLOAT,       128, 1, 1, GL_FLOAT,               GenerateMip&lt;R32G32B32A32F&gt;, ReadColor&lt;R32G32B32A32F, GLfloat&gt;, RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_3&gt;);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32_FLOAT,                GL_FLOAT,               RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_2&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32_FLOAT,             GL_FLOAT,               RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32_FLOAT,          GL_FLOAT,               NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32A32_FLOAT,       GL_FLOAT,               RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_3&gt;);
</ins><span class="cx"> 
</span><del>-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R9G9B9E5_SHAREDEXP,       32,  1, 1, GL_FLOAT,               GenerateMip&lt;R9G9B9E5&gt;,      ReadColor&lt;R9G9B9E5, GLfloat&gt;,      NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R11G11B10_FLOAT,          32,  1, 1, GL_FLOAT,               GenerateMip&lt;R11G11B10F&gt;,    ReadColor&lt;R11G11B10F, GLfloat&gt;,    RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R9G9B9E5_SHAREDEXP,       GL_FLOAT,               NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R11G11B10_FLOAT,          GL_FLOAT,               RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_10_0&gt;);
</ins><span class="cx"> 
</span><del>-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_TYPELESS,             16,  1, 1, GL_NONE,                NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_UNORM,                16,  1, 1, GL_UNSIGNED_NORMALIZED, NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_D16_UNORM,                16,  1, 1, GL_UNSIGNED_NORMALIZED, NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R24G8_TYPELESS,           32,  1, 1, GL_NONE,                NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    32,  1, 1, GL_NONE,                NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_D24_UNORM_S8_UINT,        32,  1, 1, GL_UNSIGNED_INT,        NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G8X24_TYPELESS,        64,  1, 1, GL_NONE,                NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, 64,  1, 1, GL_NONE,                NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_D32_FLOAT_S8X24_UINT,     64,  1, 1, GL_UNSIGNED_INT,        NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32_TYPELESS,             32,  1, 1, GL_NONE,                NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_D32_FLOAT,                32,  1, 1, GL_FLOAT,               NULL,                       NULL,                              NeverSupported);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8_TYPELESS,              GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_TYPELESS,             GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32_TYPELESS,             GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8_TYPELESS,            GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_TYPELESS,          GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32_TYPELESS,          GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8_TYPELESS,            GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_TYPELESS,          GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32_TYPELESS,          GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32_TYPELESS,       GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R8G8B8A8_TYPELESS,        GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_TYPELESS,    GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G32B32A32_TYPELESS,    GL_NONE,                NeverSupported);
</ins><span class="cx"> 
</span><del>-    AddDXGIFormat(&amp;map, DXGI_FORMAT_BC1_UNORM,                64,  4, 4, GL_UNSIGNED_NORMALIZED, NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_BC2_UNORM,                128, 4, 4, GL_UNSIGNED_NORMALIZED, NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_BC3_UNORM,                128, 4, 4, GL_UNSIGNED_NORMALIZED, NULL,                       NULL,                              NeverSupported);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R24G8_TYPELESS,           GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32G8X24_TYPELESS,        GL_NONE,                NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, GL_NONE,                NeverSupported);
</ins><span class="cx"> 
</span><del>-    // Useful formats for vertex buffers
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_UNORM,                16,  1, 1, GL_UNSIGNED_NORMALIZED, NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16_SNORM,                16,  1, 1, GL_SIGNED_NORMALIZED,   NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_UNORM,             32,  1, 1, GL_UNSIGNED_NORMALIZED, NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16_SNORM,             32,  1, 1, GL_SIGNED_NORMALIZED,   NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_UNORM,       64,  1, 1, GL_UNSIGNED_NORMALIZED, NULL,                       NULL,                              NeverSupported);
-    AddDXGIFormat(&amp;map, DXGI_FORMAT_R16G16B16A16_SNORM,       64,  1, 1, GL_SIGNED_NORMALIZED,   NULL,                       NULL,                              NeverSupported);
</del><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_D16_UNORM,                GL_UNSIGNED_NORMALIZED, NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_D24_UNORM_S8_UINT,        GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_D32_FLOAT_S8X24_UINT,     GL_UNSIGNED_INT,        NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_D32_FLOAT,                GL_FLOAT,               NeverSupported);
</ins><span class="cx"> 
</span><ins>+    AddDXGIFormat(&amp;map, DXGI_FORMAT_BC1_UNORM,                GL_UNSIGNED_NORMALIZED, NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_BC2_UNORM,                GL_UNSIGNED_NORMALIZED, NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_BC3_UNORM,                GL_UNSIGNED_NORMALIZED, NeverSupported);
+
+    // B5G6R5 in D3D11 is treated the same as R5G6B5 in D3D9, so reuse the R5G6B5 functions used by the D3D9 renderer.
+    // The same applies to B4G4R4A4 and B5G5R5A1 with A4R4G4B4 and A1R5G5B5 respectively.
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_B5G6R5_UNORM,             GL_UNSIGNED_NORMALIZED, RequiresFeatureLevel&lt;D3D_FEATURE_LEVEL_9_1&gt;);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_B4G4R4A4_UNORM,           GL_UNSIGNED_NORMALIZED, NeverSupported);
+    AddDXGIFormat(&amp;map, DXGI_FORMAT_B5G5R5A1_UNORM,           GL_UNSIGNED_NORMALIZED, NeverSupported);
+    // clang-format on
+
</ins><span class="cx">     return map;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -450,614 +391,176 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-struct SwizzleSizeType
</del><ins>+DXGIFormatSize::DXGIFormatSize(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight)
+    : pixelBytes(pixelBits / 8), blockWidth(blockWidth), blockHeight(blockHeight)
</ins><span class="cx"> {
</span><del>-    size_t maxComponentSize;
-    GLenum componentType;
-
-    SwizzleSizeType()
-        : maxComponentSize(0), componentType(GL_NONE)
-    { }
-
-    SwizzleSizeType(size_t maxComponentSize, GLenum componentType)
-        : maxComponentSize(maxComponentSize), componentType(componentType)
-    { }
-
-    bool operator&lt;(const SwizzleSizeType&amp; other) const
-    {
-        return (maxComponentSize != other.maxComponentSize) ? (maxComponentSize &lt; other.maxComponentSize)
-                                                            : (componentType &lt; other.componentType);
-    }
-};
-
-struct SwizzleFormatInfo
-{
-    DXGI_FORMAT mTexFormat;
-    DXGI_FORMAT mSRVFormat;
-    DXGI_FORMAT mRTVFormat;
-
-    SwizzleFormatInfo()
-        : mTexFormat(DXGI_FORMAT_UNKNOWN), mSRVFormat(DXGI_FORMAT_UNKNOWN), mRTVFormat(DXGI_FORMAT_UNKNOWN)
-    { }
-
-    SwizzleFormatInfo(DXGI_FORMAT texFormat, DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat)
-        : mTexFormat(texFormat), mSRVFormat(srvFormat), mRTVFormat(rtvFormat)
-    { }
-};
-
-typedef std::map&lt;SwizzleSizeType, SwizzleFormatInfo&gt; SwizzleInfoMap;
-typedef std::pair&lt;SwizzleSizeType, SwizzleFormatInfo&gt; SwizzleInfoPair;
-
-static SwizzleInfoMap BuildSwizzleInfoMap()
-{
-    SwizzleInfoMap map;
-
-    map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_R8G8B8A8_UNORM    )));
-    map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_R16G16B16A16_UNORM)));
-    map.insert(SwizzleInfoPair(SwizzleSizeType(24, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT)));
-    map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT)));
-
-    map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_SIGNED_NORMALIZED  ), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_SNORM,     DXGI_FORMAT_R8G8B8A8_SNORM,     DXGI_FORMAT_R8G8B8A8_SNORM    )));
-
-    map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_FLOAT              ), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT)));
-    map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_FLOAT              ), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT)));
-
-    map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_UNSIGNED_INT       ), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_UINT,      DXGI_FORMAT_R8G8B8A8_UINT,      DXGI_FORMAT_R8G8B8A8_UINT     )));
-    map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_UNSIGNED_INT       ), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_UINT,  DXGI_FORMAT_R16G16B16A16_UINT,  DXGI_FORMAT_R16G16B16A16_UINT )));
-    map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_UNSIGNED_INT       ), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_UINT,  DXGI_FORMAT_R32G32B32A32_UINT,  DXGI_FORMAT_R32G32B32A32_UINT )));
-
-    map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_INT                ), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_SINT,      DXGI_FORMAT_R8G8B8A8_SINT,      DXGI_FORMAT_R8G8B8A8_SINT     )));
-    map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_INT                ), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_SINT,  DXGI_FORMAT_R16G16B16A16_SINT,  DXGI_FORMAT_R16G16B16A16_SINT )));
-    map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_INT                ), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_SINT,  DXGI_FORMAT_R32G32B32A32_SINT,  DXGI_FORMAT_R32G32B32A32_SINT )));
-
-    return map;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-typedef std::pair&lt;GLint, InitializeTextureDataFunction&gt; InternalFormatInitializerPair;
-typedef std::map&lt;GLint, InitializeTextureDataFunction&gt; InternalFormatInitializerMap;
-
-static InternalFormatInitializerMap BuildInternalFormatInitializerMap()
</del><ins>+const DXGIFormatSize &amp;GetDXGIFormatSizeInfo(DXGI_FORMAT format)
</ins><span class="cx"> {
</span><del>-    InternalFormatInitializerMap map;
-
-    map.insert(InternalFormatInitializerPair(GL_RGB8,    Initialize4ComponentData&lt;GLubyte,  0x00,       0x00,       0x00,       0xFF&gt;          ));
-    map.insert(InternalFormatInitializerPair(GL_RGB565,  Initialize4ComponentData&lt;GLubyte,  0x00,       0x00,       0x00,       0xFF&gt;          ));
-    map.insert(InternalFormatInitializerPair(GL_SRGB8,   Initialize4ComponentData&lt;GLubyte,  0x00,       0x00,       0x00,       0xFF&gt;          ));
-    map.insert(InternalFormatInitializerPair(GL_RGB16F,  Initialize4ComponentData&lt;GLhalf,   0x0000,     0x0000,     0x0000,     gl::Float16One&gt;));
-    map.insert(InternalFormatInitializerPair(GL_RGB32F,  Initialize4ComponentData&lt;GLfloat,  0x00000000, 0x00000000, 0x00000000, gl::Float32One&gt;));
-    map.insert(InternalFormatInitializerPair(GL_RGB8UI,  Initialize4ComponentData&lt;GLubyte,  0x00,       0x00,       0x00,       0x01&gt;          ));
-    map.insert(InternalFormatInitializerPair(GL_RGB8I,   Initialize4ComponentData&lt;GLbyte,   0x00,       0x00,       0x00,       0x01&gt;          ));
-    map.insert(InternalFormatInitializerPair(GL_RGB16UI, Initialize4ComponentData&lt;GLushort, 0x0000,     0x0000,     0x0000,     0x0001&gt;        ));
-    map.insert(InternalFormatInitializerPair(GL_RGB16I,  Initialize4ComponentData&lt;GLshort,  0x0000,     0x0000,     0x0000,     0x0001&gt;        ));
-    map.insert(InternalFormatInitializerPair(GL_RGB32UI, Initialize4ComponentData&lt;GLuint,   0x00000000, 0x00000000, 0x00000000, 0x00000001&gt;    ));
-    map.insert(InternalFormatInitializerPair(GL_RGB32I,  Initialize4ComponentData&lt;GLint,    0x00000000, 0x00000000, 0x00000000, 0x00000001&gt;    ));
-
-    return map;
-}
-
-// ES3 image loading functions vary based on the internal format and data type given,
-// this map type determines the loading function from the internal format and type supplied
-// to glTex*Image*D and the destination DXGI_FORMAT. Source formats and types are taken from
-// Tables 3.2 and 3.3 of the ES 3 spec.
-typedef std::pair&lt;GLenum, LoadImageFunction&gt; TypeLoadFunctionPair;
-typedef std::map&lt;GLenum, std::vector&lt;TypeLoadFunctionPair&gt; &gt; D3D11LoadFunctionMap;
-
-static void UnimplementedLoadFunction(size_t width, size_t height, size_t depth,
-                                      const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
-                                      uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
-{
-    UNIMPLEMENTED();
-}
-
-static void UnreachableLoadFunction(size_t width, size_t height, size_t depth,
-                                    const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
-                                    uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
-{
-    UNREACHABLE();
-}
-
-// A helper function to insert data into the D3D11LoadFunctionMap with fewer characters.
-static inline void InsertLoadFunction(D3D11LoadFunctionMap *map, GLenum internalFormat, GLenum type,
-                                      LoadImageFunction loadFunc)
-{
-    (*map)[internalFormat].push_back(TypeLoadFunctionPair(type, loadFunc));
-}
-
-D3D11LoadFunctionMap BuildD3D11_FL9_3_LoadFunctionMap()
-{
-    D3D11LoadFunctionMap map;
-
-    // From GL_EXT_texture_storage. Also used by GL_ALPHA8
-    // On feature level 9_3, A8_UNORM doesn't support mipmaps, so we must use RGBA8 instead
-    InsertLoadFunction(&amp;map, GL_ALPHA8_EXT, GL_UNSIGNED_BYTE, LoadA8ToRGBA8);
-    
-    return map;
-}
-
-D3D11LoadFunctionMap BuildD3D11_FL10_0Plus_LoadFunctionMap()
-{
-    D3D11LoadFunctionMap map;
-
-    // From GL_EXT_texture_storage. Also used by GL_ALPHA8
-    InsertLoadFunction(&amp;map, GL_ALPHA8_EXT, GL_UNSIGNED_BYTE, LoadToNative&lt;GLubyte, 1&gt;);
-
-    return map;
-}
-
-D3D11LoadFunctionMap BuildBaseD3D11LoadFunctionMap()
-{
-    D3D11LoadFunctionMap map;
-
-    //                      | Internal format      | Type                             | Load function                       |
-    InsertLoadFunction(&amp;map, GL_RGBA8,              GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 4&gt;             );
-    InsertLoadFunction(&amp;map, GL_RGB5_A1,            GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 4&gt;             );
-    InsertLoadFunction(&amp;map, GL_RGBA4,              GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 4&gt;             );
-    InsertLoadFunction(&amp;map, GL_SRGB8_ALPHA8,       GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 4&gt;             );
-    InsertLoadFunction(&amp;map, GL_RGBA8_SNORM,        GL_BYTE,                           LoadToNative&lt;GLbyte, 4&gt;              );
-    InsertLoadFunction(&amp;map, GL_RGBA4,              GL_UNSIGNED_SHORT_4_4_4_4,         LoadRGBA4ToRGBA8                     );
-    InsertLoadFunction(&amp;map, GL_RGB10_A2,           GL_UNSIGNED_INT_2_10_10_10_REV,    LoadToNative&lt;GLuint, 1&gt;              );
-    InsertLoadFunction(&amp;map, GL_RGB5_A1,            GL_UNSIGNED_SHORT_5_5_5_1,         LoadRGB5A1ToRGBA8                    );
-    InsertLoadFunction(&amp;map, GL_RGB5_A1,            GL_UNSIGNED_INT_2_10_10_10_REV,    LoadRGB10A2ToRGBA8                   );
-    InsertLoadFunction(&amp;map, GL_RGBA16F,            GL_HALF_FLOAT,                     LoadToNative&lt;GLhalf, 4&gt;              );
-    InsertLoadFunction(&amp;map, GL_RGBA16F,            GL_HALF_FLOAT_OES,                 LoadToNative&lt;GLhalf, 4&gt;              );
-    InsertLoadFunction(&amp;map, GL_RGBA32F,            GL_FLOAT,                          LoadToNative&lt;GLfloat, 4&gt;             );
-    InsertLoadFunction(&amp;map, GL_RGBA16F,            GL_FLOAT,                          Load32FTo16F&lt;4&gt;                      );
-    InsertLoadFunction(&amp;map, GL_RGBA8UI,            GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 4&gt;             );
-    InsertLoadFunction(&amp;map, GL_RGBA8I,             GL_BYTE,                           LoadToNative&lt;GLbyte, 4&gt;              );
-    InsertLoadFunction(&amp;map, GL_RGBA16UI,           GL_UNSIGNED_SHORT,                 LoadToNative&lt;GLushort, 4&gt;            );
-    InsertLoadFunction(&amp;map, GL_RGBA16I,            GL_SHORT,                          LoadToNative&lt;GLshort, 4&gt;             );
-    InsertLoadFunction(&amp;map, GL_RGBA32UI,           GL_UNSIGNED_INT,                   LoadToNative&lt;GLuint, 4&gt;              );
-    InsertLoadFunction(&amp;map, GL_RGBA32I,            GL_INT,                            LoadToNative&lt;GLint, 4&gt;               );
-    InsertLoadFunction(&amp;map, GL_RGB10_A2UI,         GL_UNSIGNED_INT_2_10_10_10_REV,    LoadToNative&lt;GLuint, 1&gt;              );
-    InsertLoadFunction(&amp;map, GL_RGB8,               GL_UNSIGNED_BYTE,                  LoadToNative3To4&lt;GLubyte, 0xFF&gt;      );
-    InsertLoadFunction(&amp;map, GL_RGB565,             GL_UNSIGNED_BYTE,                  LoadToNative3To4&lt;GLubyte, 0xFF&gt;      );
-    InsertLoadFunction(&amp;map, GL_SRGB8,              GL_UNSIGNED_BYTE,                  LoadToNative3To4&lt;GLubyte, 0xFF&gt;      );
-    InsertLoadFunction(&amp;map, GL_RGB8_SNORM,         GL_BYTE,                           LoadToNative3To4&lt;GLbyte, 0x7F&gt;       );
-    InsertLoadFunction(&amp;map, GL_RGB565,             GL_UNSIGNED_SHORT_5_6_5,           LoadR5G6B5ToRGBA8                    );
-    InsertLoadFunction(&amp;map, GL_R11F_G11F_B10F,     GL_UNSIGNED_INT_10F_11F_11F_REV,   LoadToNative&lt;GLuint, 1&gt;              );
-    InsertLoadFunction(&amp;map, GL_RGB9_E5,            GL_UNSIGNED_INT_5_9_9_9_REV,       LoadToNative&lt;GLuint, 1&gt;              );
-    InsertLoadFunction(&amp;map, GL_RGB16F,             GL_HALF_FLOAT,                     LoadToNative3To4&lt;GLhalf, gl::Float16One&gt;);
-    InsertLoadFunction(&amp;map, GL_RGB16F,             GL_HALF_FLOAT_OES,                 LoadToNative3To4&lt;GLhalf, gl::Float16One&gt;);
-    InsertLoadFunction(&amp;map, GL_R11F_G11F_B10F,     GL_HALF_FLOAT,                     LoadRGB16FToRG11B10F                 );
-    InsertLoadFunction(&amp;map, GL_R11F_G11F_B10F,     GL_HALF_FLOAT_OES,                 LoadRGB16FToRG11B10F                 );
-    InsertLoadFunction(&amp;map, GL_RGB9_E5,            GL_HALF_FLOAT,                     LoadRGB16FToRGB9E5                   );
-    InsertLoadFunction(&amp;map, GL_RGB9_E5,            GL_HALF_FLOAT_OES,                 LoadRGB16FToRGB9E5                   );
-    InsertLoadFunction(&amp;map, GL_RGB32F,             GL_FLOAT,                          LoadToNative3To4&lt;GLfloat, gl::Float32One&gt;);
-    InsertLoadFunction(&amp;map, GL_RGB16F,             GL_FLOAT,                          LoadRGB32FToRGBA16F                  );
-    InsertLoadFunction(&amp;map, GL_R11F_G11F_B10F,     GL_FLOAT,                          LoadRGB32FToRG11B10F                 );
-    InsertLoadFunction(&amp;map, GL_RGB9_E5,            GL_FLOAT,                          LoadRGB32FToRGB9E5                   );
-    InsertLoadFunction(&amp;map, GL_RGB8UI,             GL_UNSIGNED_BYTE,                  LoadToNative3To4&lt;GLubyte, 0x01&gt;      );
-    InsertLoadFunction(&amp;map, GL_RGB8I,              GL_BYTE,                           LoadToNative3To4&lt;GLbyte, 0x01&gt;       );
-    InsertLoadFunction(&amp;map, GL_RGB16UI,            GL_UNSIGNED_SHORT,                 LoadToNative3To4&lt;GLushort, 0x0001&gt;   );
-    InsertLoadFunction(&amp;map, GL_RGB16I,             GL_SHORT,                          LoadToNative3To4&lt;GLshort, 0x0001&gt;    );
-    InsertLoadFunction(&amp;map, GL_RGB32UI,            GL_UNSIGNED_INT,                   LoadToNative3To4&lt;GLuint, 0x00000001&gt; );
-    InsertLoadFunction(&amp;map, GL_RGB32I,             GL_INT,                            LoadToNative3To4&lt;GLint, 0x00000001&gt;  );
-    InsertLoadFunction(&amp;map, GL_RG8,                GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 2&gt;             );
-    InsertLoadFunction(&amp;map, GL_RG8_SNORM,          GL_BYTE,                           LoadToNative&lt;GLbyte, 2&gt;              );
-    InsertLoadFunction(&amp;map, GL_RG16F,              GL_HALF_FLOAT,                     LoadToNative&lt;GLhalf, 2&gt;              );
-    InsertLoadFunction(&amp;map, GL_RG16F,              GL_HALF_FLOAT_OES,                 LoadToNative&lt;GLhalf, 2&gt;              );
-    InsertLoadFunction(&amp;map, GL_RG32F,              GL_FLOAT,                          LoadToNative&lt;GLfloat, 2&gt;             );
-    InsertLoadFunction(&amp;map, GL_RG16F,              GL_FLOAT,                          Load32FTo16F&lt;2&gt;                      );
-    InsertLoadFunction(&amp;map, GL_RG8UI,              GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 2&gt;             );
-    InsertLoadFunction(&amp;map, GL_RG8I,               GL_BYTE,                           LoadToNative&lt;GLbyte, 2&gt;              );
-    InsertLoadFunction(&amp;map, GL_RG16UI,             GL_UNSIGNED_SHORT,                 LoadToNative&lt;GLushort, 2&gt;            );
-    InsertLoadFunction(&amp;map, GL_RG16I,              GL_SHORT,                          LoadToNative&lt;GLshort, 2&gt;             );
-    InsertLoadFunction(&amp;map, GL_RG32UI,             GL_UNSIGNED_INT,                   LoadToNative&lt;GLuint, 2&gt;              );
-    InsertLoadFunction(&amp;map, GL_RG32I,              GL_INT,                            LoadToNative&lt;GLint, 2&gt;               );
-    InsertLoadFunction(&amp;map, GL_R8,                 GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 1&gt;             );
-    InsertLoadFunction(&amp;map, GL_R8_SNORM,           GL_BYTE,                           LoadToNative&lt;GLbyte, 1&gt;              );
-    InsertLoadFunction(&amp;map, GL_R16F,               GL_HALF_FLOAT,                     LoadToNative&lt;GLhalf, 1&gt;              );
-    InsertLoadFunction(&amp;map, GL_R16F,               GL_HALF_FLOAT_OES,                 LoadToNative&lt;GLhalf, 1&gt;              );
-    InsertLoadFunction(&amp;map, GL_R32F,               GL_FLOAT,                          LoadToNative&lt;GLfloat, 1&gt;             );
-    InsertLoadFunction(&amp;map, GL_R16F,               GL_FLOAT,                          Load32FTo16F&lt;1&gt;                      );
-    InsertLoadFunction(&amp;map, GL_R8UI,               GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 1&gt;             );
-    InsertLoadFunction(&amp;map, GL_R8I,                GL_BYTE,                           LoadToNative&lt;GLbyte, 1&gt;              );
-    InsertLoadFunction(&amp;map, GL_R16UI,              GL_UNSIGNED_SHORT,                 LoadToNative&lt;GLushort, 1&gt;            );
-    InsertLoadFunction(&amp;map, GL_R16I,               GL_SHORT,                          LoadToNative&lt;GLshort, 1&gt;             );
-    InsertLoadFunction(&amp;map, GL_R32UI,              GL_UNSIGNED_INT,                   LoadToNative&lt;GLuint, 1&gt;              );
-    InsertLoadFunction(&amp;map, GL_R32I,               GL_INT,                            LoadToNative&lt;GLint, 1&gt;               );
-    InsertLoadFunction(&amp;map, GL_DEPTH_COMPONENT16,  GL_UNSIGNED_SHORT,                 LoadToNative&lt;GLushort, 1&gt;            );
-    InsertLoadFunction(&amp;map, GL_DEPTH_COMPONENT24,  GL_UNSIGNED_INT,                   LoadR32ToR24G8                       );
-    InsertLoadFunction(&amp;map, GL_DEPTH_COMPONENT16,  GL_UNSIGNED_INT,                   LoadR32ToR16                         );
-    InsertLoadFunction(&amp;map, GL_DEPTH_COMPONENT32F, GL_FLOAT,                          LoadToNative&lt;GLfloat, 1&gt;             );
-    InsertLoadFunction(&amp;map, GL_DEPTH24_STENCIL8,   GL_UNSIGNED_INT_24_8,              LoadR32ToR24G8                       );
-    InsertLoadFunction(&amp;map, GL_DEPTH32F_STENCIL8,  GL_FLOAT_32_UNSIGNED_INT_24_8_REV, LoadToNative&lt;GLuint, 2&gt;              );
-
-    // Unsized formats
-    // Load functions are unreachable because they are converted to sized internal formats based on
-    // the format and type before loading takes place.
-    InsertLoadFunction(&amp;map, GL_RGBA,               GL_UNSIGNED_BYTE,                  UnreachableLoadFunction              );
-    InsertLoadFunction(&amp;map, GL_RGBA,               GL_UNSIGNED_SHORT_4_4_4_4,         UnreachableLoadFunction              );
-    InsertLoadFunction(&amp;map, GL_RGBA,               GL_UNSIGNED_SHORT_5_5_5_1,         UnreachableLoadFunction              );
-    InsertLoadFunction(&amp;map, GL_RGB,                GL_UNSIGNED_BYTE,                  UnreachableLoadFunction              );
-    InsertLoadFunction(&amp;map, GL_RGB,                GL_UNSIGNED_SHORT_5_6_5,           UnreachableLoadFunction              );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE_ALPHA,    GL_UNSIGNED_BYTE,                  UnreachableLoadFunction              );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE,          GL_UNSIGNED_BYTE,                  UnreachableLoadFunction              );
-    InsertLoadFunction(&amp;map, GL_ALPHA,              GL_UNSIGNED_BYTE,                  UnreachableLoadFunction              );
-
-    // From GL_OES_texture_float
-    InsertLoadFunction(&amp;map, GL_LUMINANCE_ALPHA,    GL_FLOAT,                          LoadLA32FToRGBA32F                   );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE,          GL_FLOAT,                          LoadL32FToRGBA32F                    );
-    InsertLoadFunction(&amp;map, GL_ALPHA,              GL_FLOAT,                          LoadA32FToRGBA32F                    );
-
-    // From GL_OES_texture_half_float
-    InsertLoadFunction(&amp;map, GL_LUMINANCE_ALPHA,    GL_HALF_FLOAT,                     LoadLA16FToRGBA16F                   );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE_ALPHA,    GL_HALF_FLOAT_OES,                 LoadLA16FToRGBA16F                   );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE,          GL_HALF_FLOAT,                     LoadL16FToRGBA16F                    );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE,          GL_HALF_FLOAT_OES,                 LoadL16FToRGBA16F                    );
-    InsertLoadFunction(&amp;map, GL_ALPHA,              GL_HALF_FLOAT,                     LoadA16FToRGBA16F                    );
-    InsertLoadFunction(&amp;map, GL_ALPHA,              GL_HALF_FLOAT_OES,                 LoadA16FToRGBA16F                    );
-
-    // From GL_EXT_texture_storage
-    // GL_ALPHA8_EXT GL_UNSIGNED_BYTE is in the feature-level-specific load function maps, due to differences between 9_3 and 10_0+
-    InsertLoadFunction(&amp;map, GL_LUMINANCE8_EXT,         GL_UNSIGNED_BYTE,              LoadL8ToRGBA8                        );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE8_ALPHA8_EXT,  GL_UNSIGNED_BYTE,              LoadLA8ToRGBA8                       );
-    InsertLoadFunction(&amp;map, GL_ALPHA32F_EXT,           GL_FLOAT,                      LoadA32FToRGBA32F                    );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE32F_EXT,       GL_FLOAT,                      LoadL32FToRGBA32F                    );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE_ALPHA32F_EXT, GL_FLOAT,                      LoadLA32FToRGBA32F                   );
-    InsertLoadFunction(&amp;map, GL_ALPHA16F_EXT,           GL_HALF_FLOAT,                 LoadA16FToRGBA16F                    );
-    InsertLoadFunction(&amp;map, GL_ALPHA16F_EXT,           GL_HALF_FLOAT_OES,             LoadA16FToRGBA16F                    );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE16F_EXT,       GL_HALF_FLOAT,                 LoadL16FToRGBA16F                    );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE16F_EXT,       GL_HALF_FLOAT_OES,             LoadL16FToRGBA16F                    );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE_ALPHA16F_EXT, GL_HALF_FLOAT,                 LoadLA16FToRGBA16F                   );
-    InsertLoadFunction(&amp;map, GL_LUMINANCE_ALPHA16F_EXT, GL_HALF_FLOAT_OES,             LoadLA16FToRGBA16F                   );
-
-    // From GL_ANGLE_depth_texture
-    InsertLoadFunction(&amp;map, GL_DEPTH_COMPONENT32_OES,  GL_UNSIGNED_INT,               LoadR32ToR24G8                       );
-
-    // From GL_EXT_texture_format_BGRA8888
-    InsertLoadFunction(&amp;map, GL_BGRA8_EXT,              GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 4&gt;         );
-    InsertLoadFunction(&amp;map, GL_BGRA4_ANGLEX,           GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, LoadRGBA4ToRGBA8                 );
-    InsertLoadFunction(&amp;map, GL_BGRA4_ANGLEX,           GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 4&gt;         );
-    InsertLoadFunction(&amp;map, GL_BGR5_A1_ANGLEX,         GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, LoadRGB5A1ToRGBA8                );
-    InsertLoadFunction(&amp;map, GL_BGR5_A1_ANGLEX,         GL_UNSIGNED_BYTE,                  LoadToNative&lt;GLubyte, 4&gt;         );
-
-    // Compressed formats
-    // From ES 3.0.1 spec, table 3.16
-    //                      | Internal format                             | Type            | Load function                  |
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_R11_EAC,                        GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_R11_EAC,                        GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_SIGNED_R11_EAC,                 GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_RG11_EAC,                       GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_SIGNED_RG11_EAC,                GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_RGB8_ETC2,                      GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_SRGB8_ETC2,                     GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_RGBA8_ETC2_EAC,                 GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
-
-    // From GL_EXT_texture_compression_dxt1
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,              GL_UNSIGNED_BYTE, LoadCompressedToNative&lt;4, 4,  8&gt;);
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,             GL_UNSIGNED_BYTE, LoadCompressedToNative&lt;4, 4,  8&gt;);
-
-    // From GL_ANGLE_texture_compression_dxt3
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,           GL_UNSIGNED_BYTE, LoadCompressedToNative&lt;4, 4, 16&gt;);
-
-    // From GL_ANGLE_texture_compression_dxt5
-    InsertLoadFunction(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,           GL_UNSIGNED_BYTE, LoadCompressedToNative&lt;4, 4, 16&gt;);
-
-    return map;
-}
-
-// For sized GL internal formats, there is only one corresponding D3D11 format. This map type allows
-// querying for the DXGI texture formats to use for textures, SRVs, RTVs and DSVs given a GL internal
-// format.
-typedef std::map&lt;GLenum, TextureFormat&gt; D3D11ES3FormatMap;
-
-TextureFormat::TextureFormat()
-    : texFormat(DXGI_FORMAT_UNKNOWN),
-      srvFormat(DXGI_FORMAT_UNKNOWN),
-      rtvFormat(DXGI_FORMAT_UNKNOWN),
-      dsvFormat(DXGI_FORMAT_UNKNOWN),
-      renderFormat(DXGI_FORMAT_UNKNOWN),
-      swizzleTexFormat(DXGI_FORMAT_UNKNOWN),
-      swizzleSRVFormat(DXGI_FORMAT_UNKNOWN),
-      swizzleRTVFormat(DXGI_FORMAT_UNKNOWN),
-      dataInitializerFunction(NULL),
-      loadFunctions()
-{
-}
-
-static inline void InsertD3D11FormatInfoBase(D3D11ES3FormatMap *formatMap, const D3D11LoadFunctionMap &amp;flLoadFunctions, GLenum internalFormat, DXGI_FORMAT texFormat,
-                                             DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat, DXGI_FORMAT dsvFormat)
-{
-    TextureFormat info;
-    info.texFormat = texFormat;
-    info.srvFormat = srvFormat;
-    info.rtvFormat = rtvFormat;
-    info.dsvFormat = dsvFormat;
-
-    // Given a GL internal format, the renderFormat is the DSV format if it is depth- or stencil-renderable,
-    // the RTV format if it is color-renderable, and the (nonrenderable) texture format otherwise.
-    if (dsvFormat != DXGI_FORMAT_UNKNOWN)
</del><ins>+    static const DXGIFormatSize sizeUnknown(0, 0, 0);
+    static const DXGIFormatSize size128(128, 1, 1);
+    static const DXGIFormatSize size96(96, 1, 1);
+    static const DXGIFormatSize size64(64, 1, 1);
+    static const DXGIFormatSize size32(32, 1, 1);
+    static const DXGIFormatSize size16(16, 1, 1);
+    static const DXGIFormatSize size8(8, 1, 1);
+    static const DXGIFormatSize sizeBC1(64, 4, 4);
+    static const DXGIFormatSize sizeBC2(128, 4, 4);
+    static const DXGIFormatSize sizeBC3(128, 4, 4);
+    static const DXGIFormatSize sizeBC4(64, 4, 4);
+    static const DXGIFormatSize sizeBC5(128, 4, 4);
+    static const DXGIFormatSize sizeBC6H(128, 4, 4);
+    static const DXGIFormatSize sizeBC7(128, 4, 4);
+    switch (format)
</ins><span class="cx">     {
</span><del>-        info.renderFormat = dsvFormat;
</del><ins>+        case DXGI_FORMAT_UNKNOWN:
+            return sizeUnknown;
+        case DXGI_FORMAT_R32G32B32A32_TYPELESS:
+        case DXGI_FORMAT_R32G32B32A32_FLOAT:
+        case DXGI_FORMAT_R32G32B32A32_UINT:
+        case DXGI_FORMAT_R32G32B32A32_SINT:
+            return size128;
+        case DXGI_FORMAT_R32G32B32_TYPELESS:
+        case DXGI_FORMAT_R32G32B32_FLOAT:
+        case DXGI_FORMAT_R32G32B32_UINT:
+        case DXGI_FORMAT_R32G32B32_SINT:
+            return size96;
+        case DXGI_FORMAT_R16G16B16A16_TYPELESS:
+        case DXGI_FORMAT_R16G16B16A16_FLOAT:
+        case DXGI_FORMAT_R16G16B16A16_UNORM:
+        case DXGI_FORMAT_R16G16B16A16_UINT:
+        case DXGI_FORMAT_R16G16B16A16_SNORM:
+        case DXGI_FORMAT_R16G16B16A16_SINT:
+        case DXGI_FORMAT_R32G32_TYPELESS:
+        case DXGI_FORMAT_R32G32_FLOAT:
+        case DXGI_FORMAT_R32G32_UINT:
+        case DXGI_FORMAT_R32G32_SINT:
+        case DXGI_FORMAT_R32G8X24_TYPELESS:
+        case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
+        case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
+        case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
+            return size64;
+        case DXGI_FORMAT_R10G10B10A2_TYPELESS:
+        case DXGI_FORMAT_R10G10B10A2_UNORM:
+        case DXGI_FORMAT_R10G10B10A2_UINT:
+        case DXGI_FORMAT_R11G11B10_FLOAT:
+        case DXGI_FORMAT_R8G8B8A8_TYPELESS:
+        case DXGI_FORMAT_R8G8B8A8_UNORM:
+        case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
+        case DXGI_FORMAT_R8G8B8A8_UINT:
+        case DXGI_FORMAT_R8G8B8A8_SNORM:
+        case DXGI_FORMAT_R8G8B8A8_SINT:
+        case DXGI_FORMAT_R16G16_TYPELESS:
+        case DXGI_FORMAT_R16G16_FLOAT:
+        case DXGI_FORMAT_R16G16_UNORM:
+        case DXGI_FORMAT_R16G16_UINT:
+        case DXGI_FORMAT_R16G16_SNORM:
+        case DXGI_FORMAT_R16G16_SINT:
+        case DXGI_FORMAT_R32_TYPELESS:
+        case DXGI_FORMAT_D32_FLOAT:
+        case DXGI_FORMAT_R32_FLOAT:
+        case DXGI_FORMAT_R32_UINT:
+        case DXGI_FORMAT_R32_SINT:
+        case DXGI_FORMAT_R24G8_TYPELESS:
+        case DXGI_FORMAT_D24_UNORM_S8_UINT:
+        case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
+        case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
+            return size32;
+        case DXGI_FORMAT_R8G8_TYPELESS:
+        case DXGI_FORMAT_R8G8_UNORM:
+        case DXGI_FORMAT_R8G8_UINT:
+        case DXGI_FORMAT_R8G8_SNORM:
+        case DXGI_FORMAT_R8G8_SINT:
+        case DXGI_FORMAT_R16_TYPELESS:
+        case DXGI_FORMAT_R16_FLOAT:
+        case DXGI_FORMAT_D16_UNORM:
+        case DXGI_FORMAT_R16_UNORM:
+        case DXGI_FORMAT_R16_UINT:
+        case DXGI_FORMAT_R16_SNORM:
+        case DXGI_FORMAT_R16_SINT:
+            return size16;
+        case DXGI_FORMAT_R8_TYPELESS:
+        case DXGI_FORMAT_R8_UNORM:
+        case DXGI_FORMAT_R8_UINT:
+        case DXGI_FORMAT_R8_SNORM:
+        case DXGI_FORMAT_R8_SINT:
+        case DXGI_FORMAT_A8_UNORM:
+            return size8;
+        case DXGI_FORMAT_R1_UNORM:
+            UNREACHABLE();
+            return sizeUnknown;
+        case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
+        case DXGI_FORMAT_R8G8_B8G8_UNORM:
+        case DXGI_FORMAT_G8R8_G8B8_UNORM:
+            return size32;
+        case DXGI_FORMAT_BC1_TYPELESS:
+        case DXGI_FORMAT_BC1_UNORM:
+        case DXGI_FORMAT_BC1_UNORM_SRGB:
+            return sizeBC1;
+        case DXGI_FORMAT_BC2_TYPELESS:
+        case DXGI_FORMAT_BC2_UNORM:
+        case DXGI_FORMAT_BC2_UNORM_SRGB:
+            return sizeBC2;
+        case DXGI_FORMAT_BC3_TYPELESS:
+        case DXGI_FORMAT_BC3_UNORM:
+        case DXGI_FORMAT_BC3_UNORM_SRGB:
+            return sizeBC3;
+        case DXGI_FORMAT_BC4_TYPELESS:
+        case DXGI_FORMAT_BC4_UNORM:
+        case DXGI_FORMAT_BC4_SNORM:
+            return sizeBC4;
+        case DXGI_FORMAT_BC5_TYPELESS:
+        case DXGI_FORMAT_BC5_UNORM:
+        case DXGI_FORMAT_BC5_SNORM:
+            return sizeBC5;
+        case DXGI_FORMAT_B5G6R5_UNORM:
+        case DXGI_FORMAT_B5G5R5A1_UNORM:
+            return size16;
+        case DXGI_FORMAT_B8G8R8A8_UNORM:
+        case DXGI_FORMAT_B8G8R8X8_UNORM:
+        case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
+        case DXGI_FORMAT_B8G8R8A8_TYPELESS:
+        case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
+        case DXGI_FORMAT_B8G8R8X8_TYPELESS:
+        case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
+            return size32;
+        case DXGI_FORMAT_BC6H_TYPELESS:
+        case DXGI_FORMAT_BC6H_UF16:
+        case DXGI_FORMAT_BC6H_SF16:
+            return sizeBC6H;
+        case DXGI_FORMAT_BC7_TYPELESS:
+        case DXGI_FORMAT_BC7_UNORM:
+        case DXGI_FORMAT_BC7_UNORM_SRGB:
+            return sizeBC7;
+        case DXGI_FORMAT_AYUV:
+        case DXGI_FORMAT_Y410:
+        case DXGI_FORMAT_Y416:
+        case DXGI_FORMAT_NV12:
+        case DXGI_FORMAT_P010:
+        case DXGI_FORMAT_P016:
+        case DXGI_FORMAT_420_OPAQUE:
+        case DXGI_FORMAT_YUY2:
+        case DXGI_FORMAT_Y210:
+        case DXGI_FORMAT_Y216:
+        case DXGI_FORMAT_NV11:
+        case DXGI_FORMAT_AI44:
+        case DXGI_FORMAT_IA44:
+        case DXGI_FORMAT_P8:
+        case DXGI_FORMAT_A8P8:
+            UNREACHABLE();
+            return sizeUnknown;
+        case DXGI_FORMAT_B4G4R4A4_UNORM:
+            return size16;
+        default:
+            UNREACHABLE();
+            return sizeUnknown;
</ins><span class="cx">     }
</span><del>-    else if (rtvFormat != DXGI_FORMAT_UNKNOWN)
-    {
-        info.renderFormat = rtvFormat;
-    }
-    else if (texFormat != DXGI_FORMAT_UNKNOWN)
-    {
-        info.renderFormat = texFormat;
-    }
-    else
-    {
-        info.renderFormat = DXGI_FORMAT_UNKNOWN;
-    }
-
-    // Compute the swizzle formats
-    const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(internalFormat);
-    if (internalFormat != GL_NONE &amp;&amp; formatInfo.pixelBytes &gt; 0)
-    {
-        if (formatInfo.componentCount != 4 || texFormat == DXGI_FORMAT_UNKNOWN ||
-            srvFormat == DXGI_FORMAT_UNKNOWN || rtvFormat == DXGI_FORMAT_UNKNOWN)
-        {
-            // Get the maximum sized component
-            unsigned int maxBits = 1;
-            if (formatInfo.compressed)
-            {
-                unsigned int compressedBitsPerBlock = formatInfo.pixelBytes * 8;
-                unsigned int blockSize = formatInfo.compressedBlockWidth * formatInfo.compressedBlockHeight;
-                maxBits = std::max(compressedBitsPerBlock / blockSize, maxBits);
-            }
-            else
-            {
-                maxBits = std::max(maxBits, formatInfo.alphaBits);
-                maxBits = std::max(maxBits, formatInfo.redBits);
-                maxBits = std::max(maxBits, formatInfo.greenBits);
-                maxBits = std::max(maxBits, formatInfo.blueBits);
-                maxBits = std::max(maxBits, formatInfo.luminanceBits);
-                maxBits = std::max(maxBits, formatInfo.depthBits);
-            }
-
-            maxBits = roundUp(maxBits, 8U);
-
-            static const SwizzleInfoMap swizzleMap = BuildSwizzleInfoMap();
-            SwizzleInfoMap::const_iterator swizzleIter = swizzleMap.find(SwizzleSizeType(maxBits, formatInfo.componentType));
-            ASSERT(swizzleIter != swizzleMap.end());
-
-            const SwizzleFormatInfo &amp;swizzleInfo = swizzleIter-&gt;second;
-            info.swizzleTexFormat = swizzleInfo.mTexFormat;
-            info.swizzleSRVFormat = swizzleInfo.mSRVFormat;
-            info.swizzleRTVFormat = swizzleInfo.mRTVFormat;
-        }
-        else
-        {
-            // The original texture format is suitable for swizzle operations
-            info.swizzleTexFormat = texFormat;
-            info.swizzleSRVFormat = srvFormat;
-            info.swizzleRTVFormat = rtvFormat;
-        }
-    }
-    else
-    {
-        // Not possible to swizzle with this texture format since it is either unsized or GL_NONE
-        info.swizzleTexFormat = DXGI_FORMAT_UNKNOWN;
-        info.swizzleSRVFormat = DXGI_FORMAT_UNKNOWN;
-        info.swizzleRTVFormat = DXGI_FORMAT_UNKNOWN;
-    }
-
-    // Check if there is an initialization function for this texture format
-    static const InternalFormatInitializerMap initializerMap = BuildInternalFormatInitializerMap();
-    InternalFormatInitializerMap::const_iterator initializerIter = initializerMap.find(internalFormat);
-    info.dataInitializerFunction = (initializerIter != initializerMap.end()) ? initializerIter-&gt;second : NULL;
-
-    // Gather all the load functions for this internal format from the base list
-    static const D3D11LoadFunctionMap loadFunctions = BuildBaseD3D11LoadFunctionMap();
-    D3D11LoadFunctionMap::const_iterator loadFunctionIter = loadFunctions.find(internalFormat);
-    if (loadFunctionIter != loadFunctions.end())
-    {
-        const std::vector&lt;TypeLoadFunctionPair&gt; &amp;loadFunctionVector = loadFunctionIter-&gt;second;
-        for (size_t i = 0; i &lt; loadFunctionVector.size(); i++)
-        {
-            GLenum type = loadFunctionVector[i].first;
-            LoadImageFunction function = loadFunctionVector[i].second;
-            info.loadFunctions.insert(std::make_pair(type, function));
-        }
-    }
-
-    // Gather load functions for this internal format from the feature-level-specific list
-    D3D11LoadFunctionMap::const_iterator flLoadFunctionIter = flLoadFunctions.find(internalFormat);
-    if (flLoadFunctionIter != flLoadFunctions.end())
-    {
-        const std::vector&lt;TypeLoadFunctionPair&gt; &amp;flLoadFunctionVector = flLoadFunctionIter-&gt;second;
-        for (size_t i = 0; i &lt; flLoadFunctionVector.size(); i++)
-        {
-            GLenum type = flLoadFunctionVector[i].first;
-            LoadImageFunction function = flLoadFunctionVector[i].second;
-            info.loadFunctions.insert(std::make_pair(type, function));
-        }
-    }
-
-    formatMap-&gt;insert(std::make_pair(internalFormat, info));
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline void InsertD3D11_FL9_3_FormatInfo(D3D11ES3FormatMap *map, GLenum internalFormat, DXGI_FORMAT texFormat,
-                                                DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat, DXGI_FORMAT dsvFormat)
-{
-    static const D3D11LoadFunctionMap flLoadFunctions = BuildD3D11_FL9_3_LoadFunctionMap();
-    InsertD3D11FormatInfoBase(map, flLoadFunctions, internalFormat, texFormat, srvFormat, rtvFormat, dsvFormat);
-}
</del><ins>+typedef std::map&lt;gl::VertexFormatType, VertexFormat&gt; D3D11VertexFormatInfoMap;
+typedef std::pair&lt;gl::VertexFormatType, VertexFormat&gt; D3D11VertexFormatPair;
</ins><span class="cx"> 
</span><del>-static inline void InsertD3D11FormatInfo(D3D11ES3FormatMap *map, GLenum internalFormat, DXGI_FORMAT texFormat,
-                                         DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat, DXGI_FORMAT dsvFormat)
-{
-    static const D3D11LoadFunctionMap flLoadFunctions = BuildD3D11_FL10_0Plus_LoadFunctionMap();
-    InsertD3D11FormatInfoBase(map, flLoadFunctions, internalFormat, texFormat, srvFormat, rtvFormat, dsvFormat);
-}
-
-static D3D11ES3FormatMap BuildD3D11_FL9_3FormatOverrideMap()
-{
-    // D3D11 Feature Level 9_3 doesn't support as many texture formats as Feature Level 10_0+.
-    // In particular, it doesn't support:
-    //      - mipmaps on DXGI_FORMAT_A8_NORM
-    //      - *_TYPELESS formats
-    //      - DXGI_FORMAT_D32_FLOAT_S8X24_UINT or DXGI_FORMAT_D32_FLOAT
-
-    D3D11ES3FormatMap map;
-
-    //                                | GL internal format   | D3D11 texture format            | D3D11 SRV format           | D3D11 RTV format            | D3D11 DSV format
-    InsertD3D11_FL9_3_FormatInfo(&amp;map, GL_ALPHA,              DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,  DXGI_FORMAT_R8G8B8A8_UNORM,   DXGI_FORMAT_UNKNOWN);
-    InsertD3D11_FL9_3_FormatInfo(&amp;map, GL_ALPHA8_EXT,         DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,  DXGI_FORMAT_R8G8B8A8_UNORM,   DXGI_FORMAT_UNKNOWN);
-    InsertD3D11_FL9_3_FormatInfo(&amp;map, GL_DEPTH_COMPONENT16,  DXGI_FORMAT_D16_UNORM,            DXGI_FORMAT_UNKNOWN,         DXGI_FORMAT_UNKNOWN,          DXGI_FORMAT_D16_UNORM);
-    InsertD3D11_FL9_3_FormatInfo(&amp;map, GL_DEPTH_COMPONENT24,  DXGI_FORMAT_D24_UNORM_S8_UINT,    DXGI_FORMAT_UNKNOWN,         DXGI_FORMAT_UNKNOWN,          DXGI_FORMAT_D24_UNORM_S8_UINT);
-    InsertD3D11_FL9_3_FormatInfo(&amp;map, GL_DEPTH_COMPONENT32F, DXGI_FORMAT_UNKNOWN,              DXGI_FORMAT_UNKNOWN,         DXGI_FORMAT_UNKNOWN,          DXGI_FORMAT_UNKNOWN);
-    InsertD3D11_FL9_3_FormatInfo(&amp;map, GL_DEPTH24_STENCIL8,   DXGI_FORMAT_D24_UNORM_S8_UINT,    DXGI_FORMAT_UNKNOWN,         DXGI_FORMAT_UNKNOWN,          DXGI_FORMAT_D24_UNORM_S8_UINT);
-    InsertD3D11_FL9_3_FormatInfo(&amp;map, GL_DEPTH32F_STENCIL8,  DXGI_FORMAT_UNKNOWN,              DXGI_FORMAT_UNKNOWN,         DXGI_FORMAT_UNKNOWN,          DXGI_FORMAT_UNKNOWN);
-    InsertD3D11_FL9_3_FormatInfo(&amp;map, GL_STENCIL_INDEX8,     DXGI_FORMAT_D24_UNORM_S8_UINT,    DXGI_FORMAT_UNKNOWN,         DXGI_FORMAT_UNKNOWN,          DXGI_FORMAT_D24_UNORM_S8_UINT);
-
-    return map;
-}
-
-static D3D11ES3FormatMap BuildD3D11FormatMap()
-{
-    D3D11ES3FormatMap map;
-
-    //                         | GL internal format  | D3D11 texture format            | D3D11 SRV format               | D3D11 RTV format               | D3D11 DSV format   |
-    InsertD3D11FormatInfo(&amp;map, GL_NONE,              DXGI_FORMAT_UNKNOWN,              DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R8,                DXGI_FORMAT_R8_UNORM,             DXGI_FORMAT_R8_UNORM,            DXGI_FORMAT_R8_UNORM,            DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R8_SNORM,          DXGI_FORMAT_R8_SNORM,             DXGI_FORMAT_R8_SNORM,            DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RG8,               DXGI_FORMAT_R8G8_UNORM,           DXGI_FORMAT_R8G8_UNORM,          DXGI_FORMAT_R8G8_UNORM,          DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RG8_SNORM,         DXGI_FORMAT_R8G8_SNORM,           DXGI_FORMAT_R8G8_SNORM,          DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB8,              DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB8_SNORM,        DXGI_FORMAT_R8G8B8A8_SNORM,       DXGI_FORMAT_R8G8B8A8_SNORM,      DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB565,            DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA4,             DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB5_A1,           DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA8,             DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA8_SNORM,       DXGI_FORMAT_R8G8B8A8_SNORM,       DXGI_FORMAT_R8G8B8A8_SNORM,      DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB10_A2,          DXGI_FORMAT_R10G10B10A2_UNORM,    DXGI_FORMAT_R10G10B10A2_UNORM,   DXGI_FORMAT_R10G10B10A2_UNORM,   DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB10_A2UI,        DXGI_FORMAT_R10G10B10A2_UINT,     DXGI_FORMAT_R10G10B10A2_UINT,    DXGI_FORMAT_R10G10B10A2_UINT,    DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_SRGB8,             DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,  DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_SRGB8_ALPHA8,      DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,  DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R16F,              DXGI_FORMAT_R16_FLOAT,            DXGI_FORMAT_R16_FLOAT,           DXGI_FORMAT_R16_FLOAT,           DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RG16F,             DXGI_FORMAT_R16G16_FLOAT,         DXGI_FORMAT_R16G16_FLOAT,        DXGI_FORMAT_R16G16_FLOAT,        DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB16F,            DXGI_FORMAT_R16G16B16A16_FLOAT,   DXGI_FORMAT_R16G16B16A16_FLOAT,  DXGI_FORMAT_R16G16B16A16_FLOAT,  DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA16F,           DXGI_FORMAT_R16G16B16A16_FLOAT,   DXGI_FORMAT_R16G16B16A16_FLOAT,  DXGI_FORMAT_R16G16B16A16_FLOAT,  DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R32F,              DXGI_FORMAT_R32_FLOAT,            DXGI_FORMAT_R32_FLOAT,           DXGI_FORMAT_R32_FLOAT,           DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RG32F,             DXGI_FORMAT_R32G32_FLOAT,         DXGI_FORMAT_R32G32_FLOAT,        DXGI_FORMAT_R32G32_FLOAT,        DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB32F,            DXGI_FORMAT_R32G32B32A32_FLOAT,   DXGI_FORMAT_R32G32B32A32_FLOAT,  DXGI_FORMAT_R32G32B32A32_FLOAT,  DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA32F,           DXGI_FORMAT_R32G32B32A32_FLOAT,   DXGI_FORMAT_R32G32B32A32_FLOAT,  DXGI_FORMAT_R32G32B32A32_FLOAT,  DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R11F_G11F_B10F,    DXGI_FORMAT_R11G11B10_FLOAT,      DXGI_FORMAT_R11G11B10_FLOAT,     DXGI_FORMAT_R11G11B10_FLOAT,     DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB9_E5,           DXGI_FORMAT_R9G9B9E5_SHAREDEXP,   DXGI_FORMAT_R9G9B9E5_SHAREDEXP,  DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R8I,               DXGI_FORMAT_R8_SINT,              DXGI_FORMAT_R8_SINT,             DXGI_FORMAT_R8_SINT,             DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R8UI,              DXGI_FORMAT_R8_UINT,              DXGI_FORMAT_R8_UINT,             DXGI_FORMAT_R8_UINT,             DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R16I,              DXGI_FORMAT_R16_SINT,             DXGI_FORMAT_R16_SINT,            DXGI_FORMAT_R16_SINT,            DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R16UI,             DXGI_FORMAT_R16_UINT,             DXGI_FORMAT_R16_UINT,            DXGI_FORMAT_R16_UINT,            DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R32I,              DXGI_FORMAT_R32_SINT,             DXGI_FORMAT_R32_SINT,            DXGI_FORMAT_R32_SINT,            DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_R32UI,             DXGI_FORMAT_R32_UINT,             DXGI_FORMAT_R32_UINT,            DXGI_FORMAT_R32_UINT,            DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RG8I,              DXGI_FORMAT_R8G8_SINT,            DXGI_FORMAT_R8G8_SINT,           DXGI_FORMAT_R8G8_SINT,           DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RG8UI,             DXGI_FORMAT_R8G8_UINT,            DXGI_FORMAT_R8G8_UINT,           DXGI_FORMAT_R8G8_UINT,           DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RG16I,             DXGI_FORMAT_R16G16_SINT,          DXGI_FORMAT_R16G16_SINT,         DXGI_FORMAT_R16G16_SINT,         DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RG16UI,            DXGI_FORMAT_R16G16_UINT,          DXGI_FORMAT_R16G16_UINT,         DXGI_FORMAT_R16G16_UINT,         DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RG32I,             DXGI_FORMAT_R32G32_SINT,          DXGI_FORMAT_R32G32_SINT,         DXGI_FORMAT_R32G32_SINT,         DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RG32UI,            DXGI_FORMAT_R32G32_UINT,          DXGI_FORMAT_R32G32_UINT,         DXGI_FORMAT_R32G32_UINT,         DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB8I,             DXGI_FORMAT_R8G8B8A8_SINT,        DXGI_FORMAT_R8G8B8A8_SINT,       DXGI_FORMAT_R8G8B8A8_SINT,       DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB8UI,            DXGI_FORMAT_R8G8B8A8_UINT,        DXGI_FORMAT_R8G8B8A8_UINT,       DXGI_FORMAT_R8G8B8A8_UINT,       DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB16I,            DXGI_FORMAT_R16G16B16A16_SINT,    DXGI_FORMAT_R16G16B16A16_SINT,   DXGI_FORMAT_R16G16B16A16_SINT,   DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB16UI,           DXGI_FORMAT_R16G16B16A16_UINT,    DXGI_FORMAT_R16G16B16A16_UINT,   DXGI_FORMAT_R16G16B16A16_UINT,   DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB32I,            DXGI_FORMAT_R32G32B32A32_SINT,    DXGI_FORMAT_R32G32B32A32_SINT,   DXGI_FORMAT_R32G32B32A32_SINT,   DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB32UI,           DXGI_FORMAT_R32G32B32A32_UINT,    DXGI_FORMAT_R32G32B32A32_UINT,   DXGI_FORMAT_R32G32B32A32_UINT,   DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA8I,            DXGI_FORMAT_R8G8B8A8_SINT,        DXGI_FORMAT_R8G8B8A8_SINT,       DXGI_FORMAT_R8G8B8A8_SINT,       DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA8UI,           DXGI_FORMAT_R8G8B8A8_UINT,        DXGI_FORMAT_R8G8B8A8_UINT,       DXGI_FORMAT_R8G8B8A8_UINT,       DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA16I,           DXGI_FORMAT_R16G16B16A16_SINT,    DXGI_FORMAT_R16G16B16A16_SINT,   DXGI_FORMAT_R16G16B16A16_SINT,   DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA16UI,          DXGI_FORMAT_R16G16B16A16_UINT,    DXGI_FORMAT_R16G16B16A16_UINT,   DXGI_FORMAT_R16G16B16A16_UINT,   DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA32I,           DXGI_FORMAT_R32G32B32A32_SINT,    DXGI_FORMAT_R32G32B32A32_SINT,   DXGI_FORMAT_R32G32B32A32_SINT,   DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA32UI,          DXGI_FORMAT_R32G32B32A32_UINT,    DXGI_FORMAT_R32G32B32A32_UINT,   DXGI_FORMAT_R32G32B32A32_UINT,   DXGI_FORMAT_UNKNOWN);
-
-    // Unsized formats, TODO: Are types of float and half float allowed for the unsized types? Would it change the DXGI format?
-    InsertD3D11FormatInfo(&amp;map, GL_ALPHA,             DXGI_FORMAT_A8_UNORM,             DXGI_FORMAT_A8_UNORM,            DXGI_FORMAT_A8_UNORM,            DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_LUMINANCE,         DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_LUMINANCE_ALPHA,   DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGB,               DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_RGBA,              DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_BGRA_EXT,          DXGI_FORMAT_B8G8R8A8_UNORM,       DXGI_FORMAT_B8G8R8A8_UNORM,      DXGI_FORMAT_B8G8R8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
-
-    // From GL_EXT_texture_storage
-    //                           | GL internal format     | D3D11 texture format          | D3D11 SRV format                    | D3D11 RTV format              | D3D11 DSV format               |
-    InsertD3D11FormatInfo(&amp;map, GL_ALPHA8_EXT,             DXGI_FORMAT_A8_UNORM,           DXGI_FORMAT_A8_UNORM,                 DXGI_FORMAT_A8_UNORM,           DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_LUMINANCE8_EXT,         DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_R8G8B8A8_UNORM,           DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_ALPHA32F_EXT,           DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT,       DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_LUMINANCE32F_EXT,       DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT,       DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_ALPHA16F_EXT,           DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT,       DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_LUMINANCE16F_EXT,       DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT,       DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_LUMINANCE8_ALPHA8_EXT,  DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_R8G8B8A8_UNORM,           DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_LUMINANCE_ALPHA32F_EXT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT,       DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_LUMINANCE_ALPHA16F_EXT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT,       DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_BGRA8_EXT,              DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_B8G8R8A8_UNORM,           DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_BGRA4_ANGLEX,           DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_B8G8R8A8_UNORM,           DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_UNKNOWN           );
-    InsertD3D11FormatInfo(&amp;map, GL_BGR5_A1_ANGLEX,         DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_B8G8R8A8_UNORM,           DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_UNKNOWN           );
-
-    // Depth stencil formats
-    InsertD3D11FormatInfo(&amp;map, GL_DEPTH_COMPONENT16,     DXGI_FORMAT_R16_TYPELESS,        DXGI_FORMAT_R16_UNORM,                DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D16_UNORM         );
-    InsertD3D11FormatInfo(&amp;map, GL_DEPTH_COMPONENT24,     DXGI_FORMAT_R24G8_TYPELESS,      DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D24_UNORM_S8_UINT );
-    InsertD3D11FormatInfo(&amp;map, GL_DEPTH_COMPONENT32F,    DXGI_FORMAT_R32_TYPELESS,        DXGI_FORMAT_R32_FLOAT,                DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D32_FLOAT         );
-    InsertD3D11FormatInfo(&amp;map, GL_DEPTH24_STENCIL8,      DXGI_FORMAT_R24G8_TYPELESS,      DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D24_UNORM_S8_UINT );
-    InsertD3D11FormatInfo(&amp;map, GL_DEPTH32F_STENCIL8,     DXGI_FORMAT_R32G8X24_TYPELESS,   DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D32_FLOAT_S8X24_UINT);
-    InsertD3D11FormatInfo(&amp;map, GL_STENCIL_INDEX8,        DXGI_FORMAT_R24G8_TYPELESS,      DXGI_FORMAT_X24_TYPELESS_G8_UINT,     DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D24_UNORM_S8_UINT );
-
-    // From GL_ANGLE_depth_texture
-    // Since D3D11 doesn't have a D32_UNORM format, use D24S8 which has comparable precision and matches the ES3 format.
-    InsertD3D11FormatInfo(&amp;map, GL_DEPTH_COMPONENT32_OES, DXGI_FORMAT_R24G8_TYPELESS,      DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_D24_UNORM_S8_UINT);
-
-    // Compressed formats, From ES 3.0.1 spec, table 3.16
-    //                           | GL internal format                        | D3D11 texture format | D3D11 SRV format     | D3D11 RTV format   | D3D11 DSV format  |
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_R11_EAC,                        DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_SIGNED_R11_EAC,                 DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_RG11_EAC,                       DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_SIGNED_RG11_EAC,                DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_RGB8_ETC2,                      DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_SRGB8_ETC2,                     DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_RGBA8_ETC2_EAC,                 DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-
-    // From GL_EXT_texture_compression_dxt1
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,              DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,             DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-
-    // From GL_ANGLE_texture_compression_dxt3
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,           DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-
-    // From GL_ANGLE_texture_compression_dxt5
-    InsertD3D11FormatInfo(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,           DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
-
-    return map;
-}
-
-const TextureFormat &amp;GetTextureFormatInfo(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel)
-{
-    static const D3D11ES3FormatMap formatMap = BuildD3D11FormatMap();
-    static const D3D11ES3FormatMap formatMapFL9_3Override = BuildD3D11_FL9_3FormatOverrideMap();
-
-    if (featureLevel == D3D_FEATURE_LEVEL_9_3)
-    {
-        // First see if the internalFormat has a special map for FL9_3
-        D3D11ES3FormatMap::const_iterator fl9_3Iter = formatMapFL9_3Override.find(internalFormat);
-        if (fl9_3Iter != formatMapFL9_3Override.end())
-        {
-            return fl9_3Iter-&gt;second;
-        }
-    }
-
-    D3D11ES3FormatMap::const_iterator iter = formatMap.find(internalFormat);
-    if (iter != formatMap.end())
-    {
-        return iter-&gt;second;
-    }
-    else
-    {
-        static const TextureFormat defaultInfo;
-        return defaultInfo;
-    }
-}
-
-typedef std::map&lt;gl::VertexFormat, VertexFormat&gt; D3D11VertexFormatInfoMap;
-typedef std::pair&lt;gl::VertexFormat, VertexFormat&gt; D3D11VertexFormatPair;
-
</del><span class="cx"> VertexFormat::VertexFormat()
</span><span class="cx">     : conversionType(VERTEX_CONVERT_NONE),
</span><span class="cx">       nativeFormat(DXGI_FORMAT_UNKNOWN),
</span><span class="lines">@@ -1065,30 +568,31 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void AddVertexFormatInfo(D3D11VertexFormatInfoMap *map, GLenum inputType, GLboolean normalized, GLuint componentCount,
-                                VertexConversionType conversionType, DXGI_FORMAT nativeFormat, VertexCopyFunction copyFunction)
</del><ins>+VertexFormat::VertexFormat(VertexConversionType conversionTypeIn,
+                           DXGI_FORMAT nativeFormatIn,
+                           VertexCopyFunction copyFunctionIn)
+    : conversionType(conversionTypeIn),
+      nativeFormat(nativeFormatIn),
+      copyFunction(copyFunctionIn)
</ins><span class="cx"> {
</span><del>-    gl::VertexFormat inputFormat(inputType, normalized, componentCount, false);
-
-    VertexFormat info;
-    info.conversionType = conversionType;
-    info.nativeFormat = nativeFormat;
-    info.copyFunction = copyFunction;
-
-    map-&gt;insert(D3D11VertexFormatPair(inputFormat, info));
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void AddIntegerVertexFormatInfo(D3D11VertexFormatInfoMap *map, GLenum inputType, GLuint componentCount,
-                                       VertexConversionType conversionType, DXGI_FORMAT nativeFormat, VertexCopyFunction copyFunction)
</del><ins>+static void AddVertexFormatInfo(D3D11VertexFormatInfoMap *map,
+                                GLenum inputType,
+                                GLboolean normalized,
+                                GLuint componentCount,
+                                VertexConversionType conversionType,
+                                DXGI_FORMAT nativeFormat,
+                                VertexCopyFunction copyFunction)
</ins><span class="cx"> {
</span><del>-    gl::VertexFormat inputFormat(inputType, GL_FALSE, componentCount, true);
</del><ins>+    gl::VertexFormatType formatType = gl::GetVertexFormatType(inputType, normalized, componentCount, false);
</ins><span class="cx"> 
</span><span class="cx">     VertexFormat info;
</span><span class="cx">     info.conversionType = conversionType;
</span><span class="cx">     info.nativeFormat = nativeFormat;
</span><span class="cx">     info.copyFunction = copyFunction;
</span><span class="cx"> 
</span><del>-    map-&gt;insert(D3D11VertexFormatPair(inputFormat, info));
</del><ins>+    map-&gt;insert(D3D11VertexFormatPair(formatType, info));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static D3D11VertexFormatInfoMap BuildD3D11_FL9_3VertexFormatInfoOverrideMap()
</span><span class="lines">@@ -1153,188 +657,540 @@
</span><span class="cx">     return map;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static D3D11VertexFormatInfoMap BuildD3D11VertexFormatInfoMap()
</del><ins>+const VertexFormat &amp;GetVertexFormatInfo(gl::VertexFormatType vertexFormatType, D3D_FEATURE_LEVEL featureLevel)
</ins><span class="cx"> {
</span><del>-    D3D11VertexFormatInfoMap map;
</del><ins>+    if (featureLevel == D3D_FEATURE_LEVEL_9_3)
+    {
+        static const D3D11VertexFormatInfoMap vertexFormatMapFL9_3Override =
+            BuildD3D11_FL9_3VertexFormatInfoOverrideMap();
</ins><span class="cx"> 
</span><del>-    // TODO: column legend
</del><ins>+        // First see if the format has a special mapping for FL9_3
+        auto iter = vertexFormatMapFL9_3Override.find(vertexFormatType);
+        if (iter != vertexFormatMapFL9_3Override.end())
+        {
+            return iter-&gt;second;
+        }
+    }
</ins><span class="cx"> 
</span><del>-    //
-    // Float formats
-    //
</del><ins>+    switch (vertexFormatType)
+    {
+        //
+        // Float formats
+        //
</ins><span class="cx"> 
</span><del>-    // GL_BYTE -- un-normalized
-    AddVertexFormatInfo(&amp;map, GL_BYTE,           GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8_SINT,            &amp;CopyNativeVertexData&lt;GLbyte, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_BYTE,           GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8G8_SINT,          &amp;CopyNativeVertexData&lt;GLbyte, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_BYTE,           GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_SINT,      &amp;CopyNativeVertexData&lt;GLbyte, 3, 4, 1&gt;);
-    AddVertexFormatInfo(&amp;map, GL_BYTE,           GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8G8B8A8_SINT,      &amp;CopyNativeVertexData&lt;GLbyte, 4, 4, 0&gt;);
</del><ins>+        // GL_BYTE -- un-normalized
+        case gl::VERTEX_FORMAT_SBYTE1:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_SINT, &amp;CopyNativeVertexData&lt;GLbyte, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SBYTE2:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_SINT, &amp;CopyNativeVertexData&lt;GLbyte, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SBYTE3:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_SINT, &amp;CopyNativeVertexData&lt;GLbyte, 3, 4, 1&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SBYTE4:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_SINT, &amp;CopyNativeVertexData&lt;GLbyte, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_BYTE -- normalized
-    AddVertexFormatInfo(&amp;map, GL_BYTE,           GL_TRUE,  1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SNORM,           &amp;CopyNativeVertexData&lt;GLbyte, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_BYTE,           GL_TRUE,  2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SNORM,         &amp;CopyNativeVertexData&lt;GLbyte, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_BYTE,           GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R8G8B8A8_SNORM,     &amp;CopyNativeVertexData&lt;GLbyte, 3, 4, INT8_MAX&gt;);
-    AddVertexFormatInfo(&amp;map, GL_BYTE,           GL_TRUE,  4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SNORM,     &amp;CopyNativeVertexData&lt;GLbyte, 4, 4, 0&gt;);
</del><ins>+        // GL_BYTE -- normalized
+        case gl::VERTEX_FORMAT_SBYTE1_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SNORM, &amp;CopyNativeVertexData&lt;GLbyte, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SBYTE2_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SNORM, &amp;CopyNativeVertexData&lt;GLbyte, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SBYTE3_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SNORM, &amp;CopyNativeVertexData&lt;GLbyte, 3, 4, INT8_MAX&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SBYTE4_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SNORM, &amp;CopyNativeVertexData&lt;GLbyte, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_BYTE -- un-normalized
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8_UINT,            &amp;CopyNativeVertexData&lt;GLubyte, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8G8_UINT,          &amp;CopyNativeVertexData&lt;GLubyte, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,      &amp;CopyNativeVertexData&lt;GLubyte, 3, 4, 1&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8G8B8A8_UINT,      &amp;CopyNativeVertexData&lt;GLubyte, 4, 4, 0&gt;);
</del><ins>+        // GL_UNSIGNED_BYTE -- un-normalized
+        case gl::VERTEX_FORMAT_UBYTE1:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_UINT, &amp;CopyNativeVertexData&lt;GLubyte, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UBYTE2:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_UINT, &amp;CopyNativeVertexData&lt;GLubyte, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UBYTE3:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT, &amp;CopyNativeVertexData&lt;GLubyte, 3, 4, 1&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UBYTE4:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_UINT, &amp;CopyNativeVertexData&lt;GLubyte, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_BYTE -- normalized
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  GL_TRUE,  1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UNORM,           &amp;CopyNativeVertexData&lt;GLubyte, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  GL_TRUE,  2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UNORM,         &amp;CopyNativeVertexData&lt;GLubyte, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R8G8B8A8_UNORM,     &amp;CopyNativeVertexData&lt;GLubyte, 3, 4, UINT8_MAX&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  GL_TRUE,  4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UNORM,     &amp;CopyNativeVertexData&lt;GLubyte, 4, 4, 0&gt;);
</del><ins>+        // GL_UNSIGNED_BYTE -- normalized
+        case gl::VERTEX_FORMAT_UBYTE1_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UNORM, &amp;CopyNativeVertexData&lt;GLubyte, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UBYTE2_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UNORM, &amp;CopyNativeVertexData&lt;GLubyte, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UBYTE3_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM, &amp;CopyNativeVertexData&lt;GLubyte, 3, 4, UINT8_MAX&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UBYTE4_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UNORM, &amp;CopyNativeVertexData&lt;GLubyte, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_SHORT -- un-normalized
-    AddVertexFormatInfo(&amp;map, GL_SHORT,          GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16_SINT,           &amp;CopyNativeVertexData&lt;GLshort, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_SHORT,          GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16G16_SINT,        &amp;CopyNativeVertexData&lt;GLshort, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_SHORT,          GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,  &amp;CopyNativeVertexData&lt;GLshort, 3, 4, 1&gt;);
-    AddVertexFormatInfo(&amp;map, GL_SHORT,          GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16G16B16A16_SINT,  &amp;CopyNativeVertexData&lt;GLshort, 4, 4, 0&gt;);
</del><ins>+        // GL_SHORT -- un-normalized
+        case gl::VERTEX_FORMAT_SSHORT1:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_SINT, &amp;CopyNativeVertexData&lt;GLshort, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SSHORT2:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_SINT, &amp;CopyNativeVertexData&lt;GLshort, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SSHORT3:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT, &amp;CopyNativeVertexData&lt;GLshort, 3, 4, 1&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SSHORT4:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_SINT, &amp;CopyNativeVertexData&lt;GLshort, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_SHORT -- normalized
-    AddVertexFormatInfo(&amp;map, GL_SHORT,          GL_TRUE,  1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SNORM,          &amp;CopyNativeVertexData&lt;GLshort, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_SHORT,          GL_TRUE,  2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SNORM,       &amp;CopyNativeVertexData&lt;GLshort, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_SHORT,          GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R16G16B16A16_SNORM, &amp;CopyNativeVertexData&lt;GLshort, 3, 4, INT16_MAX&gt;);
-    AddVertexFormatInfo(&amp;map, GL_SHORT,          GL_TRUE,  4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SNORM, &amp;CopyNativeVertexData&lt;GLshort, 4, 4, 0&gt;);
</del><ins>+        // GL_SHORT -- normalized
+        case gl::VERTEX_FORMAT_SSHORT1_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SNORM, &amp;CopyNativeVertexData&lt;GLshort, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SSHORT2_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SNORM, &amp;CopyNativeVertexData&lt;GLshort, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SSHORT3_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM, &amp;CopyNativeVertexData&lt;GLshort, 3, 4, INT16_MAX&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SSHORT4_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SNORM, &amp;CopyNativeVertexData&lt;GLshort, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_SHORT -- un-normalized
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16_UINT,           &amp;CopyNativeVertexData&lt;GLushort, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16G16_UINT,        &amp;CopyNativeVertexData&lt;GLushort, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_UINT,  &amp;CopyNativeVertexData&lt;GLushort, 3, 4, 1&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16G16B16A16_UINT,  &amp;CopyNativeVertexData&lt;GLushort, 4, 4, 0&gt;);
</del><ins>+        // GL_UNSIGNED_SHORT -- un-normalized
+        case gl::VERTEX_FORMAT_USHORT1:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_UINT, &amp;CopyNativeVertexData&lt;GLushort, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_USHORT2:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_UINT, &amp;CopyNativeVertexData&lt;GLushort, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_USHORT3:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_UINT, &amp;CopyNativeVertexData&lt;GLushort, 3, 4, 1&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_USHORT4:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_UINT, &amp;CopyNativeVertexData&lt;GLushort, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_SHORT -- normalized
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, GL_TRUE,  1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UNORM,          &amp;CopyNativeVertexData&lt;GLushort, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, GL_TRUE,  2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UNORM,       &amp;CopyNativeVertexData&lt;GLushort, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R16G16B16A16_UNORM, &amp;CopyNativeVertexData&lt;GLushort, 3, 4, UINT16_MAX&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, GL_TRUE,  4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UNORM, &amp;CopyNativeVertexData&lt;GLushort, 4, 4, 0&gt;);
</del><ins>+        // GL_UNSIGNED_SHORT -- normalized
+        case gl::VERTEX_FORMAT_USHORT1_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UNORM, &amp;CopyNativeVertexData&lt;GLushort, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_USHORT2_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UNORM, &amp;CopyNativeVertexData&lt;GLushort, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_USHORT3_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UNORM, &amp;CopyNativeVertexData&lt;GLushort, 3, 4, UINT16_MAX&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_USHORT4_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UNORM, &amp;CopyNativeVertexData&lt;GLushort, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_INT -- un-normalized
-    AddVertexFormatInfo(&amp;map, GL_INT,            GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32_SINT,           &amp;CopyNativeVertexData&lt;GLint, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_INT,            GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32_SINT,        &amp;CopyNativeVertexData&lt;GLint, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_INT,            GL_FALSE, 3, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32B32_SINT,     &amp;CopyNativeVertexData&lt;GLint, 3, 3, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_INT,            GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32B32A32_SINT,  &amp;CopyNativeVertexData&lt;GLint, 4, 4, 0&gt;);
</del><ins>+        // GL_INT -- un-normalized
+        case gl::VERTEX_FORMAT_SINT1:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_SINT, &amp;CopyNativeVertexData&lt;GLint, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SINT2:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_SINT, &amp;CopyNativeVertexData&lt;GLint, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SINT3:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_SINT, &amp;CopyNativeVertexData&lt;GLint, 3, 3, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SINT4:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_SINT, &amp;CopyNativeVertexData&lt;GLint, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_INT -- normalized
-    AddVertexFormatInfo(&amp;map, GL_INT,            GL_TRUE,  1, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32_FLOAT,          &amp;CopyTo32FVertexData&lt;GLint, 1, 1, true&gt;);
-    AddVertexFormatInfo(&amp;map, GL_INT,            GL_TRUE,  2, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32_FLOAT,       &amp;CopyTo32FVertexData&lt;GLint, 2, 2, true&gt;);
-    AddVertexFormatInfo(&amp;map, GL_INT,            GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32_FLOAT,    &amp;CopyTo32FVertexData&lt;GLint, 3, 3, true&gt;);
-    AddVertexFormatInfo(&amp;map, GL_INT,            GL_TRUE,  4, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyTo32FVertexData&lt;GLint, 4, 4, true&gt;);
</del><ins>+        // GL_INT -- normalized
+        case gl::VERTEX_FORMAT_SINT1_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT, &amp;CopyTo32FVertexData&lt;GLint, 1, 1, true&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SINT2_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, &amp;CopyTo32FVertexData&lt;GLint, 2, 2, true&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SINT3_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, &amp;CopyTo32FVertexData&lt;GLint, 3, 3, true&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SINT4_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyTo32FVertexData&lt;GLint, 4, 4, true&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_INT -- un-normalized
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32_UINT,           &amp;CopyNativeVertexData&lt;GLuint, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32_UINT,        &amp;CopyNativeVertexData&lt;GLuint, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   GL_FALSE, 3, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32B32_UINT,     &amp;CopyNativeVertexData&lt;GLuint, 3, 3, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32B32A32_UINT,  &amp;CopyNativeVertexData&lt;GLuint, 4, 4, 0&gt;);
</del><ins>+        // GL_UNSIGNED_INT -- un-normalized
+        case gl::VERTEX_FORMAT_UINT1:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_UINT, &amp;CopyNativeVertexData&lt;GLuint, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UINT2:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_UINT, &amp;CopyNativeVertexData&lt;GLuint, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UINT3:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_UINT, &amp;CopyNativeVertexData&lt;GLuint, 3, 3, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UINT4:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_UINT, &amp;CopyNativeVertexData&lt;GLuint, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_INT -- normalized
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   GL_TRUE,  1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT,          &amp;CopyTo32FVertexData&lt;GLuint, 1, 1, true&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   GL_TRUE,  2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT,       &amp;CopyTo32FVertexData&lt;GLuint, 2, 2, true&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32_FLOAT,    &amp;CopyTo32FVertexData&lt;GLuint, 3, 3, true&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   GL_TRUE,  4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyTo32FVertexData&lt;GLuint, 4, 4, true&gt;);
</del><ins>+        // GL_UNSIGNED_INT -- normalized
+        case gl::VERTEX_FORMAT_UINT1_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT,
+                                           &amp;CopyTo32FVertexData&lt;GLuint, 1, 1, true&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UINT2_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
+                                           &amp;CopyTo32FVertexData&lt;GLuint, 2, 2, true&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UINT3_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, &amp;CopyTo32FVertexData&lt;GLuint, 3, 3, true&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UINT4_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
+                                           &amp;CopyTo32FVertexData&lt;GLuint, 4, 4, true&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_FIXED
-    AddVertexFormatInfo(&amp;map, GL_FIXED,          GL_FALSE, 1, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32_FLOAT,          &amp;Copy32FixedTo32FVertexData&lt;1, 1&gt;);
-    AddVertexFormatInfo(&amp;map, GL_FIXED,          GL_FALSE, 2, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32_FLOAT,       &amp;Copy32FixedTo32FVertexData&lt;2, 2&gt;);
-    AddVertexFormatInfo(&amp;map, GL_FIXED,          GL_FALSE, 3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32_FLOAT,    &amp;Copy32FixedTo32FVertexData&lt;3, 3&gt;);
-    AddVertexFormatInfo(&amp;map, GL_FIXED,          GL_FALSE, 4, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;Copy32FixedTo32FVertexData&lt;4, 4&gt;);
</del><ins>+        // GL_FIXED
+        case gl::VERTEX_FORMAT_FIXED1:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT, &amp;Copy32FixedTo32FVertexData&lt;1, 1&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_FIXED2:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT, &amp;Copy32FixedTo32FVertexData&lt;2, 2&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_FIXED3:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT, &amp;Copy32FixedTo32FVertexData&lt;3, 3&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_FIXED4:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;Copy32FixedTo32FVertexData&lt;4, 4&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_HALF_FLOAT
-    AddVertexFormatInfo(&amp;map, GL_HALF_FLOAT,     GL_FALSE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_FLOAT,          &amp;CopyNativeVertexData&lt;GLhalf, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_HALF_FLOAT,     GL_FALSE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_FLOAT,       &amp;CopyNativeVertexData&lt;GLhalf, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_HALF_FLOAT,     GL_FALSE, 3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R16G16B16A16_FLOAT, &amp;CopyNativeVertexData&lt;GLhalf, 3, 4, gl::Float16One&gt;);
-    AddVertexFormatInfo(&amp;map, GL_HALF_FLOAT,     GL_FALSE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_FLOAT, &amp;CopyNativeVertexData&lt;GLhalf, 4, 4, 0&gt;);
</del><ins>+        // GL_HALF_FLOAT
+        case gl::VERTEX_FORMAT_HALF1:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_FLOAT, &amp;CopyNativeVertexData&lt;GLhalf, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_HALF2:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_FLOAT, &amp;CopyNativeVertexData&lt;GLhalf, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_HALF3:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_FLOAT, &amp;CopyNativeVertexData&lt;GLhalf, 3, 4, gl::Float16One&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_HALF4:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_FLOAT, &amp;CopyNativeVertexData&lt;GLhalf, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_FLOAT
-    AddVertexFormatInfo(&amp;map, GL_FLOAT,          GL_FALSE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT,          &amp;CopyNativeVertexData&lt;GLfloat, 1, 1, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_FLOAT,          GL_FALSE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT,       &amp;CopyNativeVertexData&lt;GLfloat, 2, 2, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_FLOAT,          GL_FALSE, 3, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_FLOAT,    &amp;CopyNativeVertexData&lt;GLfloat, 3, 3, 0&gt;);
-    AddVertexFormatInfo(&amp;map, GL_FLOAT,          GL_FALSE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyNativeVertexData&lt;GLfloat, 4, 4, 0&gt;);
</del><ins>+        // GL_FLOAT
+        case gl::VERTEX_FORMAT_FLOAT1:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT, &amp;CopyNativeVertexData&lt;GLfloat, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_FLOAT2:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT, &amp;CopyNativeVertexData&lt;GLfloat, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_FLOAT3:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_FLOAT, &amp;CopyNativeVertexData&lt;GLfloat, 3, 3, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_FLOAT4:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyNativeVertexData&lt;GLfloat, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_INT_2_10_10_10_REV
-    AddVertexFormatInfo(&amp;map, GL_INT_2_10_10_10_REV,          GL_FALSE,  4, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyXYZ10W2ToXYZW32FVertexData&lt;true, false, true&gt;);
-    AddVertexFormatInfo(&amp;map, GL_INT_2_10_10_10_REV,          GL_TRUE,   4, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyXYZ10W2ToXYZW32FVertexData&lt;true, true,  true&gt;);
</del><ins>+        // GL_INT_2_10_10_10_REV
+        case gl::VERTEX_FORMAT_SINT210:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyXYZ10W2ToXYZW32FVertexData&lt;true, false, true&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SINT210_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyXYZ10W2ToXYZW32FVertexData&lt;true, true, true&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_INT_2_10_10_10_REV
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE,  4, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyXYZ10W2ToXYZW32FVertexData&lt;false, false, true&gt;);
-    AddVertexFormatInfo(&amp;map, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE,   4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UNORM,  &amp;CopyNativeVertexData&lt;GLuint, 1, 1, 0&gt;);
</del><ins>+        // GL_UNSIGNED_INT_2_10_10_10_REV
+        case gl::VERTEX_FORMAT_UINT210:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT, &amp;CopyXYZ10W2ToXYZW32FVertexData&lt;false, false, true&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UINT210_NORM:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UNORM, &amp;CopyNativeVertexData&lt;GLuint, 1, 1, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    //
-    // Integer Formats
-    //
</del><ins>+        //
+        // Integer Formats
+        //
</ins><span class="cx"> 
</span><del>-    // GL_BYTE
-    AddIntegerVertexFormatInfo(&amp;map, GL_BYTE,           1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8_SINT,           &amp;CopyNativeVertexData&lt;GLbyte, 1, 1, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_BYTE,           2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8G8_SINT,         &amp;CopyNativeVertexData&lt;GLbyte, 2, 2, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_BYTE,           3, VERTEX_CONVERT_CPU,   DXGI_FORMAT_R8G8B8A8_SINT,     &amp;CopyNativeVertexData&lt;GLbyte, 3, 4, 1&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_BYTE,           4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8G8B8A8_SINT,     &amp;CopyNativeVertexData&lt;GLbyte, 4, 4, 0&gt;);
</del><ins>+        // GL_BYTE
+        case gl::VERTEX_FORMAT_SBYTE1_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SINT, &amp;CopyNativeVertexData&lt;GLbyte, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SBYTE2_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SINT, &amp;CopyNativeVertexData&lt;GLbyte, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SBYTE3_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SINT, &amp;CopyNativeVertexData&lt;GLbyte, 3, 4, 1&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SBYTE4_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SINT, &amp;CopyNativeVertexData&lt;GLbyte, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_BYTE
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8_UINT,           &amp;CopyNativeVertexData&lt;GLubyte, 1, 1, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8G8_UINT,         &amp;CopyNativeVertexData&lt;GLubyte, 2, 2, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  3, VERTEX_CONVERT_CPU,   DXGI_FORMAT_R8G8B8A8_UINT,     &amp;CopyNativeVertexData&lt;GLubyte, 3, 4, 1&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_BYTE,  4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8G8B8A8_UINT,     &amp;CopyNativeVertexData&lt;GLubyte, 4, 4, 0&gt;);
</del><ins>+        // GL_UNSIGNED_BYTE
+        case gl::VERTEX_FORMAT_UBYTE1_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UINT, &amp;CopyNativeVertexData&lt;GLubyte, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UBYTE2_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UINT, &amp;CopyNativeVertexData&lt;GLubyte, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UBYTE3_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UINT, &amp;CopyNativeVertexData&lt;GLubyte, 3, 4, 1&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UBYTE4_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UINT, &amp;CopyNativeVertexData&lt;GLubyte, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_SHORT
-    AddIntegerVertexFormatInfo(&amp;map, GL_SHORT,          1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16_SINT,          &amp;CopyNativeVertexData&lt;GLshort, 1, 1, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_SHORT,          2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16G16_SINT,       &amp;CopyNativeVertexData&lt;GLshort, 2, 2, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_SHORT,          3, VERTEX_CONVERT_CPU,   DXGI_FORMAT_R16G16B16A16_SINT, &amp;CopyNativeVertexData&lt;GLshort, 3, 4, 1&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_SHORT,          4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16G16B16A16_SINT, &amp;CopyNativeVertexData&lt;GLshort, 4, 4, 0&gt;);
</del><ins>+        // GL_SHORT
+        case gl::VERTEX_FORMAT_SSHORT1_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SINT, &amp;CopyNativeVertexData&lt;GLshort, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SSHORT2_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SINT, &amp;CopyNativeVertexData&lt;GLshort, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SSHORT3_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT, &amp;CopyNativeVertexData&lt;GLshort, 3, 4, 1&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SSHORT4_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SINT, &amp;CopyNativeVertexData&lt;GLshort, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_SHORT
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, 1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16_UINT,          &amp;CopyNativeVertexData&lt;GLushort, 1, 1, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, 2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16G16_UINT,       &amp;CopyNativeVertexData&lt;GLushort, 2, 2, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, 3, VERTEX_CONVERT_CPU,   DXGI_FORMAT_R16G16B16A16_UINT, &amp;CopyNativeVertexData&lt;GLushort, 3, 4, 1&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_SHORT, 4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16G16B16A16_UINT, &amp;CopyNativeVertexData&lt;GLushort, 4, 4, 0&gt;);
</del><ins>+        // GL_UNSIGNED_SHORT
+        case gl::VERTEX_FORMAT_USHORT1_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UINT, &amp;CopyNativeVertexData&lt;GLushort, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_USHORT2_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UINT, &amp;CopyNativeVertexData&lt;GLushort, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_USHORT3_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UINT, &amp;CopyNativeVertexData&lt;GLushort, 3, 4, 1&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_USHORT4_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UINT, &amp;CopyNativeVertexData&lt;GLushort, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_INT
-    AddIntegerVertexFormatInfo(&amp;map, GL_INT,            1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32_SINT,          &amp;CopyNativeVertexData&lt;GLint, 1, 1, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_INT,            2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32_SINT,       &amp;CopyNativeVertexData&lt;GLint, 2, 2, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_INT,            3, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32B32_SINT,    &amp;CopyNativeVertexData&lt;GLint, 3, 3, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_INT,            4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32B32A32_SINT, &amp;CopyNativeVertexData&lt;GLint, 4, 4, 0&gt;);
</del><ins>+        // GL_INT
+        case gl::VERTEX_FORMAT_SINT1_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT, &amp;CopyNativeVertexData&lt;GLint, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SINT2_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT, &amp;CopyNativeVertexData&lt;GLint, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SINT3_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT, &amp;CopyNativeVertexData&lt;GLint, 3, 3, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_SINT4_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT, &amp;CopyNativeVertexData&lt;GLint, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_INT
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32_SINT,          &amp;CopyNativeVertexData&lt;GLuint, 1, 1, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32_SINT,       &amp;CopyNativeVertexData&lt;GLuint, 2, 2, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   3, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32B32_SINT,    &amp;CopyNativeVertexData&lt;GLuint, 3, 3, 0&gt;);
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_INT,   4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32B32A32_SINT, &amp;CopyNativeVertexData&lt;GLuint, 4, 4, 0&gt;);
</del><ins>+        // GL_UNSIGNED_INT
+        case gl::VERTEX_FORMAT_UINT1_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT, &amp;CopyNativeVertexData&lt;GLuint, 1, 1, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UINT2_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT, &amp;CopyNativeVertexData&lt;GLuint, 2, 2, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UINT3_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT, &amp;CopyNativeVertexData&lt;GLuint, 3, 3, 0&gt;);
+            return info;
+        }
+        case gl::VERTEX_FORMAT_UINT4_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT, &amp;CopyNativeVertexData&lt;GLuint, 4, 4, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_INT_2_10_10_10_REV
-    AddIntegerVertexFormatInfo(&amp;map, GL_INT_2_10_10_10_REV, 4, VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT, &amp;CopyXYZ10W2ToXYZW32FVertexData&lt;true, true, false&gt;);
</del><ins>+        // GL_INT_2_10_10_10_REV
+        case gl::VERTEX_FORMAT_SINT210_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT, &amp;CopyXYZ10W2ToXYZW32FVertexData&lt;true, true, false&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    // GL_UNSIGNED_INT_2_10_10_10_REV
-    AddIntegerVertexFormatInfo(&amp;map, GL_UNSIGNED_INT_2_10_10_10_REV, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UINT, &amp;CopyNativeVertexData&lt;GLuint, 1, 1, 0&gt;);
</del><ins>+        // GL_UNSIGNED_INT_2_10_10_10_REV
+        case gl::VERTEX_FORMAT_UINT210_INT:
+        {
+            static const VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UINT, &amp;CopyNativeVertexData&lt;GLuint, 1, 1, 0&gt;);
+            return info;
+        }
</ins><span class="cx"> 
</span><del>-    return map;
-}
-
-const VertexFormat &amp;GetVertexFormatInfo(const gl::VertexFormat &amp;vertexFormat, D3D_FEATURE_LEVEL featureLevel)
-{
-    static const D3D11VertexFormatInfoMap vertexFormatMap = BuildD3D11VertexFormatInfoMap();
-    static const D3D11VertexFormatInfoMap vertexFormatMapFL9_3Override = BuildD3D11_FL9_3VertexFormatInfoOverrideMap();
-
-    if (featureLevel == D3D_FEATURE_LEVEL_9_3)
-    {
-        // First see if the format has a special mapping for FL9_3
-        D3D11VertexFormatInfoMap::const_iterator iter = vertexFormatMapFL9_3Override.find(vertexFormat);
-        if (iter != vertexFormatMapFL9_3Override.end())
</del><ins>+        default:
</ins><span class="cx">         {
</span><del>-            return iter-&gt;second;
</del><ins>+            static const VertexFormat info;
+            return info;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><del>-
-    D3D11VertexFormatInfoMap::const_iterator iter = vertexFormatMap.find(vertexFormat);
-    if (iter != vertexFormatMap.end())
-    {
-        return iter-&gt;second;
-    }
-    else
-    {
-        static const VertexFormat defaultInfo;
-        return defaultInfo;
-    }
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11formatutils11h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/formatutils11.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/formatutils11.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/formatutils11.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,15 +10,16 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_D3D11_FORMATUTILS11_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_D3D11_FORMATUTILS11_H_
</span><span class="cx"> 
</span><del>-#include &quot;libANGLE/renderer/d3d/formatutilsD3D.h&quot;
-#include &quot;libANGLE/angletypes.h&quot;
</del><ins>+#include &lt;map&gt;
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;common/platform.h&quot;
</span><ins>+#include &quot;libANGLE/angletypes.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/renderer/d3d/formatutilsD3D.h&quot;
</ins><span class="cx"> 
</span><del>-#include &lt;map&gt;
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+struct Renderer11DeviceCaps;
</ins><span class="cx"> 
</span><span class="cx"> namespace d3d11
</span><span class="cx"> {
</span><span class="lines">@@ -30,10 +31,6 @@
</span><span class="cx"> {
</span><span class="cx">     DXGIFormat();
</span><span class="cx"> 
</span><del>-    GLuint pixelBytes;
-    GLuint blockWidth;
-    GLuint blockHeight;
-
</del><span class="cx">     GLuint redBits;
</span><span class="cx">     GLuint greenBits;
</span><span class="cx">     GLuint blueBits;
</span><span class="lines">@@ -41,57 +38,49 @@
</span><span class="cx">     GLuint sharedBits;
</span><span class="cx"> 
</span><span class="cx">     GLuint depthBits;
</span><del>-    GLuint depthOffset;
</del><span class="cx">     GLuint stencilBits;
</span><del>-    GLuint stencilOffset;
</del><span class="cx"> 
</span><del>-    GLenum internalFormat;
</del><span class="cx">     GLenum componentType;
</span><span class="cx"> 
</span><del>-    MipGenerationFunction mipGenerationFunction;
-    ColorReadFunction colorReadFunction;
-
</del><span class="cx">     FastCopyFunctionMap fastCopyFunctions;
</span><span class="cx"> 
</span><span class="cx">     NativeMipmapGenerationSupportFunction nativeMipmapSupport;
</span><span class="cx"> 
</span><span class="cx">     ColorCopyFunction getFastCopyFunction(GLenum format, GLenum type) const;
</span><span class="cx"> };
</span><ins>+
+// This structure is problematic because a resource is associated with multiple DXGI formats.
+// For example, a texture might be stored as DXGI_FORMAT_R16_TYPELESS but store integer components,
+// which are accessed through an DXGI_FORMAT_R16_SINT view. It's easy to write code which queries
+// information about the wrong format. Therefore, use of this should be avoided where possible.
</ins><span class="cx"> const DXGIFormat &amp;GetDXGIFormatInfo(DXGI_FORMAT format);
</span><span class="cx"> 
</span><del>-struct TextureFormat
</del><ins>+struct DXGIFormatSize
</ins><span class="cx"> {
</span><del>-    TextureFormat();
</del><ins>+    DXGIFormatSize(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight);
</ins><span class="cx"> 
</span><del>-    DXGI_FORMAT texFormat;
-    DXGI_FORMAT srvFormat;
-    DXGI_FORMAT rtvFormat;
-    DXGI_FORMAT dsvFormat;
-    DXGI_FORMAT renderFormat;
-
-    DXGI_FORMAT swizzleTexFormat;
-    DXGI_FORMAT swizzleSRVFormat;
-    DXGI_FORMAT swizzleRTVFormat;
-
-    InitializeTextureDataFunction dataInitializerFunction;
-
-    typedef std::map&lt;GLenum, LoadImageFunction&gt; LoadFunctionMap;
-    LoadFunctionMap loadFunctions;
</del><ins>+    GLuint pixelBytes;
+    GLuint blockWidth;
+    GLuint blockHeight;
</ins><span class="cx"> };
</span><del>-const TextureFormat &amp;GetTextureFormatInfo(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel);
</del><ins>+const DXGIFormatSize &amp;GetDXGIFormatSizeInfo(DXGI_FORMAT format);
</ins><span class="cx"> 
</span><span class="cx"> struct VertexFormat
</span><span class="cx"> {
</span><span class="cx">     VertexFormat();
</span><ins>+    VertexFormat(VertexConversionType conversionType,
+                 DXGI_FORMAT nativeFormat,
+                 VertexCopyFunction copyFunction);
</ins><span class="cx"> 
</span><span class="cx">     VertexConversionType conversionType;
</span><span class="cx">     DXGI_FORMAT nativeFormat;
</span><span class="cx">     VertexCopyFunction copyFunction;
</span><span class="cx"> };
</span><del>-const VertexFormat &amp;GetVertexFormatInfo(const gl::VertexFormat &amp;vertexFormat, D3D_FEATURE_LEVEL featureLevel);
</del><ins>+const VertexFormat &amp;GetVertexFormatInfo(gl::VertexFormatType vertexFormatType,
+                                        D3D_FEATURE_LEVEL featureLevel);
</ins><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace d3d11
</ins><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_D3D11_FORMATUTILS11_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11gen_dxgi_support_tablespy"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,243 @@
</span><ins>+#!/usr/bin/python
+# Copyright 2015 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# gen_dxgi_support_tables.py:
+#  Code generation for the DXGI support tables. Determines which formats
+#  are natively support in D3D10+.
+#
+# MSDN links:
+#  10_0: https://msdn.microsoft.com/en-us/library/windows/desktop/cc627090.aspx
+#  10_1: https://msdn.microsoft.com/en-us/library/windows/desktop/cc627091.aspx
+#  11_0: https://msdn.microsoft.com/en-us/library/windows/desktop/ff471325.aspx
+#  11_1: https://msdn.microsoft.com/en-us/library/windows/desktop/hh404483.aspx
+
+import sys
+import json
+
+macro_prefix = 'F_'
+
+template = &quot;&quot;&quot;// GENERATED FILE - DO NOT EDIT. See dxgi_support_data.json.
+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// dxgi_support_table:
+//   Queries for DXGI support of various texture formats. Depends on DXGI
+//   version, D3D feature level, and is sometimes guaranteed or optional.
+//
+
+#include &quot;libANGLE/renderer/d3d/d3d11/dxgi_support_table.h&quot;
+
+#include &quot;common/debug.h&quot;
+
+namespace rx
+{{
+
+namespace d3d11
+{{
+
+#define {prefix}2D D3D11_FORMAT_SUPPORT_TEXTURE2D
+#define {prefix}3D D3D11_FORMAT_SUPPORT_TEXTURE3D
+#define {prefix}CUBE D3D11_FORMAT_SUPPORT_TEXTURECUBE
+#define {prefix}SAMPLE D3D11_FORMAT_SUPPORT_SHADER_SAMPLE
+#define {prefix}RT D3D11_FORMAT_SUPPORT_RENDER_TARGET
+#define {prefix}MS D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET
+#define {prefix}DS D3D11_FORMAT_SUPPORT_DEPTH_STENCIL
+
+namespace
+{{
+
+const DXGISupport &amp;GetDefaultSupport()
+{{
+    static UINT AllSupportFlags = D3D11_FORMAT_SUPPORT_TEXTURE2D |
+                                  D3D11_FORMAT_SUPPORT_TEXTURE3D |
+                                  D3D11_FORMAT_SUPPORT_TEXTURECUBE |
+                                  D3D11_FORMAT_SUPPORT_SHADER_SAMPLE |
+                                  D3D11_FORMAT_SUPPORT_RENDER_TARGET |
+                                  D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET |
+                                  D3D11_FORMAT_SUPPORT_DEPTH_STENCIL;
+    static const DXGISupport defaultSupport(0, 0, AllSupportFlags);
+    return defaultSupport;
+}}
+
+const DXGISupport &amp;GetDXGISupport_10_0(DXGI_FORMAT dxgiFormat)
+{{
+    switch (dxgiFormat)
+    {{
+{table_data_10_0}
+        default:
+            UNREACHABLE();
+            return GetDefaultSupport();
+    }}
+}}
+
+const DXGISupport &amp;GetDXGISupport_10_1(DXGI_FORMAT dxgiFormat)
+{{
+    switch (dxgiFormat)
+    {{
+{table_data_10_1}
+        default:
+            UNREACHABLE();
+            return GetDefaultSupport();
+    }}
+}}
+
+const DXGISupport &amp;GetDXGISupport_11_0(DXGI_FORMAT dxgiFormat)
+{{
+    switch (dxgiFormat)
+    {{
+{table_data_11_0}
+        default:
+            UNREACHABLE();
+            return GetDefaultSupport();
+    }}
+}}
+
+}}
+
+#undef {prefix}2D
+#undef {prefix}3D
+#undef {prefix}CUBE
+#undef {prefix}SAMPLE
+#undef {prefix}RT
+#undef {prefix}MS
+#undef {prefix}DS
+
+const DXGISupport &amp;GetDXGISupport(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel)
+{{
+    switch (featureLevel)
+    {{
+        case D3D_FEATURE_LEVEL_10_0:
+            return GetDXGISupport_10_0(dxgiFormat);
+        case D3D_FEATURE_LEVEL_10_1:
+            return GetDXGISupport_10_1(dxgiFormat);
+        case D3D_FEATURE_LEVEL_11_0:
+            return GetDXGISupport_11_0(dxgiFormat);
+        default:
+            return GetDefaultSupport();
+    }}
+}}
+
+}} // namespace d3d11
+
+}} // namespace rx
+&quot;&quot;&quot;
+
+table_init = &quot;&quot;
+
+def do_format(format_data):
+    table_data = {'10_0': '', '10_1': '', '11_0': ''}
+
+    json_flag_to_d3d = {
+        'texture2D': macro_prefix + '2D',
+        'texture3D': macro_prefix + '3D',
+        'textureCube': macro_prefix + 'CUBE',
+        'shaderSample': macro_prefix + 'SAMPLE',
+        'renderTarget': macro_prefix + 'RT',
+        'multisampleRT': macro_prefix + 'MS',
+        'depthStencil': macro_prefix + 'DS'
+    }
+
+    for format_name, format_support in sorted(format_data.iteritems()):
+
+        always_supported = set()
+        never_supported = set()
+        optionally_supported = set()
+        fl_10_1_supported = set()
+        fl_11_0_supported = set()
+        fl_11_0_check = set()
+        fl_10_0_check_10_1_supported = set()
+        fl_10_0_check_11_0_supported = set()
+
+        for json_flag, support in format_support.iteritems():
+
+            d3d_flag = [json_flag_to_d3d[json_flag]]
+
+            if support == 'check':
+                optionally_supported.update(d3d_flag)
+            elif support == 'always':
+                always_supported.update(d3d_flag)
+            elif support == 'never':
+                never_supported.update(d3d_flag)
+            elif support == '10_0':
+                # TODO(jmadill): FL 9_3 handling
+                always_supported.update(d3d_flag)
+            elif support == '10_1':
+                fl_10_1_supported.update(d3d_flag)
+            elif support == '11_0':
+                fl_11_0_supported.update(d3d_flag)
+            elif support == '11_1':
+                # TODO(jmadill): D3D 11.1 handling
+                never_supported.update(d3d_flag)
+            elif support == 'dxgi1_2':
+                # TODO(jmadill): DXGI 1.2 handling.
+                always_supported.update(d3d_flag)
+            elif support == '10_0check10_1always':
+                fl_10_0_check_10_1_supported.update(d3d_flag)
+            elif support == '10_0check11_0always':
+                fl_10_0_check_11_0_supported.update(d3d_flag)
+            elif support == '11_0check':
+                fl_11_0_check.update(d3d_flag)
+            else:
+                print(&quot;Data specification error: &quot; + support)
+                sys.exit(1)
+
+        for feature_level in ['10_0', '10_1', '11_0']:
+            always_for_fl = always_supported
+            optional_for_fl = optionally_supported
+            if feature_level == '10_0':
+                optional_for_fl = fl_10_0_check_10_1_supported.union(optional_for_fl)
+                optional_for_fl = fl_10_0_check_11_0_supported.union(optional_for_fl)
+            if feature_level == '10_1':
+                always_for_fl = fl_10_1_supported.union(always_for_fl)
+                always_for_fl = fl_10_0_check_10_1_supported.union(always_for_fl)
+                optional_for_fl = fl_10_0_check_11_0_supported.union(optional_for_fl)
+            elif feature_level == '11_0':
+                always_for_fl = fl_10_0_check_10_1_supported.union(always_for_fl)
+                always_for_fl = fl_10_0_check_11_0_supported.union(always_for_fl)
+                always_for_fl = fl_10_1_supported.union(always_for_fl)
+                always_for_fl = fl_11_0_supported.union(always_for_fl)
+
+            always = ' | '.join(sorted(always_for_fl))
+            never = ' | '.join(sorted(never_supported))
+            optional = ' | '.join(sorted(optional_for_fl))
+
+            if not always: always = '0'
+            if not never: never = '0'
+            if not optional: optional = '0'
+
+            table_data[feature_level] += '        case ' + format_name + ':\n'
+            table_data[feature_level] += '        {\n'
+            table_data[feature_level] += '            static const DXGISupport info(' + always + ', ' + never + ', ' + optional + ');\n'
+            table_data[feature_level] += '            return info;\n'
+            table_data[feature_level] += '        }\n'
+
+    return table_data
+
+def join_table_data(table_data_1, table_data_2):
+    return {'10_0': table_data_1['10_0'] + table_data_2['10_0'],
+            '10_1': table_data_1['10_1'] + table_data_2['10_1'],
+            '11_0': table_data_1['11_0'] + table_data_2['11_0']}
+
+with open('dxgi_support_data.json') as dxgi_file:
+    file_data = dxgi_file.read()
+    dxgi_file.close()
+    json_data = json.loads(file_data)
+
+    table_data = {'10_0': '', '10_1': '', '11_0': ''}
+
+    for format_data in json_data:
+        table_data = join_table_data(table_data, do_format(format_data))
+
+    out_data = template.format(prefix=macro_prefix,
+                               table_data_10_0=table_data['10_0'],
+                               table_data_10_1=table_data['10_1'],
+                               table_data_11_0=table_data['11_0'])
+
+    with open('dxgi_support_table.cpp', 'wt') as out_file:
+        out_file.write(out_data)
+        out_file.close()
+
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11gen_load_functions_tablepy"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_load_functions_table.py (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_load_functions_table.py                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_load_functions_table.py        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,199 @@
</span><ins>+#!/usr/bin/python
+# Copyright 2015 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# gen_load_functions_table.py:
+#  Code generation for the load function tables used for texture formats
+#
+
+import json
+
+template = &quot;&quot;&quot;// GENERATED FILE - DO NOT EDIT.
+// Generated by gen_load_functions_table.py using data from load_functions_data.json
+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// load_functions_table:
+//   Contains the GetLoadFunctionsMap for texture_format_util.h
+//
+
+#include &quot;libANGLE/renderer/d3d/d3d11/load_functions_table.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
+#include &quot;libANGLE/renderer/d3d/loadimage.h&quot;
+#include &quot;libANGLE/renderer/d3d/loadimage_etc.h&quot;
+
+namespace rx
+{{
+
+namespace d3d11
+{{
+
+namespace
+{{
+
+// ES3 image loading functions vary based on:
+//    - the GL internal format (supplied to glTex*Image*D)
+//    - the GL data type given (supplied to glTex*Image*D)
+//    - the target DXGI_FORMAT that the image will be loaded into (which is chosen based on the D3D
+//    device's capabilities)
+// This map type determines which loading function to use, based on these three parameters.
+// Source formats and types are taken from Tables 3.2 and 3.3 of the ES 3 spec.
+void UnimplementedLoadFunction(size_t width,
+                               size_t height,
+                               size_t depth,
+                               const uint8_t *input,
+                               size_t inputRowPitch,
+                               size_t inputDepthPitch,
+                               uint8_t *output,
+                               size_t outputRowPitch,
+                               size_t outputDepthPitch)
+{{
+    UNIMPLEMENTED();
+}}
+
+void UnreachableLoadFunction(size_t width,
+                             size_t height,
+                             size_t depth,
+                             const uint8_t *input,
+                             size_t inputRowPitch,
+                             size_t inputDepthPitch,
+                             uint8_t *output,
+                             size_t outputRowPitch,
+                             size_t outputDepthPitch)
+{{
+    UNREACHABLE();
+}}
+
+}}  // namespace
+
+// TODO we can replace these maps with more generated code
+const std::map&lt;GLenum, LoadImageFunctionInfo&gt; &amp;GetLoadFunctionsMap(GLenum {internal_format},
+                                                                   DXGI_FORMAT {dxgi_format})
+{{
+    // clang-format off
+    switch ({internal_format})
+    {{
+{data}
+        default:
+        {{
+            static std::map&lt;GLenum, LoadImageFunctionInfo&gt; emptyLoadFunctionsMap;
+            return emptyLoadFunctionsMap;
+        }}
+    }}
+    // clang-format on
+
+}}  // GetLoadFunctionsMap
+
+}}  // namespace d3d11
+
+}}  // namespace rx
+&quot;&quot;&quot;
+
+internal_format_param = 'internalFormat'
+dxgi_format_param = 'dxgiFormat'
+dxgi_format_unknown = &quot;DXGI_FORMAT_UNKNOWN&quot;
+
+def get_function_maps_string(typestr, function, requiresConversion):
+    return '                        loadMap[' + typestr + '] = LoadImageFunctionInfo(' + function + ', ' + requiresConversion + ');\n'
+
+def get_unknown_format_string(dxgi_to_type_map, dxgi_unknown_string):
+     if dxgi_unknown_string not in dxgi_to_type_map:
+        return ''
+
+     table_data = ''
+
+     for unknown_type_function in dxgi_to_type_map[dxgi_unknown_string]:
+        table_data += get_function_maps_string(unknown_type_function['type'], unknown_type_function['loadFunction'], 'true')
+
+     return table_data
+
+# Making map from dxgi to type map for a particular internalFormat
+def create_dxgi_to_type_map(dst, json_data, internal_format_str):
+    for type_item in sorted(json_data[internal_format_str].iteritems()):
+        for entry_in_type_item in type_item[1]:
+            dxgi_format_str = entry_in_type_item['dxgiFormat']
+
+            if dxgi_format_str not in dst:
+                dst[dxgi_format_str] = []
+
+            type_dxgi_load_function = entry_in_type_item.copy();
+            type_dxgi_load_function['type'] = type_item[0]
+            dst[dxgi_format_str].append(type_dxgi_load_function)
+
+def get_load_function_map_snippet(insert_map_string):
+    load_function_map_snippet = ''
+    load_function_map_snippet += '                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {\n'
+    load_function_map_snippet += '                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;\n'
+    load_function_map_snippet += insert_map_string
+    load_function_map_snippet += '                        return loadMap;\n'
+    load_function_map_snippet += '                    }();\n\n'
+    load_function_map_snippet += '                    return loadFunctionsMap;\n'
+
+    return load_function_map_snippet
+
+def parse_json_into_switch_string(json_data):
+    table_data = ''
+    for internal_format_item in sorted(json_data.iteritems()):
+        internal_format_str = internal_format_item[0]
+        table_data += '        case ' + internal_format_str + ':\n'
+        table_data += '        {\n'
+        table_data += '            switch (' + dxgi_format_param + ')\n'
+        table_data += '            {\n'
+
+        dxgi_to_type_map = {};
+        create_dxgi_to_type_map(dxgi_to_type_map, json_data, internal_format_str)
+
+        dxgi_unknown_str = get_unknown_format_string(dxgi_to_type_map, dxgi_format_unknown);
+
+        for dxgi_format_item in sorted(dxgi_to_type_map.iteritems()):
+            dxgi_format_str = dxgi_format_item[0]
+
+            # Main case statements
+            table_data += '                case ' + dxgi_format_str + ':\n'
+            table_data += '                {\n'
+            insert_map_string = ''
+            types_already_in_loadmap = set()
+            for type_function in sorted(dxgi_format_item[1]):
+                insert_map_string += get_function_maps_string(type_function['type'], type_function['loadFunction'], type_function['requiresConversion'])
+                types_already_in_loadmap.add(type_function['type'])
+
+            # DXGI_FORMAT_UNKNOWN add ons
+            if dxgi_format_unknown in dxgi_to_type_map:
+                for unknown_type_function in dxgi_to_type_map[dxgi_format_unknown]:
+                    # Check that it's not already in the loadmap so it doesn't override the value
+                    if unknown_type_function['type'] not in types_already_in_loadmap:
+                        insert_map_string += get_function_maps_string(unknown_type_function['type'], unknown_type_function['loadFunction'], 'true')
+
+            table_data += get_load_function_map_snippet(insert_map_string)
+            table_data += '                }\n'
+
+        table_data += '                default:\n'
+
+        if dxgi_unknown_str:
+            table_data += '                {\n'
+            table_data += get_load_function_map_snippet(dxgi_unknown_str)
+            table_data += '                }\n'
+        else:
+            table_data += '                    break;\n'
+        table_data += '            }\n'
+        table_data += '        }\n'
+
+    return table_data
+
+with open('load_functions_data.json') as functions_json_file:
+    functions_data = functions_json_file.read();
+    functions_json_file.close()
+    json_data = json.loads(functions_data)
+
+    table_data = parse_json_into_switch_string(json_data)
+    output = template.format(internal_format = internal_format_param,
+                             dxgi_format = dxgi_format_param,
+                             data=table_data)
+
+    with open('load_functions_table_autogen.cpp', 'wt') as out_file:
+        out_file.write(output)
+        out_file.close()
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11gen_texture_format_tablepy"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,525 @@
</span><ins>+#!/usr/bin/python
+# Copyright 2015 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# gen_texture_format_table.py:
+#  Code generation for texture format map
+#
+
+import json
+import math
+import pprint
+import re
+
+template_texture_format_table_autogen_h = &quot;&quot;&quot;// GENERATED FILE - DO NOT EDIT.
+// Generated by gen_texture_format_table.py using data from texture_format_data.json
+//
+// Copyright 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+namespace rx
+{{
+
+namespace d3d11
+{{
+
+enum ANGLEFormat
+{{
+{angle_format_enum}
+}};
+
+}}  // namespace d3d11
+
+}}  // namespace rx
+&quot;&quot;&quot;
+
+template_texture_format_table_autogen_cpp = &quot;&quot;&quot;// GENERATED FILE - DO NOT EDIT.
+// Generated by gen_texture_format_table.py using data from texture_format_data.json
+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// texture_format_table:
+//   Queries for full textureFormat information based in internalFormat
+//
+
+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
+
+#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/load_functions_table.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
+#include &quot;libANGLE/renderer/d3d/copyimage.h&quot;
+#include &quot;libANGLE/renderer/d3d/generatemip.h&quot;
+#include &quot;libANGLE/renderer/d3d/loadimage.h&quot;
+
+namespace rx
+{{
+
+namespace d3d11
+{{
+
+namespace
+{{
+
+typedef bool (*FormatSupportFunction)(const Renderer11DeviceCaps &amp;);
+
+bool OnlyFL10Plus(const Renderer11DeviceCaps &amp;deviceCaps)
+{{
+    return (deviceCaps.featureLevel &gt;= D3D_FEATURE_LEVEL_10_0);
+}}
+
+bool OnlyFL9_3(const Renderer11DeviceCaps &amp;deviceCaps)
+{{
+    return (deviceCaps.featureLevel == D3D_FEATURE_LEVEL_9_3);
+}}
+
+template &lt;DXGI_FORMAT format, bool requireSupport&gt;
+bool SupportsFormat(const Renderer11DeviceCaps &amp;deviceCaps)
+{{
+    // Must support texture, SRV and RTV support
+    UINT mustSupport = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURECUBE |
+                       D3D11_FORMAT_SUPPORT_SHADER_SAMPLE | D3D11_FORMAT_SUPPORT_MIP |
+                       D3D11_FORMAT_SUPPORT_RENDER_TARGET;
+
+    if (d3d11_gl::GetMaximumClientVersion(deviceCaps.featureLevel) &gt; 2)
+    {{
+        mustSupport |= D3D11_FORMAT_SUPPORT_TEXTURE3D;
+    }}
+
+    bool fullSupport = false;
+    if (format == DXGI_FORMAT_B5G6R5_UNORM)
+    {{
+        // All hardware that supports DXGI_FORMAT_B5G6R5_UNORM should support autogen mipmaps, but
+        // check anyway.
+        mustSupport |= D3D11_FORMAT_SUPPORT_MIP_AUTOGEN;
+        fullSupport = ((deviceCaps.B5G6R5support &amp; mustSupport) == mustSupport);
+    }}
+    else if (format == DXGI_FORMAT_B4G4R4A4_UNORM)
+    {{
+        fullSupport = ((deviceCaps.B4G4R4A4support &amp; mustSupport) == mustSupport);
+    }}
+    else if (format == DXGI_FORMAT_B5G5R5A1_UNORM)
+    {{
+        fullSupport = ((deviceCaps.B5G5R5A1support &amp; mustSupport) == mustSupport);
+    }}
+    else
+    {{
+        UNREACHABLE();
+        return false;
+    }}
+
+    // This 'SupportsFormat' function is used by individual entries in the D3D11 Format Map below,
+    // which maps GL formats to DXGI formats.
+    if (requireSupport)
+    {{
+        // This means that ANGLE would like to use the entry in the map if the inputted DXGI format
+        // *IS* supported.
+        // e.g. the entry might map GL_RGB5_A1 to DXGI_FORMAT_B5G5R5A1, which should only be used if
+        // DXGI_FORMAT_B5G5R5A1 is supported.
+        // In this case, we should only return 'true' if the format *IS* supported.
+        return fullSupport;
+    }}
+    else
+    {{
+        // This means that ANGLE would like to use the entry in the map if the inputted DXGI format
+        // *ISN'T* supported.
+        // This might be a fallback entry. e.g. for ANGLE to use DXGI_FORMAT_R8G8B8A8_UNORM if
+        // DXGI_FORMAT_B5G5R5A1 isn't supported.
+        // In this case, we should only return 'true' if the format *ISN'T* supported.
+        return !fullSupport;
+    }}
+}}
+
+// End Format Support Functions
+}}  // namespace
+
+ANGLEFormatSet::ANGLEFormatSet()
+    : format(ANGLE_FORMAT_NONE),
+      glInternalFormat(GL_NONE),
+      texFormat(DXGI_FORMAT_UNKNOWN),
+      srvFormat(DXGI_FORMAT_UNKNOWN),
+      rtvFormat(DXGI_FORMAT_UNKNOWN),
+      dsvFormat(DXGI_FORMAT_UNKNOWN),
+      blitSRVFormat(DXGI_FORMAT_UNKNOWN),
+      swizzleFormat(ANGLE_FORMAT_NONE),
+      mipGenerationFunction(nullptr),
+      colorReadFunction(nullptr)
+{{
+}}
+
+// For sized GL internal formats, there are several possible corresponding D3D11 formats depending
+// on device capabilities.
+// This function allows querying for the DXGI texture formats to use for textures, SRVs, RTVs and
+// DSVs given a GL internal format.
+TextureFormat::TextureFormat(GLenum internalFormat,
+                             const ANGLEFormat angleFormat,
+                             InitializeTextureDataFunction internalFormatInitializer)
+    : dataInitializerFunction(internalFormatInitializer)
+{{
+    formatSet        = &amp;GetANGLEFormatSet(angleFormat);
+    swizzleFormatSet = &amp;GetANGLEFormatSet(formatSet-&gt;swizzleFormat);
+
+    // Gather all the load functions for this internal format
+    loadFunctions = GetLoadFunctionsMap(internalFormat, formatSet-&gt;texFormat);
+
+    ASSERT(loadFunctions.size() != 0 || internalFormat == GL_NONE);
+}}
+
+ANGLEFormatSet::ANGLEFormatSet(ANGLEFormat format,
+                               GLenum glInternalFormat,
+                               DXGI_FORMAT texFormat,
+                               DXGI_FORMAT srvFormat,
+                               DXGI_FORMAT rtvFormat,
+                               DXGI_FORMAT dsvFormat,
+                               DXGI_FORMAT blitSRVFormat,
+                               ANGLEFormat swizzleFormat,
+                               MipGenerationFunction mipGenerationFunction,
+                               ColorReadFunction colorReadFunction)
+    : format(format),
+      glInternalFormat(glInternalFormat),
+      texFormat(texFormat),
+      srvFormat(srvFormat),
+      rtvFormat(rtvFormat),
+      dsvFormat(dsvFormat),
+      blitSRVFormat(blitSRVFormat),
+      swizzleFormat(swizzleFormat),
+      mipGenerationFunction(mipGenerationFunction),
+      colorReadFunction(colorReadFunction)
+{{
+}}
+
+const ANGLEFormatSet &amp;GetANGLEFormatSet(ANGLEFormat angleFormat)
+{{
+    // clang-format off
+    switch (angleFormat)
+    {{
+{angle_format_info_cases}
+        default:
+            break;
+    }}
+    // clang-format on
+
+    UNREACHABLE();
+    static const ANGLEFormatSet defaultInfo;
+    return defaultInfo;
+}}
+
+const TextureFormat &amp;GetTextureFormatInfo(GLenum internalFormat,
+                                          const Renderer11DeviceCaps &amp;renderer11DeviceCaps)
+{{
+    // clang-format off
+    switch (internalFormat)
+    {{
+{texture_format_info_cases}
+        default:
+            break;
+    }}
+    // clang-format on
+
+    static const TextureFormat defaultInfo(GL_NONE, ANGLE_FORMAT_NONE, nullptr);
+    return defaultInfo;
+}}  // GetTextureFormatInfo
+
+}}  // namespace d3d11
+
+}}  // namespace rx
+&quot;&quot;&quot;
+
+# TODO(oetuaho): Expand this code so that it could generate the gl format info tables as well.
+def gl_format_channels(internal_format):
+    if internal_format == 'GL_BGR5_A1_ANGLEX':
+        return 'bgra'
+    if internal_format == 'GL_R11F_G11F_B10F':
+        return 'rgb'
+    if internal_format == 'GL_RGB5_A1':
+        return 'rgba'
+    if internal_format.find('GL_RGB10_A2') == 0:
+        return 'rgba'
+
+    channels_pattern = re.compile('GL_(COMPRESSED_)?(SIGNED_)?(ETC\d_)?([A-Z]+)')
+    match = re.search(channels_pattern, internal_format)
+    channels_string = match.group(4)
+
+    if channels_string == 'ALPHA':
+        return 'a'
+    if channels_string == 'LUMINANCE':
+        if (internal_format.find('ALPHA') &gt;= 0):
+            return 'la'
+        return 'l'
+    if channels_string == 'SRGB':
+        if (internal_format.find('ALPHA') &gt;= 0):
+            return 'rgba'
+        return 'rgb'
+    if channels_string == 'DEPTH':
+        if (internal_format.find('STENCIL') &gt;= 0):
+            return 'ds'
+        return 'd'
+    if channels_string == 'STENCIL':
+        return 's'
+    return channels_string.lower()
+
+def get_internal_format_initializer(internal_format, angle_format):
+    internal_format_initializer = 'nullptr'
+    gl_channels = gl_format_channels(internal_format)
+    gl_format_no_alpha = gl_channels == 'rgb' or gl_channels == 'l'
+    if gl_format_no_alpha and angle_format['channels'] == 'rgba':
+        if angle_format['texFormat'] == 'DXGI_FORMAT_BC1_UNORM':
+            # BC1 is a special case since the texture data determines whether each block has an alpha channel or not.
+            # This if statement is hit by COMPRESSED_RGB_S3TC_DXT1, which is a bit of a mess.
+            # TODO(oetuaho): Look into whether COMPRESSED_RGB_S3TC_DXT1 works right in general.
+            # Reference: https://www.opengl.org/registry/specs/EXT/texture_compression_s3tc.txt
+            pass
+        elif 'componentType' not in angle_format:
+            raise ValueError('warning: internal format initializer could not be generated and may be needed for ' + internal_format)
+        elif angle_format['componentType'] == 'uint' and angle_format['bits']['red'] == 8:
+            internal_format_initializer = 'Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0x01&gt;'
+        elif angle_format['componentType'] == 'unorm' and angle_format['bits']['red'] == 8:
+            internal_format_initializer = 'Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;'
+        elif angle_format['componentType'] == 'int' and angle_format['bits']['red'] == 8:
+            internal_format_initializer = 'Initialize4ComponentData&lt;GLbyte, 0x00, 0x00, 0x00, 0x01&gt;'
+        elif angle_format['componentType'] == 'snorm' and angle_format['bits']['red'] == 8:
+            internal_format_initializer = 'Initialize4ComponentData&lt;GLbyte, 0x00, 0x00, 0x00, 0x7F&gt;'
+        elif angle_format['componentType'] == 'float' and angle_format['bits']['red'] == 16:
+            internal_format_initializer = 'Initialize4ComponentData&lt;GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One&gt;'
+        elif angle_format['componentType'] == 'uint' and angle_format['bits']['red'] == 16:
+            internal_format_initializer = 'Initialize4ComponentData&lt;GLushort, 0x0000, 0x0000, 0x0000, 0x0001&gt;'
+        elif angle_format['componentType'] == 'int' and angle_format['bits']['red'] == 16:
+            internal_format_initializer = 'Initialize4ComponentData&lt;GLshort, 0x0000, 0x0000, 0x0000, 0x0001&gt;'
+        elif angle_format['componentType'] == 'float' and angle_format['bits']['red'] == 32:
+            internal_format_initializer = 'Initialize4ComponentData&lt;GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One&gt;'
+        elif angle_format['componentType'] == 'int' and angle_format['bits']['red'] == 32:
+            internal_format_initializer = 'Initialize4ComponentData&lt;GLint, 0x00000000, 0x00000000, 0x00000000, 0x00000001&gt;'
+        elif angle_format['componentType'] == 'uint' and angle_format['bits']['red'] == 32:
+            internal_format_initializer = 'Initialize4ComponentData&lt;GLuint, 0x00000000, 0x00000000, 0x00000000, 0x00000001&gt;'
+        else:
+            raise ValueError('warning: internal format initializer could not be generated and may be needed for ' + internal_format)
+
+    return internal_format_initializer
+
+def get_swizzle_format_id(angle_format_id, angle_format):
+    if angle_format_id == 'ANGLE_FORMAT_NONE':
+        return 'ANGLE_FORMAT_NONE'
+    elif 'swizzleFormat' in angle_format:
+        # For some special formats like compressed formats that don't have a clearly defined number
+        # of bits per channel, swizzle format needs to be specified manually.
+        return angle_format['swizzleFormat']
+
+    if 'bits' not in angle_format:
+        raise ValueError('no bits information for determining swizzleformat for format: ' + angle_format_id)
+
+    bits = angle_format['bits']
+    max_component_bits = max(bits.itervalues())
+    channels_different = not all([component_bits == bits.itervalues().next() for component_bits in bits.itervalues()])
+
+    # The format itself can be used for swizzles if it can be accessed as a render target and
+    # sampled and the bit count for all 4 channels is the same.
+    if &quot;rtvFormat&quot; in angle_format and &quot;srvFormat&quot; in angle_format and not channels_different and len(angle_format['channels']) == 4:
+        return angle_format_id
+
+    b = int(math.ceil(float(max_component_bits) / 8) * 8)
+
+    # Depth formats need special handling, since combined depth/stencil formats don't have a clearly
+    # defined component type.
+    if angle_format['channels'].find('d') &gt;= 0:
+        if b == 24 or b == 32:
+            return 'ANGLE_FORMAT_R32G32B32A32_FLOAT'
+        if b == 16:
+            return 'ANGLE_FORMAT_R16G16B16A16_UNORM'
+
+    if b == 24:
+        raise ValueError('unexpected 24-bit format when determining swizzleformat for format: ' + angle_format_id)
+
+    if 'componentType' not in angle_format:
+        raise ValueError('no component type information for determining swizzleformat for format: ' + angle_format_id)
+
+    component_type = angle_format['componentType']
+    if component_type == 'uint':
+        return 'ANGLE_FORMAT_R{}G{}B{}A{}_UINT'.format(b, b, b, b)
+    elif component_type == 'int':
+        return 'ANGLE_FORMAT_R{}G{}B{}A{}_SINT'.format(b, b, b, b)
+    elif component_type == 'unorm':
+        return 'ANGLE_FORMAT_R{}G{}B{}A{}_UNORM'.format(b, b, b, b)
+    elif component_type == 'snorm':
+        return 'ANGLE_FORMAT_R{}G{}B{}A{}_SNORM'.format(b, b, b, b)
+    elif component_type == 'float':
+        return 'ANGLE_FORMAT_R{}G{}B{}A{}_FLOAT'.format(b, b, b, b)
+    else:
+        raise ValueError('could not determine swizzleformat based on componentType for format: ' + angle_format_id)
+
+def get_texture_format_item(idx, internal_format, requirements_fn, angle_format_id, angle_format):
+    table_data = '';
+
+    internal_format_initializer = get_internal_format_initializer(internal_format, angle_format)
+
+    indent = '            '
+    if requirements_fn != None:
+        if idx == 0:
+            table_data += '            if (' + requirements_fn + '(renderer11DeviceCaps))\n'
+        else:
+            table_data += '            else if (' + requirements_fn + '(renderer11DeviceCaps))\n'
+        table_data += '            {\n'
+        indent += '    '
+
+    table_data += indent + 'static const TextureFormat textureFormat(internalFormat,\n'
+    table_data += indent + '                                         ' + angle_format_id + ',\n'
+    table_data += indent + '                                         ' + internal_format_initializer + ');\n'
+    table_data += indent + 'return textureFormat;\n'
+
+    if requirements_fn != None:
+        table_data += '            }\n'
+
+    return table_data
+
+def parse_json_into_switch_texture_format_string(json_map, json_data):
+    table_data = ''
+    angle_format_map = {}
+
+    for internal_format_item in sorted(json_map.iteritems()):
+        internal_format = internal_format_item[0]
+        table_data += '        case ' + internal_format + ':\n'
+        table_data += '        {\n'
+
+        if isinstance(json_map[internal_format], basestring):
+            angle_format_id = json_map[internal_format]
+            table_data += get_texture_format_item(0, internal_format, None, angle_format_id, json_data[angle_format_id])
+        else:
+            for idx, requirements_map in enumerate(sorted(json_map[internal_format].iteritems())):
+                angle_format_id = requirements_map[1]
+                table_data += get_texture_format_item(idx, internal_format, requirements_map[0], angle_format_id, json_data[angle_format_id])
+            table_data += '            else\n'
+            table_data += '            {\n'
+            table_data += '                break;\n'
+            table_data += '            }\n'
+
+        table_data += '        }\n'
+
+    return table_data
+
+def get_channel_struct(angle_format):
+    if 'bits' not in angle_format:
+        return None
+    bits = angle_format['bits']
+    if 'depth' in bits or 'stencil' in bits:
+        return None
+
+    if 'channelStruct' in angle_format:
+        return angle_format['channelStruct']
+
+    struct_name = ''
+    for channel in angle_format['channels']:
+        if channel == 'r':
+            struct_name += 'R{}'.format(bits['red'])
+        if channel == 'g':
+            struct_name += 'G{}'.format(bits['green'])
+        if channel == 'b':
+            struct_name += 'B{}'.format(bits['blue'])
+        if channel == 'a':
+            struct_name += 'A{}'.format(bits['alpha'])
+    if angle_format['componentType'] == 'float':
+        struct_name += 'F'
+    if angle_format['componentType'] == 'int' or angle_format['componentType'] == 'snorm':
+        struct_name += 'S'
+    return struct_name
+
+def get_mip_generation_function(angle_format):
+    channel_struct = get_channel_struct(angle_format)
+    if channel_struct == None:
+        return 'nullptr'
+    return 'GenerateMip&lt;' + channel_struct + '&gt;'
+
+def get_color_read_function(angle_format):
+    channel_struct = get_channel_struct(angle_format)
+    if channel_struct == None:
+        return 'nullptr'
+    component_type_map = {
+        'uint': 'GLuint',
+        'int': 'GLint',
+        'unorm': 'GLfloat',
+        'snorm': 'GLfloat',
+        'float': 'GLfloat'
+    }
+    return 'ReadColor&lt;' + channel_struct + ', '+ component_type_map[angle_format['componentType']] + '&gt;'
+
+def get_blit_srv_format(angle_format):
+    if 'channels' not in angle_format:
+        return 'DXGI_FORMAT_UNKNOWN'
+    if 'r' in angle_format['channels'] and angle_format['componentType'] in ['int', 'uint']:
+        return angle_format['rtvFormat']
+
+    return angle_format[&quot;srvFormat&quot;] if &quot;srvFormat&quot; in angle_format else &quot;DXGI_FORMAT_UNKNOWN&quot;
+
+def parse_json_into_switch_angle_format_string(json_data):
+    table_data = ''
+    for angle_format_item in sorted(json_data.iteritems()):
+        table_data += '        case ' + angle_format_item[0] + ':\n'
+        angle_format = angle_format_item[1]
+        gl_internal_format = angle_format[&quot;glInternalFormat&quot;] if &quot;glInternalFormat&quot; in angle_format else &quot;GL_NONE&quot;
+        tex_format = angle_format[&quot;texFormat&quot;] if &quot;texFormat&quot; in angle_format else &quot;DXGI_FORMAT_UNKNOWN&quot;
+        srv_format = angle_format[&quot;srvFormat&quot;] if &quot;srvFormat&quot; in angle_format else &quot;DXGI_FORMAT_UNKNOWN&quot;
+        rtv_format = angle_format[&quot;rtvFormat&quot;] if &quot;rtvFormat&quot; in angle_format else &quot;DXGI_FORMAT_UNKNOWN&quot;
+        dsv_format = angle_format[&quot;dsvFormat&quot;] if &quot;dsvFormat&quot; in angle_format else &quot;DXGI_FORMAT_UNKNOWN&quot;
+        blit_srv_format = get_blit_srv_format(angle_format)
+        swizzle_format = get_swizzle_format_id(angle_format_item[0], angle_format)
+        mip_generation_function = get_mip_generation_function(angle_format)
+        color_read_function = get_color_read_function(angle_format)
+        table_data += '        {\n'
+        table_data += '            static const ANGLEFormatSet formatInfo(' + angle_format_item[0] + ',\n'
+        table_data += '                                                   ' + gl_internal_format + ',\n'
+        table_data += '                                                   ' + tex_format + ',\n'
+        table_data += '                                                   ' + srv_format + ',\n'
+        table_data += '                                                   ' + rtv_format + ',\n'
+        table_data += '                                                   ' + dsv_format + ',\n'
+        table_data += '                                                   ' + blit_srv_format + ',\n'
+        table_data += '                                                   ' + swizzle_format + ',\n'
+        table_data += '                                                   ' + mip_generation_function + ',\n'
+        table_data += '                                                   ' + color_read_function + ');\n'
+        table_data += '            return formatInfo;\n'
+        table_data += '        }\n'
+    return table_data
+
+def parse_json_into_angle_format_enum_string(json_data):
+    enum_data = ''
+    index = 0
+    for angle_format_item in sorted(json_data.iteritems()):
+        if index &gt; 0:
+            enum_data += ',\n'
+        enum_data += '    ' + angle_format_item[0]
+        index += 1
+    return enum_data
+
+def reject_duplicate_keys(pairs):
+    found_keys = {}
+    for key, value in pairs:
+        if key in found_keys:
+           raise ValueError(&quot;duplicate key: %r&quot; % (key,))
+        else:
+           found_keys[key] = value
+    return found_keys
+
+with open('texture_format_map.json') as texture_format_map_file:
+    with open('texture_format_data.json') as texture_format_json_file:
+        texture_format_map = texture_format_map_file.read()
+        texture_format_data = texture_format_json_file.read()
+        texture_format_map_file.close()
+        texture_format_json_file.close()
+        json_map = json.loads(texture_format_map, object_pairs_hook=reject_duplicate_keys)
+        json_data = json.loads(texture_format_data, object_pairs_hook=reject_duplicate_keys)
+
+        texture_format_cases = parse_json_into_switch_texture_format_string(json_map, json_data)
+        angle_format_cases = parse_json_into_switch_angle_format_string(json_data)
+        output_cpp = template_texture_format_table_autogen_cpp.format(
+            texture_format_info_cases=texture_format_cases,
+            angle_format_info_cases=angle_format_cases)
+        with open('texture_format_table_autogen.cpp', 'wt') as out_file:
+            out_file.write(output_cpp)
+            out_file.close()
+
+        enum_data = parse_json_into_angle_format_enum_string(json_data)
+        output_h = template_texture_format_table_autogen_h.format(angle_format_enum=enum_data)
+        with open('texture_format_table_autogen.h', 'wt') as out_file:
+            out_file.write(output_h)
+            out_file.close()
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11load_functions_datajson"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_data.json (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_data.json                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_data.json        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,1116 @@
</span><ins>+{
+  &quot;GL_RG8_SNORM&quot;: {
+    &quot;GL_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLbyte,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8_SNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_SRGB8&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLubyte,0xFF&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA8I&quot;: {
+    &quot;GL_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLbyte,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_R8_SNORM&quot;: {
+    &quot;GL_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLbyte,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8_SNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA8_SNORM&quot;: {
+    &quot;GL_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLbyte,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_SNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_R16I&quot;: {
+    &quot;GL_SHORT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLshort,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadETC2SRGBA8ToSRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadETC2RGB8A1ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB32UI&quot;: {
+    &quot;GL_UNSIGNED_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLuint,0x00000001&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_ALPHA32F_EXT&quot;: {
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadA32FToRGBA32F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_R16UI&quot;: {
+    &quot;GL_UNSIGNED_SHORT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLushort,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB9_E5&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB16FToRGB9E5&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R9G9B9E5_SHAREDEXP&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_INT_5_9_9_9_REV&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLuint,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R9G9B9E5_SHAREDEXP&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ],
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB32FToRGB9E5&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R9G9B9E5_SHAREDEXP&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB16FToRGB9E5&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R9G9B9E5_SHAREDEXP&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_R11_EAC&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadEACR11ToR8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA32UI&quot;: {
+    &quot;GL_UNSIGNED_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLuint,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RG8UI&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_LUMINANCE32F_EXT&quot;: {
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadL32FToRGBA32F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadETC2SRGB8A1ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_R16F&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLhalf,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ],
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;Load32FTo16F&lt;1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLhalf,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA8UI&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_BGRA4_ANGLEX&quot;: {
+    &quot;GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGBA4ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA16F&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLhalf,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ],
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;Load32FTo16F&lt;4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLhalf,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_LUMINANCE8_EXT&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadL8ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadCompressedToNative&lt;4,4,16&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnreachableLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_SHORT_5_6_5&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnreachableLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB5_A1&quot;: {
+    &quot;GL_UNSIGNED_INT_2_10_10_10_REV&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB10A2ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_SHORT_5_5_5_1&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB5A1ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      },
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB5A1ToA1RGB5&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_B5G5R5A1_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB16UI&quot;: {
+    &quot;GL_UNSIGNED_SHORT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLushort,0x0001&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_BGRA_EXT&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnreachableLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_RGB8_ETC2&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadETC2RGB8ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA32F&quot;: {
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLfloat,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA32I&quot;: {
+    &quot;GL_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLint,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_LUMINANCE8_ALPHA8_EXT&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadLA8ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RG8&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB10_A2&quot;: {
+    &quot;GL_UNSIGNED_INT_2_10_10_10_REV&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLuint,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R10G10B10A2_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_SIGNED_RG11_EAC&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadEACRG11SToRG8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8_SNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_DEPTH_COMPONENT16&quot;: {
+    &quot;GL_UNSIGNED_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadR32ToR16&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16_TYPELESS&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_SHORT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLushort,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16_TYPELESS&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      },
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLushort,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_D16_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB32I&quot;: {
+    &quot;GL_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLint,0x00000001&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_R8&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB32F&quot;: {
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLfloat,gl::Float32One&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_R11F_G11F_B10F&quot;: {
+    &quot;GL_UNSIGNED_INT_10F_11F_11F_REV&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLuint,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R11G11B10_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB16FToRG11B10F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R11G11B10_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB32FToRG11B10F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R11G11B10_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB16FToRG11B10F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R11G11B10_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB8&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLubyte,0xFF&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_LUMINANCE_ALPHA&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadLA16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnreachableLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadLA32FToRGBA32F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadLA16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA16I&quot;: {
+    &quot;GL_SHORT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLshort,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_R8I&quot;: {
+    &quot;GL_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLbyte,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB8_SNORM&quot;: {
+    &quot;GL_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLbyte,0x7F&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_SNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RG32F&quot;: {
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLfloat,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_DEPTH_COMPONENT32F&quot;: {
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLfloat,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32_TYPELESS&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      },
+      {
+        &quot;loadFunction&quot;: &quot;UnimplementedLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RG32I&quot;: {
+    &quot;GL_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLint,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_ALPHA8_EXT&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      },
+      {
+        &quot;loadFunction&quot;: &quot;LoadA8ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RG32UI&quot;: {
+    &quot;GL_UNSIGNED_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLuint,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA16UI&quot;: {
+    &quot;GL_UNSIGNED_SHORT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLushort,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_RGBA8_ETC2_EAC&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadETC2RGBA8ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB8I&quot;: {
+    &quot;GL_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLbyte,0x01&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_SRGB8_ETC2&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadETC2SRGB8ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_DEPTH32F_STENCIL8&quot;: {
+    &quot;GL_FLOAT_32_UNSIGNED_INT_24_8_REV&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLuint,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G8X24_TYPELESS&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      },
+      {
+        &quot;loadFunction&quot;: &quot;UnimplementedLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RG8I&quot;: {
+    &quot;GL_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLbyte,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_R32UI&quot;: {
+    &quot;GL_UNSIGNED_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLuint,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_BGR5_A1_ANGLEX&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB5A1ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_RG11_EAC&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadEACRG11ToRG8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_SRGB8_ALPHA8&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_LUMINANCE_ALPHA16F_EXT&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadLA16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadLA16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnreachableLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_SHORT_4_4_4_4&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnreachableLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_SHORT_5_5_5_1&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnreachableLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_DEPTH24_STENCIL8&quot;: {
+    &quot;GL_UNSIGNED_INT_24_8&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadR32ToR24G8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R24G8_TYPELESS&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      },
+      {
+        &quot;loadFunction&quot;: &quot;LoadR32ToR24G8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_D24_UNORM_S8_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB16I&quot;: {
+    &quot;GL_SHORT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLshort,0x0001&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_R8UI&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_ALPHA&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadA16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnreachableLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadA32FToRGBA32F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadA16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB16F&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLhalf,gl::Float16One&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGB32FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLhalf,gl::Float16One&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_SIGNED_R11_EAC&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadEACR11SToR8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8_SNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_RGB_S3TC_DXT1_EXT&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadCompressedToNative&lt;4,4,8&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_RGBA_S3TC_DXT1_EXT&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadCompressedToNative&lt;4,4,8&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_STENCIL_INDEX8&quot;: {
+    &quot;DXGI_FORMAT_R24G8_TYPELESS&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnimplementedLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;DXGI_FORMAT_D24_UNORM_S8_UINT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnimplementedLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_LUMINANCE_ALPHA32F_EXT&quot;: {
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadLA32FToRGBA32F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB8UI&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLubyte,0x01&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_DEPTH_COMPONENT24&quot;: {
+    &quot;GL_UNSIGNED_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadR32ToR24G8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R24G8_TYPELESS&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      },
+      {
+        &quot;loadFunction&quot;: &quot;LoadR32ToR24G8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_D24_UNORM_S8_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_R32I&quot;: {
+    &quot;GL_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLint,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_DEPTH_COMPONENT32_OES&quot;: {
+    &quot;GL_UNSIGNED_INT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadR32ToR24G8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_R32F&quot;: {
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLfloat,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RG16F&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLhalf,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ],
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;Load32FTo16F&lt;2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLhalf,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB565&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative3To4&lt;GLubyte,0xFF&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_SHORT_5_6_5&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadR5G6B5ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      },
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLushort,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_B5G6R5_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_LUMINANCE16F_EXT&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadL16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadL16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RG16UI&quot;: {
+    &quot;GL_UNSIGNED_SHORT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLushort,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadCompressedToNative&lt;4,4,16&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RG16I&quot;: {
+    &quot;GL_SHORT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLshort,2&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16_SINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_BGRA8_EXT&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_ALPHA16F_EXT&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadA16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadA16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA4&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_SHORT_4_4_4_4&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGBA4ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      },
+      {
+        &quot;loadFunction&quot;: &quot;LoadRGBA4ToARGB4&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_B4G4R4A4_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGBA8&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLubyte,4&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_LUMINANCE&quot;: {
+    &quot;GL_HALF_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadL16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;UnreachableLoadFunction&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_UNKNOWN&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_FLOAT&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadL32FToRGBA32F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ],
+    &quot;GL_HALF_FLOAT_OES&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadL16FToRGBA16F&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_RGB10_A2UI&quot;: {
+    &quot;GL_UNSIGNED_INT_2_10_10_10_REV&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadToNative&lt;GLuint,1&gt;&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R10G10B10A2_UINT&quot;,
+        &quot;requiresConversion&quot;: &quot;false&quot;
+      }
+    ]
+  },
+  &quot;GL_ETC1_RGB8_OES&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadETC1RGB8ToRGBA8&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  },
+  &quot;GL_ETC1_RGB8_LOSSY_DECODE_ANGLE&quot;: {
+    &quot;GL_UNSIGNED_BYTE&quot;: [
+      {
+        &quot;loadFunction&quot;: &quot;LoadETC1RGB8ToBC1&quot;,
+        &quot;dxgiFormat&quot;: &quot;DXGI_FORMAT_BC1_UNORM&quot;,
+        &quot;requiresConversion&quot;: &quot;true&quot;
+      }
+    ]
+  }
+}
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11load_functions_tableh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_table.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_table.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_table.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// load_functions_table:
+//   Contains load functions table depending on internal format and dxgi format
+//
+
+#ifndef LIBANGLE_RENDERER_D3D_D3D11_LOADFUNCTIONSTABLE_H_
+#define LIBANGLE_RENDERER_D3D_D3D11_LOADFUNCTIONSTABLE_H_
+
+#include &lt;map&gt;
+
+#include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
+
+namespace rx
+{
+
+namespace d3d11
+{
+
+const std::map&lt;GLenum, LoadImageFunctionInfo&gt; &amp;GetLoadFunctionsMap(GLenum internalFormat,
+                                                                   DXGI_FORMAT dxgiFormat);
+
+}  // namespace d3d11
+
+}  // namespace rx
+
+#endif  // LIBANGLE_RENDERER_D3D_D3D11_LOADFUNCTIONSTABLE_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11load_functions_table_autogencpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_table_autogen.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_table_autogen.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/load_functions_table_autogen.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,2098 @@
</span><ins>+// GENERATED FILE - DO NOT EDIT.
+// Generated by gen_load_functions_table.py using data from load_functions_data.json
+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// load_functions_table:
+//   Contains the GetLoadFunctionsMap for texture_format_util.h
+//
+
+#include &quot;libANGLE/renderer/d3d/d3d11/load_functions_table.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
+#include &quot;libANGLE/renderer/d3d/loadimage.h&quot;
+#include &quot;libANGLE/renderer/d3d/loadimage_etc.h&quot;
+
+namespace rx
+{
+
+namespace d3d11
+{
+
+namespace
+{
+
+// ES3 image loading functions vary based on:
+//    - the GL internal format (supplied to glTex*Image*D)
+//    - the GL data type given (supplied to glTex*Image*D)
+//    - the target DXGI_FORMAT that the image will be loaded into (which is chosen based on the D3D
+//    device's capabilities)
+// This map type determines which loading function to use, based on these three parameters.
+// Source formats and types are taken from Tables 3.2 and 3.3 of the ES 3 spec.
+void UnimplementedLoadFunction(size_t width,
+                               size_t height,
+                               size_t depth,
+                               const uint8_t *input,
+                               size_t inputRowPitch,
+                               size_t inputDepthPitch,
+                               uint8_t *output,
+                               size_t outputRowPitch,
+                               size_t outputDepthPitch)
+{
+    UNIMPLEMENTED();
+}
+
+void UnreachableLoadFunction(size_t width,
+                             size_t height,
+                             size_t depth,
+                             const uint8_t *input,
+                             size_t inputRowPitch,
+                             size_t inputDepthPitch,
+                             uint8_t *output,
+                             size_t outputRowPitch,
+                             size_t outputDepthPitch)
+{
+    UNREACHABLE();
+}
+
+}  // namespace
+
+// TODO we can replace these maps with more generated code
+const std::map&lt;GLenum, LoadImageFunctionInfo&gt; &amp;GetLoadFunctionsMap(GLenum internalFormat,
+                                                                   DXGI_FORMAT dxgiFormat)
+{
+    // clang-format off
+    switch (internalFormat)
+    {
+        case GL_ALPHA:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16B16A16_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_R32G32B32A32_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadA32FToRGBA32F, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_ALPHA16F_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_ALPHA32F_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadA32FToRGBA32F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadA32FToRGBA32F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_ALPHA8_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_R8G8B8A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadA8ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_BGR5_A1_ANGLEX:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT] = LoadImageFunctionInfo(LoadRGB5A1ToRGBA8, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, true);
+                        loadMap[GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT] = LoadImageFunctionInfo(LoadRGB5A1ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_BGRA4_ANGLEX:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT] = LoadImageFunctionInfo(LoadRGBA4ToRGBA8, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, true);
+                        loadMap[GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT] = LoadImageFunctionInfo(LoadRGBA4ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_BGRA8_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_BGRA_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_COMPRESSED_R11_EAC:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadEACR11ToR8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_COMPRESSED_RG11_EAC:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadEACRG11ToRG8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_COMPRESSED_RGB8_ETC2:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadETC2RGB8ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadETC2RGB8A1ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_COMPRESSED_RGBA8_ETC2_EAC:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadETC2RGBA8ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadCompressedToNative&lt;4,4,8&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadCompressedToNative&lt;4,4,8&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadCompressedToNative&lt;4,4,16&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadCompressedToNative&lt;4,4,16&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadCompressedToNative&lt;4,4,16&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadCompressedToNative&lt;4,4,16&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadCompressedToNative&lt;4,4,8&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadCompressedToNative&lt;4,4,8&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_COMPRESSED_SIGNED_R11_EAC:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8_SNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadEACR11SToR8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_COMPRESSED_SIGNED_RG11_EAC:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8_SNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadEACRG11SToRG8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadETC2SRGBA8ToSRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_COMPRESSED_SRGB8_ETC2:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadETC2SRGB8ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadETC2SRGB8A1ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_DEPTH24_STENCIL8:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_D24_UNORM_S8_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT_24_8] = LoadImageFunctionInfo(LoadR32ToR24G8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_R24G8_TYPELESS:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT_24_8] = LoadImageFunctionInfo(LoadR32ToR24G8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_DEPTH32F_STENCIL8:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32G8X24_TYPELESS:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT_32_UNSIGNED_INT_24_8_REV] = LoadImageFunctionInfo(LoadToNative&lt;GLuint,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT_32_UNSIGNED_INT_24_8_REV] = LoadImageFunctionInfo(UnimplementedLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT_32_UNSIGNED_INT_24_8_REV] = LoadImageFunctionInfo(UnimplementedLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_DEPTH_COMPONENT16:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_D16_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT] = LoadImageFunctionInfo(LoadToNative&lt;GLushort,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_R16_TYPELESS:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT] = LoadImageFunctionInfo(LoadR32ToR16, true);
+                        loadMap[GL_UNSIGNED_SHORT] = LoadImageFunctionInfo(LoadToNative&lt;GLushort,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_DEPTH_COMPONENT24:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_D24_UNORM_S8_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT] = LoadImageFunctionInfo(LoadR32ToR24G8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_R24G8_TYPELESS:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT] = LoadImageFunctionInfo(LoadR32ToR24G8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_DEPTH_COMPONENT32F:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32_TYPELESS:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadToNative&lt;GLfloat,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(UnimplementedLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(UnimplementedLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_DEPTH_COMPONENT32_OES:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT] = LoadImageFunctionInfo(LoadR32ToR24G8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT] = LoadImageFunctionInfo(LoadR32ToR24G8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_BC1_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadETC1RGB8ToBC1, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_ETC1_RGB8_OES:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadETC1RGB8ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_LUMINANCE:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16B16A16_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_R32G32B32A32_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadL32FToRGBA32F, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_LUMINANCE16F_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_LUMINANCE32F_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadL32FToRGBA32F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadL32FToRGBA32F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_LUMINANCE8_ALPHA8_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadLA8ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadLA8ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_LUMINANCE8_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadL8ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadL8ToRGBA8, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_LUMINANCE_ALPHA:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16B16A16_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_R32G32B32A32_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadLA32FToRGBA32F, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_LUMINANCE_ALPHA16F_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_LUMINANCE_ALPHA32F_EXT:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadLA32FToRGBA32F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadLA32FToRGBA32F, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_R11F_G11F_B10F:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R11G11B10_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadRGB16FToRG11B10F, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadRGB16FToRG11B10F, true);
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadRGB32FToRG11B10F, true);
+                        loadMap[GL_UNSIGNED_INT_10F_11F_11F_REV] = LoadImageFunctionInfo(LoadToNative&lt;GLuint,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_R16F:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(Load32FTo16F&lt;1&gt;, true);
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadToNative&lt;GLhalf,1&gt;, false);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadToNative&lt;GLhalf,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_R16I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_SHORT] = LoadImageFunctionInfo(LoadToNative&lt;GLshort,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_R16UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT] = LoadImageFunctionInfo(LoadToNative&lt;GLushort,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_R32F:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadToNative&lt;GLfloat,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_R32I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_INT] = LoadImageFunctionInfo(LoadToNative&lt;GLint,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_R32UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT] = LoadImageFunctionInfo(LoadToNative&lt;GLuint,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_R8:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_R8I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLbyte,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_R8UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_R8_SNORM:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8_SNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLbyte,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RG16F:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(Load32FTo16F&lt;2&gt;, true);
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadToNative&lt;GLhalf,2&gt;, false);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadToNative&lt;GLhalf,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RG16I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_SHORT] = LoadImageFunctionInfo(LoadToNative&lt;GLshort,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RG16UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT] = LoadImageFunctionInfo(LoadToNative&lt;GLushort,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RG32F:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32G32_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadToNative&lt;GLfloat,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RG32I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32G32_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_INT] = LoadImageFunctionInfo(LoadToNative&lt;GLint,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RG32UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32G32_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT] = LoadImageFunctionInfo(LoadToNative&lt;GLuint,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RG8:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RG8I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLbyte,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RG8UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RG8_SNORM:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8_SNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLbyte,2&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        loadMap[GL_UNSIGNED_SHORT_5_6_5] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        loadMap[GL_UNSIGNED_SHORT_5_6_5] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_RGB10_A2:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R10G10B10A2_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT_2_10_10_10_REV] = LoadImageFunctionInfo(LoadToNative&lt;GLuint,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB10_A2UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R10G10B10A2_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT_2_10_10_10_REV] = LoadImageFunctionInfo(LoadToNative&lt;GLuint,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB16F:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16B16A16_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadRGB32FToRGBA16F, true);
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLhalf,gl::Float16One&gt;, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLhalf,gl::Float16One&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB16I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16B16A16_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_SHORT] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLshort,0x0001&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB16UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16B16A16_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLushort,0x0001&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB32F:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32G32B32A32_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLfloat,gl::Float32One&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB32I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32G32B32A32_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_INT] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLint,0x00000001&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB32UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32G32B32A32_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLuint,0x00000001&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB565:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_B5G6R5_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT_5_6_5] = LoadImageFunctionInfo(LoadToNative&lt;GLushort,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_R8G8B8A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT_5_6_5] = LoadImageFunctionInfo(LoadR5G6B5ToRGBA8, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLubyte,0xFF&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB5_A1:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_B5G5R5A1_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT_5_5_5_1] = LoadImageFunctionInfo(LoadRGB5A1ToA1RGB5, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_R8G8B8A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT_2_10_10_10_REV] = LoadImageFunctionInfo(LoadRGB10A2ToRGBA8, true);
+                        loadMap[GL_UNSIGNED_SHORT_5_5_5_1] = LoadImageFunctionInfo(LoadRGB5A1ToRGBA8, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB8:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLubyte,0xFF&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB8I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_BYTE] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLbyte,0x01&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB8UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLubyte,0x01&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB8_SNORM:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_SNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_BYTE] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLbyte,0x7F&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGB9_E5:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadRGB16FToRGB9E5, true);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadRGB16FToRGB9E5, true);
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadRGB32FToRGB9E5, true);
+                        loadMap[GL_UNSIGNED_INT_5_9_9_9_REV] = LoadImageFunctionInfo(LoadToNative&lt;GLuint,1&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        loadMap[GL_UNSIGNED_SHORT_4_4_4_4] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        loadMap[GL_UNSIGNED_SHORT_5_5_5_1] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        loadMap[GL_UNSIGNED_SHORT_4_4_4_4] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        loadMap[GL_UNSIGNED_SHORT_5_5_5_1] = LoadImageFunctionInfo(UnreachableLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+        case GL_RGBA16F:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16B16A16_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(Load32FTo16F&lt;4&gt;, true);
+                        loadMap[GL_HALF_FLOAT] = LoadImageFunctionInfo(LoadToNative&lt;GLhalf,4&gt;, false);
+                        loadMap[GL_HALF_FLOAT_OES] = LoadImageFunctionInfo(LoadToNative&lt;GLhalf,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA16I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16B16A16_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_SHORT] = LoadImageFunctionInfo(LoadToNative&lt;GLshort,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA16UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R16G16B16A16_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT] = LoadImageFunctionInfo(LoadToNative&lt;GLushort,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA32F:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32G32B32A32_FLOAT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_FLOAT] = LoadImageFunctionInfo(LoadToNative&lt;GLfloat,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA32I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32G32B32A32_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_INT] = LoadImageFunctionInfo(LoadToNative&lt;GLint,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA32UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R32G32B32A32_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_INT] = LoadImageFunctionInfo(LoadToNative&lt;GLuint,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA4:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_B4G4R4A4_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT_4_4_4_4] = LoadImageFunctionInfo(LoadRGBA4ToARGB4, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                case DXGI_FORMAT_R8G8B8A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_SHORT_4_4_4_4] = LoadImageFunctionInfo(LoadRGBA4ToRGBA8, true);
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA8:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA8I:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_SINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLbyte,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA8UI:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UINT:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_RGBA8_SNORM:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_SNORM:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLbyte,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_SRGB8:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative3To4&lt;GLubyte,0xFF&gt;, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_SRGB8_ALPHA8:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[GL_UNSIGNED_BYTE] = LoadImageFunctionInfo(LoadToNative&lt;GLubyte,4&gt;, false);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                    break;
+            }
+        }
+        case GL_STENCIL_INDEX8:
+        {
+            switch (dxgiFormat)
+            {
+                case DXGI_FORMAT_UNKNOWN:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[DXGI_FORMAT_D24_UNORM_S8_UINT] = LoadImageFunctionInfo(UnimplementedLoadFunction, true);
+                        loadMap[DXGI_FORMAT_R24G8_TYPELESS] = LoadImageFunctionInfo(UnimplementedLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+                default:
+                {
+                    static const std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadFunctionsMap = []() {
+                        std::map&lt;GLenum, LoadImageFunctionInfo&gt; loadMap;
+                        loadMap[DXGI_FORMAT_D24_UNORM_S8_UINT] = LoadImageFunctionInfo(UnimplementedLoadFunction, true);
+                        loadMap[DXGI_FORMAT_R24G8_TYPELESS] = LoadImageFunctionInfo(UnimplementedLoadFunction, true);
+                        return loadMap;
+                    }();
+
+                    return loadFunctionsMap;
+                }
+            }
+        }
+
+        default:
+        {
+            static std::map&lt;GLenum, LoadImageFunctionInfo&gt; emptyLoadFunctionsMap;
+            return emptyLoadFunctionsMap;
+        }
+    }
+    // clang-format on
+
+}  // GetLoadFunctionsMap
+
+}  // namespace d3d11
+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11renderer11_utilscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,18 +8,21 @@
</span><span class="cx"> // specific to the D3D11 renderer.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</span><ins>+
+#include &lt;algorithm&gt;
+
+#include &quot;common/debug.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/Framebuffer.h&quot;
+#include &quot;libANGLE/Program.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/dxgi_support_table.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/Renderer11.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/RenderTarget11.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/FramebufferD3D.h&quot;
</span><del>-#include &quot;libANGLE/renderer/Workarounds.h&quot;
-#include &quot;libANGLE/formatutils.h&quot;
-#include &quot;libANGLE/Program.h&quot;
-#include &quot;libANGLE/Framebuffer.h&quot;
</del><ins>+#include &quot;libANGLE/renderer/d3d/WorkaroundsD3D.h&quot;
</ins><span class="cx"> 
</span><del>-#include &quot;common/debug.h&quot;
-
-#include &lt;algorithm&gt;
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -218,16 +221,106 @@
</span><span class="cx">       case GL_ANY_SAMPLES_PASSED_EXT:
</span><span class="cx">       case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:   return D3D11_QUERY_OCCLUSION;
</span><span class="cx">       case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: return D3D11_QUERY_SO_STATISTICS;
</span><ins>+      case GL_TIME_ELAPSED_EXT:
+          // Two internal queries are also created for begin/end timestamps
+          return D3D11_QUERY_TIMESTAMP_DISJOINT;
</ins><span class="cx">       default: UNREACHABLE();                        return D3D11_QUERY_EVENT;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace gl_d3d11
</ins><span class="cx"> 
</span><del>-
</del><span class="cx"> namespace d3d11_gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+namespace
+{
+
+// Helper functor for querying DXGI support. Saves passing the parameters repeatedly.
+class DXGISupportHelper : angle::NonCopyable
+{
+  public:
+    DXGISupportHelper(ID3D11Device *device, D3D_FEATURE_LEVEL featureLevel)
+        : mDevice(device),
+          mFeatureLevel(featureLevel)
+    {
+    }
+
+    bool query(DXGI_FORMAT dxgiFormat, UINT supportMask)
+    {
+        if (dxgiFormat == DXGI_FORMAT_UNKNOWN)
+            return false;
+
+        auto dxgiSupport = d3d11::GetDXGISupport(dxgiFormat, mFeatureLevel);
+
+        UINT supportedBits = dxgiSupport.alwaysSupportedFlags;
+
+        if ((dxgiSupport.optionallySupportedFlags &amp; supportMask) != 0)
+        {
+            UINT formatSupport;
+            if (SUCCEEDED(mDevice-&gt;CheckFormatSupport(dxgiFormat, &amp;formatSupport)))
+            {
+                supportedBits |= (formatSupport &amp; supportMask);
+            }
+            else
+            {
+                // TODO(jmadill): find out why we fail this call sometimes in FL9_3
+                // ERR(&quot;Error checking format support for format 0x%x&quot;, dxgiFormat);
+            }
+        }
+
+        return ((supportedBits &amp; supportMask) == supportMask);
+    }
+
+  private:
+    ID3D11Device *mDevice;
+    D3D_FEATURE_LEVEL mFeatureLevel;
+};
+
+} // anonymous namespace
+
+unsigned int GetReservedVertexUniformVectors(D3D_FEATURE_LEVEL featureLevel)
+{
+    switch (featureLevel)
+    {
+        case D3D_FEATURE_LEVEL_11_1:
+        case D3D_FEATURE_LEVEL_11_0:
+        case D3D_FEATURE_LEVEL_10_1:
+        case D3D_FEATURE_LEVEL_10_0:
+            return 0;
+
+        case D3D_FEATURE_LEVEL_9_3:
+        case D3D_FEATURE_LEVEL_9_2:
+        case D3D_FEATURE_LEVEL_9_1:
+            return 3;  // dx_ViewAdjust, dx_ViewCoords and dx_ViewScale
+
+        default:
+            UNREACHABLE();
+            return 0;
+    }
+}
+
+unsigned int GetReservedFragmentUniformVectors(D3D_FEATURE_LEVEL featureLevel)
+{
+    switch (featureLevel)
+    {
+        case D3D_FEATURE_LEVEL_11_1:
+        case D3D_FEATURE_LEVEL_11_0:
+        case D3D_FEATURE_LEVEL_10_1:
+        case D3D_FEATURE_LEVEL_10_0:
+            return 0;
+
+        case D3D_FEATURE_LEVEL_9_3:
+        case D3D_FEATURE_LEVEL_9_2:
+        case D3D_FEATURE_LEVEL_9_1:
+            return 3;
+
+        default:
+            UNREACHABLE();
+            return 0;
+    }
+}
+
</ins><span class="cx"> GLint GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel)
</span><span class="cx"> {
</span><span class="cx">     switch (featureLevel)
</span><span class="lines">@@ -245,52 +338,65 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gl::TextureCaps GenerateTextureFormatCaps(GLint maxClientVersion, GLenum internalFormat, ID3D11Device *device)
</del><ins>+static gl::TextureCaps GenerateTextureFormatCaps(GLint maxClientVersion, GLenum internalFormat, ID3D11Device *device, const Renderer11DeviceCaps &amp;renderer11DeviceCaps)
</ins><span class="cx"> {
</span><span class="cx">     gl::TextureCaps textureCaps;
</span><span class="cx"> 
</span><del>-    const d3d11::TextureFormat &amp;formatInfo = d3d11::GetTextureFormatInfo(internalFormat, device-&gt;GetFeatureLevel());
</del><ins>+    DXGISupportHelper support(device, renderer11DeviceCaps.featureLevel);
+    const d3d11::TextureFormat &amp;formatInfo =
+        d3d11::GetTextureFormatInfo(internalFormat, renderer11DeviceCaps);
</ins><span class="cx"> 
</span><del>-    UINT formatSupport;
-    if (SUCCEEDED(device-&gt;CheckFormatSupport(formatInfo.texFormat, &amp;formatSupport)))
</del><ins>+    const gl::InternalFormat &amp;internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
+
+    UINT texSupportMask = D3D11_FORMAT_SUPPORT_TEXTURE2D;
+    if (internalFormatInfo.depthBits == 0 &amp;&amp; internalFormatInfo.stencilBits == 0)
</ins><span class="cx">     {
</span><del>-        const gl::InternalFormat &amp;internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
-        if (internalFormatInfo.depthBits &gt; 0 || internalFormatInfo.stencilBits &gt; 0)
</del><ins>+        texSupportMask |= D3D11_FORMAT_SUPPORT_TEXTURECUBE;
+        if (maxClientVersion &gt; 2)
</ins><span class="cx">         {
</span><del>-            textureCaps.texturable = ((formatSupport &amp; D3D11_FORMAT_SUPPORT_TEXTURE2D) != 0);
</del><ins>+            texSupportMask |= D3D11_FORMAT_SUPPORT_TEXTURE3D;
</ins><span class="cx">         }
</span><del>-        else
-        {
-            UINT formatSupportMask = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURECUBE;
-            if (maxClientVersion &gt; 2)
-            {
-                formatSupportMask |= D3D11_FORMAT_SUPPORT_TEXTURE3D;
-            }
-            textureCaps.texturable = ((formatSupport &amp; formatSupportMask) == formatSupportMask);
-        }
</del><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (SUCCEEDED(device-&gt;CheckFormatSupport(formatInfo.renderFormat, &amp;formatSupport)) &amp;&amp;
-        ((formatSupport &amp; D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET) != 0))
</del><ins>+    textureCaps.texturable = support.query(formatInfo.formatSet-&gt;texFormat, texSupportMask);
+    textureCaps.filterable =
+        support.query(formatInfo.formatSet-&gt;srvFormat, D3D11_FORMAT_SUPPORT_SHADER_SAMPLE);
+    textureCaps.renderable =
+        (support.query(formatInfo.formatSet-&gt;rtvFormat, D3D11_FORMAT_SUPPORT_RENDER_TARGET)) ||
+        (support.query(formatInfo.formatSet-&gt;dsvFormat, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL));
+
+    DXGI_FORMAT renderFormat = DXGI_FORMAT_UNKNOWN;
+    if (formatInfo.formatSet-&gt;dsvFormat != DXGI_FORMAT_UNKNOWN)
</ins><span class="cx">     {
</span><del>-        for (size_t sampleCount = 1; sampleCount &lt;= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; sampleCount++)
</del><ins>+        renderFormat = formatInfo.formatSet-&gt;dsvFormat;
+    }
+    else if (formatInfo.formatSet-&gt;rtvFormat != DXGI_FORMAT_UNKNOWN)
+    {
+        renderFormat = formatInfo.formatSet-&gt;rtvFormat;
+    }
+    if (renderFormat != DXGI_FORMAT_UNKNOWN &amp;&amp;
+        support.query(renderFormat, D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET))
+    {
+        // Assume 1x
+        textureCaps.sampleCounts.insert(1);
+
+        for (unsigned int sampleCount = 2; sampleCount &lt;= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT;
+             sampleCount *= 2)
</ins><span class="cx">         {
</span><span class="cx">             UINT qualityCount = 0;
</span><del>-            if (SUCCEEDED(device-&gt;CheckMultisampleQualityLevels(formatInfo.renderFormat, sampleCount, &amp;qualityCount)) &amp;&amp;
-                qualityCount &gt; 0)
</del><ins>+            if (SUCCEEDED(device-&gt;CheckMultisampleQualityLevels(renderFormat, sampleCount,
+                                                                &amp;qualityCount)))
</ins><span class="cx">             {
</span><ins>+                // Assume we always support lower sample counts
+                if (qualityCount == 0)
+                {
+                    break;
+                }
</ins><span class="cx">                 textureCaps.sampleCounts.insert(sampleCount);
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    textureCaps.filterable = SUCCEEDED(device-&gt;CheckFormatSupport(formatInfo.srvFormat, &amp;formatSupport)) &amp;&amp;
-                             ((formatSupport &amp; D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) != 0;
-    textureCaps.renderable = (SUCCEEDED(device-&gt;CheckFormatSupport(formatInfo.rtvFormat, &amp;formatSupport)) &amp;&amp;
-                              ((formatSupport &amp; D3D11_FORMAT_SUPPORT_RENDER_TARGET)) != 0) ||
-                             (SUCCEEDED(device-&gt;CheckFormatSupport(formatInfo.dsvFormat, &amp;formatSupport)) &amp;&amp;
-                              ((formatSupport &amp; D3D11_FORMAT_SUPPORT_DEPTH_STENCIL) != 0));
-
</del><span class="cx">     return textureCaps;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -654,27 +760,26 @@
</span><span class="cx">       // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx ID3D11DeviceContext::VSSetConstantBuffers
</span><span class="cx">       case D3D_FEATURE_LEVEL_9_3:
</span><span class="cx">       case D3D_FEATURE_LEVEL_9_2:
</span><del>-      case D3D_FEATURE_LEVEL_9_1:  return 255;
</del><ins>+      case D3D_FEATURE_LEVEL_9_1:
+          return 255 - d3d11_gl::GetReservedVertexUniformVectors(featureLevel);
</ins><span class="cx"> 
</span><span class="cx">       default: UNREACHABLE();      return 0;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static size_t GetReservedVertexUniformBuffers()
-{
-    // Reserve one buffer for the application uniforms, and one for driver uniforms
-    return 2;
-}
-
</del><span class="cx"> static size_t GetMaximumVertexUniformBlocks(D3D_FEATURE_LEVEL featureLevel)
</span><span class="cx"> {
</span><span class="cx">     switch (featureLevel)
</span><span class="cx">     {
</span><span class="cx">       case D3D_FEATURE_LEVEL_11_1:
</span><del>-      case D3D_FEATURE_LEVEL_11_0: return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - GetReservedVertexUniformBuffers();
</del><ins>+      case D3D_FEATURE_LEVEL_11_0:
+          return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT -
+                 d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT;
</ins><span class="cx"> 
</span><span class="cx">       case D3D_FEATURE_LEVEL_10_1:
</span><del>-      case D3D_FEATURE_LEVEL_10_0: return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - GetReservedVertexUniformBuffers();
</del><ins>+      case D3D_FEATURE_LEVEL_10_0:
+          return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT -
+                 d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT;
</ins><span class="cx"> 
</span><span class="cx">       // Uniform blocks not supported on D3D11 Feature Level 9
</span><span class="cx">       case D3D_FEATURE_LEVEL_9_3:
</span><span class="lines">@@ -770,27 +875,26 @@
</span><span class="cx">       // From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx ID3D11DeviceContext::PSSetConstantBuffers
</span><span class="cx">       case D3D_FEATURE_LEVEL_9_3:
</span><span class="cx">       case D3D_FEATURE_LEVEL_9_2:
</span><del>-      case D3D_FEATURE_LEVEL_9_1:  return 32;
</del><ins>+      case D3D_FEATURE_LEVEL_9_1:
+          return 32 - d3d11_gl::GetReservedFragmentUniformVectors(featureLevel);
</ins><span class="cx"> 
</span><span class="cx">       default: UNREACHABLE();      return 0;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static size_t GetReservedPixelUniformBuffers()
-{
-    // Reserve one buffer for the application uniforms, and one for driver uniforms
-    return 2;
-}
-
</del><span class="cx"> static size_t GetMaximumPixelUniformBlocks(D3D_FEATURE_LEVEL featureLevel)
</span><span class="cx"> {
</span><span class="cx">     switch (featureLevel)
</span><span class="cx">     {
</span><span class="cx">       case D3D_FEATURE_LEVEL_11_1:
</span><del>-      case D3D_FEATURE_LEVEL_11_0: return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - GetReservedPixelUniformBuffers();
</del><ins>+      case D3D_FEATURE_LEVEL_11_0:
+          return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT -
+                 d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT;
</ins><span class="cx"> 
</span><span class="cx">       case D3D_FEATURE_LEVEL_10_1:
</span><del>-      case D3D_FEATURE_LEVEL_10_0: return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - GetReservedPixelUniformBuffers();
</del><ins>+      case D3D_FEATURE_LEVEL_10_0:
+          return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT -
+                 d3d11::RESERVED_CONSTANT_BUFFER_SLOT_COUNT;
</ins><span class="cx"> 
</span><span class="cx">       // Uniform blocks not supported on D3D11 Feature Level 9
</span><span class="cx">       case D3D_FEATURE_LEVEL_9_3:
</span><span class="lines">@@ -957,15 +1061,15 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions)
</del><ins>+void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, const Renderer11DeviceCaps &amp;renderer11DeviceCaps, gl::Caps *caps,
+                  gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions, gl::Limitations *limitations)
</ins><span class="cx"> {
</span><del>-    D3D_FEATURE_LEVEL featureLevel = device-&gt;GetFeatureLevel();
-
</del><span class="cx">     GLuint maxSamples = 0;
</span><ins>+    D3D_FEATURE_LEVEL featureLevel = renderer11DeviceCaps.featureLevel;
</ins><span class="cx">     const gl::FormatSet &amp;allFormats = gl::GetAllSizedInternalFormats();
</span><span class="cx">     for (gl::FormatSet::const_iterator internalFormat = allFormats.begin(); internalFormat != allFormats.end(); ++internalFormat)
</span><span class="cx">     {
</span><del>-        gl::TextureCaps textureCaps = GenerateTextureFormatCaps(GetMaximumClientVersion(featureLevel), *internalFormat, device);
</del><ins>+        gl::TextureCaps textureCaps = GenerateTextureFormatCaps(GetMaximumClientVersion(featureLevel), *internalFormat, device, renderer11DeviceCaps);
</ins><span class="cx">         textureCapsMap-&gt;insert(*internalFormat, textureCaps);
</span><span class="cx"> 
</span><span class="cx">         maxSamples = std::max(maxSamples, textureCaps.getMaxSamples());
</span><span class="lines">@@ -977,11 +1081,12 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // GL core feature limits
</span><del>-    caps-&gt;maxElementIndex = static_cast&lt;GLint64&gt;(std::numeric_limits&lt;unsigned int&gt;::max());
-    caps-&gt;max3DTextureSize = GetMaximum3DTextureSize(featureLevel);
-    caps-&gt;max2DTextureSize = GetMaximum2DTextureSize(featureLevel);
-    caps-&gt;maxCubeMapTextureSize = GetMaximumCubeMapTextureSize(featureLevel);
-    caps-&gt;maxArrayTextureLayers = GetMaximum2DTextureArraySize(featureLevel);
</del><ins>+    // Reserve MAX_UINT for D3D11's primitive restart.
+    caps-&gt;maxElementIndex       = static_cast&lt;GLint64&gt;(std::numeric_limits&lt;unsigned int&gt;::max() - 1);
+    caps-&gt;max3DTextureSize      = static_cast&lt;GLuint&gt;(GetMaximum3DTextureSize(featureLevel));
+    caps-&gt;max2DTextureSize      = static_cast&lt;GLuint&gt;(GetMaximum2DTextureSize(featureLevel));
+    caps-&gt;maxCubeMapTextureSize = static_cast&lt;GLuint&gt;(GetMaximumCubeMapTextureSize(featureLevel));
+    caps-&gt;maxArrayTextureLayers = static_cast&lt;GLuint&gt;(GetMaximum2DTextureArraySize(featureLevel));
</ins><span class="cx"> 
</span><span class="cx">     // Unimplemented, set to minimum required
</span><span class="cx">     caps-&gt;maxLODBias = 2.0f;
</span><span class="lines">@@ -991,11 +1096,12 @@
</span><span class="cx"> 
</span><span class="cx">     // Maximum draw buffers and color attachments are the same, max color attachments could eventually be
</span><span class="cx">     // increased to 16
</span><del>-    caps-&gt;maxDrawBuffers = GetMaximumSimultaneousRenderTargets(featureLevel);
-    caps-&gt;maxColorAttachments = GetMaximumSimultaneousRenderTargets(featureLevel);
</del><ins>+    caps-&gt;maxDrawBuffers = static_cast&lt;GLuint&gt;(GetMaximumSimultaneousRenderTargets(featureLevel));
+    caps-&gt;maxColorAttachments =
+        static_cast&lt;GLuint&gt;(GetMaximumSimultaneousRenderTargets(featureLevel));
</ins><span class="cx"> 
</span><span class="cx">     // D3D11 has the same limit for viewport width and height
</span><del>-    caps-&gt;maxViewportWidth = GetMaximumViewportSize(featureLevel);
</del><ins>+    caps-&gt;maxViewportWidth  = static_cast&lt;GLuint&gt;(GetMaximumViewportSize(featureLevel));
</ins><span class="cx">     caps-&gt;maxViewportHeight = caps-&gt;maxViewportWidth;
</span><span class="cx"> 
</span><span class="cx">     // Choose a reasonable maximum, enforced in the shader.
</span><span class="lines">@@ -1007,8 +1113,8 @@
</span><span class="cx">     caps-&gt;maxAliasedLineWidth = 1.0f;
</span><span class="cx"> 
</span><span class="cx">     // Primitive count limits
</span><del>-    caps-&gt;maxElementsIndices = GetMaximumDrawIndexedIndexCount(featureLevel);
-    caps-&gt;maxElementsVertices = GetMaximumDrawVertexCount(featureLevel);
</del><ins>+    caps-&gt;maxElementsIndices  = static_cast&lt;GLuint&gt;(GetMaximumDrawIndexedIndexCount(featureLevel));
+    caps-&gt;maxElementsVertices = static_cast&lt;GLuint&gt;(GetMaximumDrawVertexCount(featureLevel));
</ins><span class="cx"> 
</span><span class="cx">     // Program and shader binary formats (no supported shader binary formats)
</span><span class="cx">     caps-&gt;programBinaryFormats.push_back(GL_PROGRAM_BINARY_ANGLE);
</span><span class="lines">@@ -1032,19 +1138,27 @@
</span><span class="cx">     caps-&gt;maxServerWaitTimeout = 0;
</span><span class="cx"> 
</span><span class="cx">     // Vertex shader limits
</span><del>-    caps-&gt;maxVertexAttributes = GetMaximumVertexInputSlots(featureLevel);
-    caps-&gt;maxVertexUniformComponents = GetMaximumVertexUniformVectors(featureLevel) * 4;
-    caps-&gt;maxVertexUniformVectors = GetMaximumVertexUniformVectors(featureLevel);
-    caps-&gt;maxVertexUniformBlocks = GetMaximumVertexUniformBlocks(featureLevel);
-    caps-&gt;maxVertexOutputComponents = GetMaximumVertexOutputVectors(featureLevel) * 4;
-    caps-&gt;maxVertexTextureImageUnits = GetMaximumVertexTextureUnits(featureLevel);
</del><ins>+    caps-&gt;maxVertexAttributes = static_cast&lt;GLuint&gt;(GetMaximumVertexInputSlots(featureLevel));
+    caps-&gt;maxVertexUniformComponents =
+        static_cast&lt;GLuint&gt;(GetMaximumVertexUniformVectors(featureLevel)) * 4;
+    caps-&gt;maxVertexUniformVectors =
+        static_cast&lt;GLuint&gt;(GetMaximumVertexUniformVectors(featureLevel));
+    caps-&gt;maxVertexUniformBlocks = static_cast&lt;GLuint&gt;(GetMaximumVertexUniformBlocks(featureLevel));
+    caps-&gt;maxVertexOutputComponents =
+        static_cast&lt;GLuint&gt;(GetMaximumVertexOutputVectors(featureLevel)) * 4;
+    caps-&gt;maxVertexTextureImageUnits =
+        static_cast&lt;GLuint&gt;(GetMaximumVertexTextureUnits(featureLevel));
</ins><span class="cx"> 
</span><span class="cx">     // Fragment shader limits
</span><del>-    caps-&gt;maxFragmentUniformComponents = GetMaximumPixelUniformVectors(featureLevel) * 4;
-    caps-&gt;maxFragmentUniformVectors = GetMaximumPixelUniformVectors(featureLevel);
-    caps-&gt;maxFragmentUniformBlocks = GetMaximumPixelUniformBlocks(featureLevel);
-    caps-&gt;maxFragmentInputComponents = GetMaximumPixelInputVectors(featureLevel) * 4;
-    caps-&gt;maxTextureImageUnits = GetMaximumPixelTextureUnits(featureLevel);
</del><ins>+    caps-&gt;maxFragmentUniformComponents =
+        static_cast&lt;GLuint&gt;(GetMaximumPixelUniformVectors(featureLevel)) * 4;
+    caps-&gt;maxFragmentUniformVectors =
+        static_cast&lt;GLuint&gt;(GetMaximumPixelUniformVectors(featureLevel));
+    caps-&gt;maxFragmentUniformBlocks =
+        static_cast&lt;GLuint&gt;(GetMaximumPixelUniformBlocks(featureLevel));
+    caps-&gt;maxFragmentInputComponents =
+        static_cast&lt;GLuint&gt;(GetMaximumPixelInputVectors(featureLevel)) * 4;
+    caps-&gt;maxTextureImageUnits  = static_cast&lt;GLuint&gt;(GetMaximumPixelTextureUnits(featureLevel));
</ins><span class="cx">     caps-&gt;minProgramTexelOffset = GetMinimumTexelOffset(featureLevel);
</span><span class="cx">     caps-&gt;maxProgramTexelOffset = GetMaximumTexelOffset(featureLevel);
</span><span class="cx"> 
</span><span class="lines">@@ -1063,14 +1177,18 @@
</span><span class="cx">                                                static_cast&lt;GLint64&gt;(caps-&gt;maxVertexUniformComponents);
</span><span class="cx">     caps-&gt;maxCombinedFragmentUniformComponents = (static_cast&lt;GLint64&gt;(caps-&gt;maxFragmentUniformBlocks) * static_cast&lt;GLint64&gt;(caps-&gt;maxUniformBlockSize / 4)) +
</span><span class="cx">                                                  static_cast&lt;GLint64&gt;(caps-&gt;maxFragmentUniformComponents);
</span><del>-    caps-&gt;maxVaryingComponents = GetMaximumVertexOutputVectors(featureLevel) * 4;
-    caps-&gt;maxVaryingVectors = GetMaximumVertexOutputVectors(featureLevel);
</del><ins>+    caps-&gt;maxVaryingComponents =
+        static_cast&lt;GLuint&gt;(GetMaximumVertexOutputVectors(featureLevel)) * 4;
+    caps-&gt;maxVaryingVectors            = static_cast&lt;GLuint&gt;(GetMaximumVertexOutputVectors(featureLevel));
</ins><span class="cx">     caps-&gt;maxCombinedTextureImageUnits = caps-&gt;maxVertexTextureImageUnits + caps-&gt;maxTextureImageUnits;
</span><span class="cx"> 
</span><span class="cx">     // Transform feedback limits
</span><del>-    caps-&gt;maxTransformFeedbackInterleavedComponents = GetMaximumStreamOutputInterleavedComponents(featureLevel);
-    caps-&gt;maxTransformFeedbackSeparateAttributes = GetMaximumStreamOutputBuffers(featureLevel);
-    caps-&gt;maxTransformFeedbackSeparateComponents = GetMaximumStreamOutputSeparateComponents(featureLevel);
</del><ins>+    caps-&gt;maxTransformFeedbackInterleavedComponents =
+        static_cast&lt;GLuint&gt;(GetMaximumStreamOutputInterleavedComponents(featureLevel));
+    caps-&gt;maxTransformFeedbackSeparateAttributes =
+        static_cast&lt;GLuint&gt;(GetMaximumStreamOutputBuffers(featureLevel));
+    caps-&gt;maxTransformFeedbackSeparateComponents =
+        static_cast&lt;GLuint&gt;(GetMaximumStreamOutputSeparateComponents(featureLevel));
</ins><span class="cx"> 
</span><span class="cx">     // Multisample limits
</span><span class="cx">     caps-&gt;maxSamples = maxSamples;
</span><span class="lines">@@ -1078,7 +1196,6 @@
</span><span class="cx">     // GL extension support
</span><span class="cx">     extensions-&gt;setTextureExtensionSupport(*textureCapsMap);
</span><span class="cx">     extensions-&gt;elementIndexUint = true;
</span><del>-    extensions-&gt;packedDepthStencil = true;
</del><span class="cx">     extensions-&gt;getProgramBinary = true;
</span><span class="cx">     extensions-&gt;rgb8rgba8 = true;
</span><span class="cx">     extensions-&gt;readFormatBGRA = true;
</span><span class="lines">@@ -1093,6 +1210,10 @@
</span><span class="cx">     extensions-&gt;occlusionQueryBoolean = GetOcclusionQuerySupport(featureLevel);
</span><span class="cx">     extensions-&gt;fence = GetEventQuerySupport(featureLevel);
</span><span class="cx">     extensions-&gt;timerQuery = false; // Unimplemented
</span><ins>+    extensions-&gt;disjointTimerQuery          = true;
+    extensions-&gt;queryCounterBitsTimeElapsed = 64;
+    extensions-&gt;queryCounterBitsTimestamp =
+        0;  // Timestamps cannot be supported due to D3D11 limitations
</ins><span class="cx">     extensions-&gt;robustness = true;
</span><span class="cx">     extensions-&gt;blendMinMax = true;
</span><span class="cx">     extensions-&gt;framebufferBlit = GetFramebufferBlitSupport(featureLevel);
</span><span class="lines">@@ -1103,18 +1224,119 @@
</span><span class="cx">     extensions-&gt;shaderTextureLOD = GetShaderTextureLODSupport(featureLevel);
</span><span class="cx">     extensions-&gt;fragDepth = true;
</span><span class="cx">     extensions-&gt;textureUsage = true; // This could be false since it has no effect in D3D11
</span><ins>+    extensions-&gt;discardFramebuffer = true;
</ins><span class="cx">     extensions-&gt;translatedShaderSource = true;
</span><span class="cx">     extensions-&gt;fboRenderMipmap = false;
</span><del>-}
</del><ins>+    extensions-&gt;debugMarker = true;
+    extensions-&gt;eglImage                 = true;
+    extensions-&gt;unpackSubimage           = true;
+    extensions-&gt;packSubimage             = true;
+    extensions-&gt;vertexArrayObject        = true;
+    extensions-&gt;noError                  = true;
+    extensions-&gt;lossyETCDecode           = true;
</ins><span class="cx"> 
</span><ins>+    // D3D11 Feature Level 10_0+ uses SV_IsFrontFace in HLSL to emulate gl_FrontFacing.
+    // D3D11 Feature Level 9_3 doesn't support SV_IsFrontFace, and has no equivalent, so can't support gl_FrontFacing.
+    limitations-&gt;noFrontFacingSupport = (renderer11DeviceCaps.featureLevel &lt;= D3D_FEATURE_LEVEL_9_3);
+
+    // D3D11 Feature Level 9_3 doesn't support alpha-to-coverage
+    limitations-&gt;noSampleAlphaToCoverageSupport = (renderer11DeviceCaps.featureLevel &lt;= D3D_FEATURE_LEVEL_9_3);
+
+    // D3D11 Feature Levels 9_3 and below do not support non-constant loop indexing and require
+    // additional
+    // pre-validation of the shader at compile time to produce a better error message.
+    limitations-&gt;shadersRequireIndexedLoopValidation =
+        (renderer11DeviceCaps.featureLevel &lt;= D3D_FEATURE_LEVEL_9_3);
+
+    // D3D11 has no concept of separate masks and refs for front and back faces in the depth stencil
+    // state.
+    limitations-&gt;noSeparateStencilRefsAndMasks = true;
+
+    // D3D11 cannot support constant color and alpha blend funcs together
+    limitations-&gt;noSimultaneousConstantColorAndAlphaBlendFunc = true;
+
+#ifdef ANGLE_ENABLE_WINDOWS_STORE
+    // Setting a non-zero divisor on attribute zero doesn't work on certain Windows Phone 8-era devices.
+    // We should prevent developers from doing this on ALL Windows Store devices. This will maintain consistency across all Windows devices.
+    // We allow non-zero divisors on attribute zero if the Client Version &gt;= 3, since devices affected by this issue don't support ES3+.
+    limitations-&gt;attributeZeroRequiresZeroDivisorInEXT = true;
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}  // namespace d3d11_gl
+
</ins><span class="cx"> namespace d3d11
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+ANGLED3D11DeviceType GetDeviceType(ID3D11Device *device)
+{
+    // Note that this function returns an ANGLED3D11DeviceType rather than a D3D_DRIVER_TYPE value,
+    // since it is difficult to tell Software and Reference devices apart
+
+    IDXGIDevice *dxgiDevice     = nullptr;
+    IDXGIAdapter *dxgiAdapter   = nullptr;
+    IDXGIAdapter2 *dxgiAdapter2 = nullptr;
+
+    ANGLED3D11DeviceType retDeviceType = ANGLE_D3D11_DEVICE_TYPE_UNKNOWN;
+
+    HRESULT hr = device-&gt;QueryInterface(__uuidof(IDXGIDevice), (void **)&amp;dxgiDevice);
+    if (SUCCEEDED(hr))
+    {
+        hr = dxgiDevice-&gt;GetParent(__uuidof(IDXGIAdapter), (void **)&amp;dxgiAdapter);
+        if (SUCCEEDED(hr))
+        {
+            std::wstring adapterString;
+            HRESULT adapter2hr =
+                dxgiAdapter-&gt;QueryInterface(__uuidof(dxgiAdapter2), (void **)&amp;dxgiAdapter2);
+            if (SUCCEEDED(adapter2hr))
+            {
+                // On D3D_FEATURE_LEVEL_9_*, IDXGIAdapter::GetDesc returns &quot;Software Adapter&quot;
+                // for the description string. Try to use IDXGIAdapter2::GetDesc2 to get the
+                // actual hardware values if possible.
+                DXGI_ADAPTER_DESC2 adapterDesc2;
+                dxgiAdapter2-&gt;GetDesc2(&amp;adapterDesc2);
+                adapterString = std::wstring(adapterDesc2.Description);
+            }
+            else
+            {
+                DXGI_ADAPTER_DESC adapterDesc;
+                dxgiAdapter-&gt;GetDesc(&amp;adapterDesc);
+                adapterString = std::wstring(adapterDesc.Description);
+            }
+
+            // Both Reference and Software adapters will be 'Software Adapter'
+            const bool isSoftwareDevice =
+                (adapterString.find(std::wstring(L&quot;Software Adapter&quot;)) != std::string::npos);
+            const bool isNullDevice = (adapterString == L&quot;&quot;);
+            const bool isWARPDevice =
+                (adapterString.find(std::wstring(L&quot;Basic Render&quot;)) != std::string::npos);
+
+            if (isSoftwareDevice || isNullDevice)
+            {
+                ASSERT(!isWARPDevice);
+                retDeviceType = ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL;
+            }
+            else if (isWARPDevice)
+            {
+                retDeviceType = ANGLE_D3D11_DEVICE_TYPE_WARP;
+            }
+            else
+            {
+                retDeviceType = ANGLE_D3D11_DEVICE_TYPE_HARDWARE;
+            }
+        }
+    }
+
+    SafeRelease(dxgiDevice);
+    SafeRelease(dxgiAdapter);
+    SafeRelease(dxgiAdapter2);
+
+    return retDeviceType;
+}
+
</ins><span class="cx"> void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
</span><span class="cx"> {
</span><del>-    const DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(format);
</del><ins>+    const DXGIFormatSize &amp;dxgiFormatInfo = d3d11::GetDXGIFormatSizeInfo(format);
</ins><span class="cx"> 
</span><span class="cx">     int upsampleCount = 0;
</span><span class="cx">     // Don't expand the size of full textures that are at least (blockWidth x blockHeight) already.
</span><span class="lines">@@ -1131,14 +1353,20 @@
</span><span class="cx">     *levelOffset = upsampleCount;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GenerateInitialTextureData(GLint internalFormat, D3D_FEATURE_LEVEL featureLevel, GLuint width, GLuint height, GLuint depth,
-                                GLuint mipLevels, std::vector&lt;D3D11_SUBRESOURCE_DATA&gt; *outSubresourceData,
-                                std::vector&lt; std::vector&lt;BYTE&gt; &gt; *outData)
</del><ins>+void GenerateInitialTextureData(GLint internalFormat,
+                                const Renderer11DeviceCaps &amp;renderer11DeviceCaps,
+                                GLuint width,
+                                GLuint height,
+                                GLuint depth,
+                                GLuint mipLevels,
+                                std::vector&lt;D3D11_SUBRESOURCE_DATA&gt; *outSubresourceData,
+                                std::vector&lt;std::vector&lt;BYTE&gt;&gt; *outData)
</ins><span class="cx"> {
</span><del>-    const d3d11::TextureFormat &amp;d3dFormatInfo = d3d11::GetTextureFormatInfo(internalFormat, featureLevel);
</del><ins>+    const d3d11::TextureFormat &amp;d3dFormatInfo = d3d11::GetTextureFormatInfo(internalFormat, renderer11DeviceCaps);
</ins><span class="cx">     ASSERT(d3dFormatInfo.dataInitializerFunction != NULL);
</span><span class="cx"> 
</span><del>-    const d3d11::DXGIFormat &amp;dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3dFormatInfo.texFormat);
</del><ins>+    const d3d11::DXGIFormatSize &amp;dxgiFormatInfo =
+        d3d11::GetDXGIFormatSizeInfo(d3dFormatInfo.formatSet-&gt;texFormat);
</ins><span class="cx"> 
</span><span class="cx">     outSubresourceData-&gt;resize(mipLevels);
</span><span class="cx">     outData-&gt;resize(mipLevels);
</span><span class="lines">@@ -1161,6 +1389,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+UINT GetPrimitiveRestartIndex()
+{
+    return std::numeric_limits&lt;UINT&gt;::max();
+}
+
</ins><span class="cx"> void SetPositionTexCoordVertex(PositionTexCoordVertex* vertex, float x, float y, float u, float v)
</span><span class="cx"> {
</span><span class="cx">     vertex-&gt;x = x;
</span><span class="lines">@@ -1183,15 +1416,94 @@
</span><span class="cx"> HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
</span><span class="cx"> {
</span><span class="cx"> #if defined(_DEBUG)
</span><del>-    return resource-&gt;SetPrivateData(WKPDID_D3DDebugObjectName, strlen(name), name);
</del><ins>+    UINT existingDataSize = 0;
+    resource-&gt;GetPrivateData(WKPDID_D3DDebugObjectName, &amp;existingDataSize, nullptr);
+    // Don't check the HRESULT- if it failed then that probably just means that no private data
+    // exists yet
+
+    if (existingDataSize &gt; 0)
+    {
+        // In some cases, ANGLE will try to apply two names to one object, which causes
+        // a D3D SDK Layers warning. This can occur if, for example, you 'create' two objects
+        // (e.g.Rasterizer States) with identical DESCs on the same device. D3D11 will optimize
+        // these calls and return the same object both times.
+        static const char *multipleNamesUsed = &quot;Multiple names set by ANGLE&quot;;
+
+        // Remove the existing name
+        HRESULT hr = resource-&gt;SetPrivateData(WKPDID_D3DDebugObjectName, 0, nullptr);
+        if (FAILED(hr))
+        {
+            return hr;
+        }
+
+        // Apply the new name
+        return resource-&gt;SetPrivateData(WKPDID_D3DDebugObjectName,
+                                        static_cast&lt;unsigned int&gt;(strlen(multipleNamesUsed)),
+                                        multipleNamesUsed);
+    }
+    else
+    {
+        return resource-&gt;SetPrivateData(WKPDID_D3DDebugObjectName,
+                                        static_cast&lt;unsigned int&gt;(strlen(name)), name);
+    }
</ins><span class="cx"> #else
</span><span class="cx">     return S_OK;
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Workarounds GenerateWorkarounds(D3D_FEATURE_LEVEL featureLevel)
</del><ins>+LazyInputLayout::LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc,
+                                 size_t inputDescLen,
+                                 const BYTE *byteCode,
+                                 size_t byteCodeLen,
+                                 const char *debugName)
+    : mInputDesc(inputDescLen),
+      mByteCodeLen(byteCodeLen),
+      mByteCode(byteCode),
+      mDebugName(debugName)
</ins><span class="cx"> {
</span><del>-    Workarounds workarounds;
</del><ins>+    memcpy(&amp;mInputDesc[0], inputDesc, sizeof(D3D11_INPUT_ELEMENT_DESC) * inputDescLen);
+}
+
+ID3D11InputLayout *LazyInputLayout::resolve(ID3D11Device *device)
+{
+    checkAssociatedDevice(device);
+
+    if (mResource == nullptr)
+    {
+        HRESULT result =
+            device-&gt;CreateInputLayout(&amp;mInputDesc[0], static_cast&lt;UINT&gt;(mInputDesc.size()),
+                                      mByteCode, mByteCodeLen, &amp;mResource);
+        ASSERT(SUCCEEDED(result));
+        UNUSED_ASSERTION_VARIABLE(result);
+        d3d11::SetDebugName(mResource, mDebugName);
+    }
+
+    return mResource;
+}
+
+LazyBlendState::LazyBlendState(const D3D11_BLEND_DESC &amp;desc, const char *debugName)
+    : mDesc(desc), mDebugName(debugName)
+{
+}
+
+ID3D11BlendState *LazyBlendState::resolve(ID3D11Device *device)
+{
+    checkAssociatedDevice(device);
+
+    if (mResource == nullptr)
+    {
+        HRESULT result = device-&gt;CreateBlendState(&amp;mDesc, &amp;mResource);
+        ASSERT(SUCCEEDED(result));
+        UNUSED_ASSERTION_VARIABLE(result);
+        d3d11::SetDebugName(mResource, mDebugName);
+    }
+
+    return mResource;
+}
+
+WorkaroundsD3D GenerateWorkarounds(D3D_FEATURE_LEVEL featureLevel)
+{
+    WorkaroundsD3D workarounds;
</ins><span class="cx">     workarounds.mrtPerfWorkaround = true;
</span><span class="cx">     workarounds.setDataFasterThanImageUpload = true;
</span><span class="cx">     workarounds.zeroMaxLodWorkaround = (featureLevel &lt;= D3D_FEATURE_LEVEL_9_3);
</span><span class="lines">@@ -1199,6 +1511,245 @@
</span><span class="cx">     return workarounds;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void InitConstantBufferDesc(D3D11_BUFFER_DESC *constantBufferDescription, size_t byteWidth)
+{
+    constantBufferDescription-&gt;ByteWidth           = static_cast&lt;UINT&gt;(byteWidth);
+    constantBufferDescription-&gt;Usage               = D3D11_USAGE_DYNAMIC;
+    constantBufferDescription-&gt;BindFlags           = D3D11_BIND_CONSTANT_BUFFER;
+    constantBufferDescription-&gt;CPUAccessFlags      = D3D11_CPU_ACCESS_WRITE;
+    constantBufferDescription-&gt;MiscFlags           = 0;
+    constantBufferDescription-&gt;StructureByteStride = 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}  // namespace d3d11
+
+TextureHelper11::TextureHelper11()
+    : mTextureType(GL_NONE),
+      mFormat(DXGI_FORMAT_UNKNOWN),
+      mANGLEFormat(d3d11::ANGLE_FORMAT_NONE),
+      mSampleCount(0),
+      mTexture2D(nullptr),
+      mTexture3D(nullptr)
+{
</ins><span class="cx"> }
</span><ins>+
+TextureHelper11::TextureHelper11(TextureHelper11 &amp;&amp;toCopy)
+    : mTextureType(toCopy.mTextureType),
+      mExtents(toCopy.mExtents),
+      mFormat(toCopy.mFormat),
+      mANGLEFormat(toCopy.mANGLEFormat),
+      mSampleCount(toCopy.mSampleCount),
+      mTexture2D(toCopy.mTexture2D),
+      mTexture3D(toCopy.mTexture3D)
+{
+    toCopy.reset();
+}
+
+// static
+TextureHelper11 TextureHelper11::MakeAndReference(ID3D11Resource *genericResource,
+                                                  d3d11::ANGLEFormat angleFormat)
+{
+    TextureHelper11 newHelper;
+    newHelper.mANGLEFormat = angleFormat;
+    newHelper.mTexture2D   = d3d11::DynamicCastComObject&lt;ID3D11Texture2D&gt;(genericResource);
+    newHelper.mTexture3D   = d3d11::DynamicCastComObject&lt;ID3D11Texture3D&gt;(genericResource);
+    newHelper.mTextureType = newHelper.mTexture2D ? GL_TEXTURE_2D : GL_TEXTURE_3D;
+    newHelper.initDesc();
+    return newHelper;
+}
+
+// static
+TextureHelper11 TextureHelper11::MakeAndPossess2D(ID3D11Texture2D *texToOwn,
+                                                  d3d11::ANGLEFormat angleFormat)
+{
+    TextureHelper11 newHelper;
+    newHelper.mANGLEFormat = angleFormat;
+    newHelper.mTexture2D   = texToOwn;
+    newHelper.mTextureType = GL_TEXTURE_2D;
+    newHelper.initDesc();
+    return newHelper;
+}
+
+// static
+TextureHelper11 TextureHelper11::MakeAndPossess3D(ID3D11Texture3D *texToOwn,
+                                                  d3d11::ANGLEFormat angleFormat)
+{
+    TextureHelper11 newHelper;
+    newHelper.mANGLEFormat = angleFormat;
+    newHelper.mTexture3D   = texToOwn;
+    newHelper.mTextureType = GL_TEXTURE_3D;
+    newHelper.initDesc();
+    return newHelper;
+}
+
+void TextureHelper11::initDesc()
+{
+    if (mTextureType == GL_TEXTURE_2D)
+    {
+        ASSERT(!mTexture3D);
+        D3D11_TEXTURE2D_DESC desc2D;
+        mTexture2D-&gt;GetDesc(&amp;desc2D);
+
+        mExtents.width  = static_cast&lt;int&gt;(desc2D.Width);
+        mExtents.height = static_cast&lt;int&gt;(desc2D.Height);
+        mExtents.depth  = 1;
+        mFormat         = desc2D.Format;
+        mSampleCount    = desc2D.SampleDesc.Count;
+    }
+    else
+    {
+        ASSERT(mTexture3D &amp;&amp; mTextureType == GL_TEXTURE_3D);
+        D3D11_TEXTURE3D_DESC desc3D;
+        mTexture3D-&gt;GetDesc(&amp;desc3D);
+
+        mExtents.width  = static_cast&lt;int&gt;(desc3D.Width);
+        mExtents.height = static_cast&lt;int&gt;(desc3D.Height);
+        mExtents.depth  = static_cast&lt;int&gt;(desc3D.Depth);
+        mFormat         = desc3D.Format;
+        mSampleCount    = 1;
+    }
+    ASSERT(mFormat == d3d11::GetANGLEFormatSet(mANGLEFormat).texFormat);
+}
+
+TextureHelper11::~TextureHelper11()
+{
+    SafeRelease(mTexture2D);
+    SafeRelease(mTexture3D);
+}
+
+ID3D11Resource *TextureHelper11::getResource() const
+{
+    return mTexture2D ? static_cast&lt;ID3D11Resource *&gt;(mTexture2D)
+                      : static_cast&lt;ID3D11Resource *&gt;(mTexture3D);
+}
+
+TextureHelper11 &amp;TextureHelper11::operator=(TextureHelper11 &amp;&amp;texture)
+{
+    SafeRelease(mTexture2D);
+    SafeRelease(mTexture3D);
+
+    mTextureType = texture.mTextureType;
+    mExtents     = texture.mExtents;
+    mFormat      = texture.mFormat;
+    mANGLEFormat = texture.mANGLEFormat;
+    mSampleCount = texture.mSampleCount;
+    mTexture2D   = texture.mTexture2D;
+    mTexture3D = texture.mTexture3D;
+    texture.reset();
+    return *this;
+}
+
+void TextureHelper11::reset()
+{
+    mTextureType = GL_NONE;
+    mExtents     = gl::Extents();
+    mFormat      = DXGI_FORMAT_UNKNOWN;
+    mSampleCount = 0;
+    mTexture2D   = nullptr;
+    mTexture3D   = nullptr;
+}
+
+gl::ErrorOrResult&lt;TextureHelper11&gt; CreateStagingTexture(GLenum textureType,
+                                                        DXGI_FORMAT dxgiFormat,
+                                                        d3d11::ANGLEFormat angleFormat,
+                                                        const gl::Extents &amp;size,
+                                                        ID3D11Device *device)
+{
+    if (textureType == GL_TEXTURE_2D)
+    {
+        D3D11_TEXTURE2D_DESC stagingDesc;
+        stagingDesc.Width              = size.width;
+        stagingDesc.Height             = size.height;
+        stagingDesc.MipLevels          = 1;
+        stagingDesc.ArraySize          = 1;
+        stagingDesc.Format             = dxgiFormat;
+        stagingDesc.SampleDesc.Count   = 1;
+        stagingDesc.SampleDesc.Quality = 0;
+        stagingDesc.Usage              = D3D11_USAGE_STAGING;
+        stagingDesc.BindFlags          = 0;
+        stagingDesc.CPUAccessFlags     = D3D11_CPU_ACCESS_READ;
+        stagingDesc.MiscFlags          = 0;
+
+        ID3D11Texture2D *stagingTex = nullptr;
+        HRESULT result = device-&gt;CreateTexture2D(&amp;stagingDesc, nullptr, &amp;stagingTex);
+        if (FAILED(result))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY, &quot;CreateStagingTextureFor failed, HRESULT: 0x%X.&quot;,
+                             result);
+        }
+
+        return TextureHelper11::MakeAndPossess2D(stagingTex, angleFormat);
+    }
+    ASSERT(textureType == GL_TEXTURE_3D);
+
+    D3D11_TEXTURE3D_DESC stagingDesc;
+    stagingDesc.Width          = size.width;
+    stagingDesc.Height         = size.height;
+    stagingDesc.Depth          = 1;
+    stagingDesc.MipLevels      = 1;
+    stagingDesc.Format         = dxgiFormat;
+    stagingDesc.Usage          = D3D11_USAGE_STAGING;
+    stagingDesc.BindFlags      = 0;
+    stagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
+    stagingDesc.MiscFlags      = 0;
+
+    ID3D11Texture3D *stagingTex = nullptr;
+    HRESULT result = device-&gt;CreateTexture3D(&amp;stagingDesc, nullptr, &amp;stagingTex);
+    if (FAILED(result))
+    {
+        return gl::Error(GL_OUT_OF_MEMORY, &quot;CreateStagingTextureFor failed, HRESULT: 0x%X.&quot;,
+                         result);
+    }
+
+    return TextureHelper11::MakeAndPossess3D(stagingTex, angleFormat);
+}
+
+bool UsePresentPathFast(const Renderer11 *renderer,
+                        const gl::FramebufferAttachment *framebufferAttachment)
+{
+    if (framebufferAttachment == nullptr)
+    {
+        return false;
+    }
+
+    return (framebufferAttachment-&gt;type() == GL_FRAMEBUFFER_DEFAULT &amp;&amp;
+            renderer-&gt;presentPathFastEnabled());
+}
+
+NotificationSet::NotificationSet()
+{
+}
+
+NotificationSet::~NotificationSet()
+{
+}
+
+void NotificationSet::add(const NotificationCallback *callback)
+{
+    ASSERT(mCallbacks.count(callback) == 0);
+    mCallbacks.insert(callback);
+}
+
+void NotificationSet::remove(const NotificationCallback *callback)
+{
+    ASSERT(mCallbacks.count(callback) == 1);
+    mCallbacks.erase(callback);
+}
+
+void NotificationSet::signal() const
+{
+    if (mCallbacks.empty())
+        return;
+
+    for (const auto *callback : mCallbacks)
+    {
+        (*callback)();
+    }
+}
+
+void NotificationSet::clear()
+{
+    mCallbacks.clear();
+}
+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11renderer11_utilsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,12 +10,16 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_
</span><span class="cx"> 
</span><ins>+#include &lt;array&gt;
+#include &lt;functional&gt;
+#include &lt;vector&gt;
+
</ins><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Caps.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
</ins><span class="cx"> 
</span><del>-#include &lt;vector&gt;
-
</del><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> class FramebufferAttachment;
</span><span class="lines">@@ -23,9 +27,14 @@
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+class Renderer11;
</ins><span class="cx"> class RenderTarget11;
</span><del>-struct Workarounds;
</del><ins>+struct WorkaroundsD3D;
+struct Renderer11DeviceCaps;
</ins><span class="cx"> 
</span><ins>+using RenderTargetArray = std::array&lt;RenderTarget11 *, gl::IMPLEMENTATION_MAX_DRAW_BUFFERS&gt;;
+using RTVArray          = std::array&lt;ID3D11RenderTargetView *, gl::IMPLEMENTATION_MAX_DRAW_BUFFERS&gt;;
+
</ins><span class="cx"> namespace gl_d3d11
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -45,25 +54,47 @@
</span><span class="cx"> 
</span><span class="cx"> D3D11_QUERY ConvertQueryType(GLenum queryType);
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace gl_d3d11
</ins><span class="cx"> 
</span><span class="cx"> namespace d3d11_gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+unsigned int GetReservedVertexUniformVectors(D3D_FEATURE_LEVEL featureLevel);
+
+unsigned int GetReservedFragmentUniformVectors(D3D_FEATURE_LEVEL featureLevel);
+
</ins><span class="cx"> GLint GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel);
</span><del>-void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions);
</del><ins>+void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, const Renderer11DeviceCaps &amp;renderer11DeviceCaps, gl::Caps *caps,
+                  gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions, gl::Limitations *limitations);
</ins><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace d3d11_gl
</ins><span class="cx"> 
</span><span class="cx"> namespace d3d11
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+enum ANGLED3D11DeviceType
+{
+    ANGLE_D3D11_DEVICE_TYPE_UNKNOWN,
+    ANGLE_D3D11_DEVICE_TYPE_HARDWARE,
+    ANGLE_D3D11_DEVICE_TYPE_SOFTWARE_REF_OR_NULL,
+    ANGLE_D3D11_DEVICE_TYPE_WARP,
+};
+
+ANGLED3D11DeviceType GetDeviceType(ID3D11Device *device);
+
</ins><span class="cx"> void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset);
</span><span class="cx"> 
</span><del>-void GenerateInitialTextureData(GLint internalFormat, D3D_FEATURE_LEVEL featureLevel, GLuint width, GLuint height, GLuint depth,
-                                GLuint mipLevels, std::vector&lt;D3D11_SUBRESOURCE_DATA&gt; *outSubresourceData,
-                                std::vector&lt; std::vector&lt;BYTE&gt; &gt; *outData);
</del><ins>+void GenerateInitialTextureData(GLint internalFormat,
+                                const Renderer11DeviceCaps &amp;renderer11DeviceCaps,
+                                GLuint width,
+                                GLuint height,
+                                GLuint depth,
+                                GLuint mipLevels,
+                                std::vector&lt;D3D11_SUBRESOURCE_DATA&gt; *outSubresourceData,
+                                std::vector&lt;std::vector&lt;BYTE&gt;&gt; *outData);
</ins><span class="cx"> 
</span><ins>+UINT GetPrimitiveRestartIndex();
+
</ins><span class="cx"> struct PositionTexCoordVertex
</span><span class="cx"> {
</span><span class="cx">     float x, y;
</span><span class="lines">@@ -133,56 +164,263 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;unsigned int N&gt;
-inline ID3D11VertexShader *CompileVS(ID3D11Device *device, const BYTE (&amp;byteCode)[N], const char *name)
</del><ins>+inline ID3D11VertexShader *CompileVS(ID3D11Device *device, const BYTE *byteCode, size_t N, const char *name)
</ins><span class="cx"> {
</span><del>-    ID3D11VertexShader *vs = NULL;
-    HRESULT result = device-&gt;CreateVertexShader(byteCode, N, NULL, &amp;vs);
-    UNUSED_ASSERTION_VARIABLE(result);
</del><ins>+    ID3D11VertexShader *vs = nullptr;
+    HRESULT result = device-&gt;CreateVertexShader(byteCode, N, nullptr, &amp;vs);
</ins><span class="cx">     ASSERT(SUCCEEDED(result));
</span><del>-    SetDebugName(vs, name);
-    return vs;
</del><ins>+    if (SUCCEEDED(result))
+    {
+        SetDebugName(vs, name);
+        return vs;
+    }
+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;unsigned int N&gt;
</span><del>-inline ID3D11GeometryShader *CompileGS(ID3D11Device *device, const BYTE (&amp;byteCode)[N], const char *name)
</del><ins>+ID3D11VertexShader *CompileVS(ID3D11Device *device, const BYTE (&amp;byteCode)[N], const char *name)
</ins><span class="cx"> {
</span><del>-    ID3D11GeometryShader *gs = NULL;
-    HRESULT result = device-&gt;CreateGeometryShader(byteCode, N, NULL, &amp;gs);
-    UNUSED_ASSERTION_VARIABLE(result);
</del><ins>+    return CompileVS(device, byteCode, N, name);
+}
+
+inline ID3D11GeometryShader *CompileGS(ID3D11Device *device, const BYTE *byteCode, size_t N, const char *name)
+{
+    ID3D11GeometryShader *gs = nullptr;
+    HRESULT result = device-&gt;CreateGeometryShader(byteCode, N, nullptr, &amp;gs);
</ins><span class="cx">     ASSERT(SUCCEEDED(result));
</span><del>-    SetDebugName(gs, name);
-    return gs;
</del><ins>+    if (SUCCEEDED(result))
+    {
+        SetDebugName(gs, name);
+        return gs;
+    }
+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;unsigned int N&gt;
</span><del>-inline ID3D11PixelShader *CompilePS(ID3D11Device *device, const BYTE (&amp;byteCode)[N], const char *name)
</del><ins>+ID3D11GeometryShader *CompileGS(ID3D11Device *device, const BYTE (&amp;byteCode)[N], const char *name)
</ins><span class="cx"> {
</span><del>-    ID3D11PixelShader *ps = NULL;
-    HRESULT result = device-&gt;CreatePixelShader(byteCode, N, NULL, &amp;ps);
-    UNUSED_ASSERTION_VARIABLE(result);
</del><ins>+    return CompileGS(device, byteCode, N, name);
+}
+
+inline ID3D11PixelShader *CompilePS(ID3D11Device *device, const BYTE *byteCode, size_t N, const char *name)
+{
+    ID3D11PixelShader *ps = nullptr;
+    HRESULT result = device-&gt;CreatePixelShader(byteCode, N, nullptr, &amp;ps);
</ins><span class="cx">     ASSERT(SUCCEEDED(result));
</span><del>-    SetDebugName(ps, name);
-    return ps;
</del><ins>+    if (SUCCEEDED(result))
+    {
+        SetDebugName(ps, name);
+        return ps;
+    }
+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-// Copy data to small D3D11 buffers, such as for small constant buffers, which use one struct to
-// represent an entire buffer.
-template &lt;class T&gt;
-inline void SetBufferData(ID3D11DeviceContext *context, ID3D11Buffer *constantBuffer, const T &amp;value)
</del><ins>+template &lt;unsigned int N&gt;
+ID3D11PixelShader *CompilePS(ID3D11Device *device, const BYTE (&amp;byteCode)[N], const char *name)
</ins><span class="cx"> {
</span><del>-    D3D11_MAPPED_SUBRESOURCE mappedResource;
-    context-&gt;Map(constantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &amp;mappedResource);
</del><ins>+    return CompilePS(device, byteCode, N, name);
+}
</ins><span class="cx"> 
</span><del>-    memcpy(mappedResource.pData, &amp;value, sizeof(T));
</del><ins>+template &lt;typename ResourceType&gt;
+class LazyResource : public angle::NonCopyable
+{
+  public:
+    LazyResource() : mResource(nullptr), mAssociatedDevice(nullptr) {}
+    virtual ~LazyResource() { release(); }
</ins><span class="cx"> 
</span><del>-    context-&gt;Unmap(constantBuffer, 0);
</del><ins>+    virtual ResourceType *resolve(ID3D11Device *device) = 0;
+    void release() { SafeRelease(mResource); }
+
+  protected:
+    void checkAssociatedDevice(ID3D11Device *device);
+
+    ResourceType *mResource;
+    ID3D11Device *mAssociatedDevice;
+};
+
+template &lt;typename ResourceType&gt;
+void LazyResource&lt;ResourceType&gt;::checkAssociatedDevice(ID3D11Device *device)
+{
+    ASSERT(mAssociatedDevice == nullptr || device == mAssociatedDevice);
+    mAssociatedDevice = device;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Workarounds GenerateWorkarounds(D3D_FEATURE_LEVEL featureLevel);
</del><ins>+template &lt;typename D3D11ShaderType&gt;
+class LazyShader final : public LazyResource&lt;D3D11ShaderType&gt;
+{
+  public:
+    // All parameters must be constexpr. Not supported in VS2013.
+    LazyShader(const BYTE *byteCode,
+               size_t byteCodeSize,
+               const char *name)
+        : mByteCode(byteCode),
+          mByteCodeSize(byteCodeSize),
+          mName(name)
+    {
+    }
</ins><span class="cx"> 
</span><ins>+    D3D11ShaderType *resolve(ID3D11Device *device) override;
+
+  private:
+    const BYTE *mByteCode;
+    size_t mByteCodeSize;
+    const char *mName;
+};
+
+template &lt;&gt;
+inline ID3D11VertexShader *LazyShader&lt;ID3D11VertexShader&gt;::resolve(ID3D11Device *device)
+{
+    checkAssociatedDevice(device);
+    if (mResource == nullptr)
+    {
+        mResource = CompileVS(device, mByteCode, mByteCodeSize, mName);
+    }
+    return mResource;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template &lt;&gt;
+inline ID3D11GeometryShader *LazyShader&lt;ID3D11GeometryShader&gt;::resolve(ID3D11Device *device)
+{
+    checkAssociatedDevice(device);
+    if (mResource == nullptr)
+    {
+        mResource = CompileGS(device, mByteCode, mByteCodeSize, mName);
+    }
+    return mResource;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template &lt;&gt;
+inline ID3D11PixelShader *LazyShader&lt;ID3D11PixelShader&gt;::resolve(ID3D11Device *device)
+{
+    checkAssociatedDevice(device);
+    if (mResource == nullptr)
+    {
+        mResource = CompilePS(device, mByteCode, mByteCodeSize, mName);
+    }
+    return mResource;
+}
+
+class LazyInputLayout final : public LazyResource&lt;ID3D11InputLayout&gt;
+{
+  public:
+    LazyInputLayout(const D3D11_INPUT_ELEMENT_DESC *inputDesc,
+                    size_t inputDescLen,
+                    const BYTE *byteCode,
+                    size_t byteCodeLen,
+                    const char *debugName);
+
+    ID3D11InputLayout *resolve(ID3D11Device *device) override;
+
+  private:
+    std::vector&lt;D3D11_INPUT_ELEMENT_DESC&gt; mInputDesc;
+    size_t mByteCodeLen;
+    const BYTE *mByteCode;
+    const char *mDebugName;
+};
+
+class LazyBlendState final : public LazyResource&lt;ID3D11BlendState&gt;
+{
+  public:
+    LazyBlendState(const D3D11_BLEND_DESC &amp;desc, const char *debugName);
+
+    ID3D11BlendState *resolve(ID3D11Device *device) override;
+
+  private:
+    D3D11_BLEND_DESC mDesc;
+    const char *mDebugName;
+};
+
+// Copy data to small D3D11 buffers, such as for small constant buffers, which use one struct to
+// represent an entire buffer.
+template &lt;class T&gt;
+void SetBufferData(ID3D11DeviceContext *context, ID3D11Buffer *constantBuffer, const T &amp;value)
+{
+    D3D11_MAPPED_SUBRESOURCE mappedResource = {};
+    HRESULT result = context-&gt;Map(constantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &amp;mappedResource);
+    ASSERT(SUCCEEDED(result));
+    if (SUCCEEDED(result))
+    {
+        memcpy(mappedResource.pData, &amp;value, sizeof(T));
+        context-&gt;Unmap(constantBuffer, 0);
+    }
+}
+
+WorkaroundsD3D GenerateWorkarounds(D3D_FEATURE_LEVEL featureLevel);
+
+enum ReservedConstantBufferSlot
+{
+    RESERVED_CONSTANT_BUFFER_SLOT_DEFAULT_UNIFORM_BLOCK = 0,
+    RESERVED_CONSTANT_BUFFER_SLOT_DRIVER                = 1,
+
+    RESERVED_CONSTANT_BUFFER_SLOT_COUNT = 2
+};
+
+void InitConstantBufferDesc(D3D11_BUFFER_DESC *constantBufferDescription, size_t byteWidth);
+}  // namespace d3d11
+
+// A helper class which wraps a 2D or 3D texture.
+class TextureHelper11 : angle::NonCopyable
+{
+  public:
+    TextureHelper11();
+    TextureHelper11(TextureHelper11 &amp;&amp;toCopy);
+    ~TextureHelper11();
+    TextureHelper11 &amp;operator=(TextureHelper11 &amp;&amp;texture);
+
+    static TextureHelper11 MakeAndReference(ID3D11Resource *genericResource,
+                                            d3d11::ANGLEFormat angleFormat);
+    static TextureHelper11 MakeAndPossess2D(ID3D11Texture2D *texToOwn,
+                                            d3d11::ANGLEFormat angleFormat);
+    static TextureHelper11 MakeAndPossess3D(ID3D11Texture3D *texToOwn,
+                                            d3d11::ANGLEFormat angleFormat);
+
+    GLenum getTextureType() const { return mTextureType; }
+    gl::Extents getExtents() const { return mExtents; }
+    DXGI_FORMAT getFormat() const { return mFormat; }
+    d3d11::ANGLEFormat getANGLEFormat() const { return mANGLEFormat; }
+    int getSampleCount() const { return mSampleCount; }
+    ID3D11Texture2D *getTexture2D() const { return mTexture2D; }
+    ID3D11Texture3D *getTexture3D() const { return mTexture3D; }
+    ID3D11Resource *getResource() const;
+
+  private:
+    void reset();
+    void initDesc();
+
+    GLenum mTextureType;
+    gl::Extents mExtents;
+    DXGI_FORMAT mFormat;
+    d3d11::ANGLEFormat mANGLEFormat;
+    int mSampleCount;
+    ID3D11Texture2D *mTexture2D;
+    ID3D11Texture3D *mTexture3D;
+};
+
+gl::ErrorOrResult&lt;TextureHelper11&gt; CreateStagingTexture(GLenum textureType,
+                                                        DXGI_FORMAT dxgiFormat,
+                                                        d3d11::ANGLEFormat angleFormat,
+                                                        const gl::Extents &amp;size,
+                                                        ID3D11Device *device);
+
+bool UsePresentPathFast(const Renderer11 *renderer, const gl::FramebufferAttachment *colorbuffer);
+
+using NotificationCallback = std::function&lt;void()&gt;;
+
+class NotificationSet final : angle::NonCopyable
+{
+  public:
+    NotificationSet();
+    ~NotificationSet();
+
+    void add(const NotificationCallback *callback);
+    void remove(const NotificationCallback *callback);
+    void signal() const;
+    void clear();
+
+  private:
+    std::set&lt;const NotificationCallback *&gt; mCallbacks;
+};
+
+}  // namespace rx
+
</ins><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERER11_UTILS_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledbuffertotexture11_gsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_gs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,165 +1,165 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_Position              0   xyzw        0      POS   float   xyzw
-// TEXCOORD                 0   x           1     NONE    uint   x   
-// LAYER                    0    y          1     NONE    uint    y  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_Position              0   xyzw        0      POS   float   xyzw
-// TEXCOORD                 0   x           1     NONE    uint   x   
-// SV_RenderTargetArrayIndex     0    y          1  RTINDEX    uint    y  
-//
-gs_4_0
-dcl_input_siv v[1][0].xyzw, position
-dcl_input v[1][1].x
-dcl_input v[1][1].y
-dcl_inputprimitive point 
-dcl_outputtopology pointlist 
-dcl_output_siv o0.xyzw, position
-dcl_output o1.x
-dcl_output_siv o1.y, rendertarget_array_index
-dcl_maxout 1
-mov o0.xyzw, v[0][0].xyzw
-mov o1.x, v[0][1].x
-mov o1.y, v[0][1].y
-emit 
-ret 
-// Approximately 5 instruction slots used
-#endif
-
-const BYTE g_GS_BufferToTexture[] =
-{
-     68,  88,  66,  67,  79, 166, 
-    191,  97,  16,  63, 142, 167, 
-    231,  92, 119,  74,  86,   7, 
-     58, 165,   1,   0,   0,   0, 
-    212,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    140,   0,   0,   0,   0,   1, 
-      0,   0, 136,   1,   0,   0, 
-     88,   2,   0,   0,  82,  68, 
-     69,  70,  80,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-     83,  71,   0,   1,   0,   0, 
-     28,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-    108,   0,   0,   0,   3,   0, 
-      0,   0,   8,   0,   0,   0, 
-     80,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,  15,   0,   0, 
-     92,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,   1,   1,   0,   0, 
-    101,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,   2,   2,   0,   0, 
-     83,  86,  95,  80, 111, 115, 
-    105, 116, 105, 111, 110,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0,  76,  65,  89, 
-     69,  82,   0, 171,  79,  83, 
-     71,  78, 128,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,  14, 
-      0,   0, 101,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   2,  13, 
-      0,   0,  83,  86,  95,  80, 
-    111, 115, 105, 116, 105, 111, 
-    110,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0,  83, 
-     86,  95,  82, 101, 110, 100, 
-    101, 114,  84,  97, 114, 103, 
-    101, 116,  65, 114, 114,  97, 
-    121,  73, 110, 100, 101, 120, 
-      0, 171,  83,  72,  68,  82, 
-    200,   0,   0,   0,  64,   0, 
-      2,   0,  50,   0,   0,   0, 
-     97,   0,   0,   5, 242,  16, 
-     32,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  95,   0,   0,   4, 
-     18,  16,  32,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-     95,   0,   0,   4,  34,  16, 
-     32,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,  93,   8, 
-      0,   1,  92,   8,   0,   1, 
-    103,   0,   0,   4, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3,  18,  32,  16,   0, 
-      1,   0,   0,   0, 103,   0, 
-      0,   4,  34,  32,  16,   0, 
-      1,   0,   0,   0,   4,   0, 
-      0,   0,  94,   0,   0,   2, 
-      1,   0,   0,   0,  54,   0, 
-      0,   6, 242,  32,  16,   0, 
-      0,   0,   0,   0,  70,  30, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  32,  16,   0, 
-      1,   0,   0,   0,  10,  16, 
-     32,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   6,  34,  32,  16,   0, 
-      1,   0,   0,   0,  26,  16, 
-     32,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,  19,   0, 
-      0,   1,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   5,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   6,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_Position              0   xyzw        0      POS   float   xyzw
+// TEXCOORD                 0   x           1     NONE    uint   x   
+// LAYER                    0    y          1     NONE    uint    y  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_Position              0   xyzw        0      POS   float   xyzw
+// TEXCOORD                 0   x           1     NONE    uint   x   
+// SV_RenderTargetArrayIndex     0    y          1  RTINDEX    uint    y  
+//
+gs_4_0
+dcl_input_siv v[1][0].xyzw, position
+dcl_input v[1][1].x
+dcl_input v[1][1].y
+dcl_inputprimitive point 
+dcl_outputtopology pointlist 
+dcl_output_siv o0.xyzw, position
+dcl_output o1.x
+dcl_output_siv o1.y, rendertarget_array_index
+dcl_maxout 1
+mov o0.xyzw, v[0][0].xyzw
+mov o1.x, v[0][1].x
+mov o1.y, v[0][1].y
+emit 
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_GS_BufferToTexture[] =
+{
+     68,  88,  66,  67,  79, 166, 
+    191,  97,  16,  63, 142, 167, 
+    231,  92, 119,  74,  86,   7, 
+     58, 165,   1,   0,   0,   0, 
+    212,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    140,   0,   0,   0,   0,   1, 
+      0,   0, 136,   1,   0,   0, 
+     88,   2,   0,   0,  82,  68, 
+     69,  70,  80,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+     83,  71,   0,   1,   0,   0, 
+     28,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+    108,   0,   0,   0,   3,   0, 
+      0,   0,   8,   0,   0,   0, 
+     80,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,  15,   0,   0, 
+     92,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   1,   1,   0,   0, 
+    101,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   2,   2,   0,   0, 
+     83,  86,  95,  80, 111, 115, 
+    105, 116, 105, 111, 110,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0,  76,  65,  89, 
+     69,  82,   0, 171,  79,  83, 
+     71,  78, 128,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,  14, 
+      0,   0, 101,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   2,  13, 
+      0,   0,  83,  86,  95,  80, 
+    111, 115, 105, 116, 105, 111, 
+    110,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0,  83, 
+     86,  95,  82, 101, 110, 100, 
+    101, 114,  84,  97, 114, 103, 
+    101, 116,  65, 114, 114,  97, 
+    121,  73, 110, 100, 101, 120, 
+      0, 171,  83,  72,  68,  82, 
+    200,   0,   0,   0,  64,   0, 
+      2,   0,  50,   0,   0,   0, 
+     97,   0,   0,   5, 242,  16, 
+     32,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  95,   0,   0,   4, 
+     18,  16,  32,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+     95,   0,   0,   4,  34,  16, 
+     32,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,  93,   8, 
+      0,   1,  92,   8,   0,   1, 
+    103,   0,   0,   4, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3,  18,  32,  16,   0, 
+      1,   0,   0,   0, 103,   0, 
+      0,   4,  34,  32,  16,   0, 
+      1,   0,   0,   0,   4,   0, 
+      0,   0,  94,   0,   0,   2, 
+      1,   0,   0,   0,  54,   0, 
+      0,   6, 242,  32,  16,   0, 
+      0,   0,   0,   0,  70,  30, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  32,  16,   0, 
+      1,   0,   0,   0,  10,  16, 
+     32,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   6,  34,  32,  16,   0, 
+      1,   0,   0,   0,  26,  16, 
+     32,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,  19,   0, 
+      0,   1,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   5,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   6,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledbuffertotexture11_ps_4fh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4f.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,229 +1,229 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer BufferCopyParams
-// {
-//
-//   uint FirstPixelOffset;             // Offset:    0 Size:     4 [unused]
-//   uint PixelsPerRow;                 // Offset:    4 Size:     4 [unused]
-//   uint RowStride;                    // Offset:    8 Size:     4 [unused]
-//   uint RowsPerSlice;                 // Offset:   12 Size:     4 [unused]
-//   float2 PositionOffset;             // Offset:   16 Size:     8 [unused]
-//   float2 PositionScale;              // Offset:   24 Size:     8 [unused]
-//   int2 TexLocationOffset;            // Offset:   32 Size:     8 [unused]
-//   int2 TexLocationScale;             // Offset:   40 Size:     8 [unused]
-//   uint FirstSlice;                   // Offset:   48 Size:     4 [unused]
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Buffer4F                          texture  float4         buf    0        1
-// BufferCopyParams                  cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_Position              0   xyzw        0      POS   float       
-// TEXCOORD                 0   x           1     NONE    uint   x   
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_Target                0   xyzw        0   TARGET   float   xyzw
-//
-ps_4_0
-dcl_constantbuffer cb0[1], immediateIndexed
-dcl_resource_buffer (float,float,float,float) t0
-dcl_input_ps constant v1.x
-dcl_output o0.xyzw
-ld o0.xyzw, v1.xxxx, t0.xyzw
-ret 
-// Approximately 2 instruction slots used
-#endif
-
-const BYTE g_PS_BufferToTexture_4F[] =
-{
-     68,  88,  66,  67, 176,  15, 
-     76, 123, 100,  38, 152,  23, 
-    150,  99, 165, 184, 222, 157, 
-    235,  80,   1,   0,   0,   0, 
-    252,   3,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    140,   2,   0,   0, 228,   2, 
-      0,   0,  24,   3,   0,   0, 
-    128,   3,   0,   0,  82,  68, 
-     69,  70,  80,   2,   0,   0, 
-      1,   0,   0,   0, 120,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     28,   2,   0,   0,  92,   0, 
-      0,   0,   2,   0,   0,   0, 
-      5,   0,   0,   0,   1,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-    101,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,  66, 117, 102, 102, 
-    101, 114,  52,  70,   0,  66, 
-    117, 102, 102, 101, 114,  67, 
-    111, 112, 121,  80,  97, 114, 
-     97, 109, 115,   0, 171, 171, 
-    101,   0,   0,   0,   9,   0, 
-      0,   0, 144,   0,   0,   0, 
-     64,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    104,   1,   0,   0,   0,   0, 
-      0,   0,   4,   0,   0,   0, 
-      0,   0,   0,   0, 124,   1, 
-      0,   0,   0,   0,   0,   0, 
-    140,   1,   0,   0,   4,   0, 
-      0,   0,   4,   0,   0,   0, 
-      0,   0,   0,   0, 124,   1, 
-      0,   0,   0,   0,   0,   0, 
-    153,   1,   0,   0,   8,   0, 
-      0,   0,   4,   0,   0,   0, 
-      0,   0,   0,   0, 124,   1, 
-      0,   0,   0,   0,   0,   0, 
-    163,   1,   0,   0,  12,   0, 
-      0,   0,   4,   0,   0,   0, 
-      0,   0,   0,   0, 124,   1, 
-      0,   0,   0,   0,   0,   0, 
-    176,   1,   0,   0,  16,   0, 
-      0,   0,   8,   0,   0,   0, 
-      0,   0,   0,   0, 192,   1, 
-      0,   0,   0,   0,   0,   0, 
-    208,   1,   0,   0,  24,   0, 
-      0,   0,   8,   0,   0,   0, 
-      0,   0,   0,   0, 192,   1, 
-      0,   0,   0,   0,   0,   0, 
-    222,   1,   0,   0,  32,   0, 
-      0,   0,   8,   0,   0,   0, 
-      0,   0,   0,   0, 240,   1, 
-      0,   0,   0,   0,   0,   0, 
-      0,   2,   0,   0,  40,   0, 
-      0,   0,   8,   0,   0,   0, 
-      0,   0,   0,   0, 240,   1, 
-      0,   0,   0,   0,   0,   0, 
-     17,   2,   0,   0,  48,   0, 
-      0,   0,   4,   0,   0,   0, 
-      0,   0,   0,   0, 124,   1, 
-      0,   0,   0,   0,   0,   0, 
-     70, 105, 114, 115, 116,  80, 
-    105, 120, 101, 108,  79, 102, 
-    102, 115, 101, 116,   0, 171, 
-    171, 171,   0,   0,  19,   0, 
-      1,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     80, 105, 120, 101, 108, 115, 
-     80, 101, 114,  82, 111, 119, 
-      0,  82, 111, 119,  83, 116, 
-    114, 105, 100, 101,   0,  82, 
-    111, 119, 115,  80, 101, 114, 
-     83, 108, 105,  99, 101,   0, 
-     80, 111, 115, 105, 116, 105, 
-    111, 110,  79, 102, 102, 115, 
-    101, 116,   0, 171,   1,   0, 
-      3,   0,   1,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  80, 111, 115, 105, 
-    116, 105, 111, 110,  83,  99, 
-     97, 108, 101,   0,  84, 101, 
-    120,  76, 111,  99,  97, 116, 
-    105, 111, 110,  79, 102, 102, 
-    115, 101, 116,   0,   1,   0, 
-      2,   0,   1,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  84, 101, 120,  76, 
-    111,  99,  97, 116, 105, 111, 
-    110,  83,  99,  97, 108, 101, 
-      0,  70, 105, 114, 115, 116, 
-     83, 108, 105,  99, 101,   0, 
-     77, 105,  99, 114, 111, 115, 
-    111, 102, 116,  32,  40,  82, 
-     41,  32,  72,  76,  83,  76, 
-     32,  83, 104,  97, 100, 101, 
-    114,  32,  67, 111, 109, 112, 
-    105, 108, 101, 114,  32,  54, 
-     46,  51,  46,  57,  54,  48, 
-     48,  46,  49,  54,  51,  56, 
-     52,   0, 171, 171,  73,  83, 
-     71,  78,  80,   0,   0,   0, 
-      2,   0,   0,   0,   8,   0, 
-      0,   0,  56,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  68,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,   1, 
-      0,   0,  83,  86,  95,  80, 
-    111, 115, 105, 116, 105, 111, 
-    110,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0, 171, 
-    171, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  97, 114, 
-    103, 101, 116,   0, 171, 171, 
-     83,  72,  68,  82,  96,   0, 
-      0,   0,  64,   0,   0,   0, 
-     24,   0,   0,   0,  89,   0, 
-      0,   4,  70, 142,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  88,   8,   0,   4, 
-      0, 112,  16,   0,   0,   0, 
-      0,   0,  85,  85,   0,   0, 
-     98,   8,   0,   3,  18,  16, 
-     16,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-     45,   0,   0,   7, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-      6,  16,  16,   0,   1,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer BufferCopyParams
+// {
+//
+//   uint FirstPixelOffset;             // Offset:    0 Size:     4 [unused]
+//   uint PixelsPerRow;                 // Offset:    4 Size:     4 [unused]
+//   uint RowStride;                    // Offset:    8 Size:     4 [unused]
+//   uint RowsPerSlice;                 // Offset:   12 Size:     4 [unused]
+//   float2 PositionOffset;             // Offset:   16 Size:     8 [unused]
+//   float2 PositionScale;              // Offset:   24 Size:     8 [unused]
+//   int2 TexLocationOffset;            // Offset:   32 Size:     8 [unused]
+//   int2 TexLocationScale;             // Offset:   40 Size:     8 [unused]
+//   uint FirstSlice;                   // Offset:   48 Size:     4 [unused]
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Buffer4F                          texture  float4         buf    0        1
+// BufferCopyParams                  cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_Position              0   xyzw        0      POS   float       
+// TEXCOORD                 0   x           1     NONE    uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_Target                0   xyzw        0   TARGET   float   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_buffer (float,float,float,float) t0
+dcl_input_ps constant v1.x
+dcl_output o0.xyzw
+ld o0.xyzw, v1.xxxx, t0.xyzw
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_BufferToTexture_4F[] =
+{
+     68,  88,  66,  67, 176,  15, 
+     76, 123, 100,  38, 152,  23, 
+    150,  99, 165, 184, 222, 157, 
+    235,  80,   1,   0,   0,   0, 
+    252,   3,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    140,   2,   0,   0, 228,   2, 
+      0,   0,  24,   3,   0,   0, 
+    128,   3,   0,   0,  82,  68, 
+     69,  70,  80,   2,   0,   0, 
+      1,   0,   0,   0, 120,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     28,   2,   0,   0,  92,   0, 
+      0,   0,   2,   0,   0,   0, 
+      5,   0,   0,   0,   1,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+    101,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  66, 117, 102, 102, 
+    101, 114,  52,  70,   0,  66, 
+    117, 102, 102, 101, 114,  67, 
+    111, 112, 121,  80,  97, 114, 
+     97, 109, 115,   0, 171, 171, 
+    101,   0,   0,   0,   9,   0, 
+      0,   0, 144,   0,   0,   0, 
+     64,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    104,   1,   0,   0,   0,   0, 
+      0,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0, 124,   1, 
+      0,   0,   0,   0,   0,   0, 
+    140,   1,   0,   0,   4,   0, 
+      0,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0, 124,   1, 
+      0,   0,   0,   0,   0,   0, 
+    153,   1,   0,   0,   8,   0, 
+      0,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0, 124,   1, 
+      0,   0,   0,   0,   0,   0, 
+    163,   1,   0,   0,  12,   0, 
+      0,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0, 124,   1, 
+      0,   0,   0,   0,   0,   0, 
+    176,   1,   0,   0,  16,   0, 
+      0,   0,   8,   0,   0,   0, 
+      0,   0,   0,   0, 192,   1, 
+      0,   0,   0,   0,   0,   0, 
+    208,   1,   0,   0,  24,   0, 
+      0,   0,   8,   0,   0,   0, 
+      0,   0,   0,   0, 192,   1, 
+      0,   0,   0,   0,   0,   0, 
+    222,   1,   0,   0,  32,   0, 
+      0,   0,   8,   0,   0,   0, 
+      0,   0,   0,   0, 240,   1, 
+      0,   0,   0,   0,   0,   0, 
+      0,   2,   0,   0,  40,   0, 
+      0,   0,   8,   0,   0,   0, 
+      0,   0,   0,   0, 240,   1, 
+      0,   0,   0,   0,   0,   0, 
+     17,   2,   0,   0,  48,   0, 
+      0,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0, 124,   1, 
+      0,   0,   0,   0,   0,   0, 
+     70, 105, 114, 115, 116,  80, 
+    105, 120, 101, 108,  79, 102, 
+    102, 115, 101, 116,   0, 171, 
+    171, 171,   0,   0,  19,   0, 
+      1,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     80, 105, 120, 101, 108, 115, 
+     80, 101, 114,  82, 111, 119, 
+      0,  82, 111, 119,  83, 116, 
+    114, 105, 100, 101,   0,  82, 
+    111, 119, 115,  80, 101, 114, 
+     83, 108, 105,  99, 101,   0, 
+     80, 111, 115, 105, 116, 105, 
+    111, 110,  79, 102, 102, 115, 
+    101, 116,   0, 171,   1,   0, 
+      3,   0,   1,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  80, 111, 115, 105, 
+    116, 105, 111, 110,  83,  99, 
+     97, 108, 101,   0,  84, 101, 
+    120,  76, 111,  99,  97, 116, 
+    105, 111, 110,  79, 102, 102, 
+    115, 101, 116,   0,   1,   0, 
+      2,   0,   1,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  84, 101, 120,  76, 
+    111,  99,  97, 116, 105, 111, 
+    110,  83,  99,  97, 108, 101, 
+      0,  70, 105, 114, 115, 116, 
+     83, 108, 105,  99, 101,   0, 
+     77, 105,  99, 114, 111, 115, 
+    111, 102, 116,  32,  40,  82, 
+     41,  32,  72,  76,  83,  76, 
+     32,  83, 104,  97, 100, 101, 
+    114,  32,  67, 111, 109, 112, 
+    105, 108, 101, 114,  32,  54, 
+     46,  51,  46,  57,  54,  48, 
+     48,  46,  49,  54,  51,  56, 
+     52,   0, 171, 171,  73,  83, 
+     71,  78,  80,   0,   0,   0, 
+      2,   0,   0,   0,   8,   0, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  68,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   1, 
+      0,   0,  83,  86,  95,  80, 
+    111, 115, 105, 116, 105, 111, 
+    110,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0, 171, 
+    171, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  97, 114, 
+    103, 101, 116,   0, 171, 171, 
+     83,  72,  68,  82,  96,   0, 
+      0,   0,  64,   0,   0,   0, 
+     24,   0,   0,   0,  89,   0, 
+      0,   4,  70, 142,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  88,   8,   0,   4, 
+      0, 112,  16,   0,   0,   0, 
+      0,   0,  85,  85,   0,   0, 
+     98,   8,   0,   3,  18,  16, 
+     16,   0,   1,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+     45,   0,   0,   7, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+      6,  16,  16,   0,   1,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledbuffertotexture11_ps_4ih"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4i.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,128 +1,128 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Buffer4I                          texture   sint4         buf    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_Position              0   xyzw        0      POS   float       
-// TEXCOORD                 0   x           1     NONE    uint   x   
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_Target                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_resource_buffer (sint,sint,sint,sint) t0
-dcl_input_ps constant v1.x
-dcl_output o0.xyzw
-ld o0.xyzw, v1.xxxx, t0.xyzw
-ret 
-// Approximately 2 instruction slots used
-#endif
-
-const BYTE g_PS_BufferToTexture_4I[] =
-{
-     68,  88,  66,  67, 154, 139, 
-     95, 210,  76,  52, 228,  55, 
-      1, 175,  60,  90,  13, 234, 
-    138,   3,   1,   0,   0,   0, 
-     20,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  12,   1, 
-      0,   0,  64,   1,   0,   0, 
-    152,   1,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     69,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     66, 117, 102, 102, 101, 114, 
-     52,  73,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   1,   0,   0,  83,  86, 
-     95,  80, 111, 115, 105, 116, 
-    105, 111, 110,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     97, 114, 103, 101, 116,   0, 
-    171, 171,  83,  72,  68,  82, 
-     80,   0,   0,   0,  64,   0, 
-      0,   0,  20,   0,   0,   0, 
-     88,   8,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     51,  51,   0,   0,  98,   8, 
-      0,   3,  18,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0,  45,   0, 
-      0,   7, 242,  32,  16,   0, 
-      0,   0,   0,   0,   6,  16, 
-     16,   0,   1,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Buffer4I                          texture   sint4         buf    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_Position              0   xyzw        0      POS   float       
+// TEXCOORD                 0   x           1     NONE    uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_Target                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_resource_buffer (sint,sint,sint,sint) t0
+dcl_input_ps constant v1.x
+dcl_output o0.xyzw
+ld o0.xyzw, v1.xxxx, t0.xyzw
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_BufferToTexture_4I[] =
+{
+     68,  88,  66,  67, 154, 139, 
+     95, 210,  76,  52, 228,  55, 
+      1, 175,  60,  90,  13, 234, 
+    138,   3,   1,   0,   0,   0, 
+     20,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  12,   1, 
+      0,   0,  64,   1,   0,   0, 
+    152,   1,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     69,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     66, 117, 102, 102, 101, 114, 
+     52,  73,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   1,   0,   0,  83,  86, 
+     95,  80, 111, 115, 105, 116, 
+    105, 111, 110,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     97, 114, 103, 101, 116,   0, 
+    171, 171,  83,  72,  68,  82, 
+     80,   0,   0,   0,  64,   0, 
+      0,   0,  20,   0,   0,   0, 
+     88,   8,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     51,  51,   0,   0,  98,   8, 
+      0,   3,  18,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0,  45,   0, 
+      0,   7, 242,  32,  16,   0, 
+      0,   0,   0,   0,   6,  16, 
+     16,   0,   1,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledbuffertotexture11_ps_4uih"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_ps_4ui.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,128 +1,128 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Buffer4UI                         texture   uint4         buf    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_Position              0   xyzw        0      POS   float       
-// TEXCOORD                 0   x           1     NONE    uint   x   
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_Target                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_resource_buffer (uint,uint,uint,uint) t0
-dcl_input_ps constant v1.x
-dcl_output o0.xyzw
-ld o0.xyzw, v1.xxxx, t0.xyzw
-ret 
-// Approximately 2 instruction slots used
-#endif
-
-const BYTE g_PS_BufferToTexture_4UI[] =
-{
-     68,  88,  66,  67,  25, 164, 
-      1, 224, 250, 219,  16, 200, 
-     83,  99,  38, 137, 116, 129, 
-    200,  39,   1,   0,   0,   0, 
-     20,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  12,   1, 
-      0,   0,  64,   1,   0,   0, 
-    152,   1,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     70,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     66, 117, 102, 102, 101, 114, 
-     52,  85,  73,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   1,   0,   0,  83,  86, 
-     95,  80, 111, 115, 105, 116, 
-    105, 111, 110,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     97, 114, 103, 101, 116,   0, 
-    171, 171,  83,  72,  68,  82, 
-     80,   0,   0,   0,  64,   0, 
-      0,   0,  20,   0,   0,   0, 
-     88,   8,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     68,  68,   0,   0,  98,   8, 
-      0,   3,  18,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0,  45,   0, 
-      0,   7, 242,  32,  16,   0, 
-      0,   0,   0,   0,   6,  16, 
-     16,   0,   1,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Buffer4UI                         texture   uint4         buf    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_Position              0   xyzw        0      POS   float       
+// TEXCOORD                 0   x           1     NONE    uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_Target                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_resource_buffer (uint,uint,uint,uint) t0
+dcl_input_ps constant v1.x
+dcl_output o0.xyzw
+ld o0.xyzw, v1.xxxx, t0.xyzw
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_BufferToTexture_4UI[] =
+{
+     68,  88,  66,  67,  25, 164, 
+      1, 224, 250, 219,  16, 200, 
+     83,  99,  38, 137, 116, 129, 
+    200,  39,   1,   0,   0,   0, 
+     20,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  12,   1, 
+      0,   0,  64,   1,   0,   0, 
+    152,   1,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     70,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     66, 117, 102, 102, 101, 114, 
+     52,  85,  73,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   1,   0,   0,  83,  86, 
+     95,  80, 111, 115, 105, 116, 
+    105, 111, 110,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     97, 114, 103, 101, 116,   0, 
+    171, 171,  83,  72,  68,  82, 
+     80,   0,   0,   0,  64,   0, 
+      0,   0,  20,   0,   0,   0, 
+     88,   8,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     68,  68,   0,   0,  98,   8, 
+      0,   3,  18,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0,  45,   0, 
+      0,   7, 242,  32,  16,   0, 
+      0,   0,   0,   0,   6,  16, 
+     16,   0,   1,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledbuffertotexture11_vsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/buffertotexture11_vs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,311 +1,311 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer BufferCopyParams
-// {
-//
-//   uint FirstPixelOffset;             // Offset:    0 Size:     4
-//   uint PixelsPerRow;                 // Offset:    4 Size:     4
-//   uint RowStride;                    // Offset:    8 Size:     4
-//   uint RowsPerSlice;                 // Offset:   12 Size:     4
-//   float2 PositionOffset;             // Offset:   16 Size:     8
-//   float2 PositionScale;              // Offset:   24 Size:     8
-//   int2 TexLocationOffset;            // Offset:   32 Size:     8 [unused]
-//   int2 TexLocationScale;             // Offset:   40 Size:     8 [unused]
-//   uint FirstSlice;                   // Offset:   48 Size:     4
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// BufferCopyParams                  cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_VertexID              0   x           0   VERTID    uint   x   
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_Position              0   xyzw        0      POS   float   xyzw
-// TEXCOORD                 0   x           1     NONE    uint   x   
-// LAYER                    0    y          1     NONE    uint    y  
-//
-vs_4_0
-dcl_constantbuffer cb0[4], immediateIndexed
-dcl_input_sgv v0.x, vertex_id
-dcl_output_siv o0.xyzw, position
-dcl_output o1.x
-dcl_output o1.y
-dcl_temps 2
-mov o0.zw, l(0,0,0,1.000000)
-imul null, r0.xy, cb0[0].wwww, cb0[0].yzyy
-udiv r0.z, null, v0.x, r0.x
-imad r0.x, -r0.z, r0.x, v0.x
-imad r0.y, r0.z, r0.y, cb0[0].x
-iadd o1.y, r0.z, cb0[3].x
-udiv r0.z, null, r0.x, cb0[0].y
-imad r0.x, -r0.z, cb0[0].y, r0.x
-utof r1.xy, r0.xzxx
-imad r0.y, r0.z, cb0[0].z, r0.y
-iadd o1.x, r0.x, r0.y
-mad o0.xy, cb0[1].zwzz, r1.xyxx, cb0[1].xyxx
-ret 
-// Approximately 13 instruction slots used
-#endif
-
-const BYTE g_VS_BufferToTexture[] =
-{
-     68,  88,  66,  67,  39, 207, 
-    138,  15,  42, 195, 141, 208, 
-      2, 107, 135, 197, 122,  36, 
-    114, 227,   1,   0,   0,   0, 
-    152,   5,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    100,   2,   0,   0, 152,   2, 
-      0,   0,  12,   3,   0,   0, 
-     28,   5,   0,   0,  82,  68, 
-     69,  70,  40,   2,   0,   0, 
-      1,   0,   0,   0,  80,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    254, 255,   0,   1,   0,   0, 
-    244,   1,   0,   0,  60,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-     66, 117, 102, 102, 101, 114, 
-     67, 111, 112, 121,  80,  97, 
-    114,  97, 109, 115,   0, 171, 
-    171, 171,  60,   0,   0,   0, 
-      9,   0,   0,   0, 104,   0, 
-      0,   0,  64,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  64,   1,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   2,   0,   0,   0, 
-     84,   1,   0,   0,   0,   0, 
-      0,   0, 100,   1,   0,   0, 
-      4,   0,   0,   0,   4,   0, 
-      0,   0,   2,   0,   0,   0, 
-     84,   1,   0,   0,   0,   0, 
-      0,   0, 113,   1,   0,   0, 
-      8,   0,   0,   0,   4,   0, 
-      0,   0,   2,   0,   0,   0, 
-     84,   1,   0,   0,   0,   0, 
-      0,   0, 123,   1,   0,   0, 
-     12,   0,   0,   0,   4,   0, 
-      0,   0,   2,   0,   0,   0, 
-     84,   1,   0,   0,   0,   0, 
-      0,   0, 136,   1,   0,   0, 
-     16,   0,   0,   0,   8,   0, 
-      0,   0,   2,   0,   0,   0, 
-    152,   1,   0,   0,   0,   0, 
-      0,   0, 168,   1,   0,   0, 
-     24,   0,   0,   0,   8,   0, 
-      0,   0,   2,   0,   0,   0, 
-    152,   1,   0,   0,   0,   0, 
-      0,   0, 182,   1,   0,   0, 
-     32,   0,   0,   0,   8,   0, 
-      0,   0,   0,   0,   0,   0, 
-    200,   1,   0,   0,   0,   0, 
-      0,   0, 216,   1,   0,   0, 
-     40,   0,   0,   0,   8,   0, 
-      0,   0,   0,   0,   0,   0, 
-    200,   1,   0,   0,   0,   0, 
-      0,   0, 233,   1,   0,   0, 
-     48,   0,   0,   0,   4,   0, 
-      0,   0,   2,   0,   0,   0, 
-     84,   1,   0,   0,   0,   0, 
-      0,   0,  70, 105, 114, 115, 
-    116,  80, 105, 120, 101, 108, 
-     79, 102, 102, 115, 101, 116, 
-      0, 171, 171, 171,   0,   0, 
-     19,   0,   1,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  80, 105, 120, 101, 
-    108, 115,  80, 101, 114,  82, 
-    111, 119,   0,  82, 111, 119, 
-     83, 116, 114, 105, 100, 101, 
-      0,  82, 111, 119, 115,  80, 
-    101, 114,  83, 108, 105,  99, 
-    101,   0,  80, 111, 115, 105, 
-    116, 105, 111, 110,  79, 102, 
-    102, 115, 101, 116,   0, 171, 
-      1,   0,   3,   0,   1,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  80, 111, 
-    115, 105, 116, 105, 111, 110, 
-     83,  99,  97, 108, 101,   0, 
-     84, 101, 120,  76, 111,  99, 
-     97, 116, 105, 111, 110,  79, 
-    102, 102, 115, 101, 116,   0, 
-      1,   0,   2,   0,   1,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  84, 101, 
-    120,  76, 111,  99,  97, 116, 
-    105, 111, 110,  83,  99,  97, 
-    108, 101,   0,  70, 105, 114, 
-    115, 116,  83, 108, 105,  99, 
-    101,   0,  77, 105,  99, 114, 
-    111, 115, 111, 102, 116,  32, 
-     40,  82,  41,  32,  72,  76, 
-     83,  76,  32,  83, 104,  97, 
-    100, 101, 114,  32,  67, 111, 
-    109, 112, 105, 108, 101, 114, 
-     32,  54,  46,  51,  46,  57, 
-     54,  48,  48,  46,  49,  54, 
-     51,  56,  52,   0, 171, 171, 
-     73,  83,  71,  78,  44,   0, 
-      0,   0,   1,   0,   0,   0, 
-      8,   0,   0,   0,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      6,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   1,   0,   0,  83,  86, 
-     95,  86, 101, 114, 116, 101, 
-    120,  73,  68,   0,  79,  83, 
-     71,  78, 108,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,  14, 
-      0,   0, 101,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   2,  13, 
-      0,   0,  83,  86,  95,  80, 
-    111, 115, 105, 116, 105, 111, 
-    110,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0,  76, 
-     65,  89,  69,  82,   0, 171, 
-     83,  72,  68,  82,   8,   2, 
-      0,   0,  64,   0,   1,   0, 
-    130,   0,   0,   0,  89,   0, 
-      0,   4,  70, 142,  32,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,  96,   0,   0,   4, 
-     18,  16,  16,   0,   0,   0, 
-      0,   0,   6,   0,   0,   0, 
-    103,   0,   0,   4, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3,  18,  32,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3,  34,  32,  16,   0, 
-      1,   0,   0,   0, 104,   0, 
-      0,   2,   2,   0,   0,   0, 
-     54,   0,   0,   8, 194,  32, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    128,  63,  38,   0,   0,  10, 
-      0, 208,   0,   0,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-    246, 143,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    150, 133,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     78,   0,   0,   8,  66,   0, 
-     16,   0,   0,   0,   0,   0, 
-      0, 208,   0,   0,  10,  16, 
-     16,   0,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  35,   0,   0,  10, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  42,   0,  16, 128, 
-     65,   0,   0,   0,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  10,  16, 
-     16,   0,   0,   0,   0,   0, 
-     35,   0,   0,  10,  34,   0, 
-     16,   0,   0,   0,   0,   0, 
-     42,   0,  16,   0,   0,   0, 
-      0,   0,  26,   0,  16,   0, 
-      0,   0,   0,   0,  10, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  30,   0, 
-      0,   8,  34,  32,  16,   0, 
-      1,   0,   0,   0,  42,   0, 
-     16,   0,   0,   0,   0,   0, 
-     10, 128,  32,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-     78,   0,   0,   9,  66,   0, 
-     16,   0,   0,   0,   0,   0, 
-      0, 208,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     26, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     35,   0,   0,  11,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     42,   0,  16, 128,  65,   0, 
-      0,   0,   0,   0,   0,   0, 
-     26, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  86,   0,   0,   5, 
-     50,   0,  16,   0,   1,   0, 
-      0,   0, 134,   0,  16,   0, 
-      0,   0,   0,   0,  35,   0, 
-      0,  10,  34,   0,  16,   0, 
-      0,   0,   0,   0,  42,   0, 
-     16,   0,   0,   0,   0,   0, 
-     42, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     26,   0,  16,   0,   0,   0, 
-      0,   0,  30,   0,   0,   7, 
-     18,  32,  16,   0,   1,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  26,   0, 
-     16,   0,   0,   0,   0,   0, 
-     50,   0,   0,  11,  50,  32, 
-     16,   0,   0,   0,   0,   0, 
-    230, 138,  32,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     70,   0,  16,   0,   1,   0, 
-      0,   0,  70, 128,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,  13,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   4,   0,   0,   0, 
-      1,   0,   0,   0,   7,   0, 
-      0,   0,   2,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer BufferCopyParams
+// {
+//
+//   uint FirstPixelOffset;             // Offset:    0 Size:     4
+//   uint PixelsPerRow;                 // Offset:    4 Size:     4
+//   uint RowStride;                    // Offset:    8 Size:     4
+//   uint RowsPerSlice;                 // Offset:   12 Size:     4
+//   float2 PositionOffset;             // Offset:   16 Size:     8
+//   float2 PositionScale;              // Offset:   24 Size:     8
+//   int2 TexLocationOffset;            // Offset:   32 Size:     8 [unused]
+//   int2 TexLocationScale;             // Offset:   40 Size:     8 [unused]
+//   uint FirstSlice;                   // Offset:   48 Size:     4
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// BufferCopyParams                  cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_VertexID              0   x           0   VERTID    uint   x   
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_Position              0   xyzw        0      POS   float   xyzw
+// TEXCOORD                 0   x           1     NONE    uint   x   
+// LAYER                    0    y          1     NONE    uint    y  
+//
+vs_4_0
+dcl_constantbuffer cb0[4], immediateIndexed
+dcl_input_sgv v0.x, vertex_id
+dcl_output_siv o0.xyzw, position
+dcl_output o1.x
+dcl_output o1.y
+dcl_temps 2
+mov o0.zw, l(0,0,0,1.000000)
+imul null, r0.xy, cb0[0].wwww, cb0[0].yzyy
+udiv r0.z, null, v0.x, r0.x
+imad r0.x, -r0.z, r0.x, v0.x
+imad r0.y, r0.z, r0.y, cb0[0].x
+iadd o1.y, r0.z, cb0[3].x
+udiv r0.z, null, r0.x, cb0[0].y
+imad r0.x, -r0.z, cb0[0].y, r0.x
+utof r1.xy, r0.xzxx
+imad r0.y, r0.z, cb0[0].z, r0.y
+iadd o1.x, r0.x, r0.y
+mad o0.xy, cb0[1].zwzz, r1.xyxx, cb0[1].xyxx
+ret 
+// Approximately 13 instruction slots used
+#endif
+
+const BYTE g_VS_BufferToTexture[] =
+{
+     68,  88,  66,  67,  39, 207, 
+    138,  15,  42, 195, 141, 208, 
+      2, 107, 135, 197, 122,  36, 
+    114, 227,   1,   0,   0,   0, 
+    152,   5,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    100,   2,   0,   0, 152,   2, 
+      0,   0,  12,   3,   0,   0, 
+     28,   5,   0,   0,  82,  68, 
+     69,  70,  40,   2,   0,   0, 
+      1,   0,   0,   0,  80,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    254, 255,   0,   1,   0,   0, 
+    244,   1,   0,   0,  60,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+     66, 117, 102, 102, 101, 114, 
+     67, 111, 112, 121,  80,  97, 
+    114,  97, 109, 115,   0, 171, 
+    171, 171,  60,   0,   0,   0, 
+      9,   0,   0,   0, 104,   0, 
+      0,   0,  64,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  64,   1,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   2,   0,   0,   0, 
+     84,   1,   0,   0,   0,   0, 
+      0,   0, 100,   1,   0,   0, 
+      4,   0,   0,   0,   4,   0, 
+      0,   0,   2,   0,   0,   0, 
+     84,   1,   0,   0,   0,   0, 
+      0,   0, 113,   1,   0,   0, 
+      8,   0,   0,   0,   4,   0, 
+      0,   0,   2,   0,   0,   0, 
+     84,   1,   0,   0,   0,   0, 
+      0,   0, 123,   1,   0,   0, 
+     12,   0,   0,   0,   4,   0, 
+      0,   0,   2,   0,   0,   0, 
+     84,   1,   0,   0,   0,   0, 
+      0,   0, 136,   1,   0,   0, 
+     16,   0,   0,   0,   8,   0, 
+      0,   0,   2,   0,   0,   0, 
+    152,   1,   0,   0,   0,   0, 
+      0,   0, 168,   1,   0,   0, 
+     24,   0,   0,   0,   8,   0, 
+      0,   0,   2,   0,   0,   0, 
+    152,   1,   0,   0,   0,   0, 
+      0,   0, 182,   1,   0,   0, 
+     32,   0,   0,   0,   8,   0, 
+      0,   0,   0,   0,   0,   0, 
+    200,   1,   0,   0,   0,   0, 
+      0,   0, 216,   1,   0,   0, 
+     40,   0,   0,   0,   8,   0, 
+      0,   0,   0,   0,   0,   0, 
+    200,   1,   0,   0,   0,   0, 
+      0,   0, 233,   1,   0,   0, 
+     48,   0,   0,   0,   4,   0, 
+      0,   0,   2,   0,   0,   0, 
+     84,   1,   0,   0,   0,   0, 
+      0,   0,  70, 105, 114, 115, 
+    116,  80, 105, 120, 101, 108, 
+     79, 102, 102, 115, 101, 116, 
+      0, 171, 171, 171,   0,   0, 
+     19,   0,   1,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  80, 105, 120, 101, 
+    108, 115,  80, 101, 114,  82, 
+    111, 119,   0,  82, 111, 119, 
+     83, 116, 114, 105, 100, 101, 
+      0,  82, 111, 119, 115,  80, 
+    101, 114,  83, 108, 105,  99, 
+    101,   0,  80, 111, 115, 105, 
+    116, 105, 111, 110,  79, 102, 
+    102, 115, 101, 116,   0, 171, 
+      1,   0,   3,   0,   1,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  80, 111, 
+    115, 105, 116, 105, 111, 110, 
+     83,  99,  97, 108, 101,   0, 
+     84, 101, 120,  76, 111,  99, 
+     97, 116, 105, 111, 110,  79, 
+    102, 102, 115, 101, 116,   0, 
+      1,   0,   2,   0,   1,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  84, 101, 
+    120,  76, 111,  99,  97, 116, 
+    105, 111, 110,  83,  99,  97, 
+    108, 101,   0,  70, 105, 114, 
+    115, 116,  83, 108, 105,  99, 
+    101,   0,  77, 105,  99, 114, 
+    111, 115, 111, 102, 116,  32, 
+     40,  82,  41,  32,  72,  76, 
+     83,  76,  32,  83, 104,  97, 
+    100, 101, 114,  32,  67, 111, 
+    109, 112, 105, 108, 101, 114, 
+     32,  54,  46,  51,  46,  57, 
+     54,  48,  48,  46,  49,  54, 
+     51,  56,  52,   0, 171, 171, 
+     73,  83,  71,  78,  44,   0, 
+      0,   0,   1,   0,   0,   0, 
+      8,   0,   0,   0,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      6,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   1,   0,   0,  83,  86, 
+     95,  86, 101, 114, 116, 101, 
+    120,  73,  68,   0,  79,  83, 
+     71,  78, 108,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,  14, 
+      0,   0, 101,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   2,  13, 
+      0,   0,  83,  86,  95,  80, 
+    111, 115, 105, 116, 105, 111, 
+    110,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0,  76, 
+     65,  89,  69,  82,   0, 171, 
+     83,  72,  68,  82,   8,   2, 
+      0,   0,  64,   0,   1,   0, 
+    130,   0,   0,   0,  89,   0, 
+      0,   4,  70, 142,  32,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,  96,   0,   0,   4, 
+     18,  16,  16,   0,   0,   0, 
+      0,   0,   6,   0,   0,   0, 
+    103,   0,   0,   4, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3,  18,  32,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3,  34,  32,  16,   0, 
+      1,   0,   0,   0, 104,   0, 
+      0,   2,   2,   0,   0,   0, 
+     54,   0,   0,   8, 194,  32, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    128,  63,  38,   0,   0,  10, 
+      0, 208,   0,   0,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+    246, 143,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    150, 133,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     78,   0,   0,   8,  66,   0, 
+     16,   0,   0,   0,   0,   0, 
+      0, 208,   0,   0,  10,  16, 
+     16,   0,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  35,   0,   0,  10, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  42,   0,  16, 128, 
+     65,   0,   0,   0,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  10,  16, 
+     16,   0,   0,   0,   0,   0, 
+     35,   0,   0,  10,  34,   0, 
+     16,   0,   0,   0,   0,   0, 
+     42,   0,  16,   0,   0,   0, 
+      0,   0,  26,   0,  16,   0, 
+      0,   0,   0,   0,  10, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  30,   0, 
+      0,   8,  34,  32,  16,   0, 
+      1,   0,   0,   0,  42,   0, 
+     16,   0,   0,   0,   0,   0, 
+     10, 128,  32,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+     78,   0,   0,   9,  66,   0, 
+     16,   0,   0,   0,   0,   0, 
+      0, 208,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     26, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     35,   0,   0,  11,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     42,   0,  16, 128,  65,   0, 
+      0,   0,   0,   0,   0,   0, 
+     26, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  86,   0,   0,   5, 
+     50,   0,  16,   0,   1,   0, 
+      0,   0, 134,   0,  16,   0, 
+      0,   0,   0,   0,  35,   0, 
+      0,  10,  34,   0,  16,   0, 
+      0,   0,   0,   0,  42,   0, 
+     16,   0,   0,   0,   0,   0, 
+     42, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     26,   0,  16,   0,   0,   0, 
+      0,   0,  30,   0,   0,   7, 
+     18,  32,  16,   0,   1,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  26,   0, 
+     16,   0,   0,   0,   0,   0, 
+     50,   0,   0,  11,  50,  32, 
+     16,   0,   0,   0,   0,   0, 
+    230, 138,  32,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     70,   0,  16,   0,   1,   0, 
+      0,   0,  70, 128,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,  13,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   4,   0,   0,   0, 
+      1,   0,   0,   0,   7,   0, 
+      0,   0,   2,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearfloat11_fl9psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11_fl9ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,176 +1,176 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// COLOR                    0   xyzw        1     NONE   float   xyzw
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-// SV_TARGET                1   xyzw        1   TARGET   float   xyzw
-// SV_TARGET                2   xyzw        2   TARGET   float   xyzw
-// SV_TARGET                3   xyzw        3   TARGET   float   xyzw
-//
-//
-// Level9 shader bytecode:
-//
-    ps_2_x
-    dcl t0
-    mov oC0, t0
-    mov oC1, t0
-    mov oC2, t0
-    mov oC3, t0
-
-// approximately 4 instruction slots used
-ps_4_0
-dcl_input_ps linear v1.xyzw
-dcl_output o0.xyzw
-dcl_output o1.xyzw
-dcl_output o2.xyzw
-dcl_output o3.xyzw
-mov o0.xyzw, v1.xyzw
-mov o1.xyzw, v1.xyzw
-mov o2.xyzw, v1.xyzw
-mov o3.xyzw, v1.xyzw
-ret 
-// Approximately 5 instruction slots used
-#endif
-
-const BYTE g_PS_ClearFloat_FL9[] =
-{
-     68,  88,  66,  67,  36, 167, 
-     59,  21, 253,  46, 206, 132, 
-    254,  28,  18, 118,  51, 115, 
-     45,  31,   1,   0,   0,   0, 
-    236,   2,   0,   0,   6,   0, 
-      0,   0,  56,   0,   0,   0, 
-    168,   0,   0,   0,  72,   1, 
-      0,   0, 196,   1,   0,   0, 
-     28,   2,   0,   0, 112,   2, 
-      0,   0,  65, 111, 110,  57, 
-    104,   0,   0,   0, 104,   0, 
-      0,   0,   0,   2, 255, 255, 
-     68,   0,   0,   0,  36,   0, 
-      0,   0,   0,   0,  36,   0, 
-      0,   0,  36,   0,   0,   0, 
-     36,   0,   0,   0,  36,   0, 
-      0,   0,  36,   0,   1,   2, 
-    255, 255,  31,   0,   0,   2, 
-      0,   0,   0, 128,   0,   0, 
-     15, 176,   1,   0,   0,   2, 
-      0,   8,  15, 128,   0,   0, 
-    228, 176,   1,   0,   0,   2, 
-      1,   8,  15, 128,   0,   0, 
-    228, 176,   1,   0,   0,   2, 
-      2,   8,  15, 128,   0,   0, 
-    228, 176,   1,   0,   0,   2, 
-      3,   8,  15, 128,   0,   0, 
-    228, 176, 255, 255,   0,   0, 
-     83,  72,  68,  82, 152,   0, 
-      0,   0,  64,   0,   0,   0, 
-     38,   0,   0,   0,  98,  16, 
-      0,   3, 242,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      3,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      0,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   1,   0,   0,   0, 
-     70,  30,  16,   0,   1,   0, 
-      0,   0,  54,   0,   0,   5, 
-    242,  32,  16,   0,   2,   0, 
-      0,   0,  70,  30,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      3,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      5,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      5,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  82,  68,  69,  70, 
-     80,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  28,   0, 
-      0,   0,   0,   4, 255, 255, 
-      0,   1,   0,   0,  28,   0, 
-      0,   0,  77, 105,  99, 114, 
-    111, 115, 111, 102, 116,  32, 
-     40,  82,  41,  32,  72,  76, 
-     83,  76,  32,  83, 104,  97, 
-    100, 101, 114,  32,  67, 111, 
-    109, 112, 105, 108, 101, 114, 
-     32,  54,  46,  51,  46,  57, 
-     54,  48,  48,  46,  49,  54, 
-     51,  56,  52,   0, 171, 171, 
-     73,  83,  71,  78,  76,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-     15,  15,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  67,  79, 
-     76,  79,  82,   0, 171, 171, 
-     79,  83,  71,  78, 116,   0, 
-      0,   0,   4,   0,   0,   0, 
-      8,   0,   0,   0, 104,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0, 104,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-     15,   0,   0,   0, 104,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-     15,   0,   0,   0, 104,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   3,   0,   0,   0, 
-     15,   0,   0,   0,  83,  86, 
-     95,  84,  65,  82,  71,  69, 
-     84,   0, 171, 171
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// COLOR                    0   xyzw        1     NONE   float   xyzw
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+// SV_TARGET                1   xyzw        1   TARGET   float   xyzw
+// SV_TARGET                2   xyzw        2   TARGET   float   xyzw
+// SV_TARGET                3   xyzw        3   TARGET   float   xyzw
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    dcl t0
+    mov oC0, t0
+    mov oC1, t0
+    mov oC2, t0
+    mov oC3, t0
+
+// approximately 4 instruction slots used
+ps_4_0
+dcl_input_ps linear v1.xyzw
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+mov o0.xyzw, v1.xyzw
+mov o1.xyzw, v1.xyzw
+mov o2.xyzw, v1.xyzw
+mov o3.xyzw, v1.xyzw
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat_FL9[] =
+{
+     68,  88,  66,  67,  36, 167, 
+     59,  21, 253,  46, 206, 132, 
+    254,  28,  18, 118,  51, 115, 
+     45,  31,   1,   0,   0,   0, 
+    236,   2,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+    168,   0,   0,   0,  72,   1, 
+      0,   0, 196,   1,   0,   0, 
+     28,   2,   0,   0, 112,   2, 
+      0,   0,  65, 111, 110,  57, 
+    104,   0,   0,   0, 104,   0, 
+      0,   0,   0,   2, 255, 255, 
+     68,   0,   0,   0,  36,   0, 
+      0,   0,   0,   0,  36,   0, 
+      0,   0,  36,   0,   0,   0, 
+     36,   0,   0,   0,  36,   0, 
+      0,   0,  36,   0,   1,   2, 
+    255, 255,  31,   0,   0,   2, 
+      0,   0,   0, 128,   0,   0, 
+     15, 176,   1,   0,   0,   2, 
+      0,   8,  15, 128,   0,   0, 
+    228, 176,   1,   0,   0,   2, 
+      1,   8,  15, 128,   0,   0, 
+    228, 176,   1,   0,   0,   2, 
+      2,   8,  15, 128,   0,   0, 
+    228, 176,   1,   0,   0,   2, 
+      3,   8,  15, 128,   0,   0, 
+    228, 176, 255, 255,   0,   0, 
+     83,  72,  68,  82, 152,   0, 
+      0,   0,  64,   0,   0,   0, 
+     38,   0,   0,   0,  98,  16, 
+      0,   3, 242,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      3,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      0,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   1,   0,   0,   0, 
+     70,  30,  16,   0,   1,   0, 
+      0,   0,  54,   0,   0,   5, 
+    242,  32,  16,   0,   2,   0, 
+      0,   0,  70,  30,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      3,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      5,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      5,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  82,  68,  69,  70, 
+     80,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  28,   0, 
+      0,   0,   0,   4, 255, 255, 
+      0,   1,   0,   0,  28,   0, 
+      0,   0,  77, 105,  99, 114, 
+    111, 115, 111, 102, 116,  32, 
+     40,  82,  41,  32,  72,  76, 
+     83,  76,  32,  83, 104,  97, 
+    100, 101, 114,  32,  67, 111, 
+    109, 112, 105, 108, 101, 114, 
+     32,  54,  46,  51,  46,  57, 
+     54,  48,  48,  46,  49,  54, 
+     51,  56,  52,   0, 171, 171, 
+     73,  83,  71,  78,  76,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+     15,  15,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  67,  79, 
+     76,  79,  82,   0, 171, 171, 
+     79,  83,  71,  78, 116,   0, 
+      0,   0,   4,   0,   0,   0, 
+      8,   0,   0,   0, 104,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0, 104,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+     15,   0,   0,   0, 104,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+     15,   0,   0,   0, 104,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   3,   0,   0,   0, 
+     15,   0,   0,   0,  83,  86, 
+     95,  84,  65,  82,  71,  69, 
+     84,   0, 171, 171
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearfloat11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,195 +1,195 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// COLOR                    0   xyzw        1     NONE   float   xyzw
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-// SV_TARGET                1   xyzw        1   TARGET   float   xyzw
-// SV_TARGET                2   xyzw        2   TARGET   float   xyzw
-// SV_TARGET                3   xyzw        3   TARGET   float   xyzw
-// SV_TARGET                4   xyzw        4   TARGET   float   xyzw
-// SV_TARGET                5   xyzw        5   TARGET   float   xyzw
-// SV_TARGET                6   xyzw        6   TARGET   float   xyzw
-// SV_TARGET                7   xyzw        7   TARGET   float   xyzw
-//
-ps_4_0
-dcl_input_ps linear v1.xyzw
-dcl_output o0.xyzw
-dcl_output o1.xyzw
-dcl_output o2.xyzw
-dcl_output o3.xyzw
-dcl_output o4.xyzw
-dcl_output o5.xyzw
-dcl_output o6.xyzw
-dcl_output o7.xyzw
-mov o0.xyzw, v1.xyzw
-mov o1.xyzw, v1.xyzw
-mov o2.xyzw, v1.xyzw
-mov o3.xyzw, v1.xyzw
-mov o4.xyzw, v1.xyzw
-mov o5.xyzw, v1.xyzw
-mov o6.xyzw, v1.xyzw
-mov o7.xyzw, v1.xyzw
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_ClearFloat[] =
-{
-     68,  88,  66,  67,  19,  30, 
-    102,  69, 166, 219, 165,  14, 
-    173,  41, 171, 133, 144,  58, 
-     14, 224,   1,   0,   0,   0, 
-     88,   3,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    140,   0,   0,   0, 224,   0, 
-      0,   0, 188,   1,   0,   0, 
-    220,   2,   0,   0,  82,  68, 
-     69,  70,  80,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     28,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-     76,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     68,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0,  15,  15,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     67,  79,  76,  79,  82,   0, 
-    171, 171,  79,  83,  71,  78, 
-    212,   0,   0,   0,   8,   0, 
-      0,   0,   8,   0,   0,   0, 
-    200,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   2,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   3,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   4,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   4,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   5,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   5,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   6,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   6,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   7,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   7,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82,  24,   1, 
-      0,   0,  64,   0,   0,   0, 
-     70,   0,   0,   0,  98,  16, 
-      0,   3, 242,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      3,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      4,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      5,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      6,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      7,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      0,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   1,   0,   0,   0, 
-     70,  30,  16,   0,   1,   0, 
-      0,   0,  54,   0,   0,   5, 
-    242,  32,  16,   0,   2,   0, 
-      0,   0,  70,  30,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      3,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   4,   0,   0,   0, 
-     70,  30,  16,   0,   1,   0, 
-      0,   0,  54,   0,   0,   5, 
-    242,  32,  16,   0,   5,   0, 
-      0,   0,  70,  30,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      6,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   7,   0,   0,   0, 
-     70,  30,  16,   0,   1,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   9,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   9,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      8,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// COLOR                    0   xyzw        1     NONE   float   xyzw
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+// SV_TARGET                1   xyzw        1   TARGET   float   xyzw
+// SV_TARGET                2   xyzw        2   TARGET   float   xyzw
+// SV_TARGET                3   xyzw        3   TARGET   float   xyzw
+// SV_TARGET                4   xyzw        4   TARGET   float   xyzw
+// SV_TARGET                5   xyzw        5   TARGET   float   xyzw
+// SV_TARGET                6   xyzw        6   TARGET   float   xyzw
+// SV_TARGET                7   xyzw        7   TARGET   float   xyzw
+//
+ps_4_0
+dcl_input_ps linear v1.xyzw
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output o6.xyzw
+dcl_output o7.xyzw
+mov o0.xyzw, v1.xyzw
+mov o1.xyzw, v1.xyzw
+mov o2.xyzw, v1.xyzw
+mov o3.xyzw, v1.xyzw
+mov o4.xyzw, v1.xyzw
+mov o5.xyzw, v1.xyzw
+mov o6.xyzw, v1.xyzw
+mov o7.xyzw, v1.xyzw
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_ClearFloat[] =
+{
+     68,  88,  66,  67,  19,  30, 
+    102,  69, 166, 219, 165,  14, 
+    173,  41, 171, 133, 144,  58, 
+     14, 224,   1,   0,   0,   0, 
+     88,   3,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    140,   0,   0,   0, 224,   0, 
+      0,   0, 188,   1,   0,   0, 
+    220,   2,   0,   0,  82,  68, 
+     69,  70,  80,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     28,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+     76,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     68,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0,  15,  15,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     67,  79,  76,  79,  82,   0, 
+    171, 171,  79,  83,  71,  78, 
+    212,   0,   0,   0,   8,   0, 
+      0,   0,   8,   0,   0,   0, 
+    200,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   2,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   3,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   4,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   4,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   5,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   5,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   6,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   6,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   7,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   7,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82,  24,   1, 
+      0,   0,  64,   0,   0,   0, 
+     70,   0,   0,   0,  98,  16, 
+      0,   3, 242,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      3,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      4,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      5,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      6,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      7,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      0,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   1,   0,   0,   0, 
+     70,  30,  16,   0,   1,   0, 
+      0,   0,  54,   0,   0,   5, 
+    242,  32,  16,   0,   2,   0, 
+      0,   0,  70,  30,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      3,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   4,   0,   0,   0, 
+     70,  30,  16,   0,   1,   0, 
+      0,   0,  54,   0,   0,   5, 
+    242,  32,  16,   0,   5,   0, 
+      0,   0,  70,  30,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      6,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   7,   0,   0,   0, 
+     70,  30,  16,   0,   1,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   9,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   9,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      8,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearfloat11vsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11vs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11vs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearfloat11vs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,175 +1,175 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// POSITION                 0   xyz         0     NONE   float   xyz 
-// COLOR                    0   xyzw        1     NONE   float   xyzw
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float   xyzw
-// COLOR                    0   xyzw        1     NONE   float   xyzw
-//
-//
-// Runtime generated constant mappings:
-//
-// Target Reg                               Constant Description
-// ---------- --------------------------------------------------
-// c0                              Vertex Shader position offset
-//
-//
-// Level9 shader bytecode:
-//
-    vs_2_x
-    def c1, 1, 0, 0, 0
-    dcl_texcoord v0
-    dcl_texcoord1 v1
-    add oPos.xy, v0, c0
-    mad oPos.zw, v0.z, c1.xyxy, c1.xyyx
-    mov oT0, v1
-
-// approximately 3 instruction slots used
-vs_4_0
-dcl_input v0.xyz
-dcl_input v1.xyzw
-dcl_output_siv o0.xyzw, position
-dcl_output o1.xyzw
-mov o0.xyz, v0.xyzx
-mov o0.w, l(1.000000)
-mov o1.xyzw, v1.xyzw
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_VS_ClearFloat[] =
-{
-     68,  88,  66,  67, 254, 253, 
-    200, 174,  22,  35,  97, 190, 
-    187, 200, 253, 161, 246,  45, 
-     67,  66,   1,   0,   0,   0, 
-    204,   2,   0,   0,   6,   0, 
-      0,   0,  56,   0,   0,   0, 
-    208,   0,   0,   0,  84,   1, 
-      0,   0, 208,   1,   0,   0, 
-     40,   2,   0,   0, 120,   2, 
-      0,   0,  65, 111, 110,  57, 
-    144,   0,   0,   0, 144,   0, 
-      0,   0,   0,   2, 254, 255, 
-    104,   0,   0,   0,  40,   0, 
-      0,   0,   0,   0,  36,   0, 
-      0,   0,  36,   0,   0,   0, 
-     36,   0,   0,   0,  36,   0, 
-      1,   0,  36,   0,   0,   0, 
-      0,   0,   1,   2, 254, 255, 
-     81,   0,   0,   5,   1,   0, 
-     15, 160,   0,   0, 128,  63, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     31,   0,   0,   2,   5,   0, 
-      0, 128,   0,   0,  15, 144, 
-     31,   0,   0,   2,   5,   0, 
-      1, 128,   1,   0,  15, 144, 
-      2,   0,   0,   3,   0,   0, 
-      3, 192,   0,   0, 228, 144, 
-      0,   0, 228, 160,   4,   0, 
-      0,   4,   0,   0,  12, 192, 
-      0,   0, 170, 144,   1,   0, 
-     68, 160,   1,   0,  20, 160, 
-      1,   0,   0,   2,   0,   0, 
-     15, 224,   1,   0, 228, 144, 
-    255, 255,   0,   0,  83,  72, 
-     68,  82, 124,   0,   0,   0, 
-     64,   0,   1,   0,  31,   0, 
-      0,   0,  95,   0,   0,   3, 
-    114,  16,  16,   0,   0,   0, 
-      0,   0,  95,   0,   0,   3, 
-    242,  16,  16,   0,   1,   0, 
-      0,   0, 103,   0,   0,   4, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 114,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,  18,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-    130,  32,  16,   0,   0,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0, 128,  63,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      1,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  82,  68,  69,  70, 
-     80,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  28,   0, 
-      0,   0,   0,   4, 254, 255, 
-      0,   1,   0,   0,  28,   0, 
-      0,   0,  77, 105,  99, 114, 
-    111, 115, 111, 102, 116,  32, 
-     40,  82,  41,  32,  72,  76, 
-     83,  76,  32,  83, 104,  97, 
-    100, 101, 114,  32,  67, 111, 
-    109, 112, 105, 108, 101, 114, 
-     32,  54,  46,  51,  46,  57, 
-     54,  48,  48,  46,  49,  54, 
-     51,  56,  52,   0, 171, 171, 
-     73,  83,  71,  78,  72,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-      7,   7,   0,   0,  65,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-     15,  15,   0,   0,  80,  79, 
-     83,  73,  84,  73,  79,  78, 
-      0,  67,  79,  76,  79,  82, 
-      0, 171,  79,  83,  71,  78, 
-     76,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     68,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     67,  79,  76,  79,  82,   0, 
-    171, 171
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// POSITION                 0   xyz         0     NONE   float   xyz 
+// COLOR                    0   xyzw        1     NONE   float   xyzw
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float   xyzw
+// COLOR                    0   xyzw        1     NONE   float   xyzw
+//
+//
+// Runtime generated constant mappings:
+//
+// Target Reg                               Constant Description
+// ---------- --------------------------------------------------
+// c0                              Vertex Shader position offset
+//
+//
+// Level9 shader bytecode:
+//
+    vs_2_x
+    def c1, 1, 0, 0, 0
+    dcl_texcoord v0
+    dcl_texcoord1 v1
+    add oPos.xy, v0, c0
+    mad oPos.zw, v0.z, c1.xyxy, c1.xyyx
+    mov oT0, v1
+
+// approximately 3 instruction slots used
+vs_4_0
+dcl_input v0.xyz
+dcl_input v1.xyzw
+dcl_output_siv o0.xyzw, position
+dcl_output o1.xyzw
+mov o0.xyz, v0.xyzx
+mov o0.w, l(1.000000)
+mov o1.xyzw, v1.xyzw
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_VS_ClearFloat[] =
+{
+     68,  88,  66,  67, 254, 253, 
+    200, 174,  22,  35,  97, 190, 
+    187, 200, 253, 161, 246,  45, 
+     67,  66,   1,   0,   0,   0, 
+    204,   2,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+    208,   0,   0,   0,  84,   1, 
+      0,   0, 208,   1,   0,   0, 
+     40,   2,   0,   0, 120,   2, 
+      0,   0,  65, 111, 110,  57, 
+    144,   0,   0,   0, 144,   0, 
+      0,   0,   0,   2, 254, 255, 
+    104,   0,   0,   0,  40,   0, 
+      0,   0,   0,   0,  36,   0, 
+      0,   0,  36,   0,   0,   0, 
+     36,   0,   0,   0,  36,   0, 
+      1,   0,  36,   0,   0,   0, 
+      0,   0,   1,   2, 254, 255, 
+     81,   0,   0,   5,   1,   0, 
+     15, 160,   0,   0, 128,  63, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     31,   0,   0,   2,   5,   0, 
+      0, 128,   0,   0,  15, 144, 
+     31,   0,   0,   2,   5,   0, 
+      1, 128,   1,   0,  15, 144, 
+      2,   0,   0,   3,   0,   0, 
+      3, 192,   0,   0, 228, 144, 
+      0,   0, 228, 160,   4,   0, 
+      0,   4,   0,   0,  12, 192, 
+      0,   0, 170, 144,   1,   0, 
+     68, 160,   1,   0,  20, 160, 
+      1,   0,   0,   2,   0,   0, 
+     15, 224,   1,   0, 228, 144, 
+    255, 255,   0,   0,  83,  72, 
+     68,  82, 124,   0,   0,   0, 
+     64,   0,   1,   0,  31,   0, 
+      0,   0,  95,   0,   0,   3, 
+    114,  16,  16,   0,   0,   0, 
+      0,   0,  95,   0,   0,   3, 
+    242,  16,  16,   0,   1,   0, 
+      0,   0, 103,   0,   0,   4, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 114,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,  18,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+    130,  32,  16,   0,   0,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0, 128,  63,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      1,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  82,  68,  69,  70, 
+     80,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  28,   0, 
+      0,   0,   0,   4, 254, 255, 
+      0,   1,   0,   0,  28,   0, 
+      0,   0,  77, 105,  99, 114, 
+    111, 115, 111, 102, 116,  32, 
+     40,  82,  41,  32,  72,  76, 
+     83,  76,  32,  83, 104,  97, 
+    100, 101, 114,  32,  67, 111, 
+    109, 112, 105, 108, 101, 114, 
+     32,  54,  46,  51,  46,  57, 
+     54,  48,  48,  46,  49,  54, 
+     51,  56,  52,   0, 171, 171, 
+     73,  83,  71,  78,  72,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+      7,   7,   0,   0,  65,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+     15,  15,   0,   0,  80,  79, 
+     83,  73,  84,  73,  79,  78, 
+      0,  67,  79,  76,  79,  82, 
+      0, 171,  79,  83,  71,  78, 
+     76,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     68,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     67,  79,  76,  79,  82,   0, 
+    171, 171
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearsint11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,195 +1,195 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// COLOR                    0   xyzw        1     NONE     int   xyzw
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-// SV_TARGET                1   xyzw        1   TARGET     int   xyzw
-// SV_TARGET                2   xyzw        2   TARGET     int   xyzw
-// SV_TARGET                3   xyzw        3   TARGET     int   xyzw
-// SV_TARGET                4   xyzw        4   TARGET     int   xyzw
-// SV_TARGET                5   xyzw        5   TARGET     int   xyzw
-// SV_TARGET                6   xyzw        6   TARGET     int   xyzw
-// SV_TARGET                7   xyzw        7   TARGET     int   xyzw
-//
-ps_4_0
-dcl_input_ps constant v1.xyzw
-dcl_output o0.xyzw
-dcl_output o1.xyzw
-dcl_output o2.xyzw
-dcl_output o3.xyzw
-dcl_output o4.xyzw
-dcl_output o5.xyzw
-dcl_output o6.xyzw
-dcl_output o7.xyzw
-mov o0.xyzw, v1.xyzw
-mov o1.xyzw, v1.xyzw
-mov o2.xyzw, v1.xyzw
-mov o3.xyzw, v1.xyzw
-mov o4.xyzw, v1.xyzw
-mov o5.xyzw, v1.xyzw
-mov o6.xyzw, v1.xyzw
-mov o7.xyzw, v1.xyzw
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_ClearSint[] =
-{
-     68,  88,  66,  67, 206, 129, 
-    255, 236, 115, 217, 216,  20, 
-     88,  47, 155, 195, 145, 179, 
-    183,  28,   1,   0,   0,   0, 
-     88,   3,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    140,   0,   0,   0, 224,   0, 
-      0,   0, 188,   1,   0,   0, 
-    220,   2,   0,   0,  82,  68, 
-     69,  70,  80,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     28,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-     76,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     68,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   1,   0, 
-      0,   0,  15,  15,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     67,  79,  76,  79,  82,   0, 
-    171, 171,  79,  83,  71,  78, 
-    212,   0,   0,   0,   8,   0, 
-      0,   0,   8,   0,   0,   0, 
-    200,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   1,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   2,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   3,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   4,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   4,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   5,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   5,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   6,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   6,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   7,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   7,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82,  24,   1, 
-      0,   0,  64,   0,   0,   0, 
-     70,   0,   0,   0,  98,   8, 
-      0,   3, 242,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      3,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      4,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      5,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      6,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      7,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      0,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   1,   0,   0,   0, 
-     70,  30,  16,   0,   1,   0, 
-      0,   0,  54,   0,   0,   5, 
-    242,  32,  16,   0,   2,   0, 
-      0,   0,  70,  30,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      3,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   4,   0,   0,   0, 
-     70,  30,  16,   0,   1,   0, 
-      0,   0,  54,   0,   0,   5, 
-    242,  32,  16,   0,   5,   0, 
-      0,   0,  70,  30,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      6,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   7,   0,   0,   0, 
-     70,  30,  16,   0,   1,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   9,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   9,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      8,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// COLOR                    0   xyzw        1     NONE     int   xyzw
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+// SV_TARGET                1   xyzw        1   TARGET     int   xyzw
+// SV_TARGET                2   xyzw        2   TARGET     int   xyzw
+// SV_TARGET                3   xyzw        3   TARGET     int   xyzw
+// SV_TARGET                4   xyzw        4   TARGET     int   xyzw
+// SV_TARGET                5   xyzw        5   TARGET     int   xyzw
+// SV_TARGET                6   xyzw        6   TARGET     int   xyzw
+// SV_TARGET                7   xyzw        7   TARGET     int   xyzw
+//
+ps_4_0
+dcl_input_ps constant v1.xyzw
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output o6.xyzw
+dcl_output o7.xyzw
+mov o0.xyzw, v1.xyzw
+mov o1.xyzw, v1.xyzw
+mov o2.xyzw, v1.xyzw
+mov o3.xyzw, v1.xyzw
+mov o4.xyzw, v1.xyzw
+mov o5.xyzw, v1.xyzw
+mov o6.xyzw, v1.xyzw
+mov o7.xyzw, v1.xyzw
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_ClearSint[] =
+{
+     68,  88,  66,  67, 206, 129, 
+    255, 236, 115, 217, 216,  20, 
+     88,  47, 155, 195, 145, 179, 
+    183,  28,   1,   0,   0,   0, 
+     88,   3,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    140,   0,   0,   0, 224,   0, 
+      0,   0, 188,   1,   0,   0, 
+    220,   2,   0,   0,  82,  68, 
+     69,  70,  80,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     28,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+     76,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     68,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   1,   0, 
+      0,   0,  15,  15,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     67,  79,  76,  79,  82,   0, 
+    171, 171,  79,  83,  71,  78, 
+    212,   0,   0,   0,   8,   0, 
+      0,   0,   8,   0,   0,   0, 
+    200,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   1,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   2,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   3,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   4,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   4,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   5,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   5,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   6,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   6,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   7,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   7,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82,  24,   1, 
+      0,   0,  64,   0,   0,   0, 
+     70,   0,   0,   0,  98,   8, 
+      0,   3, 242,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      3,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      4,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      5,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      6,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      7,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      0,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   1,   0,   0,   0, 
+     70,  30,  16,   0,   1,   0, 
+      0,   0,  54,   0,   0,   5, 
+    242,  32,  16,   0,   2,   0, 
+      0,   0,  70,  30,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      3,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   4,   0,   0,   0, 
+     70,  30,  16,   0,   1,   0, 
+      0,   0,  54,   0,   0,   5, 
+    242,  32,  16,   0,   5,   0, 
+      0,   0,  70,  30,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      6,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   7,   0,   0,   0, 
+     70,  30,  16,   0,   1,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   9,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   9,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      8,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearsint11vsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11vs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11vs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearsint11vs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,130 +1,130 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// POSITION                 0   xyz         0     NONE   float   xyz 
-// COLOR                    0   xyzw        1     NONE     int   xyzw
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float   xyzw
-// COLOR                    0   xyzw        1     NONE     int   xyzw
-//
-vs_4_0
-dcl_input v0.xyz
-dcl_input v1.xyzw
-dcl_output_siv o0.xyzw, position
-dcl_output o1.xyzw
-mov o0.xyz, v0.xyzx
-mov o0.w, l(1.000000)
-mov o1.xyzw, v1.xyzw
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_VS_ClearSint[] =
-{
-     68,  88,  66,  67,  20, 240, 
-     85, 136, 255, 181, 253, 103, 
-    207, 181, 122, 106,  92,  25, 
-    228,  89,   1,   0,   0,   0, 
-     48,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    140,   0,   0,   0, 220,   0, 
-      0,   0,  48,   1,   0,   0, 
-    180,   1,   0,   0,  82,  68, 
-     69,  70,  80,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    254, 255,   0,   1,   0,   0, 
-     28,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-     72,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,   7,   7,   0,   0, 
-     65,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   1,   0, 
-      0,   0,  15,  15,   0,   0, 
-     80,  79,  83,  73,  84,  73, 
-     79,  78,   0,  67,  79,  76, 
-     79,  82,   0, 171,  79,  83, 
-     71,  78,  76,   0,   0,   0, 
-      2,   0,   0,   0,   8,   0, 
-      0,   0,  56,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  68,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      1,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  67,  79,  76,  79, 
-     82,   0, 171, 171,  83,  72, 
-     68,  82, 124,   0,   0,   0, 
-     64,   0,   1,   0,  31,   0, 
-      0,   0,  95,   0,   0,   3, 
-    114,  16,  16,   0,   0,   0, 
-      0,   0,  95,   0,   0,   3, 
-    242,  16,  16,   0,   1,   0, 
-      0,   0, 103,   0,   0,   4, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 114,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,  18,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-    130,  32,  16,   0,   0,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0, 128,  63,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      1,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// POSITION                 0   xyz         0     NONE   float   xyz 
+// COLOR                    0   xyzw        1     NONE     int   xyzw
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float   xyzw
+// COLOR                    0   xyzw        1     NONE     int   xyzw
+//
+vs_4_0
+dcl_input v0.xyz
+dcl_input v1.xyzw
+dcl_output_siv o0.xyzw, position
+dcl_output o1.xyzw
+mov o0.xyz, v0.xyzx
+mov o0.w, l(1.000000)
+mov o1.xyzw, v1.xyzw
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_VS_ClearSint[] =
+{
+     68,  88,  66,  67,  20, 240, 
+     85, 136, 255, 181, 253, 103, 
+    207, 181, 122, 106,  92,  25, 
+    228,  89,   1,   0,   0,   0, 
+     48,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    140,   0,   0,   0, 220,   0, 
+      0,   0,  48,   1,   0,   0, 
+    180,   1,   0,   0,  82,  68, 
+     69,  70,  80,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    254, 255,   0,   1,   0,   0, 
+     28,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+     72,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,   7,   7,   0,   0, 
+     65,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   1,   0, 
+      0,   0,  15,  15,   0,   0, 
+     80,  79,  83,  73,  84,  73, 
+     79,  78,   0,  67,  79,  76, 
+     79,  82,   0, 171,  79,  83, 
+     71,  78,  76,   0,   0,   0, 
+      2,   0,   0,   0,   8,   0, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  68,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      1,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  67,  79,  76,  79, 
+     82,   0, 171, 171,  83,  72, 
+     68,  82, 124,   0,   0,   0, 
+     64,   0,   1,   0,  31,   0, 
+      0,   0,  95,   0,   0,   3, 
+    114,  16,  16,   0,   0,   0, 
+      0,   0,  95,   0,   0,   3, 
+    242,  16,  16,   0,   1,   0, 
+      0,   0, 103,   0,   0,   4, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 114,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,  18,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+    130,  32,  16,   0,   0,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0, 128,  63,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      1,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearuint11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,195 +1,195 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// COLOR                    0   xyzw        1     NONE    uint   xyzw
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-// SV_TARGET                1   xyzw        1   TARGET    uint   xyzw
-// SV_TARGET                2   xyzw        2   TARGET    uint   xyzw
-// SV_TARGET                3   xyzw        3   TARGET    uint   xyzw
-// SV_TARGET                4   xyzw        4   TARGET    uint   xyzw
-// SV_TARGET                5   xyzw        5   TARGET    uint   xyzw
-// SV_TARGET                6   xyzw        6   TARGET    uint   xyzw
-// SV_TARGET                7   xyzw        7   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_input_ps constant v1.xyzw
-dcl_output o0.xyzw
-dcl_output o1.xyzw
-dcl_output o2.xyzw
-dcl_output o3.xyzw
-dcl_output o4.xyzw
-dcl_output o5.xyzw
-dcl_output o6.xyzw
-dcl_output o7.xyzw
-mov o0.xyzw, v1.xyzw
-mov o1.xyzw, v1.xyzw
-mov o2.xyzw, v1.xyzw
-mov o3.xyzw, v1.xyzw
-mov o4.xyzw, v1.xyzw
-mov o5.xyzw, v1.xyzw
-mov o6.xyzw, v1.xyzw
-mov o7.xyzw, v1.xyzw
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_ClearUint[] =
-{
-     68,  88,  66,  67, 117, 209, 
-    142, 159,  65,  29, 212, 206, 
-    242,  37, 169,  58,  35, 236, 
-    222,  73,   1,   0,   0,   0, 
-     88,   3,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    140,   0,   0,   0, 224,   0, 
-      0,   0, 188,   1,   0,   0, 
-    220,   2,   0,   0,  82,  68, 
-     69,  70,  80,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     28,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-     76,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     68,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,  15,  15,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     67,  79,  76,  79,  82,   0, 
-    171, 171,  79,  83,  71,  78, 
-    212,   0,   0,   0,   8,   0, 
-      0,   0,   8,   0,   0,   0, 
-    200,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   2,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   4,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   4,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   5,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   5,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   6,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   6,   0, 
-      0,   0,  15,   0,   0,   0, 
-    200,   0,   0,   0,   7,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   7,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82,  24,   1, 
-      0,   0,  64,   0,   0,   0, 
-     70,   0,   0,   0,  98,   8, 
-      0,   3, 242,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      3,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      4,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      5,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      6,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      7,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      0,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   1,   0,   0,   0, 
-     70,  30,  16,   0,   1,   0, 
-      0,   0,  54,   0,   0,   5, 
-    242,  32,  16,   0,   2,   0, 
-      0,   0,  70,  30,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      3,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   4,   0,   0,   0, 
-     70,  30,  16,   0,   1,   0, 
-      0,   0,  54,   0,   0,   5, 
-    242,  32,  16,   0,   5,   0, 
-      0,   0,  70,  30,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      6,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   7,   0,   0,   0, 
-     70,  30,  16,   0,   1,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   9,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   9,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      8,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// COLOR                    0   xyzw        1     NONE    uint   xyzw
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+// SV_TARGET                1   xyzw        1   TARGET    uint   xyzw
+// SV_TARGET                2   xyzw        2   TARGET    uint   xyzw
+// SV_TARGET                3   xyzw        3   TARGET    uint   xyzw
+// SV_TARGET                4   xyzw        4   TARGET    uint   xyzw
+// SV_TARGET                5   xyzw        5   TARGET    uint   xyzw
+// SV_TARGET                6   xyzw        6   TARGET    uint   xyzw
+// SV_TARGET                7   xyzw        7   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_input_ps constant v1.xyzw
+dcl_output o0.xyzw
+dcl_output o1.xyzw
+dcl_output o2.xyzw
+dcl_output o3.xyzw
+dcl_output o4.xyzw
+dcl_output o5.xyzw
+dcl_output o6.xyzw
+dcl_output o7.xyzw
+mov o0.xyzw, v1.xyzw
+mov o1.xyzw, v1.xyzw
+mov o2.xyzw, v1.xyzw
+mov o3.xyzw, v1.xyzw
+mov o4.xyzw, v1.xyzw
+mov o5.xyzw, v1.xyzw
+mov o6.xyzw, v1.xyzw
+mov o7.xyzw, v1.xyzw
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_ClearUint[] =
+{
+     68,  88,  66,  67, 117, 209, 
+    142, 159,  65,  29, 212, 206, 
+    242,  37, 169,  58,  35, 236, 
+    222,  73,   1,   0,   0,   0, 
+     88,   3,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    140,   0,   0,   0, 224,   0, 
+      0,   0, 188,   1,   0,   0, 
+    220,   2,   0,   0,  82,  68, 
+     69,  70,  80,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     28,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+     76,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     68,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  15,  15,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     67,  79,  76,  79,  82,   0, 
+    171, 171,  79,  83,  71,  78, 
+    212,   0,   0,   0,   8,   0, 
+      0,   0,   8,   0,   0,   0, 
+    200,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   2,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   4,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   4,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   5,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   5,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   6,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   6,   0, 
+      0,   0,  15,   0,   0,   0, 
+    200,   0,   0,   0,   7,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   7,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82,  24,   1, 
+      0,   0,  64,   0,   0,   0, 
+     70,   0,   0,   0,  98,   8, 
+      0,   3, 242,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      3,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      4,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      5,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      6,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      7,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      0,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   1,   0,   0,   0, 
+     70,  30,  16,   0,   1,   0, 
+      0,   0,  54,   0,   0,   5, 
+    242,  32,  16,   0,   2,   0, 
+      0,   0,  70,  30,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      3,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   4,   0,   0,   0, 
+     70,  30,  16,   0,   1,   0, 
+      0,   0,  54,   0,   0,   5, 
+    242,  32,  16,   0,   5,   0, 
+      0,   0,  70,  30,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      6,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   7,   0,   0,   0, 
+     70,  30,  16,   0,   1,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   9,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   9,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      8,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledclearuint11vsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11vs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11vs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/clearuint11vs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,130 +1,130 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// POSITION                 0   xyz         0     NONE   float   xyz 
-// COLOR                    0   xyzw        1     NONE    uint   xyzw
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float   xyzw
-// COLOR                    0   xyzw        1     NONE    uint   xyzw
-//
-vs_4_0
-dcl_input v0.xyz
-dcl_input v1.xyzw
-dcl_output_siv o0.xyzw, position
-dcl_output o1.xyzw
-mov o0.xyz, v0.xyzx
-mov o0.w, l(1.000000)
-mov o1.xyzw, v1.xyzw
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_VS_ClearUint[] =
-{
-     68,  88,  66,  67,  62, 191, 
-     52,  95,  60,  98, 193,  75, 
-    194,  36, 187, 194,  54,  24, 
-    232, 224,   1,   0,   0,   0, 
-     48,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    140,   0,   0,   0, 220,   0, 
-      0,   0,  48,   1,   0,   0, 
-    180,   1,   0,   0,  82,  68, 
-     69,  70,  80,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    254, 255,   0,   1,   0,   0, 
-     28,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-     72,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,   7,   7,   0,   0, 
-     65,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,  15,  15,   0,   0, 
-     80,  79,  83,  73,  84,  73, 
-     79,  78,   0,  67,  79,  76, 
-     79,  82,   0, 171,  79,  83, 
-     71,  78,  76,   0,   0,   0, 
-      2,   0,   0,   0,   8,   0, 
-      0,   0,  56,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  68,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  67,  79,  76,  79, 
-     82,   0, 171, 171,  83,  72, 
-     68,  82, 124,   0,   0,   0, 
-     64,   0,   1,   0,  31,   0, 
-      0,   0,  95,   0,   0,   3, 
-    114,  16,  16,   0,   0,   0, 
-      0,   0,  95,   0,   0,   3, 
-    242,  16,  16,   0,   1,   0, 
-      0,   0, 103,   0,   0,   4, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   1,   0,   0,   0, 
-     54,   0,   0,   5, 114,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,  18,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-    130,  32,  16,   0,   0,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0, 128,  63,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      1,   0,   0,   0,  70,  30, 
-     16,   0,   1,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// POSITION                 0   xyz         0     NONE   float   xyz 
+// COLOR                    0   xyzw        1     NONE    uint   xyzw
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float   xyzw
+// COLOR                    0   xyzw        1     NONE    uint   xyzw
+//
+vs_4_0
+dcl_input v0.xyz
+dcl_input v1.xyzw
+dcl_output_siv o0.xyzw, position
+dcl_output o1.xyzw
+mov o0.xyz, v0.xyzx
+mov o0.w, l(1.000000)
+mov o1.xyzw, v1.xyzw
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_VS_ClearUint[] =
+{
+     68,  88,  66,  67,  62, 191, 
+     52,  95,  60,  98, 193,  75, 
+    194,  36, 187, 194,  54,  24, 
+    232, 224,   1,   0,   0,   0, 
+     48,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    140,   0,   0,   0, 220,   0, 
+      0,   0,  48,   1,   0,   0, 
+    180,   1,   0,   0,  82,  68, 
+     69,  70,  80,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    254, 255,   0,   1,   0,   0, 
+     28,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+     72,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,   7,   7,   0,   0, 
+     65,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  15,  15,   0,   0, 
+     80,  79,  83,  73,  84,  73, 
+     79,  78,   0,  67,  79,  76, 
+     79,  82,   0, 171,  79,  83, 
+     71,  78,  76,   0,   0,   0, 
+      2,   0,   0,   0,   8,   0, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  68,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  67,  79,  76,  79, 
+     82,   0, 171, 171,  83,  72, 
+     68,  82, 124,   0,   0,   0, 
+     64,   0,   1,   0,  31,   0, 
+      0,   0,  95,   0,   0,   3, 
+    114,  16,  16,   0,   0,   0, 
+      0,   0,  95,   0,   0,   3, 
+    242,  16,  16,   0,   1,   0, 
+      0,   0, 103,   0,   0,   4, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   1,   0,   0,   0, 
+     54,   0,   0,   5, 114,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,  18,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+    130,  32,  16,   0,   0,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0, 128,  63,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      1,   0,   0,   0,  70,  30, 
+     16,   0,   1,   0,   0,   0, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthrough2d11vsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,177 +1,177 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// POSITION                 0   xy          0     NONE   float   xy  
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float   xyzw
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Runtime generated constant mappings:
-//
-// Target Reg                               Constant Description
-// ---------- --------------------------------------------------
-// c0                              Vertex Shader position offset
-//
-//
-// Level9 shader bytecode:
-//
-    vs_2_x
-    def c1, 0, 1, 0, 0
-    dcl_texcoord v0
-    dcl_texcoord1 v1
-    add oPos.xy, v0, c0
-    mov oPos.zw, c1.xyxy
-    mov oT0.xy, v1
-
-// approximately 3 instruction slots used
-vs_4_0
-dcl_input v0.xy
-dcl_input v1.xy
-dcl_output_siv o0.xyzw, position
-dcl_output o1.xy
-mov o0.xy, v0.xyxx
-mov o0.zw, l(0,0,0,1.000000)
-mov o1.xy, v1.xyxx
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_VS_Passthrough2D[] =
-{
-     68,  88,  66,  67, 230,  95, 
-    115, 230,  65, 211,  74,  82, 
-    143, 170, 109, 175,  63, 210, 
-     14, 229,   1,   0,   0,   0, 
-    216,   2,   0,   0,   6,   0, 
-      0,   0,  56,   0,   0,   0, 
-    200,   0,   0,   0,  88,   1, 
-      0,   0, 212,   1,   0,   0, 
-     44,   2,   0,   0, 128,   2, 
-      0,   0,  65, 111, 110,  57, 
-    136,   0,   0,   0, 136,   0, 
-      0,   0,   0,   2, 254, 255, 
-     96,   0,   0,   0,  40,   0, 
-      0,   0,   0,   0,  36,   0, 
-      0,   0,  36,   0,   0,   0, 
-     36,   0,   0,   0,  36,   0, 
-      1,   0,  36,   0,   0,   0, 
-      0,   0,   1,   2, 254, 255, 
-     81,   0,   0,   5,   1,   0, 
-     15, 160,   0,   0,   0,   0, 
-      0,   0, 128,  63,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     31,   0,   0,   2,   5,   0, 
-      0, 128,   0,   0,  15, 144, 
-     31,   0,   0,   2,   5,   0, 
-      1, 128,   1,   0,  15, 144, 
-      2,   0,   0,   3,   0,   0, 
-      3, 192,   0,   0, 228, 144, 
-      0,   0, 228, 160,   1,   0, 
-      0,   2,   0,   0,  12, 192, 
-      1,   0,  68, 160,   1,   0, 
-      0,   2,   0,   0,   3, 224, 
-      1,   0, 228, 144, 255, 255, 
-      0,   0,  83,  72,  68,  82, 
-    136,   0,   0,   0,  64,   0, 
-      1,   0,  34,   0,   0,   0, 
-     95,   0,   0,   3,  50,  16, 
-     16,   0,   0,   0,   0,   0, 
-     95,   0,   0,   3,  50,  16, 
-     16,   0,   1,   0,   0,   0, 
-    103,   0,   0,   4, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3,  50,  32,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5,  50,  32,  16,   0, 
-      0,   0,   0,   0,  70,  16, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,  32, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    128,  63,  54,   0,   0,   5, 
-     50,  32,  16,   0,   1,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   4,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     82,  68,  69,  70,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  28,   0,   0,   0, 
-      0,   4, 254, 255,   0,   1, 
-      0,   0,  28,   0,   0,   0, 
-     77, 105,  99, 114, 111, 115, 
-    111, 102, 116,  32,  40,  82, 
-     41,  32,  72,  76,  83,  76, 
-     32,  83, 104,  97, 100, 101, 
-    114,  32,  67, 111, 109, 112, 
-    105, 108, 101, 114,  32,  54, 
-     46,  51,  46,  57,  54,  48, 
-     48,  46,  49,  54,  51,  56, 
-     52,   0, 171, 171,  73,  83, 
-     71,  78,  76,   0,   0,   0, 
-      2,   0,   0,   0,   8,   0, 
-      0,   0,  56,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   3,   3, 
-      0,   0,  65,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,   3,   3, 
-      0,   0,  80,  79,  83,  73, 
-     84,  73,  79,  78,   0,  84, 
-     69,  88,  67,  79,  79,  82, 
-     68,   0, 171, 171,  79,  83, 
-     71,  78,  80,   0,   0,   0, 
-      2,   0,   0,   0,   8,   0, 
-      0,   0,  56,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  68,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,   3,  12, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0, 171, 
-    171, 171
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// POSITION                 0   xy          0     NONE   float   xy  
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float   xyzw
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Runtime generated constant mappings:
+//
+// Target Reg                               Constant Description
+// ---------- --------------------------------------------------
+// c0                              Vertex Shader position offset
+//
+//
+// Level9 shader bytecode:
+//
+    vs_2_x
+    def c1, 0, 1, 0, 0
+    dcl_texcoord v0
+    dcl_texcoord1 v1
+    add oPos.xy, v0, c0
+    mov oPos.zw, c1.xyxy
+    mov oT0.xy, v1
+
+// approximately 3 instruction slots used
+vs_4_0
+dcl_input v0.xy
+dcl_input v1.xy
+dcl_output_siv o0.xyzw, position
+dcl_output o1.xy
+mov o0.xy, v0.xyxx
+mov o0.zw, l(0,0,0,1.000000)
+mov o1.xy, v1.xyxx
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_VS_Passthrough2D[] =
+{
+     68,  88,  66,  67, 230,  95, 
+    115, 230,  65, 211,  74,  82, 
+    143, 170, 109, 175,  63, 210, 
+     14, 229,   1,   0,   0,   0, 
+    216,   2,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+    200,   0,   0,   0,  88,   1, 
+      0,   0, 212,   1,   0,   0, 
+     44,   2,   0,   0, 128,   2, 
+      0,   0,  65, 111, 110,  57, 
+    136,   0,   0,   0, 136,   0, 
+      0,   0,   0,   2, 254, 255, 
+     96,   0,   0,   0,  40,   0, 
+      0,   0,   0,   0,  36,   0, 
+      0,   0,  36,   0,   0,   0, 
+     36,   0,   0,   0,  36,   0, 
+      1,   0,  36,   0,   0,   0, 
+      0,   0,   1,   2, 254, 255, 
+     81,   0,   0,   5,   1,   0, 
+     15, 160,   0,   0,   0,   0, 
+      0,   0, 128,  63,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     31,   0,   0,   2,   5,   0, 
+      0, 128,   0,   0,  15, 144, 
+     31,   0,   0,   2,   5,   0, 
+      1, 128,   1,   0,  15, 144, 
+      2,   0,   0,   3,   0,   0, 
+      3, 192,   0,   0, 228, 144, 
+      0,   0, 228, 160,   1,   0, 
+      0,   2,   0,   0,  12, 192, 
+      1,   0,  68, 160,   1,   0, 
+      0,   2,   0,   0,   3, 224, 
+      1,   0, 228, 144, 255, 255, 
+      0,   0,  83,  72,  68,  82, 
+    136,   0,   0,   0,  64,   0, 
+      1,   0,  34,   0,   0,   0, 
+     95,   0,   0,   3,  50,  16, 
+     16,   0,   0,   0,   0,   0, 
+     95,   0,   0,   3,  50,  16, 
+     16,   0,   1,   0,   0,   0, 
+    103,   0,   0,   4, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3,  50,  32,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5,  50,  32,  16,   0, 
+      0,   0,   0,   0,  70,  16, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,  32, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    128,  63,  54,   0,   0,   5, 
+     50,  32,  16,   0,   1,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   4,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     82,  68,  69,  70,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  28,   0,   0,   0, 
+      0,   4, 254, 255,   0,   1, 
+      0,   0,  28,   0,   0,   0, 
+     77, 105,  99, 114, 111, 115, 
+    111, 102, 116,  32,  40,  82, 
+     41,  32,  72,  76,  83,  76, 
+     32,  83, 104,  97, 100, 101, 
+    114,  32,  67, 111, 109, 112, 
+    105, 108, 101, 114,  32,  54, 
+     46,  51,  46,  57,  54,  48, 
+     48,  46,  49,  54,  51,  56, 
+     52,   0, 171, 171,  73,  83, 
+     71,  78,  76,   0,   0,   0, 
+      2,   0,   0,   0,   8,   0, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   3,   3, 
+      0,   0,  65,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,   3,   3, 
+      0,   0,  80,  79,  83,  73, 
+     84,  73,  79,  78,   0,  84, 
+     69,  88,  67,  79,  79,  82, 
+     68,   0, 171, 171,  79,  83, 
+     71,  78,  80,   0,   0,   0, 
+      2,   0,   0,   0,   8,   0, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  68,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,   3,  12, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0, 171, 
+    171, 171
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthrough3d11gsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11gs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,191 +1,191 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float   xyzw
-// LAYER                    0   x           1     NONE    uint   x   
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float   xyzw
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint   x   
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-gs_4_0
-dcl_input_siv v[3][0].xyzw, position
-dcl_input v[3][1].x
-dcl_input v[3][2].xyz
-dcl_temps 1
-dcl_inputprimitive triangle 
-dcl_outputtopology trianglestrip 
-dcl_output_siv o0.xyzw, position
-dcl_output_siv o1.x, rendertarget_array_index
-dcl_output o2.xyz
-dcl_maxout 3
-mov r0.x, l(0)
-loop 
-  ige r0.y, r0.x, l(3)
-  breakc_nz r0.y
-  mov o0.xyzw, v[r0.x + 0][0].xyzw
-  mov o1.x, v[r0.x + 0][1].x
-  mov o2.xyz, v[r0.x + 0][2].xyzx
-  emit 
-  iadd r0.x, r0.x, l(1)
-endloop 
-ret 
-// Approximately 11 instruction slots used
-#endif
-
-const BYTE g_GS_Passthrough3D[] =
-{
-     68,  88,  66,  67,  92, 129, 
-     41, 170, 114,  75, 160, 250, 
-     95, 161, 230, 161,  11,  78, 
-    252,  65,   1,   0,   0,   0, 
-     72,   3,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    140,   0,   0,   0,   0,   1, 
-      0,   0, 136,   1,   0,   0, 
-    204,   2,   0,   0,  82,  68, 
-     69,  70,  80,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-     83,  71,   0,   1,   0,   0, 
-     28,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-    108,   0,   0,   0,   3,   0, 
-      0,   0,   8,   0,   0,   0, 
-     80,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,  15,   0,   0, 
-     92,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,   1,   1,   0,   0, 
-     98,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   2,   0, 
-      0,   0,   7,   7,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     76,  65,  89,  69,  82,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171,  79,  83, 
-     71,  78, 128,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,  14, 
-      0,   0, 118,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0,   7,   8, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  83,  86,  95,  82, 
-     69,  78,  68,  69,  82,  84, 
-     65,  82,  71,  69,  84,  65, 
-     82,  82,  65,  89,  73,  78, 
-     68,  69,  88,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171,  83,  72,  68,  82, 
-     60,   1,   0,   0,  64,   0, 
-      2,   0,  79,   0,   0,   0, 
-     97,   0,   0,   5, 242,  16, 
-     32,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  95,   0,   0,   4, 
-     18,  16,  32,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-     95,   0,   0,   4, 114,  16, 
-     32,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     93,  24,   0,   1,  92,  40, 
-      0,   1, 103,   0,   0,   4, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-    103,   0,   0,   4,  18,  32, 
-     16,   0,   1,   0,   0,   0, 
-      4,   0,   0,   0, 101,   0, 
-      0,   3, 114,  32,  16,   0, 
-      2,   0,   0,   0,  94,   0, 
-      0,   2,   3,   0,   0,   0, 
-     54,   0,   0,   5,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  48,   0,   0,   1, 
-     33,   0,   0,   7,  34,   0, 
-     16,   0,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,   1,  64,   0,   0, 
-      3,   0,   0,   0,   3,   0, 
-      4,   3,  26,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7, 242,  32,  16,   0, 
-      0,   0,   0,   0,  70,  30, 
-    160,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  54,   0,   0,   7, 
-     18,  32,  16,   0,   1,   0, 
-      0,   0,  10,  16, 160,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     54,   0,   0,   7, 114,  32, 
-     16,   0,   2,   0,   0,   0, 
-     70,  18, 160,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,  19,   0, 
-      0,   1,  30,   0,   0,   7, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,   1,  64, 
-      0,   0,   1,   0,   0,   0, 
-     22,   0,   0,   1,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,  11,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   6,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   5,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float   xyzw
+// LAYER                    0   x           1     NONE    uint   x   
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float   xyzw
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint   x   
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+gs_4_0
+dcl_input_siv v[3][0].xyzw, position
+dcl_input v[3][1].x
+dcl_input v[3][2].xyz
+dcl_temps 1
+dcl_inputprimitive triangle 
+dcl_outputtopology trianglestrip 
+dcl_output_siv o0.xyzw, position
+dcl_output_siv o1.x, rendertarget_array_index
+dcl_output o2.xyz
+dcl_maxout 3
+mov r0.x, l(0)
+loop 
+  ige r0.y, r0.x, l(3)
+  breakc_nz r0.y
+  mov o0.xyzw, v[r0.x + 0][0].xyzw
+  mov o1.x, v[r0.x + 0][1].x
+  mov o2.xyz, v[r0.x + 0][2].xyzx
+  emit 
+  iadd r0.x, r0.x, l(1)
+endloop 
+ret 
+// Approximately 11 instruction slots used
+#endif
+
+const BYTE g_GS_Passthrough3D[] =
+{
+     68,  88,  66,  67,  92, 129, 
+     41, 170, 114,  75, 160, 250, 
+     95, 161, 230, 161,  11,  78, 
+    252,  65,   1,   0,   0,   0, 
+     72,   3,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    140,   0,   0,   0,   0,   1, 
+      0,   0, 136,   1,   0,   0, 
+    204,   2,   0,   0,  82,  68, 
+     69,  70,  80,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+     83,  71,   0,   1,   0,   0, 
+     28,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+    108,   0,   0,   0,   3,   0, 
+      0,   0,   8,   0,   0,   0, 
+     80,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,  15,   0,   0, 
+     92,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   1,   1,   0,   0, 
+     98,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   2,   0, 
+      0,   0,   7,   7,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     76,  65,  89,  69,  82,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171,  79,  83, 
+     71,  78, 128,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,  14, 
+      0,   0, 118,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0,   7,   8, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  83,  86,  95,  82, 
+     69,  78,  68,  69,  82,  84, 
+     65,  82,  71,  69,  84,  65, 
+     82,  82,  65,  89,  73,  78, 
+     68,  69,  88,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171,  83,  72,  68,  82, 
+     60,   1,   0,   0,  64,   0, 
+      2,   0,  79,   0,   0,   0, 
+     97,   0,   0,   5, 242,  16, 
+     32,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  95,   0,   0,   4, 
+     18,  16,  32,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+     95,   0,   0,   4, 114,  16, 
+     32,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     93,  24,   0,   1,  92,  40, 
+      0,   1, 103,   0,   0,   4, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+    103,   0,   0,   4,  18,  32, 
+     16,   0,   1,   0,   0,   0, 
+      4,   0,   0,   0, 101,   0, 
+      0,   3, 114,  32,  16,   0, 
+      2,   0,   0,   0,  94,   0, 
+      0,   2,   3,   0,   0,   0, 
+     54,   0,   0,   5,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  48,   0,   0,   1, 
+     33,   0,   0,   7,  34,   0, 
+     16,   0,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,   1,  64,   0,   0, 
+      3,   0,   0,   0,   3,   0, 
+      4,   3,  26,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7, 242,  32,  16,   0, 
+      0,   0,   0,   0,  70,  30, 
+    160,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  54,   0,   0,   7, 
+     18,  32,  16,   0,   1,   0, 
+      0,   0,  10,  16, 160,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     54,   0,   0,   7, 114,  32, 
+     16,   0,   2,   0,   0,   0, 
+     70,  18, 160,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,  19,   0, 
+      0,   1,  30,   0,   0,   7, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,   1,  64, 
+      0,   0,   1,   0,   0,   0, 
+     22,   0,   0,   1,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,  11,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   6,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   5,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthrough3d11vsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough3d11vs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,155 +1,155 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// POSITION                 0   xy          0     NONE   float   xy  
-// LAYER                    0   x           1     NONE    uint   x   
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float   xyzw
-// LAYER                    0   x           1     NONE    uint   x   
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-vs_4_0
-dcl_input v0.xy
-dcl_input v1.x
-dcl_input v2.xyz
-dcl_output_siv o0.xyzw, position
-dcl_output o1.x
-dcl_output o2.xyz
-mov o0.xy, v0.xyxx
-mov o0.zw, l(0,0,0,1.000000)
-mov o1.x, v1.x
-mov o2.xyz, v2.xyzx
-ret 
-// Approximately 5 instruction slots used
-#endif
-
-const BYTE g_VS_Passthrough3D[] =
-{
-     68,  88,  66,  67, 229,  65, 
-    217, 172, 143, 180, 152,  72, 
-     16,  12, 254,  66,   0, 215, 
-     50, 173,   1,   0,   0,   0, 
-    168,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    140,   0,   0,   0, 252,   0, 
-      0,   0, 112,   1,   0,   0, 
-     44,   2,   0,   0,  82,  68, 
-     69,  70,  80,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    254, 255,   0,   1,   0,   0, 
-     28,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-    104,   0,   0,   0,   3,   0, 
-      0,   0,   8,   0,   0,   0, 
-     80,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,   3,   3,   0,   0, 
-     89,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,   1,   1,   0,   0, 
-     95,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   2,   0, 
-      0,   0,   7,   7,   0,   0, 
-     80,  79,  83,  73,  84,  73, 
-     79,  78,   0,  76,  65,  89, 
-     69,  82,   0,  84,  69,  88, 
-     67,  79,  79,  82,  68,   0, 
-     79,  83,  71,  78, 108,   0, 
-      0,   0,   3,   0,   0,   0, 
-      8,   0,   0,   0,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,  14,   0,   0,  98,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   8,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  76,  65, 
-     89,  69,  82,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171,  83,  72,  68,  82, 
-    180,   0,   0,   0,  64,   0, 
-      1,   0,  45,   0,   0,   0, 
-     95,   0,   0,   3,  50,  16, 
-     16,   0,   0,   0,   0,   0, 
-     95,   0,   0,   3,  18,  16, 
-     16,   0,   1,   0,   0,   0, 
-     95,   0,   0,   3, 114,  16, 
-     16,   0,   2,   0,   0,   0, 
-    103,   0,   0,   4, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3,  18,  32,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 114,  32,  16,   0, 
-      2,   0,   0,   0,  54,   0, 
-      0,   5,  50,  32,  16,   0, 
-      0,   0,   0,   0,  70,  16, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,  32, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    128,  63,  54,   0,   0,   5, 
-     18,  32,  16,   0,   1,   0, 
-      0,   0,  10,  16,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 114,  32,  16,   0, 
-      2,   0,   0,   0,  70,  18, 
-     16,   0,   2,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      5,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      6,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// POSITION                 0   xy          0     NONE   float   xy  
+// LAYER                    0   x           1     NONE    uint   x   
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float   xyzw
+// LAYER                    0   x           1     NONE    uint   x   
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+vs_4_0
+dcl_input v0.xy
+dcl_input v1.x
+dcl_input v2.xyz
+dcl_output_siv o0.xyzw, position
+dcl_output o1.x
+dcl_output o2.xyz
+mov o0.xy, v0.xyxx
+mov o0.zw, l(0,0,0,1.000000)
+mov o1.x, v1.x
+mov o2.xyz, v2.xyzx
+ret 
+// Approximately 5 instruction slots used
+#endif
+
+const BYTE g_VS_Passthrough3D[] =
+{
+     68,  88,  66,  67, 229,  65, 
+    217, 172, 143, 180, 152,  72, 
+     16,  12, 254,  66,   0, 215, 
+     50, 173,   1,   0,   0,   0, 
+    168,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    140,   0,   0,   0, 252,   0, 
+      0,   0, 112,   1,   0,   0, 
+     44,   2,   0,   0,  82,  68, 
+     69,  70,  80,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    254, 255,   0,   1,   0,   0, 
+     28,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+    104,   0,   0,   0,   3,   0, 
+      0,   0,   8,   0,   0,   0, 
+     80,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,   3,   3,   0,   0, 
+     89,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   1,   1,   0,   0, 
+     95,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   2,   0, 
+      0,   0,   7,   7,   0,   0, 
+     80,  79,  83,  73,  84,  73, 
+     79,  78,   0,  76,  65,  89, 
+     69,  82,   0,  84,  69,  88, 
+     67,  79,  79,  82,  68,   0, 
+     79,  83,  71,  78, 108,   0, 
+      0,   0,   3,   0,   0,   0, 
+      8,   0,   0,   0,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,  14,   0,   0,  98,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+      7,   8,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  76,  65, 
+     89,  69,  82,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171,  83,  72,  68,  82, 
+    180,   0,   0,   0,  64,   0, 
+      1,   0,  45,   0,   0,   0, 
+     95,   0,   0,   3,  50,  16, 
+     16,   0,   0,   0,   0,   0, 
+     95,   0,   0,   3,  18,  16, 
+     16,   0,   1,   0,   0,   0, 
+     95,   0,   0,   3, 114,  16, 
+     16,   0,   2,   0,   0,   0, 
+    103,   0,   0,   4, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3,  18,  32,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 114,  32,  16,   0, 
+      2,   0,   0,   0,  54,   0, 
+      0,   5,  50,  32,  16,   0, 
+      0,   0,   0,   0,  70,  16, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,  32, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    128,  63,  54,   0,   0,   5, 
+     18,  32,  16,   0,   1,   0, 
+      0,   0,  10,  16,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5, 114,  32,  16,   0, 
+      2,   0,   0,   0,  70,  18, 
+     16,   0,   2,   0,   0,   0, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      5,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      6,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughdepth2d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughdepth2d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,145 +1,145 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_DEPTH                 0    N/A   oDepth    DEPTH   float    YES
-//
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture2d (float,float,float,float) t0
-dcl_input_ps linear v1.xy
-dcl_output oDepth
-dcl_temps 1
-sample r0.xyzw, v1.xyxx, t0.xyzw, s0
-mov oDepth, r0.x
-ret 
-// Approximately 3 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughDepth2D[] =
-{
-     68,  88,  66,  67,   8,  33, 
-    154,  92, 164,  28, 139, 205, 
-      1, 168,  30, 229,  51, 127, 
-    173, 221,   1,   0,   0,   0, 
-    100,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    220,   0,   0,   0,  52,   1, 
-      0,   0, 104,   1,   0,   0, 
-    232,   1,   0,   0,  82,  68, 
-     69,  70, 160,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    109,   0,   0,   0,  92,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    100,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      4,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0,  83,  97, 109, 112, 
-    108, 101, 114,   0,  84, 101, 
-    120, 116, 117, 114, 101,  70, 
-      0,  77, 105,  99, 114, 111, 
-    115, 111, 102, 116,  32,  40, 
-     82,  41,  32,  72,  76,  83, 
-     76,  32,  83, 104,  97, 100, 
-    101, 114,  32,  67, 111, 109, 
-    112, 105, 108, 101, 114,  32, 
-     54,  46,  51,  46,  57,  54, 
-     48,  48,  46,  49,  54,  51, 
-     56,  52,   0, 171,  73,  83, 
-     71,  78,  80,   0,   0,   0, 
-      2,   0,   0,   0,   8,   0, 
-      0,   0,  56,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  68,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,   3,   3, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0, 171, 
-    171, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0, 255, 255, 
-    255, 255,   1,  14,   0,   0, 
-     83,  86,  95,  68,  69,  80, 
-     84,  72,   0, 171, 171, 171, 
-     83,  72,  68,  82, 120,   0, 
-      0,   0,  64,   0,   0,   0, 
-     30,   0,   0,   0,  90,   0, 
-      0,   3,   0,  96,  16,   0, 
-      0,   0,   0,   0,  88,  24, 
-      0,   4,   0, 112,  16,   0, 
-      0,   0,   0,   0,  85,  85, 
-      0,   0,  98,  16,   0,   3, 
-     50,  16,  16,   0,   1,   0, 
-      0,   0, 101,   0,   0,   2, 
-      1, 192,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     69,   0,   0,   9, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  16,  16,   0,   1,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,   0,  96, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   4,   1, 192, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_DEPTH                 0    N/A   oDepth    DEPTH   float    YES
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output oDepth
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov oDepth, r0.x
+ret 
+// Approximately 3 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughDepth2D[] =
+{
+     68,  88,  66,  67,   8,  33, 
+    154,  92, 164,  28, 139, 205, 
+      1, 168,  30, 229,  51, 127, 
+    173, 221,   1,   0,   0,   0, 
+    100,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    220,   0,   0,   0,  52,   1, 
+      0,   0, 104,   1,   0,   0, 
+    232,   1,   0,   0,  82,  68, 
+     69,  70, 160,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    109,   0,   0,   0,  92,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    100,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      4,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0,  83,  97, 109, 112, 
+    108, 101, 114,   0,  84, 101, 
+    120, 116, 117, 114, 101,  70, 
+      0,  77, 105,  99, 114, 111, 
+    115, 111, 102, 116,  32,  40, 
+     82,  41,  32,  72,  76,  83, 
+     76,  32,  83, 104,  97, 100, 
+    101, 114,  32,  67, 111, 109, 
+    112, 105, 108, 101, 114,  32, 
+     54,  46,  51,  46,  57,  54, 
+     48,  48,  46,  49,  54,  51, 
+     56,  52,   0, 171,  73,  83, 
+     71,  78,  80,   0,   0,   0, 
+      2,   0,   0,   0,   8,   0, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  68,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,   3,   3, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0, 171, 
+    171, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0, 255, 255, 
+    255, 255,   1,  14,   0,   0, 
+     83,  86,  95,  68,  69,  80, 
+     84,  72,   0, 171, 171, 171, 
+     83,  72,  68,  82, 120,   0, 
+      0,   0,  64,   0,   0,   0, 
+     30,   0,   0,   0,  90,   0, 
+      0,   3,   0,  96,  16,   0, 
+      0,   0,   0,   0,  88,  24, 
+      0,   4,   0, 112,  16,   0, 
+      0,   0,   0,   0,  85,  85, 
+      0,   0,  98,  16,   0,   3, 
+     50,  16,  16,   0,   1,   0, 
+      0,   0, 101,   0,   0,   2, 
+      1, 192,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     69,   0,   0,   9, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,  16,  16,   0,   1,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,   0,  96, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   4,   1, 192, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughlum2d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum2d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,196 +1,196 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-//
-// Sampler/Resource to DX9 shader sampler mappings:
-//
-// Target Sampler Source Sampler  Source Resource
-// -------------- --------------- ----------------
-// s0             s0              t0               
-//
-//
-// Level9 shader bytecode:
-//
-    ps_2_x
-    def c0, 1, 0, 0, 0
-    dcl t0.xy
-    dcl_2d s0
-    texld r0, t0, s0
-    mad r0, r0.x, c0.xxxy, c0.yyyx
-    mov oC0, r0
-
-// approximately 3 instruction slots used (1 texture, 2 arithmetic)
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture2d (float,float,float,float) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-sample r0.xyzw, v1.xyxx, t0.xyzw, s0
-mov o0.xyz, r0.xxxx
-mov o0.w, l(1.000000)
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughLum2D[] =
-{
-     68,  88,  66,  67, 144,  18, 
-    242,  89, 150, 125,  18, 219, 
-    193, 196, 127, 207,  14, 165, 
-    198, 119,   1,   0,   0,   0, 
-     28,   3,   0,   0,   6,   0, 
-      0,   0,  56,   0,   0,   0, 
-    208,   0,   0,   0, 108,   1, 
-      0,   0, 232,   1,   0,   0, 
-    144,   2,   0,   0, 232,   2, 
-      0,   0,  65, 111, 110,  57, 
-    144,   0,   0,   0, 144,   0, 
-      0,   0,   0,   2, 255, 255, 
-    104,   0,   0,   0,  40,   0, 
-      0,   0,   0,   0,  40,   0, 
-      0,   0,  40,   0,   0,   0, 
-     40,   0,   1,   0,  36,   0, 
-      0,   0,  40,   0,   0,   0, 
-      0,   0,   1,   2, 255, 255, 
-     81,   0,   0,   5,   0,   0, 
-     15, 160,   0,   0, 128,  63, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     31,   0,   0,   2,   0,   0, 
-      0, 128,   0,   0,   3, 176, 
-     31,   0,   0,   2,   0,   0, 
-      0, 144,   0,   8,  15, 160, 
-     66,   0,   0,   3,   0,   0, 
-     15, 128,   0,   0, 228, 176, 
-      0,   8, 228, 160,   4,   0, 
-      0,   4,   0,   0,  15, 128, 
-      0,   0,   0, 128,   0,   0, 
-     64, 160,   0,   0,  21, 160, 
-      1,   0,   0,   2,   0,   8, 
-     15, 128,   0,   0, 228, 128, 
-    255, 255,   0,   0,  83,  72, 
-     68,  82, 148,   0,   0,   0, 
-     64,   0,   0,   0,  37,   0, 
-      0,   0,  90,   0,   0,   3, 
-      0,  96,  16,   0,   0,   0, 
-      0,   0,  88,  24,   0,   4, 
-      0, 112,  16,   0,   0,   0, 
-      0,   0,  85,  85,   0,   0, 
-     98,  16,   0,   3,  50,  16, 
-     16,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-    104,   0,   0,   2,   1,   0, 
-      0,   0,  69,   0,   0,   9, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-      0,  96,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-    114,  32,  16,   0,   0,   0, 
-      0,   0,   6,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   5, 130,  32,  16,   0, 
-      0,   0,   0,   0,   1,  64, 
-      0,   0,   0,   0, 128,  63, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  82,  68,  69,  70, 
-    160,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,  28,   0, 
-      0,   0,   0,   4, 255, 255, 
-      0,   1,   0,   0, 109,   0, 
-      0,   0,  92,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 100,   0, 
-      0,   0,   2,   0,   0,   0, 
-      5,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     83,  97, 109, 112, 108, 101, 
-    114,   0,  84, 101, 120, 116, 
-    117, 114, 101,  70,   0,  77, 
-    105,  99, 114, 111, 115, 111, 
-    102, 116,  32,  40,  82,  41, 
-     32,  72,  76,  83,  76,  32, 
-     83, 104,  97, 100, 101, 114, 
-     32,  67, 111, 109, 112, 105, 
-    108, 101, 114,  32,  54,  46, 
-     51,  46,  57,  54,  48,  48, 
-     46,  49,  54,  51,  56,  52, 
-      0, 171,  73,  83,  71,  78, 
-     80,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     68,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0,   3,   3,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171, 171, 171, 
-     79,  83,  71,  78,  44,   0, 
-      0,   0,   1,   0,   0,   0, 
-      8,   0,   0,   0,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  83,  86, 
-     95,  84,  65,  82,  71,  69, 
-     84,   0, 171, 171
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 1, 0, 0, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0, r0.x, c0.xxxy, c0.yyyx
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.xyz, r0.xxxx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughLum2D[] =
+{
+     68,  88,  66,  67, 144,  18, 
+    242,  89, 150, 125,  18, 219, 
+    193, 196, 127, 207,  14, 165, 
+    198, 119,   1,   0,   0,   0, 
+     28,   3,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+    208,   0,   0,   0, 108,   1, 
+      0,   0, 232,   1,   0,   0, 
+    144,   2,   0,   0, 232,   2, 
+      0,   0,  65, 111, 110,  57, 
+    144,   0,   0,   0, 144,   0, 
+      0,   0,   0,   2, 255, 255, 
+    104,   0,   0,   0,  40,   0, 
+      0,   0,   0,   0,  40,   0, 
+      0,   0,  40,   0,   0,   0, 
+     40,   0,   1,   0,  36,   0, 
+      0,   0,  40,   0,   0,   0, 
+      0,   0,   1,   2, 255, 255, 
+     81,   0,   0,   5,   0,   0, 
+     15, 160,   0,   0, 128,  63, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     31,   0,   0,   2,   0,   0, 
+      0, 128,   0,   0,   3, 176, 
+     31,   0,   0,   2,   0,   0, 
+      0, 144,   0,   8,  15, 160, 
+     66,   0,   0,   3,   0,   0, 
+     15, 128,   0,   0, 228, 176, 
+      0,   8, 228, 160,   4,   0, 
+      0,   4,   0,   0,  15, 128, 
+      0,   0,   0, 128,   0,   0, 
+     64, 160,   0,   0,  21, 160, 
+      1,   0,   0,   2,   0,   8, 
+     15, 128,   0,   0, 228, 128, 
+    255, 255,   0,   0,  83,  72, 
+     68,  82, 148,   0,   0,   0, 
+     64,   0,   0,   0,  37,   0, 
+      0,   0,  90,   0,   0,   3, 
+      0,  96,  16,   0,   0,   0, 
+      0,   0,  88,  24,   0,   4, 
+      0, 112,  16,   0,   0,   0, 
+      0,   0,  85,  85,   0,   0, 
+     98,  16,   0,   3,  50,  16, 
+     16,   0,   1,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+    104,   0,   0,   2,   1,   0, 
+      0,   0,  69,   0,   0,   9, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+      0,  96,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+    114,  32,  16,   0,   0,   0, 
+      0,   0,   6,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   5, 130,  32,  16,   0, 
+      0,   0,   0,   0,   1,  64, 
+      0,   0,   0,   0, 128,  63, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  82,  68,  69,  70, 
+    160,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,  28,   0, 
+      0,   0,   0,   4, 255, 255, 
+      0,   1,   0,   0, 109,   0, 
+      0,   0,  92,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 100,   0, 
+      0,   0,   2,   0,   0,   0, 
+      5,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     83,  97, 109, 112, 108, 101, 
+    114,   0,  84, 101, 120, 116, 
+    117, 114, 101,  70,   0,  77, 
+    105,  99, 114, 111, 115, 111, 
+    102, 116,  32,  40,  82,  41, 
+     32,  72,  76,  83,  76,  32, 
+     83, 104,  97, 100, 101, 114, 
+     32,  67, 111, 109, 112, 105, 
+    108, 101, 114,  32,  54,  46, 
+     51,  46,  57,  54,  48,  48, 
+     46,  49,  54,  51,  56,  52, 
+      0, 171,  73,  83,  71,  78, 
+     80,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     68,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0,   3,   3,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171, 171, 171, 
+     79,  83,  71,  78,  44,   0, 
+      0,   0,   1,   0,   0,   0, 
+      8,   0,   0,   0,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  83,  86, 
+     95,  84,  65,  82,  71,  69, 
+     84,   0, 171, 171
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughlum3d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum3d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum3d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlum3d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,160 +1,160 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture3d (float,float,float,float) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-sample r0.xyzw, v2.xyzx, t0.xyzw, s0
-mov o0.xyz, r0.xxxx
-mov o0.w, l(1.000000)
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughLum3D[] =
-{
-     68,  88,  66,  67, 173, 177, 
-    219,  35, 149, 130,  33, 215, 
-    183, 219, 250, 244, 100,  17, 
-     62, 106,   1,   0,   0,   0, 
-    176,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    220,   0,   0,   0, 100,   1, 
-      0,   0, 152,   1,   0,   0, 
-     52,   2,   0,   0,  82,  68, 
-     69,  70, 160,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    109,   0,   0,   0,  92,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    100,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      8,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0,  83,  97, 109, 112, 
-    108, 101, 114,   0,  84, 101, 
-    120, 116, 117, 114, 101,  70, 
-      0,  77, 105,  99, 114, 111, 
-    115, 111, 102, 116,  32,  40, 
-     82,  41,  32,  72,  76,  83, 
-     76,  32,  83, 104,  97, 100, 
-    101, 114,  32,  67, 111, 109, 
-    112, 105, 108, 101, 114,  32, 
-     54,  46,  51,  46,  57,  54, 
-     48,  48,  46,  49,  54,  51, 
-     56,  52,   0, 171,  73,  83, 
-     71,  78, 128,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0, 118,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0,   7,   7, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  83,  86,  95,  82, 
-     69,  78,  68,  69,  82,  84, 
-     65,  82,  71,  69,  84,  65, 
-     82,  82,  65,  89,  73,  78, 
-     68,  69,  88,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82, 148,   0, 
-      0,   0,  64,   0,   0,   0, 
-     37,   0,   0,   0,  90,   0, 
-      0,   3,   0,  96,  16,   0, 
-      0,   0,   0,   0,  88,  40, 
-      0,   4,   0, 112,  16,   0, 
-      0,   0,   0,   0,  85,  85, 
-      0,   0,  98,  16,   0,   3, 
-    114,  16,  16,   0,   2,   0, 
-      0,   0, 101,   0,   0,   3, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0, 104,   0,   0,   2, 
-      1,   0,   0,   0,  69,   0, 
-      0,   9, 242,   0,  16,   0, 
-      0,   0,   0,   0,  70,  18, 
-     16,   0,   2,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,   0,  96,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   5, 114,  32,  16,   0, 
-      0,   0,   0,   0,   6,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,  32, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-    128,  63,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   4,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov o0.xyz, r0.xxxx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughLum3D[] =
+{
+     68,  88,  66,  67, 173, 177, 
+    219,  35, 149, 130,  33, 215, 
+    183, 219, 250, 244, 100,  17, 
+     62, 106,   1,   0,   0,   0, 
+    176,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    220,   0,   0,   0, 100,   1, 
+      0,   0, 152,   1,   0,   0, 
+     52,   2,   0,   0,  82,  68, 
+     69,  70, 160,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    109,   0,   0,   0,  92,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    100,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      8,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0,  83,  97, 109, 112, 
+    108, 101, 114,   0,  84, 101, 
+    120, 116, 117, 114, 101,  70, 
+      0,  77, 105,  99, 114, 111, 
+    115, 111, 102, 116,  32,  40, 
+     82,  41,  32,  72,  76,  83, 
+     76,  32,  83, 104,  97, 100, 
+    101, 114,  32,  67, 111, 109, 
+    112, 105, 108, 101, 114,  32, 
+     54,  46,  51,  46,  57,  54, 
+     48,  48,  46,  49,  54,  51, 
+     56,  52,   0, 171,  73,  83, 
+     71,  78, 128,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0, 118,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0,   7,   7, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  83,  86,  95,  82, 
+     69,  78,  68,  69,  82,  84, 
+     65,  82,  71,  69,  84,  65, 
+     82,  82,  65,  89,  73,  78, 
+     68,  69,  88,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82, 148,   0, 
+      0,   0,  64,   0,   0,   0, 
+     37,   0,   0,   0,  90,   0, 
+      0,   3,   0,  96,  16,   0, 
+      0,   0,   0,   0,  88,  40, 
+      0,   4,   0, 112,  16,   0, 
+      0,   0,   0,   0,  85,  85, 
+      0,   0,  98,  16,   0,   3, 
+    114,  16,  16,   0,   2,   0, 
+      0,   0, 101,   0,   0,   3, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0, 104,   0,   0,   2, 
+      1,   0,   0,   0,  69,   0, 
+      0,   9, 242,   0,  16,   0, 
+      0,   0,   0,   0,  70,  18, 
+     16,   0,   2,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,   0,  96,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   5, 114,  32,  16,   0, 
+      0,   0,   0,   0,   6,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,  32, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+    128,  63,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   4,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughlumalpha2d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha2d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,185 +1,185 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-//
-// Sampler/Resource to DX9 shader sampler mappings:
-//
-// Target Sampler Source Sampler  Source Resource
-// -------------- --------------- ----------------
-// s0             s0              t0               
-//
-//
-// Level9 shader bytecode:
-//
-    ps_2_x
-    dcl t0.xy
-    dcl_2d s0
-    texld r0, t0, s0
-    mov r0, r0.xxxw
-    mov oC0, r0
-
-// approximately 3 instruction slots used (1 texture, 2 arithmetic)
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture2d (float,float,float,float) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-sample r0.xyzw, v1.xyxx, t0.xyzw, s0
-mov o0.xyzw, r0.xxxw
-ret 
-// Approximately 3 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughLumAlpha2D[] =
-{
-     68,  88,  66,  67, 246, 240, 
-    158, 208, 214, 197, 166, 221, 
-     45,  58, 235, 164,  12, 157, 
-     62,  31,   1,   0,   0,   0, 
-    232,   2,   0,   0,   6,   0, 
-      0,   0,  56,   0,   0,   0, 
-    176,   0,   0,   0,  56,   1, 
-      0,   0, 180,   1,   0,   0, 
-     92,   2,   0,   0, 180,   2, 
-      0,   0,  65, 111, 110,  57, 
-    112,   0,   0,   0, 112,   0, 
-      0,   0,   0,   2, 255, 255, 
-     72,   0,   0,   0,  40,   0, 
-      0,   0,   0,   0,  40,   0, 
-      0,   0,  40,   0,   0,   0, 
-     40,   0,   1,   0,  36,   0, 
-      0,   0,  40,   0,   0,   0, 
-      0,   0,   1,   2, 255, 255, 
-     31,   0,   0,   2,   0,   0, 
-      0, 128,   0,   0,   3, 176, 
-     31,   0,   0,   2,   0,   0, 
-      0, 144,   0,   8,  15, 160, 
-     66,   0,   0,   3,   0,   0, 
-     15, 128,   0,   0, 228, 176, 
-      0,   8, 228, 160,   1,   0, 
-      0,   2,   0,   0,  15, 128, 
-      0,   0, 192, 128,   1,   0, 
-      0,   2,   0,   8,  15, 128, 
-      0,   0, 228, 128, 255, 255, 
-      0,   0,  83,  72,  68,  82, 
-    128,   0,   0,   0,  64,   0, 
-      0,   0,  32,   0,   0,   0, 
-     90,   0,   0,   3,   0,  96, 
-     16,   0,   0,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     85,  85,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     69,   0,   0,   9, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  16,  16,   0,   1,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,   0,  96, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-      6,  12,  16,   0,   0,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  82,  68, 
-     69,  70, 160,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    109,   0,   0,   0,  92,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    100,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      4,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0,  83,  97, 109, 112, 
-    108, 101, 114,   0,  84, 101, 
-    120, 116, 117, 114, 101,  70, 
-      0,  77, 105,  99, 114, 111, 
-    115, 111, 102, 116,  32,  40, 
-     82,  41,  32,  72,  76,  83, 
-     76,  32,  83, 104,  97, 100, 
-    101, 114,  32,  67, 111, 109, 
-    112, 105, 108, 101, 114,  32, 
-     54,  46,  51,  46,  57,  54, 
-     48,  48,  46,  49,  54,  51, 
-     56,  52,   0, 171,  73,  83, 
-     71,  78,  80,   0,   0,   0, 
-      2,   0,   0,   0,   8,   0, 
-      0,   0,  56,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  68,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,   3,   3, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0, 171, 
-    171, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mov r0, r0.xxxw
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.xyzw, r0.xxxw
+ret 
+// Approximately 3 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughLumAlpha2D[] =
+{
+     68,  88,  66,  67, 246, 240, 
+    158, 208, 214, 197, 166, 221, 
+     45,  58, 235, 164,  12, 157, 
+     62,  31,   1,   0,   0,   0, 
+    232,   2,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+    176,   0,   0,   0,  56,   1, 
+      0,   0, 180,   1,   0,   0, 
+     92,   2,   0,   0, 180,   2, 
+      0,   0,  65, 111, 110,  57, 
+    112,   0,   0,   0, 112,   0, 
+      0,   0,   0,   2, 255, 255, 
+     72,   0,   0,   0,  40,   0, 
+      0,   0,   0,   0,  40,   0, 
+      0,   0,  40,   0,   0,   0, 
+     40,   0,   1,   0,  36,   0, 
+      0,   0,  40,   0,   0,   0, 
+      0,   0,   1,   2, 255, 255, 
+     31,   0,   0,   2,   0,   0, 
+      0, 128,   0,   0,   3, 176, 
+     31,   0,   0,   2,   0,   0, 
+      0, 144,   0,   8,  15, 160, 
+     66,   0,   0,   3,   0,   0, 
+     15, 128,   0,   0, 228, 176, 
+      0,   8, 228, 160,   1,   0, 
+      0,   2,   0,   0,  15, 128, 
+      0,   0, 192, 128,   1,   0, 
+      0,   2,   0,   8,  15, 128, 
+      0,   0, 228, 128, 255, 255, 
+      0,   0,  83,  72,  68,  82, 
+    128,   0,   0,   0,  64,   0, 
+      0,   0,  32,   0,   0,   0, 
+     90,   0,   0,   3,   0,  96, 
+     16,   0,   0,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     85,  85,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     69,   0,   0,   9, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,  16,  16,   0,   1,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,   0,  96, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+      6,  12,  16,   0,   0,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  82,  68, 
+     69,  70, 160,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    109,   0,   0,   0,  92,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    100,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      4,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0,  83,  97, 109, 112, 
+    108, 101, 114,   0,  84, 101, 
+    120, 116, 117, 114, 101,  70, 
+      0,  77, 105,  99, 114, 111, 
+    115, 111, 102, 116,  32,  40, 
+     82,  41,  32,  72,  76,  83, 
+     76,  32,  83, 104,  97, 100, 
+    101, 114,  32,  67, 111, 109, 
+    112, 105, 108, 101, 114,  32, 
+     54,  46,  51,  46,  57,  54, 
+     48,  48,  46,  49,  54,  51, 
+     56,  52,   0, 171,  73,  83, 
+     71,  78,  80,   0,   0,   0, 
+      2,   0,   0,   0,   8,   0, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  68,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,   3,   3, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0, 171, 
+    171, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughlumalpha3d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha3d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha3d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughlumalpha3d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,156 +1,156 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture3d (float,float,float,float) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-sample r0.xyzw, v2.xyzx, t0.xyzw, s0
-mov o0.xyzw, r0.xxxw
-ret 
-// Approximately 3 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughLumAlpha3D[] =
-{
-     68,  88,  66,  67, 224, 152, 
-    208, 227,  44, 106,  62, 235, 
-    129,  97, 207, 213,  29, 232, 
-    163,   6,   1,   0,   0,   0, 
-    156,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    220,   0,   0,   0, 100,   1, 
-      0,   0, 152,   1,   0,   0, 
-     32,   2,   0,   0,  82,  68, 
-     69,  70, 160,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    109,   0,   0,   0,  92,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    100,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      8,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0,  83,  97, 109, 112, 
-    108, 101, 114,   0,  84, 101, 
-    120, 116, 117, 114, 101,  70, 
-      0,  77, 105,  99, 114, 111, 
-    115, 111, 102, 116,  32,  40, 
-     82,  41,  32,  72,  76,  83, 
-     76,  32,  83, 104,  97, 100, 
-    101, 114,  32,  67, 111, 109, 
-    112, 105, 108, 101, 114,  32, 
-     54,  46,  51,  46,  57,  54, 
-     48,  48,  46,  49,  54,  51, 
-     56,  52,   0, 171,  73,  83, 
-     71,  78, 128,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0, 118,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0,   7,   7, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  83,  86,  95,  82, 
-     69,  78,  68,  69,  82,  84, 
-     65,  82,  71,  69,  84,  65, 
-     82,  82,  65,  89,  73,  78, 
-     68,  69,  88,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82, 128,   0, 
-      0,   0,  64,   0,   0,   0, 
-     32,   0,   0,   0,  90,   0, 
-      0,   3,   0,  96,  16,   0, 
-      0,   0,   0,   0,  88,  40, 
-      0,   4,   0, 112,  16,   0, 
-      0,   0,   0,   0,  85,  85, 
-      0,   0,  98,  16,   0,   3, 
-    114,  16,  16,   0,   2,   0, 
-      0,   0, 101,   0,   0,   3, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0, 104,   0,   0,   2, 
-      1,   0,   0,   0,  69,   0, 
-      0,   9, 242,   0,  16,   0, 
-      0,   0,   0,   0,  70,  18, 
-     16,   0,   2,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,   0,  96,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   5, 242,  32,  16,   0, 
-      0,   0,   0,   0,   6,  12, 
-     16,   0,   0,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov o0.xyzw, r0.xxxw
+ret 
+// Approximately 3 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughLumAlpha3D[] =
+{
+     68,  88,  66,  67, 224, 152, 
+    208, 227,  44, 106,  62, 235, 
+    129,  97, 207, 213,  29, 232, 
+    163,   6,   1,   0,   0,   0, 
+    156,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    220,   0,   0,   0, 100,   1, 
+      0,   0, 152,   1,   0,   0, 
+     32,   2,   0,   0,  82,  68, 
+     69,  70, 160,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    109,   0,   0,   0,  92,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    100,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      8,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0,  83,  97, 109, 112, 
+    108, 101, 114,   0,  84, 101, 
+    120, 116, 117, 114, 101,  70, 
+      0,  77, 105,  99, 114, 111, 
+    115, 111, 102, 116,  32,  40, 
+     82,  41,  32,  72,  76,  83, 
+     76,  32,  83, 104,  97, 100, 
+    101, 114,  32,  67, 111, 109, 
+    112, 105, 108, 101, 114,  32, 
+     54,  46,  51,  46,  57,  54, 
+     48,  48,  46,  49,  54,  51, 
+     56,  52,   0, 171,  73,  83, 
+     71,  78, 128,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0, 118,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0,   7,   7, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  83,  86,  95,  82, 
+     69,  78,  68,  69,  82,  84, 
+     65,  82,  71,  69,  84,  65, 
+     82,  82,  65,  89,  73,  78, 
+     68,  69,  88,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82, 128,   0, 
+      0,   0,  64,   0,   0,   0, 
+     32,   0,   0,   0,  90,   0, 
+      0,   3,   0,  96,  16,   0, 
+      0,   0,   0,   0,  88,  40, 
+      0,   4,   0, 112,  16,   0, 
+      0,   0,   0,   0,  85,  85, 
+      0,   0,  98,  16,   0,   3, 
+    114,  16,  16,   0,   2,   0, 
+      0,   0, 101,   0,   0,   3, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0, 104,   0,   0,   2, 
+      1,   0,   0,   0,  69,   0, 
+      0,   9, 242,   0,  16,   0, 
+      0,   0,   0,   0,  70,  18, 
+     16,   0,   2,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,   0,  96,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   5, 242,  32,  16,   0, 
+      0,   0,   0,   0,   6,  12, 
+     16,   0,   0,   0,   0,   0, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr2d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,198 +1,198 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-//
-// Sampler/Resource to DX9 shader sampler mappings:
-//
-// Target Sampler Source Sampler  Source Resource
-// -------------- --------------- ----------------
-// s0             s0              t0               
-//
-//
-// Level9 shader bytecode:
-//
-    ps_2_x
-    def c0, 1, 0, 0, 0
-    dcl t0.xy
-    dcl_2d s0
-    texld r0, t0, s0
-    mad r0, r0.x, c0.xyyy, c0.yyyx
-    mov oC0, r0
-
-// approximately 3 instruction slots used (1 texture, 2 arithmetic)
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture2d (float,float,float,float) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-sample r0.xyzw, v1.xyxx, t0.xyzw, s0
-mov o0.x, r0.x
-mov o0.yzw, l(0,0,0,1.000000)
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughR2D[] =
-{
-     68,  88,  66,  67, 212, 251, 
-    117, 250,  99, 185,  28,  44, 
-    178,  14,  83, 133, 173,   0, 
-    182, 196,   1,   0,   0,   0, 
-     40,   3,   0,   0,   6,   0, 
-      0,   0,  56,   0,   0,   0, 
-    208,   0,   0,   0, 120,   1, 
-      0,   0, 244,   1,   0,   0, 
-    156,   2,   0,   0, 244,   2, 
-      0,   0,  65, 111, 110,  57, 
-    144,   0,   0,   0, 144,   0, 
-      0,   0,   0,   2, 255, 255, 
-    104,   0,   0,   0,  40,   0, 
-      0,   0,   0,   0,  40,   0, 
-      0,   0,  40,   0,   0,   0, 
-     40,   0,   1,   0,  36,   0, 
-      0,   0,  40,   0,   0,   0, 
-      0,   0,   1,   2, 255, 255, 
-     81,   0,   0,   5,   0,   0, 
-     15, 160,   0,   0, 128,  63, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     31,   0,   0,   2,   0,   0, 
-      0, 128,   0,   0,   3, 176, 
-     31,   0,   0,   2,   0,   0, 
-      0, 144,   0,   8,  15, 160, 
-     66,   0,   0,   3,   0,   0, 
-     15, 128,   0,   0, 228, 176, 
-      0,   8, 228, 160,   4,   0, 
-      0,   4,   0,   0,  15, 128, 
-      0,   0,   0, 128,   0,   0, 
-     84, 160,   0,   0,  21, 160, 
-      1,   0,   0,   2,   0,   8, 
-     15, 128,   0,   0, 228, 128, 
-    255, 255,   0,   0,  83,  72, 
-     68,  82, 160,   0,   0,   0, 
-     64,   0,   0,   0,  40,   0, 
-      0,   0,  90,   0,   0,   3, 
-      0,  96,  16,   0,   0,   0, 
-      0,   0,  88,  24,   0,   4, 
-      0, 112,  16,   0,   0,   0, 
-      0,   0,  85,  85,   0,   0, 
-     98,  16,   0,   3,  50,  16, 
-     16,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-    104,   0,   0,   2,   1,   0, 
-      0,   0,  69,   0,   0,   9, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-      0,  96,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-     18,  32,  16,   0,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   8, 226,  32,  16,   0, 
-      0,   0,   0,   0,   2,  64, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0, 128,  63, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  82,  68,  69,  70, 
-    160,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,  28,   0, 
-      0,   0,   0,   4, 255, 255, 
-      0,   1,   0,   0, 109,   0, 
-      0,   0,  92,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 100,   0, 
-      0,   0,   2,   0,   0,   0, 
-      5,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     83,  97, 109, 112, 108, 101, 
-    114,   0,  84, 101, 120, 116, 
-    117, 114, 101,  70,   0,  77, 
-    105,  99, 114, 111, 115, 111, 
-    102, 116,  32,  40,  82,  41, 
-     32,  72,  76,  83,  76,  32, 
-     83, 104,  97, 100, 101, 114, 
-     32,  67, 111, 109, 112, 105, 
-    108, 101, 114,  32,  54,  46, 
-     51,  46,  57,  54,  48,  48, 
-     46,  49,  54,  51,  56,  52, 
-      0, 171,  73,  83,  71,  78, 
-     80,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     68,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0,   3,   3,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171, 171, 171, 
-     79,  83,  71,  78,  44,   0, 
-      0,   0,   1,   0,   0,   0, 
-      8,   0,   0,   0,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  83,  86, 
-     95,  84,  65,  82,  71,  69, 
-     84,   0, 171, 171
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 1, 0, 0, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0, r0.x, c0.xyyy, c0.yyyx
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR2D[] =
+{
+     68,  88,  66,  67, 212, 251, 
+    117, 250,  99, 185,  28,  44, 
+    178,  14,  83, 133, 173,   0, 
+    182, 196,   1,   0,   0,   0, 
+     40,   3,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+    208,   0,   0,   0, 120,   1, 
+      0,   0, 244,   1,   0,   0, 
+    156,   2,   0,   0, 244,   2, 
+      0,   0,  65, 111, 110,  57, 
+    144,   0,   0,   0, 144,   0, 
+      0,   0,   0,   2, 255, 255, 
+    104,   0,   0,   0,  40,   0, 
+      0,   0,   0,   0,  40,   0, 
+      0,   0,  40,   0,   0,   0, 
+     40,   0,   1,   0,  36,   0, 
+      0,   0,  40,   0,   0,   0, 
+      0,   0,   1,   2, 255, 255, 
+     81,   0,   0,   5,   0,   0, 
+     15, 160,   0,   0, 128,  63, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     31,   0,   0,   2,   0,   0, 
+      0, 128,   0,   0,   3, 176, 
+     31,   0,   0,   2,   0,   0, 
+      0, 144,   0,   8,  15, 160, 
+     66,   0,   0,   3,   0,   0, 
+     15, 128,   0,   0, 228, 176, 
+      0,   8, 228, 160,   4,   0, 
+      0,   4,   0,   0,  15, 128, 
+      0,   0,   0, 128,   0,   0, 
+     84, 160,   0,   0,  21, 160, 
+      1,   0,   0,   2,   0,   8, 
+     15, 128,   0,   0, 228, 128, 
+    255, 255,   0,   0,  83,  72, 
+     68,  82, 160,   0,   0,   0, 
+     64,   0,   0,   0,  40,   0, 
+      0,   0,  90,   0,   0,   3, 
+      0,  96,  16,   0,   0,   0, 
+      0,   0,  88,  24,   0,   4, 
+      0, 112,  16,   0,   0,   0, 
+      0,   0,  85,  85,   0,   0, 
+     98,  16,   0,   3,  50,  16, 
+     16,   0,   1,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+    104,   0,   0,   2,   1,   0, 
+      0,   0,  69,   0,   0,   9, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+      0,  96,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+     18,  32,  16,   0,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   8, 226,  32,  16,   0, 
+      0,   0,   0,   0,   2,  64, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 128,  63, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  82,  68,  69,  70, 
+    160,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,  28,   0, 
+      0,   0,   0,   4, 255, 255, 
+      0,   1,   0,   0, 109,   0, 
+      0,   0,  92,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 100,   0, 
+      0,   0,   2,   0,   0,   0, 
+      5,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     83,  97, 109, 112, 108, 101, 
+    114,   0,  84, 101, 120, 116, 
+    117, 114, 101,  70,   0,  77, 
+    105,  99, 114, 111, 115, 111, 
+    102, 116,  32,  40,  82,  41, 
+     32,  72,  76,  83,  76,  32, 
+     83, 104,  97, 100, 101, 114, 
+     32,  67, 111, 109, 112, 105, 
+    108, 101, 114,  32,  54,  46, 
+     51,  46,  57,  54,  48,  48, 
+     46,  49,  54,  51,  56,  52, 
+      0, 171,  73,  83,  71,  78, 
+     80,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     68,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0,   3,   3,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171, 171, 171, 
+     79,  83,  71,  78,  44,   0, 
+      0,   0,   1,   0,   0,   0, 
+      8,   0,   0,   0,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  83,  86, 
+     95,  84,  65,  82,  71,  69, 
+     84,   0, 171, 171
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr2di11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2di11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2di11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2di11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,167 +1,167 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI                          texture   sint4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_resource_texture2d (sint,sint,sint,sint) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v1.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.zw, l(0,0,0,0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.x, r0.x
-mov o0.yzw, l(0,0,0,0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughR2DI[] =
-{
-     68,  88,  66,  67, 123, 230, 
-     45,  18,  63, 217,  12, 210, 
-    151, 254,  16,  78, 107, 211, 
-     57, 255,   1,   0,   0,   0, 
-    208,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  12,   1, 
-      0,   0,  64,   1,   0,   0, 
-     84,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     69,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  73,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   3,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-     12,   1,   0,   0,  64,   0, 
-      0,   0,  67,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     51,  51,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  27,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5,  18,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   8, 
-    226,  32,  16,   0,   0,   0, 
-      0,   0,   2,  64,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (sint,sint,sint,sint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR2DI[] =
+{
+     68,  88,  66,  67, 123, 230, 
+     45,  18,  63, 217,  12, 210, 
+    151, 254,  16,  78, 107, 211, 
+     57, 255,   1,   0,   0,   0, 
+    208,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  12,   1, 
+      0,   0,  64,   1,   0,   0, 
+     84,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     69,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  73,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   3,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+     12,   1,   0,   0,  64,   0, 
+      0,   0,  67,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     51,  51,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  27,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5,  18,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   8, 
+    226,  32,  16,   0,   0,   0, 
+      0,   0,   2,  64,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr2dui11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2dui11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2dui11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr2dui11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,167 +1,167 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI                         texture   uint4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_resource_texture2d (uint,uint,uint,uint) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v1.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.zw, l(0,0,0,0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.x, r0.x
-mov o0.yzw, l(0,0,0,0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughR2DUI[] =
-{
-     68,  88,  66,  67,   4,  26, 
-     62, 109,  94,  45, 124, 238, 
-    150, 245,  85, 155, 185,  37, 
-    234, 152,   1,   0,   0,   0, 
-    208,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  12,   1, 
-      0,   0,  64,   1,   0,   0, 
-     84,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     70,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  85,  73,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   3,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-     12,   1,   0,   0,  64,   0, 
-      0,   0,  67,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     68,  68,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  27,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5,  18,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   8, 
-    226,  32,  16,   0,   0,   0, 
-      0,   0,   2,  64,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (uint,uint,uint,uint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR2DUI[] =
+{
+     68,  88,  66,  67,   4,  26, 
+     62, 109,  94,  45, 124, 238, 
+    150, 245,  85, 155, 185,  37, 
+    234, 152,   1,   0,   0,   0, 
+    208,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  12,   1, 
+      0,   0,  64,   1,   0,   0, 
+     84,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     70,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  85,  73,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   3,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+     12,   1,   0,   0,  64,   0, 
+      0,   0,  67,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     68,  68,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  27,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5,  18,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   8, 
+    226,  32,  16,   0,   0,   0, 
+      0,   0,   2,  64,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr3d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,162 +1,162 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture3d (float,float,float,float) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-sample r0.xyzw, v2.xyzx, t0.xyzw, s0
-mov o0.x, r0.x
-mov o0.yzw, l(0,0,0,1.000000)
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughR3D[] =
-{
-     68,  88,  66,  67,  11, 235, 
-    208, 143, 219, 183, 141,  78, 
-    136, 182,  62, 182, 243,  12, 
-    239, 125,   1,   0,   0,   0, 
-    188,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    220,   0,   0,   0, 100,   1, 
-      0,   0, 152,   1,   0,   0, 
-     64,   2,   0,   0,  82,  68, 
-     69,  70, 160,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    109,   0,   0,   0,  92,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    100,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      8,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0,  83,  97, 109, 112, 
-    108, 101, 114,   0,  84, 101, 
-    120, 116, 117, 114, 101,  70, 
-      0,  77, 105,  99, 114, 111, 
-    115, 111, 102, 116,  32,  40, 
-     82,  41,  32,  72,  76,  83, 
-     76,  32,  83, 104,  97, 100, 
-    101, 114,  32,  67, 111, 109, 
-    112, 105, 108, 101, 114,  32, 
-     54,  46,  51,  46,  57,  54, 
-     48,  48,  46,  49,  54,  51, 
-     56,  52,   0, 171,  73,  83, 
-     71,  78, 128,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0, 118,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0,   7,   7, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  83,  86,  95,  82, 
-     69,  78,  68,  69,  82,  84, 
-     65,  82,  71,  69,  84,  65, 
-     82,  82,  65,  89,  73,  78, 
-     68,  69,  88,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82, 160,   0, 
-      0,   0,  64,   0,   0,   0, 
-     40,   0,   0,   0,  90,   0, 
-      0,   3,   0,  96,  16,   0, 
-      0,   0,   0,   0,  88,  40, 
-      0,   4,   0, 112,  16,   0, 
-      0,   0,   0,   0,  85,  85, 
-      0,   0,  98,  16,   0,   3, 
-    114,  16,  16,   0,   2,   0, 
-      0,   0, 101,   0,   0,   3, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0, 104,   0,   0,   2, 
-      1,   0,   0,   0,  69,   0, 
-      0,   9, 242,   0,  16,   0, 
-      0,   0,   0,   0,  70,  18, 
-     16,   0,   2,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,   0,  96,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   5,  18,  32,  16,   0, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 226,  32, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    128,  63,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   4,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR3D[] =
+{
+     68,  88,  66,  67,  11, 235, 
+    208, 143, 219, 183, 141,  78, 
+    136, 182,  62, 182, 243,  12, 
+    239, 125,   1,   0,   0,   0, 
+    188,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    220,   0,   0,   0, 100,   1, 
+      0,   0, 152,   1,   0,   0, 
+     64,   2,   0,   0,  82,  68, 
+     69,  70, 160,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    109,   0,   0,   0,  92,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    100,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      8,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0,  83,  97, 109, 112, 
+    108, 101, 114,   0,  84, 101, 
+    120, 116, 117, 114, 101,  70, 
+      0,  77, 105,  99, 114, 111, 
+    115, 111, 102, 116,  32,  40, 
+     82,  41,  32,  72,  76,  83, 
+     76,  32,  83, 104,  97, 100, 
+    101, 114,  32,  67, 111, 109, 
+    112, 105, 108, 101, 114,  32, 
+     54,  46,  51,  46,  57,  54, 
+     48,  48,  46,  49,  54,  51, 
+     56,  52,   0, 171,  73,  83, 
+     71,  78, 128,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0, 118,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0,   7,   7, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  83,  86,  95,  82, 
+     69,  78,  68,  69,  82,  84, 
+     65,  82,  71,  69,  84,  65, 
+     82,  82,  65,  89,  73,  78, 
+     68,  69,  88,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82, 160,   0, 
+      0,   0,  64,   0,   0,   0, 
+     40,   0,   0,   0,  90,   0, 
+      0,   3,   0,  96,  16,   0, 
+      0,   0,   0,   0,  88,  40, 
+      0,   4,   0, 112,  16,   0, 
+      0,   0,   0,   0,  85,  85, 
+      0,   0,  98,  16,   0,   3, 
+    114,  16,  16,   0,   2,   0, 
+      0,   0, 101,   0,   0,   3, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0, 104,   0,   0,   2, 
+      1,   0,   0,   0,  69,   0, 
+      0,   9, 242,   0,  16,   0, 
+      0,   0,   0,   0,  70,  18, 
+     16,   0,   2,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,   0,  96,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   5,  18,  32,  16,   0, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 226,  32, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    128,  63,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   4,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr3di11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3di11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3di11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3di11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,174 +1,174 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI                          texture   sint4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_resource_texture3d (sint,sint,sint,sint) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xyz, r0.xyzx
-mul r0.xyz, r0.xyzx, v2.xyzx
-ftoi r0.xyz, r0.xyzx
-mov r0.w, l(0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.x, r0.x
-mov o0.yzw, l(0,0,0,0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughR3DI[] =
-{
-     68,  88,  66,  67, 222, 251, 
-     30,  61,  15,  80,  81, 247, 
-    175, 137,  44,  19,  23,  84, 
-    149, 211,   1,   0,   0,   0, 
-    244,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  60,   1, 
-      0,   0, 112,   1,   0,   0, 
-    120,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     69,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  73,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-     73,  83,  71,  78, 128,   0, 
-      0,   0,   3,   0,   0,   0, 
-      8,   0,   0,   0,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 118,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   7,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  83,  86, 
-     95,  82,  69,  78,  68,  69, 
-     82,  84,  65,  82,  71,  69, 
-     84,  65,  82,  82,  65,  89, 
-     73,  78,  68,  69,  88,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-      0,   1,   0,   0,  64,   0, 
-      0,   0,  64,   0,   0,   0, 
-     88,  40,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     51,  51,   0,   0,  98,  16, 
-      0,   3, 114,  16,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  27,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5,  18,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   8, 
-    226,  32,  16,   0,   0,   0, 
-      0,   0,   2,  64,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (sint,sint,sint,sint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR3DI[] =
+{
+     68,  88,  66,  67, 222, 251, 
+     30,  61,  15,  80,  81, 247, 
+    175, 137,  44,  19,  23,  84, 
+    149, 211,   1,   0,   0,   0, 
+    244,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  60,   1, 
+      0,   0, 112,   1,   0,   0, 
+    120,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     69,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  73,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+     73,  83,  71,  78, 128,   0, 
+      0,   0,   3,   0,   0,   0, 
+      8,   0,   0,   0,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 118,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+      7,   7,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  83,  86, 
+     95,  82,  69,  78,  68,  69, 
+     82,  84,  65,  82,  71,  69, 
+     84,  65,  82,  82,  65,  89, 
+     73,  78,  68,  69,  88,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+      0,   1,   0,   0,  64,   0, 
+      0,   0,  64,   0,   0,   0, 
+     88,  40,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     51,  51,   0,   0,  98,  16, 
+      0,   3, 114,  16,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7, 114,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  27,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5,  18,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   8, 
+    226,  32,  16,   0,   0,   0, 
+      0,   0,   2,  64,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughr3dui11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3dui11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3dui11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughr3dui11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,174 +1,174 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI                         texture   uint4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_resource_texture3d (uint,uint,uint,uint) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xyz, r0.xyzx
-mul r0.xyz, r0.xyzx, v2.xyzx
-ftoi r0.xyz, r0.xyzx
-mov r0.w, l(0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.x, r0.x
-mov o0.yzw, l(0,0,0,0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughR3DUI[] =
-{
-     68,  88,  66,  67,  69,   5, 
-     86, 212, 201,  54,  97, 205, 
-     89, 161, 100,  72, 246, 114, 
-     40, 214,   1,   0,   0,   0, 
-    244,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  60,   1, 
-      0,   0, 112,   1,   0,   0, 
-    120,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     70,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   8,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  85,  73,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-     73,  83,  71,  78, 128,   0, 
-      0,   0,   3,   0,   0,   0, 
-      8,   0,   0,   0,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 118,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   7,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  83,  86, 
-     95,  82,  69,  78,  68,  69, 
-     82,  84,  65,  82,  71,  69, 
-     84,  65,  82,  82,  65,  89, 
-     73,  78,  68,  69,  88,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-      0,   1,   0,   0,  64,   0, 
-      0,   0,  64,   0,   0,   0, 
-     88,  40,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     68,  68,   0,   0,  98,  16, 
-      0,   3, 114,  16,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  27,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5,  18,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   8, 
-    226,  32,  16,   0,   0,   0, 
-      0,   0,   2,  64,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (uint,uint,uint,uint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.x, r0.x
+mov o0.yzw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughR3DUI[] =
+{
+     68,  88,  66,  67,  69,   5, 
+     86, 212, 201,  54,  97, 205, 
+     89, 161, 100,  72, 246, 114, 
+     40, 214,   1,   0,   0,   0, 
+    244,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  60,   1, 
+      0,   0, 112,   1,   0,   0, 
+    120,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     70,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   8,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  85,  73,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+     73,  83,  71,  78, 128,   0, 
+      0,   0,   3,   0,   0,   0, 
+      8,   0,   0,   0,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 118,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+      7,   7,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  83,  86, 
+     95,  82,  69,  78,  68,  69, 
+     82,  84,  65,  82,  71,  69, 
+     84,  65,  82,  82,  65,  89, 
+     73,  78,  68,  69,  88,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+      0,   1,   0,   0,  64,   0, 
+      0,   0,  64,   0,   0,   0, 
+     88,  40,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     68,  68,   0,   0,  98,  16, 
+      0,   3, 114,  16,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7, 114,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  27,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5,  18,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   8, 
+    226,  32,  16,   0,   0,   0, 
+      0,   0,   2,  64,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg2d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,198 +1,198 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-//
-// Sampler/Resource to DX9 shader sampler mappings:
-//
-// Target Sampler Source Sampler  Source Resource
-// -------------- --------------- ----------------
-// s0             s0              t0               
-//
-//
-// Level9 shader bytecode:
-//
-    ps_2_x
-    def c0, 1, 0, 0, 0
-    dcl t0.xy
-    dcl_2d s0
-    texld r0, t0, s0
-    mad r0, r0.xyxx, c0.xxyy, c0.yyyx
-    mov oC0, r0
-
-// approximately 3 instruction slots used (1 texture, 2 arithmetic)
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture2d (float,float,float,float) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-sample r0.xyzw, v1.xyxx, t0.xyzw, s0
-mov o0.xy, r0.xyxx
-mov o0.zw, l(0,0,0,1.000000)
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRG2D[] =
-{
-     68,  88,  66,  67, 217, 171, 
-    153, 248,  26,  15, 102, 119, 
-     86, 174, 121, 245, 223,  83, 
-      2, 181,   1,   0,   0,   0, 
-     40,   3,   0,   0,   6,   0, 
-      0,   0,  56,   0,   0,   0, 
-    208,   0,   0,   0, 120,   1, 
-      0,   0, 244,   1,   0,   0, 
-    156,   2,   0,   0, 244,   2, 
-      0,   0,  65, 111, 110,  57, 
-    144,   0,   0,   0, 144,   0, 
-      0,   0,   0,   2, 255, 255, 
-    104,   0,   0,   0,  40,   0, 
-      0,   0,   0,   0,  40,   0, 
-      0,   0,  40,   0,   0,   0, 
-     40,   0,   1,   0,  36,   0, 
-      0,   0,  40,   0,   0,   0, 
-      0,   0,   1,   2, 255, 255, 
-     81,   0,   0,   5,   0,   0, 
-     15, 160,   0,   0, 128,  63, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     31,   0,   0,   2,   0,   0, 
-      0, 128,   0,   0,   3, 176, 
-     31,   0,   0,   2,   0,   0, 
-      0, 144,   0,   8,  15, 160, 
-     66,   0,   0,   3,   0,   0, 
-     15, 128,   0,   0, 228, 176, 
-      0,   8, 228, 160,   4,   0, 
-      0,   4,   0,   0,  15, 128, 
-      0,   0,   4, 128,   0,   0, 
-     80, 160,   0,   0,  21, 160, 
-      1,   0,   0,   2,   0,   8, 
-     15, 128,   0,   0, 228, 128, 
-    255, 255,   0,   0,  83,  72, 
-     68,  82, 160,   0,   0,   0, 
-     64,   0,   0,   0,  40,   0, 
-      0,   0,  90,   0,   0,   3, 
-      0,  96,  16,   0,   0,   0, 
-      0,   0,  88,  24,   0,   4, 
-      0, 112,  16,   0,   0,   0, 
-      0,   0,  85,  85,   0,   0, 
-     98,  16,   0,   3,  50,  16, 
-     16,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-    104,   0,   0,   2,   1,   0, 
-      0,   0,  69,   0,   0,   9, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-      0,  96,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-     50,  32,  16,   0,   0,   0, 
-      0,   0,  70,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   8, 194,  32,  16,   0, 
-      0,   0,   0,   0,   2,  64, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0, 128,  63, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  82,  68,  69,  70, 
-    160,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,  28,   0, 
-      0,   0,   0,   4, 255, 255, 
-      0,   1,   0,   0, 109,   0, 
-      0,   0,  92,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 100,   0, 
-      0,   0,   2,   0,   0,   0, 
-      5,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     83,  97, 109, 112, 108, 101, 
-    114,   0,  84, 101, 120, 116, 
-    117, 114, 101,  70,   0,  77, 
-    105,  99, 114, 111, 115, 111, 
-    102, 116,  32,  40,  82,  41, 
-     32,  72,  76,  83,  76,  32, 
-     83, 104,  97, 100, 101, 114, 
-     32,  67, 111, 109, 112, 105, 
-    108, 101, 114,  32,  54,  46, 
-     51,  46,  57,  54,  48,  48, 
-     46,  49,  54,  51,  56,  52, 
-      0, 171,  73,  83,  71,  78, 
-     80,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     68,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0,   3,   3,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171, 171, 171, 
-     79,  83,  71,  78,  44,   0, 
-      0,   0,   1,   0,   0,   0, 
-      8,   0,   0,   0,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  83,  86, 
-     95,  84,  65,  82,  71,  69, 
-     84,   0, 171, 171
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 1, 0, 0, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0, r0.xyxx, c0.xxyy, c0.yyyx
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG2D[] =
+{
+     68,  88,  66,  67, 217, 171, 
+    153, 248,  26,  15, 102, 119, 
+     86, 174, 121, 245, 223,  83, 
+      2, 181,   1,   0,   0,   0, 
+     40,   3,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+    208,   0,   0,   0, 120,   1, 
+      0,   0, 244,   1,   0,   0, 
+    156,   2,   0,   0, 244,   2, 
+      0,   0,  65, 111, 110,  57, 
+    144,   0,   0,   0, 144,   0, 
+      0,   0,   0,   2, 255, 255, 
+    104,   0,   0,   0,  40,   0, 
+      0,   0,   0,   0,  40,   0, 
+      0,   0,  40,   0,   0,   0, 
+     40,   0,   1,   0,  36,   0, 
+      0,   0,  40,   0,   0,   0, 
+      0,   0,   1,   2, 255, 255, 
+     81,   0,   0,   5,   0,   0, 
+     15, 160,   0,   0, 128,  63, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     31,   0,   0,   2,   0,   0, 
+      0, 128,   0,   0,   3, 176, 
+     31,   0,   0,   2,   0,   0, 
+      0, 144,   0,   8,  15, 160, 
+     66,   0,   0,   3,   0,   0, 
+     15, 128,   0,   0, 228, 176, 
+      0,   8, 228, 160,   4,   0, 
+      0,   4,   0,   0,  15, 128, 
+      0,   0,   4, 128,   0,   0, 
+     80, 160,   0,   0,  21, 160, 
+      1,   0,   0,   2,   0,   8, 
+     15, 128,   0,   0, 228, 128, 
+    255, 255,   0,   0,  83,  72, 
+     68,  82, 160,   0,   0,   0, 
+     64,   0,   0,   0,  40,   0, 
+      0,   0,  90,   0,   0,   3, 
+      0,  96,  16,   0,   0,   0, 
+      0,   0,  88,  24,   0,   4, 
+      0, 112,  16,   0,   0,   0, 
+      0,   0,  85,  85,   0,   0, 
+     98,  16,   0,   3,  50,  16, 
+     16,   0,   1,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+    104,   0,   0,   2,   1,   0, 
+      0,   0,  69,   0,   0,   9, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+      0,  96,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+     50,  32,  16,   0,   0,   0, 
+      0,   0,  70,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   8, 194,  32,  16,   0, 
+      0,   0,   0,   0,   2,  64, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 128,  63, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  82,  68,  69,  70, 
+    160,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,  28,   0, 
+      0,   0,   0,   4, 255, 255, 
+      0,   1,   0,   0, 109,   0, 
+      0,   0,  92,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 100,   0, 
+      0,   0,   2,   0,   0,   0, 
+      5,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     83,  97, 109, 112, 108, 101, 
+    114,   0,  84, 101, 120, 116, 
+    117, 114, 101,  70,   0,  77, 
+    105,  99, 114, 111, 115, 111, 
+    102, 116,  32,  40,  82,  41, 
+     32,  72,  76,  83,  76,  32, 
+     83, 104,  97, 100, 101, 114, 
+     32,  67, 111, 109, 112, 105, 
+    108, 101, 114,  32,  54,  46, 
+     51,  46,  57,  54,  48,  48, 
+     46,  49,  54,  51,  56,  52, 
+      0, 171,  73,  83,  71,  78, 
+     80,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     68,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0,   3,   3,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171, 171, 171, 
+     79,  83,  71,  78,  44,   0, 
+      0,   0,   1,   0,   0,   0, 
+      8,   0,   0,   0,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  83,  86, 
+     95,  84,  65,  82,  71,  69, 
+     84,   0, 171, 171
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg2di11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2di11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2di11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2di11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,167 +1,167 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI                          texture   sint4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_resource_texture2d (sint,sint,sint,sint) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v1.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.zw, l(0,0,0,0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.xy, r0.xyxx
-mov o0.zw, l(0,0,0,0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRG2DI[] =
-{
-     68,  88,  66,  67,  89, 123, 
-    129, 251, 206, 105, 221, 141, 
-      5, 160, 186, 187, 168, 157, 
-    145, 246,   1,   0,   0,   0, 
-    208,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  12,   1, 
-      0,   0,  64,   1,   0,   0, 
-     84,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     69,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  73,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   3,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-     12,   1,   0,   0,  64,   0, 
-      0,   0,  67,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     51,  51,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  27,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5,  50,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   8, 
-    194,  32,  16,   0,   0,   0, 
-      0,   0,   2,  64,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (sint,sint,sint,sint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG2DI[] =
+{
+     68,  88,  66,  67,  89, 123, 
+    129, 251, 206, 105, 221, 141, 
+      5, 160, 186, 187, 168, 157, 
+    145, 246,   1,   0,   0,   0, 
+    208,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  12,   1, 
+      0,   0,  64,   1,   0,   0, 
+     84,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     69,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  73,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   3,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+     12,   1,   0,   0,  64,   0, 
+      0,   0,  67,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     51,  51,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  27,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5,  50,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   8, 
+    194,  32,  16,   0,   0,   0, 
+      0,   0,   2,  64,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg2dui11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2dui11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2dui11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg2dui11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,167 +1,167 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI                         texture   uint4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_resource_texture2d (uint,uint,uint,uint) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v1.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.zw, l(0,0,0,0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.xy, r0.xyxx
-mov o0.zw, l(0,0,0,0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRG2DUI[] =
-{
-     68,  88,  66,  67, 253, 188, 
-    138, 153, 226, 194, 182, 197, 
-    184,  36, 111,  24, 198, 171, 
-    241, 145,   1,   0,   0,   0, 
-    208,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  12,   1, 
-      0,   0,  64,   1,   0,   0, 
-     84,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     70,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  85,  73,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   3,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-     12,   1,   0,   0,  64,   0, 
-      0,   0,  67,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     68,  68,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  27,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5,  50,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   8, 
-    194,  32,  16,   0,   0,   0, 
-      0,   0,   2,  64,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (uint,uint,uint,uint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG2DUI[] =
+{
+     68,  88,  66,  67, 253, 188, 
+    138, 153, 226, 194, 182, 197, 
+    184,  36, 111,  24, 198, 171, 
+    241, 145,   1,   0,   0,   0, 
+    208,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  12,   1, 
+      0,   0,  64,   1,   0,   0, 
+     84,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     70,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  85,  73,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   3,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+     12,   1,   0,   0,  64,   0, 
+      0,   0,  67,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     68,  68,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  27,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5,  50,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   8, 
+    194,  32,  16,   0,   0,   0, 
+      0,   0,   2,  64,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg3d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,162 +1,162 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture3d (float,float,float,float) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-sample r0.xyzw, v2.xyzx, t0.xyzw, s0
-mov o0.xy, r0.xyxx
-mov o0.zw, l(0,0,0,1.000000)
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRG3D[] =
-{
-     68,  88,  66,  67, 117, 159, 
-    238,  81,  51, 223, 126,  31, 
-    223, 171, 227,   2, 248,   7, 
-     72,  91,   1,   0,   0,   0, 
-    188,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    220,   0,   0,   0, 100,   1, 
-      0,   0, 152,   1,   0,   0, 
-     64,   2,   0,   0,  82,  68, 
-     69,  70, 160,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    109,   0,   0,   0,  92,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    100,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      8,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0,  83,  97, 109, 112, 
-    108, 101, 114,   0,  84, 101, 
-    120, 116, 117, 114, 101,  70, 
-      0,  77, 105,  99, 114, 111, 
-    115, 111, 102, 116,  32,  40, 
-     82,  41,  32,  72,  76,  83, 
-     76,  32,  83, 104,  97, 100, 
-    101, 114,  32,  67, 111, 109, 
-    112, 105, 108, 101, 114,  32, 
-     54,  46,  51,  46,  57,  54, 
-     48,  48,  46,  49,  54,  51, 
-     56,  52,   0, 171,  73,  83, 
-     71,  78, 128,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0, 118,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0,   7,   7, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  83,  86,  95,  82, 
-     69,  78,  68,  69,  82,  84, 
-     65,  82,  71,  69,  84,  65, 
-     82,  82,  65,  89,  73,  78, 
-     68,  69,  88,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82, 160,   0, 
-      0,   0,  64,   0,   0,   0, 
-     40,   0,   0,   0,  90,   0, 
-      0,   3,   0,  96,  16,   0, 
-      0,   0,   0,   0,  88,  40, 
-      0,   4,   0, 112,  16,   0, 
-      0,   0,   0,   0,  85,  85, 
-      0,   0,  98,  16,   0,   3, 
-    114,  16,  16,   0,   2,   0, 
-      0,   0, 101,   0,   0,   3, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0, 104,   0,   0,   2, 
-      1,   0,   0,   0,  69,   0, 
-      0,   9, 242,   0,  16,   0, 
-      0,   0,   0,   0,  70,  18, 
-     16,   0,   2,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,   0,  96,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   5,  50,  32,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,  32, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    128,  63,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   4,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG3D[] =
+{
+     68,  88,  66,  67, 117, 159, 
+    238,  81,  51, 223, 126,  31, 
+    223, 171, 227,   2, 248,   7, 
+     72,  91,   1,   0,   0,   0, 
+    188,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    220,   0,   0,   0, 100,   1, 
+      0,   0, 152,   1,   0,   0, 
+     64,   2,   0,   0,  82,  68, 
+     69,  70, 160,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    109,   0,   0,   0,  92,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    100,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      8,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0,  83,  97, 109, 112, 
+    108, 101, 114,   0,  84, 101, 
+    120, 116, 117, 114, 101,  70, 
+      0,  77, 105,  99, 114, 111, 
+    115, 111, 102, 116,  32,  40, 
+     82,  41,  32,  72,  76,  83, 
+     76,  32,  83, 104,  97, 100, 
+    101, 114,  32,  67, 111, 109, 
+    112, 105, 108, 101, 114,  32, 
+     54,  46,  51,  46,  57,  54, 
+     48,  48,  46,  49,  54,  51, 
+     56,  52,   0, 171,  73,  83, 
+     71,  78, 128,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0, 118,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0,   7,   7, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  83,  86,  95,  82, 
+     69,  78,  68,  69,  82,  84, 
+     65,  82,  71,  69,  84,  65, 
+     82,  82,  65,  89,  73,  78, 
+     68,  69,  88,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82, 160,   0, 
+      0,   0,  64,   0,   0,   0, 
+     40,   0,   0,   0,  90,   0, 
+      0,   3,   0,  96,  16,   0, 
+      0,   0,   0,   0,  88,  40, 
+      0,   4,   0, 112,  16,   0, 
+      0,   0,   0,   0,  85,  85, 
+      0,   0,  98,  16,   0,   3, 
+    114,  16,  16,   0,   2,   0, 
+      0,   0, 101,   0,   0,   3, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0, 104,   0,   0,   2, 
+      1,   0,   0,   0,  69,   0, 
+      0,   9, 242,   0,  16,   0, 
+      0,   0,   0,   0,  70,  18, 
+     16,   0,   2,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,   0,  96,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   5,  50,  32,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,  32, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    128,  63,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   4,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg3di11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3di11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3di11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3di11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,174 +1,174 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI                          texture   sint4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_resource_texture3d (sint,sint,sint,sint) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xyz, r0.xyzx
-mul r0.xyz, r0.xyzx, v2.xyzx
-ftoi r0.xyz, r0.xyzx
-mov r0.w, l(0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.xy, r0.xyxx
-mov o0.zw, l(0,0,0,0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRG3DI[] =
-{
-     68,  88,  66,  67,  62, 119, 
-     61,  21,  83,  42,  80, 125, 
-    121, 208, 247,  10, 223,  62, 
-     33,  18,   1,   0,   0,   0, 
-    244,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  60,   1, 
-      0,   0, 112,   1,   0,   0, 
-    120,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     69,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  73,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-     73,  83,  71,  78, 128,   0, 
-      0,   0,   3,   0,   0,   0, 
-      8,   0,   0,   0,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 118,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   7,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  83,  86, 
-     95,  82,  69,  78,  68,  69, 
-     82,  84,  65,  82,  71,  69, 
-     84,  65,  82,  82,  65,  89, 
-     73,  78,  68,  69,  88,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-      0,   1,   0,   0,  64,   0, 
-      0,   0,  64,   0,   0,   0, 
-     88,  40,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     51,  51,   0,   0,  98,  16, 
-      0,   3, 114,  16,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  27,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5,  50,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   8, 
-    194,  32,  16,   0,   0,   0, 
-      0,   0,   2,  64,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (sint,sint,sint,sint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG3DI[] =
+{
+     68,  88,  66,  67,  62, 119, 
+     61,  21,  83,  42,  80, 125, 
+    121, 208, 247,  10, 223,  62, 
+     33,  18,   1,   0,   0,   0, 
+    244,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  60,   1, 
+      0,   0, 112,   1,   0,   0, 
+    120,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     69,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  73,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+     73,  83,  71,  78, 128,   0, 
+      0,   0,   3,   0,   0,   0, 
+      8,   0,   0,   0,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 118,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+      7,   7,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  83,  86, 
+     95,  82,  69,  78,  68,  69, 
+     82,  84,  65,  82,  71,  69, 
+     84,  65,  82,  82,  65,  89, 
+     73,  78,  68,  69,  88,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+      0,   1,   0,   0,  64,   0, 
+      0,   0,  64,   0,   0,   0, 
+     88,  40,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     51,  51,   0,   0,  98,  16, 
+      0,   3, 114,  16,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7, 114,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  27,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5,  50,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   8, 
+    194,  32,  16,   0,   0,   0, 
+      0,   0,   2,  64,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrg3dui11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3dui11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3dui11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrg3dui11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,174 +1,174 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI                         texture   uint4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_resource_texture3d (uint,uint,uint,uint) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xyz, r0.xyzx
-mul r0.xyz, r0.xyzx, v2.xyzx
-ftoi r0.xyz, r0.xyzx
-mov r0.w, l(0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.xy, r0.xyxx
-mov o0.zw, l(0,0,0,0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRG3DUI[] =
-{
-     68,  88,  66,  67,  37,  56, 
-     43, 206,  81, 137, 125, 191, 
-    216,  50,  86,  76,  61,  78, 
-     25, 246,   1,   0,   0,   0, 
-    244,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  60,   1, 
-      0,   0, 112,   1,   0,   0, 
-    120,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     70,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   8,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  85,  73,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-     73,  83,  71,  78, 128,   0, 
-      0,   0,   3,   0,   0,   0, 
-      8,   0,   0,   0,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 118,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   7,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  83,  86, 
-     95,  82,  69,  78,  68,  69, 
-     82,  84,  65,  82,  71,  69, 
-     84,  65,  82,  82,  65,  89, 
-     73,  78,  68,  69,  88,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-      0,   1,   0,   0,  64,   0, 
-      0,   0,  64,   0,   0,   0, 
-     88,  40,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     68,  68,   0,   0,  98,  16, 
-      0,   3, 114,  16,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  27,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5,  50,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   8, 
-    194,  32,  16,   0,   0,   0, 
-      0,   0,   2,  64,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (uint,uint,uint,uint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xy, r0.xyxx
+mov o0.zw, l(0,0,0,0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRG3DUI[] =
+{
+     68,  88,  66,  67,  37,  56, 
+     43, 206,  81, 137, 125, 191, 
+    216,  50,  86,  76,  61,  78, 
+     25, 246,   1,   0,   0,   0, 
+    244,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  60,   1, 
+      0,   0, 112,   1,   0,   0, 
+    120,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     70,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   8,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  85,  73,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+     73,  83,  71,  78, 128,   0, 
+      0,   0,   3,   0,   0,   0, 
+      8,   0,   0,   0,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 118,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+      7,   7,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  83,  86, 
+     95,  82,  69,  78,  68,  69, 
+     82,  84,  65,  82,  71,  69, 
+     84,  65,  82,  82,  65,  89, 
+     73,  78,  68,  69,  88,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+      0,   1,   0,   0,  64,   0, 
+      0,   0,  64,   0,   0,   0, 
+     88,  40,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     68,  68,   0,   0,  98,  16, 
+      0,   3, 114,  16,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7, 114,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  27,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5,  50,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   8, 
+    194,  32,  16,   0,   0,   0, 
+      0,   0,   2,  64,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb2d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,196 +1,196 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-//
-// Sampler/Resource to DX9 shader sampler mappings:
-//
-// Target Sampler Source Sampler  Source Resource
-// -------------- --------------- ----------------
-// s0             s0              t0               
-//
-//
-// Level9 shader bytecode:
-//
-    ps_2_x
-    def c0, 1, 0, 0, 0
-    dcl t0.xy
-    dcl_2d s0
-    texld r0, t0, s0
-    mad r0, r0.xyzx, c0.xxxy, c0.yyyx
-    mov oC0, r0
-
-// approximately 3 instruction slots used (1 texture, 2 arithmetic)
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture2d (float,float,float,float) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-sample r0.xyzw, v1.xyxx, t0.xyzw, s0
-mov o0.xyz, r0.xyzx
-mov o0.w, l(1.000000)
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGB2D[] =
-{
-     68,  88,  66,  67,  51,  90, 
-     49, 167, 211,  79,  20, 215, 
-     57, 227,  70,  56, 132, 117, 
-     66, 156,   1,   0,   0,   0, 
-     28,   3,   0,   0,   6,   0, 
-      0,   0,  56,   0,   0,   0, 
-    208,   0,   0,   0, 108,   1, 
-      0,   0, 232,   1,   0,   0, 
-    144,   2,   0,   0, 232,   2, 
-      0,   0,  65, 111, 110,  57, 
-    144,   0,   0,   0, 144,   0, 
-      0,   0,   0,   2, 255, 255, 
-    104,   0,   0,   0,  40,   0, 
-      0,   0,   0,   0,  40,   0, 
-      0,   0,  40,   0,   0,   0, 
-     40,   0,   1,   0,  36,   0, 
-      0,   0,  40,   0,   0,   0, 
-      0,   0,   1,   2, 255, 255, 
-     81,   0,   0,   5,   0,   0, 
-     15, 160,   0,   0, 128,  63, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     31,   0,   0,   2,   0,   0, 
-      0, 128,   0,   0,   3, 176, 
-     31,   0,   0,   2,   0,   0, 
-      0, 144,   0,   8,  15, 160, 
-     66,   0,   0,   3,   0,   0, 
-     15, 128,   0,   0, 228, 176, 
-      0,   8, 228, 160,   4,   0, 
-      0,   4,   0,   0,  15, 128, 
-      0,   0,  36, 128,   0,   0, 
-     64, 160,   0,   0,  21, 160, 
-      1,   0,   0,   2,   0,   8, 
-     15, 128,   0,   0, 228, 128, 
-    255, 255,   0,   0,  83,  72, 
-     68,  82, 148,   0,   0,   0, 
-     64,   0,   0,   0,  37,   0, 
-      0,   0,  90,   0,   0,   3, 
-      0,  96,  16,   0,   0,   0, 
-      0,   0,  88,  24,   0,   4, 
-      0, 112,  16,   0,   0,   0, 
-      0,   0,  85,  85,   0,   0, 
-     98,  16,   0,   3,  50,  16, 
-     16,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-    104,   0,   0,   2,   1,   0, 
-      0,   0,  69,   0,   0,   9, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-      0,  96,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-    114,  32,  16,   0,   0,   0, 
-      0,   0,  70,   2,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   5, 130,  32,  16,   0, 
-      0,   0,   0,   0,   1,  64, 
-      0,   0,   0,   0, 128,  63, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  82,  68,  69,  70, 
-    160,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,  28,   0, 
-      0,   0,   0,   4, 255, 255, 
-      0,   1,   0,   0, 109,   0, 
-      0,   0,  92,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 100,   0, 
-      0,   0,   2,   0,   0,   0, 
-      5,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     83,  97, 109, 112, 108, 101, 
-    114,   0,  84, 101, 120, 116, 
-    117, 114, 101,  70,   0,  77, 
-    105,  99, 114, 111, 115, 111, 
-    102, 116,  32,  40,  82,  41, 
-     32,  72,  76,  83,  76,  32, 
-     83, 104,  97, 100, 101, 114, 
-     32,  67, 111, 109, 112, 105, 
-    108, 101, 114,  32,  54,  46, 
-     51,  46,  57,  54,  48,  48, 
-     46,  49,  54,  51,  56,  52, 
-      0, 171,  73,  83,  71,  78, 
-     80,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     68,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0,   3,   3,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171, 171, 171, 
-     79,  83,  71,  78,  44,   0, 
-      0,   0,   1,   0,   0,   0, 
-      8,   0,   0,   0,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  83,  86, 
-     95,  84,  65,  82,  71,  69, 
-     84,   0, 171, 171
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    def c0, 1, 0, 0, 0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mad r0, r0.xyzx, c0.xxxy, c0.yyyx
+    mov oC0, r0
+
+// approximately 3 instruction slots used (1 texture, 2 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov o0.xyz, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2D[] =
+{
+     68,  88,  66,  67,  51,  90, 
+     49, 167, 211,  79,  20, 215, 
+     57, 227,  70,  56, 132, 117, 
+     66, 156,   1,   0,   0,   0, 
+     28,   3,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+    208,   0,   0,   0, 108,   1, 
+      0,   0, 232,   1,   0,   0, 
+    144,   2,   0,   0, 232,   2, 
+      0,   0,  65, 111, 110,  57, 
+    144,   0,   0,   0, 144,   0, 
+      0,   0,   0,   2, 255, 255, 
+    104,   0,   0,   0,  40,   0, 
+      0,   0,   0,   0,  40,   0, 
+      0,   0,  40,   0,   0,   0, 
+     40,   0,   1,   0,  36,   0, 
+      0,   0,  40,   0,   0,   0, 
+      0,   0,   1,   2, 255, 255, 
+     81,   0,   0,   5,   0,   0, 
+     15, 160,   0,   0, 128,  63, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     31,   0,   0,   2,   0,   0, 
+      0, 128,   0,   0,   3, 176, 
+     31,   0,   0,   2,   0,   0, 
+      0, 144,   0,   8,  15, 160, 
+     66,   0,   0,   3,   0,   0, 
+     15, 128,   0,   0, 228, 176, 
+      0,   8, 228, 160,   4,   0, 
+      0,   4,   0,   0,  15, 128, 
+      0,   0,  36, 128,   0,   0, 
+     64, 160,   0,   0,  21, 160, 
+      1,   0,   0,   2,   0,   8, 
+     15, 128,   0,   0, 228, 128, 
+    255, 255,   0,   0,  83,  72, 
+     68,  82, 148,   0,   0,   0, 
+     64,   0,   0,   0,  37,   0, 
+      0,   0,  90,   0,   0,   3, 
+      0,  96,  16,   0,   0,   0, 
+      0,   0,  88,  24,   0,   4, 
+      0, 112,  16,   0,   0,   0, 
+      0,   0,  85,  85,   0,   0, 
+     98,  16,   0,   3,  50,  16, 
+     16,   0,   1,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+    104,   0,   0,   2,   1,   0, 
+      0,   0,  69,   0,   0,   9, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+      0,  96,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+    114,  32,  16,   0,   0,   0, 
+      0,   0,  70,   2,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   5, 130,  32,  16,   0, 
+      0,   0,   0,   0,   1,  64, 
+      0,   0,   0,   0, 128,  63, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  82,  68,  69,  70, 
+    160,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,  28,   0, 
+      0,   0,   0,   4, 255, 255, 
+      0,   1,   0,   0, 109,   0, 
+      0,   0,  92,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 100,   0, 
+      0,   0,   2,   0,   0,   0, 
+      5,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     83,  97, 109, 112, 108, 101, 
+    114,   0,  84, 101, 120, 116, 
+    117, 114, 101,  70,   0,  77, 
+    105,  99, 114, 111, 115, 111, 
+    102, 116,  32,  40,  82,  41, 
+     32,  72,  76,  83,  76,  32, 
+     83, 104,  97, 100, 101, 114, 
+     32,  67, 111, 109, 112, 105, 
+    108, 101, 114,  32,  54,  46, 
+     51,  46,  57,  54,  48,  48, 
+     46,  49,  54,  51,  56,  52, 
+      0, 171,  73,  83,  71,  78, 
+     80,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     68,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0,   3,   3,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171, 171, 171, 
+     79,  83,  71,  78,  44,   0, 
+      0,   0,   1,   0,   0,   0, 
+      8,   0,   0,   0,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  83,  86, 
+     95,  84,  65,  82,  71,  69, 
+     84,   0, 171, 171
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb2di11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2di11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2di11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2di11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,165 +1,165 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI                          texture   sint4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_resource_texture2d (sint,sint,sint,sint) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v1.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.zw, l(0,0,0,0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.xyz, r0.xyzx
-mov o0.w, l(0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGB2DI[] =
-{
-     68,  88,  66,  67,  16, 227, 
-    172, 190, 246, 118, 223, 239, 
-    176,  78,  90,  11, 135, 138, 
-    109, 174,   1,   0,   0,   0, 
-    196,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  12,   1, 
-      0,   0,  64,   1,   0,   0, 
-     72,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     69,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  73,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   3,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-      0,   1,   0,   0,  64,   0, 
-      0,   0,  64,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     51,  51,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  27,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 114,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-    130,  32,  16,   0,   0,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (sint,sint,sint,sint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xyz, r0.xyzx
+mov o0.w, l(0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2DI[] =
+{
+     68,  88,  66,  67,  16, 227, 
+    172, 190, 246, 118, 223, 239, 
+    176,  78,  90,  11, 135, 138, 
+    109, 174,   1,   0,   0,   0, 
+    196,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  12,   1, 
+      0,   0,  64,   1,   0,   0, 
+     72,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     69,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  73,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   3,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+      0,   1,   0,   0,  64,   0, 
+      0,   0,  64,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     51,  51,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  27,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 114,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+    130,  32,  16,   0,   0,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb2dui11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2dui11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2dui11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb2dui11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,165 +1,165 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI                         texture   uint4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_resource_texture2d (uint,uint,uint,uint) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v1.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.zw, l(0,0,0,0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.xyz, r0.xyzx
-mov o0.w, l(0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGB2DUI[] =
-{
-     68,  88,  66,  67, 245, 219, 
-     46,  32,  34,  74,   2,  47, 
-    124,  96, 216,  40, 253, 243, 
-    104, 178,   1,   0,   0,   0, 
-    196,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  12,   1, 
-      0,   0,  64,   1,   0,   0, 
-     72,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     70,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  85,  73,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   3,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-      0,   1,   0,   0,  64,   0, 
-      0,   0,  64,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     68,  68,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  27,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 114,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-    130,  32,  16,   0,   0,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (uint,uint,uint,uint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xyz, r0.xyzx
+mov o0.w, l(0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB2DUI[] =
+{
+     68,  88,  66,  67, 245, 219, 
+     46,  32,  34,  74,   2,  47, 
+    124,  96, 216,  40, 253, 243, 
+    104, 178,   1,   0,   0,   0, 
+    196,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  12,   1, 
+      0,   0,  64,   1,   0,   0, 
+     72,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     70,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  85,  73,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   3,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+      0,   1,   0,   0,  64,   0, 
+      0,   0,  64,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     68,  68,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  27,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 114,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+    130,  32,  16,   0,   0,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb3d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,160 +1,160 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture3d (float,float,float,float) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-sample r0.xyzw, v2.xyzx, t0.xyzw, s0
-mov o0.xyz, r0.xyzx
-mov o0.w, l(1.000000)
-ret 
-// Approximately 4 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGB3D[] =
-{
-     68,  88,  66,  67,   3, 213, 
-    227, 200, 132, 255,   7,  95, 
-      0, 252,  77,  33, 254, 184, 
-     83, 110,   1,   0,   0,   0, 
-    176,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    220,   0,   0,   0, 100,   1, 
-      0,   0, 152,   1,   0,   0, 
-     52,   2,   0,   0,  82,  68, 
-     69,  70, 160,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    109,   0,   0,   0,  92,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    100,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      8,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0,  83,  97, 109, 112, 
-    108, 101, 114,   0,  84, 101, 
-    120, 116, 117, 114, 101,  70, 
-      0,  77, 105,  99, 114, 111, 
-    115, 111, 102, 116,  32,  40, 
-     82,  41,  32,  72,  76,  83, 
-     76,  32,  83, 104,  97, 100, 
-    101, 114,  32,  67, 111, 109, 
-    112, 105, 108, 101, 114,  32, 
-     54,  46,  51,  46,  57,  54, 
-     48,  48,  46,  49,  54,  51, 
-     56,  52,   0, 171,  73,  83, 
-     71,  78, 128,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0, 118,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0,   7,   7, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  83,  86,  95,  82, 
-     69,  78,  68,  69,  82,  84, 
-     65,  82,  71,  69,  84,  65, 
-     82,  82,  65,  89,  73,  78, 
-     68,  69,  88,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82, 148,   0, 
-      0,   0,  64,   0,   0,   0, 
-     37,   0,   0,   0,  90,   0, 
-      0,   3,   0,  96,  16,   0, 
-      0,   0,   0,   0,  88,  40, 
-      0,   4,   0, 112,  16,   0, 
-      0,   0,   0,   0,  85,  85, 
-      0,   0,  98,  16,   0,   3, 
-    114,  16,  16,   0,   2,   0, 
-      0,   0, 101,   0,   0,   3, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0, 104,   0,   0,   2, 
-      1,   0,   0,   0,  69,   0, 
-      0,   9, 242,   0,  16,   0, 
-      0,   0,   0,   0,  70,  18, 
-     16,   0,   2,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,   0,  96,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   5, 114,  32,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,  32, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-    128,  63,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   4,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov o0.xyz, r0.xyzx
+mov o0.w, l(1.000000)
+ret 
+// Approximately 4 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB3D[] =
+{
+     68,  88,  66,  67,   3, 213, 
+    227, 200, 132, 255,   7,  95, 
+      0, 252,  77,  33, 254, 184, 
+     83, 110,   1,   0,   0,   0, 
+    176,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    220,   0,   0,   0, 100,   1, 
+      0,   0, 152,   1,   0,   0, 
+     52,   2,   0,   0,  82,  68, 
+     69,  70, 160,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    109,   0,   0,   0,  92,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    100,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      8,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0,  83,  97, 109, 112, 
+    108, 101, 114,   0,  84, 101, 
+    120, 116, 117, 114, 101,  70, 
+      0,  77, 105,  99, 114, 111, 
+    115, 111, 102, 116,  32,  40, 
+     82,  41,  32,  72,  76,  83, 
+     76,  32,  83, 104,  97, 100, 
+    101, 114,  32,  67, 111, 109, 
+    112, 105, 108, 101, 114,  32, 
+     54,  46,  51,  46,  57,  54, 
+     48,  48,  46,  49,  54,  51, 
+     56,  52,   0, 171,  73,  83, 
+     71,  78, 128,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0, 118,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0,   7,   7, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  83,  86,  95,  82, 
+     69,  78,  68,  69,  82,  84, 
+     65,  82,  71,  69,  84,  65, 
+     82,  82,  65,  89,  73,  78, 
+     68,  69,  88,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82, 148,   0, 
+      0,   0,  64,   0,   0,   0, 
+     37,   0,   0,   0,  90,   0, 
+      0,   3,   0,  96,  16,   0, 
+      0,   0,   0,   0,  88,  40, 
+      0,   4,   0, 112,  16,   0, 
+      0,   0,   0,   0,  85,  85, 
+      0,   0,  98,  16,   0,   3, 
+    114,  16,  16,   0,   2,   0, 
+      0,   0, 101,   0,   0,   3, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0, 104,   0,   0,   2, 
+      1,   0,   0,   0,  69,   0, 
+      0,   9, 242,   0,  16,   0, 
+      0,   0,   0,   0,  70,  18, 
+     16,   0,   2,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,   0,  96,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   5, 114,  32,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,  32, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+    128,  63,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   4,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb3di11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3di11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3di11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3di11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,172 +1,172 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI                          texture   sint4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_resource_texture3d (sint,sint,sint,sint) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xyz, r0.xyzx
-mul r0.xyz, r0.xyzx, v2.xyzx
-ftoi r0.xyz, r0.xyzx
-mov r0.w, l(0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.xyz, r0.xyzx
-mov o0.w, l(0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGB3DI[] =
-{
-     68,  88,  66,  67, 194, 157, 
-      8, 194, 167, 235,  14, 127, 
-     69, 198,  32,  35, 167,  35, 
-    213, 248,   1,   0,   0,   0, 
-    232,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  60,   1, 
-      0,   0, 112,   1,   0,   0, 
-    108,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     69,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  73,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-     73,  83,  71,  78, 128,   0, 
-      0,   0,   3,   0,   0,   0, 
-      8,   0,   0,   0,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 118,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   7,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  83,  86, 
-     95,  82,  69,  78,  68,  69, 
-     82,  84,  65,  82,  71,  69, 
-     84,  65,  82,  82,  65,  89, 
-     73,  78,  68,  69,  88,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-    244,   0,   0,   0,  64,   0, 
-      0,   0,  61,   0,   0,   0, 
-     88,  40,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     51,  51,   0,   0,  98,  16, 
-      0,   3, 114,  16,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  27,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 114,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-    130,  32,  16,   0,   0,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (sint,sint,sint,sint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xyz, r0.xyzx
+mov o0.w, l(0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB3DI[] =
+{
+     68,  88,  66,  67, 194, 157, 
+      8, 194, 167, 235,  14, 127, 
+     69, 198,  32,  35, 167,  35, 
+    213, 248,   1,   0,   0,   0, 
+    232,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  60,   1, 
+      0,   0, 112,   1,   0,   0, 
+    108,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     69,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  73,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+     73,  83,  71,  78, 128,   0, 
+      0,   0,   3,   0,   0,   0, 
+      8,   0,   0,   0,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 118,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+      7,   7,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  83,  86, 
+     95,  82,  69,  78,  68,  69, 
+     82,  84,  65,  82,  71,  69, 
+     84,  65,  82,  82,  65,  89, 
+     73,  78,  68,  69,  88,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+    244,   0,   0,   0,  64,   0, 
+      0,   0,  61,   0,   0,   0, 
+     88,  40,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     51,  51,   0,   0,  98,  16, 
+      0,   3, 114,  16,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7, 114,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  27,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 114,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+    130,  32,  16,   0,   0,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgb3dui11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3dui11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3dui11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgb3dui11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,172 +1,172 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI                         texture   uint4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_resource_texture3d (uint,uint,uint,uint) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xyz, r0.xyzx
-mul r0.xyz, r0.xyzx, v2.xyzx
-ftoi r0.xyz, r0.xyzx
-mov r0.w, l(0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov o0.xyz, r0.xyzx
-mov o0.w, l(0)
-ret 
-// Approximately 9 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGB3DUI[] =
-{
-     68,  88,  66,  67, 253, 147, 
-      1, 158,  41,  31, 253, 138, 
-     52, 213, 103,  41, 188, 192, 
-     79, 199,   1,   0,   0,   0, 
-    232,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  60,   1, 
-      0,   0, 112,   1,   0,   0, 
-    108,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     70,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   8,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  85,  73,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-     73,  83,  71,  78, 128,   0, 
-      0,   0,   3,   0,   0,   0, 
-      8,   0,   0,   0,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 118,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   7,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  83,  86, 
-     95,  82,  69,  78,  68,  69, 
-     82,  84,  65,  82,  71,  69, 
-     84,  65,  82,  82,  65,  89, 
-     73,  78,  68,  69,  88,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-    244,   0,   0,   0,  64,   0, 
-      0,   0,  61,   0,   0,   0, 
-     88,  40,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     68,  68,   0,   0,  98,  16, 
-      0,   3, 114,  16,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  27,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 114,  32, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-    130,  32,  16,   0,   0,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   9,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (uint,uint,uint,uint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov o0.xyz, r0.xyzx
+mov o0.w, l(0)
+ret 
+// Approximately 9 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGB3DUI[] =
+{
+     68,  88,  66,  67, 253, 147, 
+      1, 158,  41,  31, 253, 138, 
+     52, 213, 103,  41, 188, 192, 
+     79, 199,   1,   0,   0,   0, 
+    232,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  60,   1, 
+      0,   0, 112,   1,   0,   0, 
+    108,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     70,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   8,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  85,  73,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+     73,  83,  71,  78, 128,   0, 
+      0,   0,   3,   0,   0,   0, 
+      8,   0,   0,   0,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 118,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+      7,   7,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  83,  86, 
+     95,  82,  69,  78,  68,  69, 
+     82,  84,  65,  82,  71,  69, 
+     84,  65,  82,  82,  65,  89, 
+     73,  78,  68,  69,  88,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+    244,   0,   0,   0,  64,   0, 
+      0,   0,  61,   0,   0,   0, 
+     88,  40,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     68,  68,   0,   0,  98,  16, 
+      0,   3, 114,  16,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7, 114,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  27,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 114,  32, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+    130,  32,  16,   0,   0,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   9,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba2d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,176 +1,176 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-//
-// Sampler/Resource to DX9 shader sampler mappings:
-//
-// Target Sampler Source Sampler  Source Resource
-// -------------- --------------- ----------------
-// s0             s0              t0               
-//
-//
-// Level9 shader bytecode:
-//
-    ps_2_x
-    dcl t0.xy
-    dcl_2d s0
-    texld r0, t0, s0
-    mov oC0, r0
-
-// approximately 2 instruction slots used (1 texture, 1 arithmetic)
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture2d (float,float,float,float) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-sample o0.xyzw, v1.xyxx, t0.xyzw, s0
-ret 
-// Approximately 2 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGBA2D[] =
-{
-     68,  88,  66,  67, 240, 186, 
-    163, 221, 151,  45, 139,  68, 
-    172, 121,  30, 230, 203, 102, 
-     92,  33,   1,   0,   0,   0, 
-    192,   2,   0,   0,   6,   0, 
-      0,   0,  56,   0,   0,   0, 
-    164,   0,   0,   0,  16,   1, 
-      0,   0, 140,   1,   0,   0, 
-     52,   2,   0,   0, 140,   2, 
-      0,   0,  65, 111, 110,  57, 
-    100,   0,   0,   0, 100,   0, 
-      0,   0,   0,   2, 255, 255, 
-     60,   0,   0,   0,  40,   0, 
-      0,   0,   0,   0,  40,   0, 
-      0,   0,  40,   0,   0,   0, 
-     40,   0,   1,   0,  36,   0, 
-      0,   0,  40,   0,   0,   0, 
-      0,   0,   1,   2, 255, 255, 
-     31,   0,   0,   2,   0,   0, 
-      0, 128,   0,   0,   3, 176, 
-     31,   0,   0,   2,   0,   0, 
-      0, 144,   0,   8,  15, 160, 
-     66,   0,   0,   3,   0,   0, 
-     15, 128,   0,   0, 228, 176, 
-      0,   8, 228, 160,   1,   0, 
-      0,   2,   0,   8,  15, 128, 
-      0,   0, 228, 128, 255, 255, 
-      0,   0,  83,  72,  68,  82, 
-    100,   0,   0,   0,  64,   0, 
-      0,   0,  25,   0,   0,   0, 
-     90,   0,   0,   3,   0,  96, 
-     16,   0,   0,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     85,  85,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0,  69,   0, 
-      0,   9, 242,  32,  16,   0, 
-      0,   0,   0,   0,  70,  16, 
-     16,   0,   1,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,   0,  96,  16,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     82,  68,  69,  70, 160,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,  28,   0,   0,   0, 
-      0,   4, 255, 255,   0,   1, 
-      0,   0, 109,   0,   0,   0, 
-     92,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0, 100,   0,   0,   0, 
-      2,   0,   0,   0,   5,   0, 
-      0,   0,   4,   0,   0,   0, 
-    255, 255, 255, 255,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     13,   0,   0,   0,  83,  97, 
-    109, 112, 108, 101, 114,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  70,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   3,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+//
+// Sampler/Resource to DX9 shader sampler mappings:
+//
+// Target Sampler Source Sampler  Source Resource
+// -------------- --------------- ----------------
+// s0             s0              t0               
+//
+//
+// Level9 shader bytecode:
+//
+    ps_2_x
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mov oC0, r0
+
+// approximately 2 instruction slots used (1 texture, 1 arithmetic)
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+sample o0.xyzw, v1.xyxx, t0.xyzw, s0
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2D[] =
+{
+     68,  88,  66,  67, 240, 186, 
+    163, 221, 151,  45, 139,  68, 
+    172, 121,  30, 230, 203, 102, 
+     92,  33,   1,   0,   0,   0, 
+    192,   2,   0,   0,   6,   0, 
+      0,   0,  56,   0,   0,   0, 
+    164,   0,   0,   0,  16,   1, 
+      0,   0, 140,   1,   0,   0, 
+     52,   2,   0,   0, 140,   2, 
+      0,   0,  65, 111, 110,  57, 
+    100,   0,   0,   0, 100,   0, 
+      0,   0,   0,   2, 255, 255, 
+     60,   0,   0,   0,  40,   0, 
+      0,   0,   0,   0,  40,   0, 
+      0,   0,  40,   0,   0,   0, 
+     40,   0,   1,   0,  36,   0, 
+      0,   0,  40,   0,   0,   0, 
+      0,   0,   1,   2, 255, 255, 
+     31,   0,   0,   2,   0,   0, 
+      0, 128,   0,   0,   3, 176, 
+     31,   0,   0,   2,   0,   0, 
+      0, 144,   0,   8,  15, 160, 
+     66,   0,   0,   3,   0,   0, 
+     15, 128,   0,   0, 228, 176, 
+      0,   8, 228, 160,   1,   0, 
+      0,   2,   0,   8,  15, 128, 
+      0,   0, 228, 128, 255, 255, 
+      0,   0,  83,  72,  68,  82, 
+    100,   0,   0,   0,  64,   0, 
+      0,   0,  25,   0,   0,   0, 
+     90,   0,   0,   3,   0,  96, 
+     16,   0,   0,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     85,  85,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0,  69,   0, 
+      0,   9, 242,  32,  16,   0, 
+      0,   0,   0,   0,  70,  16, 
+     16,   0,   1,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,   0,  96,  16,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     82,  68,  69,  70, 160,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,  28,   0,   0,   0, 
+      0,   4, 255, 255,   0,   1, 
+      0,   0, 109,   0,   0,   0, 
+     92,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0, 100,   0,   0,   0, 
+      2,   0,   0,   0,   5,   0, 
+      0,   0,   4,   0,   0,   0, 
+    255, 255, 255, 255,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     13,   0,   0,   0,  83,  97, 
+    109, 112, 108, 101, 114,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  70,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   3,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba2di11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2di11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2di11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2di11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,157 +1,157 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI                          texture   sint4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_resource_texture2d (sint,sint,sint,sint) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v1.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.zw, l(0,0,0,0)
-ld o0.xyzw, r0.xyzw, t0.xyzw
-ret 
-// Approximately 7 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGBA2DI[] =
-{
-     68,  88,  66,  67,  81, 147, 
-    194, 141,  92, 236, 184, 192, 
-     11, 249,  14, 215, 122, 110, 
-     35, 111,   1,   0,   0,   0, 
-    156,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  12,   1, 
-      0,   0,  64,   1,   0,   0, 
-     32,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     69,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  73,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   3,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-    216,   0,   0,   0,  64,   0, 
-      0,   0,  54,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     51,  51,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  27,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      7,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (sint,sint,sint,sint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld o0.xyzw, r0.xyzw, t0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2DI[] =
+{
+     68,  88,  66,  67,  81, 147, 
+    194, 141,  92, 236, 184, 192, 
+     11, 249,  14, 215, 122, 110, 
+     35, 111,   1,   0,   0,   0, 
+    156,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  12,   1, 
+      0,   0,  64,   1,   0,   0, 
+     32,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     69,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  73,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   3,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+    216,   0,   0,   0,  64,   0, 
+      0,   0,  54,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     51,  51,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  27,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      7,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba2dui11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dui11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dui11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2dui11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,157 +1,157 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI                         texture   uint4          2d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_resource_texture2d (uint,uint,uint,uint) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v1.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.zw, l(0,0,0,0)
-ld o0.xyzw, r0.xyzw, t0.xyzw
-ret 
-// Approximately 7 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGBA2DUI[] =
-{
-     68,  88,  66,  67, 128, 252, 
-    255, 238,  68, 109,  10, 133, 
-    175, 163, 216, 152, 219, 103, 
-    163, 223,   1,   0,   0,   0, 
-    156,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  12,   1, 
-      0,   0,  64,   1,   0,   0, 
-     32,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     70,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  85,  73,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-     73,  83,  71,  78,  80,   0, 
-      0,   0,   2,   0,   0,   0, 
-      8,   0,   0,   0,  56,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  68,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   3,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171, 171, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-    216,   0,   0,   0,  64,   0, 
-      0,   0,  54,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     68,  68,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  27,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      7,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          2d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_resource_texture2d (uint,uint,uint,uint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld o0.xyzw, r0.xyzw, t0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA2DUI[] =
+{
+     68,  88,  66,  67, 128, 252, 
+    255, 238,  68, 109,  10, 133, 
+    175, 163, 216, 152, 219, 103, 
+    163, 223,   1,   0,   0,   0, 
+    156,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  12,   1, 
+      0,   0,  64,   1,   0,   0, 
+     32,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     70,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  85,  73,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+     73,  83,  71,  78,  80,   0, 
+      0,   0,   2,   0,   0,   0, 
+      8,   0,   0,   0,  56,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  68,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   3,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171, 171, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+    216,   0,   0,   0,  64,   0, 
+      0,   0,  54,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     68,  68,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  27,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      7,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba3d11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3d11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,149 +1,149 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF                          texture  float4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-ps_4_0
-dcl_sampler s0, mode_default
-dcl_resource_texture3d (float,float,float,float) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-sample o0.xyzw, v2.xyzx, t0.xyzw, s0
-ret 
-// Approximately 2 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGBA3D[] =
-{
-     68,  88,  66,  67, 246,  41, 
-     15, 240, 168, 172,  91, 145, 
-    236, 221, 187,  89,  12,   0, 
-     93, 149,   1,   0,   0,   0, 
-    128,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    220,   0,   0,   0, 100,   1, 
-      0,   0, 152,   1,   0,   0, 
-      4,   2,   0,   0,  82,  68, 
-     69,  70, 160,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    109,   0,   0,   0,  92,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    100,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      8,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0,  83,  97, 109, 112, 
-    108, 101, 114,   0,  84, 101, 
-    120, 116, 117, 114, 101,  70, 
-      0,  77, 105,  99, 114, 111, 
-    115, 111, 102, 116,  32,  40, 
-     82,  41,  32,  72,  76,  83, 
-     76,  32,  83, 104,  97, 100, 
-    101, 114,  32,  67, 111, 109, 
-    112, 105, 108, 101, 114,  32, 
-     54,  46,  51,  46,  57,  54, 
-     48,  48,  46,  49,  54,  51, 
-     56,  52,   0, 171,  73,  83, 
-     71,  78, 128,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0, 118,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0,   7,   7, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  83,  86,  95,  82, 
-     69,  78,  68,  69,  82,  84, 
-     65,  82,  71,  69,  84,  65, 
-     82,  82,  65,  89,  73,  78, 
-     68,  69,  88,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82, 100,   0, 
-      0,   0,  64,   0,   0,   0, 
-     25,   0,   0,   0,  90,   0, 
-      0,   3,   0,  96,  16,   0, 
-      0,   0,   0,   0,  88,  40, 
-      0,   4,   0, 112,  16,   0, 
-      0,   0,   0,   0,  85,  85, 
-      0,   0,  98,  16,   0,   3, 
-    114,  16,  16,   0,   2,   0, 
-      0,   0, 101,   0,   0,   3, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0,  69,   0,   0,   9, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-      0,  96,  16,   0,   0,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF                          texture  float4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+ps_4_0
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+sample o0.xyzw, v2.xyzx, t0.xyzw, s0
+ret 
+// Approximately 2 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA3D[] =
+{
+     68,  88,  66,  67, 246,  41, 
+     15, 240, 168, 172,  91, 145, 
+    236, 221, 187,  89,  12,   0, 
+     93, 149,   1,   0,   0,   0, 
+    128,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    220,   0,   0,   0, 100,   1, 
+      0,   0, 152,   1,   0,   0, 
+      4,   2,   0,   0,  82,  68, 
+     69,  70, 160,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    109,   0,   0,   0,  92,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    100,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      8,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0,  83,  97, 109, 112, 
+    108, 101, 114,   0,  84, 101, 
+    120, 116, 117, 114, 101,  70, 
+      0,  77, 105,  99, 114, 111, 
+    115, 111, 102, 116,  32,  40, 
+     82,  41,  32,  72,  76,  83, 
+     76,  32,  83, 104,  97, 100, 
+    101, 114,  32,  67, 111, 109, 
+    112, 105, 108, 101, 114,  32, 
+     54,  46,  51,  46,  57,  54, 
+     48,  48,  46,  49,  54,  51, 
+     56,  52,   0, 171,  73,  83, 
+     71,  78, 128,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0, 118,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0,   7,   7, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  83,  86,  95,  82, 
+     69,  78,  68,  69,  82,  84, 
+     65,  82,  71,  69,  84,  65, 
+     82,  82,  65,  89,  73,  78, 
+     68,  69,  88,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82, 100,   0, 
+      0,   0,  64,   0,   0,   0, 
+     25,   0,   0,   0,  90,   0, 
+      0,   3,   0,  96,  16,   0, 
+      0,   0,   0,   0,  88,  40, 
+      0,   4,   0, 112,  16,   0, 
+      0,   0,   0,   0,  85,  85, 
+      0,   0,  98,  16,   0,   3, 
+    114,  16,  16,   0,   2,   0, 
+      0,   0, 101,   0,   0,   3, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,  69,   0,   0,   9, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+      0,  96,  16,   0,   0,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba3di11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3di11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3di11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3di11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,164 +1,164 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI                          texture   sint4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_resource_texture3d (sint,sint,sint,sint) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xyz, r0.xyzx
-mul r0.xyz, r0.xyzx, v2.xyzx
-ftoi r0.xyz, r0.xyzx
-mov r0.w, l(0)
-ld o0.xyzw, r0.xyzw, t0.xyzw
-ret 
-// Approximately 7 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGBA3DI[] =
-{
-     68,  88,  66,  67, 139, 158, 
-      6, 251, 163, 134,   3, 183, 
-      5, 227, 185, 108,  35,  91, 
-     67, 191,   1,   0,   0,   0, 
-    192,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  60,   1, 
-      0,   0, 112,   1,   0,   0, 
-     68,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     69,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  73,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-     73,  83,  71,  78, 128,   0, 
-      0,   0,   3,   0,   0,   0, 
-      8,   0,   0,   0,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 118,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   7,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  83,  86, 
-     95,  82,  69,  78,  68,  69, 
-     82,  84,  65,  82,  71,  69, 
-     84,  65,  82,  82,  65,  89, 
-     73,  78,  68,  69,  88,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-    204,   0,   0,   0,  64,   0, 
-      0,   0,  51,   0,   0,   0, 
-     88,  40,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     51,  51,   0,   0,  98,  16, 
-      0,   3, 114,  16,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  27,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      7,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI                          texture   sint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (sint,sint,sint,sint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld o0.xyzw, r0.xyzw, t0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA3DI[] =
+{
+     68,  88,  66,  67, 139, 158, 
+      6, 251, 163, 134,   3, 183, 
+      5, 227, 185, 108,  35,  91, 
+     67, 191,   1,   0,   0,   0, 
+    192,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  60,   1, 
+      0,   0, 112,   1,   0,   0, 
+     68,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     69,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  73,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+     73,  83,  71,  78, 128,   0, 
+      0,   0,   3,   0,   0,   0, 
+      8,   0,   0,   0,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 118,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+      7,   7,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  83,  86, 
+     95,  82,  69,  78,  68,  69, 
+     82,  84,  65,  82,  71,  69, 
+     84,  65,  82,  82,  65,  89, 
+     73,  78,  68,  69,  88,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+    204,   0,   0,   0,  64,   0, 
+      0,   0,  51,   0,   0,   0, 
+     88,  40,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     51,  51,   0,   0,  98,  16, 
+      0,   3, 114,  16,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7, 114,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  27,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      7,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledpassthroughrgba3dui11psh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3dui11ps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3dui11ps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba3dui11ps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,164 +1,164 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI                         texture   uint4          3d    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_resource_texture3d (uint,uint,uint,uint) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xyz, r0.xyzx
-mul r0.xyz, r0.xyzx, v2.xyzx
-ftoi r0.xyz, r0.xyzx
-mov r0.w, l(0)
-ld o0.xyzw, r0.xyzw, t0.xyzw
-ret 
-// Approximately 7 instruction slots used
-#endif
-
-const BYTE g_PS_PassthroughRGBA3DUI[] =
-{
-     68,  88,  66,  67,  16, 111, 
-     56, 218, 148, 233, 100, 164, 
-      0, 199,  73, 155, 213, 171, 
-     78,  18,   1,   0,   0,   0, 
-    192,   2,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    180,   0,   0,   0,  60,   1, 
-      0,   0, 112,   1,   0,   0, 
-     68,   2,   0,   0,  82,  68, 
-     69,  70, 120,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-     70,   0,   0,   0,  60,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   8,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  85,  73,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-     73,  83,  71,  78, 128,   0, 
-      0,   0,   3,   0,   0,   0, 
-      8,   0,   0,   0,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0, 118,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   7,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  83,  86, 
-     95,  82,  69,  78,  68,  69, 
-     82,  84,  65,  82,  71,  69, 
-     84,  65,  82,  82,  65,  89, 
-     73,  78,  68,  69,  88,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-    204,   0,   0,   0,  64,   0, 
-      0,   0,  51,   0,   0,   0, 
-     88,  40,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     68,  68,   0,   0,  98,  16, 
-      0,   3, 114,  16,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  27,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     62,   0,   0,   1,  83,  84, 
-     65,  84, 116,   0,   0,   0, 
-      7,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI                         texture   uint4          3d    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_resource_texture3d (uint,uint,uint,uint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld o0.xyzw, r0.xyzw, t0.xyzw
+ret 
+// Approximately 7 instruction slots used
+#endif
+
+const BYTE g_PS_PassthroughRGBA3DUI[] =
+{
+     68,  88,  66,  67,  16, 111, 
+     56, 218, 148, 233, 100, 164, 
+      0, 199,  73, 155, 213, 171, 
+     78,  18,   1,   0,   0,   0, 
+    192,   2,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    180,   0,   0,   0,  60,   1, 
+      0,   0, 112,   1,   0,   0, 
+     68,   2,   0,   0,  82,  68, 
+     69,  70, 120,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+     70,   0,   0,   0,  60,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   8,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  85,  73,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+     73,  83,  71,  78, 128,   0, 
+      0,   0,   3,   0,   0,   0, 
+      8,   0,   0,   0,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0, 118,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+      7,   7,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  83,  86, 
+     95,  82,  69,  78,  68,  69, 
+     82,  84,  65,  82,  71,  69, 
+     84,  65,  82,  82,  65,  89, 
+     73,  78,  68,  69,  88,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+    204,   0,   0,   0,  64,   0, 
+      0,   0,  51,   0,   0,   0, 
+     88,  40,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     68,  68,   0,   0,  98,  16, 
+      0,   3, 114,  16,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7, 114,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  27,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     62,   0,   0,   1,  83,  84, 
+     65,  84, 116,   0,   0,   0, 
+      7,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlef2darraypsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2darrayps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,278 +1,278 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer SwizzleProperties
-// {
-//
-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF2DArray                   texture  float4     2darray    0        1
-// SwizzleProperties                 cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint   x   
-// TEXCOORD                 0   xyz         2     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-ps_4_0
-dcl_constantbuffer cb0[1], immediateIndexed
-dcl_sampler s0, mode_default
-dcl_resource_texture2darray (float,float,float,float) t0
-dcl_input_ps_siv constant v1.x, rendertarget_array_index
-dcl_input_ps linear v2.xy
-dcl_output o0.xyzw
-dcl_temps 1
-dcl_indexableTemp x0[6], 4
-utof r0.z, v1.x
-mov r0.xy, v2.xyxx
-sample r0.xyzw, r0.xyzx, t0.xyzw, s0
-mov x0[0].x, r0.x
-mov x0[1].x, r0.y
-mov x0[2].x, r0.z
-mov x0[3].x, r0.w
-mov x0[4].x, l(0)
-mov x0[5].x, l(1.000000)
-mov r0.x, cb0[0].x
-mov o0.x, x0[r0.x + 0].x
-mov r0.x, cb0[0].y
-mov o0.y, x0[r0.x + 0].x
-mov r0.x, cb0[0].z
-mov o0.z, x0[r0.x + 0].x
-mov r0.x, cb0[0].w
-mov o0.w, x0[r0.x + 0].x
-ret 
-// Approximately 18 instruction slots used
-#endif
-
-const BYTE g_PS_SwizzleF2DArray[] =
-{
-     68,  88,  66,  67,  39, 232, 
-     91, 166, 165, 217,  22,  39, 
-    183, 202, 191,  64, 238, 104, 
-    217, 199,   1,   0,   0,   0, 
-    204,   4,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    104,   1,   0,   0, 240,   1, 
-      0,   0,  36,   2,   0,   0, 
-     80,   4,   0,   0,  82,  68, 
-     69,  70,  44,   1,   0,   0, 
-      1,   0,   0,   0, 168,   0, 
-      0,   0,   3,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    248,   0,   0,   0, 124,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    132,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      5,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0, 148,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,  83,  97, 
-    109, 112, 108, 101, 114,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  70,  50,  68,  65, 114, 
-    114,  97, 121,   0,  83, 119, 
-    105, 122, 122, 108, 101,  80, 
-    114, 111, 112, 101, 114, 116, 
-    105, 101, 115,   0, 171, 171, 
-    148,   0,   0,   0,   1,   0, 
-      0,   0, 192,   0,   0,   0, 
-     16,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-    216,   0,   0,   0,   0,   0, 
-      0,   0,  16,   0,   0,   0, 
-      2,   0,   0,   0, 232,   0, 
-      0,   0,   0,   0,   0,   0, 
-     83, 119, 105, 122, 122, 108, 
-    101,  73, 110, 100, 105,  99, 
-    101, 115,   0, 171,   1,   0, 
-     19,   0,   1,   0,   4,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  77, 105,  99, 114, 
-    111, 115, 111, 102, 116,  32, 
-     40,  82,  41,  32,  72,  76, 
-     83,  76,  32,  83, 104,  97, 
-    100, 101, 114,  32,  67, 111, 
-    109, 112, 105, 108, 101, 114, 
-     32,  54,  46,  51,  46,  57, 
-     54,  48,  48,  46,  49,  54, 
-     51,  56,  52,   0, 171, 171, 
-     73,  83,  71,  78, 128,   0, 
-      0,   0,   3,   0,   0,   0, 
-      8,   0,   0,   0,  80,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   1,   0,   0, 118,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   2,   0,   0,   0, 
-      7,   3,   0,   0,  83,  86, 
-     95,  80,  79,  83,  73,  84, 
-     73,  79,  78,   0,  83,  86, 
-     95,  82,  69,  78,  68,  69, 
-     82,  84,  65,  82,  71,  69, 
-     84,  65,  82,  82,  65,  89, 
-     73,  78,  68,  69,  88,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171,  79,  83, 
-     71,  78,  44,   0,   0,   0, 
-      1,   0,   0,   0,   8,   0, 
-      0,   0,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  83,  86,  95,  84, 
-     65,  82,  71,  69,  84,   0, 
-    171, 171,  83,  72,  68,  82, 
-     36,   2,   0,   0,  64,   0, 
-      0,   0, 137,   0,   0,   0, 
-     89,   0,   0,   4,  70, 142, 
-     32,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,  90,   0, 
-      0,   3,   0,  96,  16,   0, 
-      0,   0,   0,   0,  88,  64, 
-      0,   4,   0, 112,  16,   0, 
-      0,   0,   0,   0,  85,  85, 
-      0,   0, 100,   8,   0,   4, 
-     18,  16,  16,   0,   1,   0, 
-      0,   0,   4,   0,   0,   0, 
-     98,  16,   0,   3,  50,  16, 
-     16,   0,   2,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-    104,   0,   0,   2,   1,   0, 
-      0,   0, 105,   0,   0,   4, 
-      0,   0,   0,   0,   6,   0, 
-      0,   0,   4,   0,   0,   0, 
-     86,   0,   0,   5,  66,   0, 
-     16,   0,   0,   0,   0,   0, 
-     10,  16,  16,   0,   1,   0, 
-      0,   0,  54,   0,   0,   5, 
-     50,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      2,   0,   0,   0,  69,   0, 
-      0,   9, 242,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,   0,  96,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  26,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,  42,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,  58,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   5,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0, 128,  63,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  10, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7,  18,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   6, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  26, 128,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  54,   0,   0,   7, 
-     34,  32,  16,   0,   0,   0, 
-      0,   0,  10,  48,  32,   4, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     42, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7,  66,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  58, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7, 130,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,  18,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      6,   0,   0,   0,  10,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      5,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF2DArray                   texture  float4     2darray    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint   x   
+// TEXCOORD                 0   xyz         2     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_sampler s0, mode_default
+dcl_resource_texture2darray (float,float,float,float) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+utof r0.z, v1.x
+mov r0.xy, v2.xyxx
+sample r0.xyzw, r0.xyzx, t0.xyzw, s0
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1.000000)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 18 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleF2DArray[] =
+{
+     68,  88,  66,  67,  39, 232, 
+     91, 166, 165, 217,  22,  39, 
+    183, 202, 191,  64, 238, 104, 
+    217, 199,   1,   0,   0,   0, 
+    204,   4,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    104,   1,   0,   0, 240,   1, 
+      0,   0,  36,   2,   0,   0, 
+     80,   4,   0,   0,  82,  68, 
+     69,  70,  44,   1,   0,   0, 
+      1,   0,   0,   0, 168,   0, 
+      0,   0,   3,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    248,   0,   0,   0, 124,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    132,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      5,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0, 148,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,  83,  97, 
+    109, 112, 108, 101, 114,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  70,  50,  68,  65, 114, 
+    114,  97, 121,   0,  83, 119, 
+    105, 122, 122, 108, 101,  80, 
+    114, 111, 112, 101, 114, 116, 
+    105, 101, 115,   0, 171, 171, 
+    148,   0,   0,   0,   1,   0, 
+      0,   0, 192,   0,   0,   0, 
+     16,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+    216,   0,   0,   0,   0,   0, 
+      0,   0,  16,   0,   0,   0, 
+      2,   0,   0,   0, 232,   0, 
+      0,   0,   0,   0,   0,   0, 
+     83, 119, 105, 122, 122, 108, 
+    101,  73, 110, 100, 105,  99, 
+    101, 115,   0, 171,   1,   0, 
+     19,   0,   1,   0,   4,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  77, 105,  99, 114, 
+    111, 115, 111, 102, 116,  32, 
+     40,  82,  41,  32,  72,  76, 
+     83,  76,  32,  83, 104,  97, 
+    100, 101, 114,  32,  67, 111, 
+    109, 112, 105, 108, 101, 114, 
+     32,  54,  46,  51,  46,  57, 
+     54,  48,  48,  46,  49,  54, 
+     51,  56,  52,   0, 171, 171, 
+     73,  83,  71,  78, 128,   0, 
+      0,   0,   3,   0,   0,   0, 
+      8,   0,   0,   0,  80,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   1,   0,   0, 118,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   2,   0,   0,   0, 
+      7,   3,   0,   0,  83,  86, 
+     95,  80,  79,  83,  73,  84, 
+     73,  79,  78,   0,  83,  86, 
+     95,  82,  69,  78,  68,  69, 
+     82,  84,  65,  82,  71,  69, 
+     84,  65,  82,  82,  65,  89, 
+     73,  78,  68,  69,  88,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171,  79,  83, 
+     71,  78,  44,   0,   0,   0, 
+      1,   0,   0,   0,   8,   0, 
+      0,   0,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  83,  86,  95,  84, 
+     65,  82,  71,  69,  84,   0, 
+    171, 171,  83,  72,  68,  82, 
+     36,   2,   0,   0,  64,   0, 
+      0,   0, 137,   0,   0,   0, 
+     89,   0,   0,   4,  70, 142, 
+     32,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,  90,   0, 
+      0,   3,   0,  96,  16,   0, 
+      0,   0,   0,   0,  88,  64, 
+      0,   4,   0, 112,  16,   0, 
+      0,   0,   0,   0,  85,  85, 
+      0,   0, 100,   8,   0,   4, 
+     18,  16,  16,   0,   1,   0, 
+      0,   0,   4,   0,   0,   0, 
+     98,  16,   0,   3,  50,  16, 
+     16,   0,   2,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+    104,   0,   0,   2,   1,   0, 
+      0,   0, 105,   0,   0,   4, 
+      0,   0,   0,   0,   6,   0, 
+      0,   0,   4,   0,   0,   0, 
+     86,   0,   0,   5,  66,   0, 
+     16,   0,   0,   0,   0,   0, 
+     10,  16,  16,   0,   1,   0, 
+      0,   0,  54,   0,   0,   5, 
+     50,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      2,   0,   0,   0,  69,   0, 
+      0,   9, 242,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,   0,  96,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  26,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,  42,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,  58,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   5,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0, 128,  63,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  10, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7,  18,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   6, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  26, 128,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  54,   0,   0,   7, 
+     34,  32,  16,   0,   0,   0, 
+      0,   0,  10,  48,  32,   4, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     42, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7,  66,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  58, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7, 130,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,  18,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      6,   0,   0,   0,  10,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      5,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlef2dpsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef2dps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,256 +1,256 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer SwizzleProperties
-// {
-//
-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF2D                        texture  float4          2d    0        1
-// SwizzleProperties                 cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-ps_4_0
-dcl_constantbuffer cb0[1], immediateIndexed
-dcl_sampler s0, mode_default
-dcl_resource_texture2d (float,float,float,float) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-dcl_indexableTemp x0[6], 4
-sample r0.xyzw, v1.xyxx, t0.xyzw, s0
-mov x0[0].x, r0.x
-mov x0[1].x, r0.y
-mov x0[2].x, r0.z
-mov x0[3].x, r0.w
-mov x0[4].x, l(0)
-mov x0[5].x, l(1.000000)
-mov r0.x, cb0[0].x
-mov o0.x, x0[r0.x + 0].x
-mov r0.x, cb0[0].y
-mov o0.y, x0[r0.x + 0].x
-mov r0.x, cb0[0].z
-mov o0.z, x0[r0.x + 0].x
-mov r0.x, cb0[0].w
-mov o0.w, x0[r0.x + 0].x
-ret 
-// Approximately 16 instruction slots used
-#endif
-
-const BYTE g_PS_SwizzleF2D[] =
-{
-     68,  88,  66,  67, 187, 204, 
-    160,  39, 195, 158, 245,  72, 
-    125, 249,  70, 140, 158, 199, 
-    246, 220,   1,   0,   0,   0, 
-     96,   4,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    100,   1,   0,   0, 188,   1, 
-      0,   0, 240,   1,   0,   0, 
-    228,   3,   0,   0,  82,  68, 
-     69,  70,  40,   1,   0,   0, 
-      1,   0,   0,   0, 164,   0, 
-      0,   0,   3,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    244,   0,   0,   0, 124,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    132,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      4,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0, 143,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,  83,  97, 
-    109, 112, 108, 101, 114,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  70,  50,  68,   0,  83, 
-    119, 105, 122, 122, 108, 101, 
-     80, 114, 111, 112, 101, 114, 
-    116, 105, 101, 115,   0, 171, 
-    171, 171, 143,   0,   0,   0, 
-      1,   0,   0,   0, 188,   0, 
-      0,   0,  16,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0, 212,   0,   0,   0, 
-      0,   0,   0,   0,  16,   0, 
-      0,   0,   2,   0,   0,   0, 
-    228,   0,   0,   0,   0,   0, 
-      0,   0,  83, 119, 105, 122, 
-    122, 108, 101,  73, 110, 100, 
-    105,  99, 101, 115,   0, 171, 
-      1,   0,  19,   0,   1,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-     80,   0,   0,   0,   2,   0, 
-      0,   0,   8,   0,   0,   0, 
-     56,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     68,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0,   3,   3,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     84,  69,  88,  67,  79,  79, 
-     82,  68,   0, 171, 171, 171, 
-     79,  83,  71,  78,  44,   0, 
-      0,   0,   1,   0,   0,   0, 
-      8,   0,   0,   0,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  83,  86, 
-     95,  84,  65,  82,  71,  69, 
-     84,   0, 171, 171,  83,  72, 
-     68,  82, 236,   1,   0,   0, 
-     64,   0,   0,   0, 123,   0, 
-      0,   0,  89,   0,   0,   4, 
-     70, 142,  32,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     90,   0,   0,   3,   0,  96, 
-     16,   0,   0,   0,   0,   0, 
-     88,  24,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     85,  85,   0,   0,  98,  16, 
-      0,   3,  50,  16,  16,   0, 
-      1,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-    105,   0,   0,   4,   0,   0, 
-      0,   0,   6,   0,   0,   0, 
-      4,   0,   0,   0,  69,   0, 
-      0,   9, 242,   0,  16,   0, 
-      0,   0,   0,   0,  70,  16, 
-     16,   0,   1,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,   0,  96,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  26,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,  42,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,  58,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   5,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0, 128,  63,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  10, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7,  18,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   6, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  26, 128,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  54,   0,   0,   7, 
-     34,  32,  16,   0,   0,   0, 
-      0,   0,  10,  48,  32,   4, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     42, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7,  66,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  58, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7, 130,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,  16,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      6,   0,   0,   0,  10,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF2D                        texture  float4          2d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_sampler s0, mode_default
+dcl_resource_texture2d (float,float,float,float) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+sample r0.xyzw, v1.xyxx, t0.xyzw, s0
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1.000000)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 16 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleF2D[] =
+{
+     68,  88,  66,  67, 187, 204, 
+    160,  39, 195, 158, 245,  72, 
+    125, 249,  70, 140, 158, 199, 
+    246, 220,   1,   0,   0,   0, 
+     96,   4,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    100,   1,   0,   0, 188,   1, 
+      0,   0, 240,   1,   0,   0, 
+    228,   3,   0,   0,  82,  68, 
+     69,  70,  40,   1,   0,   0, 
+      1,   0,   0,   0, 164,   0, 
+      0,   0,   3,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    244,   0,   0,   0, 124,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    132,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      4,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0, 143,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,  83,  97, 
+    109, 112, 108, 101, 114,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  70,  50,  68,   0,  83, 
+    119, 105, 122, 122, 108, 101, 
+     80, 114, 111, 112, 101, 114, 
+    116, 105, 101, 115,   0, 171, 
+    171, 171, 143,   0,   0,   0, 
+      1,   0,   0,   0, 188,   0, 
+      0,   0,  16,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0, 212,   0,   0,   0, 
+      0,   0,   0,   0,  16,   0, 
+      0,   0,   2,   0,   0,   0, 
+    228,   0,   0,   0,   0,   0, 
+      0,   0,  83, 119, 105, 122, 
+    122, 108, 101,  73, 110, 100, 
+    105,  99, 101, 115,   0, 171, 
+      1,   0,  19,   0,   1,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+     80,   0,   0,   0,   2,   0, 
+      0,   0,   8,   0,   0,   0, 
+     56,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     68,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0,   3,   3,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     84,  69,  88,  67,  79,  79, 
+     82,  68,   0, 171, 171, 171, 
+     79,  83,  71,  78,  44,   0, 
+      0,   0,   1,   0,   0,   0, 
+      8,   0,   0,   0,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  83,  86, 
+     95,  84,  65,  82,  71,  69, 
+     84,   0, 171, 171,  83,  72, 
+     68,  82, 236,   1,   0,   0, 
+     64,   0,   0,   0, 123,   0, 
+      0,   0,  89,   0,   0,   4, 
+     70, 142,  32,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     90,   0,   0,   3,   0,  96, 
+     16,   0,   0,   0,   0,   0, 
+     88,  24,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     85,  85,   0,   0,  98,  16, 
+      0,   3,  50,  16,  16,   0, 
+      1,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+    105,   0,   0,   4,   0,   0, 
+      0,   0,   6,   0,   0,   0, 
+      4,   0,   0,   0,  69,   0, 
+      0,   9, 242,   0,  16,   0, 
+      0,   0,   0,   0,  70,  16, 
+     16,   0,   1,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,   0,  96,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  26,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,  42,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,  58,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   5,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0, 128,  63,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  10, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7,  18,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   6, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  26, 128,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  54,   0,   0,   7, 
+     34,  32,  16,   0,   0,   0, 
+      0,   0,  10,  48,  32,   4, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     42, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7,  66,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  58, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7, 130,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,  16,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      6,   0,   0,   0,  10,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlef3dpsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlef3dps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,265 +1,265 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer SwizzleProperties
-// {
-//
-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// Sampler                           sampler      NA          NA    0        1
-// TextureF3D                        texture  float4          3d    0        1
-// SwizzleProperties                 cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
-//
-ps_4_0
-dcl_constantbuffer cb0[1], immediateIndexed
-dcl_sampler s0, mode_default
-dcl_resource_texture3d (float,float,float,float) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-dcl_indexableTemp x0[6], 4
-sample r0.xyzw, v2.xyzx, t0.xyzw, s0
-mov x0[0].x, r0.x
-mov x0[1].x, r0.y
-mov x0[2].x, r0.z
-mov x0[3].x, r0.w
-mov x0[4].x, l(0)
-mov x0[5].x, l(1.000000)
-mov r0.x, cb0[0].x
-mov o0.x, x0[r0.x + 0].x
-mov r0.x, cb0[0].y
-mov o0.y, x0[r0.x + 0].x
-mov r0.x, cb0[0].z
-mov o0.z, x0[r0.x + 0].x
-mov r0.x, cb0[0].w
-mov o0.w, x0[r0.x + 0].x
-ret 
-// Approximately 16 instruction slots used
-#endif
-
-const BYTE g_PS_SwizzleF3D[] =
-{
-     68,  88,  66,  67, 238,  60, 
-     80,  74,  42,  65, 120, 165, 
-    177,  91, 253, 216,  89, 102, 
-      2, 228,   1,   0,   0,   0, 
-    144,   4,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-    100,   1,   0,   0, 236,   1, 
-      0,   0,  32,   2,   0,   0, 
-     20,   4,   0,   0,  82,  68, 
-     69,  70,  40,   1,   0,   0, 
-      1,   0,   0,   0, 164,   0, 
-      0,   0,   3,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    244,   0,   0,   0, 124,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    132,   0,   0,   0,   2,   0, 
-      0,   0,   5,   0,   0,   0, 
-      8,   0,   0,   0, 255, 255, 
-    255, 255,   0,   0,   0,   0, 
-      1,   0,   0,   0,  13,   0, 
-      0,   0, 143,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,  83,  97, 
-    109, 112, 108, 101, 114,   0, 
-     84, 101, 120, 116, 117, 114, 
-    101,  70,  51,  68,   0,  83, 
-    119, 105, 122, 122, 108, 101, 
-     80, 114, 111, 112, 101, 114, 
-    116, 105, 101, 115,   0, 171, 
-    171, 171, 143,   0,   0,   0, 
-      1,   0,   0,   0, 188,   0, 
-      0,   0,  16,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0, 212,   0,   0,   0, 
-      0,   0,   0,   0,  16,   0, 
-      0,   0,   2,   0,   0,   0, 
-    228,   0,   0,   0,   0,   0, 
-      0,   0,  83, 119, 105, 122, 
-    122, 108, 101,  73, 110, 100, 
-    105,  99, 101, 115,   0, 171, 
-      1,   0,  19,   0,   1,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-    128,   0,   0,   0,   3,   0, 
-      0,   0,   8,   0,   0,   0, 
-     80,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     92,   0,   0,   0,   0,   0, 
-      0,   0,   4,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,   1,   0,   0,   0, 
-    118,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   2,   0, 
-      0,   0,   7,   7,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     83,  86,  95,  82,  69,  78, 
-     68,  69,  82,  84,  65,  82, 
-     71,  69,  84,  65,  82,  82, 
-     65,  89,  73,  78,  68,  69, 
-     88,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0, 171, 
-     79,  83,  71,  78,  44,   0, 
-      0,   0,   1,   0,   0,   0, 
-      8,   0,   0,   0,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  83,  86, 
-     95,  84,  65,  82,  71,  69, 
-     84,   0, 171, 171,  83,  72, 
-     68,  82, 236,   1,   0,   0, 
-     64,   0,   0,   0, 123,   0, 
-      0,   0,  89,   0,   0,   4, 
-     70, 142,  32,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     90,   0,   0,   3,   0,  96, 
-     16,   0,   0,   0,   0,   0, 
-     88,  40,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     85,  85,   0,   0,  98,  16, 
-      0,   3, 114,  16,  16,   0, 
-      2,   0,   0,   0, 101,   0, 
-      0,   3, 242,  32,  16,   0, 
-      0,   0,   0,   0, 104,   0, 
-      0,   2,   1,   0,   0,   0, 
-    105,   0,   0,   4,   0,   0, 
-      0,   0,   6,   0,   0,   0, 
-      4,   0,   0,   0,  69,   0, 
-      0,   9, 242,   0,  16,   0, 
-      0,   0,   0,   0,  70,  18, 
-     16,   0,   2,   0,   0,   0, 
-     70, 126,  16,   0,   0,   0, 
-      0,   0,   0,  96,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  26,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,  42,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,  58,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   5,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0, 128,  63,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  10, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7,  18,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   6, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  26, 128,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  54,   0,   0,   7, 
-     34,  32,  16,   0,   0,   0, 
-      0,   0,  10,  48,  32,   4, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     42, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7,  66,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  58, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7, 130,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,  16,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      6,   0,   0,   0,  10,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// Sampler                           sampler      NA          NA    0        1
+// TextureF3D                        texture  float4          3d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_sampler s0, mode_default
+dcl_resource_texture3d (float,float,float,float) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+sample r0.xyzw, v2.xyzx, t0.xyzw, s0
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1.000000)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 16 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleF3D[] =
+{
+     68,  88,  66,  67, 238,  60, 
+     80,  74,  42,  65, 120, 165, 
+    177,  91, 253, 216,  89, 102, 
+      2, 228,   1,   0,   0,   0, 
+    144,   4,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+    100,   1,   0,   0, 236,   1, 
+      0,   0,  32,   2,   0,   0, 
+     20,   4,   0,   0,  82,  68, 
+     69,  70,  40,   1,   0,   0, 
+      1,   0,   0,   0, 164,   0, 
+      0,   0,   3,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    244,   0,   0,   0, 124,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    132,   0,   0,   0,   2,   0, 
+      0,   0,   5,   0,   0,   0, 
+      8,   0,   0,   0, 255, 255, 
+    255, 255,   0,   0,   0,   0, 
+      1,   0,   0,   0,  13,   0, 
+      0,   0, 143,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,  83,  97, 
+    109, 112, 108, 101, 114,   0, 
+     84, 101, 120, 116, 117, 114, 
+    101,  70,  51,  68,   0,  83, 
+    119, 105, 122, 122, 108, 101, 
+     80, 114, 111, 112, 101, 114, 
+    116, 105, 101, 115,   0, 171, 
+    171, 171, 143,   0,   0,   0, 
+      1,   0,   0,   0, 188,   0, 
+      0,   0,  16,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0, 212,   0,   0,   0, 
+      0,   0,   0,   0,  16,   0, 
+      0,   0,   2,   0,   0,   0, 
+    228,   0,   0,   0,   0,   0, 
+      0,   0,  83, 119, 105, 122, 
+    122, 108, 101,  73, 110, 100, 
+    105,  99, 101, 115,   0, 171, 
+      1,   0,  19,   0,   1,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+    128,   0,   0,   0,   3,   0, 
+      0,   0,   8,   0,   0,   0, 
+     80,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     92,   0,   0,   0,   0,   0, 
+      0,   0,   4,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   1,   0,   0,   0, 
+    118,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   2,   0, 
+      0,   0,   7,   7,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     83,  86,  95,  82,  69,  78, 
+     68,  69,  82,  84,  65,  82, 
+     71,  69,  84,  65,  82,  82, 
+     65,  89,  73,  78,  68,  69, 
+     88,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0, 171, 
+     79,  83,  71,  78,  44,   0, 
+      0,   0,   1,   0,   0,   0, 
+      8,   0,   0,   0,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  83,  86, 
+     95,  84,  65,  82,  71,  69, 
+     84,   0, 171, 171,  83,  72, 
+     68,  82, 236,   1,   0,   0, 
+     64,   0,   0,   0, 123,   0, 
+      0,   0,  89,   0,   0,   4, 
+     70, 142,  32,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     90,   0,   0,   3,   0,  96, 
+     16,   0,   0,   0,   0,   0, 
+     88,  40,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     85,  85,   0,   0,  98,  16, 
+      0,   3, 114,  16,  16,   0, 
+      2,   0,   0,   0, 101,   0, 
+      0,   3, 242,  32,  16,   0, 
+      0,   0,   0,   0, 104,   0, 
+      0,   2,   1,   0,   0,   0, 
+    105,   0,   0,   4,   0,   0, 
+      0,   0,   6,   0,   0,   0, 
+      4,   0,   0,   0,  69,   0, 
+      0,   9, 242,   0,  16,   0, 
+      0,   0,   0,   0,  70,  18, 
+     16,   0,   2,   0,   0,   0, 
+     70, 126,  16,   0,   0,   0, 
+      0,   0,   0,  96,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  26,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,  42,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,  58,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   5,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0, 128,  63,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  10, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7,  18,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   6, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  26, 128,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  54,   0,   0,   7, 
+     34,  32,  16,   0,   0,   0, 
+      0,   0,  10,  48,  32,   4, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     42, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7,  66,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  58, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7, 130,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,  16,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      6,   0,   0,   0,  10,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlei2darraypsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2darrayps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,286 +1,286 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer SwizzleProperties
-// {
-//
-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI2DArray                   texture   sint4     2darray    0        1
-// SwizzleProperties                 cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint   x   
-// TEXCOORD                 0   xyz         2     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_constantbuffer cb0[1], immediateIndexed
-dcl_resource_texture2darray (sint,sint,sint,sint) t0
-dcl_input_ps_siv constant v1.x, rendertarget_array_index
-dcl_input_ps linear v2.xy
-dcl_output o0.xyzw
-dcl_temps 1
-dcl_indexableTemp x0[6], 4
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v2.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.z, v1.x
-mov r0.w, l(0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov x0[0].x, r0.x
-mov x0[1].x, r0.y
-mov x0[2].x, r0.z
-mov x0[3].x, r0.w
-mov x0[4].x, l(0)
-mov x0[5].x, l(1)
-mov r0.x, cb0[0].x
-mov o0.x, x0[r0.x + 0].x
-mov r0.x, cb0[0].y
-mov o0.y, x0[r0.x + 0].x
-mov r0.x, cb0[0].z
-mov o0.z, x0[r0.x + 0].x
-mov r0.x, cb0[0].w
-mov o0.w, x0[r0.x + 0].x
-ret 
-// Approximately 22 instruction slots used
-#endif
-
-const BYTE g_PS_SwizzleI2DArray[] =
-{
-     68,  88,  66,  67,  85,  61, 
-     60,  36,  33, 245,  58, 113, 
-    238, 227, 230, 200, 136, 227, 
-     36, 193,   1,   0,   0,   0, 
-    240,   4,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-     64,   1,   0,   0, 200,   1, 
-      0,   0, 252,   1,   0,   0, 
-    116,   4,   0,   0,  82,  68, 
-     69,  70,   4,   1,   0,   0, 
-      1,   0,   0,   0, 128,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    208,   0,   0,   0,  92,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   5,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-    108,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,  84, 101, 120, 116, 
-    117, 114, 101,  73,  50,  68, 
-     65, 114, 114,  97, 121,   0, 
-     83, 119, 105, 122, 122, 108, 
-    101,  80, 114, 111, 112, 101, 
-    114, 116, 105, 101, 115,   0, 
-    171, 171, 108,   0,   0,   0, 
-      1,   0,   0,   0, 152,   0, 
-      0,   0,  16,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0, 176,   0,   0,   0, 
-      0,   0,   0,   0,  16,   0, 
-      0,   0,   2,   0,   0,   0, 
-    192,   0,   0,   0,   0,   0, 
-      0,   0,  83, 119, 105, 122, 
-    122, 108, 101,  73, 110, 100, 
-    105,  99, 101, 115,   0, 171, 
-      1,   0,  19,   0,   1,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-    128,   0,   0,   0,   3,   0, 
-      0,   0,   8,   0,   0,   0, 
-     80,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     92,   0,   0,   0,   0,   0, 
-      0,   0,   4,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,   1,   1,   0,   0, 
-    118,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   2,   0, 
-      0,   0,   7,   3,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     83,  86,  95,  82,  69,  78, 
-     68,  69,  82,  84,  65,  82, 
-     71,  69,  84,  65,  82,  82, 
-     65,  89,  73,  78,  68,  69, 
-     88,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0, 171, 
-     79,  83,  71,  78,  44,   0, 
-      0,   0,   1,   0,   0,   0, 
-      8,   0,   0,   0,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  83,  86, 
-     95,  84,  65,  82,  71,  69, 
-     84,   0, 171, 171,  83,  72, 
-     68,  82, 112,   2,   0,   0, 
-     64,   0,   0,   0, 156,   0, 
-      0,   0,  89,   0,   0,   4, 
-     70, 142,  32,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     88,  64,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     51,  51,   0,   0, 100,   8, 
-      0,   4,  18,  16,  16,   0, 
-      1,   0,   0,   0,   4,   0, 
-      0,   0,  98,  16,   0,   3, 
-     50,  16,  16,   0,   2,   0, 
-      0,   0, 101,   0,   0,   3, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0, 104,   0,   0,   2, 
-      1,   0,   0,   0, 105,   0, 
-      0,   4,   0,   0,   0,   0, 
-      6,   0,   0,   0,   4,   0, 
-      0,   0,  61,  16,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     86,   0,   0,   5,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  56,   0,   0,   7, 
-     50,   0,  16,   0,   0,   0, 
-      0,   0,  70,   0,  16,   0, 
-      0,   0,   0,   0,  70,  16, 
-     16,   0,   2,   0,   0,   0, 
-     27,   0,   0,   5,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-     66,   0,  16,   0,   0,   0, 
-      0,   0,  10,  16,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 130,   0,  16,   0, 
-      0,   0,   0,   0,   1,  64, 
-      0,   0,   0,   0,   0,   0, 
-     45,   0,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  14,  16,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  26,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,  42,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,  58,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   5,   0, 
-      0,   0,   1,  64,   0,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  10, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7,  18,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   6, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  26, 128,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  54,   0,   0,   7, 
-     34,  32,  16,   0,   0,   0, 
-      0,   0,  10,  48,  32,   4, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     42, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7,  66,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  58, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7, 130,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,  22,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      6,   0,   0,   0,  10,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      6,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI2DArray                   texture   sint4     2darray    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint   x   
+// TEXCOORD                 0   xyz         2     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture2darray (sint,sint,sint,sint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 22 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleI2DArray[] =
+{
+     68,  88,  66,  67,  85,  61, 
+     60,  36,  33, 245,  58, 113, 
+    238, 227, 230, 200, 136, 227, 
+     36, 193,   1,   0,   0,   0, 
+    240,   4,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+     64,   1,   0,   0, 200,   1, 
+      0,   0, 252,   1,   0,   0, 
+    116,   4,   0,   0,  82,  68, 
+     69,  70,   4,   1,   0,   0, 
+      1,   0,   0,   0, 128,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    208,   0,   0,   0,  92,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   5,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+    108,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  84, 101, 120, 116, 
+    117, 114, 101,  73,  50,  68, 
+     65, 114, 114,  97, 121,   0, 
+     83, 119, 105, 122, 122, 108, 
+    101,  80, 114, 111, 112, 101, 
+    114, 116, 105, 101, 115,   0, 
+    171, 171, 108,   0,   0,   0, 
+      1,   0,   0,   0, 152,   0, 
+      0,   0,  16,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0, 176,   0,   0,   0, 
+      0,   0,   0,   0,  16,   0, 
+      0,   0,   2,   0,   0,   0, 
+    192,   0,   0,   0,   0,   0, 
+      0,   0,  83, 119, 105, 122, 
+    122, 108, 101,  73, 110, 100, 
+    105,  99, 101, 115,   0, 171, 
+      1,   0,  19,   0,   1,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+    128,   0,   0,   0,   3,   0, 
+      0,   0,   8,   0,   0,   0, 
+     80,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     92,   0,   0,   0,   0,   0, 
+      0,   0,   4,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   1,   1,   0,   0, 
+    118,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   2,   0, 
+      0,   0,   7,   3,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     83,  86,  95,  82,  69,  78, 
+     68,  69,  82,  84,  65,  82, 
+     71,  69,  84,  65,  82,  82, 
+     65,  89,  73,  78,  68,  69, 
+     88,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0, 171, 
+     79,  83,  71,  78,  44,   0, 
+      0,   0,   1,   0,   0,   0, 
+      8,   0,   0,   0,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  83,  86, 
+     95,  84,  65,  82,  71,  69, 
+     84,   0, 171, 171,  83,  72, 
+     68,  82, 112,   2,   0,   0, 
+     64,   0,   0,   0, 156,   0, 
+      0,   0,  89,   0,   0,   4, 
+     70, 142,  32,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     88,  64,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     51,  51,   0,   0, 100,   8, 
+      0,   4,  18,  16,  16,   0, 
+      1,   0,   0,   0,   4,   0, 
+      0,   0,  98,  16,   0,   3, 
+     50,  16,  16,   0,   2,   0, 
+      0,   0, 101,   0,   0,   3, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0, 104,   0,   0,   2, 
+      1,   0,   0,   0, 105,   0, 
+      0,   4,   0,   0,   0,   0, 
+      6,   0,   0,   0,   4,   0, 
+      0,   0,  61,  16,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     86,   0,   0,   5,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  56,   0,   0,   7, 
+     50,   0,  16,   0,   0,   0, 
+      0,   0,  70,   0,  16,   0, 
+      0,   0,   0,   0,  70,  16, 
+     16,   0,   2,   0,   0,   0, 
+     27,   0,   0,   5,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+     66,   0,  16,   0,   0,   0, 
+      0,   0,  10,  16,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5, 130,   0,  16,   0, 
+      0,   0,   0,   0,   1,  64, 
+      0,   0,   0,   0,   0,   0, 
+     45,   0,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,  14,  16,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  26,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,  42,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,  58,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   5,   0, 
+      0,   0,   1,  64,   0,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  10, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7,  18,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   6, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  26, 128,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  54,   0,   0,   7, 
+     34,  32,  16,   0,   0,   0, 
+      0,   0,  10,  48,  32,   4, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     42, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7,  66,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  58, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7, 130,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,  22,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      6,   0,   0,   0,  10,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      6,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlei2dpsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei2dps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,270 +1,270 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer SwizzleProperties
-// {
-//
-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI2D                        texture   sint4          2d    0        1
-// SwizzleProperties                 cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_constantbuffer cb0[1], immediateIndexed
-dcl_resource_texture2d (sint,sint,sint,sint) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-dcl_indexableTemp x0[6], 4
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v1.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.zw, l(0,0,0,0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov x0[0].x, r0.x
-mov x0[1].x, r0.y
-mov x0[2].x, r0.z
-mov x0[3].x, r0.w
-mov x0[4].x, l(0)
-mov x0[5].x, l(1)
-mov r0.x, cb0[0].x
-mov o0.x, x0[r0.x + 0].x
-mov r0.x, cb0[0].y
-mov o0.y, x0[r0.x + 0].x
-mov r0.x, cb0[0].z
-mov o0.z, x0[r0.x + 0].x
-mov r0.x, cb0[0].w
-mov o0.w, x0[r0.x + 0].x
-ret 
-// Approximately 21 instruction slots used
-#endif
-
-const BYTE g_PS_SwizzleI2D[] =
-{
-     68,  88,  66,  67, 180,  37, 
-     54,  19,  39, 134, 185, 230, 
-    234,  82, 113, 129,  69, 135, 
-    140,  27,   1,   0,   0,   0, 
-    164,   4,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-     60,   1,   0,   0, 148,   1, 
-      0,   0, 200,   1,   0,   0, 
-     40,   4,   0,   0,  82,  68, 
-     69,  70,   0,   1,   0,   0, 
-      1,   0,   0,   0, 124,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    204,   0,   0,   0,  92,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-    103,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,  84, 101, 120, 116, 
-    117, 114, 101,  73,  50,  68, 
-      0,  83, 119, 105, 122, 122, 
-    108, 101,  80, 114, 111, 112, 
-    101, 114, 116, 105, 101, 115, 
-      0, 171, 171, 171, 103,   0, 
-      0,   0,   1,   0,   0,   0, 
-    148,   0,   0,   0,  16,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0, 172,   0, 
-      0,   0,   0,   0,   0,   0, 
-     16,   0,   0,   0,   2,   0, 
-      0,   0, 188,   0,   0,   0, 
-      0,   0,   0,   0,  83, 119, 
-    105, 122, 122, 108, 101,  73, 
-    110, 100, 105,  99, 101, 115, 
-      0, 171,   1,   0,  19,   0, 
-      1,   0,   4,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     77, 105,  99, 114, 111, 115, 
-    111, 102, 116,  32,  40,  82, 
-     41,  32,  72,  76,  83,  76, 
-     32,  83, 104,  97, 100, 101, 
-    114,  32,  67, 111, 109, 112, 
-    105, 108, 101, 114,  32,  54, 
-     46,  51,  46,  57,  54,  48, 
-     48,  46,  49,  54,  51,  56, 
-     52,   0, 171, 171,  73,  83, 
-     71,  78,  80,   0,   0,   0, 
-      2,   0,   0,   0,   8,   0, 
-      0,   0,  56,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  68,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,   3,   3, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0, 171, 
-    171, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82,  88,   2, 
-      0,   0,  64,   0,   0,   0, 
-    150,   0,   0,   0,  89,   0, 
-      0,   4,  70, 142,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  88,  24,   0,   4, 
-      0, 112,  16,   0,   0,   0, 
-      0,   0,  51,  51,   0,   0, 
-     98,  16,   0,   3,  50,  16, 
-     16,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-    104,   0,   0,   2,   1,   0, 
-      0,   0, 105,   0,   0,   4, 
-      0,   0,   0,   0,   6,   0, 
-      0,   0,   4,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  27,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,  26,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,  42,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,  58,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,  64, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      5,   0,   0,   0,   1,  64, 
-      0,   0,   1,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     10, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7,  18,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  26, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7,  34,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   6, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  42, 128,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  54,   0,   0,   7, 
-     66,  32,  16,   0,   0,   0, 
-      0,   0,  10,  48,  32,   4, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     58, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7, 130,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,  21,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   6,   0,   0,   0, 
-     10,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   5,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI2D                        texture   sint4          2d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture2d (sint,sint,sint,sint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 21 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleI2D[] =
+{
+     68,  88,  66,  67, 180,  37, 
+     54,  19,  39, 134, 185, 230, 
+    234,  82, 113, 129,  69, 135, 
+    140,  27,   1,   0,   0,   0, 
+    164,   4,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+     60,   1,   0,   0, 148,   1, 
+      0,   0, 200,   1,   0,   0, 
+     40,   4,   0,   0,  82,  68, 
+     69,  70,   0,   1,   0,   0, 
+      1,   0,   0,   0, 124,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    204,   0,   0,   0,  92,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+    103,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  84, 101, 120, 116, 
+    117, 114, 101,  73,  50,  68, 
+      0,  83, 119, 105, 122, 122, 
+    108, 101,  80, 114, 111, 112, 
+    101, 114, 116, 105, 101, 115, 
+      0, 171, 171, 171, 103,   0, 
+      0,   0,   1,   0,   0,   0, 
+    148,   0,   0,   0,  16,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 172,   0, 
+      0,   0,   0,   0,   0,   0, 
+     16,   0,   0,   0,   2,   0, 
+      0,   0, 188,   0,   0,   0, 
+      0,   0,   0,   0,  83, 119, 
+    105, 122, 122, 108, 101,  73, 
+    110, 100, 105,  99, 101, 115, 
+      0, 171,   1,   0,  19,   0, 
+      1,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     77, 105,  99, 114, 111, 115, 
+    111, 102, 116,  32,  40,  82, 
+     41,  32,  72,  76,  83,  76, 
+     32,  83, 104,  97, 100, 101, 
+    114,  32,  67, 111, 109, 112, 
+    105, 108, 101, 114,  32,  54, 
+     46,  51,  46,  57,  54,  48, 
+     48,  46,  49,  54,  51,  56, 
+     52,   0, 171, 171,  73,  83, 
+     71,  78,  80,   0,   0,   0, 
+      2,   0,   0,   0,   8,   0, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  68,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,   3,   3, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0, 171, 
+    171, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82,  88,   2, 
+      0,   0,  64,   0,   0,   0, 
+    150,   0,   0,   0,  89,   0, 
+      0,   4,  70, 142,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  88,  24,   0,   4, 
+      0, 112,  16,   0,   0,   0, 
+      0,   0,  51,  51,   0,   0, 
+     98,  16,   0,   3,  50,  16, 
+     16,   0,   1,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+    104,   0,   0,   2,   1,   0, 
+      0,   0, 105,   0,   0,   4, 
+      0,   0,   0,   0,   6,   0, 
+      0,   0,   4,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  27,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,  26,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,  42,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,  58,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,  64, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      5,   0,   0,   0,   1,  64, 
+      0,   0,   1,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     10, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7,  18,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  26, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7,  34,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   6, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  42, 128,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  54,   0,   0,   7, 
+     66,  32,  16,   0,   0,   0, 
+      0,   0,  10,  48,  32,   4, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     58, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7, 130,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,  21,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   6,   0,   0,   0, 
+     10,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   5,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzlei3dpsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzlei3dps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,277 +1,277 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer SwizzleProperties
-// {
-//
-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureI3D                        texture   sint4          3d    0        1
-// SwizzleProperties                 cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
-//
-ps_4_0
-dcl_constantbuffer cb0[1], immediateIndexed
-dcl_resource_texture3d (sint,sint,sint,sint) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-dcl_indexableTemp x0[6], 4
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xyz, r0.xyzx
-mul r0.xyz, r0.xyzx, v2.xyzx
-ftoi r0.xyz, r0.xyzx
-mov r0.w, l(0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov x0[0].x, r0.x
-mov x0[1].x, r0.y
-mov x0[2].x, r0.z
-mov x0[3].x, r0.w
-mov x0[4].x, l(0)
-mov x0[5].x, l(1)
-mov r0.x, cb0[0].x
-mov o0.x, x0[r0.x + 0].x
-mov r0.x, cb0[0].y
-mov o0.y, x0[r0.x + 0].x
-mov r0.x, cb0[0].z
-mov o0.z, x0[r0.x + 0].x
-mov r0.x, cb0[0].w
-mov o0.w, x0[r0.x + 0].x
-ret 
-// Approximately 21 instruction slots used
-#endif
-
-const BYTE g_PS_SwizzleI3D[] =
-{
-     68,  88,  66,  67,  48,  84, 
-     97, 193, 216, 245, 101, 196, 
-    167,  81, 215, 168,  25, 164, 
-    144,  38,   1,   0,   0,   0, 
-    200,   4,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-     60,   1,   0,   0, 196,   1, 
-      0,   0, 248,   1,   0,   0, 
-     76,   4,   0,   0,  82,  68, 
-     69,  70,   0,   1,   0,   0, 
-      1,   0,   0,   0, 124,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    204,   0,   0,   0,  92,   0, 
-      0,   0,   2,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-    103,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,  84, 101, 120, 116, 
-    117, 114, 101,  73,  51,  68, 
-      0,  83, 119, 105, 122, 122, 
-    108, 101,  80, 114, 111, 112, 
-    101, 114, 116, 105, 101, 115, 
-      0, 171, 171, 171, 103,   0, 
-      0,   0,   1,   0,   0,   0, 
-    148,   0,   0,   0,  16,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0, 172,   0, 
-      0,   0,   0,   0,   0,   0, 
-     16,   0,   0,   0,   2,   0, 
-      0,   0, 188,   0,   0,   0, 
-      0,   0,   0,   0,  83, 119, 
-    105, 122, 122, 108, 101,  73, 
-    110, 100, 105,  99, 101, 115, 
-      0, 171,   1,   0,  19,   0, 
-      1,   0,   4,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     77, 105,  99, 114, 111, 115, 
-    111, 102, 116,  32,  40,  82, 
-     41,  32,  72,  76,  83,  76, 
-     32,  83, 104,  97, 100, 101, 
-    114,  32,  67, 111, 109, 112, 
-    105, 108, 101, 114,  32,  54, 
-     46,  51,  46,  57,  54,  48, 
-     48,  46,  49,  54,  51,  56, 
-     52,   0, 171, 171,  73,  83, 
-     71,  78, 128,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0, 118,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0,   7,   7, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  83,  86,  95,  82, 
-     69,  78,  68,  69,  82,  84, 
-     65,  82,  71,  69,  84,  65, 
-     82,  82,  65,  89,  73,  78, 
-     68,  69,  88,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82,  76,   2, 
-      0,   0,  64,   0,   0,   0, 
-    147,   0,   0,   0,  89,   0, 
-      0,   4,  70, 142,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  88,  40,   0,   4, 
-      0, 112,  16,   0,   0,   0, 
-      0,   0,  51,  51,   0,   0, 
-     98,  16,   0,   3, 114,  16, 
-     16,   0,   2,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-    104,   0,   0,   2,   1,   0, 
-      0,   0, 105,   0,   0,   4, 
-      0,   0,   0,   0,   6,   0, 
-      0,   0,   4,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  27,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,  26,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,  42,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,  58,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,  64, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      5,   0,   0,   0,   1,  64, 
-      0,   0,   1,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     10, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7,  18,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  26, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7,  34,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   6, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  42, 128,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  54,   0,   0,   7, 
-     66,  32,  16,   0,   0,   0, 
-      0,   0,  10,  48,  32,   4, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     58, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7, 130,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,  21,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   6,   0,   0,   0, 
-     10,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   5,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureI3D                        texture   sint4          3d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET     int   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture3d (sint,sint,sint,sint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 21 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleI3D[] =
+{
+     68,  88,  66,  67,  48,  84, 
+     97, 193, 216, 245, 101, 196, 
+    167,  81, 215, 168,  25, 164, 
+    144,  38,   1,   0,   0,   0, 
+    200,   4,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+     60,   1,   0,   0, 196,   1, 
+      0,   0, 248,   1,   0,   0, 
+     76,   4,   0,   0,  82,  68, 
+     69,  70,   0,   1,   0,   0, 
+      1,   0,   0,   0, 124,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    204,   0,   0,   0,  92,   0, 
+      0,   0,   2,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+    103,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  84, 101, 120, 116, 
+    117, 114, 101,  73,  51,  68, 
+      0,  83, 119, 105, 122, 122, 
+    108, 101,  80, 114, 111, 112, 
+    101, 114, 116, 105, 101, 115, 
+      0, 171, 171, 171, 103,   0, 
+      0,   0,   1,   0,   0,   0, 
+    148,   0,   0,   0,  16,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 172,   0, 
+      0,   0,   0,   0,   0,   0, 
+     16,   0,   0,   0,   2,   0, 
+      0,   0, 188,   0,   0,   0, 
+      0,   0,   0,   0,  83, 119, 
+    105, 122, 122, 108, 101,  73, 
+    110, 100, 105,  99, 101, 115, 
+      0, 171,   1,   0,  19,   0, 
+      1,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     77, 105,  99, 114, 111, 115, 
+    111, 102, 116,  32,  40,  82, 
+     41,  32,  72,  76,  83,  76, 
+     32,  83, 104,  97, 100, 101, 
+    114,  32,  67, 111, 109, 112, 
+    105, 108, 101, 114,  32,  54, 
+     46,  51,  46,  57,  54,  48, 
+     48,  46,  49,  54,  51,  56, 
+     52,   0, 171, 171,  73,  83, 
+     71,  78, 128,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0, 118,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0,   7,   7, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  83,  86,  95,  82, 
+     69,  78,  68,  69,  82,  84, 
+     65,  82,  71,  69,  84,  65, 
+     82,  82,  65,  89,  73,  78, 
+     68,  69,  88,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82,  76,   2, 
+      0,   0,  64,   0,   0,   0, 
+    147,   0,   0,   0,  89,   0, 
+      0,   4,  70, 142,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  88,  40,   0,   4, 
+      0, 112,  16,   0,   0,   0, 
+      0,   0,  51,  51,   0,   0, 
+     98,  16,   0,   3, 114,  16, 
+     16,   0,   2,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+    104,   0,   0,   2,   1,   0, 
+      0,   0, 105,   0,   0,   4, 
+      0,   0,   0,   0,   6,   0, 
+      0,   0,   4,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7, 114,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  27,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,  26,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,  42,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,  58,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,  64, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      5,   0,   0,   0,   1,  64, 
+      0,   0,   1,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     10, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7,  18,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  26, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7,  34,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   6, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  42, 128,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  54,   0,   0,   7, 
+     66,  32,  16,   0,   0,   0, 
+      0,   0,  10,  48,  32,   4, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     58, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7, 130,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,  21,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   6,   0,   0,   0, 
+     10,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   5,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzleui2darraypsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,286 +1,286 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer SwizzleProperties
-// {
-//
-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI2DArray                  texture   uint4     2darray    0        1
-// SwizzleProperties                 cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint   x   
-// TEXCOORD                 0   xyz         2     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_constantbuffer cb0[1], immediateIndexed
-dcl_resource_texture2darray (uint,uint,uint,uint) t0
-dcl_input_ps_siv constant v1.x, rendertarget_array_index
-dcl_input_ps linear v2.xy
-dcl_output o0.xyzw
-dcl_temps 1
-dcl_indexableTemp x0[6], 4
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v2.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.z, v1.x
-mov r0.w, l(0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov x0[0].x, r0.x
-mov x0[1].x, r0.y
-mov x0[2].x, r0.z
-mov x0[3].x, r0.w
-mov x0[4].x, l(0)
-mov x0[5].x, l(1)
-mov r0.x, cb0[0].x
-mov o0.x, x0[r0.x + 0].x
-mov r0.x, cb0[0].y
-mov o0.y, x0[r0.x + 0].x
-mov r0.x, cb0[0].z
-mov o0.z, x0[r0.x + 0].x
-mov r0.x, cb0[0].w
-mov o0.w, x0[r0.x + 0].x
-ret 
-// Approximately 22 instruction slots used
-#endif
-
-const BYTE g_PS_SwizzleUI2DArray[] =
-{
-     68,  88,  66,  67,  15, 124, 
-    179,  49,  45,  69,  64, 249, 
-    216, 189, 135, 190,  71, 234, 
-     72,  20,   1,   0,   0,   0, 
-    240,   4,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-     64,   1,   0,   0, 200,   1, 
-      0,   0, 252,   1,   0,   0, 
-    116,   4,   0,   0,  82,  68, 
-     69,  70,   4,   1,   0,   0, 
-      1,   0,   0,   0, 128,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    208,   0,   0,   0,  92,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   5,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-    109,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,  84, 101, 120, 116, 
-    117, 114, 101,  85,  73,  50, 
-     68,  65, 114, 114,  97, 121, 
-      0,  83, 119, 105, 122, 122, 
-    108, 101,  80, 114, 111, 112, 
-    101, 114, 116, 105, 101, 115, 
-      0, 171, 109,   0,   0,   0, 
-      1,   0,   0,   0, 152,   0, 
-      0,   0,  16,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0, 176,   0,   0,   0, 
-      0,   0,   0,   0,  16,   0, 
-      0,   0,   2,   0,   0,   0, 
-    192,   0,   0,   0,   0,   0, 
-      0,   0,  83, 119, 105, 122, 
-    122, 108, 101,  73, 110, 100, 
-    105,  99, 101, 115,   0, 171, 
-      1,   0,  19,   0,   1,   0, 
-      4,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  77, 105, 
-     99, 114, 111, 115, 111, 102, 
-    116,  32,  40,  82,  41,  32, 
-     72,  76,  83,  76,  32,  83, 
-    104,  97, 100, 101, 114,  32, 
-     67, 111, 109, 112, 105, 108, 
-    101, 114,  32,  54,  46,  51, 
-     46,  57,  54,  48,  48,  46, 
-     49,  54,  51,  56,  52,   0, 
-    171, 171,  73,  83,  71,  78, 
-    128,   0,   0,   0,   3,   0, 
-      0,   0,   8,   0,   0,   0, 
-     80,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      3,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     92,   0,   0,   0,   0,   0, 
-      0,   0,   4,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,   1,   1,   0,   0, 
-    118,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,   2,   0, 
-      0,   0,   7,   3,   0,   0, 
-     83,  86,  95,  80,  79,  83, 
-     73,  84,  73,  79,  78,   0, 
-     83,  86,  95,  82,  69,  78, 
-     68,  69,  82,  84,  65,  82, 
-     71,  69,  84,  65,  82,  82, 
-     65,  89,  73,  78,  68,  69, 
-     88,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0, 171, 
-     79,  83,  71,  78,  44,   0, 
-      0,   0,   1,   0,   0,   0, 
-      8,   0,   0,   0,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-     15,   0,   0,   0,  83,  86, 
-     95,  84,  65,  82,  71,  69, 
-     84,   0, 171, 171,  83,  72, 
-     68,  82, 112,   2,   0,   0, 
-     64,   0,   0,   0, 156,   0, 
-      0,   0,  89,   0,   0,   4, 
-     70, 142,  32,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-     88,  64,   0,   4,   0, 112, 
-     16,   0,   0,   0,   0,   0, 
-     68,  68,   0,   0, 100,   8, 
-      0,   4,  18,  16,  16,   0, 
-      1,   0,   0,   0,   4,   0, 
-      0,   0,  98,  16,   0,   3, 
-     50,  16,  16,   0,   2,   0, 
-      0,   0, 101,   0,   0,   3, 
-    242,  32,  16,   0,   0,   0, 
-      0,   0, 104,   0,   0,   2, 
-      1,   0,   0,   0, 105,   0, 
-      0,   4,   0,   0,   0,   0, 
-      6,   0,   0,   0,   4,   0, 
-      0,   0,  61,  16,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     86,   0,   0,   5,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  56,   0,   0,   7, 
-     50,   0,  16,   0,   0,   0, 
-      0,   0,  70,   0,  16,   0, 
-      0,   0,   0,   0,  70,  16, 
-     16,   0,   2,   0,   0,   0, 
-     27,   0,   0,   5,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   5, 
-     66,   0,  16,   0,   0,   0, 
-      0,   0,  10,  16,  16,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   5, 130,   0,  16,   0, 
-      0,   0,   0,   0,   1,  64, 
-      0,   0,   0,   0,   0,   0, 
-     45,   0,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,  14,  16,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  26,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,  42,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   3,   0, 
-      0,   0,  58,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,  64,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,  48,  32,   0, 
-      0,   0,   0,   0,   5,   0, 
-      0,   0,   1,  64,   0,   0, 
-      1,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  10, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7,  18,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   6, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  26, 128,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  54,   0,   0,   7, 
-     34,  32,  16,   0,   0,   0, 
-      0,   0,  10,  48,  32,   4, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     42, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7,  66,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  58, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7, 130,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  62,   0,   0,   1, 
-     83,  84,  65,  84, 116,   0, 
-      0,   0,  22,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      6,   0,   0,   0,  10,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      6,   0,   0,   0,   0,   0, 
-      0,   0,   2,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI2DArray                  texture   uint4     2darray    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint   x   
+// TEXCOORD                 0   xyz         2     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture2darray (uint,uint,uint,uint) t0
+dcl_input_ps_siv constant v1.x, rendertarget_array_index
+dcl_input_ps linear v2.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v2.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.z, v1.x
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 22 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleUI2DArray[] =
+{
+     68,  88,  66,  67,  15, 124, 
+    179,  49,  45,  69,  64, 249, 
+    216, 189, 135, 190,  71, 234, 
+     72,  20,   1,   0,   0,   0, 
+    240,   4,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+     64,   1,   0,   0, 200,   1, 
+      0,   0, 252,   1,   0,   0, 
+    116,   4,   0,   0,  82,  68, 
+     69,  70,   4,   1,   0,   0, 
+      1,   0,   0,   0, 128,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    208,   0,   0,   0,  92,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   5,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+    109,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  84, 101, 120, 116, 
+    117, 114, 101,  85,  73,  50, 
+     68,  65, 114, 114,  97, 121, 
+      0,  83, 119, 105, 122, 122, 
+    108, 101,  80, 114, 111, 112, 
+    101, 114, 116, 105, 101, 115, 
+      0, 171, 109,   0,   0,   0, 
+      1,   0,   0,   0, 152,   0, 
+      0,   0,  16,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0, 176,   0,   0,   0, 
+      0,   0,   0,   0,  16,   0, 
+      0,   0,   2,   0,   0,   0, 
+    192,   0,   0,   0,   0,   0, 
+      0,   0,  83, 119, 105, 122, 
+    122, 108, 101,  73, 110, 100, 
+    105,  99, 101, 115,   0, 171, 
+      1,   0,  19,   0,   1,   0, 
+      4,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  77, 105, 
+     99, 114, 111, 115, 111, 102, 
+    116,  32,  40,  82,  41,  32, 
+     72,  76,  83,  76,  32,  83, 
+    104,  97, 100, 101, 114,  32, 
+     67, 111, 109, 112, 105, 108, 
+    101, 114,  32,  54,  46,  51, 
+     46,  57,  54,  48,  48,  46, 
+     49,  54,  51,  56,  52,   0, 
+    171, 171,  73,  83,  71,  78, 
+    128,   0,   0,   0,   3,   0, 
+      0,   0,   8,   0,   0,   0, 
+     80,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      3,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     92,   0,   0,   0,   0,   0, 
+      0,   0,   4,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,   1,   1,   0,   0, 
+    118,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,   2,   0, 
+      0,   0,   7,   3,   0,   0, 
+     83,  86,  95,  80,  79,  83, 
+     73,  84,  73,  79,  78,   0, 
+     83,  86,  95,  82,  69,  78, 
+     68,  69,  82,  84,  65,  82, 
+     71,  69,  84,  65,  82,  82, 
+     65,  89,  73,  78,  68,  69, 
+     88,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0, 171, 
+     79,  83,  71,  78,  44,   0, 
+      0,   0,   1,   0,   0,   0, 
+      8,   0,   0,   0,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+     15,   0,   0,   0,  83,  86, 
+     95,  84,  65,  82,  71,  69, 
+     84,   0, 171, 171,  83,  72, 
+     68,  82, 112,   2,   0,   0, 
+     64,   0,   0,   0, 156,   0, 
+      0,   0,  89,   0,   0,   4, 
+     70, 142,  32,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+     88,  64,   0,   4,   0, 112, 
+     16,   0,   0,   0,   0,   0, 
+     68,  68,   0,   0, 100,   8, 
+      0,   4,  18,  16,  16,   0, 
+      1,   0,   0,   0,   4,   0, 
+      0,   0,  98,  16,   0,   3, 
+     50,  16,  16,   0,   2,   0, 
+      0,   0, 101,   0,   0,   3, 
+    242,  32,  16,   0,   0,   0, 
+      0,   0, 104,   0,   0,   2, 
+      1,   0,   0,   0, 105,   0, 
+      0,   4,   0,   0,   0,   0, 
+      6,   0,   0,   0,   4,   0, 
+      0,   0,  61,  16,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     86,   0,   0,   5,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  56,   0,   0,   7, 
+     50,   0,  16,   0,   0,   0, 
+      0,   0,  70,   0,  16,   0, 
+      0,   0,   0,   0,  70,  16, 
+     16,   0,   2,   0,   0,   0, 
+     27,   0,   0,   5,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   5, 
+     66,   0,  16,   0,   0,   0, 
+      0,   0,  10,  16,  16,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   5, 130,   0,  16,   0, 
+      0,   0,   0,   0,   1,  64, 
+      0,   0,   0,   0,   0,   0, 
+     45,   0,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,  14,  16,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  26,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,  42,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   3,   0, 
+      0,   0,  58,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,  64,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,  48,  32,   0, 
+      0,   0,   0,   0,   5,   0, 
+      0,   0,   1,  64,   0,   0, 
+      1,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  10, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7,  18,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   6, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  26, 128,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  54,   0,   0,   7, 
+     34,  32,  16,   0,   0,   0, 
+      0,   0,  10,  48,  32,   4, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     42, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7,  66,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  58, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7, 130,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  62,   0,   0,   1, 
+     83,  84,  65,  84, 116,   0, 
+      0,   0,  22,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      6,   0,   0,   0,  10,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      6,   0,   0,   0,   0,   0, 
+      0,   0,   2,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzleui2dpsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,270 +1,270 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer SwizzleProperties
-// {
-//
-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI2D                       texture   uint4          2d    0        1
-// SwizzleProperties                 cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// TEXCOORD                 0   xy          1     NONE   float   xy  
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_constantbuffer cb0[1], immediateIndexed
-dcl_resource_texture2d (uint,uint,uint,uint) t0
-dcl_input_ps linear v1.xy
-dcl_output o0.xyzw
-dcl_temps 1
-dcl_indexableTemp x0[6], 4
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xy, r0.xyxx
-mul r0.xy, r0.xyxx, v1.xyxx
-ftoi r0.xy, r0.xyxx
-mov r0.zw, l(0,0,0,0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov x0[0].x, r0.x
-mov x0[1].x, r0.y
-mov x0[2].x, r0.z
-mov x0[3].x, r0.w
-mov x0[4].x, l(0)
-mov x0[5].x, l(1)
-mov r0.x, cb0[0].x
-mov o0.x, x0[r0.x + 0].x
-mov r0.x, cb0[0].y
-mov o0.y, x0[r0.x + 0].x
-mov r0.x, cb0[0].z
-mov o0.z, x0[r0.x + 0].x
-mov r0.x, cb0[0].w
-mov o0.w, x0[r0.x + 0].x
-ret 
-// Approximately 21 instruction slots used
-#endif
-
-const BYTE g_PS_SwizzleUI2D[] =
-{
-     68,  88,  66,  67, 165, 190, 
-     35, 188, 235, 202, 154, 237, 
-    226,  86, 223, 212,  34,  38, 
-     81, 252,   1,   0,   0,   0, 
-    164,   4,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-     60,   1,   0,   0, 148,   1, 
-      0,   0, 200,   1,   0,   0, 
-     40,   4,   0,   0,  82,  68, 
-     69,  70,   0,   1,   0,   0, 
-      1,   0,   0,   0, 124,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    204,   0,   0,   0,  92,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   4,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-    104,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,  84, 101, 120, 116, 
-    117, 114, 101,  85,  73,  50, 
-     68,   0,  83, 119, 105, 122, 
-    122, 108, 101,  80, 114, 111, 
-    112, 101, 114, 116, 105, 101, 
-    115,   0, 171, 171, 104,   0, 
-      0,   0,   1,   0,   0,   0, 
-    148,   0,   0,   0,  16,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0, 172,   0, 
-      0,   0,   0,   0,   0,   0, 
-     16,   0,   0,   0,   2,   0, 
-      0,   0, 188,   0,   0,   0, 
-      0,   0,   0,   0,  83, 119, 
-    105, 122, 122, 108, 101,  73, 
-    110, 100, 105,  99, 101, 115, 
-      0, 171,   1,   0,  19,   0, 
-      1,   0,   4,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     77, 105,  99, 114, 111, 115, 
-    111, 102, 116,  32,  40,  82, 
-     41,  32,  72,  76,  83,  76, 
-     32,  83, 104,  97, 100, 101, 
-    114,  32,  67, 111, 109, 112, 
-    105, 108, 101, 114,  32,  54, 
-     46,  51,  46,  57,  54,  48, 
-     48,  46,  49,  54,  51,  56, 
-     52,   0, 171, 171,  73,  83, 
-     71,  78,  80,   0,   0,   0, 
-      2,   0,   0,   0,   8,   0, 
-      0,   0,  56,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  68,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,   3,   3, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  84,  69,  88,  67, 
-     79,  79,  82,  68,   0, 171, 
-    171, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82,  88,   2, 
-      0,   0,  64,   0,   0,   0, 
-    150,   0,   0,   0,  89,   0, 
-      0,   4,  70, 142,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  88,  24,   0,   4, 
-      0, 112,  16,   0,   0,   0, 
-      0,   0,  68,  68,   0,   0, 
-     98,  16,   0,   3,  50,  16, 
-     16,   0,   1,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-    104,   0,   0,   2,   1,   0, 
-      0,   0, 105,   0,   0,   4, 
-      0,   0,   0,   0,   6,   0, 
-      0,   0,   4,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7,  50,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   0,  16,   0,   0,   0, 
-      0,   0,  70,  16,  16,   0, 
-      1,   0,   0,   0,  27,   0, 
-      0,   5,  50,   0,  16,   0, 
-      0,   0,   0,   0,  70,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   8, 194,   0, 
-     16,   0,   0,   0,   0,   0, 
-      2,  64,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,  26,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,  42,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,  58,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,  64, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      5,   0,   0,   0,   1,  64, 
-      0,   0,   1,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     10, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7,  18,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  26, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7,  34,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   6, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  42, 128,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  54,   0,   0,   7, 
-     66,  32,  16,   0,   0,   0, 
-      0,   0,  10,  48,  32,   4, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     58, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7, 130,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,  21,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   6,   0,   0,   0, 
-     10,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   5,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI2D                       texture   uint4          2d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// TEXCOORD                 0   xy          1     NONE   float   xy  
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture2d (uint,uint,uint,uint) t0
+dcl_input_ps linear v1.xy
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xy, r0.xyxx
+mul r0.xy, r0.xyxx, v1.xyxx
+ftoi r0.xy, r0.xyxx
+mov r0.zw, l(0,0,0,0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 21 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleUI2D[] =
+{
+     68,  88,  66,  67, 165, 190, 
+     35, 188, 235, 202, 154, 237, 
+    226,  86, 223, 212,  34,  38, 
+     81, 252,   1,   0,   0,   0, 
+    164,   4,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+     60,   1,   0,   0, 148,   1, 
+      0,   0, 200,   1,   0,   0, 
+     40,   4,   0,   0,  82,  68, 
+     69,  70,   0,   1,   0,   0, 
+      1,   0,   0,   0, 124,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    204,   0,   0,   0,  92,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   4,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+    104,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  84, 101, 120, 116, 
+    117, 114, 101,  85,  73,  50, 
+     68,   0,  83, 119, 105, 122, 
+    122, 108, 101,  80, 114, 111, 
+    112, 101, 114, 116, 105, 101, 
+    115,   0, 171, 171, 104,   0, 
+      0,   0,   1,   0,   0,   0, 
+    148,   0,   0,   0,  16,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 172,   0, 
+      0,   0,   0,   0,   0,   0, 
+     16,   0,   0,   0,   2,   0, 
+      0,   0, 188,   0,   0,   0, 
+      0,   0,   0,   0,  83, 119, 
+    105, 122, 122, 108, 101,  73, 
+    110, 100, 105,  99, 101, 115, 
+      0, 171,   1,   0,  19,   0, 
+      1,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     77, 105,  99, 114, 111, 115, 
+    111, 102, 116,  32,  40,  82, 
+     41,  32,  72,  76,  83,  76, 
+     32,  83, 104,  97, 100, 101, 
+    114,  32,  67, 111, 109, 112, 
+    105, 108, 101, 114,  32,  54, 
+     46,  51,  46,  57,  54,  48, 
+     48,  46,  49,  54,  51,  56, 
+     52,   0, 171, 171,  73,  83, 
+     71,  78,  80,   0,   0,   0, 
+      2,   0,   0,   0,   8,   0, 
+      0,   0,  56,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  68,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,   3,   3, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  84,  69,  88,  67, 
+     79,  79,  82,  68,   0, 171, 
+    171, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82,  88,   2, 
+      0,   0,  64,   0,   0,   0, 
+    150,   0,   0,   0,  89,   0, 
+      0,   4,  70, 142,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  88,  24,   0,   4, 
+      0, 112,  16,   0,   0,   0, 
+      0,   0,  68,  68,   0,   0, 
+     98,  16,   0,   3,  50,  16, 
+     16,   0,   1,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+    104,   0,   0,   2,   1,   0, 
+      0,   0, 105,   0,   0,   4, 
+      0,   0,   0,   0,   6,   0, 
+      0,   0,   4,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7,  50,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   0,  16,   0,   0,   0, 
+      0,   0,  70,  16,  16,   0, 
+      1,   0,   0,   0,  27,   0, 
+      0,   5,  50,   0,  16,   0, 
+      0,   0,   0,   0,  70,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   8, 194,   0, 
+     16,   0,   0,   0,   0,   0, 
+      2,  64,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,  26,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,  42,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,  58,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,  64, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      5,   0,   0,   0,   1,  64, 
+      0,   0,   1,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     10, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7,  18,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  26, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7,  34,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   6, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  42, 128,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  54,   0,   0,   7, 
+     66,  32,  16,   0,   0,   0, 
+      0,   0,  10,  48,  32,   4, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     58, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7, 130,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,  21,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   6,   0,   0,   0, 
+     10,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   5,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shaderscompiledswizzleui3dpsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,277 +1,277 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-//
-// Buffer Definitions: 
-//
-// cbuffer SwizzleProperties
-// {
-//
-//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
-//
-// }
-//
-//
-// Resource Bindings:
-//
-// Name                                 Type  Format         Dim Slot Elements
-// ------------------------------ ---------- ------- ----------- ---- --------
-// TextureUI3D                       texture   uint4          3d    0        1
-// SwizzleProperties                 cbuffer      NA          NA    0        1
-//
-//
-//
-// Input signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_POSITION              0   xyzw        0      POS   float       
-// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
-// TEXCOORD                 0   xyz         2     NONE   float   xyz 
-//
-//
-// Output signature:
-//
-// Name                 Index   Mask Register SysValue  Format   Used
-// -------------------- ----- ------ -------- -------- ------- ------
-// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
-//
-ps_4_0
-dcl_constantbuffer cb0[1], immediateIndexed
-dcl_resource_texture3d (uint,uint,uint,uint) t0
-dcl_input_ps linear v2.xyz
-dcl_output o0.xyzw
-dcl_temps 1
-dcl_indexableTemp x0[6], 4
-resinfo_uint r0.xyzw, l(0), t0.xyzw
-utof r0.xyz, r0.xyzx
-mul r0.xyz, r0.xyzx, v2.xyzx
-ftoi r0.xyz, r0.xyzx
-mov r0.w, l(0)
-ld r0.xyzw, r0.xyzw, t0.xyzw
-mov x0[0].x, r0.x
-mov x0[1].x, r0.y
-mov x0[2].x, r0.z
-mov x0[3].x, r0.w
-mov x0[4].x, l(0)
-mov x0[5].x, l(1)
-mov r0.x, cb0[0].x
-mov o0.x, x0[r0.x + 0].x
-mov r0.x, cb0[0].y
-mov o0.y, x0[r0.x + 0].x
-mov r0.x, cb0[0].z
-mov o0.z, x0[r0.x + 0].x
-mov r0.x, cb0[0].w
-mov o0.w, x0[r0.x + 0].x
-ret 
-// Approximately 21 instruction slots used
-#endif
-
-const BYTE g_PS_SwizzleUI3D[] =
-{
-     68,  88,  66,  67, 186, 124, 
-    222, 110, 186, 145, 165,  56, 
-    152,  97, 247, 114, 115, 197, 
-    159, 190,   1,   0,   0,   0, 
-    200,   4,   0,   0,   5,   0, 
-      0,   0,  52,   0,   0,   0, 
-     60,   1,   0,   0, 196,   1, 
-      0,   0, 248,   1,   0,   0, 
-     76,   4,   0,   0,  82,  68, 
-     69,  70,   0,   1,   0,   0, 
-      1,   0,   0,   0, 124,   0, 
-      0,   0,   2,   0,   0,   0, 
-     28,   0,   0,   0,   0,   4, 
-    255, 255,   0,   1,   0,   0, 
-    204,   0,   0,   0,  92,   0, 
-      0,   0,   2,   0,   0,   0, 
-      4,   0,   0,   0,   8,   0, 
-      0,   0, 255, 255, 255, 255, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  13,   0,   0,   0, 
-    104,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0,  84, 101, 120, 116, 
-    117, 114, 101,  85,  73,  51, 
-     68,   0,  83, 119, 105, 122, 
-    122, 108, 101,  80, 114, 111, 
-    112, 101, 114, 116, 105, 101, 
-    115,   0, 171, 171, 104,   0, 
-      0,   0,   1,   0,   0,   0, 
-    148,   0,   0,   0,  16,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0, 172,   0, 
-      0,   0,   0,   0,   0,   0, 
-     16,   0,   0,   0,   2,   0, 
-      0,   0, 188,   0,   0,   0, 
-      0,   0,   0,   0,  83, 119, 
-    105, 122, 122, 108, 101,  73, 
-    110, 100, 105,  99, 101, 115, 
-      0, 171,   1,   0,  19,   0, 
-      1,   0,   4,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     77, 105,  99, 114, 111, 115, 
-    111, 102, 116,  32,  40,  82, 
-     41,  32,  72,  76,  83,  76, 
-     32,  83, 104,  97, 100, 101, 
-    114,  32,  67, 111, 109, 112, 
-    105, 108, 101, 114,  32,  54, 
-     46,  51,  46,  57,  54,  48, 
-     48,  46,  49,  54,  51,  56, 
-     52,   0, 171, 171,  73,  83, 
-     71,  78, 128,   0,   0,   0, 
-      3,   0,   0,   0,   8,   0, 
-      0,   0,  80,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   3,   0,   0,   0, 
-      0,   0,   0,   0,  15,   0, 
-      0,   0,  92,   0,   0,   0, 
-      0,   0,   0,   0,   4,   0, 
-      0,   0,   1,   0,   0,   0, 
-      1,   0,   0,   0,   1,   0, 
-      0,   0, 118,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   3,   0,   0,   0, 
-      2,   0,   0,   0,   7,   7, 
-      0,   0,  83,  86,  95,  80, 
-     79,  83,  73,  84,  73,  79, 
-     78,   0,  83,  86,  95,  82, 
-     69,  78,  68,  69,  82,  84, 
-     65,  82,  71,  69,  84,  65, 
-     82,  82,  65,  89,  73,  78, 
-     68,  69,  88,   0,  84,  69, 
-     88,  67,  79,  79,  82,  68, 
-      0, 171,  79,  83,  71,  78, 
-     44,   0,   0,   0,   1,   0, 
-      0,   0,   8,   0,   0,   0, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0,  15,   0,   0,   0, 
-     83,  86,  95,  84,  65,  82, 
-     71,  69,  84,   0, 171, 171, 
-     83,  72,  68,  82,  76,   2, 
-      0,   0,  64,   0,   0,   0, 
-    147,   0,   0,   0,  89,   0, 
-      0,   4,  70, 142,  32,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,  88,  40,   0,   4, 
-      0, 112,  16,   0,   0,   0, 
-      0,   0,  68,  68,   0,   0, 
-     98,  16,   0,   3, 114,  16, 
-     16,   0,   2,   0,   0,   0, 
-    101,   0,   0,   3, 242,  32, 
-     16,   0,   0,   0,   0,   0, 
-    104,   0,   0,   2,   1,   0, 
-      0,   0, 105,   0,   0,   4, 
-      0,   0,   0,   0,   6,   0, 
-      0,   0,   4,   0,   0,   0, 
-     61,  16,   0,   7, 242,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  70, 126,  16,   0, 
-      0,   0,   0,   0,  86,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     56,   0,   0,   7, 114,   0, 
-     16,   0,   0,   0,   0,   0, 
-     70,   2,  16,   0,   0,   0, 
-      0,   0,  70,  18,  16,   0, 
-      2,   0,   0,   0,  27,   0, 
-      0,   5, 114,   0,  16,   0, 
-      0,   0,   0,   0,  70,   2, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   5, 130,   0, 
-     16,   0,   0,   0,   0,   0, 
-      1,  64,   0,   0,   0,   0, 
-      0,   0,  45,   0,   0,   7, 
-    242,   0,  16,   0,   0,   0, 
-      0,   0,  70,  14,  16,   0, 
-      0,   0,   0,   0,  70, 126, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      1,   0,   0,   0,  26,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      2,   0,   0,   0,  42,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      3,   0,   0,   0,  58,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      4,   0,   0,   0,   1,  64, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,  48, 
-     32,   0,   0,   0,   0,   0, 
-      5,   0,   0,   0,   1,  64, 
-      0,   0,   1,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     10, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7,  18,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   6,  18,   0,  16,   0, 
-      0,   0,   0,   0,  26, 128, 
-     32,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,  54,   0, 
-      0,   7,  34,  32,  16,   0, 
-      0,   0,   0,   0,  10,  48, 
-     32,   4,   0,   0,   0,   0, 
-     10,   0,  16,   0,   0,   0, 
-      0,   0,  54,   0,   0,   6, 
-     18,   0,  16,   0,   0,   0, 
-      0,   0,  42, 128,  32,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  54,   0,   0,   7, 
-     66,  32,  16,   0,   0,   0, 
-      0,   0,  10,  48,  32,   4, 
-      0,   0,   0,   0,  10,   0, 
-     16,   0,   0,   0,   0,   0, 
-     54,   0,   0,   6,  18,   0, 
-     16,   0,   0,   0,   0,   0, 
-     58, 128,  32,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-     54,   0,   0,   7, 130,  32, 
-     16,   0,   0,   0,   0,   0, 
-     10,  48,  32,   4,   0,   0, 
-      0,   0,  10,   0,  16,   0, 
-      0,   0,   0,   0,  62,   0, 
-      0,   1,  83,  84,  65,  84, 
-    116,   0,   0,   0,  21,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   6,   0,   0,   0, 
-     10,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   5,   0,   0,   0, 
-      0,   0,   0,   0,   2,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,   0,   0,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+//
+// Buffer Definitions: 
+//
+// cbuffer SwizzleProperties
+// {
+//
+//   uint4 SwizzleIndices;              // Offset:    0 Size:    16
+//
+// }
+//
+//
+// Resource Bindings:
+//
+// Name                                 Type  Format         Dim Slot Elements
+// ------------------------------ ---------- ------- ----------- ---- --------
+// TextureUI3D                       texture   uint4          3d    0        1
+// SwizzleProperties                 cbuffer      NA          NA    0        1
+//
+//
+//
+// Input signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_POSITION              0   xyzw        0      POS   float       
+// SV_RENDERTARGETARRAYINDEX     0   x           1  RTINDEX    uint       
+// TEXCOORD                 0   xyz         2     NONE   float   xyz 
+//
+//
+// Output signature:
+//
+// Name                 Index   Mask Register SysValue  Format   Used
+// -------------------- ----- ------ -------- -------- ------- ------
+// SV_TARGET                0   xyzw        0   TARGET    uint   xyzw
+//
+ps_4_0
+dcl_constantbuffer cb0[1], immediateIndexed
+dcl_resource_texture3d (uint,uint,uint,uint) t0
+dcl_input_ps linear v2.xyz
+dcl_output o0.xyzw
+dcl_temps 1
+dcl_indexableTemp x0[6], 4
+resinfo_uint r0.xyzw, l(0), t0.xyzw
+utof r0.xyz, r0.xyzx
+mul r0.xyz, r0.xyzx, v2.xyzx
+ftoi r0.xyz, r0.xyzx
+mov r0.w, l(0)
+ld r0.xyzw, r0.xyzw, t0.xyzw
+mov x0[0].x, r0.x
+mov x0[1].x, r0.y
+mov x0[2].x, r0.z
+mov x0[3].x, r0.w
+mov x0[4].x, l(0)
+mov x0[5].x, l(1)
+mov r0.x, cb0[0].x
+mov o0.x, x0[r0.x + 0].x
+mov r0.x, cb0[0].y
+mov o0.y, x0[r0.x + 0].x
+mov r0.x, cb0[0].z
+mov o0.z, x0[r0.x + 0].x
+mov r0.x, cb0[0].w
+mov o0.w, x0[r0.x + 0].x
+ret 
+// Approximately 21 instruction slots used
+#endif
+
+const BYTE g_PS_SwizzleUI3D[] =
+{
+     68,  88,  66,  67, 186, 124, 
+    222, 110, 186, 145, 165,  56, 
+    152,  97, 247, 114, 115, 197, 
+    159, 190,   1,   0,   0,   0, 
+    200,   4,   0,   0,   5,   0, 
+      0,   0,  52,   0,   0,   0, 
+     60,   1,   0,   0, 196,   1, 
+      0,   0, 248,   1,   0,   0, 
+     76,   4,   0,   0,  82,  68, 
+     69,  70,   0,   1,   0,   0, 
+      1,   0,   0,   0, 124,   0, 
+      0,   0,   2,   0,   0,   0, 
+     28,   0,   0,   0,   0,   4, 
+    255, 255,   0,   1,   0,   0, 
+    204,   0,   0,   0,  92,   0, 
+      0,   0,   2,   0,   0,   0, 
+      4,   0,   0,   0,   8,   0, 
+      0,   0, 255, 255, 255, 255, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  13,   0,   0,   0, 
+    104,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0,  84, 101, 120, 116, 
+    117, 114, 101,  85,  73,  51, 
+     68,   0,  83, 119, 105, 122, 
+    122, 108, 101,  80, 114, 111, 
+    112, 101, 114, 116, 105, 101, 
+    115,   0, 171, 171, 104,   0, 
+      0,   0,   1,   0,   0,   0, 
+    148,   0,   0,   0,  16,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0, 172,   0, 
+      0,   0,   0,   0,   0,   0, 
+     16,   0,   0,   0,   2,   0, 
+      0,   0, 188,   0,   0,   0, 
+      0,   0,   0,   0,  83, 119, 
+    105, 122, 122, 108, 101,  73, 
+    110, 100, 105,  99, 101, 115, 
+      0, 171,   1,   0,  19,   0, 
+      1,   0,   4,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     77, 105,  99, 114, 111, 115, 
+    111, 102, 116,  32,  40,  82, 
+     41,  32,  72,  76,  83,  76, 
+     32,  83, 104,  97, 100, 101, 
+    114,  32,  67, 111, 109, 112, 
+    105, 108, 101, 114,  32,  54, 
+     46,  51,  46,  57,  54,  48, 
+     48,  46,  49,  54,  51,  56, 
+     52,   0, 171, 171,  73,  83, 
+     71,  78, 128,   0,   0,   0, 
+      3,   0,   0,   0,   8,   0, 
+      0,   0,  80,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   3,   0,   0,   0, 
+      0,   0,   0,   0,  15,   0, 
+      0,   0,  92,   0,   0,   0, 
+      0,   0,   0,   0,   4,   0, 
+      0,   0,   1,   0,   0,   0, 
+      1,   0,   0,   0,   1,   0, 
+      0,   0, 118,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   3,   0,   0,   0, 
+      2,   0,   0,   0,   7,   7, 
+      0,   0,  83,  86,  95,  80, 
+     79,  83,  73,  84,  73,  79, 
+     78,   0,  83,  86,  95,  82, 
+     69,  78,  68,  69,  82,  84, 
+     65,  82,  71,  69,  84,  65, 
+     82,  82,  65,  89,  73,  78, 
+     68,  69,  88,   0,  84,  69, 
+     88,  67,  79,  79,  82,  68, 
+      0, 171,  79,  83,  71,  78, 
+     44,   0,   0,   0,   1,   0, 
+      0,   0,   8,   0,   0,   0, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0,  15,   0,   0,   0, 
+     83,  86,  95,  84,  65,  82, 
+     71,  69,  84,   0, 171, 171, 
+     83,  72,  68,  82,  76,   2, 
+      0,   0,  64,   0,   0,   0, 
+    147,   0,   0,   0,  89,   0, 
+      0,   4,  70, 142,  32,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,  88,  40,   0,   4, 
+      0, 112,  16,   0,   0,   0, 
+      0,   0,  68,  68,   0,   0, 
+     98,  16,   0,   3, 114,  16, 
+     16,   0,   2,   0,   0,   0, 
+    101,   0,   0,   3, 242,  32, 
+     16,   0,   0,   0,   0,   0, 
+    104,   0,   0,   2,   1,   0, 
+      0,   0, 105,   0,   0,   4, 
+      0,   0,   0,   0,   6,   0, 
+      0,   0,   4,   0,   0,   0, 
+     61,  16,   0,   7, 242,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  70, 126,  16,   0, 
+      0,   0,   0,   0,  86,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     56,   0,   0,   7, 114,   0, 
+     16,   0,   0,   0,   0,   0, 
+     70,   2,  16,   0,   0,   0, 
+      0,   0,  70,  18,  16,   0, 
+      2,   0,   0,   0,  27,   0, 
+      0,   5, 114,   0,  16,   0, 
+      0,   0,   0,   0,  70,   2, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   5, 130,   0, 
+     16,   0,   0,   0,   0,   0, 
+      1,  64,   0,   0,   0,   0, 
+      0,   0,  45,   0,   0,   7, 
+    242,   0,  16,   0,   0,   0, 
+      0,   0,  70,  14,  16,   0, 
+      0,   0,   0,   0,  70, 126, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0,  26,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      2,   0,   0,   0,  42,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      3,   0,   0,   0,  58,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      4,   0,   0,   0,   1,  64, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,  48, 
+     32,   0,   0,   0,   0,   0, 
+      5,   0,   0,   0,   1,  64, 
+      0,   0,   1,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     10, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7,  18,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   6,  18,   0,  16,   0, 
+      0,   0,   0,   0,  26, 128, 
+     32,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,  54,   0, 
+      0,   7,  34,  32,  16,   0, 
+      0,   0,   0,   0,  10,  48, 
+     32,   4,   0,   0,   0,   0, 
+     10,   0,  16,   0,   0,   0, 
+      0,   0,  54,   0,   0,   6, 
+     18,   0,  16,   0,   0,   0, 
+      0,   0,  42, 128,  32,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  54,   0,   0,   7, 
+     66,  32,  16,   0,   0,   0, 
+      0,   0,  10,  48,  32,   4, 
+      0,   0,   0,   0,  10,   0, 
+     16,   0,   0,   0,   0,   0, 
+     54,   0,   0,   6,  18,   0, 
+     16,   0,   0,   0,   0,   0, 
+     58, 128,  32,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+     54,   0,   0,   7, 130,  32, 
+     16,   0,   0,   0,   0,   0, 
+     10,  48,  32,   4,   0,   0, 
+      0,   0,  10,   0,  16,   0, 
+      0,   0,   0,   0,  62,   0, 
+      0,   1,  83,  84,  65,  84, 
+    116,   0,   0,   0,  21,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   6,   0,   0,   0, 
+     10,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   5,   0,   0,   0, 
+      0,   0,   0,   0,   2,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11shadersgenerate_shadersbat"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/shaders/generate_shaders.bat        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,125 +1,125 @@
</span><del>-@ECHO OFF
-REM
-REM Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-REM Use of this source code is governed by a BSD-style license that can be
-REM found in the LICENSE file.
-REM
-
-PATH %PATH%;%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86;%DXSDK_DIR%\Utilities\bin\x86
-
-setlocal
-set errorCount=0
-set successCount=0
-set debug=0
-
-if &quot;%1&quot; == &quot;debug&quot; (
-    set debug=1
-)
-if &quot;%1&quot; == &quot;release&quot; (
-    set debug=0
-)
-
-:: Shaders for OpenGL ES 2.0 and OpenGL ES 3.0+
-::              | Input file          | Entry point           | Type            | Output file                        | Debug |
-call:BuildShader Passthrough2D11.hlsl VS_Passthrough2D         vs_4_0_level_9_3  compiled\passthrough2d11vs.h         %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2D     ps_4_0_level_9_3  compiled\passthroughrgba2d11ps.h     %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGB2D      ps_4_0_level_9_3  compiled\passthroughrgb2d11ps.h      %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRG2D       ps_4_0_level_9_3  compiled\passthroughrg2d11ps.h       %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughR2D        ps_4_0_level_9_3  compiled\passthroughr2d11ps.h        %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughLum2D      ps_4_0_level_9_3  compiled\passthroughlum2d11ps.h      %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughLumAlpha2D ps_4_0_level_9_3  compiled\passthroughlumalpha2d11ps.h %debug%
-
-call:BuildShader Clear11.hlsl         VS_ClearFloat            vs_4_0_level_9_3  compiled\clearfloat11vs.h            %debug%
-call:BuildShader Clear11.hlsl         PS_ClearFloat_FL9        ps_4_0_level_9_3  compiled\clearfloat11_fl9ps.h        %debug%
-call:BuildShader Clear11.hlsl         PS_ClearFloat            ps_4_0            compiled\clearfloat11ps.h            %debug%
-
-
-:: Shaders for OpenGL ES 3.0+ only
-::              | Input file          | Entry point           | Type            | Output file                        | Debug |
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughDepth2D    ps_4_0            compiled\passthroughdepth2d11ps.h    %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2DUI   ps_4_0            compiled\passthroughrgba2dui11ps.h   %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2DI    ps_4_0            compiled\passthroughrgba2di11ps.h    %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGB2DUI    ps_4_0            compiled\passthroughrgb2dui11ps.h    %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGB2DI     ps_4_0            compiled\passthroughrgb2di11ps.h     %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRG2DUI     ps_4_0            compiled\passthroughrg2dui11ps.h     %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughRG2DI      ps_4_0            compiled\passthroughrg2di11ps.h      %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughR2DUI      ps_4_0            compiled\passthroughr2dui11ps.h      %debug%
-call:BuildShader Passthrough2D11.hlsl PS_PassthroughR2DI       ps_4_0            compiled\passthroughr2di11ps.h       %debug%
-
-
-call:BuildShader Passthrough3D11.hlsl VS_Passthrough3D         vs_4_0            compiled\passthrough3d11vs.h         %debug%
-call:BuildShader Passthrough3D11.hlsl GS_Passthrough3D         gs_4_0            compiled\passthrough3d11gs.h         %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGBA3D     ps_4_0            compiled\passthroughrgba3d11ps.h     %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGBA3DUI   ps_4_0            compiled\passthroughrgba3dui11ps.h   %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGBA3DI    ps_4_0            compiled\passthroughrgba3di11ps.h    %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGB3D      ps_4_0            compiled\passthroughrgb3d11ps.h      %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGB3DUI    ps_4_0            compiled\passthroughrgb3dui11ps.h    %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGB3DI     ps_4_0            compiled\passthroughrgb3di11ps.h     %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRG3D       ps_4_0            compiled\passthroughrg3d11ps.h       %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRG3DUI     ps_4_0            compiled\passthroughrg3dui11ps.h     %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughRG3DI      ps_4_0            compiled\passthroughrg3di11ps.h      %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughR3D        ps_4_0            compiled\passthroughr3d11ps.h        %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughR3DUI      ps_4_0            compiled\passthroughr3dui11ps.h      %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughR3DI       ps_4_0            compiled\passthroughr3di11ps.h       %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughLum3D      ps_4_0            compiled\passthroughlum3d11ps.h      %debug%
-call:BuildShader Passthrough3D11.hlsl PS_PassthroughLumAlpha3D ps_4_0            compiled\passthroughlumalpha3d11ps.h %debug%
-
-call:BuildShader Swizzle11.hlsl       PS_SwizzleF2D            ps_4_0            compiled\swizzlef2dps.h              %debug%
-call:BuildShader Swizzle11.hlsl       PS_SwizzleI2D            ps_4_0            compiled\swizzlei2dps.h              %debug%
-call:BuildShader Swizzle11.hlsl       PS_SwizzleUI2D           ps_4_0            compiled\swizzleui2dps.h             %debug%
-
-call:BuildShader Swizzle11.hlsl       PS_SwizzleF3D            ps_4_0            compiled\swizzlef3dps.h              %debug%
-call:BuildShader Swizzle11.hlsl       PS_SwizzleI3D            ps_4_0            compiled\swizzlei3dps.h              %debug%
-call:BuildShader Swizzle11.hlsl       PS_SwizzleUI3D           ps_4_0            compiled\swizzleui3dps.h             %debug%
-
-call:BuildShader Swizzle11.hlsl       PS_SwizzleF2DArray       ps_4_0            compiled\swizzlef2darrayps.h         %debug%
-call:BuildShader Swizzle11.hlsl       PS_SwizzleI2DArray       ps_4_0            compiled\swizzlei2darrayps.h         %debug%
-call:BuildShader Swizzle11.hlsl       PS_SwizzleUI2DArray      ps_4_0            compiled\swizzleui2darrayps.h        %debug%
-
-call:BuildShader Clear11.hlsl         VS_ClearUint             vs_4_0            compiled\clearuint11vs.h             %debug%
-call:BuildShader Clear11.hlsl         PS_ClearUint             ps_4_0            compiled\clearuint11ps.h             %debug%
-
-call:BuildShader Clear11.hlsl         VS_ClearSint             vs_4_0            compiled\clearsint11vs.h             %debug%
-call:BuildShader Clear11.hlsl         PS_ClearSint             ps_4_0            compiled\clearsint11ps.h             %debug%
-
-call:BuildShader BufferToTexture11.hlsl  VS_BufferToTexture        vs_4_0        compiled/buffertotexture11_vs.h      %debug%
-call:BuildShader BufferToTexture11.hlsl  GS_BufferToTexture        gs_4_0        compiled/buffertotexture11_gs.h      %debug%
-call:BuildShader BufferToTexture11.hlsl  PS_BufferToTexture_4F     ps_4_0        compiled/buffertotexture11_ps_4f.h   %debug%
-call:BuildShader BufferToTexture11.hlsl  PS_BufferToTexture_4I     ps_4_0        compiled/buffertotexture11_ps_4i.h   %debug%
-call:BuildShader BufferToTexture11.hlsl  PS_BufferToTexture_4UI    ps_4_0        compiled/buffertotexture11_ps_4ui.h  %debug%
-
-echo.
-
-if %successCount% GTR 0 (
-   echo %successCount% shaders compiled successfully.
-)
-if %errorCount% GTR 0 (
-   echo There were %errorCount% shader compilation errors.
-)
-
-endlocal
-exit /b
-
-:BuildShader
-set input=%~1
-set entry=%~2
-set type=%~3
-set output=%~4
-set debug=%~5
-
-if %debug% == 0 (
-    set &quot;buildCMD=fxc /nologo /E %entry% /T %type% /Fh %output% %input%&quot;
-) else (
-    set &quot;buildCMD=fxc /nologo /Zi /Od /E %entry% /T %type% /Fh %output% %input%&quot;
-)
-
-set error=0
-%buildCMD% || set error=1
-
-if %error% == 0 (
-    set /a successCount=%successCount%+1
-) else (
-    set /a errorCount=%errorCount%+1
-)
-
-exit /b
</del><ins>+@ECHO OFF
+REM
+REM Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
+REM Use of this source code is governed by a BSD-style license that can be
+REM found in the LICENSE file.
+REM
+
+PATH %PATH%;%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86;%DXSDK_DIR%\Utilities\bin\x86
+
+setlocal
+set errorCount=0
+set successCount=0
+set debug=0
+
+if &quot;%1&quot; == &quot;debug&quot; (
+    set debug=1
+)
+if &quot;%1&quot; == &quot;release&quot; (
+    set debug=0
+)
+
+:: Shaders for OpenGL ES 2.0 and OpenGL ES 3.0+
+::              | Input file          | Entry point           | Type            | Output file                        | Debug |
+call:BuildShader Passthrough2D11.hlsl VS_Passthrough2D         vs_4_0_level_9_3  compiled\passthrough2d11vs.h         %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2D     ps_4_0_level_9_3  compiled\passthroughrgba2d11ps.h     %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGB2D      ps_4_0_level_9_3  compiled\passthroughrgb2d11ps.h      %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRG2D       ps_4_0_level_9_3  compiled\passthroughrg2d11ps.h       %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughR2D        ps_4_0_level_9_3  compiled\passthroughr2d11ps.h        %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughLum2D      ps_4_0_level_9_3  compiled\passthroughlum2d11ps.h      %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughLumAlpha2D ps_4_0_level_9_3  compiled\passthroughlumalpha2d11ps.h %debug%
+
+call:BuildShader Clear11.hlsl         VS_ClearFloat            vs_4_0_level_9_3  compiled\clearfloat11vs.h            %debug%
+call:BuildShader Clear11.hlsl         PS_ClearFloat_FL9        ps_4_0_level_9_3  compiled\clearfloat11_fl9ps.h        %debug%
+call:BuildShader Clear11.hlsl         PS_ClearFloat            ps_4_0            compiled\clearfloat11ps.h            %debug%
+
+
+:: Shaders for OpenGL ES 3.0+ only
+::              | Input file          | Entry point           | Type            | Output file                        | Debug |
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughDepth2D    ps_4_0            compiled\passthroughdepth2d11ps.h    %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2DUI   ps_4_0            compiled\passthroughrgba2dui11ps.h   %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGBA2DI    ps_4_0            compiled\passthroughrgba2di11ps.h    %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGB2DUI    ps_4_0            compiled\passthroughrgb2dui11ps.h    %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRGB2DI     ps_4_0            compiled\passthroughrgb2di11ps.h     %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRG2DUI     ps_4_0            compiled\passthroughrg2dui11ps.h     %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughRG2DI      ps_4_0            compiled\passthroughrg2di11ps.h      %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughR2DUI      ps_4_0            compiled\passthroughr2dui11ps.h      %debug%
+call:BuildShader Passthrough2D11.hlsl PS_PassthroughR2DI       ps_4_0            compiled\passthroughr2di11ps.h       %debug%
+
+
+call:BuildShader Passthrough3D11.hlsl VS_Passthrough3D         vs_4_0            compiled\passthrough3d11vs.h         %debug%
+call:BuildShader Passthrough3D11.hlsl GS_Passthrough3D         gs_4_0            compiled\passthrough3d11gs.h         %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGBA3D     ps_4_0            compiled\passthroughrgba3d11ps.h     %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGBA3DUI   ps_4_0            compiled\passthroughrgba3dui11ps.h   %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGBA3DI    ps_4_0            compiled\passthroughrgba3di11ps.h    %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGB3D      ps_4_0            compiled\passthroughrgb3d11ps.h      %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGB3DUI    ps_4_0            compiled\passthroughrgb3dui11ps.h    %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRGB3DI     ps_4_0            compiled\passthroughrgb3di11ps.h     %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRG3D       ps_4_0            compiled\passthroughrg3d11ps.h       %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRG3DUI     ps_4_0            compiled\passthroughrg3dui11ps.h     %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughRG3DI      ps_4_0            compiled\passthroughrg3di11ps.h      %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughR3D        ps_4_0            compiled\passthroughr3d11ps.h        %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughR3DUI      ps_4_0            compiled\passthroughr3dui11ps.h      %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughR3DI       ps_4_0            compiled\passthroughr3di11ps.h       %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughLum3D      ps_4_0            compiled\passthroughlum3d11ps.h      %debug%
+call:BuildShader Passthrough3D11.hlsl PS_PassthroughLumAlpha3D ps_4_0            compiled\passthroughlumalpha3d11ps.h %debug%
+
+call:BuildShader Swizzle11.hlsl       PS_SwizzleF2D            ps_4_0            compiled\swizzlef2dps.h              %debug%
+call:BuildShader Swizzle11.hlsl       PS_SwizzleI2D            ps_4_0            compiled\swizzlei2dps.h              %debug%
+call:BuildShader Swizzle11.hlsl       PS_SwizzleUI2D           ps_4_0            compiled\swizzleui2dps.h             %debug%
+
+call:BuildShader Swizzle11.hlsl       PS_SwizzleF3D            ps_4_0            compiled\swizzlef3dps.h              %debug%
+call:BuildShader Swizzle11.hlsl       PS_SwizzleI3D            ps_4_0            compiled\swizzlei3dps.h              %debug%
+call:BuildShader Swizzle11.hlsl       PS_SwizzleUI3D           ps_4_0            compiled\swizzleui3dps.h             %debug%
+
+call:BuildShader Swizzle11.hlsl       PS_SwizzleF2DArray       ps_4_0            compiled\swizzlef2darrayps.h         %debug%
+call:BuildShader Swizzle11.hlsl       PS_SwizzleI2DArray       ps_4_0            compiled\swizzlei2darrayps.h         %debug%
+call:BuildShader Swizzle11.hlsl       PS_SwizzleUI2DArray      ps_4_0            compiled\swizzleui2darrayps.h        %debug%
+
+call:BuildShader Clear11.hlsl         VS_ClearUint             vs_4_0            compiled\clearuint11vs.h             %debug%
+call:BuildShader Clear11.hlsl         PS_ClearUint             ps_4_0            compiled\clearuint11ps.h             %debug%
+
+call:BuildShader Clear11.hlsl         VS_ClearSint             vs_4_0            compiled\clearsint11vs.h             %debug%
+call:BuildShader Clear11.hlsl         PS_ClearSint             ps_4_0            compiled\clearsint11ps.h             %debug%
+
+call:BuildShader BufferToTexture11.hlsl  VS_BufferToTexture        vs_4_0        compiled/buffertotexture11_vs.h      %debug%
+call:BuildShader BufferToTexture11.hlsl  GS_BufferToTexture        gs_4_0        compiled/buffertotexture11_gs.h      %debug%
+call:BuildShader BufferToTexture11.hlsl  PS_BufferToTexture_4F     ps_4_0        compiled/buffertotexture11_ps_4f.h   %debug%
+call:BuildShader BufferToTexture11.hlsl  PS_BufferToTexture_4I     ps_4_0        compiled/buffertotexture11_ps_4i.h   %debug%
+call:BuildShader BufferToTexture11.hlsl  PS_BufferToTexture_4UI    ps_4_0        compiled/buffertotexture11_ps_4ui.h  %debug%
+
+echo.
+
+if %successCount% GTR 0 (
+   echo %successCount% shaders compiled successfully.
+)
+if %errorCount% GTR 0 (
+   echo There were %errorCount% shader compilation errors.
+)
+
+endlocal
+exit /b
+
+:BuildShader
+set input=%~1
+set entry=%~2
+set type=%~3
+set output=%~4
+set debug=%~5
+
+if %debug% == 0 (
+    set &quot;buildCMD=fxc /nologo /E %entry% /T %type% /Fh %output% %input%&quot;
+) else (
+    set &quot;buildCMD=fxc /nologo /Zi /Od /E %entry% /T %type% /Fh %output% %input%&quot;
+)
+
+set error=0
+%buildCMD% || set error=1
+
+if %error% == 0 (
+    set /a successCount=%successCount%+1
+) else (
+    set /a errorCount=%errorCount%+1
+)
+
+exit /b
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11texture_format_datajson"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,502 @@
</span><ins>+{
+  &quot;ANGLE_FORMAT_NONE&quot;: {
+
+  },
+  &quot;ANGLE_FORMAT_A8_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_A8_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_A8_UNORM&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_A8_UNORM&quot;,
+    &quot;channels&quot;: &quot;a&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;alpha&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_ALPHA8_EXT&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8, &quot;blue&quot;: 8, &quot;alpha&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA8&quot;
+  },
+  &quot;ANGLE_FORMAT_R16G16B16A16_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_UNORM&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_UNORM&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 16, &quot;green&quot;: 16, &quot;blue&quot;: 16, &quot;alpha&quot;: 16 }
+  },
+  &quot;ANGLE_FORMAT_R16G16B16A16_FLOAT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_FLOAT&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;float&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 16, &quot;green&quot;: 16, &quot;blue&quot;: 16, &quot;alpha&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA16F&quot;
+  },
+  &quot;ANGLE_FORMAT_R32G32B32A32_FLOAT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_FLOAT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_FLOAT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_FLOAT&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;float&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 32, &quot;green&quot;: 32, &quot;blue&quot;: 32, &quot;alpha&quot;: 32 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA32F&quot;
+  },
+  &quot;ANGLE_FORMAT_B8G8R8A8_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_B8G8R8A8_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_B8G8R8A8_UNORM&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_B8G8R8A8_UNORM&quot;,
+    &quot;channels&quot;: &quot;bgra&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8, &quot;blue&quot;: 8, &quot;alpha&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_BGRA8_EXT&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8, &quot;blue&quot;: 8, &quot;alpha&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA8&quot;
+  },
+  &quot;ANGLE_FORMAT_BC1_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_BC1_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_BC1_UNORM&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;swizzleFormat&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;glInternalFormat&quot;: &quot;GL_COMPRESSED_RGBA_S3TC_DXT1_EXT&quot;
+  },
+  &quot;ANGLE_FORMAT_BC2_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_BC2_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_BC2_UNORM&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;swizzleFormat&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;glInternalFormat&quot;: &quot;GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE&quot;
+  },
+  &quot;ANGLE_FORMAT_BC3_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_BC3_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_BC3_UNORM&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;swizzleFormat&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;glInternalFormat&quot;: &quot;GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE&quot;
+  },
+  &quot;ANGLE_FORMAT_R8_SNORM_NONRENDERABLE&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8_SNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8_SNORM&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;snorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_R8_SNORM&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8_SNORM_NONRENDERABLE&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8_SNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8_SNORM&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;snorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG8_SNORM&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8, &quot;blue&quot;: 8, &quot;alpha&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_SRGB8_ALPHA8&quot;
+  },
+  &quot;ANGLE_FORMAT_D24_UNORM_S8_UINT_FL10&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R24G8_TYPELESS&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R24_UNORM_X8_TYPELESS&quot;,
+    &quot;dsvFormat&quot;: &quot;DXGI_FORMAT_D24_UNORM_S8_UINT&quot;,
+    &quot;channels&quot;: &quot;ds&quot;,
+    &quot;bits&quot;: { &quot;depth&quot;: 24, &quot;stencil&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_DEPTH24_STENCIL8_OES&quot;
+  },
+  &quot;ANGLE_FORMAT_D24_UNORM_S8_UINT_FL9_3&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_D24_UNORM_S8_UINT&quot;,
+    &quot;dsvFormat&quot;: &quot;DXGI_FORMAT_D24_UNORM_S8_UINT&quot;,
+    &quot;channels&quot;: &quot;ds&quot;,
+    &quot;bits&quot;: { &quot;depth&quot;: 24, &quot;stencil&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_DEPTH24_STENCIL8_OES&quot;
+  },
+  &quot;ANGLE_FORMAT_D32_FLOAT_S8X24_UINT_FL10&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32G8X24_TYPELESS&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS&quot;,
+    &quot;dsvFormat&quot;: &quot;DXGI_FORMAT_D32_FLOAT_S8X24_UINT&quot;,
+    &quot;channels&quot;: &quot;ds&quot;,
+    &quot;bits&quot;: { &quot;depth&quot;: 32, &quot;stencil&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_DEPTH32F_STENCIL8&quot;
+  },
+  &quot;ANGLE_FORMAT_D16_UNORM_FL10&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16_TYPELESS&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16_UNORM&quot;,
+    &quot;dsvFormat&quot;: &quot;DXGI_FORMAT_D16_UNORM&quot;,
+    &quot;channels&quot;: &quot;d&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;depth&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_DEPTH_COMPONENT16&quot;
+  },
+  &quot;ANGLE_FORMAT_D16_UNORM_FL9_3&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_D16_UNORM&quot;,
+    &quot;dsvFormat&quot;: &quot;DXGI_FORMAT_D16_UNORM&quot;,
+    &quot;channels&quot;: &quot;d&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;depth&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_DEPTH_COMPONENT16&quot;
+  },
+  &quot;ANGLE_FORMAT_D32_FLOAT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32_TYPELESS&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32_FLOAT&quot;,
+    &quot;dsvFormat&quot;: &quot;DXGI_FORMAT_D32_FLOAT&quot;,
+    &quot;channels&quot;: &quot;d&quot;,
+    &quot;componentType&quot;: &quot;float&quot;,
+    &quot;bits&quot;: { &quot;depth&quot;: 32 },
+    &quot;glInternalFormat&quot;: &quot;GL_DEPTH_COMPONENT32F&quot;
+  },
+  &quot;ANGLE_FORMAT_R11G11B10_FLOAT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R11G11B10_FLOAT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R11G11B10_FLOAT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R11G11B10_FLOAT&quot;,
+    &quot;channels&quot;: &quot;rgb&quot;,
+    &quot;componentType&quot;:  &quot;float&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 11, &quot;green&quot;: 11, &quot;blue&quot;: 10 },
+    &quot;glInternalFormat&quot;: &quot;GL_R11F_G11F_B10F&quot;
+  },
+  &quot;ANGLE_FORMAT_R16_FLOAT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16_FLOAT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16_FLOAT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R16_FLOAT&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;float&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_R16F&quot;
+  },
+  &quot;ANGLE_FORMAT_R16_SINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16_SINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16_SINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R16_SINT&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;int&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_R16I&quot;
+  },
+  &quot;ANGLE_FORMAT_R16_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16_UINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16_UINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R16_UINT&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;uint&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_R16UI&quot;
+  },
+  &quot;ANGLE_FORMAT_R32_FLOAT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32_FLOAT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32_FLOAT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R32_FLOAT&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;float&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 32 },
+    &quot;glInternalFormat&quot;: &quot;GL_R32F&quot;
+  },
+  &quot;ANGLE_FORMAT_R32_SINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32_SINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32_SINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R32_SINT&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;int&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 32 },
+    &quot;glInternalFormat&quot;: &quot;GL_R32I&quot;
+  },
+  &quot;ANGLE_FORMAT_R32_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32_UINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32_UINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R32_UINT&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;uint&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 32 },
+    &quot;glInternalFormat&quot;: &quot;GL_R32UI&quot;
+  },
+  &quot;ANGLE_FORMAT_R8_UNORM_NONRENDERABLE&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8_UNORM&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_R8&quot;
+  },
+  &quot;ANGLE_FORMAT_R8_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8_UNORM&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R8_UNORM&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_R8&quot;
+  },
+  &quot;ANGLE_FORMAT_R8_SINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8_SINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8_SINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R8_SINT&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;int&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_R8I&quot;
+  },
+  &quot;ANGLE_FORMAT_R8_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8_UINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8_UINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R8_UINT&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;uint&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_R8UI&quot;
+  },
+  &quot;ANGLE_FORMAT_R8_SNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8_SNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8_SNORM&quot;,
+    &quot;channels&quot;: &quot;r&quot;,
+    &quot;componentType&quot;: &quot;snorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_R8_SNORM&quot;
+  },
+  &quot;ANGLE_FORMAT_R16G16_FLOAT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16G16_FLOAT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16G16_FLOAT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R16G16_FLOAT&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;float&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 16, &quot;green&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG16F&quot;
+  },
+  &quot;ANGLE_FORMAT_R16G16_SINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16G16_SINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16G16_SINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R16G16_SINT&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;int&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 16, &quot;green&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG16I&quot;
+  },
+  &quot;ANGLE_FORMAT_R16G16_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16G16_UINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16G16_UINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R16G16_UINT&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;uint&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 16, &quot;green&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG16UI&quot;
+  },
+  &quot;ANGLE_FORMAT_R32G32_FLOAT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32G32_FLOAT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32G32_FLOAT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R32G32_FLOAT&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;float&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 32, &quot;green&quot;: 32 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG32F&quot;
+  },
+  &quot;ANGLE_FORMAT_R32G32_SINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32G32_SINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32G32_SINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R32G32_SINT&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;int&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 32, &quot;green&quot;: 32 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG32I&quot;
+  },
+  &quot;ANGLE_FORMAT_R32G32_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32G32_UINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32G32_UINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R32G32_UINT&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;uint&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 32, &quot;green&quot;: 32 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG32UI&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8_UNORM&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R8G8_UNORM&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG8&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8_UNORM_NONRENDERABLE&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8_UNORM&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG8&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8_SINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8_SINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8_SINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R8G8_SINT&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;int&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG8I&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8_UINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8_UINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R8G8_UINT&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;uint&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG8UI&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8_SNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8_SNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8_SNORM&quot;,
+    &quot;channels&quot;: &quot;rg&quot;,
+    &quot;componentType&quot;: &quot;snorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RG8_SNORM&quot;
+  },
+  &quot;ANGLE_FORMAT_R10G10B10A2_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R10G10B10A2_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R10G10B10A2_UNORM&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R10G10B10A2_UNORM&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 10, &quot;green&quot;: 10, &quot;blue&quot;: 10, &quot;alpha&quot;: 2 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGB10_A2&quot;
+  },
+  &quot;ANGLE_FORMAT_R10G10B10A2_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R10G10B10A2_UINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R10G10B10A2_UINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R10G10B10A2_UINT&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;uint&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 10, &quot;green&quot;: 10, &quot;blue&quot;: 10, &quot;alpha&quot;: 2 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGB10_A2UI&quot;
+  },
+  &quot;ANGLE_FORMAT_R16G16B16A16_SINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_SINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_SINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_SINT&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;int&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 16, &quot;green&quot;: 16, &quot;blue&quot;: 16, &quot;alpha&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA16I&quot;
+  },
+  &quot;ANGLE_FORMAT_R16G16B16A16_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_UINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_UINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R16G16B16A16_UINT&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;uint&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 16, &quot;green&quot;: 16, &quot;blue&quot;: 16, &quot;alpha&quot;: 16 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA16UI&quot;
+  },
+  &quot;ANGLE_FORMAT_R32G32B32A32_SINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_SINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_SINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_SINT&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;int&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 32, &quot;green&quot;: 32, &quot;blue&quot;: 32, &quot;alpha&quot;: 32 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA32I&quot;
+  },
+  &quot;ANGLE_FORMAT_R32G32B32A32_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_UINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_UINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R32G32B32A32_UINT&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;uint&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 32, &quot;green&quot;: 32, &quot;blue&quot;: 32, &quot;alpha&quot;: 32 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA32UI&quot;
+  },
+  &quot;ANGLE_FORMAT_B5G6R5_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_B5G6R5_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_B5G6R5_UNORM&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_B5G6R5_UNORM&quot;,
+    &quot;channels&quot;: &quot;bgr&quot;,
+    &quot;componentType&quot;:  &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 5, &quot;green&quot;: 6, &quot;blue&quot;: 5 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGB565&quot;,
+    &quot;channelStruct&quot;: &quot;R5G6B5&quot;
+  },
+  &quot;ANGLE_FORMAT_B5G5R5A1_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_B5G5R5A1_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_B5G5R5A1_UNORM&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_B5G5R5A1_UNORM&quot;,
+    &quot;channels&quot;: &quot;bgra&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 5, &quot;green&quot;: 5, &quot;blue&quot;: 5, &quot;alpha&quot;: 1 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGB5_A1&quot;,
+    &quot;channelStruct&quot;: &quot;A1R5G5B5&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8B8A8_SINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_SINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_SINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_SINT&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;int&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8, &quot;blue&quot;: 8, &quot;alpha&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA8I&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8B8A8_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UINT&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UINT&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UINT&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;uint&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8, &quot;blue&quot;: 8, &quot;alpha&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA8UI&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8B8A8_SNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_SNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_SNORM&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;snorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8, &quot;blue&quot;: 8, &quot;alpha&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA8_SNORM&quot;
+  },
+  &quot;ANGLE_FORMAT_R9G9B9E5_SHAREDEXP&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R9G9B9E5_SHAREDEXP&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R9G9B9E5_SHAREDEXP&quot;,
+    &quot;channels&quot;: &quot;rgb&quot;,
+    &quot;componentType&quot;:  &quot;float&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 9, &quot;green&quot;: 9, &quot;blue&quot;: 9, &quot;shared&quot;: 5 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGB9_E5&quot;,
+    &quot;channelStruct&quot;:  &quot;R9G9B9E5&quot;
+  },
+  &quot;ANGLE_FORMAT_B4G4R4A4_UNORM&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_B4G4R4A4_UNORM&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_B4G4R4A4_UNORM&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_B4G4R4A4_UNORM&quot;,
+    &quot;channels&quot;: &quot;bgra&quot;,
+    &quot;componentType&quot;:  &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 4, &quot;green&quot;: 4, &quot;blue&quot;: 4, &quot;alpha&quot;: 4 },
+    &quot;glInternalFormat&quot;: &quot;GL_RGBA4&quot;,
+    &quot;channelStruct&quot;:  &quot;A4R4G4B4&quot;
+  },
+  &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+    &quot;rtvFormat&quot;: &quot;DXGI_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+    &quot;channels&quot;: &quot;rgba&quot;,
+    &quot;componentType&quot;: &quot;unorm&quot;,
+    &quot;bits&quot;: { &quot;red&quot;: 8, &quot;green&quot;: 8, &quot;blue&quot;: 8, &quot;alpha&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_SRGB8_ALPHA8&quot;
+  },
+  &quot;ANGLE_FORMAT_X24_TYPELESS_G8_UINT&quot;: {
+    &quot;texFormat&quot;: &quot;DXGI_FORMAT_R24G8_TYPELESS&quot;,
+    &quot;srvFormat&quot;: &quot;DXGI_FORMAT_X24_TYPELESS_G8_UINT&quot;,
+    &quot;dsvFormat&quot;: &quot;DXGI_FORMAT_D24_UNORM_S8_UINT&quot;,
+    &quot;channels&quot;: &quot;ds&quot;,
+    &quot;bits&quot;: { &quot;depth&quot;: 24, &quot;stencil&quot;: 8 },
+    &quot;glInternalFormat&quot;: &quot;GL_DEPTH24_STENCIL8_OES&quot;
+  }
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11texture_format_mapjson"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_map.json        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,148 @@
</span><ins>+{
+  &quot;GL_ALPHA&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_A8_UNORM&quot;,
+    &quot;OnlyFL9_3&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;
+  },
+  &quot;GL_ALPHA16F_EXT&quot;: &quot;ANGLE_FORMAT_R16G16B16A16_FLOAT&quot;,
+  &quot;GL_ALPHA32F_EXT&quot;: &quot;ANGLE_FORMAT_R32G32B32A32_FLOAT&quot;,
+  &quot;GL_ALPHA8_EXT&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_A8_UNORM&quot;,
+    &quot;OnlyFL9_3&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;
+  },
+  &quot;GL_BGR5_A1_ANGLEX&quot;: &quot;ANGLE_FORMAT_B8G8R8A8_UNORM&quot;,
+  &quot;GL_BGRA4_ANGLEX&quot;: &quot;ANGLE_FORMAT_B8G8R8A8_UNORM&quot;,
+  &quot;GL_BGRA8_EXT&quot;: &quot;ANGLE_FORMAT_B8G8R8A8_UNORM&quot;,
+  &quot;GL_BGRA_EXT&quot;: &quot;ANGLE_FORMAT_B8G8R8A8_UNORM&quot;,
+  &quot;GL_COMPRESSED_R11_EAC&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_R8_UNORM_NONRENDERABLE&quot;
+  },
+  &quot;GL_COMPRESSED_RG11_EAC&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_R8G8_UNORM_NONRENDERABLE&quot;
+  },
+  &quot;GL_COMPRESSED_RGB8_ETC2&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE&quot;
+  },
+  &quot;GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE&quot;
+  },
+  &quot;GL_COMPRESSED_RGBA8_ETC2_EAC&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE&quot;
+  },
+  &quot;GL_COMPRESSED_RGBA_S3TC_DXT1_EXT&quot;: &quot;ANGLE_FORMAT_BC1_UNORM&quot;,
+  &quot;GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE&quot;: &quot;ANGLE_FORMAT_BC2_UNORM&quot;,
+  &quot;GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE&quot;: &quot;ANGLE_FORMAT_BC3_UNORM&quot;,
+  &quot;GL_COMPRESSED_RGB_S3TC_DXT1_EXT&quot;: &quot;ANGLE_FORMAT_BC1_UNORM&quot;,
+  &quot;GL_COMPRESSED_SIGNED_R11_EAC&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_R8_SNORM_NONRENDERABLE&quot;
+  },
+  &quot;GL_COMPRESSED_SIGNED_RG11_EAC&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_R8G8_SNORM_NONRENDERABLE&quot;
+  },
+  &quot;GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE&quot;
+  },
+  &quot;GL_COMPRESSED_SRGB8_ETC2&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE&quot;
+  },
+  &quot;GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE&quot;
+  },
+  &quot;GL_DEPTH24_STENCIL8&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_D24_UNORM_S8_UINT_FL10&quot;,
+    &quot;OnlyFL9_3&quot;: &quot;ANGLE_FORMAT_D24_UNORM_S8_UINT_FL9_3&quot;
+  },
+  &quot;GL_DEPTH32F_STENCIL8&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_D32_FLOAT_S8X24_UINT_FL10&quot;,
+    &quot;OnlyFL9_3&quot;: &quot;ANGLE_FORMAT_NONE&quot;
+  },
+  &quot;GL_DEPTH_COMPONENT16&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_D16_UNORM_FL10&quot;,
+    &quot;OnlyFL9_3&quot;: &quot;ANGLE_FORMAT_D16_UNORM_FL9_3&quot;
+  },
+  &quot;GL_DEPTH_COMPONENT24&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_D24_UNORM_S8_UINT_FL10&quot;,
+    &quot;OnlyFL9_3&quot;: &quot;ANGLE_FORMAT_D24_UNORM_S8_UINT_FL9_3&quot;
+  },
+  &quot;GL_DEPTH_COMPONENT32F&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_D32_FLOAT&quot;,
+    &quot;OnlyFL9_3&quot;: &quot;ANGLE_FORMAT_NONE&quot;
+  },
+  &quot;GL_DEPTH_COMPONENT32_OES&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_D24_UNORM_S8_UINT_FL10&quot;
+  },
+  &quot;GL_ETC1_RGB8_OES&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE&quot;,
+  &quot;GL_ETC1_RGB8_LOSSY_DECODE_ANGLE&quot;: &quot;ANGLE_FORMAT_BC1_UNORM&quot;,
+  &quot;GL_LUMINANCE&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+  &quot;GL_LUMINANCE16F_EXT&quot;: &quot;ANGLE_FORMAT_R16G16B16A16_FLOAT&quot;,
+  &quot;GL_LUMINANCE32F_EXT&quot;: &quot;ANGLE_FORMAT_R32G32B32A32_FLOAT&quot;,
+  &quot;GL_LUMINANCE8_ALPHA8_EXT&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+  &quot;GL_LUMINANCE8_EXT&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+  &quot;GL_LUMINANCE_ALPHA&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+  &quot;GL_LUMINANCE_ALPHA16F_EXT&quot;: &quot;ANGLE_FORMAT_R16G16B16A16_FLOAT&quot;,
+  &quot;GL_LUMINANCE_ALPHA32F_EXT&quot;: &quot;ANGLE_FORMAT_R32G32B32A32_FLOAT&quot;,
+  &quot;GL_NONE&quot;: &quot;ANGLE_FORMAT_NONE&quot;,
+  &quot;GL_R11F_G11F_B10F&quot;: &quot;ANGLE_FORMAT_R11G11B10_FLOAT&quot;,
+  &quot;GL_R16F&quot;: &quot;ANGLE_FORMAT_R16_FLOAT&quot;,
+  &quot;GL_R16I&quot;: &quot;ANGLE_FORMAT_R16_SINT&quot;,
+  &quot;GL_R16UI&quot;: &quot;ANGLE_FORMAT_R16_UINT&quot;,
+  &quot;GL_R32F&quot;: &quot;ANGLE_FORMAT_R32_FLOAT&quot;,
+  &quot;GL_R32I&quot;: &quot;ANGLE_FORMAT_R32_SINT&quot;,
+  &quot;GL_R32UI&quot;: &quot;ANGLE_FORMAT_R32_UINT&quot;,
+  &quot;GL_R8&quot;: &quot;ANGLE_FORMAT_R8_UNORM&quot;,
+  &quot;GL_R8I&quot;: &quot;ANGLE_FORMAT_R8_SINT&quot;,
+  &quot;GL_R8UI&quot;: &quot;ANGLE_FORMAT_R8_UINT&quot;,
+  &quot;GL_R8_SNORM&quot;: &quot;ANGLE_FORMAT_R8_SNORM&quot;,
+  &quot;GL_RG16F&quot;: &quot;ANGLE_FORMAT_R16G16_FLOAT&quot;,
+  &quot;GL_RG16I&quot;: &quot;ANGLE_FORMAT_R16G16_SINT&quot;,
+  &quot;GL_RG16UI&quot;: &quot;ANGLE_FORMAT_R16G16_UINT&quot;,
+  &quot;GL_RG32F&quot;: &quot;ANGLE_FORMAT_R32G32_FLOAT&quot;,
+  &quot;GL_RG32I&quot;: &quot;ANGLE_FORMAT_R32G32_SINT&quot;,
+  &quot;GL_RG32UI&quot;: &quot;ANGLE_FORMAT_R32G32_UINT&quot;,
+  &quot;GL_RG8&quot;: &quot;ANGLE_FORMAT_R8G8_UNORM&quot;,
+  &quot;GL_RG8I&quot;: &quot;ANGLE_FORMAT_R8G8_SINT&quot;,
+  &quot;GL_RG8UI&quot;: &quot;ANGLE_FORMAT_R8G8_UINT&quot;,
+  &quot;GL_RG8_SNORM&quot;: &quot;ANGLE_FORMAT_R8G8_SNORM&quot;,
+  &quot;GL_RGB&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+  &quot;GL_RGB10_A2&quot;: &quot;ANGLE_FORMAT_R10G10B10A2_UNORM&quot;,
+  &quot;GL_RGB10_A2UI&quot;: &quot;ANGLE_FORMAT_R10G10B10A2_UINT&quot;,
+  &quot;GL_RGB16F&quot;: &quot;ANGLE_FORMAT_R16G16B16A16_FLOAT&quot;,
+  &quot;GL_RGB16I&quot;: &quot;ANGLE_FORMAT_R16G16B16A16_SINT&quot;,
+  &quot;GL_RGB16UI&quot;: &quot;ANGLE_FORMAT_R16G16B16A16_UINT&quot;,
+  &quot;GL_RGB32F&quot;: &quot;ANGLE_FORMAT_R32G32B32A32_FLOAT&quot;,
+  &quot;GL_RGB32I&quot;: &quot;ANGLE_FORMAT_R32G32B32A32_SINT&quot;,
+  &quot;GL_RGB32UI&quot;: &quot;ANGLE_FORMAT_R32G32B32A32_UINT&quot;,
+  &quot;GL_RGB565&quot;: {
+    &quot;SupportsFormat&lt;DXGI_FORMAT_B5G6R5_UNORM,false&gt;&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;SupportsFormat&lt;DXGI_FORMAT_B5G6R5_UNORM,true&gt;&quot;: &quot;ANGLE_FORMAT_B5G6R5_UNORM&quot;
+  },
+  &quot;GL_RGB5_A1&quot;: {
+    &quot;SupportsFormat&lt;DXGI_FORMAT_B5G5R5A1_UNORM,false&gt;&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;SupportsFormat&lt;DXGI_FORMAT_B5G5R5A1_UNORM,true&gt;&quot;: &quot;ANGLE_FORMAT_B5G5R5A1_UNORM&quot;
+  },
+  &quot;GL_RGB8&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+  &quot;GL_RGB8I&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_SINT&quot;,
+  &quot;GL_RGB8UI&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UINT&quot;,
+  &quot;GL_RGB8_SNORM&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_SNORM&quot;,
+  &quot;GL_RGB9_E5&quot;: &quot;ANGLE_FORMAT_R9G9B9E5_SHAREDEXP&quot;,
+  &quot;GL_RGBA&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+  &quot;GL_RGBA16F&quot;: &quot;ANGLE_FORMAT_R16G16B16A16_FLOAT&quot;,
+  &quot;GL_RGBA16I&quot;: &quot;ANGLE_FORMAT_R16G16B16A16_SINT&quot;,
+  &quot;GL_RGBA16UI&quot;: &quot;ANGLE_FORMAT_R16G16B16A16_UINT&quot;,
+  &quot;GL_RGBA32F&quot;: &quot;ANGLE_FORMAT_R32G32B32A32_FLOAT&quot;,
+  &quot;GL_RGBA32I&quot;: &quot;ANGLE_FORMAT_R32G32B32A32_SINT&quot;,
+  &quot;GL_RGBA32UI&quot;: &quot;ANGLE_FORMAT_R32G32B32A32_UINT&quot;,
+  &quot;GL_RGBA4&quot;: {
+    &quot;SupportsFormat&lt;DXGI_FORMAT_B4G4R4A4_UNORM,false&gt;&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+    &quot;SupportsFormat&lt;DXGI_FORMAT_B4G4R4A4_UNORM,true&gt;&quot;: &quot;ANGLE_FORMAT_B4G4R4A4_UNORM&quot;
+  },
+  &quot;GL_RGBA8&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM&quot;,
+  &quot;GL_RGBA8I&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_SINT&quot;,
+  &quot;GL_RGBA8UI&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UINT&quot;,
+  &quot;GL_RGBA8_SNORM&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_SNORM&quot;,
+  &quot;GL_SRGB8&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE&quot;,
+  &quot;GL_SRGB8_ALPHA8&quot;: &quot;ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB&quot;,
+  &quot;GL_STENCIL_INDEX8&quot;: {
+    &quot;OnlyFL10Plus&quot;: &quot;ANGLE_FORMAT_X24_TYPELESS_G8_UINT&quot;,
+    &quot;OnlyFL9_3&quot;: &quot;ANGLE_FORMAT_D24_UNORM_S8_UINT_FL9_3&quot;
+  }
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11texture_format_tableh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,99 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// texture_format_table:
+//   Queries for full textureFormat information based on internalFormat
+//
+
+#ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTUREFORMATTABLE_H_
+#define LIBANGLE_RENDERER_D3D_D3D11_TEXTUREFORMATTABLE_H_
+
+#include &lt;map&gt;
+
+#include &quot;common/angleutils.h&quot;
+#include &quot;common/platform.h&quot;
+#include &quot;libANGLE/renderer/d3d/formatutilsD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.h&quot;
+
+namespace rx
+{
+
+struct Renderer11DeviceCaps;
+
+namespace d3d11
+{
+
+struct LoadImageFunctionInfo
+{
+    LoadImageFunctionInfo() : loadFunction(nullptr), requiresConversion(false) {}
+    LoadImageFunctionInfo(LoadImageFunction loadFunction, bool requiresConversion)
+        : loadFunction(loadFunction), requiresConversion(requiresConversion)
+    {
+    }
+
+    LoadImageFunction loadFunction;
+    bool requiresConversion;
+};
+
+struct ANGLEFormatSet
+{
+    ANGLEFormatSet();
+    ANGLEFormatSet(ANGLEFormat format,
+                   GLenum glInternalFormat,
+                   DXGI_FORMAT texFormat,
+                   DXGI_FORMAT srvFormat,
+                   DXGI_FORMAT rtvFormat,
+                   DXGI_FORMAT dsvFormat,
+                   DXGI_FORMAT blitSRVFormat,
+                   ANGLEFormat swizzleFormat,
+                   MipGenerationFunction mipGenerationFunction,
+                   ColorReadFunction colorReadFunction);
+    ANGLEFormatSet(const ANGLEFormatSet &amp;) = default;
+    ANGLEFormatSet &amp;operator=(const ANGLEFormatSet &amp;) = default;
+
+    ANGLEFormat format;
+
+    // The closest matching GL internal format for the DXGI formats this format uses. Note that this
+    // may be a different internal format than the one this ANGLE format is used for.
+    GLenum glInternalFormat;
+
+    DXGI_FORMAT texFormat;
+    DXGI_FORMAT srvFormat;
+    DXGI_FORMAT rtvFormat;
+    DXGI_FORMAT dsvFormat;
+
+    DXGI_FORMAT blitSRVFormat;
+
+    ANGLEFormat swizzleFormat;
+
+    MipGenerationFunction mipGenerationFunction;
+    ColorReadFunction colorReadFunction;
+};
+
+struct TextureFormat : public angle::NonCopyable
+{
+    TextureFormat(GLenum internalFormat,
+                  const ANGLEFormat angleFormat,
+                  InitializeTextureDataFunction internalFormatInitializer);
+
+    const ANGLEFormatSet *formatSet;
+    const ANGLEFormatSet *swizzleFormatSet;
+
+    InitializeTextureDataFunction dataInitializerFunction;
+    typedef std::map&lt;GLenum, LoadImageFunctionInfo&gt; LoadFunctionMap;
+
+    LoadFunctionMap loadFunctions;
+};
+
+const ANGLEFormatSet &amp;GetANGLEFormatSet(ANGLEFormat angleFormat);
+
+const TextureFormat &amp;GetTextureFormatInfo(GLenum internalformat,
+                                          const Renderer11DeviceCaps &amp;renderer11DeviceCaps);
+
+}  // namespace d3d11
+
+}  // namespace rx
+
+#endif  // LIBANGLE_RENDERER_D3D_D3D11_TEXTUREFORMATTABLE_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11texture_format_table_autogencpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,1871 @@
</span><ins>+// GENERATED FILE - DO NOT EDIT.
+// Generated by gen_texture_format_table.py using data from texture_format_data.json
+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// texture_format_table:
+//   Queries for full textureFormat information based in internalFormat
+//
+
+#include &quot;libANGLE/renderer/d3d/d3d11/texture_format_table.h&quot;
+
+#include &quot;libANGLE/renderer/d3d/d3d11/formatutils11.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/load_functions_table.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
+#include &quot;libANGLE/renderer/d3d/copyimage.h&quot;
+#include &quot;libANGLE/renderer/d3d/generatemip.h&quot;
+#include &quot;libANGLE/renderer/d3d/loadimage.h&quot;
+
+namespace rx
+{
+
+namespace d3d11
+{
+
+namespace
+{
+
+typedef bool (*FormatSupportFunction)(const Renderer11DeviceCaps &amp;);
+
+bool OnlyFL10Plus(const Renderer11DeviceCaps &amp;deviceCaps)
+{
+    return (deviceCaps.featureLevel &gt;= D3D_FEATURE_LEVEL_10_0);
+}
+
+bool OnlyFL9_3(const Renderer11DeviceCaps &amp;deviceCaps)
+{
+    return (deviceCaps.featureLevel == D3D_FEATURE_LEVEL_9_3);
+}
+
+template &lt;DXGI_FORMAT format, bool requireSupport&gt;
+bool SupportsFormat(const Renderer11DeviceCaps &amp;deviceCaps)
+{
+    // Must support texture, SRV and RTV support
+    UINT mustSupport = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURECUBE |
+                       D3D11_FORMAT_SUPPORT_SHADER_SAMPLE | D3D11_FORMAT_SUPPORT_MIP |
+                       D3D11_FORMAT_SUPPORT_RENDER_TARGET;
+
+    if (d3d11_gl::GetMaximumClientVersion(deviceCaps.featureLevel) &gt; 2)
+    {
+        mustSupport |= D3D11_FORMAT_SUPPORT_TEXTURE3D;
+    }
+
+    bool fullSupport = false;
+    if (format == DXGI_FORMAT_B5G6R5_UNORM)
+    {
+        // All hardware that supports DXGI_FORMAT_B5G6R5_UNORM should support autogen mipmaps, but
+        // check anyway.
+        mustSupport |= D3D11_FORMAT_SUPPORT_MIP_AUTOGEN;
+        fullSupport = ((deviceCaps.B5G6R5support &amp; mustSupport) == mustSupport);
+    }
+    else if (format == DXGI_FORMAT_B4G4R4A4_UNORM)
+    {
+        fullSupport = ((deviceCaps.B4G4R4A4support &amp; mustSupport) == mustSupport);
+    }
+    else if (format == DXGI_FORMAT_B5G5R5A1_UNORM)
+    {
+        fullSupport = ((deviceCaps.B5G5R5A1support &amp; mustSupport) == mustSupport);
+    }
+    else
+    {
+        UNREACHABLE();
+        return false;
+    }
+
+    // This 'SupportsFormat' function is used by individual entries in the D3D11 Format Map below,
+    // which maps GL formats to DXGI formats.
+    if (requireSupport)
+    {
+        // This means that ANGLE would like to use the entry in the map if the inputted DXGI format
+        // *IS* supported.
+        // e.g. the entry might map GL_RGB5_A1 to DXGI_FORMAT_B5G5R5A1, which should only be used if
+        // DXGI_FORMAT_B5G5R5A1 is supported.
+        // In this case, we should only return 'true' if the format *IS* supported.
+        return fullSupport;
+    }
+    else
+    {
+        // This means that ANGLE would like to use the entry in the map if the inputted DXGI format
+        // *ISN'T* supported.
+        // This might be a fallback entry. e.g. for ANGLE to use DXGI_FORMAT_R8G8B8A8_UNORM if
+        // DXGI_FORMAT_B5G5R5A1 isn't supported.
+        // In this case, we should only return 'true' if the format *ISN'T* supported.
+        return !fullSupport;
+    }
+}
+
+// End Format Support Functions
+}  // namespace
+
+ANGLEFormatSet::ANGLEFormatSet()
+    : format(ANGLE_FORMAT_NONE),
+      glInternalFormat(GL_NONE),
+      texFormat(DXGI_FORMAT_UNKNOWN),
+      srvFormat(DXGI_FORMAT_UNKNOWN),
+      rtvFormat(DXGI_FORMAT_UNKNOWN),
+      dsvFormat(DXGI_FORMAT_UNKNOWN),
+      blitSRVFormat(DXGI_FORMAT_UNKNOWN),
+      swizzleFormat(ANGLE_FORMAT_NONE),
+      mipGenerationFunction(nullptr),
+      colorReadFunction(nullptr)
+{
+}
+
+// For sized GL internal formats, there are several possible corresponding D3D11 formats depending
+// on device capabilities.
+// This function allows querying for the DXGI texture formats to use for textures, SRVs, RTVs and
+// DSVs given a GL internal format.
+TextureFormat::TextureFormat(GLenum internalFormat,
+                             const ANGLEFormat angleFormat,
+                             InitializeTextureDataFunction internalFormatInitializer)
+    : dataInitializerFunction(internalFormatInitializer)
+{
+    formatSet        = &amp;GetANGLEFormatSet(angleFormat);
+    swizzleFormatSet = &amp;GetANGLEFormatSet(formatSet-&gt;swizzleFormat);
+
+    // Gather all the load functions for this internal format
+    loadFunctions = GetLoadFunctionsMap(internalFormat, formatSet-&gt;texFormat);
+
+    ASSERT(loadFunctions.size() != 0 || internalFormat == GL_NONE);
+}
+
+ANGLEFormatSet::ANGLEFormatSet(ANGLEFormat format,
+                               GLenum glInternalFormat,
+                               DXGI_FORMAT texFormat,
+                               DXGI_FORMAT srvFormat,
+                               DXGI_FORMAT rtvFormat,
+                               DXGI_FORMAT dsvFormat,
+                               DXGI_FORMAT blitSRVFormat,
+                               ANGLEFormat swizzleFormat,
+                               MipGenerationFunction mipGenerationFunction,
+                               ColorReadFunction colorReadFunction)
+    : format(format),
+      glInternalFormat(glInternalFormat),
+      texFormat(texFormat),
+      srvFormat(srvFormat),
+      rtvFormat(rtvFormat),
+      dsvFormat(dsvFormat),
+      blitSRVFormat(blitSRVFormat),
+      swizzleFormat(swizzleFormat),
+      mipGenerationFunction(mipGenerationFunction),
+      colorReadFunction(colorReadFunction)
+{
+}
+
+const ANGLEFormatSet &amp;GetANGLEFormatSet(ANGLEFormat angleFormat)
+{
+    // clang-format off
+    switch (angleFormat)
+    {
+        case ANGLE_FORMAT_A8_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_A8_UNORM,
+                                                   GL_ALPHA8_EXT,
+                                                   DXGI_FORMAT_A8_UNORM,
+                                                   DXGI_FORMAT_A8_UNORM,
+                                                   DXGI_FORMAT_A8_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_A8_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GenerateMip&lt;A8&gt;,
+                                                   ReadColor&lt;A8, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_B4G4R4A4_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_B4G4R4A4_UNORM,
+                                                   GL_RGBA4,
+                                                   DXGI_FORMAT_B4G4R4A4_UNORM,
+                                                   DXGI_FORMAT_B4G4R4A4_UNORM,
+                                                   DXGI_FORMAT_B4G4R4A4_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_B4G4R4A4_UNORM,
+                                                   ANGLE_FORMAT_B4G4R4A4_UNORM,
+                                                   GenerateMip&lt;A4R4G4B4&gt;,
+                                                   ReadColor&lt;A4R4G4B4, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_B5G5R5A1_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_B5G5R5A1_UNORM,
+                                                   GL_RGB5_A1,
+                                                   DXGI_FORMAT_B5G5R5A1_UNORM,
+                                                   DXGI_FORMAT_B5G5R5A1_UNORM,
+                                                   DXGI_FORMAT_B5G5R5A1_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_B5G5R5A1_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GenerateMip&lt;A1R5G5B5&gt;,
+                                                   ReadColor&lt;A1R5G5B5, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_B5G6R5_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_B5G6R5_UNORM,
+                                                   GL_RGB565,
+                                                   DXGI_FORMAT_B5G6R5_UNORM,
+                                                   DXGI_FORMAT_B5G6R5_UNORM,
+                                                   DXGI_FORMAT_B5G6R5_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_B5G6R5_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GenerateMip&lt;R5G6B5&gt;,
+                                                   ReadColor&lt;R5G6B5, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_B8G8R8A8_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_B8G8R8A8_UNORM,
+                                                   GL_BGRA8_EXT,
+                                                   DXGI_FORMAT_B8G8R8A8_UNORM,
+                                                   DXGI_FORMAT_B8G8R8A8_UNORM,
+                                                   DXGI_FORMAT_B8G8R8A8_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_B8G8R8A8_UNORM,
+                                                   ANGLE_FORMAT_B8G8R8A8_UNORM,
+                                                   GenerateMip&lt;B8G8R8A8&gt;,
+                                                   ReadColor&lt;B8G8R8A8, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_BC1_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_BC1_UNORM,
+                                                   GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
+                                                   DXGI_FORMAT_BC1_UNORM,
+                                                   DXGI_FORMAT_BC1_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_BC1_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_BC2_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_BC2_UNORM,
+                                                   GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,
+                                                   DXGI_FORMAT_BC2_UNORM,
+                                                   DXGI_FORMAT_BC2_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_BC2_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_BC3_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_BC3_UNORM,
+                                                   GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,
+                                                   DXGI_FORMAT_BC3_UNORM,
+                                                   DXGI_FORMAT_BC3_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_BC3_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_D16_UNORM_FL10:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_D16_UNORM_FL10,
+                                                   GL_DEPTH_COMPONENT16,
+                                                   DXGI_FORMAT_R16_TYPELESS,
+                                                   DXGI_FORMAT_R16_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_D16_UNORM,
+                                                   DXGI_FORMAT_R16_UNORM,
+                                                   ANGLE_FORMAT_R16G16B16A16_UNORM,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_D16_UNORM_FL9_3:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_D16_UNORM_FL9_3,
+                                                   GL_DEPTH_COMPONENT16,
+                                                   DXGI_FORMAT_D16_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_D16_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   ANGLE_FORMAT_R16G16B16A16_UNORM,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_D24_UNORM_S8_UINT_FL10:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_D24_UNORM_S8_UINT_FL10,
+                                                   GL_DEPTH24_STENCIL8_OES,
+                                                   DXGI_FORMAT_R24G8_TYPELESS,
+                                                   DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_D24_UNORM_S8_UINT,
+                                                   DXGI_FORMAT_R24_UNORM_X8_TYPELESS,
+                                                   ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_D24_UNORM_S8_UINT_FL9_3:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_D24_UNORM_S8_UINT_FL9_3,
+                                                   GL_DEPTH24_STENCIL8_OES,
+                                                   DXGI_FORMAT_D24_UNORM_S8_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_D24_UNORM_S8_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_D32_FLOAT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_D32_FLOAT,
+                                                   GL_DEPTH_COMPONENT32F,
+                                                   DXGI_FORMAT_R32_TYPELESS,
+                                                   DXGI_FORMAT_R32_FLOAT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_D32_FLOAT,
+                                                   DXGI_FORMAT_R32_FLOAT,
+                                                   ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_D32_FLOAT_S8X24_UINT_FL10:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_D32_FLOAT_S8X24_UINT_FL10,
+                                                   GL_DEPTH32F_STENCIL8,
+                                                   DXGI_FORMAT_R32G8X24_TYPELESS,
+                                                   DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_D32_FLOAT_S8X24_UINT,
+                                                   DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS,
+                                                   ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_NONE:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_NONE,
+                                                   GL_NONE,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   ANGLE_FORMAT_NONE,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R10G10B10A2_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R10G10B10A2_UINT,
+                                                   GL_RGB10_A2UI,
+                                                   DXGI_FORMAT_R10G10B10A2_UINT,
+                                                   DXGI_FORMAT_R10G10B10A2_UINT,
+                                                   DXGI_FORMAT_R10G10B10A2_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R10G10B10A2_UINT,
+                                                   ANGLE_FORMAT_R16G16B16A16_UINT,
+                                                   GenerateMip&lt;R10G10B10A2&gt;,
+                                                   ReadColor&lt;R10G10B10A2, GLuint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R10G10B10A2_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R10G10B10A2_UNORM,
+                                                   GL_RGB10_A2,
+                                                   DXGI_FORMAT_R10G10B10A2_UNORM,
+                                                   DXGI_FORMAT_R10G10B10A2_UNORM,
+                                                   DXGI_FORMAT_R10G10B10A2_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R10G10B10A2_UNORM,
+                                                   ANGLE_FORMAT_R16G16B16A16_UNORM,
+                                                   GenerateMip&lt;R10G10B10A2&gt;,
+                                                   ReadColor&lt;R10G10B10A2, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R11G11B10_FLOAT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R11G11B10_FLOAT,
+                                                   GL_R11F_G11F_B10F,
+                                                   DXGI_FORMAT_R11G11B10_FLOAT,
+                                                   DXGI_FORMAT_R11G11B10_FLOAT,
+                                                   DXGI_FORMAT_R11G11B10_FLOAT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R11G11B10_FLOAT,
+                                                   ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                   GenerateMip&lt;R11G11B10F&gt;,
+                                                   ReadColor&lt;R11G11B10F, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R16G16B16A16_FLOAT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                   GL_RGBA16F,
+                                                   DXGI_FORMAT_R16G16B16A16_FLOAT,
+                                                   DXGI_FORMAT_R16G16B16A16_FLOAT,
+                                                   DXGI_FORMAT_R16G16B16A16_FLOAT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R16G16B16A16_FLOAT,
+                                                   ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                   GenerateMip&lt;R16G16B16A16F&gt;,
+                                                   ReadColor&lt;R16G16B16A16F, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R16G16B16A16_SINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R16G16B16A16_SINT,
+                                                   GL_RGBA16I,
+                                                   DXGI_FORMAT_R16G16B16A16_SINT,
+                                                   DXGI_FORMAT_R16G16B16A16_SINT,
+                                                   DXGI_FORMAT_R16G16B16A16_SINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R16G16B16A16_SINT,
+                                                   ANGLE_FORMAT_R16G16B16A16_SINT,
+                                                   GenerateMip&lt;R16G16B16A16S&gt;,
+                                                   ReadColor&lt;R16G16B16A16S, GLint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R16G16B16A16_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R16G16B16A16_UINT,
+                                                   GL_RGBA16UI,
+                                                   DXGI_FORMAT_R16G16B16A16_UINT,
+                                                   DXGI_FORMAT_R16G16B16A16_UINT,
+                                                   DXGI_FORMAT_R16G16B16A16_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R16G16B16A16_UINT,
+                                                   ANGLE_FORMAT_R16G16B16A16_UINT,
+                                                   GenerateMip&lt;R16G16B16A16&gt;,
+                                                   ReadColor&lt;R16G16B16A16, GLuint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R16G16B16A16_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R16G16B16A16_UNORM,
+                                                   GL_NONE,
+                                                   DXGI_FORMAT_R16G16B16A16_UNORM,
+                                                   DXGI_FORMAT_R16G16B16A16_UNORM,
+                                                   DXGI_FORMAT_R16G16B16A16_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R16G16B16A16_UNORM,
+                                                   ANGLE_FORMAT_R16G16B16A16_UNORM,
+                                                   GenerateMip&lt;R16G16B16A16&gt;,
+                                                   ReadColor&lt;R16G16B16A16, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R16G16_FLOAT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R16G16_FLOAT,
+                                                   GL_RG16F,
+                                                   DXGI_FORMAT_R16G16_FLOAT,
+                                                   DXGI_FORMAT_R16G16_FLOAT,
+                                                   DXGI_FORMAT_R16G16_FLOAT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R16G16_FLOAT,
+                                                   ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                   GenerateMip&lt;R16G16F&gt;,
+                                                   ReadColor&lt;R16G16F, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R16G16_SINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R16G16_SINT,
+                                                   GL_RG16I,
+                                                   DXGI_FORMAT_R16G16_SINT,
+                                                   DXGI_FORMAT_R16G16_SINT,
+                                                   DXGI_FORMAT_R16G16_SINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R16G16_SINT,
+                                                   ANGLE_FORMAT_R16G16B16A16_SINT,
+                                                   GenerateMip&lt;R16G16S&gt;,
+                                                   ReadColor&lt;R16G16S, GLint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R16G16_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R16G16_UINT,
+                                                   GL_RG16UI,
+                                                   DXGI_FORMAT_R16G16_UINT,
+                                                   DXGI_FORMAT_R16G16_UINT,
+                                                   DXGI_FORMAT_R16G16_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R16G16_UINT,
+                                                   ANGLE_FORMAT_R16G16B16A16_UINT,
+                                                   GenerateMip&lt;R16G16&gt;,
+                                                   ReadColor&lt;R16G16, GLuint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R16_FLOAT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R16_FLOAT,
+                                                   GL_R16F,
+                                                   DXGI_FORMAT_R16_FLOAT,
+                                                   DXGI_FORMAT_R16_FLOAT,
+                                                   DXGI_FORMAT_R16_FLOAT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R16_FLOAT,
+                                                   ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                   GenerateMip&lt;R16F&gt;,
+                                                   ReadColor&lt;R16F, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R16_SINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R16_SINT,
+                                                   GL_R16I,
+                                                   DXGI_FORMAT_R16_SINT,
+                                                   DXGI_FORMAT_R16_SINT,
+                                                   DXGI_FORMAT_R16_SINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R16_SINT,
+                                                   ANGLE_FORMAT_R16G16B16A16_SINT,
+                                                   GenerateMip&lt;R16S&gt;,
+                                                   ReadColor&lt;R16S, GLint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R16_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R16_UINT,
+                                                   GL_R16UI,
+                                                   DXGI_FORMAT_R16_UINT,
+                                                   DXGI_FORMAT_R16_UINT,
+                                                   DXGI_FORMAT_R16_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R16_UINT,
+                                                   ANGLE_FORMAT_R16G16B16A16_UINT,
+                                                   GenerateMip&lt;R16&gt;,
+                                                   ReadColor&lt;R16, GLuint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R32G32B32A32_FLOAT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                   GL_RGBA32F,
+                                                   DXGI_FORMAT_R32G32B32A32_FLOAT,
+                                                   DXGI_FORMAT_R32G32B32A32_FLOAT,
+                                                   DXGI_FORMAT_R32G32B32A32_FLOAT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R32G32B32A32_FLOAT,
+                                                   ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                   GenerateMip&lt;R32G32B32A32F&gt;,
+                                                   ReadColor&lt;R32G32B32A32F, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R32G32B32A32_SINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R32G32B32A32_SINT,
+                                                   GL_RGBA32I,
+                                                   DXGI_FORMAT_R32G32B32A32_SINT,
+                                                   DXGI_FORMAT_R32G32B32A32_SINT,
+                                                   DXGI_FORMAT_R32G32B32A32_SINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R32G32B32A32_SINT,
+                                                   ANGLE_FORMAT_R32G32B32A32_SINT,
+                                                   GenerateMip&lt;R32G32B32A32S&gt;,
+                                                   ReadColor&lt;R32G32B32A32S, GLint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R32G32B32A32_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R32G32B32A32_UINT,
+                                                   GL_RGBA32UI,
+                                                   DXGI_FORMAT_R32G32B32A32_UINT,
+                                                   DXGI_FORMAT_R32G32B32A32_UINT,
+                                                   DXGI_FORMAT_R32G32B32A32_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R32G32B32A32_UINT,
+                                                   ANGLE_FORMAT_R32G32B32A32_UINT,
+                                                   GenerateMip&lt;R32G32B32A32&gt;,
+                                                   ReadColor&lt;R32G32B32A32, GLuint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R32G32_FLOAT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R32G32_FLOAT,
+                                                   GL_RG32F,
+                                                   DXGI_FORMAT_R32G32_FLOAT,
+                                                   DXGI_FORMAT_R32G32_FLOAT,
+                                                   DXGI_FORMAT_R32G32_FLOAT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R32G32_FLOAT,
+                                                   ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                   GenerateMip&lt;R32G32F&gt;,
+                                                   ReadColor&lt;R32G32F, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R32G32_SINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R32G32_SINT,
+                                                   GL_RG32I,
+                                                   DXGI_FORMAT_R32G32_SINT,
+                                                   DXGI_FORMAT_R32G32_SINT,
+                                                   DXGI_FORMAT_R32G32_SINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R32G32_SINT,
+                                                   ANGLE_FORMAT_R32G32B32A32_SINT,
+                                                   GenerateMip&lt;R32G32S&gt;,
+                                                   ReadColor&lt;R32G32S, GLint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R32G32_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R32G32_UINT,
+                                                   GL_RG32UI,
+                                                   DXGI_FORMAT_R32G32_UINT,
+                                                   DXGI_FORMAT_R32G32_UINT,
+                                                   DXGI_FORMAT_R32G32_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R32G32_UINT,
+                                                   ANGLE_FORMAT_R32G32B32A32_UINT,
+                                                   GenerateMip&lt;R32G32&gt;,
+                                                   ReadColor&lt;R32G32, GLuint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R32_FLOAT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R32_FLOAT,
+                                                   GL_R32F,
+                                                   DXGI_FORMAT_R32_FLOAT,
+                                                   DXGI_FORMAT_R32_FLOAT,
+                                                   DXGI_FORMAT_R32_FLOAT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R32_FLOAT,
+                                                   ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                   GenerateMip&lt;R32F&gt;,
+                                                   ReadColor&lt;R32F, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R32_SINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R32_SINT,
+                                                   GL_R32I,
+                                                   DXGI_FORMAT_R32_SINT,
+                                                   DXGI_FORMAT_R32_SINT,
+                                                   DXGI_FORMAT_R32_SINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R32_SINT,
+                                                   ANGLE_FORMAT_R32G32B32A32_SINT,
+                                                   GenerateMip&lt;R32S&gt;,
+                                                   ReadColor&lt;R32S, GLint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R32_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R32_UINT,
+                                                   GL_R32UI,
+                                                   DXGI_FORMAT_R32_UINT,
+                                                   DXGI_FORMAT_R32_UINT,
+                                                   DXGI_FORMAT_R32_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R32_UINT,
+                                                   ANGLE_FORMAT_R32G32B32A32_UINT,
+                                                   GenerateMip&lt;R32&gt;,
+                                                   ReadColor&lt;R32, GLuint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8B8A8_SINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8B8A8_SINT,
+                                                   GL_RGBA8I,
+                                                   DXGI_FORMAT_R8G8B8A8_SINT,
+                                                   DXGI_FORMAT_R8G8B8A8_SINT,
+                                                   DXGI_FORMAT_R8G8B8A8_SINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8B8A8_SINT,
+                                                   ANGLE_FORMAT_R8G8B8A8_SINT,
+                                                   GenerateMip&lt;R8G8B8A8S&gt;,
+                                                   ReadColor&lt;R8G8B8A8S, GLint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8B8A8_SNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8B8A8_SNORM,
+                                                   GL_RGBA8_SNORM,
+                                                   DXGI_FORMAT_R8G8B8A8_SNORM,
+                                                   DXGI_FORMAT_R8G8B8A8_SNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8B8A8_SNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_SNORM,
+                                                   GenerateMip&lt;R8G8B8A8S&gt;,
+                                                   ReadColor&lt;R8G8B8A8S, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8B8A8_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8B8A8_UINT,
+                                                   GL_RGBA8UI,
+                                                   DXGI_FORMAT_R8G8B8A8_UINT,
+                                                   DXGI_FORMAT_R8G8B8A8_UINT,
+                                                   DXGI_FORMAT_R8G8B8A8_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8B8A8_UINT,
+                                                   ANGLE_FORMAT_R8G8B8A8_UINT,
+                                                   GenerateMip&lt;R8G8B8A8&gt;,
+                                                   ReadColor&lt;R8G8B8A8, GLuint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8B8A8_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GL_RGBA8,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GenerateMip&lt;R8G8B8A8&gt;,
+                                                   ReadColor&lt;R8G8B8A8, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE,
+                                                   GL_RGBA8,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GenerateMip&lt;R8G8B8A8&gt;,
+                                                   ReadColor&lt;R8G8B8A8, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB,
+                                                   GL_SRGB8_ALPHA8,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB,
+                                                   GenerateMip&lt;R8G8B8A8&gt;,
+                                                   ReadColor&lt;R8G8B8A8, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE,
+                                                   GL_SRGB8_ALPHA8,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GenerateMip&lt;R8G8B8A8&gt;,
+                                                   ReadColor&lt;R8G8B8A8, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8_SINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8_SINT,
+                                                   GL_RG8I,
+                                                   DXGI_FORMAT_R8G8_SINT,
+                                                   DXGI_FORMAT_R8G8_SINT,
+                                                   DXGI_FORMAT_R8G8_SINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8_SINT,
+                                                   ANGLE_FORMAT_R8G8B8A8_SINT,
+                                                   GenerateMip&lt;R8G8S&gt;,
+                                                   ReadColor&lt;R8G8S, GLint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8_SNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8_SNORM,
+                                                   GL_RG8_SNORM,
+                                                   DXGI_FORMAT_R8G8_SNORM,
+                                                   DXGI_FORMAT_R8G8_SNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8_SNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_SNORM,
+                                                   GenerateMip&lt;R8G8S&gt;,
+                                                   ReadColor&lt;R8G8S, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8_SNORM_NONRENDERABLE:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8_SNORM_NONRENDERABLE,
+                                                   GL_RG8_SNORM,
+                                                   DXGI_FORMAT_R8G8_SNORM,
+                                                   DXGI_FORMAT_R8G8_SNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8_SNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_SNORM,
+                                                   GenerateMip&lt;R8G8S&gt;,
+                                                   ReadColor&lt;R8G8S, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8_UINT,
+                                                   GL_RG8UI,
+                                                   DXGI_FORMAT_R8G8_UINT,
+                                                   DXGI_FORMAT_R8G8_UINT,
+                                                   DXGI_FORMAT_R8G8_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8_UINT,
+                                                   ANGLE_FORMAT_R8G8B8A8_UINT,
+                                                   GenerateMip&lt;R8G8&gt;,
+                                                   ReadColor&lt;R8G8, GLuint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8_UNORM,
+                                                   GL_RG8,
+                                                   DXGI_FORMAT_R8G8_UNORM,
+                                                   DXGI_FORMAT_R8G8_UNORM,
+                                                   DXGI_FORMAT_R8G8_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GenerateMip&lt;R8G8&gt;,
+                                                   ReadColor&lt;R8G8, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8G8_UNORM_NONRENDERABLE:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8G8_UNORM_NONRENDERABLE,
+                                                   GL_RG8,
+                                                   DXGI_FORMAT_R8G8_UNORM,
+                                                   DXGI_FORMAT_R8G8_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8G8_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GenerateMip&lt;R8G8&gt;,
+                                                   ReadColor&lt;R8G8, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8_SINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8_SINT,
+                                                   GL_R8I,
+                                                   DXGI_FORMAT_R8_SINT,
+                                                   DXGI_FORMAT_R8_SINT,
+                                                   DXGI_FORMAT_R8_SINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8_SINT,
+                                                   ANGLE_FORMAT_R8G8B8A8_SINT,
+                                                   GenerateMip&lt;R8S&gt;,
+                                                   ReadColor&lt;R8S, GLint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8_SNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8_SNORM,
+                                                   GL_R8_SNORM,
+                                                   DXGI_FORMAT_R8_SNORM,
+                                                   DXGI_FORMAT_R8_SNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8_SNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_SNORM,
+                                                   GenerateMip&lt;R8S&gt;,
+                                                   ReadColor&lt;R8S, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8_SNORM_NONRENDERABLE:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8_SNORM_NONRENDERABLE,
+                                                   GL_R8_SNORM,
+                                                   DXGI_FORMAT_R8_SNORM,
+                                                   DXGI_FORMAT_R8_SNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8_SNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_SNORM,
+                                                   GenerateMip&lt;R8S&gt;,
+                                                   ReadColor&lt;R8S, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8_UINT,
+                                                   GL_R8UI,
+                                                   DXGI_FORMAT_R8_UINT,
+                                                   DXGI_FORMAT_R8_UINT,
+                                                   DXGI_FORMAT_R8_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8_UINT,
+                                                   ANGLE_FORMAT_R8G8B8A8_UINT,
+                                                   GenerateMip&lt;R8&gt;,
+                                                   ReadColor&lt;R8, GLuint&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8_UNORM:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8_UNORM,
+                                                   GL_R8,
+                                                   DXGI_FORMAT_R8_UNORM,
+                                                   DXGI_FORMAT_R8_UNORM,
+                                                   DXGI_FORMAT_R8_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GenerateMip&lt;R8&gt;,
+                                                   ReadColor&lt;R8, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R8_UNORM_NONRENDERABLE:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R8_UNORM_NONRENDERABLE,
+                                                   GL_R8,
+                                                   DXGI_FORMAT_R8_UNORM,
+                                                   DXGI_FORMAT_R8_UNORM,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R8_UNORM,
+                                                   ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                   GenerateMip&lt;R8&gt;,
+                                                   ReadColor&lt;R8, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_R9G9B9E5_SHAREDEXP:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_R9G9B9E5_SHAREDEXP,
+                                                   GL_RGB9_E5,
+                                                   DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
+                                                   DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
+                                                   ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                   GenerateMip&lt;R9G9B9E5&gt;,
+                                                   ReadColor&lt;R9G9B9E5, GLfloat&gt;);
+            return formatInfo;
+        }
+        case ANGLE_FORMAT_X24_TYPELESS_G8_UINT:
+        {
+            static const ANGLEFormatSet formatInfo(ANGLE_FORMAT_X24_TYPELESS_G8_UINT,
+                                                   GL_DEPTH24_STENCIL8_OES,
+                                                   DXGI_FORMAT_R24G8_TYPELESS,
+                                                   DXGI_FORMAT_X24_TYPELESS_G8_UINT,
+                                                   DXGI_FORMAT_UNKNOWN,
+                                                   DXGI_FORMAT_D24_UNORM_S8_UINT,
+                                                   DXGI_FORMAT_X24_TYPELESS_G8_UINT,
+                                                   ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                   nullptr,
+                                                   nullptr);
+            return formatInfo;
+        }
+
+        default:
+            break;
+    }
+    // clang-format on
+
+    UNREACHABLE();
+    static const ANGLEFormatSet defaultInfo;
+    return defaultInfo;
+}
+
+const TextureFormat &amp;GetTextureFormatInfo(GLenum internalFormat,
+                                          const Renderer11DeviceCaps &amp;renderer11DeviceCaps)
+{
+    // clang-format off
+    switch (internalFormat)
+    {
+        case GL_ALPHA:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_A8_UNORM,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else if (OnlyFL9_3(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_ALPHA16F_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_ALPHA32F_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_ALPHA8_EXT:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_A8_UNORM,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else if (OnlyFL9_3(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_BGR5_A1_ANGLEX:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_B8G8R8A8_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_BGRA4_ANGLEX:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_B8G8R8A8_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_BGRA8_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_B8G8R8A8_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_BGRA_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_B8G8R8A8_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_COMPRESSED_R11_EAC:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8_UNORM_NONRENDERABLE,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_COMPRESSED_RG11_EAC:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8_UNORM_NONRENDERABLE,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_COMPRESSED_RGB8_ETC2:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE,
+                                                         Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE,
+                                                         Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_COMPRESSED_RGBA8_ETC2_EAC:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_BC1_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_BC2_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_BC3_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_BC1_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_COMPRESSED_SIGNED_R11_EAC:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8_SNORM_NONRENDERABLE,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_COMPRESSED_SIGNED_RG11_EAC:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8_SNORM_NONRENDERABLE,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_COMPRESSED_SRGB8_ETC2:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE,
+                                                         Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_DEPTH24_STENCIL8:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_D24_UNORM_S8_UINT_FL10,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else if (OnlyFL9_3(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_D24_UNORM_S8_UINT_FL9_3,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_DEPTH32F_STENCIL8:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_D32_FLOAT_S8X24_UINT_FL10,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else if (OnlyFL9_3(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_NONE,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_DEPTH_COMPONENT16:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_D16_UNORM_FL10,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else if (OnlyFL9_3(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_D16_UNORM_FL9_3,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_DEPTH_COMPONENT24:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_D24_UNORM_S8_UINT_FL10,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else if (OnlyFL9_3(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_D24_UNORM_S8_UINT_FL9_3,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_DEPTH_COMPONENT32F:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_D32_FLOAT,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else if (OnlyFL9_3(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_NONE,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_DEPTH_COMPONENT32_OES:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_D24_UNORM_S8_UINT_FL10,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_BC1_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_ETC1_RGB8_OES:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE,
+                                                     Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;);
+            return textureFormat;
+        }
+        case GL_LUMINANCE:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                     Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;);
+            return textureFormat;
+        }
+        case GL_LUMINANCE16F_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                     Initialize4ComponentData&lt;GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One&gt;);
+            return textureFormat;
+        }
+        case GL_LUMINANCE32F_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                     Initialize4ComponentData&lt;GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One&gt;);
+            return textureFormat;
+        }
+        case GL_LUMINANCE8_ALPHA8_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_LUMINANCE8_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                     Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;);
+            return textureFormat;
+        }
+        case GL_LUMINANCE_ALPHA:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_LUMINANCE_ALPHA16F_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_LUMINANCE_ALPHA32F_EXT:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_NONE:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_NONE,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R11F_G11F_B10F:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R11G11B10_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R16F:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R16I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16_SINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R16UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16_UINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R32F:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R32I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32_SINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R32UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32_UINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R8:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R8I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8_SINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R8UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8_UINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_R8_SNORM:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8_SNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RG16F:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RG16I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16_SINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RG16UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16_UINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RG32F:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RG32I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32_SINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RG32UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32_UINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RG8:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RG8I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8_SINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RG8UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8_UINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RG8_SNORM:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8_SNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGB:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                     Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;);
+            return textureFormat;
+        }
+        case GL_RGB10_A2:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R10G10B10A2_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGB10_A2UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R10G10B10A2_UINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGB16F:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                     Initialize4ComponentData&lt;GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One&gt;);
+            return textureFormat;
+        }
+        case GL_RGB16I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16B16A16_SINT,
+                                                     Initialize4ComponentData&lt;GLshort, 0x0000, 0x0000, 0x0000, 0x0001&gt;);
+            return textureFormat;
+        }
+        case GL_RGB16UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16B16A16_UINT,
+                                                     Initialize4ComponentData&lt;GLushort, 0x0000, 0x0000, 0x0000, 0x0001&gt;);
+            return textureFormat;
+        }
+        case GL_RGB32F:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                     Initialize4ComponentData&lt;GLfloat, 0x00000000, 0x00000000, 0x00000000, gl::Float32One&gt;);
+            return textureFormat;
+        }
+        case GL_RGB32I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32B32A32_SINT,
+                                                     Initialize4ComponentData&lt;GLint, 0x00000000, 0x00000000, 0x00000000, 0x00000001&gt;);
+            return textureFormat;
+        }
+        case GL_RGB32UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32B32A32_UINT,
+                                                     Initialize4ComponentData&lt;GLuint, 0x00000000, 0x00000000, 0x00000000, 0x00000001&gt;);
+            return textureFormat;
+        }
+        case GL_RGB565:
+        {
+            if (SupportsFormat&lt;DXGI_FORMAT_B5G6R5_UNORM,false&gt;(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                         Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;);
+                return textureFormat;
+            }
+            else if (SupportsFormat&lt;DXGI_FORMAT_B5G6R5_UNORM,true&gt;(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_B5G6R5_UNORM,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_RGB5_A1:
+        {
+            if (SupportsFormat&lt;DXGI_FORMAT_B5G5R5A1_UNORM,false&gt;(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else if (SupportsFormat&lt;DXGI_FORMAT_B5G5R5A1_UNORM,true&gt;(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_B5G5R5A1_UNORM,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_RGB8:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                     Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;);
+            return textureFormat;
+        }
+        case GL_RGB8I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_SINT,
+                                                     Initialize4ComponentData&lt;GLbyte, 0x00, 0x00, 0x00, 0x01&gt;);
+            return textureFormat;
+        }
+        case GL_RGB8UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UINT,
+                                                     Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0x01&gt;);
+            return textureFormat;
+        }
+        case GL_RGB8_SNORM:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_SNORM,
+                                                     Initialize4ComponentData&lt;GLbyte, 0x00, 0x00, 0x00, 0x7F&gt;);
+            return textureFormat;
+        }
+        case GL_RGB9_E5:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R9G9B9E5_SHAREDEXP,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA16F:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16B16A16_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA16I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16B16A16_SINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA16UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R16G16B16A16_UINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA32F:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32B32A32_FLOAT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA32I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32B32A32_SINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA32UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R32G32B32A32_UINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA4:
+        {
+            if (SupportsFormat&lt;DXGI_FORMAT_B4G4R4A4_UNORM,false&gt;(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else if (SupportsFormat&lt;DXGI_FORMAT_B4G4R4A4_UNORM,true&gt;(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_B4G4R4A4_UNORM,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+        case GL_RGBA8:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA8I:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_SINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA8UI:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UINT,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_RGBA8_SNORM:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_SNORM,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_SRGB8:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE,
+                                                     Initialize4ComponentData&lt;GLubyte, 0x00, 0x00, 0x00, 0xFF&gt;);
+            return textureFormat;
+        }
+        case GL_SRGB8_ALPHA8:
+        {
+            static const TextureFormat textureFormat(internalFormat,
+                                                     ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB,
+                                                     nullptr);
+            return textureFormat;
+        }
+        case GL_STENCIL_INDEX8:
+        {
+            if (OnlyFL10Plus(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_X24_TYPELESS_G8_UINT,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else if (OnlyFL9_3(renderer11DeviceCaps))
+            {
+                static const TextureFormat textureFormat(internalFormat,
+                                                         ANGLE_FORMAT_D24_UNORM_S8_UINT_FL9_3,
+                                                         nullptr);
+                return textureFormat;
+            }
+            else
+            {
+                break;
+            }
+        }
+
+        default:
+            break;
+    }
+    // clang-format on
+
+    static const TextureFormat defaultInfo(GL_NONE, ANGLE_FORMAT_NONE, nullptr);
+    return defaultInfo;
+}  // GetTextureFormatInfo
+
+}  // namespace d3d11
+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11texture_format_table_autogenh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,79 @@
</span><ins>+// GENERATED FILE - DO NOT EDIT.
+// Generated by gen_texture_format_table.py using data from texture_format_data.json
+//
+// Copyright 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+namespace rx
+{
+
+namespace d3d11
+{
+
+enum ANGLEFormat
+{
+    ANGLE_FORMAT_A8_UNORM,
+    ANGLE_FORMAT_B4G4R4A4_UNORM,
+    ANGLE_FORMAT_B5G5R5A1_UNORM,
+    ANGLE_FORMAT_B5G6R5_UNORM,
+    ANGLE_FORMAT_B8G8R8A8_UNORM,
+    ANGLE_FORMAT_BC1_UNORM,
+    ANGLE_FORMAT_BC2_UNORM,
+    ANGLE_FORMAT_BC3_UNORM,
+    ANGLE_FORMAT_D16_UNORM_FL10,
+    ANGLE_FORMAT_D16_UNORM_FL9_3,
+    ANGLE_FORMAT_D24_UNORM_S8_UINT_FL10,
+    ANGLE_FORMAT_D24_UNORM_S8_UINT_FL9_3,
+    ANGLE_FORMAT_D32_FLOAT,
+    ANGLE_FORMAT_D32_FLOAT_S8X24_UINT_FL10,
+    ANGLE_FORMAT_NONE,
+    ANGLE_FORMAT_R10G10B10A2_UINT,
+    ANGLE_FORMAT_R10G10B10A2_UNORM,
+    ANGLE_FORMAT_R11G11B10_FLOAT,
+    ANGLE_FORMAT_R16G16B16A16_FLOAT,
+    ANGLE_FORMAT_R16G16B16A16_SINT,
+    ANGLE_FORMAT_R16G16B16A16_UINT,
+    ANGLE_FORMAT_R16G16B16A16_UNORM,
+    ANGLE_FORMAT_R16G16_FLOAT,
+    ANGLE_FORMAT_R16G16_SINT,
+    ANGLE_FORMAT_R16G16_UINT,
+    ANGLE_FORMAT_R16_FLOAT,
+    ANGLE_FORMAT_R16_SINT,
+    ANGLE_FORMAT_R16_UINT,
+    ANGLE_FORMAT_R32G32B32A32_FLOAT,
+    ANGLE_FORMAT_R32G32B32A32_SINT,
+    ANGLE_FORMAT_R32G32B32A32_UINT,
+    ANGLE_FORMAT_R32G32_FLOAT,
+    ANGLE_FORMAT_R32G32_SINT,
+    ANGLE_FORMAT_R32G32_UINT,
+    ANGLE_FORMAT_R32_FLOAT,
+    ANGLE_FORMAT_R32_SINT,
+    ANGLE_FORMAT_R32_UINT,
+    ANGLE_FORMAT_R8G8B8A8_SINT,
+    ANGLE_FORMAT_R8G8B8A8_SNORM,
+    ANGLE_FORMAT_R8G8B8A8_UINT,
+    ANGLE_FORMAT_R8G8B8A8_UNORM,
+    ANGLE_FORMAT_R8G8B8A8_UNORM_NONRENDERABLE,
+    ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB,
+    ANGLE_FORMAT_R8G8B8A8_UNORM_SRGB_NONRENDERABLE,
+    ANGLE_FORMAT_R8G8_SINT,
+    ANGLE_FORMAT_R8G8_SNORM,
+    ANGLE_FORMAT_R8G8_SNORM_NONRENDERABLE,
+    ANGLE_FORMAT_R8G8_UINT,
+    ANGLE_FORMAT_R8G8_UNORM,
+    ANGLE_FORMAT_R8G8_UNORM_NONRENDERABLE,
+    ANGLE_FORMAT_R8_SINT,
+    ANGLE_FORMAT_R8_SNORM,
+    ANGLE_FORMAT_R8_SNORM_NONRENDERABLE,
+    ANGLE_FORMAT_R8_UINT,
+    ANGLE_FORMAT_R8_UNORM,
+    ANGLE_FORMAT_R8_UNORM_NONRENDERABLE,
+    ANGLE_FORMAT_R9G9B9E5_SHAREDEXP,
+    ANGLE_FORMAT_X24_TYPELESS_G8_UINT
+};
+
+}  // namespace d3d11
+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11win32NativeWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,19 +7,38 @@
</span><span class="cx"> // NativeWindow.cpp: Handler for managing HWND native window types.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d11/NativeWindow.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d11/renderer11_utils.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;initguid.h&gt;
+#include &lt;dcomp.h&gt;
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-NativeWindow::NativeWindow(EGLNativeWindowType window) : mWindow(window)
</del><ins>+NativeWindow::NativeWindow(EGLNativeWindowType window,
+                           const egl::Config *config,
+                           bool directComposition)
+    : mWindow(window),
+      mDirectComposition(directComposition),
+      mDevice(nullptr),
+      mCompositionTarget(nullptr),
+      mVisual(nullptr),
+      mConfig(config)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+NativeWindow::~NativeWindow()
+{
+    SafeRelease(mCompositionTarget);
+    SafeRelease(mDevice);
+    SafeRelease(mVisual);
+}
+
</ins><span class="cx"> bool NativeWindow::initialize()
</span><del>-{ 
-    return true; 
</del><ins>+{
+    return true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool NativeWindow::getClientRect(LPRECT rect)
</span><span class="lines">@@ -46,7 +65,113 @@
</span><span class="cx">         return E_INVALIDARG;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DXGI_SWAP_CHAIN_DESC swapChainDesc = { 0 };
</del><ins>+    if (mDirectComposition)
+    {
+        HMODULE dcomp = ::GetModuleHandle(TEXT(&quot;dcomp.dll&quot;));
+        if (!dcomp)
+        {
+            return E_INVALIDARG;
+        }
+
+        typedef HRESULT(WINAPI * PFN_DCOMPOSITION_CREATE_DEVICE)(
+            IDXGIDevice * dxgiDevice, REFIID iid, void **dcompositionDevice);
+        PFN_DCOMPOSITION_CREATE_DEVICE createDComp =
+            reinterpret_cast&lt;PFN_DCOMPOSITION_CREATE_DEVICE&gt;(
+                GetProcAddress(dcomp, &quot;DCompositionCreateDevice&quot;));
+        if (!createDComp)
+        {
+            return E_INVALIDARG;
+        }
+
+        if (!mDevice)
+        {
+            IDXGIDevice *dxgiDevice = d3d11::DynamicCastComObject&lt;IDXGIDevice&gt;(device);
+            HRESULT result = createDComp(dxgiDevice, __uuidof(IDCompositionDevice),
+                                         reinterpret_cast&lt;void **&gt;(&amp;mDevice));
+            SafeRelease(dxgiDevice);
+
+            if (FAILED(result))
+            {
+                return result;
+            }
+        }
+
+        if (!mCompositionTarget)
+        {
+            HRESULT result = mDevice-&gt;CreateTargetForHwnd(mWindow, TRUE, &amp;mCompositionTarget);
+            if (FAILED(result))
+            {
+                return result;
+            }
+        }
+
+        if (!mVisual)
+        {
+            HRESULT result = mDevice-&gt;CreateVisual(&amp;mVisual);
+            if (FAILED(result))
+            {
+                return result;
+            }
+        }
+
+        IDXGIFactory2 *factory2             = d3d11::DynamicCastComObject&lt;IDXGIFactory2&gt;(factory);
+        DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
+        swapChainDesc.Width                 = width;
+        swapChainDesc.Height                = height;
+        swapChainDesc.Format                = format;
+        swapChainDesc.Stereo                = FALSE;
+        swapChainDesc.SampleDesc.Count      = 1;
+        swapChainDesc.SampleDesc.Quality    = 0;
+        swapChainDesc.BufferUsage =
+            DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER | DXGI_USAGE_SHADER_INPUT;
+        swapChainDesc.BufferCount           = 2;
+        swapChainDesc.Scaling               = DXGI_SCALING_STRETCH;
+        swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
+        swapChainDesc.AlphaMode =
+            mConfig-&gt;alphaSize == 0 ? DXGI_ALPHA_MODE_IGNORE : DXGI_ALPHA_MODE_PREMULTIPLIED;
+        swapChainDesc.Flags         = 0;
+        IDXGISwapChain1 *swapChain1 = nullptr;
+        HRESULT result =
+            factory2-&gt;CreateSwapChainForComposition(device, &amp;swapChainDesc, nullptr, &amp;swapChain1);
+        if (SUCCEEDED(result))
+        {
+            *swapChain = static_cast&lt;DXGISwapChain *&gt;(swapChain1);
+        }
+        mVisual-&gt;SetContent(swapChain1);
+        mCompositionTarget-&gt;SetRoot(mVisual);
+        SafeRelease(factory2);
+        return result;
+    }
+
+    // Use IDXGIFactory2::CreateSwapChainForHwnd if DXGI 1.2 is available to create a DXGI_SWAP_EFFECT_SEQUENTIAL swap chain.
+    IDXGIFactory2 *factory2 = d3d11::DynamicCastComObject&lt;IDXGIFactory2&gt;(factory);
+    if (factory2 != nullptr)
+    {
+        DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 };
+        swapChainDesc.Width = width;
+        swapChainDesc.Height = height;
+        swapChainDesc.Format = format;
+        swapChainDesc.Stereo = FALSE;
+        swapChainDesc.SampleDesc.Count = 1;
+        swapChainDesc.SampleDesc.Quality = 0;
+        swapChainDesc.BufferUsage =
+            DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_BACK_BUFFER;
+        swapChainDesc.BufferCount = 1;
+        swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
+        swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL;
+        swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
+        swapChainDesc.Flags = 0;
+        IDXGISwapChain1 *swapChain1 = nullptr;
+        HRESULT result = factory2-&gt;CreateSwapChainForHwnd(device, mWindow, &amp;swapChainDesc, nullptr, nullptr, &amp;swapChain1);
+        if (SUCCEEDED(result))
+        {
+            *swapChain = static_cast&lt;DXGISwapChain*&gt;(swapChain1);
+        }
+        SafeRelease(factory2);
+        return result;
+    }
+
+    DXGI_SWAP_CHAIN_DESC swapChainDesc = {};
</ins><span class="cx">     swapChainDesc.BufferCount = 1;
</span><span class="cx">     swapChainDesc.BufferDesc.Format = format;
</span><span class="cx">     swapChainDesc.BufferDesc.Width = width;
</span><span class="lines">@@ -55,7 +180,8 @@
</span><span class="cx">     swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
</span><span class="cx">     swapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
</span><span class="cx">     swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
</span><del>-    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER;
</del><ins>+    swapChainDesc.BufferUsage =
+        DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_BACK_BUFFER;
</ins><span class="cx">     swapChainDesc.Flags = 0;
</span><span class="cx">     swapChainDesc.OutputWindow = mWindow;
</span><span class="cx">     swapChainDesc.SampleDesc.Count = 1;
</span><span class="lines">@@ -65,4 +191,12 @@
</span><span class="cx"> 
</span><span class="cx">     return factory-&gt;CreateSwapChain(device, &amp;swapChainDesc, swapChain);
</span><span class="cx"> }
</span><ins>+
+void NativeWindow::commitChange()
+{
+    if (mDevice)
+    {
+        mDevice-&gt;Commit();
+    }
</ins><span class="cx"> }
</span><ins>+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtCoreWindowNativeWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -24,7 +24,6 @@
</span><span class="cx">     ComPtr&lt;IPropertySet&gt; props = propertySet;
</span><span class="cx">     ComPtr&lt;IInspectable&gt; win = window;
</span><span class="cx">     SIZE swapChainSize = {};
</span><del>-    bool swapChainSizeSpecified = false;
</del><span class="cx">     HRESULT result = S_OK;
</span><span class="cx"> 
</span><span class="cx">     // IPropertySet is an optional parameter and can be null.
</span><span class="lines">@@ -33,13 +32,41 @@
</span><span class="cx">     if (propertySet)
</span><span class="cx">     {
</span><span class="cx">         result = props.As(&amp;mPropertyMap);
</span><del>-        if (SUCCEEDED(result))
</del><ins>+        if (FAILED(result))
</ins><span class="cx">         {
</span><del>-            // The EGLRenderSurfaceSizeProperty is optional and may be missing.  The IPropertySet
-            // was prevalidated to contain the EGLNativeWindowType before being passed to
-            // this host.
-            result = GetOptionalSizePropertyValue(mPropertyMap, EGLRenderSurfaceSizeProperty, &amp;swapChainSize, &amp;swapChainSizeSpecified);
</del><ins>+            return false;
</ins><span class="cx">         }
</span><ins>+
+        // The EGLRenderSurfaceSizeProperty is optional and may be missing. The IPropertySet
+        // was prevalidated to contain the EGLNativeWindowType before being passed to
+        // this host.
+        result = GetOptionalSizePropertyValue(mPropertyMap, EGLRenderSurfaceSizeProperty, &amp;swapChainSize, &amp;mSwapChainSizeSpecified);
+        if (FAILED(result))
+        {
+            return false;
+        }
+
+        // The EGLRenderResolutionScaleProperty is optional and may be missing. The IPropertySet
+        // was prevalidated to contain the EGLNativeWindowType before being passed to
+        // this host.
+        result = GetOptionalSinglePropertyValue(mPropertyMap, EGLRenderResolutionScaleProperty, &amp;mSwapChainScale, &amp;mSwapChainScaleSpecified);
+        if (FAILED(result))
+        {
+            return false;
+        }
+
+        if (!mSwapChainScaleSpecified)
+        {
+            // Default value for the scale is 1.0f
+            mSwapChainScale = 1.0f;
+        }
+
+        // A EGLRenderSurfaceSizeProperty and a EGLRenderResolutionScaleProperty can't both be specified
+        if (mSwapChainScaleSpecified &amp;&amp; mSwapChainSizeSpecified)
+        {
+            ERR(&quot;It is invalid to specify both an EGLRenderSurfaceSizeProperty and a EGLRenderResolutionScaleProperty.&quot;);
+            return false;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="lines">@@ -55,14 +82,19 @@
</span><span class="cx">         // of the host.
</span><span class="cx">         // Scaling of the swapchain output occurs automatically because if
</span><span class="cx">         // the scaling mode setting DXGI_SCALING_STRETCH on the swapchain.
</span><del>-        if (swapChainSizeSpecified)
</del><ins>+        if (mSwapChainSizeSpecified)
</ins><span class="cx">         {
</span><span class="cx">             mClientRect = { 0, 0, swapChainSize.cx, swapChainSize.cy };
</span><del>-            mSupportsSwapChainResize = false;
</del><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            result = GetCoreWindowSizeInPixels(mCoreWindow, &amp;mClientRect);
</del><ins>+            SIZE coreWindowSize;
+            result = GetCoreWindowSizeInPixels(mCoreWindow, &amp;coreWindowSize);
+
+            if (SUCCEEDED(result))
+            {
+                mClientRect = { 0, 0, static_cast&lt;long&gt;(coreWindowSize.cx * mSwapChainScale), static_cast&lt;long&gt;(coreWindowSize.cy * mSwapChainScale) };
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -102,7 +134,13 @@
</span><span class="cx">     mSizeChangedEventToken.value = 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-HRESULT CoreWindowNativeWindow::createSwapChain(ID3D11Device *device, DXGIFactory *factory, DXGI_FORMAT format, unsigned int width, unsigned int height, DXGISwapChain **swapChain)
</del><ins>+HRESULT CoreWindowNativeWindow::createSwapChain(ID3D11Device *device,
+                                                DXGIFactory *factory,
+                                                DXGI_FORMAT format,
+                                                unsigned int width,
+                                                unsigned int height,
+                                                bool containsAlpha,
+                                                DXGISwapChain **swapChain)
</ins><span class="cx"> {
</span><span class="cx">     if (device == NULL || factory == NULL || swapChain == NULL || width == 0 || height == 0)
</span><span class="cx">     {
</span><span class="lines">@@ -116,10 +154,12 @@
</span><span class="cx">     swapChainDesc.Stereo = FALSE;
</span><span class="cx">     swapChainDesc.SampleDesc.Count = 1;
</span><span class="cx">     swapChainDesc.SampleDesc.Quality = 0;
</span><del>-    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER;
</del><ins>+    swapChainDesc.BufferUsage =
+        DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER;
</ins><span class="cx">     swapChainDesc.BufferCount = 2;
</span><span class="cx">     swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
</span><span class="cx">     swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
</span><ins>+    swapChainDesc.AlphaMode             = DXGI_ALPHA_MODE_UNSPECIFIED;
</ins><span class="cx"> 
</span><span class="cx">     *swapChain = nullptr;
</span><span class="cx"> 
</span><span class="lines">@@ -154,13 +194,20 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-HRESULT GetCoreWindowSizeInPixels(const ComPtr&lt;ABI::Windows::UI::Core::ICoreWindow&gt;&amp; coreWindow, RECT *windowSize)
</del><ins>+inline HRESULT CoreWindowNativeWindow::scaleSwapChain(const SIZE &amp;windowSize, const RECT &amp;clientRect)
</ins><span class="cx"> {
</span><ins>+    // We don't need to do any additional work to scale CoreWindow swapchains.
+    // Using DXGI_SCALING_STRETCH to create the swapchain above does all the necessary work.
+    return S_OK;
+}
+
+HRESULT GetCoreWindowSizeInPixels(const ComPtr&lt;ABI::Windows::UI::Core::ICoreWindow&gt;&amp; coreWindow, SIZE *windowSize)
+{
</ins><span class="cx">     ABI::Windows::Foundation::Rect bounds;
</span><span class="cx">     HRESULT result = coreWindow-&gt;get_Bounds(&amp;bounds);
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="cx">     {
</span><del>-        *windowSize = { 0, 0, ConvertDipsToPixels(bounds.Width), ConvertDipsToPixels(bounds.Height) };
</del><ins>+        *windowSize = { ConvertDipsToPixels(bounds.Width), ConvertDipsToPixels(bounds.Height) };
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return result;
</span><span class="lines">@@ -169,16 +216,18 @@
</span><span class="cx"> static float GetLogicalDpi()
</span><span class="cx"> {
</span><span class="cx">     ComPtr&lt;ABI::Windows::Graphics::Display::IDisplayPropertiesStatics&gt; displayProperties;
</span><del>-    float dpi = 96.0f;
</del><span class="cx"> 
</span><span class="cx">     if (SUCCEEDED(GetActivationFactory(HStringReference(RuntimeClass_Windows_Graphics_Display_DisplayProperties).Get(), displayProperties.GetAddressOf())))
</span><span class="cx">     {
</span><ins>+        float dpi = 96.0f;
</ins><span class="cx">         if (SUCCEEDED(displayProperties-&gt;get_LogicalDpi(&amp;dpi)))
</span><span class="cx">         {
</span><span class="cx">             return dpi;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    return dpi;
</del><ins>+
+    // Return 96 dpi as a default if display properties cannot be obtained.
+    return 96.0f;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> long ConvertDipsToPixels(float dips)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtCoreWindowNativeWindowh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -24,10 +24,20 @@
</span><span class="cx">   public:
</span><span class="cx">     ~CoreWindowNativeWindow();
</span><span class="cx"> 
</span><del>-    bool initialize(EGLNativeWindowType window, IPropertySet *propertySet);
</del><ins>+    bool initialize(EGLNativeWindowType window, IPropertySet *propertySet) override;
+    HRESULT createSwapChain(ID3D11Device *device,
+                            DXGIFactory *factory,
+                            DXGI_FORMAT format,
+                            unsigned int width,
+                            unsigned int height,
+                            bool containsAlpha,
+                            DXGISwapChain **swapChain) override;
+
+  protected:
+    HRESULT scaleSwapChain(const SIZE &amp;windowSize, const RECT &amp;clientRect) override;
+
</ins><span class="cx">     bool registerForSizeChangeEvents();
</span><span class="cx">     void unregisterForSizeChangeEvents();
</span><del>-    HRESULT createSwapChain(ID3D11Device *device, DXGIFactory *factory, DXGI_FORMAT format, unsigned int width, unsigned int height, DXGISwapChain **swapChain);
</del><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     ComPtr&lt;ABI::Windows::UI::Core::ICoreWindow&gt; mCoreWindow;
</span><span class="lines">@@ -72,7 +82,7 @@
</span><span class="cx">     std::weak_ptr&lt;InspectableNativeWindow&gt; mHost;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-HRESULT GetCoreWindowSizeInPixels(const ComPtr&lt;ABI::Windows::UI::Core::ICoreWindow&gt;&amp; coreWindow, RECT *windowSize);
</del><ins>+HRESULT GetCoreWindowSizeInPixels(const ComPtr&lt;ABI::Windows::UI::Core::ICoreWindow&gt;&amp; coreWindow, SIZE *windowSize);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_COREWINDOWNATIVEWINDOW_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtCoreWindowNativeWindow_unittestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow_unittest.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow_unittest.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/CoreWindowNativeWindow_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -162,12 +162,35 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+HRESULT CreatePropertyValueStatics(IPropertyValueStatics** propertyStatics)
+{
+    ComPtr&lt;IPropertyValueStatics&gt; propertyValueStatics;
+    HRESULT result = GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_PropertyValue).Get(), &amp;propertyValueStatics);
+    EXPECT_HRESULT_SUCCEEDED(result);
+
+    result = propertyValueStatics.CopyTo(propertyStatics);
+    EXPECT_HRESULT_SUCCEEDED(result);
+
+    return result;
+}
+
</ins><span class="cx"> HRESULT SetInspectablePropertyValue(const ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt;&amp; propertyMap, const wchar_t* propertyName, IInspectable* inspectable)
</span><span class="cx"> {
</span><span class="cx">     boolean propertyReplaced = false;
</span><span class="cx">     return propertyMap-&gt;Insert(HStringReference(propertyName).Get(), inspectable, &amp;propertyReplaced);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void expectNativeWindowInitCalls(MockCoreWindow &amp;coreWindow, bool expectBounds)
+{
+    if (expectBounds)
+    {
+        EXPECT_CALL(coreWindow, get_Bounds(testing::_)).Times(1);
+    }
+
+    EXPECT_CALL(coreWindow, add_SizeChanged(testing::_, testing::_)).Times(1);
+    EXPECT_CALL(coreWindow, remove_SizeChanged(testing::_)).Times(1);
+}
+
</ins><span class="cx"> TEST(NativeWindowTest, NativeWindowNull)
</span><span class="cx"> {
</span><span class="cx">     NativeWindow nativeWindow(nullptr);
</span><span class="lines">@@ -191,9 +214,7 @@
</span><span class="cx"> TEST(NativeWindowTest, NativeWindowValidCoreWindow)
</span><span class="cx"> {
</span><span class="cx">     MockCoreWindow mockCoreWindow;
</span><del>-    EXPECT_CALL(mockCoreWindow, get_Bounds(testing::_)).Times(1);
-    EXPECT_CALL(mockCoreWindow, add_SizeChanged(testing::_, testing::_)).Times(1);
-    EXPECT_CALL(mockCoreWindow, remove_SizeChanged(testing::_)).Times(1);
</del><ins>+    expectNativeWindowInitCalls(mockCoreWindow, true);
</ins><span class="cx">     NativeWindow nativeWindow(&amp;mockCoreWindow);
</span><span class="cx">     EXPECT_TRUE(nativeWindow.initialize());
</span><span class="cx"> }
</span><span class="lines">@@ -205,11 +226,12 @@
</span><span class="cx">     {
</span><span class="cx">         MockCoreWindow mockCoreWindow;
</span><span class="cx">         ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt; propertySet;
</span><del>-        EXPECT_CALL(mockCoreWindow, get_Bounds(testing::_)).Times(1);
-        EXPECT_CALL(mockCoreWindow, add_SizeChanged(testing::_, testing::_)).Times(1);
-        EXPECT_CALL(mockCoreWindow, remove_SizeChanged(testing::_)).Times(1);
</del><ins>+
+        // Add the CoreWindow to the property set
</ins><span class="cx">         EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&amp;propertySet));
</span><span class="cx">         EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty, &amp;mockCoreWindow));
</span><ins>+
+        expectNativeWindowInitCalls(mockCoreWindow, true);
</ins><span class="cx">         NativeWindow nativeWindow(propertySet.Get());
</span><span class="cx">         EXPECT_TRUE(nativeWindow.initialize());
</span><span class="cx">     }
</span><span class="lines">@@ -223,11 +245,112 @@
</span><span class="cx">     {
</span><span class="cx">         MockCoreWindow mockCoreWindow;
</span><span class="cx">         ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt; propertySet;
</span><ins>+
</ins><span class="cx">         EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&amp;propertySet));
</span><ins>+
</ins><span class="cx">         NativeWindow nativeWindow(propertySet.Get());
</span><span class="cx">         EXPECT_FALSE(nativeWindow.initialize());
</span><span class="cx">     }
</span><span class="cx">     CoUninitialize();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// Tests that the scale property works as expected in a property set with a SwapChainPanel
+class CoreWindowScaleTest : public testing::TestWithParam&lt;std::pair&lt;float, bool&gt;&gt;
+{
+};
+
+TEST_P(CoreWindowScaleTest, ValidateScale)
+{
+    float scale = GetParam().first;
+    bool expectedResult = GetParam().second;
+
+    // COM is required to be initialized for creation of the property set
+    EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED));
+    {
+        MockCoreWindow mockCoreWindow;
+        ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt; propertySet;
+        ComPtr&lt;IPropertyValueStatics&gt; propertyValueStatics;
+        ComPtr&lt;IPropertyValue&gt; singleValue;
+
+        // Create a simple property set
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&amp;propertySet));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty, reinterpret_cast&lt;IInspectable*&gt;(&amp;mockCoreWindow)));
+
+        // Add a valid scale factor to the property set
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
+        propertyValueStatics-&gt;CreateSingle(scale, reinterpret_cast&lt;IInspectable**&gt;(singleValue.GetAddressOf()));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLRenderResolutionScaleProperty, reinterpret_cast&lt;IInspectable*&gt;(singleValue.Get())));
+
+        // Check native window init status and calls to the mock swapchainpanel
+        NativeWindow nativeWindow(propertySet.Get());
+        if (expectedResult)
+        {
+            expectNativeWindowInitCalls(mockCoreWindow, true);
+        }
+
+        EXPECT_EQ(nativeWindow.initialize(), expectedResult);
+    }
+    CoUninitialize();
+}
+
+typedef std::pair&lt;float, bool&gt; scaleValidPair;
+static const scaleValidPair scales[] = { scaleValidPair(1.0f,   true),
+                                         scaleValidPair(0.5f,   true),
+                                         scaleValidPair(0.0f,   false),
+                                         scaleValidPair(0.01f,  true),
+                                         scaleValidPair(2.00f,  true) };
+
+INSTANTIATE_TEST_CASE_P(NativeWindowTest,
+                        CoreWindowScaleTest,
+                        testing::ValuesIn(scales));
+
+// Tests that the size property works as expected in a property set with a SwapChainPanel
+class CoreWindowSizeTest : public testing::TestWithParam&lt;std::tuple&lt;float, float, bool&gt;&gt;
+{
+};
+
+TEST_P(CoreWindowSizeTest, ValidateSize)
+{
+    Size renderSize = { std::get&lt;0&gt;(GetParam()), std::get&lt;1&gt;(GetParam()) };
+    bool expectedResult = std::get&lt;2&gt;(GetParam());
+
+    // COM is required to be initialized for creation of the property set
+    EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED));
+    {
+        MockCoreWindow mockCoreWindow;
+        ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt; propertySet;
+        ComPtr&lt;IPropertyValueStatics&gt; propertyValueStatics;
+        ComPtr&lt;IPropertyValue&gt; sizeValue;
+
+        // Create a simple property set
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&amp;propertySet));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty, reinterpret_cast&lt;IInspectable*&gt;(&amp;mockCoreWindow)));
+
+        // Add a valid size to the property set
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
+        propertyValueStatics-&gt;CreateSize(renderSize, reinterpret_cast&lt;IInspectable**&gt;(sizeValue.GetAddressOf()));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLRenderSurfaceSizeProperty, reinterpret_cast&lt;IInspectable*&gt;(sizeValue.Get())));
+
+        // Check native window init status and calls to the mock swapchainpanel
+        NativeWindow nativeWindow(propertySet.Get());
+        if (expectedResult)
+        {
+            expectNativeWindowInitCalls(mockCoreWindow, false);
+        }
+
+        EXPECT_EQ(nativeWindow.initialize(), expectedResult);
+    }
+    CoUninitialize();
+}
+
+typedef std::tuple&lt;float, float, bool&gt; sizeValidPair;
+static const sizeValidPair sizes[] = { sizeValidPair( 800,  480, true),
+                                       sizeValidPair(   0,  480, false),
+                                       sizeValidPair( 800,    0, false),
+                                       sizeValidPair(   0,    0, false) };
+
+INSTANTIATE_TEST_CASE_P(NativeWindowTest,
+                        CoreWindowSizeTest,
+                        testing::ValuesIn(sizes));
+
</ins><span class="cx"> } // namespace
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtInspectableNativeWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,11 +11,22 @@
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><del>-NativeWindow::NativeWindow(EGLNativeWindowType window)
</del><ins>+NativeWindow::NativeWindow(EGLNativeWindowType window,
+                           const egl::Config *config,
+                           bool directComposition)
</ins><span class="cx"> {
</span><span class="cx">     mWindow = window;
</span><ins>+    mConfig = config;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+NativeWindow::~NativeWindow()
+{
+}
+
+void NativeWindow::commitChange()
+{
+}
+
</ins><span class="cx"> bool NativeWindow::initialize()
</span><span class="cx"> {
</span><span class="cx">     // If the native window type is a IPropertySet, extract the
</span><span class="lines">@@ -83,7 +94,9 @@
</span><span class="cx"> {
</span><span class="cx">     if (mImpl)
</span><span class="cx">     {
</span><del>-        return mImpl-&gt;createSwapChain(device, factory, format, width, height, swapChain);
</del><ins>+        bool containsAlpha = (mConfig-&gt;alphaSize &gt; 0);
+        return mImpl-&gt;createSwapChain(device, factory, format, width, height, containsAlpha,
+                                      swapChain);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return E_UNEXPECTED;
</span><span class="lines">@@ -197,16 +210,47 @@
</span><span class="cx"> // A Valid EGLNativeWindowType IInspectable can only be:
</span><span class="cx"> //
</span><span class="cx"> // ICoreWindow
</span><ins>+// ISwapChainPanel
</ins><span class="cx"> // IPropertySet
</span><del>-// 
</del><ins>+//
</ins><span class="cx"> // Anything else will be rejected as an invalid IInspectable.
</span><span class="cx"> bool IsValidEGLNativeWindowType(EGLNativeWindowType window)
</span><span class="cx"> {
</span><span class="cx">     return IsCoreWindow(window) || IsSwapChainPanel(window) || IsEGLConfiguredPropertySet(window);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// Retrieve an optional property from a property set
+HRESULT GetOptionalPropertyValue(const ComPtr&lt;ABI::Windows::Foundation::Collections::IMap&lt;HSTRING, IInspectable*&gt;&gt; &amp;propertyMap,
+                                 const wchar_t *propertyName,
+                                 boolean *hasKey,
+                                 ComPtr&lt;ABI::Windows::Foundation::IPropertyValue&gt; &amp;propertyValue)
+{
+    if (!propertyMap || !hasKey)
+    {
+        return E_INVALIDARG;
+    }
+
+    // Assume that the value does not exist
+    *hasKey = false;
+
+    HRESULT result = propertyMap-&gt;HasKey(HStringReference(propertyName).Get(), hasKey);
+    if (SUCCEEDED(result) &amp;&amp; !(*hasKey))
+    {
+        // Value does not exist, so return S_OK and set the exists parameter to false to indicate
+        // that a the optional property does not exist.
+        return S_OK;
+    }
+
+    if (SUCCEEDED(result))
+    {
+        result = propertyMap-&gt;Lookup(HStringReference(propertyName).Get(), &amp;propertyValue);
+    }
+
+    return result;
+}
+
</ins><span class="cx"> // Attempts to read an optional SIZE property value that is assumed to be in the form of
</span><del>-// an ABI::Windows::Foundation::Size.  This function validates the Size value before returning 
</del><ins>+// an ABI::Windows::Foundation::Size.  This function validates the Size value before returning
</ins><span class="cx"> // it to the caller.
</span><span class="cx"> //
</span><span class="cx"> // Possible return values are:
</span><span class="lines">@@ -217,63 +261,112 @@
</span><span class="cx"> //    * Invalid property value (width/height must be &gt; 0)
</span><span class="cx"> // Additional errors may be returned from IMap or IPropertyValue
</span><span class="cx"> //
</span><del>-HRESULT GetOptionalSizePropertyValue(const ComPtr&lt;ABI::Windows::Foundation::Collections::IMap&lt;HSTRING, IInspectable*&gt;&gt;&amp; propertyMap, const wchar_t *propertyName, SIZE *value, bool *valueExists)
</del><ins>+HRESULT GetOptionalSizePropertyValue(const ComPtr&lt;ABI::Windows::Foundation::Collections::IMap&lt;HSTRING, IInspectable*&gt;&gt; &amp;propertyMap,
+                                     const wchar_t *propertyName, SIZE *value, bool *valueExists)
</ins><span class="cx"> {
</span><del>-    if (!propertyMap || !propertyName || !value || !valueExists)
</del><ins>+    ComPtr&lt;ABI::Windows::Foundation::IPropertyValue&gt; propertyValue;
+    ABI::Windows::Foundation::PropertyType propertyType = ABI::Windows::Foundation::PropertyType::PropertyType_Empty;
+    Size sizeValue = { 0, 0 };
+    boolean hasKey = false;
+
+    if (!propertyMap || !value || !valueExists)
</ins><span class="cx">     {
</span><del>-        return false;
</del><ins>+        return E_INVALIDARG;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Assume that the value does not exist
</span><span class="cx">     *valueExists = false;
</span><span class="cx">     *value = { 0, 0 };
</span><span class="cx"> 
</span><ins>+    HRESULT result = GetOptionalPropertyValue(propertyMap, propertyName, &amp;hasKey, propertyValue);
+    if (SUCCEEDED(result) &amp;&amp; hasKey)
+    {
+        result = propertyValue-&gt;get_Type(&amp;propertyType);
+
+        // Check if the expected Size property is of PropertyType_Size type.
+        if (SUCCEEDED(result) &amp;&amp; propertyType == ABI::Windows::Foundation::PropertyType::PropertyType_Size)
+        {
+            if (SUCCEEDED(propertyValue-&gt;GetSize(&amp;sizeValue)) &amp;&amp; (sizeValue.Width &gt; 0 &amp;&amp; sizeValue.Height &gt; 0))
+            {
+                // A valid property value exists
+                *value = { static_cast&lt;long&gt;(sizeValue.Width), static_cast&lt;long&gt;(sizeValue.Height) };
+                *valueExists = true;
+                result = S_OK;
+            }
+            else
+            {
+                // An invalid Size property was detected. Width/Height values must &gt; 0
+                result = E_INVALIDARG;
+            }
+        }
+        else
+        {
+            // An invalid property type was detected. Size property must be of PropertyType_Size
+            result = E_INVALIDARG;
+        }
+    }
+
+    return result;
+}
+
+// Attempts to read an optional float property value that is assumed to be in the form of
+// an ABI::Windows::Foundation::Single.  This function validates the Single value before returning
+// it to the caller.
+//
+// Possible return values are:
+// S_OK, valueExists == true - optional Single value was successfully retrieved and validated
+// S_OK, valueExists == false - optional Single value was not found
+// E_INVALIDARG, valueExists = false - optional Single value was malformed in the property set.
+//    * Incorrect property type ( must be PropertyType_Single)
+//    * Invalid property value (must be &gt; 0)
+// Additional errors may be returned from IMap or IPropertyValue
+//
+HRESULT GetOptionalSinglePropertyValue(const ComPtr&lt;ABI::Windows::Foundation::Collections::IMap&lt;HSTRING, IInspectable*&gt;&gt; &amp;propertyMap,
+                                       const wchar_t *propertyName, float *value, bool *valueExists)
+{
</ins><span class="cx">     ComPtr&lt;ABI::Windows::Foundation::IPropertyValue&gt; propertyValue;
</span><span class="cx">     ABI::Windows::Foundation::PropertyType propertyType = ABI::Windows::Foundation::PropertyType::PropertyType_Empty;
</span><del>-    Size sizeValue = { 0, 0 };
</del><ins>+    float scaleValue = 0.0f;
</ins><span class="cx">     boolean hasKey = false;
</span><span class="cx"> 
</span><del>-    HRESULT result = propertyMap-&gt;HasKey(HStringReference(propertyName).Get(), &amp;hasKey);
-    if (SUCCEEDED(result) &amp;&amp; !hasKey)
</del><ins>+    if (!propertyMap || !value || !valueExists)
</ins><span class="cx">     {
</span><del>-        // Value does not exist, so return S_OK and set the exists parameter to false to indicate
-        // that a the optional property does not exist.
-        *valueExists = false;
-        return S_OK;
</del><ins>+        return E_INVALIDARG;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (SUCCEEDED(result))
-    {
-        result = propertyMap-&gt;Lookup(HStringReference(propertyName).Get(), &amp;propertyValue);
-    }
</del><ins>+    // Assume that the value does not exist
+    *valueExists = false;
+    *value = 0.0f;
</ins><span class="cx"> 
</span><del>-    if (SUCCEEDED(result))
</del><ins>+    HRESULT result = GetOptionalPropertyValue(propertyMap, propertyName, &amp;hasKey, propertyValue);
+    if (SUCCEEDED(result) &amp;&amp; hasKey)
</ins><span class="cx">     {
</span><span class="cx">         result = propertyValue-&gt;get_Type(&amp;propertyType);
</span><del>-    }
</del><span class="cx"> 
</span><del>-    // Check if the expected Size property is of PropertyType_Size type.
-    if (SUCCEEDED(result) &amp;&amp; propertyType == ABI::Windows::Foundation::PropertyType::PropertyType_Size)
-    {
-        if (SUCCEEDED(propertyValue-&gt;GetSize(&amp;sizeValue)) &amp;&amp; (sizeValue.Width &gt; 0 &amp;&amp; sizeValue.Height &gt; 0))
</del><ins>+        // Check if the expected Scale property is of PropertyType_Single type.
+        if (SUCCEEDED(result) &amp;&amp; propertyType == ABI::Windows::Foundation::PropertyType::PropertyType_Single)
</ins><span class="cx">         {
</span><del>-            // A valid property value exists
-            *value = { static_cast&lt;long&gt;(sizeValue.Width), static_cast&lt;long&gt;(sizeValue.Height) };
-            *valueExists = true;
-            result = S_OK;
</del><ins>+            if (SUCCEEDED(propertyValue-&gt;GetSingle(&amp;scaleValue)) &amp;&amp; (scaleValue &gt; 0.0f))
+            {
+                // A valid property value exists
+                *value = scaleValue;
+                *valueExists = true;
+                result = S_OK;
+            }
+            else
+            {
+                // An invalid scale was set
+                result = E_INVALIDARG;
+            }
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            // An invalid Size property was detected. Width/Height values must &gt; 0
</del><ins>+            // An invalid property type was detected. Size property must be of PropertyType_Single
</ins><span class="cx">             result = E_INVALIDARG;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    else
-    {
-        // An invalid property type was detected. Size property must be of PropertyType_Size
-        result = E_INVALIDARG;
-    }
</del><span class="cx"> 
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><ins>+
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtInspectableNativeWindowh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -31,7 +31,9 @@
</span><span class="cx">   public:
</span><span class="cx">     InspectableNativeWindow() :
</span><span class="cx">         mSupportsSwapChainResize(true),
</span><del>-        mRequiresSwapChainScaling(false),
</del><ins>+        mSwapChainSizeSpecified(false),
+        mSwapChainScaleSpecified(false),
+        mSwapChainScale(1.0f),
</ins><span class="cx">         mClientRectChanged(false),
</span><span class="cx">         mClientRect({0,0,0,0}),
</span><span class="cx">         mNewClientRect({0,0,0,0})
</span><span class="lines">@@ -41,14 +43,17 @@
</span><span class="cx">     virtual ~InspectableNativeWindow(){}
</span><span class="cx"> 
</span><span class="cx">     virtual bool initialize(EGLNativeWindowType window, IPropertySet *propertySet) = 0;
</span><del>-    virtual HRESULT createSwapChain(ID3D11Device *device, DXGIFactory *factory, DXGI_FORMAT format, unsigned int width, unsigned int height, DXGISwapChain **swapChain) = 0;
-    virtual bool registerForSizeChangeEvents() = 0;
-    virtual void unregisterForSizeChangeEvents() = 0;
-    virtual HRESULT scaleSwapChain(const SIZE&amp; newSize) { return S_OK; }
</del><ins>+    virtual HRESULT createSwapChain(ID3D11Device *device,
+                                    DXGIFactory *factory,
+                                    DXGI_FORMAT format,
+                                    unsigned int width,
+                                    unsigned int height,
+                                    bool containsAlpha,
+                                    DXGISwapChain **swapChain) = 0;
</ins><span class="cx"> 
</span><span class="cx">     bool getClientRect(RECT *rect)
</span><span class="cx">     {
</span><del>-        if (mClientRectChanged &amp;&amp; mSupportsSwapChainResize)
</del><ins>+        if (mClientRectChanged)
</ins><span class="cx">         {
</span><span class="cx">             mClientRect = mNewClientRect;
</span><span class="cx">         }
</span><span class="lines">@@ -58,23 +63,44 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void setNewClientSize(const SIZE &amp;newSize)
</del><ins>+    // setNewClientSize is used by the WinRT size change handler. It isn't used by the rest of ANGLE.
+    void setNewClientSize(const SIZE &amp;newWindowSize)
</ins><span class="cx">     {
</span><del>-        if (mSupportsSwapChainResize &amp;&amp; !mRequiresSwapChainScaling)
</del><ins>+        // If the client doesn't support swapchain resizing then we should have already unregistered from size change handler
+        ASSERT(mSupportsSwapChainResize);
+
+        if (mSupportsSwapChainResize)
</ins><span class="cx">         {
</span><del>-            mNewClientRect = { 0, 0, newSize.cx, newSize.cy };
-            mClientRectChanged = true;
-        }
</del><ins>+            // If the swapchain size was specified then we should ignore this call too
+            if (!mSwapChainSizeSpecified)
+            {
+                // We don't have to check if a swapchain scale was specified here; the default value is 1.0f which will have no effect.
+                mNewClientRect = { 0, 0, static_cast&lt;long&gt;(newWindowSize.cx * mSwapChainScale), static_cast&lt;long&gt;(newWindowSize.cy * mSwapChainScale) };
+                mClientRectChanged = true;
</ins><span class="cx"> 
</span><del>-        if (mRequiresSwapChainScaling)
-        {
-            scaleSwapChain(newSize);
</del><ins>+                // If a scale was specified, then now is the time to apply the scale matrix for the new swapchain size and window size
+                if (mSwapChainScaleSpecified)
+                {
+                    scaleSwapChain(newWindowSize, mNewClientRect);
+                }
+            }
+
+            // Even if the swapchain size was fixed, the window might have changed size.
+            // In this case, we should recalculate the scale matrix to account for the new window size
+            if (mSwapChainSizeSpecified)
+            {
+                scaleSwapChain(newWindowSize, mClientRect);
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-protected:
-    bool mSupportsSwapChainResize;
-    bool mRequiresSwapChainScaling;
</del><ins>+  protected:
+    virtual HRESULT scaleSwapChain(const SIZE &amp;windowSize, const RECT &amp;clientRect) = 0;
+
+    bool mSupportsSwapChainResize; // Support for IDXGISwapChain::ResizeBuffers method
+    bool mSwapChainSizeSpecified;  // If an EGLRenderSurfaceSizeProperty was specified
+    bool mSwapChainScaleSpecified; // If an EGLRenderResolutionScaleProperty was specified
+    float mSwapChainScale;         // The scale value specified by the EGLRenderResolutionScaleProperty property
</ins><span class="cx">     RECT mClientRect;
</span><span class="cx">     RECT mNewClientRect;
</span><span class="cx">     bool mClientRectChanged;
</span><span class="lines">@@ -86,8 +112,17 @@
</span><span class="cx"> bool IsCoreWindow(EGLNativeWindowType window, ComPtr&lt;ABI::Windows::UI::Core::ICoreWindow&gt; *coreWindow = nullptr);
</span><span class="cx"> bool IsSwapChainPanel(EGLNativeWindowType window, ComPtr&lt;ABI::Windows::UI::Xaml::Controls::ISwapChainPanel&gt; *swapChainPanel = nullptr);
</span><span class="cx"> bool IsEGLConfiguredPropertySet(EGLNativeWindowType window, ABI::Windows::Foundation::Collections::IPropertySet **propertySet = nullptr, IInspectable **inspectable = nullptr);
</span><del>-HRESULT GetOptionalSizePropertyValue(const ComPtr&lt;ABI::Windows::Foundation::Collections::IMap&lt;HSTRING, IInspectable*&gt;&gt;&amp; propertyMap, const wchar_t *propertyName, SIZE *value, bool *valueExists);
</del><span class="cx"> 
</span><ins>+HRESULT GetOptionalPropertyValue(const ComPtr&lt;ABI::Windows::Foundation::Collections::IMap&lt;HSTRING, IInspectable*&gt;&gt; &amp;propertyMap,
+                                 const wchar_t *propertyName,
+                                 boolean *hasKey,
+                                 ComPtr&lt;ABI::Windows::Foundation::IPropertyValue&gt; &amp;propertyValue);
+
+HRESULT GetOptionalSizePropertyValue(const ComPtr&lt;ABI::Windows::Foundation::Collections::IMap&lt;HSTRING, IInspectable*&gt;&gt; &amp;propertyMap,
+                                     const wchar_t *propertyName, SIZE *value, bool *valueExists);
+
+HRESULT GetOptionalSinglePropertyValue(const ComPtr&lt;ABI::Windows::Foundation::Collections::IMap&lt;HSTRING, IInspectable*&gt;&gt; &amp;propertyMap,
+                                       const wchar_t *propertyName, float *value, bool *valueExists);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_INSPECTABLENATIVEWINDOW_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtSwapChainPanelNativeWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,7 +11,11 @@
</span><span class="cx"> #include &lt;algorithm&gt;
</span><span class="cx"> #include &lt;math.h&gt;
</span><span class="cx"> 
</span><ins>+using namespace ABI::Windows::Foundation;
</ins><span class="cx"> using namespace ABI::Windows::Foundation::Collections;
</span><ins>+using namespace ABI::Windows::UI::Core;
+using namespace ABI::Windows::UI::Xaml;
+using namespace Microsoft::WRL;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -20,12 +24,74 @@
</span><span class="cx">     unregisterForSizeChangeEvents();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template &lt;typename T&gt;
+struct AddFtmBase
+{
+    typedef Implements&lt;RuntimeClassFlags&lt;ClassicCom&gt;, T, FtmBase&gt; Type;
+};
+
+template &lt;typename CODE&gt;
+HRESULT RunOnUIThread(CODE &amp;&amp;code, const ComPtr&lt;ICoreDispatcher&gt; &amp;dispatcher)
+{
+    ComPtr&lt;IAsyncAction&gt; asyncAction;
+    HRESULT result = S_OK;
+
+    boolean hasThreadAccess;
+    result = dispatcher-&gt;get_HasThreadAccess(&amp;hasThreadAccess);
+    if (FAILED(result))
+    {
+        return result;
+    }
+
+    if (hasThreadAccess)
+    {
+        return code();
+    }
+    else
+    {
+        Event waitEvent(CreateEventEx(NULL, NULL, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS));
+        if (!waitEvent.IsValid())
+        {
+            return E_FAIL;
+        }
+
+        HRESULT codeResult = E_FAIL;
+        auto handler =
+            Callback&lt;AddFtmBase&lt;IDispatchedHandler&gt;::Type&gt;([&amp;codeResult, &amp;code, &amp;waitEvent]
+                                                           {
+                                                               codeResult = code();
+                                                               SetEvent(waitEvent.Get());
+                                                               return S_OK;
+                                                           });
+
+        result = dispatcher-&gt;RunAsync(CoreDispatcherPriority_Normal, handler.Get(),
+                                      asyncAction.GetAddressOf());
+        if (FAILED(result))
+        {
+            return result;
+        }
+
+        auto waitResult = WaitForSingleObjectEx(waitEvent.Get(), 10 * 1000, true);
+        if (waitResult != WAIT_OBJECT_0)
+        {
+            // Wait 10 seconds before giving up. At this point, the application is in an
+            // unrecoverable state (probably deadlocked). We therefore terminate the application
+            // entirely. This also prevents stack corruption if the async operation is eventually
+            // run.
+            ERR(&quot;Timeout waiting for async action on UI thread. The UI thread might be blocked.&quot;);
+            std::terminate();
+            return E_FAIL;
+        }
+
+        return codeResult;
+    }
+}
+
</ins><span class="cx"> bool SwapChainPanelNativeWindow::initialize(EGLNativeWindowType window, IPropertySet *propertySet)
</span><span class="cx"> {
</span><span class="cx">     ComPtr&lt;IPropertySet&gt; props = propertySet;
</span><span class="cx">     ComPtr&lt;IInspectable&gt; win = window;
</span><span class="cx">     SIZE swapChainSize = {};
</span><del>-    bool swapChainSizeSpecified = false;
</del><span class="cx">     HRESULT result = S_OK;
</span><span class="cx"> 
</span><span class="cx">     // IPropertySet is an optional parameter and can be null.
</span><span class="lines">@@ -34,13 +100,41 @@
</span><span class="cx">     if (propertySet)
</span><span class="cx">     {
</span><span class="cx">         result = props.As(&amp;mPropertyMap);
</span><del>-        if (SUCCEEDED(result))
</del><ins>+        if (FAILED(result))
</ins><span class="cx">         {
</span><del>-            // The EGLRenderSurfaceSizeProperty is optional and may be missing.  The IPropertySet
-            // was prevalidated to contain the EGLNativeWindowType before being passed to
-            // this host.
-            result = GetOptionalSizePropertyValue(mPropertyMap, EGLRenderSurfaceSizeProperty, &amp;swapChainSize, &amp;swapChainSizeSpecified);
</del><ins>+            return false;
</ins><span class="cx">         }
</span><ins>+
+        // The EGLRenderSurfaceSizeProperty is optional and may be missing. The IPropertySet
+        // was prevalidated to contain the EGLNativeWindowType before being passed to
+        // this host.
+        result = GetOptionalSizePropertyValue(mPropertyMap, EGLRenderSurfaceSizeProperty, &amp;swapChainSize, &amp;mSwapChainSizeSpecified);
+        if (FAILED(result))
+        {
+            return false;
+        }
+
+        // The EGLRenderResolutionScaleProperty is optional and may be missing. The IPropertySet
+        // was prevalidated to contain the EGLNativeWindowType before being passed to
+        // this host.
+        result = GetOptionalSinglePropertyValue(mPropertyMap, EGLRenderResolutionScaleProperty, &amp;mSwapChainScale, &amp;mSwapChainScaleSpecified);
+        if (FAILED(result))
+        {
+            return false;
+        }
+
+        if (!mSwapChainScaleSpecified)
+        {
+            // Default value for the scale is 1.0f
+            mSwapChainScale = 1.0f;
+        }
+
+        // A EGLRenderSurfaceSizeProperty and a EGLRenderResolutionScaleProperty can't both be specified
+        if (mSwapChainScaleSpecified &amp;&amp; mSwapChainSizeSpecified)
+        {
+            ERR(&quot;It is invalid to specify both an EGLRenderSurfaceSizeProperty and a EGLRenderResolutionScaleProperty.&quot;);
+            return false;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="lines">@@ -48,8 +142,20 @@
</span><span class="cx">         result = win.As(&amp;mSwapChainPanel);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    ComPtr&lt;IDependencyObject&gt; swapChainPanelDependencyObject;
</ins><span class="cx">     if (SUCCEEDED(result))
</span><span class="cx">     {
</span><ins>+        result = mSwapChainPanel.As(&amp;swapChainPanelDependencyObject);
+    }
+
+    if (SUCCEEDED(result))
+    {
+        result = swapChainPanelDependencyObject-&gt;get_Dispatcher(
+            mSwapChainPanelDispatcher.GetAddressOf());
+    }
+
+    if (SUCCEEDED(result))
+    {
</ins><span class="cx">         // If a swapchain size is specfied, then the automatic resize
</span><span class="cx">         // behaviors implemented by the host should be disabled.  The swapchain
</span><span class="cx">         // will be still be scaled when being rendered to fit the bounds
</span><span class="lines">@@ -57,16 +163,21 @@
</span><span class="cx">         // Scaling of the swapchain output needs to be handled by the
</span><span class="cx">         // host for swapchain panels even though the scaling mode setting
</span><span class="cx">         // DXGI_SCALING_STRETCH is configured on the swapchain.
</span><del>-        if (swapChainSizeSpecified)
</del><ins>+        if (mSwapChainSizeSpecified)
</ins><span class="cx">         {
</span><span class="cx">             mClientRect = { 0, 0, swapChainSize.cx, swapChainSize.cy };
</span><del>-
-            // Enable host swapchain scaling
-            mRequiresSwapChainScaling = true;
</del><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            result = GetSwapChainPanelSize(mSwapChainPanel, &amp;mClientRect);
</del><ins>+            SIZE swapChainPanelSize;
+            result = GetSwapChainPanelSize(mSwapChainPanel, mSwapChainPanelDispatcher,
+                                           &amp;swapChainPanelSize);
+
+            if (SUCCEEDED(result))
+            {
+                // Update the client rect to account for any swapchain scale factor
+                mClientRect = { 0, 0, static_cast&lt;long&gt;(swapChainPanelSize.cx * mSwapChainScale), static_cast&lt;long&gt;(swapChainPanelSize.cy * mSwapChainScale) };
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -82,8 +193,8 @@
</span><span class="cx"> 
</span><span class="cx"> bool SwapChainPanelNativeWindow::registerForSizeChangeEvents()
</span><span class="cx"> {
</span><del>-    ComPtr&lt;ABI::Windows::UI::Xaml::ISizeChangedEventHandler&gt; sizeChangedHandler;
-    ComPtr&lt;ABI::Windows::UI::Xaml::IFrameworkElement&gt; frameworkElement;
</del><ins>+    ComPtr&lt;ISizeChangedEventHandler&gt; sizeChangedHandler;
+    ComPtr&lt;IFrameworkElement&gt; frameworkElement;
</ins><span class="cx">     HRESULT result = Microsoft::WRL::MakeAndInitialize&lt;SwapChainPanelSizeChangedHandler&gt;(sizeChangedHandler.ReleaseAndGetAddressOf(), this-&gt;shared_from_this());
</span><span class="cx"> 
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="lines">@@ -93,7 +204,13 @@
</span><span class="cx"> 
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="cx">     {
</span><del>-        result = frameworkElement-&gt;add_SizeChanged(sizeChangedHandler.Get(), &amp;mSizeChangedEventToken);
</del><ins>+        result = RunOnUIThread(
+            [this, frameworkElement, sizeChangedHandler]
+            {
+                return frameworkElement-&gt;add_SizeChanged(sizeChangedHandler.Get(),
+                                                         &amp;mSizeChangedEventToken);
+            },
+            mSwapChainPanelDispatcher);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="lines">@@ -106,16 +223,27 @@
</span><span class="cx"> 
</span><span class="cx"> void SwapChainPanelNativeWindow::unregisterForSizeChangeEvents()
</span><span class="cx"> {
</span><del>-    ComPtr&lt;ABI::Windows::UI::Xaml::IFrameworkElement&gt; frameworkElement;
-    if (SUCCEEDED(mSwapChainPanel.As(&amp;frameworkElement)))
</del><ins>+    ComPtr&lt;IFrameworkElement&gt; frameworkElement;
+    if (mSwapChainPanel &amp;&amp; SUCCEEDED(mSwapChainPanel.As(&amp;frameworkElement)))
</ins><span class="cx">     {
</span><del>-        (void)frameworkElement-&gt;remove_SizeChanged(mSizeChangedEventToken);
</del><ins>+        RunOnUIThread(
+            [this, frameworkElement]
+            {
+                return frameworkElement-&gt;remove_SizeChanged(mSizeChangedEventToken);
+            },
+            mSwapChainPanelDispatcher);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mSizeChangedEventToken.value = 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-HRESULT SwapChainPanelNativeWindow::createSwapChain(ID3D11Device *device, DXGIFactory *factory, DXGI_FORMAT format, unsigned int width, unsigned int height, DXGISwapChain **swapChain)
</del><ins>+HRESULT SwapChainPanelNativeWindow::createSwapChain(ID3D11Device *device,
+                                                    DXGIFactory *factory,
+                                                    DXGI_FORMAT format,
+                                                    unsigned int width,
+                                                    unsigned int height,
+                                                    bool containsAlpha,
+                                                    DXGISwapChain **swapChain)
</ins><span class="cx"> {
</span><span class="cx">     if (device == NULL || factory == NULL || swapChain == NULL || width == 0 || height == 0)
</span><span class="cx">     {
</span><span class="lines">@@ -129,17 +257,19 @@
</span><span class="cx">     swapChainDesc.Stereo = FALSE;
</span><span class="cx">     swapChainDesc.SampleDesc.Count = 1;
</span><span class="cx">     swapChainDesc.SampleDesc.Quality = 0;
</span><del>-    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER;
</del><ins>+    swapChainDesc.BufferUsage =
+        DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER;
</ins><span class="cx">     swapChainDesc.BufferCount = 2;
</span><span class="cx">     swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
</span><span class="cx">     swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
</span><del>-    swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
</del><ins>+    swapChainDesc.AlphaMode =
+        containsAlpha ? DXGI_ALPHA_MODE_PREMULTIPLIED : DXGI_ALPHA_MODE_IGNORE;
</ins><span class="cx"> 
</span><span class="cx">     *swapChain = nullptr;
</span><span class="cx"> 
</span><span class="cx">     ComPtr&lt;IDXGISwapChain1&gt; newSwapChain;
</span><span class="cx">     ComPtr&lt;ISwapChainPanelNative&gt; swapChainPanelNative;
</span><del>-    RECT currentPanelSize = {};
</del><ins>+    SIZE currentPanelSize = {};
</ins><span class="cx"> 
</span><span class="cx">     HRESULT result = factory-&gt;CreateSwapChainForComposition(device, &amp;swapChainDesc, nullptr, newSwapChain.ReleaseAndGetAddressOf());
</span><span class="cx"> 
</span><span class="lines">@@ -150,7 +280,12 @@
</span><span class="cx"> 
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="cx">     {
</span><del>-        result = swapChainPanelNative-&gt;SetSwapChain(newSwapChain.Get());
</del><ins>+        result = RunOnUIThread(
+            [swapChainPanelNative, newSwapChain]
+            {
+                return swapChainPanelNative-&gt;SetSwapChain(newSwapChain.Get());
+            },
+            mSwapChainPanelDispatcher);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="lines">@@ -165,34 +300,28 @@
</span><span class="cx">     // If the host is responsible for scaling the output of the swapchain, then
</span><span class="cx">     // scale it now before returning an instance to the caller.  This is done by
</span><span class="cx">     // first reading the current size of the swapchain panel, then scaling
</span><del>-    if (SUCCEEDED(result) &amp;&amp; mRequiresSwapChainScaling)
-    {
-        result = GetSwapChainPanelSize(mSwapChainPanel, &amp;currentPanelSize);
-    }
-
-    // Scale the swapchain to fit inside the contents of the panel.
-    if (SUCCEEDED(result) &amp;&amp; mRequiresSwapChainScaling)
-    {
-        SIZE currentSize = { currentPanelSize.right, currentPanelSize.bottom };
-        result = scaleSwapChain(currentSize);
-    }
-
</del><span class="cx">     if (SUCCEEDED(result))
</span><span class="cx">     {
</span><del>-        // If automatic swapchain resize behaviors have been disabled, then
-        // unregister for the resize change events.
-        if (mSupportsSwapChainResize == false)
</del><ins>+        if (mSwapChainSizeSpecified || mSwapChainScaleSpecified)
</ins><span class="cx">         {
</span><del>-            unregisterForSizeChangeEvents();
</del><ins>+            result = GetSwapChainPanelSize(mSwapChainPanel, mSwapChainPanelDispatcher,
+                                           &amp;currentPanelSize);
+
+            // Scale the swapchain to fit inside the contents of the panel.
+            if (SUCCEEDED(result))
+            {
+                result = scaleSwapChain(currentPanelSize, mClientRect);
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-HRESULT SwapChainPanelNativeWindow::scaleSwapChain(const SIZE &amp;newSize)
</del><ins>+HRESULT SwapChainPanelNativeWindow::scaleSwapChain(const SIZE &amp;windowSize, const RECT &amp;clientRect)
</ins><span class="cx"> {
</span><del>-    ABI::Windows::Foundation::Size renderScale = { (float)newSize.cx/(float)mClientRect.right, (float)newSize.cy/(float)mClientRect.bottom };
</del><ins>+    Size renderScale = {(float)windowSize.cx / (float)clientRect.right,
+                        (float)windowSize.cy / (float)clientRect.bottom};
</ins><span class="cx">     // Setup a scale matrix for the swap chain
</span><span class="cx">     DXGI_MATRIX_3X2_F scaleMatrix = {};
</span><span class="cx">     scaleMatrix._11 = renderScale.Width;
</span><span class="lines">@@ -208,21 +337,29 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-HRESULT GetSwapChainPanelSize(const ComPtr&lt;ABI::Windows::UI::Xaml::Controls::ISwapChainPanel&gt; &amp;swapChainPanel, RECT *windowSize)
</del><ins>+HRESULT GetSwapChainPanelSize(
+    const ComPtr&lt;ABI::Windows::UI::Xaml::Controls::ISwapChainPanel&gt; &amp;swapChainPanel,
+    const ComPtr&lt;ICoreDispatcher&gt; &amp;dispatcher,
+    SIZE *windowSize)
</ins><span class="cx"> {
</span><del>-    ComPtr&lt;ABI::Windows::UI::Xaml::IUIElement&gt; uiElement;
-    ABI::Windows::Foundation::Size renderSize = { 0, 0 };
</del><ins>+    ComPtr&lt;IUIElement&gt; uiElement;
+    Size renderSize = {0, 0};
</ins><span class="cx">     HRESULT result = swapChainPanel.As(&amp;uiElement);
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="cx">     {
</span><del>-        result = uiElement-&gt;get_RenderSize(&amp;renderSize);
</del><ins>+        result = RunOnUIThread(
+            [uiElement, &amp;renderSize]
+            {
+                return uiElement-&gt;get_RenderSize(&amp;renderSize);
+            },
+            dispatcher);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (SUCCEEDED(result))
</span><span class="cx">     {
</span><del>-        *windowSize = { 0, 0, lround(renderSize.Width), lround(renderSize.Height) };
</del><ins>+        *windowSize = { lround(renderSize.Width), lround(renderSize.Height) };
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><del>-}
</del><ins>+}
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtSwapChainPanelNativeWindowh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,14 +18,24 @@
</span><span class="cx">   public:
</span><span class="cx">     ~SwapChainPanelNativeWindow();
</span><span class="cx"> 
</span><del>-    bool initialize(EGLNativeWindowType window, IPropertySet *propertySet);
</del><ins>+    bool initialize(EGLNativeWindowType window, IPropertySet *propertySet) override;
+    HRESULT createSwapChain(ID3D11Device *device,
+                            DXGIFactory *factory,
+                            DXGI_FORMAT format,
+                            unsigned int width,
+                            unsigned int height,
+                            bool containsAlpha,
+                            DXGISwapChain **swapChain) override;
+
+  protected:
+    HRESULT scaleSwapChain(const SIZE &amp;windowSize, const RECT &amp;clientRect) override;
+
</ins><span class="cx">     bool registerForSizeChangeEvents();
</span><span class="cx">     void unregisterForSizeChangeEvents();
</span><del>-    HRESULT createSwapChain(ID3D11Device *device, DXGIFactory *factory, DXGI_FORMAT format, unsigned int width, unsigned int height, DXGISwapChain **swapChain);
-    HRESULT scaleSwapChain(const SIZE &amp;newSize);
</del><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     ComPtr&lt;ABI::Windows::UI::Xaml::Controls::ISwapChainPanel&gt; mSwapChainPanel;
</span><ins>+    ComPtr&lt;ABI::Windows::UI::Core::ICoreDispatcher&gt; mSwapChainPanelDispatcher;
</ins><span class="cx">     ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt; mPropertyMap;
</span><span class="cx">     ComPtr&lt;DXGISwapChain&gt; mSwapChain;
</span><span class="cx"> };
</span><span class="lines">@@ -74,6 +84,9 @@
</span><span class="cx">     std::weak_ptr&lt;InspectableNativeWindow&gt; mHost;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-HRESULT GetSwapChainPanelSize(const ComPtr&lt;ABI::Windows::UI::Xaml::Controls::ISwapChainPanel&gt; &amp;swapChainPanel, RECT *windowSize);
</del><ins>+HRESULT GetSwapChainPanelSize(
+    const ComPtr&lt;ABI::Windows::UI::Xaml::Controls::ISwapChainPanel&gt; &amp;swapChainPanel,
+    const ComPtr&lt;ABI::Windows::UI::Core::ICoreDispatcher&gt; &amp;dispatcher,
+    SIZE *windowSize);
</ins><span class="cx"> }
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_D3D11_WINRT_SWAPCHAINPANELNATIVEWINDOW_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d11winrtSwapChainPanelNativeWindow_unittestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow_unittest.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow_unittest.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -269,38 +269,192 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+HRESULT CreatePropertyValueStatics(IPropertyValueStatics** propertyStatics)
+{
+    ComPtr&lt;IPropertyValueStatics&gt; propertyValueStatics;
+    HRESULT result = GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_PropertyValue).Get(), &amp;propertyValueStatics);
+    EXPECT_HRESULT_SUCCEEDED(result);
+
+    result = propertyValueStatics.CopyTo(propertyStatics);
+    EXPECT_HRESULT_SUCCEEDED(result);
+
+    return result;
+}
+
</ins><span class="cx"> HRESULT SetInspectablePropertyValue(const ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt;&amp; propertyMap, const wchar_t* propertyName, IInspectable* inspectable)
</span><span class="cx"> {
</span><span class="cx">     boolean propertyReplaced = false;
</span><span class="cx">     return propertyMap-&gt;Insert(HStringReference(propertyName).Get(), inspectable, &amp;propertyReplaced);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TEST(NativeWindowTest, NativeWindowValidSwapChainPanel)
</del><ins>+void expectNativeWindowInitCalls(MockSwapChainPanel &amp;panel, bool expectRenderSize)
</ins><span class="cx"> {
</span><ins>+    if (expectRenderSize)
+    {
+        EXPECT_CALL(panel, get_RenderSize(testing::_)).Times(1);
+    }
+
+    EXPECT_CALL(panel, add_SizeChanged(testing::_, testing::_)).Times(1);
+    EXPECT_CALL(panel, remove_SizeChanged(testing::_)).Times(1);
+}
+
+TEST(NativeWindowTest, SwapChainPanelByItself)
+{
</ins><span class="cx">     MockSwapChainPanel mockSwapChainPanel;
</span><span class="cx">     NativeWindow nativeWindow(reinterpret_cast&lt;IInspectable*&gt;(&amp;mockSwapChainPanel));
</span><del>-    EXPECT_CALL(mockSwapChainPanel, get_RenderSize(testing::_)).Times(1);
-    EXPECT_CALL(mockSwapChainPanel, add_SizeChanged(testing::_, testing::_)).Times(1);
-    EXPECT_CALL(mockSwapChainPanel, remove_SizeChanged(testing::_)).Times(1);
</del><ins>+    expectNativeWindowInitCalls(mockSwapChainPanel, true);
</ins><span class="cx">     EXPECT_TRUE(nativeWindow.initialize());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TEST(NativeWindowTest, NativeWindowValidSwapChainPanelInPropertySet)
</del><ins>+TEST(NativeWindowTest, SwapChainPanelInPropertySet)
</ins><span class="cx"> {
</span><span class="cx">     // COM is required to be initialized for creation of the property set
</span><span class="cx">     EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED));
</span><span class="cx">     {
</span><span class="cx">         MockSwapChainPanel mockSwapChainPanel;
</span><span class="cx">         ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt; propertySet;
</span><ins>+
+        // Create a simple property set with the swapchainpanel
</ins><span class="cx">         EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&amp;propertySet));
</span><span class="cx">         EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty, reinterpret_cast&lt;IInspectable*&gt;(&amp;mockSwapChainPanel)));
</span><ins>+
+        // Check native window init calls
</ins><span class="cx">         NativeWindow nativeWindow(propertySet.Get());
</span><del>-        EXPECT_CALL(mockSwapChainPanel, get_RenderSize(testing::_)).Times(1);
-        EXPECT_CALL(mockSwapChainPanel, add_SizeChanged(testing::_, testing::_)).Times(1);
-        EXPECT_CALL(mockSwapChainPanel, remove_SizeChanged(testing::_)).Times(1);
</del><ins>+        expectNativeWindowInitCalls(mockSwapChainPanel, true);
</ins><span class="cx">         EXPECT_TRUE(nativeWindow.initialize());
</span><span class="cx">     }
</span><span class="cx">     CoUninitialize();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TEST(NativeWindowTest, SwapChainPanelInPropertySetWithSizeAndScale)
+{
+    // COM is required to be initialized for creation of the property set
+    EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED));
+    {
+        MockSwapChainPanel mockSwapChainPanel;
+        ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt; propertySet;
+        ComPtr&lt;IPropertyValueStatics&gt; propertyValueStatics;
+        ComPtr&lt;IPropertyValue&gt; singleValue;
+        ComPtr&lt;IPropertyValue&gt; sizeValue;
+
+        // Create a simple property set with the swapchainpanel
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&amp;propertySet));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty, reinterpret_cast&lt;IInspectable*&gt;(&amp;mockSwapChainPanel)));
+
+        // Add a valid scale factor to the property set
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
+        propertyValueStatics-&gt;CreateSingle(0.5f, reinterpret_cast&lt;IInspectable**&gt;(singleValue.GetAddressOf()));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLRenderResolutionScaleProperty, reinterpret_cast&lt;IInspectable*&gt;(singleValue.Get())));
+
+        // Add a valid size to the property set
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
+        propertyValueStatics-&gt;CreateSize({ 480, 800 }, reinterpret_cast&lt;IInspectable**&gt;(sizeValue.GetAddressOf()));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLRenderSurfaceSizeProperty, reinterpret_cast&lt;IInspectable*&gt;(sizeValue.Get())));
+
+        // Check native window init fails, since we shouldn't be able to set a size and a scale together
+        NativeWindow nativeWindow(propertySet.Get());
+        EXPECT_FALSE(nativeWindow.initialize());
+    }
+    CoUninitialize();
+}
+
+// Tests that the scale property works as expected in a property set with a SwapChainPanel
+class SwapChainPanelScaleTest : public testing::TestWithParam&lt;std::pair&lt;float, bool&gt;&gt;
+{
+};
+
+TEST_P(SwapChainPanelScaleTest, ValidateScale)
+{
+    float scale = GetParam().first;
+    bool expectedResult = GetParam().second;
+
+    // COM is required to be initialized for creation of the property set
+    EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED));
+    {
+        MockSwapChainPanel mockSwapChainPanel;
+        ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt; propertySet;
+        ComPtr&lt;IPropertyValueStatics&gt; propertyValueStatics;
+        ComPtr&lt;IPropertyValue&gt; singleValue;
+
+        // Create a simple property set
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&amp;propertySet));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty, reinterpret_cast&lt;IInspectable*&gt;(&amp;mockSwapChainPanel)));
+
+        // Add a valid scale factor to the property set
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
+        propertyValueStatics-&gt;CreateSingle(scale, reinterpret_cast&lt;IInspectable**&gt;(singleValue.GetAddressOf()));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLRenderResolutionScaleProperty, reinterpret_cast&lt;IInspectable*&gt;(singleValue.Get())));
+
+        // Check native window init status and calls to the mock swapchainpanel
+        NativeWindow nativeWindow(propertySet.Get());
+        if (expectedResult)
+        {
+            expectNativeWindowInitCalls(mockSwapChainPanel, true);
+        }
+
+        EXPECT_EQ(nativeWindow.initialize(), expectedResult);
+    }
+    CoUninitialize();
+}
+
+typedef std::pair&lt;float, bool&gt; scaleValidPair;
+static const scaleValidPair scales[] = { scaleValidPair(1.0f,   true),
+                                         scaleValidPair(0.5f,   true),
+                                         scaleValidPair(0.0f,   false),
+                                         scaleValidPair(0.01f,  true),
+                                         scaleValidPair(2.00f,  true) };
+
+INSTANTIATE_TEST_CASE_P(NativeWindowTest,
+                        SwapChainPanelScaleTest,
+                        testing::ValuesIn(scales));
+
+// Tests that the size property works as expected in a property set with a SwapChainPanel
+class SwapChainPanelSizeTest : public testing::TestWithParam&lt;std::tuple&lt;float, float, bool&gt;&gt;
+{
+};
+
+TEST_P(SwapChainPanelSizeTest, ValidateSize)
+{
+    Size renderSize = { std::get&lt;0&gt;(GetParam()), std::get&lt;1&gt;(GetParam()) };
+    bool expectedResult = std::get&lt;2&gt;(GetParam());
+
+    // COM is required to be initialized for creation of the property set
+    EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED));
+    {
+        MockSwapChainPanel mockSwapChainPanel;
+        ComPtr&lt;IMap&lt;HSTRING, IInspectable*&gt;&gt; propertySet;
+        ComPtr&lt;IPropertyValueStatics&gt; propertyValueStatics;
+        ComPtr&lt;IPropertyValue&gt; sizeValue;
+
+        // Create a simple property set
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&amp;propertySet));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty, reinterpret_cast&lt;IInspectable*&gt;(&amp;mockSwapChainPanel)));
+
+        // Add a valid size to the property set
+        EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
+        propertyValueStatics-&gt;CreateSize(renderSize, reinterpret_cast&lt;IInspectable**&gt;(sizeValue.GetAddressOf()));
+        EXPECT_HRESULT_SUCCEEDED(SetInspectablePropertyValue(propertySet, EGLRenderSurfaceSizeProperty, reinterpret_cast&lt;IInspectable*&gt;(sizeValue.Get())));
+
+        // Check native window init status and calls to the mock swapchainpanel
+        NativeWindow nativeWindow(propertySet.Get());
+        if (expectedResult)
+        {
+            expectNativeWindowInitCalls(mockSwapChainPanel, false);
+        }
+
+        EXPECT_EQ(nativeWindow.initialize(), expectedResult);
+    }
+    CoUninitialize();
+}
+
+typedef std::tuple&lt;float, float, bool&gt; sizeValidPair;
+static const sizeValidPair sizes[] = { sizeValidPair( 800,  480, true),
+                                       sizeValidPair(   0,  480, false),
+                                       sizeValidPair( 800,    0, false),
+                                       sizeValidPair(   0,    0, false) };
+
+INSTANTIATE_TEST_CASE_P(NativeWindowTest,
+                        SwapChainPanelSizeTest,
+                        testing::ValuesIn(sizes));
+
</ins><span class="cx"> } // namespace
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Blit9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Blit9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -135,7 +135,7 @@
</span><span class="cx"> {
</span><span class="cx">     IDirect3DDevice9 *device = mRenderer-&gt;getDevice();
</span><span class="cx"> 
</span><del>-    D3DShaderType *shader;
</del><ins>+    D3DShaderType *shader = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     if (mCompiledShaders[source] != NULL)
</span><span class="cx">     {
</span><span class="lines">@@ -251,10 +251,11 @@
</span><span class="cx">     ASSERT(source);
</span><span class="cx"> 
</span><span class="cx">     IDirect3DSurface9 *destSurface = NULL;
</span><del>-    TextureStorage9_2D *storage9 = GetAs&lt;TextureStorage9_2D&gt;(storage);
-    error = storage9-&gt;getSurfaceLevel(level, true, &amp;destSurface);
</del><ins>+    TextureStorage9 *storage9      = GetAs&lt;TextureStorage9&gt;(storage);
+    error = storage9-&gt;getSurfaceLevel(GL_TEXTURE_2D, level, true, &amp;destSurface);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><ins>+        SafeRelease(source);
</ins><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx">     ASSERT(destSurface);
</span><span class="lines">@@ -290,10 +291,11 @@
</span><span class="cx">     ASSERT(source);
</span><span class="cx"> 
</span><span class="cx">     IDirect3DSurface9 *destSurface = NULL;
</span><del>-    TextureStorage9_Cube *storage9 = GetAs&lt;TextureStorage9_Cube&gt;(storage);
-    error = storage9-&gt;getCubeMapSurface(target, level, true, &amp;destSurface);
</del><ins>+    TextureStorage9 *storage9      = GetAs&lt;TextureStorage9&gt;(storage);
+    error = storage9-&gt;getSurfaceLevel(target, level, true, &amp;destSurface);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><ins>+        SafeRelease(source);
</ins><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx">     ASSERT(destSurface);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Buffer9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,7 +14,6 @@
</span><span class="cx"> 
</span><span class="cx"> Buffer9::Buffer9(Renderer9 *renderer)
</span><span class="cx">     : BufferD3D(renderer),
</span><del>-      mRenderer(renderer),
</del><span class="cx">       mSize(0)
</span><span class="cx"> {}
</span><span class="cx"> 
</span><span class="lines">@@ -39,13 +38,10 @@
</span><span class="cx">         memcpy(mMemory.data(), data, size);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    updateD3DBufferUsage(usage);
+
</ins><span class="cx">     invalidateStaticData();
</span><span class="cx"> 
</span><del>-    if (usage == GL_STATIC_DRAW)
-    {
-        initializeStaticData();
-    }
-
</del><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -108,9 +104,10 @@
</span><span class="cx">     return gl::Error(GL_INVALID_OPERATION);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Buffer9::markTransformFeedbackUsage()
</del><ins>+gl::Error Buffer9::markTransformFeedbackUsage()
</ins><span class="cx"> {
</span><span class="cx">     UNREACHABLE();
</span><ins>+    return gl::Error(GL_INVALID_OPERATION);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Buffer9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Buffer9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Buffer9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Buffer9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -26,23 +26,22 @@
</span><span class="cx">     // BufferD3D implementation
</span><span class="cx">     virtual size_t getSize() const { return mSize; }
</span><span class="cx">     virtual bool supportsDirectBinding() const { return false; }
</span><ins>+    gl::Error getData(const uint8_t **outData) override;
</ins><span class="cx"> 
</span><span class="cx">     // BufferImpl implementation
</span><span class="cx">     virtual gl::Error setData(const void* data, size_t size, GLenum usage);
</span><del>-    gl::Error getData(const uint8_t **outData) override;
</del><span class="cx">     virtual gl::Error setSubData(const void* data, size_t size, size_t offset);
</span><span class="cx">     virtual gl::Error copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size);
</span><span class="cx">     virtual gl::Error map(GLenum access, GLvoid **mapPtr);
</span><span class="cx">     virtual gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr);
</span><span class="cx">     virtual gl::Error unmap(GLboolean *result);
</span><del>-    virtual void markTransformFeedbackUsage();
</del><ins>+    virtual gl::Error markTransformFeedbackUsage();
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    Renderer9 *mRenderer;
</del><span class="cx">     MemoryBuffer mMemory;
</span><span class="cx">     size_t mSize;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_D3D_D3D9_BUFFER9_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9DebugAnnotator9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,9 +13,9 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-void DebugAnnotator9::beginEvent(const std::wstring &amp;eventName)
</del><ins>+void DebugAnnotator9::beginEvent(const wchar_t *eventName)
</ins><span class="cx"> {
</span><del>-    D3DPERF_BeginEvent(0, eventName.c_str());
</del><ins>+    D3DPERF_BeginEvent(0, eventName);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DebugAnnotator9::endEvent()
</span><span class="lines">@@ -23,9 +23,9 @@
</span><span class="cx">     D3DPERF_EndEvent();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DebugAnnotator9::setMarker(const std::wstring &amp;markerName)
</del><ins>+void DebugAnnotator9::setMarker(const wchar_t *markerName)
</ins><span class="cx"> {
</span><del>-    D3DPERF_SetMarker(0, markerName.c_str());
</del><ins>+    D3DPERF_SetMarker(0, markerName);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool DebugAnnotator9::getStatus()
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9DebugAnnotator9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -18,9 +18,9 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     DebugAnnotator9() {}
</span><del>-    void beginEvent(const std::wstring &amp;eventName) override;
</del><ins>+    void beginEvent(const wchar_t *eventName) override;
</ins><span class="cx">     void endEvent() override;
</span><del>-    void setMarker(const std::wstring &amp;markerName) override;
</del><ins>+    void setMarker(const wchar_t *markerName) override;
</ins><span class="cx">     bool getStatus() override;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Framebuffer9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -22,8 +22,7 @@
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> Framebuffer9::Framebuffer9(const gl::Framebuffer::Data &amp;data, Renderer9 *renderer)
</span><del>-    : FramebufferD3D(data, renderer),
-      mRenderer(renderer)
</del><ins>+    : FramebufferD3D(data, renderer), mRenderer(renderer)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mRenderer != nullptr);
</span><span class="cx"> }
</span><span class="lines">@@ -32,8 +31,29 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Framebuffer9::clear(const gl::State &amp;state, const ClearParameters &amp;clearParams)
</del><ins>+gl::Error Framebuffer9::discard(size_t, const GLenum *)
</ins><span class="cx"> {
</span><ins>+    // Extension not implemented in D3D9 renderer
+    UNREACHABLE();
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error Framebuffer9::invalidate(size_t, const GLenum *)
+{
+    // Shouldn't ever reach here in D3D9
+    UNREACHABLE();
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error Framebuffer9::invalidateSub(size_t, const GLenum *, const gl::Rectangle &amp;)
+{
+    // Shouldn't ever reach here in D3D9
+    UNREACHABLE();
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error Framebuffer9::clear(const gl::Data &amp;data, const ClearParameters &amp;clearParams)
+{
</ins><span class="cx">     const gl::FramebufferAttachment *colorAttachment = mData.getColorAttachment(0);
</span><span class="cx">     const gl::FramebufferAttachment *depthStencilAttachment = mData.getDepthOrStencilAttachment();
</span><span class="cx"> 
</span><span class="lines">@@ -43,16 +63,22 @@
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    float nearZ = state.getNearPlane();
-    float farZ = state.getFarPlane();
-    mRenderer-&gt;setViewport(state.getViewport(), nearZ, farZ, GL_TRIANGLES, state.getRasterizerState().frontFace, true);
</del><ins>+    float nearZ = data.state-&gt;getNearPlane();
+    float farZ = data.state-&gt;getFarPlane();
+    mRenderer-&gt;setViewport(data.caps, data.state-&gt;getViewport(), nearZ, farZ, GL_TRIANGLES,
+                           data.state-&gt;getRasterizerState().frontFace, true);
</ins><span class="cx"> 
</span><del>-    mRenderer-&gt;setScissorRectangle(state.getScissor(), state.isScissorTestEnabled());
</del><ins>+    mRenderer-&gt;setScissorRectangle(data.state-&gt;getScissor(), data.state-&gt;isScissorTestEnabled());
</ins><span class="cx"> 
</span><span class="cx">     return mRenderer-&gt;clear(clearParams, colorAttachment, depthStencilAttachment);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Framebuffer9::readPixels(const gl::Rectangle &amp;area, GLenum format, GLenum type, size_t outputPitch, const gl::PixelPackState &amp;pack, uint8_t *pixels) const
</del><ins>+gl::Error Framebuffer9::readPixelsImpl(const gl::Rectangle &amp;area,
+                                       GLenum format,
+                                       GLenum type,
+                                       size_t outputPitch,
+                                       const gl::PixelPackState &amp;pack,
+                                       uint8_t *pixels) const
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(pack.pixelBuffer.get() == nullptr);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Framebuffer9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,11 +21,19 @@
</span><span class="cx">     Framebuffer9(const gl::Framebuffer::Data &amp;data, Renderer9 *renderer);
</span><span class="cx">     virtual ~Framebuffer9();
</span><span class="cx"> 
</span><ins>+    gl::Error discard(size_t count, const GLenum *attachments) override;
+    gl::Error invalidate(size_t count, const GLenum *attachments) override;
+    gl::Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &amp;area) override;
+
</ins><span class="cx">   private:
</span><del>-    gl::Error clear(const gl::State &amp;state, const ClearParameters &amp;clearParams) override;
</del><ins>+    gl::Error clear(const gl::Data &amp;data, const ClearParameters &amp;clearParams) override;
</ins><span class="cx"> 
</span><del>-    gl::Error readPixels(const gl::Rectangle &amp;area, GLenum format, GLenum type, size_t outputPitch,
-                         const gl::PixelPackState &amp;pack, uint8_t *pixels) const override;
</del><ins>+    gl::Error readPixelsImpl(const gl::Rectangle &amp;area,
+                             GLenum format,
+                             GLenum type,
+                             size_t outputPitch,
+                             const gl::PixelPackState &amp;pack,
+                             uint8_t *pixels) const override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error blit(const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea, const gl::Rectangle *scissor,
</span><span class="cx">                    bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter,
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Image9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Image9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Image9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Image9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -330,8 +330,8 @@
</span><span class="cx"> gl::Error Image9::setManagedSurface2D(TextureStorage *storage, int level)
</span><span class="cx"> {
</span><span class="cx">     IDirect3DSurface9 *surface = NULL;
</span><del>-    TextureStorage9_2D *storage9 = GetAs&lt;TextureStorage9_2D&gt;(storage);
-    gl::Error error = storage9-&gt;getSurfaceLevel(level, false, &amp;surface);
</del><ins>+    TextureStorage9 *storage9  = GetAs&lt;TextureStorage9&gt;(storage);
+    gl::Error error = storage9-&gt;getSurfaceLevel(GL_TEXTURE_2D, level, false, &amp;surface);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -342,8 +342,9 @@
</span><span class="cx"> gl::Error Image9::setManagedSurfaceCube(TextureStorage *storage, int face, int level)
</span><span class="cx"> {
</span><span class="cx">     IDirect3DSurface9 *surface = NULL;
</span><del>-    TextureStorage9_Cube *storage9 = GetAs&lt;TextureStorage9_Cube&gt;(storage);
-    gl::Error error = storage9-&gt;getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, false, &amp;surface);
</del><ins>+    TextureStorage9 *storage9 = GetAs&lt;TextureStorage9&gt;(storage);
+    gl::Error error =
+        storage9-&gt;getSurfaceLevel(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, false, &amp;surface);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -384,12 +385,13 @@
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    TextureStorage9 *storage9 = GetAs&lt;TextureStorage9&gt;(storage);
+
</ins><span class="cx">     IDirect3DSurface9 *destSurface = NULL;
</span><span class="cx"> 
</span><span class="cx">     if (index.type == GL_TEXTURE_2D)
</span><span class="cx">     {
</span><del>-        TextureStorage9_2D *storage9 = GetAs&lt;TextureStorage9_2D&gt;(storage);
-        error = storage9-&gt;getSurfaceLevel(index.mipIndex, true, &amp;destSurface);
</del><ins>+        error = storage9-&gt;getSurfaceLevel(GL_TEXTURE_2D, index.mipIndex, true, &amp;destSurface);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -398,8 +400,7 @@
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         ASSERT(gl::IsCubeMapTextureTarget(index.type));
</span><del>-        TextureStorage9_Cube *storage9 = GetAs&lt;TextureStorage9_Cube&gt;(storage);
-        error = storage9-&gt;getCubeMapSurface(index.type, index.mipIndex, true, &amp;destSurface);
</del><ins>+        error = storage9-&gt;getSurfaceLevel(index.type, index.mipIndex, true, &amp;destSurface);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -479,6 +480,8 @@
</span><span class="cx"> 
</span><span class="cx">     const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(mInternalFormat);
</span><span class="cx">     GLsizei inputRowPitch = formatInfo.computeRowPitch(type, area.width, unpack.alignment, unpack.rowLength);
</span><ins>+    GLsizei inputSkipBytes = formatInfo.computeSkipPixels(inputRowPitch, 0, unpack.skipImages,
+                                                          unpack.skipRows, unpack.skipPixels);
</ins><span class="cx"> 
</span><span class="cx">     const d3d9::TextureFormat &amp;d3dFormatInfo = d3d9::GetTextureFormatInfo(mInternalFormat);
</span><span class="cx">     ASSERT(d3dFormatInfo.loadFunction != NULL);
</span><span class="lines">@@ -497,8 +500,9 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     d3dFormatInfo.loadFunction(area.width, area.height, area.depth,
</span><del>-                               reinterpret_cast&lt;const uint8_t*&gt;(input), inputRowPitch, 0,
-                               reinterpret_cast&lt;uint8_t*&gt;(locked.pBits), locked.Pitch, 0);
</del><ins>+                               reinterpret_cast&lt;const uint8_t *&gt;(input) + inputSkipBytes,
+                               inputRowPitch, 0, reinterpret_cast&lt;uint8_t *&gt;(locked.pBits),
+                               locked.Pitch, 0);
</ins><span class="cx"> 
</span><span class="cx">     unlock();
</span><span class="cx"> 
</span><span class="lines">@@ -512,7 +516,8 @@
</span><span class="cx"> 
</span><span class="cx">     const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(mInternalFormat);
</span><span class="cx">     GLsizei inputRowPitch = formatInfo.computeRowPitch(GL_UNSIGNED_BYTE, area.width, 1, 0);
</span><del>-    GLsizei inputDepthPitch = formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, area.width, area.height, 1, 0);
</del><ins>+    GLsizei inputDepthPitch =
+        formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, area.width, area.height, 1, 0, 0);
</ins><span class="cx"> 
</span><span class="cx">     const d3d9::TextureFormat &amp;d3d9FormatInfo = d3d9::GetTextureFormatInfo(mInternalFormat);
</span><span class="cx"> 
</span><span class="lines">@@ -544,7 +549,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // This implements glCopyTex[Sub]Image2D for non-renderable internal texture formats and incomplete textures
</span><del>-gl::Error Image9::copy(const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea, RenderTargetD3D *source)
</del><ins>+gl::Error Image9::copyFromRTInternal(const gl::Offset &amp;destOffset,
+                                     const gl::Rectangle &amp;sourceArea,
+                                     RenderTargetD3D *source)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(source);
</span><span class="cx"> 
</span><span class="lines">@@ -772,11 +779,35 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Image9::copy(const gl::Offset &amp;destOffset, const gl::Box &amp;area, const gl::ImageIndex &amp;srcIndex, TextureStorage *srcStorage)
</del><ins>+gl::Error Image9::copyFromTexStorage(const gl::ImageIndex &amp;imageIndex, TextureStorage *source)
</ins><span class="cx"> {
</span><del>-    // Currently unreachable, due to only being used in a D3D11-only workaround
-    UNIMPLEMENTED();
-    return gl::Error(GL_INVALID_OPERATION);
</del><ins>+    RenderTargetD3D *renderTarget = nullptr;
+    gl::Error error = source-&gt;getRenderTarget(imageIndex, &amp;renderTarget);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    gl::Rectangle sourceArea(0, 0, mWidth, mHeight);
+    return copyFromRTInternal(gl::Offset(), sourceArea, renderTarget);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+gl::Error Image9::copyFromFramebuffer(const gl::Offset &amp;destOffset,
+                                      const gl::Rectangle &amp;sourceArea,
+                                      const gl::Framebuffer *source)
+{
+    const gl::FramebufferAttachment *srcAttachment = source-&gt;getReadColorbuffer();
+    ASSERT(srcAttachment);
+
+    RenderTargetD3D *renderTarget = NULL;
+    gl::Error error = srcAttachment-&gt;getRenderTarget(&amp;renderTarget);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    ASSERT(renderTarget);
+    return copyFromRTInternal(destOffset, sourceArea, renderTarget);
</ins><span class="cx"> }
</span><ins>+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Image9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Image9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Image9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Image9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -45,9 +45,10 @@
</span><span class="cx">     virtual gl::Error loadData(const gl::Box &amp;area, const gl::PixelUnpackState &amp;unpack, GLenum type, const void *input);
</span><span class="cx">     virtual gl::Error loadCompressedData(const gl::Box &amp;area, const void *input);
</span><span class="cx"> 
</span><del>-    virtual gl::Error copy(const gl::Offset &amp;destOffset, const gl::Rectangle &amp;sourceArea, RenderTargetD3D *source);
-    virtual gl::Error copy(const gl::Offset &amp;destOffset, const gl::Box &amp;sourceArea,
-                           const gl::ImageIndex &amp;sourceIndex, TextureStorage *source);
</del><ins>+    gl::Error copyFromTexStorage(const gl::ImageIndex &amp;imageIndex, TextureStorage *source) override;
+    gl::Error copyFromFramebuffer(const gl::Offset &amp;destOffset,
+                                  const gl::Rectangle &amp;sourceArea,
+                                  const gl::Framebuffer *source) override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     gl::Error getSurface(IDirect3DSurface9 **outSurface);
</span><span class="lines">@@ -59,6 +60,10 @@
</span><span class="cx">     gl::Error lock(D3DLOCKED_RECT *lockedRect, const RECT &amp;rect);
</span><span class="cx">     void unlock();
</span><span class="cx"> 
</span><ins>+    gl::Error copyFromRTInternal(const gl::Offset &amp;destOffset,
+                                 const gl::Rectangle &amp;sourceArea,
+                                 RenderTargetD3D *source);
+
</ins><span class="cx">     Renderer9 *mRenderer;
</span><span class="cx"> 
</span><span class="cx">     D3DPOOL mD3DPool;   // can only be D3DPOOL_SYSTEMMEM or D3DPOOL_MANAGED since it needs to be lockable.
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Query9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Query9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Query9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Query9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -66,8 +66,15 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Query9::getResult(GLuint *params)
</del><ins>+gl::Error Query9::queryCounter()
</ins><span class="cx"> {
</span><ins>+    UNIMPLEMENTED();
+    return gl::Error(GL_INVALID_OPERATION, &quot;Unimplemented&quot;);
+}
+
+template &lt;typename T&gt;
+gl::Error Query9::getResultBase(T *params)
+{
</ins><span class="cx">     while (!mQueryFinished)
</span><span class="cx">     {
</span><span class="cx">         gl::Error error = testQuery();
</span><span class="lines">@@ -83,20 +90,39 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT(mQueryFinished);
</span><del>-    *params = mResult;
-
</del><ins>+    *params = static_cast&lt;T&gt;(mResult);
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Query9::isResultAvailable(GLuint *available)
</del><ins>+gl::Error Query9::getResult(GLint *params)
</ins><span class="cx"> {
</span><ins>+    return getResultBase(params);
+}
+
+gl::Error Query9::getResult(GLuint *params)
+{
+    return getResultBase(params);
+}
+
+gl::Error Query9::getResult(GLint64 *params)
+{
+    return getResultBase(params);
+}
+
+gl::Error Query9::getResult(GLuint64 *params)
+{
+    return getResultBase(params);
+}
+
+gl::Error Query9::isResultAvailable(bool *available)
+{
</ins><span class="cx">     gl::Error error = testQuery();
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    *available = (mQueryFinished ? GL_TRUE : GL_FALSE);
</del><ins>+    *available = mQueryFinished;
</ins><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Query9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Query9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Query9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Query9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -23,13 +23,20 @@
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error begin();
</span><span class="cx">     virtual gl::Error end();
</span><ins>+    virtual gl::Error queryCounter();
+    virtual gl::Error getResult(GLint *params);
</ins><span class="cx">     virtual gl::Error getResult(GLuint *params);
</span><del>-    virtual gl::Error isResultAvailable(GLuint *available);
</del><ins>+    virtual gl::Error getResult(GLint64 *params);
+    virtual gl::Error getResult(GLuint64 *params);
+    virtual gl::Error isResultAvailable(bool *available);
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     gl::Error testQuery();
</span><span class="cx"> 
</span><del>-    GLuint mResult;
</del><ins>+    template &lt;typename T&gt;
+    gl::Error getResultBase(T *params);
+
+    GLuint64 mResult;
</ins><span class="cx">     bool mQueryFinished;
</span><span class="cx"> 
</span><span class="cx">     Renderer9 *mRenderer;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9RenderTarget9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -17,7 +17,13 @@
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> // TODO: AddRef the incoming surface to take ownership instead of expecting that its ref is being given.
</span><del>-TextureRenderTarget9::TextureRenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
</del><ins>+TextureRenderTarget9::TextureRenderTarget9(IDirect3DBaseTexture9 *texture,
+                                           size_t textureLevel,
+                                           IDirect3DSurface9 *surface,
+                                           GLenum internalFormat,
+                                           GLsizei width,
+                                           GLsizei height,
+                                           GLsizei depth,
</ins><span class="cx">                                            GLsizei samples)
</span><span class="cx">     : mWidth(width),
</span><span class="cx">       mHeight(height),
</span><span class="lines">@@ -25,6 +31,8 @@
</span><span class="cx">       mInternalFormat(internalFormat),
</span><span class="cx">       mD3DFormat(D3DFMT_UNKNOWN),
</span><span class="cx">       mSamples(samples),
</span><ins>+      mTexture(texture),
+      mTextureLevel(textureLevel),
</ins><span class="cx">       mRenderTarget(surface)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(mDepth == 1);
</span><span class="lines">@@ -39,6 +47,7 @@
</span><span class="cx"> 
</span><span class="cx"> TextureRenderTarget9::~TextureRenderTarget9()
</span><span class="cx"> {
</span><ins>+    SafeRelease(mTexture);
</ins><span class="cx">     SafeRelease(mRenderTarget);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -67,8 +76,18 @@
</span><span class="cx">     return mSamples;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-IDirect3DSurface9 *TextureRenderTarget9::getSurface()
</del><ins>+IDirect3DBaseTexture9 *TextureRenderTarget9::getTexture() const
</ins><span class="cx"> {
</span><ins>+    return mTexture;
+}
+
+size_t TextureRenderTarget9::getTextureLevel() const
+{
+    return mTextureLevel;
+}
+
+IDirect3DSurface9 *TextureRenderTarget9::getSurface() const
+{
</ins><span class="cx">     // Caller is responsible for releasing the returned surface reference.
</span><span class="cx">     // TODO: remove the AddRef to match RenderTarget11
</span><span class="cx">     if (mRenderTarget)
</span><span class="lines">@@ -111,7 +130,7 @@
</span><span class="cx"> 
</span><span class="cx"> GLenum SurfaceRenderTarget9::getInternalFormat() const
</span><span class="cx"> {
</span><del>-    return (mDepth ? mSwapChain-&gt;GetDepthBufferInternalFormat() : mSwapChain-&gt;GetBackBufferInternalFormat());
</del><ins>+    return (mDepth ? mSwapChain-&gt;GetDepthBufferInternalFormat() : mSwapChain-&gt;GetRenderTargetInternalFormat());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLsizei SurfaceRenderTarget9::getSamples() const
</span><span class="lines">@@ -120,11 +139,21 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-IDirect3DSurface9 *SurfaceRenderTarget9::getSurface()
</del><ins>+IDirect3DSurface9 *SurfaceRenderTarget9::getSurface() const
</ins><span class="cx"> {
</span><span class="cx">     return (mDepth ? mSwapChain-&gt;getDepthStencil() : mSwapChain-&gt;getRenderTarget());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+IDirect3DBaseTexture9 *SurfaceRenderTarget9::getTexture() const
+{
+    return (mDepth ? nullptr : mSwapChain-&gt;getOffscreenTexture());
+}
+
+size_t SurfaceRenderTarget9::getTextureLevel() const
+{
+    return 0;
+}
+
</ins><span class="cx"> D3DFORMAT SurfaceRenderTarget9::getD3DFormat() const
</span><span class="cx"> {
</span><span class="cx">     return d3d9::GetTextureFormatInfo(getInternalFormat()).texFormat;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9RenderTarget9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/RenderTarget9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -22,8 +22,12 @@
</span><span class="cx">   public:
</span><span class="cx">     RenderTarget9() { }
</span><span class="cx">     virtual ~RenderTarget9() { }
</span><ins>+    // Retrieve the texture that backs this render target, may be null for swap chain render
+    // targets.
+    virtual IDirect3DBaseTexture9 *getTexture() const = 0;
+    virtual size_t getTextureLevel() const = 0;
</ins><span class="cx"> 
</span><del>-    virtual IDirect3DSurface9 *getSurface() = 0;
</del><ins>+    virtual IDirect3DSurface9 *getSurface() const = 0;
</ins><span class="cx"> 
</span><span class="cx">     virtual D3DFORMAT getD3DFormat() const = 0;
</span><span class="cx"> };
</span><span class="lines">@@ -31,7 +35,13 @@
</span><span class="cx"> class TextureRenderTarget9 : public RenderTarget9
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    TextureRenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
</del><ins>+    TextureRenderTarget9(IDirect3DBaseTexture9 *texture,
+                         size_t textureLevel,
+                         IDirect3DSurface9 *surface,
+                         GLenum internalFormat,
+                         GLsizei width,
+                         GLsizei height,
+                         GLsizei depth,
</ins><span class="cx">                          GLsizei samples);
</span><span class="cx">     virtual ~TextureRenderTarget9();
</span><span class="cx"> 
</span><span class="lines">@@ -41,7 +51,9 @@
</span><span class="cx">     GLenum getInternalFormat() const override;
</span><span class="cx">     GLsizei getSamples() const override;
</span><span class="cx"> 
</span><del>-    IDirect3DSurface9 *getSurface() override;
</del><ins>+    IDirect3DBaseTexture9 *getTexture() const override;
+    size_t getTextureLevel() const override;
+    IDirect3DSurface9 *getSurface() const override;
</ins><span class="cx"> 
</span><span class="cx">     D3DFORMAT getD3DFormat() const override;
</span><span class="cx"> 
</span><span class="lines">@@ -53,6 +65,8 @@
</span><span class="cx">     D3DFORMAT mD3DFormat;
</span><span class="cx">     GLsizei mSamples;
</span><span class="cx"> 
</span><ins>+    IDirect3DBaseTexture9 *mTexture;
+    size_t mTextureLevel;
</ins><span class="cx">     IDirect3DSurface9 *mRenderTarget;
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -68,7 +82,9 @@
</span><span class="cx">     GLenum getInternalFormat() const override;
</span><span class="cx">     GLsizei getSamples() const override;
</span><span class="cx"> 
</span><del>-    IDirect3DSurface9 *getSurface() override;
</del><ins>+    IDirect3DBaseTexture9 *getTexture() const override;
+    size_t getTextureLevel() const override;
+    IDirect3DSurface9 *getSurface() const override;
</ins><span class="cx"> 
</span><span class="cx">     D3DFORMAT getD3DFormat() const override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Renderer9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,50 +8,50 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/Renderer9.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;sstream&gt;
+#include &lt;EGL/eglext.h&gt;
+
</ins><span class="cx"> #include &quot;common/utilities.h&quot;
</span><ins>+#include &quot;libANGLE/angletypes.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Buffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Display.h&quot;
</span><ins>+#include &quot;libANGLE/features.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Program.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Renderbuffer.h&quot;
</span><del>-#include &quot;libANGLE/State.h&quot;
-#include &quot;libANGLE/Surface.h&quot;
-#include &quot;libANGLE/Texture.h&quot;
-#include &quot;libANGLE/angletypes.h&quot;
-#include &quot;libANGLE/features.h&quot;
-#include &quot;libANGLE/formatutils.h&quot;
-#include &quot;libANGLE/renderer/d3d/CompilerD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/FramebufferD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/IndexDataManager.h&quot;
-#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/RenderbufferD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/ShaderD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/SurfaceD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/TextureD3D.h&quot;
-#include &quot;libANGLE/renderer/d3d/TransformFeedbackD3D.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/Blit9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/Buffer9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/Fence9.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d9/formatutils9.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/Framebuffer9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/Image9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/IndexBuffer9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/Query9.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d9/renderer9_utils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/RenderTarget9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/ShaderExecutable9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/SwapChain9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/TextureStorage9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/VertexArray9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/VertexBuffer9.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d9/renderer9_utils.h&quot;
-#include &quot;libANGLE/renderer/d3d/d3d9/formatutils9.h&quot;
-
</del><ins>+#include &quot;libANGLE/renderer/d3d/CompilerD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/DeviceD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/FramebufferD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/IndexDataManager.h&quot;
+#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/RenderbufferD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/ShaderD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/SurfaceD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/TextureD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/TransformFeedbackD3D.h&quot;
+#include &quot;libANGLE/State.h&quot;
+#include &quot;libANGLE/Surface.h&quot;
+#include &quot;libANGLE/Texture.h&quot;
</ins><span class="cx"> #include &quot;third_party/trace_event/trace_event.h&quot;
</span><span class="cx"> 
</span><del>-#include &lt;sstream&gt;
-#include &lt;EGL/eglext.h&gt;
</del><span class="cx"> 
</span><del>-#include &lt;EGL/eglext.h&gt;
</del><span class="cx"> 
</span><span class="cx"> #if !defined(ANGLE_COMPILE_OPTIMIZATION_LEVEL)
</span><span class="cx"> #define ANGLE_COMPILE_OPTIMIZATION_LEVEL D3DCOMPILE_OPTIMIZATION_LEVEL3
</span><span class="lines">@@ -77,12 +77,8 @@
</span><span class="cx">     MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 = 4
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-Renderer9::Renderer9(egl::Display *display)
-    : RendererD3D(display)
</del><ins>+Renderer9::Renderer9(egl::Display *display) : RendererD3D(display), mStateManager(this)
</ins><span class="cx"> {
</span><del>-    // Initialize global annotator
-    gl::InitializeDebugAnnotations(&amp;mAnnotator);
-
</del><span class="cx">     mD3d9Module = NULL;
</span><span class="cx"> 
</span><span class="cx">     mD3d9 = NULL;
</span><span class="lines">@@ -95,8 +91,8 @@
</span><span class="cx">     mAdapter = D3DADAPTER_DEFAULT;
</span><span class="cx"> 
</span><span class="cx">     const egl::AttributeMap &amp;attributes = display-&gt;getAttributeMap();
</span><del>-    EGLint requestedDeviceType = attributes.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE,
-                                                EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE);
</del><ins>+    EGLint requestedDeviceType = static_cast&lt;EGLint&gt;(attributes.get(
+        EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE));
</ins><span class="cx">     switch (requestedDeviceType)
</span><span class="cx">     {
</span><span class="cx">       case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE:
</span><span class="lines">@@ -134,6 +130,10 @@
</span><span class="cx">     mAppliedVertexShader = NULL;
</span><span class="cx">     mAppliedPixelShader = NULL;
</span><span class="cx">     mAppliedProgramSerial = 0;
</span><ins>+
+    initializeDebugAnnotator();
+
+    mEGLDevice = nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Renderer9::~Renderer9()
</span><span class="lines">@@ -148,16 +148,17 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     release();
</span><del>-
-    gl::UninitializeDebugAnnotations();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Renderer9::release()
</span><span class="cx"> {
</span><span class="cx">     RendererD3D::cleanup();
</span><span class="cx"> 
</span><ins>+    mTranslatedAttribCache.clear();
+
</ins><span class="cx">     releaseDeviceResources();
</span><span class="cx"> 
</span><ins>+    SafeDelete(mEGLDevice);
</ins><span class="cx">     SafeRelease(mDevice);
</span><span class="cx">     SafeRelease(mDeviceEx);
</span><span class="cx">     SafeRelease(mD3d9);
</span><span class="lines">@@ -176,13 +177,6 @@
</span><span class="cx"> 
</span><span class="cx"> egl::Error Renderer9::initialize()
</span><span class="cx"> {
</span><del>-    if (!mCompiler.initialize())
-    {
-        return egl::Error(EGL_NOT_INITIALIZED,
-                          D3D9_INIT_COMPILER_ERROR,
-                          &quot;Compiler failed to initialize.&quot;);
-    }
-
</del><span class="cx">     TRACE_EVENT0(&quot;gpu.angle&quot;, &quot;GetModuleHandle_d3d9&quot;);
</span><span class="cx">     mD3d9Module = GetModuleHandle(TEXT(&quot;d3d9.dll&quot;));
</span><span class="cx"> 
</span><span class="lines">@@ -354,14 +348,11 @@
</span><span class="cx"> 
</span><span class="cx">     const gl::Caps &amp;rendererCaps = getRendererCaps();
</span><span class="cx"> 
</span><del>-    mForceSetVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits);
</del><span class="cx">     mCurVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits);
</span><del>-
-    mForceSetPixelSamplerStates.resize(rendererCaps.maxTextureImageUnits);
</del><span class="cx">     mCurPixelSamplerStates.resize(rendererCaps.maxTextureImageUnits);
</span><span class="cx"> 
</span><del>-    mCurVertexTextureSerials.resize(rendererCaps.maxVertexTextureImageUnits);
-    mCurPixelTextureSerials.resize(rendererCaps.maxTextureImageUnits);
</del><ins>+    mCurVertexTextures.resize(rendererCaps.maxVertexTextureImageUnits);
+    mCurPixelTextures.resize(rendererCaps.maxTextureImageUnits);
</ins><span class="cx"> 
</span><span class="cx">     markAllStateDirty();
</span><span class="cx"> 
</span><span class="lines">@@ -374,6 +365,8 @@
</span><span class="cx">     ASSERT(!mVertexDataManager &amp;&amp; !mIndexDataManager);
</span><span class="cx">     mVertexDataManager = new VertexDataManager(this);
</span><span class="cx">     mIndexDataManager = new IndexDataManager(this, getRendererClass());
</span><ins>+
+    mTranslatedAttribCache.resize(getRendererCaps().maxVertexAttributes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> D3DPRESENT_PARAMETERS Renderer9::getDefaultPresentParameters()
</span><span class="lines">@@ -518,6 +511,31 @@
</span><span class="cx">     return configs;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Renderer9::generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const
+{
+    outExtensions-&gt;createContextRobustness = true;
+
+    if (getShareHandleSupport())
+    {
+        outExtensions-&gt;d3dShareHandleClientBuffer     = true;
+        outExtensions-&gt;surfaceD3DTexture2DShareHandle = true;
+    }
+
+    outExtensions-&gt;querySurfacePointer = true;
+    outExtensions-&gt;windowFixedSize     = true;
+    outExtensions-&gt;postSubBuffer       = true;
+    outExtensions-&gt;createContext       = true;
+    outExtensions-&gt;deviceQuery         = true;
+    outExtensions-&gt;createContextNoError = true;
+
+    outExtensions-&gt;image               = true;
+    outExtensions-&gt;imageBase           = true;
+    outExtensions-&gt;glTexture2DImage    = true;
+    outExtensions-&gt;glRenderbufferImage = true;
+
+    outExtensions-&gt;flexibleSurfaceCompatibility = true;
+}
+
</ins><span class="cx"> void Renderer9::startScene()
</span><span class="cx"> {
</span><span class="cx">     if (!mSceneStarted)
</span><span class="lines">@@ -607,7 +625,7 @@
</span><span class="cx">     while (result == S_FALSE)
</span><span class="cx">     {
</span><span class="cx">         // Keep polling, but allow other threads to do something useful first
</span><del>-        Sleep(0);
</del><ins>+        ScheduleYield();
</ins><span class="cx"> 
</span><span class="cx">         result = query-&gt;GetData(NULL, 0, D3DGETDATA_FLUSH);
</span><span class="cx"> 
</span><span class="lines">@@ -637,15 +655,19 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Renderer9::shouldCreateChildWindowForSurface(EGLNativeWindowType window) const
</del><ins>+SwapChainD3D *Renderer9::createSwapChain(NativeWindow nativeWindow,
+                                         HANDLE shareHandle,
+                                         GLenum backBufferFormat,
+                                         GLenum depthBufferFormat,
+                                         EGLint orientation)
</ins><span class="cx"> {
</span><del>-    // D3D9 never needs to create child windows
-    return false;
</del><ins>+    return new SwapChain9(this, nativeWindow, shareHandle, backBufferFormat, depthBufferFormat,
+                          orientation);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-SwapChainD3D *Renderer9::createSwapChain(NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
</del><ins>+CompilerImpl *Renderer9::createCompiler()
</ins><span class="cx"> {
</span><del>-    return new SwapChain9(this, nativeWindow, shareHandle, backBufferFormat, depthBufferFormat);
</del><ins>+    return new CompilerD3D(SH_HLSL_3_0_OUTPUT);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void *Renderer9::getD3DDevice()
</span><span class="lines">@@ -722,9 +744,9 @@
</span><span class="cx">     return new Buffer9(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-VertexArrayImpl *Renderer9::createVertexArray()
</del><ins>+VertexArrayImpl *Renderer9::createVertexArray(const gl::VertexArray::Data &amp;data)
</ins><span class="cx"> {
</span><del>-    return new VertexArray9(this);
</del><ins>+    return new VertexArray9(data);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> QueryImpl *Renderer9::createQuery(GLenum type)
</span><span class="lines">@@ -749,6 +771,13 @@
</span><span class="cx">     return new TransformFeedbackD3D();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+StreamImpl *Renderer9::createStream(const egl::AttributeMap &amp;attribs)
+{
+    // Streams are not supported under D3D9
+    UNREACHABLE();
+    return nullptr;
+}
+
</ins><span class="cx"> bool Renderer9::supportsFastCopyBufferToTexture(GLenum internalFormat) const
</span><span class="cx"> {
</span><span class="cx">     // Pixel buffer objects are not supported in D3D9, since D3D9 is ES2-only and PBOs are ES3.
</span><span class="lines">@@ -772,46 +801,52 @@
</span><span class="cx"> 
</span><span class="cx"> gl::Error Renderer9::setSamplerState(gl::SamplerType type, int index, gl::Texture *texture, const gl::SamplerState &amp;samplerState)
</span><span class="cx"> {
</span><del>-    std::vector&lt;bool&gt; &amp;forceSetSamplers = (type == gl::SAMPLER_PIXEL) ? mForceSetPixelSamplerStates : mForceSetVertexSamplerStates;
-    std::vector&lt;gl::SamplerState&gt; &amp;appliedSamplers = (type == gl::SAMPLER_PIXEL) ? mCurPixelSamplerStates: mCurVertexSamplerStates;
</del><ins>+    CurSamplerState &amp;appliedSampler = (type == gl::SAMPLER_PIXEL) ? mCurPixelSamplerStates[index]
+                                                                  : mCurVertexSamplerStates[index];
</ins><span class="cx"> 
</span><del>-    if (forceSetSamplers[index] || memcmp(&amp;samplerState, &amp;appliedSamplers[index], sizeof(gl::SamplerState)) != 0)
</del><ins>+    // Make sure to add the level offset for our tiny compressed texture workaround
+    TextureD3D *textureD3D = GetImplAs&lt;TextureD3D&gt;(texture);
+
+    TextureStorage *storage = nullptr;
+    gl::Error error = textureD3D-&gt;getNativeTexture(&amp;storage);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        int d3dSamplerOffset = (type == gl::SAMPLER_PIXEL) ? 0 : D3DVERTEXTEXTURESAMPLER0;
-        int d3dSampler = index + d3dSamplerOffset;
</del><ins>+        return error;
+    }
</ins><span class="cx"> 
</span><del>-        // Make sure to add the level offset for our tiny compressed texture workaround
-        TextureD3D *textureD3D = GetImplAs&lt;TextureD3D&gt;(texture);
</del><ins>+    // Storage should exist, texture should be complete
+    ASSERT(storage);
</ins><span class="cx"> 
</span><del>-        TextureStorage *storage = nullptr;
-        gl::Error error = textureD3D-&gt;getNativeTexture(&amp;storage);
-        if (error.isError())
-        {
-            return error;
-        }
</del><ins>+    DWORD baseLevel = texture-&gt;getBaseLevel() + storage-&gt;getTopLevel();
</ins><span class="cx"> 
</span><del>-        // Storage should exist, texture should be complete
-        ASSERT(storage);
</del><ins>+    if (appliedSampler.forceSet || appliedSampler.baseLevel != baseLevel ||
+        memcmp(&amp;samplerState, &amp;appliedSampler, sizeof(gl::SamplerState)) != 0)
+    {
+        int d3dSamplerOffset = (type == gl::SAMPLER_PIXEL) ? 0 : D3DVERTEXTEXTURESAMPLER0;
+        int d3dSampler = index + d3dSamplerOffset;
</ins><span class="cx"> 
</span><del>-        DWORD baseLevel = samplerState.baseLevel + storage-&gt;getTopLevel();
-
</del><span class="cx">         mDevice-&gt;SetSamplerState(d3dSampler, D3DSAMP_ADDRESSU, gl_d3d9::ConvertTextureWrap(samplerState.wrapS));
</span><span class="cx">         mDevice-&gt;SetSamplerState(d3dSampler, D3DSAMP_ADDRESSV, gl_d3d9::ConvertTextureWrap(samplerState.wrapT));
</span><span class="cx"> 
</span><span class="cx">         mDevice-&gt;SetSamplerState(d3dSampler, D3DSAMP_MAGFILTER, gl_d3d9::ConvertMagFilter(samplerState.magFilter, samplerState.maxAnisotropy));
</span><ins>+
</ins><span class="cx">         D3DTEXTUREFILTERTYPE d3dMinFilter, d3dMipFilter;
</span><del>-        gl_d3d9::ConvertMinFilter(samplerState.minFilter, &amp;d3dMinFilter, &amp;d3dMipFilter, samplerState.maxAnisotropy);
</del><ins>+        float lodBias;
+        gl_d3d9::ConvertMinFilter(samplerState.minFilter, &amp;d3dMinFilter, &amp;d3dMipFilter, &amp;lodBias,
+                                  samplerState.maxAnisotropy, baseLevel);
</ins><span class="cx">         mDevice-&gt;SetSamplerState(d3dSampler, D3DSAMP_MINFILTER, d3dMinFilter);
</span><span class="cx">         mDevice-&gt;SetSamplerState(d3dSampler, D3DSAMP_MIPFILTER, d3dMipFilter);
</span><span class="cx">         mDevice-&gt;SetSamplerState(d3dSampler, D3DSAMP_MAXMIPLEVEL, baseLevel);
</span><ins>+        mDevice-&gt;SetSamplerState(d3dSampler, D3DSAMP_MIPMAPLODBIAS, static_cast&lt;DWORD&gt;(lodBias));
</ins><span class="cx">         if (getRendererExtensions().textureFilterAnisotropic)
</span><span class="cx">         {
</span><span class="cx">             mDevice-&gt;SetSamplerState(d3dSampler, D3DSAMP_MAXANISOTROPY, (DWORD)samplerState.maxAnisotropy);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    forceSetSamplers[index] = false;
-    appliedSamplers[index] = samplerState;
</del><ins>+    appliedSampler.forceSet = false;
+    appliedSampler.samplerState = samplerState;
+    appliedSampler.baseLevel = baseLevel;
</ins><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="lines">@@ -821,10 +856,9 @@
</span><span class="cx">     int d3dSamplerOffset = (type == gl::SAMPLER_PIXEL) ? 0 : D3DVERTEXTEXTURESAMPLER0;
</span><span class="cx">     int d3dSampler = index + d3dSamplerOffset;
</span><span class="cx">     IDirect3DBaseTexture9 *d3dTexture = NULL;
</span><del>-    unsigned int serial = 0;
</del><span class="cx">     bool forceSetTexture = false;
</span><span class="cx"> 
</span><del>-    std::vector&lt;unsigned int&gt; &amp;appliedSerials = (type == gl::SAMPLER_PIXEL) ? mCurPixelTextureSerials : mCurVertexTextureSerials;
</del><ins>+    std::vector&lt;uintptr_t&gt; &amp;appliedTextures = (type == gl::SAMPLER_PIXEL) ? mCurPixelTextures : mCurVertexTextures;
</ins><span class="cx"> 
</span><span class="cx">     if (texture)
</span><span class="cx">     {
</span><span class="lines">@@ -851,372 +885,99 @@
</span><span class="cx">         // in the texture class and we're unexpectedly missing the d3d texture
</span><span class="cx">         ASSERT(d3dTexture != NULL);
</span><span class="cx"> 
</span><del>-        serial = texture-&gt;getTextureSerial();
</del><span class="cx">         forceSetTexture = textureImpl-&gt;hasDirtyImages();
</span><span class="cx">         textureImpl-&gt;resetDirty();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (forceSetTexture || appliedSerials[index] != serial)
</del><ins>+    if (forceSetTexture || appliedTextures[index] != reinterpret_cast&lt;uintptr_t&gt;(d3dTexture))
</ins><span class="cx">     {
</span><span class="cx">         mDevice-&gt;SetTexture(d3dSampler, d3dTexture);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    appliedSerials[index] = serial;
</del><ins>+    appliedTextures[index] = reinterpret_cast&lt;uintptr_t&gt;(d3dTexture);
</ins><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error Renderer9::setUniformBuffers(const gl::Data &amp;/*data*/,
</span><del>-                                       const GLint /*vertexUniformBuffers*/[],
-                                       const GLint /*fragmentUniformBuffers*/[])
</del><ins>+                                       const std::vector&lt;GLint&gt; &amp;/*vertexUniformBuffers*/,
+                                       const std::vector&lt;GLint&gt; &amp;/*fragmentUniformBuffers*/)
</ins><span class="cx"> {
</span><span class="cx">     // No effect in ES2/D3D9
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer9::setRasterizerState(const gl::RasterizerState &amp;rasterState)
</del><ins>+void Renderer9::syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;bitmask)
</ins><span class="cx"> {
</span><del>-    bool rasterStateChanged = mForceSetRasterState || memcmp(&amp;rasterState, &amp;mCurRasterState, sizeof(gl::RasterizerState)) != 0;
-
-    if (rasterStateChanged)
-    {
-        // Set the cull mode
-        if (rasterState.cullFace)
-        {
-            mDevice-&gt;SetRenderState(D3DRS_CULLMODE, gl_d3d9::ConvertCullMode(rasterState.cullMode, rasterState.frontFace));
-        }
-        else
-        {
-            mDevice-&gt;SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
-        }
-
-        if (rasterState.polygonOffsetFill)
-        {
-            if (mCurDepthSize &gt; 0)
-            {
-                mDevice-&gt;SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, *(DWORD*)&amp;rasterState.polygonOffsetFactor);
-
-                float depthBias = ldexp(rasterState.polygonOffsetUnits, -static_cast&lt;int&gt;(mCurDepthSize));
-                mDevice-&gt;SetRenderState(D3DRS_DEPTHBIAS, *(DWORD*)&amp;depthBias);
-            }
-        }
-        else
-        {
-            mDevice-&gt;SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, 0);
-            mDevice-&gt;SetRenderState(D3DRS_DEPTHBIAS, 0);
-        }
-
-        mCurRasterState = rasterState;
-    }
-
-    mForceSetRasterState = false;
-
-    return gl::Error(GL_NO_ERROR);
</del><ins>+    mStateManager.syncState(state, bitmask);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer9::setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &amp;blendState, const gl::ColorF &amp;blendColor,
-                                   unsigned int sampleMask)
</del><ins>+gl::Error Renderer9::updateState(const gl::Data &amp;data, GLenum drawMode)
</ins><span class="cx"> {
</span><del>-    bool blendStateChanged = mForceSetBlendState || memcmp(&amp;blendState, &amp;mCurBlendState, sizeof(gl::BlendState)) != 0;
-    bool blendColorChanged = mForceSetBlendState || memcmp(&amp;blendColor, &amp;mCurBlendColor, sizeof(gl::ColorF)) != 0;
-    bool sampleMaskChanged = mForceSetBlendState || sampleMask != mCurSampleMask;
</del><ins>+    // Applies the render target surface, depth stencil surface, viewport rectangle and
+    // scissor rectangle to the renderer
+    const gl::Framebuffer *framebufferObject = data.state-&gt;getDrawFramebuffer();
+    ASSERT(framebufferObject &amp;&amp; framebufferObject-&gt;checkStatus(data) == GL_FRAMEBUFFER_COMPLETE);
</ins><span class="cx"> 
</span><del>-    if (blendStateChanged || blendColorChanged)
</del><ins>+    gl::Error error = applyRenderTarget(framebufferObject);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        if (blendState.blend)
-        {
-            mDevice-&gt;SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
</del><ins>+        return error;
+    }
</ins><span class="cx"> 
</span><del>-            if (blendState.sourceBlendRGB != GL_CONSTANT_ALPHA &amp;&amp; blendState.sourceBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA &amp;&amp;
-                blendState.destBlendRGB != GL_CONSTANT_ALPHA &amp;&amp; blendState.destBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA)
-            {
-                mDevice-&gt;SetRenderState(D3DRS_BLENDFACTOR, gl_d3d9::ConvertColor(blendColor));
-            }
-            else
-            {
-                mDevice-&gt;SetRenderState(D3DRS_BLENDFACTOR, D3DCOLOR_RGBA(gl::unorm&lt;8&gt;(blendColor.alpha),
-                                                                         gl::unorm&lt;8&gt;(blendColor.alpha),
-                                                                         gl::unorm&lt;8&gt;(blendColor.alpha),
-                                                                         gl::unorm&lt;8&gt;(blendColor.alpha)));
-            }
</del><ins>+    // Setting viewport state
+    setViewport(data.caps, data.state-&gt;getViewport(), data.state-&gt;getNearPlane(),
+                data.state-&gt;getFarPlane(), drawMode, data.state-&gt;getRasterizerState().frontFace,
+                false);
</ins><span class="cx"> 
</span><del>-            mDevice-&gt;SetRenderState(D3DRS_SRCBLEND, gl_d3d9::ConvertBlendFunc(blendState.sourceBlendRGB));
-            mDevice-&gt;SetRenderState(D3DRS_DESTBLEND, gl_d3d9::ConvertBlendFunc(blendState.destBlendRGB));
-            mDevice-&gt;SetRenderState(D3DRS_BLENDOP, gl_d3d9::ConvertBlendOp(blendState.blendEquationRGB));
</del><ins>+    // Setting scissors state
+    setScissorRectangle(data.state-&gt;getScissor(), data.state-&gt;isScissorTestEnabled());
</ins><span class="cx"> 
</span><del>-            if (blendState.sourceBlendRGB != blendState.sourceBlendAlpha ||
-                blendState.destBlendRGB != blendState.destBlendAlpha ||
-                blendState.blendEquationRGB != blendState.blendEquationAlpha)
-            {
-                mDevice-&gt;SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
</del><ins>+    // Setting blend, depth stencil, and rasterizer states
+    int samples                    = framebufferObject-&gt;getSamples(data);
+    gl::RasterizerState rasterizer = data.state-&gt;getRasterizerState();
+    rasterizer.pointDrawMode       = (drawMode == GL_POINTS);
+    rasterizer.multiSample         = (samples != 0);
</ins><span class="cx"> 
</span><del>-                mDevice-&gt;SetRenderState(D3DRS_SRCBLENDALPHA, gl_d3d9::ConvertBlendFunc(blendState.sourceBlendAlpha));
-                mDevice-&gt;SetRenderState(D3DRS_DESTBLENDALPHA, gl_d3d9::ConvertBlendFunc(blendState.destBlendAlpha));
-                mDevice-&gt;SetRenderState(D3DRS_BLENDOPALPHA, gl_d3d9::ConvertBlendOp(blendState.blendEquationAlpha));
-            }
-            else
-            {
-                mDevice-&gt;SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE);
-            }
-        }
-        else
-        {
-            mDevice-&gt;SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
-        }
</del><ins>+    unsigned int mask = GetBlendSampleMask(data, samples);
+    error             = setBlendDepthRasterStates(data, mask);
</ins><span class="cx"> 
</span><del>-        if (blendState.sampleAlphaToCoverage)
-        {
-            FIXME(&quot;Sample alpha to coverage is unimplemented.&quot;);
-        }
-
-        const gl::FramebufferAttachment *attachment = framebuffer-&gt;getFirstColorbuffer();
-        GLenum internalFormat = attachment ? attachment-&gt;getInternalFormat() : GL_NONE;
-
-        // Set the color mask
-        bool zeroColorMaskAllowed = getVendorId() != VENDOR_ID_AMD;
-        // Apparently some ATI cards have a bug where a draw with a zero color
-        // write mask can cause later draws to have incorrect results. Instead,
-        // set a nonzero color write mask but modify the blend state so that no
-        // drawing is done.
-        // http://code.google.com/p/angleproject/issues/detail?id=169
-
-        const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(internalFormat);
-        DWORD colorMask = gl_d3d9::ConvertColorMask(formatInfo.redBits   &gt; 0 &amp;&amp; blendState.colorMaskRed,
-                                                    formatInfo.greenBits &gt; 0 &amp;&amp; blendState.colorMaskGreen,
-                                                    formatInfo.blueBits  &gt; 0 &amp;&amp; blendState.colorMaskBlue,
-                                                    formatInfo.alphaBits &gt; 0 &amp;&amp; blendState.colorMaskAlpha);
-        if (colorMask == 0 &amp;&amp; !zeroColorMaskAllowed)
-        {
-            // Enable green channel, but set blending so nothing will be drawn.
-            mDevice-&gt;SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_GREEN);
-            mDevice-&gt;SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
-
-            mDevice-&gt;SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
-            mDevice-&gt;SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
-            mDevice-&gt;SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
-        }
-        else
-        {
-            mDevice-&gt;SetRenderState(D3DRS_COLORWRITEENABLE, colorMask);
-        }
-
-        mDevice-&gt;SetRenderState(D3DRS_DITHERENABLE, blendState.dither ? TRUE : FALSE);
-
-        mCurBlendState = blendState;
-        mCurBlendColor = blendColor;
-    }
-
-    if (sampleMaskChanged)
</del><ins>+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        // Set the multisample mask
-        mDevice-&gt;SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);
-        mDevice-&gt;SetRenderState(D3DRS_MULTISAMPLEMASK, static_cast&lt;DWORD&gt;(sampleMask));
-
-        mCurSampleMask = sampleMask;
</del><ins>+        return error;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mForceSetBlendState = false;
</del><ins>+    mStateManager.resetDirtyBits();
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return error;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer9::setDepthStencilState(const gl::DepthStencilState &amp;depthStencilState, int stencilRef,
-                                          int stencilBackRef, bool frontFaceCCW)
</del><ins>+void Renderer9::setScissorRectangle(const gl::Rectangle &amp;scissor, bool enabled)
</ins><span class="cx"> {
</span><del>-    bool depthStencilStateChanged = mForceSetDepthStencilState ||
-                                    memcmp(&amp;depthStencilState, &amp;mCurDepthStencilState, sizeof(gl::DepthStencilState)) != 0;
-    bool stencilRefChanged = mForceSetDepthStencilState || stencilRef != mCurStencilRef ||
-                             stencilBackRef != mCurStencilBackRef;
-    bool frontFaceCCWChanged = mForceSetDepthStencilState || frontFaceCCW != mCurFrontFaceCCW;
-
-    if (depthStencilStateChanged)
-    {
-        if (depthStencilState.depthTest)
-        {
-            mDevice-&gt;SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
-            mDevice-&gt;SetRenderState(D3DRS_ZFUNC, gl_d3d9::ConvertComparison(depthStencilState.depthFunc));
-        }
-        else
-        {
-            mDevice-&gt;SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
-        }
-
-        mCurDepthStencilState = depthStencilState;
-    }
-
-    if (depthStencilStateChanged || stencilRefChanged || frontFaceCCWChanged)
-    {
-        if (depthStencilState.stencilTest &amp;&amp; mCurStencilSize &gt; 0)
-        {
-            mDevice-&gt;SetRenderState(D3DRS_STENCILENABLE, TRUE);
-            mDevice-&gt;SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, TRUE);
-
-            // FIXME: Unsupported by D3D9
-            const D3DRENDERSTATETYPE D3DRS_CCW_STENCILREF = D3DRS_STENCILREF;
-            const D3DRENDERSTATETYPE D3DRS_CCW_STENCILMASK = D3DRS_STENCILMASK;
-            const D3DRENDERSTATETYPE D3DRS_CCW_STENCILWRITEMASK = D3DRS_STENCILWRITEMASK;
-
-            ASSERT(depthStencilState.stencilWritemask == depthStencilState.stencilBackWritemask);
-            ASSERT(stencilRef == stencilBackRef);
-            ASSERT(depthStencilState.stencilMask == depthStencilState.stencilBackMask);
-
-            // get the maximum size of the stencil ref
-            unsigned int maxStencil = (1 &lt;&lt; mCurStencilSize) - 1;
-
-            mDevice-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK,
-                                    depthStencilState.stencilWritemask);
-            mDevice-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILFUNC : D3DRS_CCW_STENCILFUNC,
-                                    gl_d3d9::ConvertComparison(depthStencilState.stencilFunc));
-
-            mDevice-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILREF : D3DRS_CCW_STENCILREF,
-                                    (stencilRef &lt; (int)maxStencil) ? stencilRef : maxStencil);
-            mDevice-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILMASK : D3DRS_CCW_STENCILMASK,
-                                    depthStencilState.stencilMask);
-
-            mDevice-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILFAIL : D3DRS_CCW_STENCILFAIL,
-                                    gl_d3d9::ConvertStencilOp(depthStencilState.stencilFail));
-            mDevice-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILZFAIL : D3DRS_CCW_STENCILZFAIL,
-                                    gl_d3d9::ConvertStencilOp(depthStencilState.stencilPassDepthFail));
-            mDevice-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILPASS : D3DRS_CCW_STENCILPASS,
-                                    gl_d3d9::ConvertStencilOp(depthStencilState.stencilPassDepthPass));
-
-            mDevice-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK,
-                                    depthStencilState.stencilBackWritemask);
-            mDevice-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILFUNC : D3DRS_CCW_STENCILFUNC,
-                                    gl_d3d9::ConvertComparison(depthStencilState.stencilBackFunc));
-
-            mDevice-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILREF : D3DRS_CCW_STENCILREF,
-                                    (stencilBackRef &lt; (int)maxStencil) ? stencilBackRef : maxStencil);
-            mDevice-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILMASK : D3DRS_CCW_STENCILMASK,
-                                    depthStencilState.stencilBackMask);
-
-            mDevice-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILFAIL : D3DRS_CCW_STENCILFAIL,
-                                    gl_d3d9::ConvertStencilOp(depthStencilState.stencilBackFail));
-            mDevice-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILZFAIL : D3DRS_CCW_STENCILZFAIL,
-                                    gl_d3d9::ConvertStencilOp(depthStencilState.stencilBackPassDepthFail));
-            mDevice-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILPASS : D3DRS_CCW_STENCILPASS,
-                                    gl_d3d9::ConvertStencilOp(depthStencilState.stencilBackPassDepthPass));
-        }
-        else
-        {
-            mDevice-&gt;SetRenderState(D3DRS_STENCILENABLE, FALSE);
-        }
-
-        mDevice-&gt;SetRenderState(D3DRS_ZWRITEENABLE, depthStencilState.depthMask ? TRUE : FALSE);
-
-        mCurStencilRef = stencilRef;
-        mCurStencilBackRef = stencilBackRef;
-        mCurFrontFaceCCW = frontFaceCCW;
-    }
-
-    mForceSetDepthStencilState = false;
-
-    return gl::Error(GL_NO_ERROR);
</del><ins>+    mStateManager.setScissorState(scissor, enabled);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer9::setScissorRectangle(const gl::Rectangle &amp;scissor, bool enabled)
</del><ins>+gl::Error Renderer9::setBlendDepthRasterStates(const gl::Data &amp;glData, GLenum drawMode)
</ins><span class="cx"> {
</span><del>-    bool scissorChanged = mForceSetScissor ||
-                          memcmp(&amp;scissor, &amp;mCurScissor, sizeof(gl::Rectangle)) != 0 ||
-                          enabled != mScissorEnabled;
</del><ins>+    int samples                    = glData.state-&gt;getDrawFramebuffer()-&gt;getSamples(glData);
+    gl::RasterizerState rasterizer = glData.state-&gt;getRasterizerState();
+    rasterizer.pointDrawMode       = (drawMode == GL_POINTS);
+    rasterizer.multiSample         = (samples != 0);
</ins><span class="cx"> 
</span><del>-    if (scissorChanged)
-    {
-        if (enabled)
-        {
-            RECT rect;
-            rect.left = gl::clamp(scissor.x, 0, static_cast&lt;int&gt;(mRenderTargetDesc.width));
-            rect.top = gl::clamp(scissor.y, 0, static_cast&lt;int&gt;(mRenderTargetDesc.height));
-            rect.right = gl::clamp(scissor.x + scissor.width, 0, static_cast&lt;int&gt;(mRenderTargetDesc.width));
-            rect.bottom = gl::clamp(scissor.y + scissor.height, 0, static_cast&lt;int&gt;(mRenderTargetDesc.height));
-            mDevice-&gt;SetScissorRect(&amp;rect);
-        }
-
-        mDevice-&gt;SetRenderState(D3DRS_SCISSORTESTENABLE, enabled ? TRUE : FALSE);
-
-        mScissorEnabled = enabled;
-        mCurScissor = scissor;
-    }
-
-    mForceSetScissor = false;
</del><ins>+    unsigned int mask = GetBlendSampleMask(glData, samples);
+    return mStateManager.setBlendDepthRasterStates(*glData.state, mask);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer9::setViewport(const gl::Rectangle &amp;viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace,
</del><ins>+void Renderer9::setViewport(const gl::Caps *caps,
+                            const gl::Rectangle &amp;viewport,
+                            float zNear,
+                            float zFar,
+                            GLenum drawMode,
+                            GLenum frontFace,
</ins><span class="cx">                             bool ignoreViewport)
</span><span class="cx"> {
</span><del>-    gl::Rectangle actualViewport = viewport;
-    float actualZNear = gl::clamp01(zNear);
-    float actualZFar = gl::clamp01(zFar);
-    if (ignoreViewport)
-    {
-        actualViewport.x = 0;
-        actualViewport.y = 0;
-        actualViewport.width = mRenderTargetDesc.width;
-        actualViewport.height = mRenderTargetDesc.height;
-        actualZNear = 0.0f;
-        actualZFar = 1.0f;
-    }
-
-    D3DVIEWPORT9 dxViewport;
-    dxViewport.X = gl::clamp(actualViewport.x, 0, static_cast&lt;int&gt;(mRenderTargetDesc.width));
-    dxViewport.Y = gl::clamp(actualViewport.y, 0, static_cast&lt;int&gt;(mRenderTargetDesc.height));
-    dxViewport.Width = gl::clamp(actualViewport.width, 0, static_cast&lt;int&gt;(mRenderTargetDesc.width) - static_cast&lt;int&gt;(dxViewport.X));
-    dxViewport.Height = gl::clamp(actualViewport.height, 0, static_cast&lt;int&gt;(mRenderTargetDesc.height) - static_cast&lt;int&gt;(dxViewport.Y));
-    dxViewport.MinZ = actualZNear;
-    dxViewport.MaxZ = actualZFar;
-
-    float depthFront = !gl::IsTriangleMode(drawMode) ? 0.0f : (frontFace == GL_CCW ? 1.0f : -1.0f);
-
-    bool viewportChanged = mForceSetViewport || memcmp(&amp;actualViewport, &amp;mCurViewport, sizeof(gl::Rectangle)) != 0 ||
-                           actualZNear != mCurNear || actualZFar != mCurFar || mCurDepthFront != depthFront;
-    if (viewportChanged)
-    {
-        mDevice-&gt;SetViewport(&amp;dxViewport);
-
-        mCurViewport = actualViewport;
-        mCurNear = actualZNear;
-        mCurFar = actualZFar;
-        mCurDepthFront = depthFront;
-
-        dx_VertexConstants vc = {0};
-        dx_PixelConstants pc = {0};
-
-        vc.viewAdjust[0] = (float)((actualViewport.width - (int)dxViewport.Width) + 2 * (actualViewport.x - (int)dxViewport.X) - 1) / dxViewport.Width;
-        vc.viewAdjust[1] = (float)((actualViewport.height - (int)dxViewport.Height) + 2 * (actualViewport.y - (int)dxViewport.Y) - 1) / dxViewport.Height;
-        vc.viewAdjust[2] = (float)actualViewport.width / dxViewport.Width;
-        vc.viewAdjust[3] = (float)actualViewport.height / dxViewport.Height;
-
-        pc.viewCoords[0] = actualViewport.width  * 0.5f;
-        pc.viewCoords[1] = actualViewport.height * 0.5f;
-        pc.viewCoords[2] = actualViewport.x + (actualViewport.width  * 0.5f);
-        pc.viewCoords[3] = actualViewport.y + (actualViewport.height * 0.5f);
-
-        pc.depthFront[0] = (actualZFar - actualZNear) * 0.5f;
-        pc.depthFront[1] = (actualZNear + actualZFar) * 0.5f;
-        pc.depthFront[2] = depthFront;
-
-        vc.depthRange[0] = actualZNear;
-        vc.depthRange[1] = actualZFar;
-        vc.depthRange[2] = actualZFar - actualZNear;
-
-        pc.depthRange[0] = actualZNear;
-        pc.depthRange[1] = actualZFar;
-        pc.depthRange[2] = actualZFar - actualZNear;
-
-        if (memcmp(&amp;vc, &amp;mVertexConstants, sizeof(dx_VertexConstants)) != 0)
-        {
-            mVertexConstants = vc;
-            mDxUniformsDirty = true;
-        }
-
-        if (memcmp(&amp;pc, &amp;mPixelConstants, sizeof(dx_PixelConstants)) != 0)
-        {
-            mPixelConstants = pc;
-            mDxUniformsDirty = true;
-        }
-    }
-
-    mForceSetViewport = false;
</del><ins>+    mStateManager.setViewportState(caps, viewport, zNear, zFar, drawMode, frontFace,
+                                   ignoreViewport);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Renderer9::applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize)
</span><span class="lines">@@ -1264,15 +1025,14 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(depthbuffer);
</span><span class="cx"> 
</span><del>-    GLsizei width  = depthbuffer-&gt;getWidth();
-    GLsizei height = depthbuffer-&gt;getHeight();
</del><ins>+    const gl::Extents &amp;size = depthbuffer-&gt;getSize();
</ins><span class="cx"> 
</span><span class="cx">     // search cached nullcolorbuffers
</span><span class="cx">     for (int i = 0; i &lt; NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++)
</span><span class="cx">     {
</span><span class="cx">         if (mNullColorbufferCache[i].buffer != NULL &amp;&amp;
</span><del>-            mNullColorbufferCache[i].width == width &amp;&amp;
-            mNullColorbufferCache[i].height == height)
</del><ins>+            mNullColorbufferCache[i].width == size.width &amp;&amp;
+            mNullColorbufferCache[i].height == size.height)
</ins><span class="cx">         {
</span><span class="cx">             mNullColorbufferCache[i].lruCount = ++mMaxNullColorbufferLRU;
</span><span class="cx">             *outColorBuffer = mNullColorbufferCache[i].buffer;
</span><span class="lines">@@ -1281,7 +1041,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     gl::Renderbuffer *nullRenderbuffer = new gl::Renderbuffer(createRenderbuffer(), 0);
</span><del>-    gl::Error error = nullRenderbuffer-&gt;setStorage(GL_NONE, width, height);
</del><ins>+    gl::Error error = nullRenderbuffer-&gt;setStorage(GL_NONE, size.width, size.height);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         SafeDelete(nullRenderbuffer);
</span><span class="lines">@@ -1303,8 +1063,8 @@
</span><span class="cx">     delete oldest-&gt;buffer;
</span><span class="cx">     oldest-&gt;buffer = nullbuffer;
</span><span class="cx">     oldest-&gt;lruCount = ++mMaxNullColorbufferLRU;
</span><del>-    oldest-&gt;width = width;
-    oldest-&gt;height = height;
</del><ins>+    oldest-&gt;width    = size.width;
+    oldest-&gt;height   = size.height;
</ins><span class="cx"> 
</span><span class="cx">     *outColorBuffer = nullbuffer;
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="lines">@@ -1314,12 +1074,13 @@
</span><span class="cx">                                        const gl::FramebufferAttachment *depthStencilAttachment)
</span><span class="cx"> {
</span><span class="cx">     const gl::FramebufferAttachment *renderAttachment = colorAttachment;
</span><ins>+    gl::Error error(GL_NO_ERROR);
</ins><span class="cx"> 
</span><span class="cx">     // if there is no color attachment we must synthesize a NULL colorattachment
</span><span class="cx">     // to keep the D3D runtime happy.  This should only be possible if depth texturing.
</span><span class="cx">     if (renderAttachment == nullptr)
</span><span class="cx">     {
</span><del>-        gl::Error error = getNullColorbuffer(depthStencilAttachment, &amp;renderAttachment);
</del><ins>+        error = getNullColorbuffer(depthStencilAttachment, &amp;renderAttachment);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -1331,19 +1092,19 @@
</span><span class="cx">     size_t renderTargetHeight = 0;
</span><span class="cx">     D3DFORMAT renderTargetFormat = D3DFMT_UNKNOWN;
</span><span class="cx"> 
</span><ins>+    RenderTarget9 *renderTarget = nullptr;
+    error = renderAttachment-&gt;getRenderTarget(&amp;renderTarget);
+    if (error.isError())
+    {
+        return error;
+    }
+    ASSERT(renderTarget);
+
</ins><span class="cx">     bool renderTargetChanged = false;
</span><del>-    unsigned int renderTargetSerial = GetAttachmentSerial(renderAttachment);
</del><ins>+    unsigned int renderTargetSerial = renderTarget-&gt;getSerial();
</ins><span class="cx">     if (renderTargetSerial != mAppliedRenderTargetSerial)
</span><span class="cx">     {
</span><span class="cx">         // Apply the render target on the device
</span><del>-        RenderTarget9 *renderTarget = nullptr;
-        gl::Error error = renderAttachment-&gt;getRenderTarget(&amp;renderTarget);
-        if (error.isError())
-        {
-            return error;
-        }
-        ASSERT(renderTarget);
-
</del><span class="cx">         IDirect3DSurface9 *renderTargetSurface = renderTarget-&gt;getSurface();
</span><span class="cx">         ASSERT(renderTargetSurface);
</span><span class="cx"> 
</span><span class="lines">@@ -1358,24 +1119,29 @@
</span><span class="cx">         renderTargetChanged = true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    unsigned int depthStencilSerial = (depthStencilAttachment != nullptr) ?
-                                       GetAttachmentSerial(depthStencilAttachment) : 0;
</del><ins>+    RenderTarget9 *depthStencilRenderTarget = nullptr;
+    unsigned int depthStencilSerial = 0;
+
+    if (depthStencilAttachment != nullptr)
+    {
+        error = depthStencilAttachment-&gt;getRenderTarget(&amp;depthStencilRenderTarget);
+        if (error.isError())
+        {
+            return error;
+        }
+        ASSERT(depthStencilRenderTarget);
+
+        depthStencilSerial = depthStencilRenderTarget-&gt;getSerial();
+    }
+
</ins><span class="cx">     if (depthStencilSerial != mAppliedDepthStencilSerial || !mDepthStencilInitialized)
</span><span class="cx">     {
</span><span class="cx">         unsigned int depthSize = 0;
</span><span class="cx">         unsigned int stencilSize = 0;
</span><span class="cx"> 
</span><span class="cx">         // Apply the depth stencil on the device
</span><del>-        if (depthStencilAttachment)
</del><ins>+        if (depthStencilRenderTarget)
</ins><span class="cx">         {
</span><del>-            RenderTarget9 *depthStencilRenderTarget = nullptr;
-            gl::Error error = depthStencilAttachment-&gt;getRenderTarget(&amp;depthStencilRenderTarget);
-            if (error.isError())
-            {
-                return error;
-            }
-            ASSERT(depthStencilRenderTarget);
-
</del><span class="cx">             IDirect3DSurface9 *depthStencilSurface = depthStencilRenderTarget-&gt;getSurface();
</span><span class="cx">             ASSERT(depthStencilSurface);
</span><span class="cx"> 
</span><span class="lines">@@ -1390,31 +1156,18 @@
</span><span class="cx">             mDevice-&gt;SetDepthStencilSurface(NULL);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!mDepthStencilInitialized || depthSize != mCurDepthSize)
-        {
-            mCurDepthSize = depthSize;
-            mForceSetRasterState = true;
-        }
</del><ins>+        mStateManager.updateDepthSizeIfChanged(mDepthStencilInitialized, depthSize);
+        mStateManager.updateStencilSizeIfChanged(mDepthStencilInitialized, stencilSize);
</ins><span class="cx"> 
</span><del>-        if (!mDepthStencilInitialized || stencilSize != mCurStencilSize)
-        {
-            mCurStencilSize = stencilSize;
-            mForceSetDepthStencilState = true;
-        }
-
</del><span class="cx">         mAppliedDepthStencilSerial = depthStencilSerial;
</span><span class="cx">         mDepthStencilInitialized = true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (renderTargetChanged || !mRenderTargetDescInitialized)
</span><span class="cx">     {
</span><del>-        mForceSetScissor = true;
-        mForceSetViewport = true;
-        mForceSetBlendState = true;
-
-        mRenderTargetDesc.width = renderTargetWidth;
-        mRenderTargetDesc.height = renderTargetHeight;
-        mRenderTargetDesc.format = renderTargetFormat;
</del><ins>+        mStateManager.forceSetBlendState();
+        mStateManager.forceSetScissorState();
+        mStateManager.setRenderTargetBounds(renderTargetWidth, renderTargetHeight);
</ins><span class="cx">         mRenderTargetDescInitialized = true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1426,22 +1179,35 @@
</span><span class="cx">     return applyRenderTarget(framebuffer-&gt;getColorbuffer(0), framebuffer-&gt;getDepthOrStencilbuffer());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer9::applyVertexBuffer(const gl::State &amp;state, GLenum mode, GLint first, GLsizei count, GLsizei instances)
</del><ins>+gl::Error Renderer9::applyVertexBuffer(const gl::State &amp;state,
+                                       GLenum mode,
+                                       GLint first,
+                                       GLsizei count,
+                                       GLsizei instances,
+                                       TranslatedIndexData * /*indexInfo*/)
</ins><span class="cx"> {
</span><del>-    TranslatedAttribute attributes[gl::MAX_VERTEX_ATTRIBS];
-    gl::Error error = mVertexDataManager-&gt;prepareVertexData(state, first, count, attributes, instances);
</del><ins>+    gl::Error error = mVertexDataManager-&gt;prepareVertexData(state, first, count, &amp;mTranslatedAttribCache, instances);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return mVertexDeclarationCache.applyDeclaration(mDevice, attributes, state.getProgram(), instances, &amp;mRepeatDraw);
</del><ins>+    return mVertexDeclarationCache.applyDeclaration(
+        mDevice, mTranslatedAttribCache, state.getProgram(), first, instances, &amp;mRepeatDraw);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Applies the indices and element array bindings to the Direct3D 9 device
</span><del>-gl::Error Renderer9::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo)
</del><ins>+gl::Error Renderer9::applyIndexBuffer(const gl::Data &amp;data,
+                                      const GLvoid *indices,
+                                      GLsizei count,
+                                      GLenum mode,
+                                      GLenum type,
+                                      TranslatedIndexData *indexInfo)
</ins><span class="cx"> {
</span><del>-    gl::Error error = mIndexDataManager-&gt;prepareIndexData(type, count, elementArrayBuffer, indices, indexInfo);
</del><ins>+    gl::VertexArray *vao           = data.state-&gt;getVertexArray();
+    gl::Buffer *elementArrayBuffer = vao-&gt;getElementArrayBuffer().get();
+    gl::Error error = mIndexDataManager-&gt;prepareIndexData(type, count, elementArrayBuffer, indices,
+                                                          indexInfo, false);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -1461,12 +1227,17 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer9::applyTransformFeedbackBuffers(const gl::State&amp; state)
</del><ins>+gl::Error Renderer9::applyTransformFeedbackBuffers(const gl::State &amp;state)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!state.isTransformFeedbackActiveUnpaused());
</span><ins>+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer9::drawArrays(const gl::Data &amp;data, GLenum mode, GLsizei count, GLsizei instances, bool usesPointSize)
</del><ins>+gl::Error Renderer9::drawArraysImpl(const gl::Data &amp;data,
+                                    GLenum mode,
+                                    GLint startVertex,
+                                    GLsizei count,
+                                    GLsizei instances)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!data.state-&gt;isTransformFeedbackActiveUnpaused());
</span><span class="cx"> 
</span><span class="lines">@@ -1507,13 +1278,21 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer9::drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
-                                  gl::Buffer *elementArrayBuffer, const TranslatedIndexData &amp;indexInfo, GLsizei /*instances*/)
</del><ins>+gl::Error Renderer9::drawElementsImpl(const gl::Data &amp;data,
+                                      const TranslatedIndexData &amp;indexInfo,
+                                      GLenum mode,
+                                      GLsizei count,
+                                      GLenum type,
+                                      const GLvoid *indices,
+                                      GLsizei /*instances*/)
</ins><span class="cx"> {
</span><span class="cx">     startScene();
</span><span class="cx"> 
</span><span class="cx">     int minIndex = static_cast&lt;int&gt;(indexInfo.indexRange.start);
</span><span class="cx"> 
</span><ins>+    gl::VertexArray *vao           = data.state-&gt;getVertexArray();
+    gl::Buffer *elementArrayBuffer = vao-&gt;getElementArrayBuffer().get();
+
</ins><span class="cx">     if (mode == GL_POINTS)
</span><span class="cx">     {
</span><span class="cx">         return drawIndexedPoints(count, type, indices, minIndex, elementArrayBuffer);
</span><span class="lines">@@ -1524,10 +1303,12 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><ins>+        size_t vertexCount = indexInfo.indexRange.vertexCount();
</ins><span class="cx">         for (int i = 0; i &lt; mRepeatDraw; i++)
</span><span class="cx">         {
</span><del>-            GLsizei vertexCount = static_cast&lt;int&gt;(indexInfo.indexRange.length()) + 1;
-            mDevice-&gt;DrawIndexedPrimitive(mPrimitiveType, -minIndex, minIndex, vertexCount, indexInfo.startIndex, mPrimitiveCount);
</del><ins>+            mDevice-&gt;DrawIndexedPrimitive(mPrimitiveType, -minIndex, minIndex,
+                                          static_cast&lt;UINT&gt;(vertexCount), indexInfo.startIndex,
+                                          mPrimitiveCount);
</ins><span class="cx">         }
</span><span class="cx">         return gl::Error(GL_NO_ERROR);
</span><span class="cx">     }
</span><span class="lines">@@ -1767,7 +1548,7 @@
</span><span class="cx">     // Update the counting index buffer if it is not large enough or has not been created yet.
</span><span class="cx">     if (count &lt;= 65536)   // 16-bit indices
</span><span class="cx">     {
</span><del>-        const unsigned int spaceNeeded = count * sizeof(unsigned short);
</del><ins>+        const unsigned int spaceNeeded = static_cast&lt;unsigned int&gt;(count) * sizeof(unsigned short);
</ins><span class="cx"> 
</span><span class="cx">         if (!mCountingIB || mCountingIB-&gt;getBufferSize() &lt; spaceNeeded)
</span><span class="cx">         {
</span><span class="lines">@@ -1797,7 +1578,7 @@
</span><span class="cx">     }
</span><span class="cx">     else if (getRendererExtensions().elementIndexUint)
</span><span class="cx">     {
</span><del>-        const unsigned int spaceNeeded = count * sizeof(unsigned int);
</del><ins>+        const unsigned int spaceNeeded = static_cast&lt;unsigned int&gt;(count) * sizeof(unsigned int);
</ins><span class="cx"> 
</span><span class="cx">         if (!mCountingIB || mCountingIB-&gt;getBufferSize() &lt; spaceNeeded)
</span><span class="cx">         {
</span><span class="lines">@@ -1813,7 +1594,7 @@
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             unsigned int *data = reinterpret_cast&lt;unsigned int*&gt;(mappedMemory);
</span><del>-            for (size_t i = 0; i &lt; count; i++)
</del><ins>+            for (unsigned int i = 0; i &lt; count; i++)
</ins><span class="cx">             {
</span><span class="cx">                 data[i] = i;
</span><span class="cx">             }
</span><span class="lines">@@ -1834,14 +1615,11 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer9::applyShaders(gl::Program *program, const gl::VertexFormat inputLayout[], const gl::Framebuffer *framebuffer,
-                                  bool rasterizerDiscard, bool transformFeedbackActive)
</del><ins>+gl::Error Renderer9::applyShadersImpl(const gl::Data &amp;data, GLenum /*drawMode*/)
</ins><span class="cx"> {
</span><del>-    ASSERT(!transformFeedbackActive);
-    ASSERT(!rasterizerDiscard);
</del><ins>+    ProgramD3D *programD3D  = GetImplAs&lt;ProgramD3D&gt;(data.state-&gt;getProgram());
+    const auto &amp;inputLayout = programD3D-&gt;getCachedInputLayout();
</ins><span class="cx"> 
</span><del>-    ProgramD3D *programD3D = GetImplAs&lt;ProgramD3D&gt;(program);
-
</del><span class="cx">     ShaderExecutableD3D *vertexExe = NULL;
</span><span class="cx">     gl::Error error = programD3D-&gt;getVertexExecutableForInputLayout(inputLayout, &amp;vertexExe, nullptr);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -1849,8 +1627,9 @@
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    const gl::Framebuffer *drawFramebuffer = data.state-&gt;getDrawFramebuffer();
</ins><span class="cx">     ShaderExecutableD3D *pixelExe = NULL;
</span><del>-    error = programD3D-&gt;getPixelExecutableForFramebuffer(framebuffer, &amp;pixelExe);
</del><ins>+    error = programD3D-&gt;getPixelExecutableForFramebuffer(drawFramebuffer, &amp;pixelExe);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="lines">@@ -1880,68 +1659,63 @@
</span><span class="cx">     if (programSerial != mAppliedProgramSerial)
</span><span class="cx">     {
</span><span class="cx">         programD3D-&gt;dirtyAllUniforms();
</span><del>-        mDxUniformsDirty = true;
</del><ins>+        mStateManager.forceSetDXUniformsState();
</ins><span class="cx">         mAppliedProgramSerial = programSerial;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer9::applyUniforms(const ProgramImpl &amp;program, const std::vector&lt;gl::LinkedUniform*&gt; &amp;uniformArray)
</del><ins>+gl::Error Renderer9::applyUniforms(const ProgramD3D &amp;programD3D,
+                                   GLenum /*drawMode*/,
+                                   const std::vector&lt;D3DUniform *&gt; &amp;uniformArray)
</ins><span class="cx"> {
</span><del>-    for (size_t uniformIndex = 0; uniformIndex &lt; uniformArray.size(); uniformIndex++)
</del><ins>+    for (const D3DUniform *targetUniform : uniformArray)
</ins><span class="cx">     {
</span><del>-        gl::LinkedUniform *targetUniform = uniformArray[uniformIndex];
</del><ins>+        if (!targetUniform-&gt;dirty)
+            continue;
</ins><span class="cx"> 
</span><del>-        if (targetUniform-&gt;dirty)
-        {
-            GLfloat *f = (GLfloat*)targetUniform-&gt;data;
-            GLint *i = (GLint*)targetUniform-&gt;data;
</del><ins>+        GLfloat *f = (GLfloat *)targetUniform-&gt;data;
+        GLint *i   = (GLint *)targetUniform-&gt;data;
</ins><span class="cx"> 
</span><del>-            switch (targetUniform-&gt;type)
-            {
-              case GL_SAMPLER_2D:
-              case GL_SAMPLER_CUBE:
</del><ins>+        switch (targetUniform-&gt;type)
+        {
+            case GL_SAMPLER_2D:
+            case GL_SAMPLER_CUBE:
</ins><span class="cx">                 break;
</span><del>-              case GL_BOOL:
-              case GL_BOOL_VEC2:
-              case GL_BOOL_VEC3:
-              case GL_BOOL_VEC4:
</del><ins>+            case GL_BOOL:
+            case GL_BOOL_VEC2:
+            case GL_BOOL_VEC3:
+            case GL_BOOL_VEC4:
</ins><span class="cx">                 applyUniformnbv(targetUniform, i);
</span><span class="cx">                 break;
</span><del>-              case GL_FLOAT:
-              case GL_FLOAT_VEC2:
-              case GL_FLOAT_VEC3:
-              case GL_FLOAT_VEC4:
-              case GL_FLOAT_MAT2:
-              case GL_FLOAT_MAT3:
-              case GL_FLOAT_MAT4:
</del><ins>+            case GL_FLOAT:
+            case GL_FLOAT_VEC2:
+            case GL_FLOAT_VEC3:
+            case GL_FLOAT_VEC4:
+            case GL_FLOAT_MAT2:
+            case GL_FLOAT_MAT3:
+            case GL_FLOAT_MAT4:
</ins><span class="cx">                 applyUniformnfv(targetUniform, f);
</span><span class="cx">                 break;
</span><del>-              case GL_INT:
-              case GL_INT_VEC2:
-              case GL_INT_VEC3:
-              case GL_INT_VEC4:
</del><ins>+            case GL_INT:
+            case GL_INT_VEC2:
+            case GL_INT_VEC3:
+            case GL_INT_VEC4:
</ins><span class="cx">                 applyUniformniv(targetUniform, i);
</span><span class="cx">                 break;
</span><del>-              default:
</del><ins>+            default:
</ins><span class="cx">                 UNREACHABLE();
</span><del>-            }
</del><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Driver uniforms
</span><del>-    if (mDxUniformsDirty)
-    {
-        mDevice-&gt;SetVertexShaderConstantF(0, (float*)&amp;mVertexConstants, sizeof(dx_VertexConstants) / sizeof(float[4]));
-        mDevice-&gt;SetPixelShaderConstantF(0, (float*)&amp;mPixelConstants, sizeof(dx_PixelConstants) / sizeof(float[4]));
-        mDxUniformsDirty = false;
-    }
</del><ins>+    mStateManager.setShaderConstants();
</ins><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer9::applyUniformnfv(gl::LinkedUniform *targetUniform, const GLfloat *v)
</del><ins>+void Renderer9::applyUniformnfv(const D3DUniform *targetUniform, const GLfloat *v)
</ins><span class="cx"> {
</span><span class="cx">     if (targetUniform-&gt;isReferencedByFragmentShader())
</span><span class="cx">     {
</span><span class="lines">@@ -1954,7 +1728,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer9::applyUniformniv(gl::LinkedUniform *targetUniform, const GLint *v)
</del><ins>+void Renderer9::applyUniformniv(const D3DUniform *targetUniform, const GLint *v)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(targetUniform-&gt;registerCount &lt;= MAX_VERTEX_CONSTANT_VECTORS_D3D9);
</span><span class="cx">     GLfloat vector[MAX_VERTEX_CONSTANT_VECTORS_D3D9][4];
</span><span class="lines">@@ -1970,7 +1744,7 @@
</span><span class="cx">     applyUniformnfv(targetUniform, (GLfloat*)vector);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer9::applyUniformnbv(gl::LinkedUniform *targetUniform, const GLint *v)
</del><ins>+void Renderer9::applyUniformnbv(const D3DUniform *targetUniform, const GLint *v)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(targetUniform-&gt;registerCount &lt;= MAX_VERTEX_CONSTANT_VECTORS_D3D9);
</span><span class="cx">     GLfloat vector[MAX_VERTEX_CONSTANT_VECTORS_D3D9][4];
</span><span class="lines">@@ -2170,14 +1944,17 @@
</span><span class="cx">             mDevice-&gt;SetStreamSourceFreq(i, 1);
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        int renderTargetWidth  = mStateManager.getRenderTargetWidth();
+        int renderTargetHeight = mStateManager.getRenderTargetHeight();
+
</ins><span class="cx">         float quad[4][4];   // A quadrilateral covering the target, aligned to match the edges
</span><span class="cx">         quad[0][0] = -0.5f;
</span><del>-        quad[0][1] = mRenderTargetDesc.height - 0.5f;
</del><ins>+        quad[0][1] = renderTargetHeight - 0.5f;
</ins><span class="cx">         quad[0][2] = 0.0f;
</span><span class="cx">         quad[0][3] = 1.0f;
</span><span class="cx"> 
</span><del>-        quad[1][0] = mRenderTargetDesc.width - 0.5f;
-        quad[1][1] = mRenderTargetDesc.height - 0.5f;
</del><ins>+        quad[1][0] = renderTargetWidth - 0.5f;
+        quad[1][1] = renderTargetHeight - 0.5f;
</ins><span class="cx">         quad[1][2] = 0.0f;
</span><span class="cx">         quad[1][3] = 1.0f;
</span><span class="cx"> 
</span><span class="lines">@@ -2186,7 +1963,7 @@
</span><span class="cx">         quad[2][2] = 0.0f;
</span><span class="cx">         quad[2][3] = 1.0f;
</span><span class="cx"> 
</span><del>-        quad[3][0] = mRenderTargetDesc.width - 0.5f;
</del><ins>+        quad[3][0] = renderTargetWidth - 0.5f;
</ins><span class="cx">         quad[3][1] = -0.5f;
</span><span class="cx">         quad[3][2] = 0.0f;
</span><span class="cx">         quad[3][3] = 1.0f;
</span><span class="lines">@@ -2235,31 +2012,31 @@
</span><span class="cx">     mDepthStencilInitialized = false;
</span><span class="cx">     mRenderTargetDescInitialized = false;
</span><span class="cx"> 
</span><del>-    mForceSetDepthStencilState = true;
-    mForceSetRasterState = true;
-    mForceSetScissor = true;
-    mForceSetViewport = true;
-    mForceSetBlendState = true;
</del><ins>+    mStateManager.forceSetRasterState();
+    mStateManager.forceSetDepthStencilState();
+    mStateManager.forceSetBlendState();
+    mStateManager.forceSetScissorState();
+    mStateManager.forceSetViewportState();
</ins><span class="cx"> 
</span><del>-    ASSERT(mForceSetVertexSamplerStates.size() == mCurVertexTextureSerials.size());
-    for (unsigned int i = 0; i &lt; mForceSetVertexSamplerStates.size(); i++)
</del><ins>+    ASSERT(mCurVertexSamplerStates.size() == mCurVertexTextures.size());
+    for (unsigned int i = 0; i &lt; mCurVertexTextures.size(); i++)
</ins><span class="cx">     {
</span><del>-        mForceSetVertexSamplerStates[i] = true;
-        mCurVertexTextureSerials[i] = 0;
</del><ins>+        mCurVertexSamplerStates[i].forceSet = true;
+        mCurVertexTextures[i]               = angle::DirtyPointer;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(mForceSetPixelSamplerStates.size() == mCurPixelTextureSerials.size());
-    for (unsigned int i = 0; i &lt; mForceSetPixelSamplerStates.size(); i++)
</del><ins>+    ASSERT(mCurPixelSamplerStates.size() == mCurPixelTextures.size());
+    for (unsigned int i = 0; i &lt; mCurPixelSamplerStates.size(); i++)
</ins><span class="cx">     {
</span><del>-        mForceSetPixelSamplerStates[i] = true;
-        mCurPixelTextureSerials[i] = 0;
</del><ins>+        mCurPixelSamplerStates[i].forceSet = true;
+        mCurPixelTextures[i]               = angle::DirtyPointer;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mAppliedIBSerial = 0;
</span><span class="cx">     mAppliedVertexShader = NULL;
</span><span class="cx">     mAppliedPixelShader = NULL;
</span><span class="cx">     mAppliedProgramSerial = 0;
</span><del>-    mDxUniformsDirty = true;
</del><ins>+    mStateManager.forceSetDXUniformsState();
</ins><span class="cx"> 
</span><span class="cx">     mVertexDeclarationCache.markStateDirty();
</span><span class="cx"> }
</span><span class="lines">@@ -2472,19 +2249,26 @@
</span><span class="cx">     return rendererString.str();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GUID Renderer9::getAdapterIdentifier() const
</del><ins>+DeviceIdentifier Renderer9::getAdapterIdentifier() const
</ins><span class="cx"> {
</span><del>-    return mAdapterIdentifier.DeviceIdentifier;
</del><ins>+    DeviceIdentifier deviceIdentifier = { 0 };
+    deviceIdentifier.VendorId = static_cast&lt;UINT&gt;(mAdapterIdentifier.VendorId);
+    deviceIdentifier.DeviceId = static_cast&lt;UINT&gt;(mAdapterIdentifier.DeviceId);
+    deviceIdentifier.SubSysId = static_cast&lt;UINT&gt;(mAdapterIdentifier.SubSysId);
+    deviceIdentifier.Revision = static_cast&lt;UINT&gt;(mAdapterIdentifier.Revision);
+    deviceIdentifier.FeatureLevel = 0;
+
+    return deviceIdentifier;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned int Renderer9::getReservedVertexUniformVectors() const
</span><span class="cx"> {
</span><del>-    return 2;   // dx_ViewAdjust and dx_DepthRange.
</del><ins>+    return d3d9_gl::GetReservedVertexUniformVectors();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned int Renderer9::getReservedFragmentUniformVectors() const
</span><span class="cx"> {
</span><del>-    return 3;   // dx_ViewCoords, dx_DepthFront and dx_DepthRange.
</del><ins>+    return d3d9_gl::GetReservedFragmentUniformVectors();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned int Renderer9::getReservedVertexUniformBuffers() const
</span><span class="lines">@@ -2503,11 +2287,6 @@
</span><span class="cx">     return (mD3d9Ex != NULL) &amp;&amp; !gl::DebugAnnotationsActive();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool Renderer9::getPostSubBufferSupport() const
-{
-    return true;
-}
-
</del><span class="cx"> int Renderer9::getMajorShaderModel() const
</span><span class="cx"> {
</span><span class="cx">     return D3DSHADER_VERSION_MAJOR(mDeviceCaps.PixelShaderVersion);
</span><span class="lines">@@ -2592,6 +2371,7 @@
</span><span class="cx">     const gl::TextureCaps &amp;textureCaps = getRendererTextureCaps().get(format);
</span><span class="cx">     GLuint supportedSamples = textureCaps.getNearestSamples(samples);
</span><span class="cx"> 
</span><ins>+    IDirect3DTexture9 *texture      = nullptr;
</ins><span class="cx">     IDirect3DSurface9 *renderTarget = NULL;
</span><span class="cx">     if (width &gt; 0 &amp;&amp; height &gt; 0)
</span><span class="cx">     {
</span><span class="lines">@@ -2607,10 +2387,23 @@
</span><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><del>-            requiresInitialization = (d3d9FormatInfo.dataInitializerFunction != NULL);
-            result = mDevice-&gt;CreateRenderTarget(width, height, d3d9FormatInfo.renderFormat,
-                                                 gl_d3d9::GetMultisampleType(supportedSamples),
-                                                 0, FALSE, &amp;renderTarget, NULL);
</del><ins>+            requiresInitialization = (d3d9FormatInfo.dataInitializerFunction != nullptr);
+            if (supportedSamples &gt; 0)
+            {
+                result = mDevice-&gt;CreateRenderTarget(width, height, d3d9FormatInfo.renderFormat,
+                                                     gl_d3d9::GetMultisampleType(supportedSamples),
+                                                     0, FALSE, &amp;renderTarget, nullptr);
+            }
+            else
+            {
+                result = mDevice-&gt;CreateTexture(
+                    width, height, 1, D3DUSAGE_RENDERTARGET, d3d9FormatInfo.texFormat,
+                    getTexturePool(D3DUSAGE_RENDERTARGET), &amp;texture, nullptr);
+                if (!FAILED(result))
+                {
+                    result = texture-&gt;GetSurfaceLevel(0, &amp;renderTarget);
+                }
+            }
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (FAILED(result))
</span><span class="lines">@@ -2632,13 +2425,36 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    *outRT = new TextureRenderTarget9(renderTarget, format, width, height, 1, supportedSamples);
</del><ins>+    *outRT = new TextureRenderTarget9(texture, 0, renderTarget, format, width, height, 1,
+                                      supportedSamples);
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FramebufferImpl *Renderer9::createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data)
</del><ins>+gl::Error Renderer9::createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT)
</ins><span class="cx"> {
</span><del>-    return createFramebuffer(data);
</del><ins>+    ASSERT(source != nullptr);
+
+    RenderTargetD3D *newRT = nullptr;
+    gl::Error error = createRenderTarget(source-&gt;getWidth(), source-&gt;getHeight(),
+                                         source-&gt;getInternalFormat(), source-&gt;getSamples(), &amp;newRT);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    RenderTarget9 *source9 = GetAs&lt;RenderTarget9&gt;(source);
+    RenderTarget9 *dest9   = GetAs&lt;RenderTarget9&gt;(newRT);
+
+    HRESULT result = mDevice-&gt;StretchRect(source9-&gt;getSurface(), nullptr, dest9-&gt;getSurface(),
+                                          nullptr, D3DTEXF_NONE);
+    if (FAILED(result))
+    {
+        ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
+        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to copy render target, result: 0x%X.&quot;, result);
+    }
+
+    *outRT = newRT;
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FramebufferImpl *Renderer9::createFramebuffer(const gl::Framebuffer::Data &amp;data)
</span><span class="lines">@@ -2646,27 +2462,25 @@
</span><span class="cx">     return new Framebuffer9(data, this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CompilerImpl *Renderer9::createCompiler(const gl::Data &amp;data)
</del><ins>+ShaderImpl *Renderer9::createShader(const gl::Shader::Data &amp;data)
</ins><span class="cx"> {
</span><del>-    return new CompilerD3D(data, SH_HLSL9_OUTPUT);
</del><ins>+    return new ShaderD3D(data);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ShaderImpl *Renderer9::createShader(GLenum type)
</del><ins>+ProgramImpl *Renderer9::createProgram(const gl::Program::Data &amp;data)
</ins><span class="cx"> {
</span><del>-    return new ShaderD3D(type);
</del><ins>+    return new ProgramD3D(data, this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ProgramImpl *Renderer9::createProgram()
</del><ins>+gl::Error Renderer9::loadExecutable(const void *function,
+                                    size_t length,
+                                    ShaderType type,
+                                    const std::vector&lt;D3DVarying&gt; &amp;streamOutVaryings,
+                                    bool separatedOutputBuffers,
+                                    ShaderExecutableD3D **outExecutable)
</ins><span class="cx"> {
</span><del>-    return new ProgramD3D(this);
-}
-
-gl::Error Renderer9::loadExecutable(const void *function, size_t length, ShaderType type,
-                                    const std::vector&lt;gl::LinkedVarying&gt; &amp;transformFeedbackVaryings,
-                                    bool separatedOutputBuffers, ShaderExecutableD3D **outExecutable)
-{
</del><span class="cx">     // Transform feedback is not supported in ES2 or D3D9
</span><del>-    ASSERT(transformFeedbackVaryings.size() == 0);
</del><ins>+    ASSERT(streamOutVaryings.empty());
</ins><span class="cx"> 
</span><span class="cx">     switch (type)
</span><span class="cx">     {
</span><span class="lines">@@ -2700,13 +2514,16 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer9::compileToExecutable(gl::InfoLog &amp;infoLog, const std::string &amp;shaderHLSL, ShaderType type,
-                                         const std::vector&lt;gl::LinkedVarying&gt; &amp;transformFeedbackVaryings,
-                                         bool separatedOutputBuffers, const D3DCompilerWorkarounds &amp;workarounds,
</del><ins>+gl::Error Renderer9::compileToExecutable(gl::InfoLog &amp;infoLog,
+                                         const std::string &amp;shaderHLSL,
+                                         ShaderType type,
+                                         const std::vector&lt;D3DVarying&gt; &amp;streamOutVaryings,
+                                         bool separatedOutputBuffers,
+                                         const D3DCompilerWorkarounds &amp;workarounds,
</ins><span class="cx">                                          ShaderExecutableD3D **outExectuable)
</span><span class="cx"> {
</span><span class="cx">     // Transform feedback is not supported in ES2 or D3D9
</span><del>-    ASSERT(transformFeedbackVaryings.size() == 0);
</del><ins>+    ASSERT(streamOutVaryings.empty());
</ins><span class="cx"> 
</span><span class="cx">     const char *profileType = NULL;
</span><span class="cx">     switch (type)
</span><span class="lines">@@ -2769,7 +2586,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     error = loadExecutable(binary-&gt;GetBufferPointer(), binary-&gt;GetBufferSize(), type,
</span><del>-                           transformFeedbackVaryings, separatedOutputBuffers, outExectuable);
</del><ins>+                           streamOutVaryings, separatedOutputBuffers, outExectuable);
</ins><span class="cx"> 
</span><span class="cx">     SafeRelease(binary);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -2860,7 +2677,8 @@
</span><span class="cx">     return Image9::generateMipmap(dst9, src9);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error Renderer9::generateMipmapsUsingD3D(TextureStorage *storage, const gl::SamplerState &amp;samplerState)
</del><ins>+gl::Error Renderer9::generateMipmapsUsingD3D(TextureStorage *storage,
+                                             const gl::TextureState &amp;textureState)
</ins><span class="cx"> {
</span><span class="cx">     UNREACHABLE();
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="lines">@@ -2872,6 +2690,11 @@
</span><span class="cx">     return new TextureStorage9_2D(this, swapChain9);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TextureStorage *Renderer9::createTextureStorageEGLImage(EGLImageD3D *eglImage)
+{
+    return new TextureStorage9_EGLImage(this, eglImage);
+}
+
</ins><span class="cx"> TextureStorage *Renderer9::createTextureStorage2D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly)
</span><span class="cx"> {
</span><span class="cx">     return new TextureStorage9_2D(this, internalformat, renderTarget, width, height, levels);
</span><span class="lines">@@ -2930,24 +2753,107 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-VertexConversionType Renderer9::getVertexConversionType(const gl::VertexFormat &amp;vertexFormat) const
</del><ins>+VertexConversionType Renderer9::getVertexConversionType(gl::VertexFormatType vertexFormatType) const
</ins><span class="cx"> {
</span><del>-    return d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormat).conversionType;
</del><ins>+    return d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType).conversionType;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLenum Renderer9::getVertexComponentType(const gl::VertexFormat &amp;vertexFormat) const
</del><ins>+GLenum Renderer9::getVertexComponentType(gl::VertexFormatType vertexFormatType) const
</ins><span class="cx"> {
</span><del>-    return d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormat).componentType;
</del><ins>+    return d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType).componentType;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Renderer9::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap *outTextureCaps, gl::Extensions *outExtensions) const
</del><ins>+gl::ErrorOrResult&lt;unsigned int&gt; Renderer9::getVertexSpaceRequired(const gl::VertexAttribute &amp;attrib,
+                                                                  GLsizei count,
+                                                                  GLsizei instances) const
</ins><span class="cx"> {
</span><del>-    d3d9_gl::GenerateCaps(mD3d9, mDevice, mDeviceType, mAdapter, outCaps, outTextureCaps, outExtensions);
</del><ins>+    gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, GL_FLOAT);
+    const d3d9::VertexFormat &amp;d3d9VertexInfo =
+        d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType);
+
+    if (!attrib.enabled)
+    {
+        return 16u;
+    }
+
+    unsigned int elementCount = 0;
+    if (instances == 0 || attrib.divisor == 0)
+    {
+        elementCount = static_cast&lt;unsigned int&gt;(count);
+    }
+    else
+    {
+        // Round up to divisor, if possible
+        elementCount = UnsignedCeilDivide(static_cast&lt;unsigned int&gt;(instances), attrib.divisor);
+    }
+
+    if (d3d9VertexInfo.outputElementSize &gt; std::numeric_limits&lt;unsigned int&gt;::max() / elementCount)
+    {
+        return gl::Error(GL_OUT_OF_MEMORY, &quot;New vertex buffer size would result in an overflow.&quot;);
+    }
+
+    return static_cast&lt;unsigned int&gt;(d3d9VertexInfo.outputElementSize) * elementCount;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Workarounds Renderer9::generateWorkarounds() const
</del><ins>+void Renderer9::generateCaps(gl::Caps *outCaps,
+                             gl::TextureCapsMap *outTextureCaps,
+                             gl::Extensions *outExtensions,
+                             gl::Limitations *outLimitations) const
</ins><span class="cx"> {
</span><ins>+    d3d9_gl::GenerateCaps(mD3d9, mDevice, mDeviceType, mAdapter, outCaps, outTextureCaps,
+                          outExtensions, outLimitations);
+}
+
+WorkaroundsD3D Renderer9::generateWorkarounds() const
+{
</ins><span class="cx">     return d3d9::GenerateWorkarounds();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Renderer9::createAnnotator()
+{
+    mAnnotator = new DebugAnnotator9();
</ins><span class="cx"> }
</span><ins>+
+gl::Error Renderer9::clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd)
+{
+    // TODO(jmadill): faster way?
+    for (size_t samplerIndex = rangeStart; samplerIndex &lt; rangeEnd; samplerIndex++)
+    {
+        gl::Error error = setTexture(samplerType, static_cast&lt;int&gt;(samplerIndex), nullptr);
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+egl::Error Renderer9::getEGLDevice(DeviceImpl **device)
+{
+    if (mEGLDevice == nullptr)
+    {
+        ASSERT(mDevice != nullptr);
+        mEGLDevice       = new DeviceD3D();
+        egl::Error error = mEGLDevice-&gt;initialize(reinterpret_cast&lt;void *&gt;(mDevice),
+                                                  EGL_D3D9_DEVICE_ANGLE, EGL_FALSE);
+
+        if (error.isError())
+        {
+            SafeDelete(mEGLDevice);
+            return error;
+        }
+    }
+
+    *device = static_cast&lt;DeviceImpl *&gt;(mEGLDevice);
+    return egl::Error(EGL_SUCCESS);
+}
+
+Renderer9::CurSamplerState::CurSamplerState()
+    : forceSet(true),
+      baseLevel(std::numeric_limits&lt;size_t&gt;::max()),
+      samplerState()
+{
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9Renderer9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Renderer9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Renderer9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/Renderer9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -17,6 +17,7 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/ShaderCache.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d9/StateManager9.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="lines">@@ -32,10 +33,12 @@
</span><span class="cx"> {
</span><span class="cx"> class Blit9;
</span><span class="cx"> class IndexDataManager;
</span><ins>+class ProgramD3D;
</ins><span class="cx"> class StreamingIndexBufferInterface;
</span><span class="cx"> class StaticIndexBufferInterface;
</span><span class="cx"> class VertexDataManager;
</span><span class="cx"> struct ClearParameters;
</span><ins>+struct D3DUniform;
</ins><span class="cx"> struct TranslatedAttribute;
</span><span class="cx"> 
</span><span class="cx"> enum D3D9InitError
</span><span class="lines">@@ -68,6 +71,7 @@
</span><span class="cx">     virtual bool resetDevice();
</span><span class="cx"> 
</span><span class="cx">     egl::ConfigSet generateConfigs() const override;
</span><ins>+    void generateDisplayExtensions(egl::DisplayExtensions *outExtensions) const override;
</ins><span class="cx"> 
</span><span class="cx">     void startScene();
</span><span class="cx">     void endScene();
</span><span class="lines">@@ -75,9 +79,14 @@
</span><span class="cx">     gl::Error flush() override;
</span><span class="cx">     gl::Error finish() override;
</span><span class="cx"> 
</span><del>-    bool shouldCreateChildWindowForSurface(EGLNativeWindowType window) const override;
-    virtual SwapChainD3D *createSwapChain(NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
</del><ins>+    SwapChainD3D *createSwapChain(NativeWindow nativeWindow,
+                                  HANDLE shareHandle,
+                                  GLenum backBufferFormat,
+                                  GLenum depthBufferFormat,
+                                  EGLint orientation) override;
</ins><span class="cx"> 
</span><ins>+    CompilerImpl *createCompiler() override;
+
</ins><span class="cx">     gl::Error allocateEventQuery(IDirect3DQuery9 **outQuery);
</span><span class="cx">     void freeEventQuery(IDirect3DQuery9* query);
</span><span class="cx"> 
</span><span class="lines">@@ -91,35 +100,42 @@
</span><span class="cx">     virtual gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture);
</span><span class="cx"> 
</span><span class="cx">     gl::Error setUniformBuffers(const gl::Data &amp;data,
</span><del>-                                const GLint vertexUniformBuffers[],
-                                const GLint fragmentUniformBuffers[]) override;
</del><ins>+                                const std::vector&lt;GLint&gt; &amp;vertexUniformBuffers,
+                                const std::vector&lt;GLint&gt; &amp;fragmentUniformBuffers) override;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error setRasterizerState(const gl::RasterizerState &amp;rasterState);
-    gl::Error setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &amp;blendState, const gl::ColorF &amp;blendColor,
-                            unsigned int sampleMask) override;
-    virtual gl::Error setDepthStencilState(const gl::DepthStencilState &amp;depthStencilState, int stencilRef,
-                                           int stencilBackRef, bool frontFaceCCW);
</del><ins>+    gl::Error updateState(const gl::Data &amp;data, GLenum drawMode) override;
</ins><span class="cx"> 
</span><del>-    virtual void setScissorRectangle(const gl::Rectangle &amp;scissor, bool enabled);
-    virtual void setViewport(const gl::Rectangle &amp;viewport, float zNear, float zFar, GLenum drawMode, GLenum frontFace,
-                             bool ignoreViewport);
</del><ins>+    void setScissorRectangle(const gl::Rectangle &amp;scissor, bool enabled);
+    void setViewport(const gl::Caps *caps,
+                     const gl::Rectangle &amp;viewport,
+                     float zNear,
+                     float zFar,
+                     GLenum drawMode,
+                     GLenum frontFace,
+                     bool ignoreViewport);
</ins><span class="cx"> 
</span><span class="cx">     gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) override;
</span><span class="cx">     gl::Error applyRenderTarget(const gl::FramebufferAttachment *colorAttachment,
</span><span class="cx">                                 const gl::FramebufferAttachment *depthStencilAttachment);
</span><del>-    virtual gl::Error applyShaders(gl::Program *program, const gl::VertexFormat inputLayout[], const gl::Framebuffer *framebuffer,
-                                   bool rasterizerDiscard, bool transformFeedbackActive);
-    virtual gl::Error applyUniforms(const ProgramImpl &amp;program, const std::vector&lt;gl::LinkedUniform*&gt; &amp;uniformArray);
</del><ins>+    gl::Error applyUniforms(const ProgramD3D &amp;programD3D,
+                            GLenum drawMode,
+                            const std::vector&lt;D3DUniform *&gt; &amp;uniformArray) override;
</ins><span class="cx">     virtual bool applyPrimitiveType(GLenum primitiveType, GLsizei elementCount, bool usesPointSize);
</span><del>-    virtual gl::Error applyVertexBuffer(const gl::State &amp;state, GLenum mode, GLint first, GLsizei count, GLsizei instances);
-    virtual gl::Error applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementArrayBuffer, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo);
</del><ins>+    virtual gl::Error applyVertexBuffer(const gl::State &amp;state,
+                                        GLenum mode,
+                                        GLint first,
+                                        GLsizei count,
+                                        GLsizei instances,
+                                        TranslatedIndexData *indexInfo);
+    gl::Error applyIndexBuffer(const gl::Data &amp;data,
+                               const GLvoid *indices,
+                               GLsizei count,
+                               GLenum mode,
+                               GLenum type,
+                               TranslatedIndexData *indexInfo) override;
</ins><span class="cx"> 
</span><del>-    void applyTransformFeedbackBuffers(const gl::State &amp;state) override;
</del><ins>+    gl::Error applyTransformFeedbackBuffers(const gl::State &amp;state) override;
</ins><span class="cx"> 
</span><del>-    gl::Error drawArrays(const gl::Data &amp;data, GLenum mode, GLsizei count, GLsizei instances, bool usesPointSize) override;
-    virtual gl::Error drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
-                                   gl::Buffer *elementArrayBuffer, const TranslatedIndexData &amp;indexInfo, GLsizei instances);
-
</del><span class="cx">     gl::Error clear(const ClearParameters &amp;clearParams,
</span><span class="cx">                     const gl::FramebufferAttachment *colorBuffer,
</span><span class="cx">                     const gl::FramebufferAttachment *depthStencilBuffer);
</span><span class="lines">@@ -130,9 +146,9 @@
</span><span class="cx">     bool testDeviceLost() override;
</span><span class="cx">     bool testDeviceResettable() override;
</span><span class="cx"> 
</span><del>-    VendorID getVendorId() const override;
</del><ins>+    VendorID getVendorId() const;
</ins><span class="cx">     std::string getRendererDescription() const override;
</span><del>-    GUID getAdapterIdentifier() const override;
</del><ins>+    DeviceIdentifier getAdapterIdentifier() const override;
</ins><span class="cx"> 
</span><span class="cx">     IDirect3DDevice9 *getDevice() { return mDevice; }
</span><span class="cx">     void *getD3DDevice() override;
</span><span class="lines">@@ -141,9 +157,9 @@
</span><span class="cx">     virtual unsigned int getReservedFragmentUniformVectors() const;
</span><span class="cx">     virtual unsigned int getReservedVertexUniformBuffers() const;
</span><span class="cx">     virtual unsigned int getReservedFragmentUniformBuffers() const;
</span><del>-    virtual bool getShareHandleSupport() const;
-    virtual bool getPostSubBufferSupport() const;
</del><span class="cx"> 
</span><ins>+    bool getShareHandleSupport() const;
+
</ins><span class="cx">     virtual int getMajorShaderModel() const;
</span><span class="cx">     int getMinorShaderModel() const override;
</span><span class="cx">     std::string getShaderModelSuffix() const override;
</span><span class="lines">@@ -162,31 +178,38 @@
</span><span class="cx"> 
</span><span class="cx">     // RenderTarget creation
</span><span class="cx">     virtual gl::Error createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTargetD3D **outRT);
</span><ins>+    gl::Error createRenderTargetCopy(RenderTargetD3D *source, RenderTargetD3D **outRT) override;
</ins><span class="cx"> 
</span><span class="cx">     // Framebuffer creation
</span><del>-    FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data) override;
</del><span class="cx">     FramebufferImpl *createFramebuffer(const gl::Framebuffer::Data &amp;data) override;
</span><span class="cx"> 
</span><span class="cx">     // Shader creation
</span><del>-    virtual CompilerImpl *createCompiler(const gl::Data &amp;data);
-    virtual ShaderImpl *createShader(GLenum type);
-    virtual ProgramImpl *createProgram();
</del><ins>+    ShaderImpl *createShader(const gl::Shader::Data &amp;data) override;
+    ProgramImpl *createProgram(const gl::Program::Data &amp;data) override;
</ins><span class="cx"> 
</span><span class="cx">     // Shader operations
</span><del>-    virtual gl::Error loadExecutable(const void *function, size_t length, ShaderType type,
-                                     const std::vector&lt;gl::LinkedVarying&gt; &amp;transformFeedbackVaryings,
-                                     bool separatedOutputBuffers, ShaderExecutableD3D **outExecutable);
-    virtual gl::Error compileToExecutable(gl::InfoLog &amp;infoLog, const std::string &amp;shaderHLSL, ShaderType type,
-                                          const std::vector&lt;gl::LinkedVarying&gt; &amp;transformFeedbackVaryings,
-                                          bool separatedOutputBuffers, const D3DCompilerWorkarounds &amp;workarounds,
-                                          ShaderExecutableD3D **outExectuable);
-    virtual UniformStorageD3D *createUniformStorage(size_t storageSize);
</del><ins>+    gl::Error loadExecutable(const void *function,
+                             size_t length,
+                             ShaderType type,
+                             const std::vector&lt;D3DVarying&gt; &amp;streamOutVaryings,
+                             bool separatedOutputBuffers,
+                             ShaderExecutableD3D **outExecutable) override;
+    gl::Error compileToExecutable(gl::InfoLog &amp;infoLog,
+                                  const std::string &amp;shaderHLSL,
+                                  ShaderType type,
+                                  const std::vector&lt;D3DVarying&gt; &amp;streamOutVaryings,
+                                  bool separatedOutputBuffers,
+                                  const D3DCompilerWorkarounds &amp;workarounds,
+                                  ShaderExecutableD3D **outExectuable) override;
+    UniformStorageD3D *createUniformStorage(size_t storageSize) override;
</ins><span class="cx"> 
</span><span class="cx">     // Image operations
</span><span class="cx">     virtual ImageD3D *createImage();
</span><span class="cx">     gl::Error generateMipmap(ImageD3D *dest, ImageD3D *source) override;
</span><del>-    gl::Error generateMipmapsUsingD3D(TextureStorage *storage, const gl::SamplerState &amp;samplerState) override;
</del><ins>+    gl::Error generateMipmapsUsingD3D(TextureStorage *storage,
+                                      const gl::TextureState &amp;textureState) override;
</ins><span class="cx">     virtual TextureStorage *createTextureStorage2D(SwapChainD3D *swapChain);
</span><ins>+    TextureStorage *createTextureStorageEGLImage(EGLImageD3D *eglImage) override;
</ins><span class="cx">     virtual TextureStorage *createTextureStorage2D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly);
</span><span class="cx">     virtual TextureStorage *createTextureStorageCube(GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly);
</span><span class="cx">     virtual TextureStorage *createTextureStorage3D(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels);
</span><span class="lines">@@ -204,7 +227,7 @@
</span><span class="cx">     virtual IndexBuffer *createIndexBuffer();
</span><span class="cx"> 
</span><span class="cx">     // Vertex Array creation
</span><del>-    virtual VertexArrayImpl *createVertexArray();
</del><ins>+    VertexArrayImpl *createVertexArray(const gl::VertexArray::Data &amp;data) override;
</ins><span class="cx"> 
</span><span class="cx">     // Query and Fence creation
</span><span class="cx">     virtual QueryImpl *createQuery(GLenum type);
</span><span class="lines">@@ -214,19 +237,27 @@
</span><span class="cx">     // Transform Feedback creation
</span><span class="cx">     virtual TransformFeedbackImpl* createTransformFeedback();
</span><span class="cx"> 
</span><ins>+    // Stream Creation
+    StreamImpl *createStream(const egl::AttributeMap &amp;attribs) override;
+
</ins><span class="cx">     // Buffer-to-texture and Texture-to-buffer copies
</span><span class="cx">     virtual bool supportsFastCopyBufferToTexture(GLenum internalFormat) const;
</span><span class="cx">     virtual gl::Error fastCopyBufferToTexture(const gl::PixelUnpackState &amp;unpack, unsigned int offset, RenderTargetD3D *destRenderTarget,
</span><span class="cx">                                               GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &amp;destArea);
</span><span class="cx"> 
</span><ins>+    void syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;bitmask) override;
+
</ins><span class="cx">     // D3D9-renderer specific methods
</span><span class="cx">     gl::Error boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest);
</span><span class="cx"> 
</span><span class="cx">     D3DPOOL getTexturePool(DWORD usage) const;
</span><span class="cx"> 
</span><span class="cx">     bool getLUID(LUID *adapterLuid) const override;
</span><del>-    virtual VertexConversionType getVertexConversionType(const gl::VertexFormat &amp;vertexFormat) const;
-    virtual GLenum getVertexComponentType(const gl::VertexFormat &amp;vertexFormat) const;
</del><ins>+    VertexConversionType getVertexConversionType(gl::VertexFormatType vertexFormatType) const override;
+    GLenum getVertexComponentType(gl::VertexFormatType vertexFormatType) const override;
+    gl::ErrorOrResult&lt;unsigned int&gt; getVertexSpaceRequired(const gl::VertexAttribute &amp;attrib,
+                                                           GLsizei count,
+                                                           GLsizei instances) const override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged);
</span><span class="cx"> 
</span><span class="lines">@@ -234,15 +265,40 @@
</span><span class="cx"> 
</span><span class="cx">     D3DDEVTYPE getD3D9DeviceType() const { return mDeviceType; }
</span><span class="cx"> 
</span><ins>+    egl::Error getEGLDevice(DeviceImpl **device) override;
+
+  protected:
+    void createAnnotator() override;
+    gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override;
+    gl::Error applyShadersImpl(const gl::Data &amp;data, GLenum drawMode) override;
+
</ins><span class="cx">   private:
</span><del>-    void generateCaps(gl::Caps *outCaps, gl::TextureCapsMap *outTextureCaps, gl::Extensions *outExtensions) const override;
-    Workarounds generateWorkarounds() const override;
</del><ins>+    gl::Error drawArraysImpl(const gl::Data &amp;data,
+                             GLenum mode,
+                             GLint startVertex,
+                             GLsizei count,
+                             GLsizei instances) override;
+    gl::Error drawElementsImpl(const gl::Data &amp;data,
+                               const TranslatedIndexData &amp;indexInfo,
+                               GLenum mode,
+                               GLsizei count,
+                               GLenum type,
+                               const GLvoid *indices,
+                               GLsizei instances) override;
</ins><span class="cx"> 
</span><ins>+    void generateCaps(gl::Caps *outCaps, gl::TextureCapsMap *outTextureCaps,
+                      gl::Extensions *outExtensions,
+                      gl::Limitations *outLimitations) const override;
+
+    WorkaroundsD3D generateWorkarounds() const override;
+
+    gl::Error setBlendDepthRasterStates(const gl::Data &amp;glData, GLenum drawMode);
+
</ins><span class="cx">     void release();
</span><span class="cx"> 
</span><del>-    void applyUniformnfv(gl::LinkedUniform *targetUniform, const GLfloat *v);
-    void applyUniformniv(gl::LinkedUniform *targetUniform, const GLint *v);
-    void applyUniformnbv(gl::LinkedUniform *targetUniform, const GLint *v);
</del><ins>+    void applyUniformnfv(const D3DUniform *targetUniform, const GLfloat *v);
+    void applyUniformniv(const D3DUniform *targetUniform, const GLint *v);
+    void applyUniformnbv(const D3DUniform *targetUniform, const GLint *v);
</ins><span class="cx"> 
</span><span class="cx">     gl::Error drawLineLoop(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
</span><span class="cx">     gl::Error drawIndexedPoints(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
</span><span class="lines">@@ -292,64 +348,32 @@
</span><span class="cx">     unsigned int mAppliedDepthStencilSerial;
</span><span class="cx">     bool mDepthStencilInitialized;
</span><span class="cx">     bool mRenderTargetDescInitialized;
</span><del>-    unsigned int mCurStencilSize;
-    unsigned int mCurDepthSize;
</del><span class="cx"> 
</span><del>-    struct RenderTargetDesc
-    {
-        size_t width;
-        size_t height;
-        D3DFORMAT format;
-    };
-    RenderTargetDesc mRenderTargetDesc;
-
</del><span class="cx">     IDirect3DStateBlock9 *mMaskedClearSavedState;
</span><span class="cx"> 
</span><del>-    // previously set render states
-    bool mForceSetDepthStencilState;
-    gl::DepthStencilState mCurDepthStencilState;
-    int mCurStencilRef;
-    int mCurStencilBackRef;
-    bool mCurFrontFaceCCW;
</del><ins>+    StateManager9 mStateManager;
</ins><span class="cx"> 
</span><del>-    bool mForceSetRasterState;
-    gl::RasterizerState mCurRasterState;
-
-    bool mForceSetScissor;
-    gl::Rectangle mCurScissor;
-    bool mScissorEnabled;
-
-    bool mForceSetViewport;
-    gl::Rectangle mCurViewport;
-    float mCurNear;
-    float mCurFar;
-    float mCurDepthFront;
-
-    bool mForceSetBlendState;
-    gl::BlendState mCurBlendState;
-    gl::ColorF mCurBlendColor;
-    GLuint mCurSampleMask;
-
</del><span class="cx">     // Currently applied sampler states
</span><del>-    std::vector&lt;bool&gt; mForceSetVertexSamplerStates;
-    std::vector&lt;gl::SamplerState&gt; mCurVertexSamplerStates;
</del><ins>+    struct CurSamplerState
+    {
+        CurSamplerState();
</ins><span class="cx"> 
</span><del>-    std::vector&lt;bool&gt; mForceSetPixelSamplerStates;
-    std::vector&lt;gl::SamplerState&gt; mCurPixelSamplerStates;
</del><ins>+        bool forceSet;
+        size_t baseLevel;
+        gl::SamplerState samplerState;
+    };
+    std::vector&lt;CurSamplerState&gt; mCurVertexSamplerStates;
+    std::vector&lt;CurSamplerState&gt; mCurPixelSamplerStates;
</ins><span class="cx"> 
</span><span class="cx">     // Currently applied textures
</span><del>-    std::vector&lt;unsigned int&gt; mCurVertexTextureSerials;
-    std::vector&lt;unsigned int&gt; mCurPixelTextureSerials;
</del><ins>+    std::vector&lt;uintptr_t&gt; mCurVertexTextures;
+    std::vector&lt;uintptr_t&gt; mCurPixelTextures;
</ins><span class="cx"> 
</span><span class="cx">     unsigned int mAppliedIBSerial;
</span><span class="cx">     IDirect3DVertexShader9 *mAppliedVertexShader;
</span><span class="cx">     IDirect3DPixelShader9 *mAppliedPixelShader;
</span><span class="cx">     unsigned int mAppliedProgramSerial;
</span><span class="cx"> 
</span><del>-    dx_VertexConstants mVertexConstants;
-    dx_PixelConstants mPixelConstants;
-    bool mDxUniformsDirty;
-
</del><span class="cx">     // A pool of event queries that are currently unused.
</span><span class="cx">     std::vector&lt;IDirect3DQuery9*&gt; mEventQueryPool;
</span><span class="cx">     VertexShaderCache mVertexShaderCache;
</span><span class="lines">@@ -372,7 +396,8 @@
</span><span class="cx">     } mNullColorbufferCache[NUM_NULL_COLORBUFFER_CACHE_ENTRIES];
</span><span class="cx">     UINT mMaxNullColorbufferLRU;
</span><span class="cx"> 
</span><del>-    DebugAnnotator9 mAnnotator;
</del><ins>+    DeviceD3D *mEGLDevice;
+    std::vector&lt;TranslatedAttribute&gt; mTranslatedAttribCache;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9ShaderExecutable9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/ShaderExecutable9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -44,4 +44,4 @@
</span><span class="cx">     return mPixelExecutable;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><span class="cx">\ No newline at end of file
</span><ins>+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9StateManager9cpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/StateManager9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,903 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// StateManager9.cpp: Defines a class for caching D3D9 state
+#include &quot;libANGLE/renderer/d3d/d3d9/StateManager9.h&quot;
+
+#include &quot;common/BitSetIterator.h&quot;
+#include &quot;common/utilities.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d9/renderer9_utils.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d9/Framebuffer9.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d9/Renderer9.h&quot;
+
+namespace rx
+{
+
+StateManager9::StateManager9(Renderer9 *renderer9)
+    : mCurBlendState(),
+      mCurBlendColor(0, 0, 0, 0),
+      mCurSampleMask(0),
+      mCurRasterState(),
+      mCurDepthSize(0),
+      mCurDepthStencilState(),
+      mCurStencilRef(0),
+      mCurStencilBackRef(0),
+      mCurFrontFaceCCW(0),
+      mCurStencilSize(0),
+      mCurScissorRect(),
+      mCurScissorEnabled(false),
+      mCurViewport(),
+      mCurNear(0.0f),
+      mCurFar(0.0f),
+      mCurDepthFront(0.0f),
+      mCurIgnoreViewport(false),
+      mRenderer9(renderer9),
+      mDirtyBits()
+{
+    mBlendStateDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
+    mBlendStateDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
+    mBlendStateDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS);
+    mBlendStateDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE);
+    mBlendStateDirtyBits.set(DIRTY_BIT_COLOR_MASK);
+    mBlendStateDirtyBits.set(DIRTY_BIT_DITHER);
+    mBlendStateDirtyBits.set(DIRTY_BIT_SAMPLE_MASK);
+
+    mRasterizerStateDirtyBits.set(DIRTY_BIT_CULL_MODE);
+    mRasterizerStateDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
+
+    mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_MASK);
+    mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_FUNC);
+    mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
+    mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
+    mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
+    mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
+    mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
+    mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
+    mDepthStencilStateDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
+
+    mScissorStateDirtyBits.set(DIRTY_BIT_SCISSOR_ENABLED);
+    mScissorStateDirtyBits.set(DIRTY_BIT_SCISSOR_RECT);
+}
+
+StateManager9::~StateManager9()
+{
+}
+
+void StateManager9::forceSetBlendState()
+{
+    mDirtyBits |= mBlendStateDirtyBits;
+}
+
+void StateManager9::forceSetRasterState()
+{
+    mDirtyBits |= mRasterizerStateDirtyBits;
+}
+
+void StateManager9::forceSetDepthStencilState()
+{
+    mDirtyBits |= mDepthStencilStateDirtyBits;
+}
+
+void StateManager9::forceSetScissorState()
+{
+    mDirtyBits |= mScissorStateDirtyBits;
+}
+
+void StateManager9::forceSetViewportState()
+{
+    mForceSetViewport = true;
+}
+
+void StateManager9::forceSetDXUniformsState()
+{
+    mDxUniformsDirty = true;
+}
+
+void StateManager9::updateStencilSizeIfChanged(bool depthStencilInitialized,
+                                               unsigned int stencilSize)
+{
+    if (!depthStencilInitialized || stencilSize != mCurStencilSize)
+    {
+        mCurStencilSize = stencilSize;
+        forceSetDepthStencilState();
+    }
+}
+
+void StateManager9::syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;dirtyBits)
+{
+    if (!dirtyBits.any())
+    {
+        return;
+    }
+
+    for (auto dirtyBit : angle::IterateBitSet(dirtyBits))
+    {
+        switch (dirtyBit)
+        {
+            case gl::State::DIRTY_BIT_BLEND_ENABLED:
+                if (state.getBlendState().blend != mCurBlendState.blend)
+                {
+                    mDirtyBits.set(DIRTY_BIT_BLEND_ENABLED);
+                    // BlendColor and funcs and equations has to be set if blend is enabled
+                    mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
+                    mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS);
+                }
+                break;
+            case gl::State::DIRTY_BIT_BLEND_FUNCS:
+            {
+                const gl::BlendState &amp;blendState = state.getBlendState();
+                if (blendState.sourceBlendRGB != mCurBlendState.sourceBlendRGB ||
+                    blendState.destBlendRGB != mCurBlendState.destBlendRGB ||
+                    blendState.sourceBlendAlpha != mCurBlendState.sourceBlendAlpha ||
+                    blendState.destBlendAlpha != mCurBlendState.destBlendAlpha)
+                {
+                    mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS);
+                    // BlendColor depends on the values of blend funcs
+                    mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_BLEND_EQUATIONS:
+            {
+                const gl::BlendState &amp;blendState = state.getBlendState();
+                if (blendState.blendEquationRGB != mCurBlendState.blendEquationRGB ||
+                    blendState.blendEquationAlpha != mCurBlendState.blendEquationAlpha)
+                {
+                    mDirtyBits.set(DIRTY_BIT_BLEND_FUNCS_EQUATIONS);
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED:
+                if (state.getBlendState().sampleAlphaToCoverage !=
+                    mCurBlendState.sampleAlphaToCoverage)
+                {
+                    mDirtyBits.set(DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE);
+                }
+                break;
+            case gl::State::DIRTY_BIT_COLOR_MASK:
+            {
+                const gl::BlendState &amp;blendState = state.getBlendState();
+                if (blendState.colorMaskRed != mCurBlendState.colorMaskRed ||
+                    blendState.colorMaskGreen != mCurBlendState.colorMaskGreen ||
+                    blendState.colorMaskBlue != mCurBlendState.colorMaskBlue ||
+                    blendState.colorMaskAlpha != mCurBlendState.colorMaskAlpha)
+                {
+                    mDirtyBits.set(DIRTY_BIT_COLOR_MASK);
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_DITHER_ENABLED:
+                if (state.getBlendState().dither != mCurBlendState.dither)
+                {
+                    mDirtyBits.set(DIRTY_BIT_DITHER);
+                }
+                break;
+            case gl::State::DIRTY_BIT_BLEND_COLOR:
+                if (state.getBlendColor() != mCurBlendColor)
+                {
+                    mDirtyBits.set(DIRTY_BIT_BLEND_COLOR);
+                }
+                break;
+            case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
+                if (state.getRasterizerState().cullFace != mCurRasterState.cullFace)
+                {
+                    mDirtyBits.set(DIRTY_BIT_CULL_MODE);
+                }
+                break;
+            case gl::State::DIRTY_BIT_CULL_FACE:
+                if (state.getRasterizerState().cullMode != mCurRasterState.cullMode)
+                {
+                    mDirtyBits.set(DIRTY_BIT_CULL_MODE);
+                }
+                break;
+            case gl::State::DIRTY_BIT_FRONT_FACE:
+                if (state.getRasterizerState().frontFace != mCurRasterState.frontFace)
+                {
+                    mDirtyBits.set(DIRTY_BIT_CULL_MODE);
+
+                    // Viewport state depends on rasterizer.frontface
+                    mDirtyBits.set(DIRTY_BIT_VIEWPORT);
+                }
+                break;
+            case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
+                if (state.getRasterizerState().polygonOffsetFill !=
+                    mCurRasterState.polygonOffsetFill)
+                {
+                    mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
+                }
+                break;
+            case gl::State::DIRTY_BIT_POLYGON_OFFSET:
+            {
+                const gl::RasterizerState &amp;rasterizerState = state.getRasterizerState();
+                if (rasterizerState.polygonOffsetFactor != mCurRasterState.polygonOffsetFactor ||
+                    rasterizerState.polygonOffsetUnits != mCurRasterState.polygonOffsetUnits)
+                {
+                    mDirtyBits.set(DIRTY_BIT_DEPTH_BIAS);
+                }
+            }
+            case gl::State::DIRTY_BIT_DEPTH_MASK:
+                if (state.getDepthStencilState().depthMask != mCurDepthStencilState.depthMask)
+                {
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_MASK);
+                }
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
+                if (state.getDepthStencilState().depthTest != mCurDepthStencilState.depthTest)
+                {
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_FUNC);
+                }
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_FUNC:
+                if (state.getDepthStencilState().depthFunc != mCurDepthStencilState.depthFunc)
+                {
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_DEPTH_FUNC);
+                }
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED:
+                if (state.getDepthStencilState().stencilTest != mCurDepthStencilState.stencilTest)
+                {
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_TEST_ENABLED);
+                    // If we enable the stencil test, all of these must be set
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
+                }
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT:
+            {
+                const gl::DepthStencilState &amp;depthStencilState = state.getDepthStencilState();
+                if (depthStencilState.stencilFunc != mCurDepthStencilState.stencilFunc ||
+                    depthStencilState.stencilMask != mCurDepthStencilState.stencilMask ||
+                    state.getStencilRef() != mCurStencilRef)
+                {
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK:
+            {
+                const gl::DepthStencilState &amp;depthStencilState = state.getDepthStencilState();
+                if (depthStencilState.stencilBackFunc != mCurDepthStencilState.stencilBackFunc ||
+                    depthStencilState.stencilBackMask != mCurDepthStencilState.stencilBackMask ||
+                    state.getStencilBackRef() != mCurStencilBackRef)
+                {
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
+                if (state.getDepthStencilState().stencilWritemask !=
+                    mCurDepthStencilState.stencilWritemask)
+                {
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
+                }
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK:
+                if (state.getDepthStencilState().stencilBackWritemask !=
+                    mCurDepthStencilState.stencilBackWritemask)
+                {
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
+                }
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT:
+            {
+                const gl::DepthStencilState &amp;depthStencilState = state.getDepthStencilState();
+                if (depthStencilState.stencilFail != mCurDepthStencilState.stencilFail ||
+                    depthStencilState.stencilPassDepthFail !=
+                        mCurDepthStencilState.stencilPassDepthFail ||
+                    depthStencilState.stencilPassDepthPass !=
+                        mCurDepthStencilState.stencilPassDepthPass)
+                {
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_FRONT);
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_STENCIL_OPS_BACK:
+            {
+                const gl::DepthStencilState &amp;depthStencilState = state.getDepthStencilState();
+                if (depthStencilState.stencilBackFail != mCurDepthStencilState.stencilBackFail ||
+                    depthStencilState.stencilBackPassDepthFail !=
+                        mCurDepthStencilState.stencilBackPassDepthFail ||
+                    depthStencilState.stencilBackPassDepthPass !=
+                        mCurDepthStencilState.stencilBackPassDepthPass)
+                {
+                    mDirtyBits.set(DIRTY_BIT_STENCIL_OPS_BACK);
+                }
+                break;
+            }
+            case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED:
+                if (state.isScissorTestEnabled() != mCurScissorEnabled)
+                {
+                    mDirtyBits.set(DIRTY_BIT_SCISSOR_ENABLED);
+                    // If scissor is enabled, we have to set the scissor rect
+                    mDirtyBits.set(DIRTY_BIT_SCISSOR_RECT);
+                }
+                break;
+            case gl::State::DIRTY_BIT_SCISSOR:
+                if (state.getScissor() != mCurScissorRect)
+                {
+                    mDirtyBits.set(DIRTY_BIT_SCISSOR_RECT);
+                }
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_RANGE:
+                if (state.getNearPlane() != mCurNear || state.getFarPlane() != mCurFar)
+                {
+                    mDirtyBits.set(DIRTY_BIT_VIEWPORT);
+                }
+                break;
+            case gl::State::DIRTY_BIT_VIEWPORT:
+                if (state.getViewport() != mCurViewport)
+                {
+                    mDirtyBits.set(DIRTY_BIT_VIEWPORT);
+                }
+                break;
+            default:
+                break;
+        }
+    }
+}
+
+gl::Error StateManager9::setBlendDepthRasterStates(const gl::State &amp;glState,
+                                                   unsigned int sampleMask)
+{
+    const gl::Framebuffer *framebuffer = glState.getDrawFramebuffer();
+
+    const gl::BlendState &amp;blendState       = glState.getBlendState();
+    const gl::ColorF &amp;blendColor           = glState.getBlendColor();
+    const gl::RasterizerState &amp;rasterState = glState.getRasterizerState();
+
+    const auto &amp;depthStencilState = glState.getDepthStencilState();
+    bool frontFaceCCW             = (glState.getRasterizerState().frontFace == GL_CCW);
+    unsigned int maxStencil       = (1 &lt;&lt; mCurStencilSize) - 1;
+
+    // All the depth stencil states depends on the front face ccw variable
+    if (frontFaceCCW != mCurFrontFaceCCW)
+    {
+        forceSetDepthStencilState();
+        mCurFrontFaceCCW = frontFaceCCW;
+    }
+
+    for (auto dirtyBit : angle::IterateBitSet(mDirtyBits))
+    {
+        switch (dirtyBit)
+        {
+            case DIRTY_BIT_BLEND_ENABLED:
+                setBlendEnabled(blendState.blend);
+                break;
+            case DIRTY_BIT_BLEND_COLOR:
+                setBlendColor(blendState, blendColor);
+                break;
+            case DIRTY_BIT_BLEND_FUNCS_EQUATIONS:
+                setBlendFuncsEquations(blendState);
+                break;
+            case DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE:
+                setSampleAlphaToCoverage(blendState.sampleAlphaToCoverage);
+                break;
+            case DIRTY_BIT_COLOR_MASK:
+                setColorMask(framebuffer, blendState.colorMaskRed, blendState.colorMaskBlue,
+                             blendState.colorMaskGreen, blendState.colorMaskAlpha);
+                break;
+            case DIRTY_BIT_DITHER:
+                setDither(blendState.dither);
+                break;
+            case DIRTY_BIT_CULL_MODE:
+                setCullMode(rasterState.cullFace, rasterState.cullMode, rasterState.frontFace);
+                break;
+            case DIRTY_BIT_DEPTH_BIAS:
+                setDepthBias(rasterState.polygonOffsetFill, rasterState.polygonOffsetFactor,
+                             rasterState.polygonOffsetUnits);
+                break;
+            case DIRTY_BIT_STENCIL_DEPTH_MASK:
+                setDepthMask(depthStencilState.depthMask);
+                break;
+            case DIRTY_BIT_STENCIL_DEPTH_FUNC:
+                setDepthFunc(depthStencilState.depthTest, depthStencilState.depthFunc);
+                break;
+            case DIRTY_BIT_STENCIL_TEST_ENABLED:
+                setStencilTestEnabled(depthStencilState.stencilTest);
+                break;
+            case DIRTY_BIT_STENCIL_FUNCS_FRONT:
+                setStencilFuncsFront(depthStencilState.stencilFunc, depthStencilState.stencilMask,
+                                     glState.getStencilRef(), frontFaceCCW, maxStencil);
+                break;
+            case DIRTY_BIT_STENCIL_FUNCS_BACK:
+                setStencilFuncsBack(depthStencilState.stencilBackFunc,
+                                    depthStencilState.stencilBackMask, glState.getStencilBackRef(),
+                                    frontFaceCCW, maxStencil);
+                break;
+            case DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
+                setStencilWriteMask(depthStencilState.stencilWritemask, frontFaceCCW);
+                break;
+            case DIRTY_BIT_STENCIL_WRITEMASK_BACK:
+                setStencilBackWriteMask(depthStencilState.stencilBackWritemask, frontFaceCCW);
+                break;
+            case DIRTY_BIT_STENCIL_OPS_FRONT:
+                setStencilOpsFront(depthStencilState.stencilFail,
+                                   depthStencilState.stencilPassDepthFail,
+                                   depthStencilState.stencilPassDepthPass, frontFaceCCW);
+                break;
+            case DIRTY_BIT_STENCIL_OPS_BACK:
+                setStencilOpsBack(depthStencilState.stencilBackFail,
+                                  depthStencilState.stencilBackPassDepthFail,
+                                  depthStencilState.stencilBackPassDepthPass, frontFaceCCW);
+                break;
+            default:
+                break;
+        }
+    }
+
+    if (sampleMask != mCurSampleMask)
+    {
+        setSampleMask(sampleMask);
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+void StateManager9::setViewportState(const gl::Caps *caps,
+                                     const gl::Rectangle &amp;viewport,
+                                     float zNear,
+                                     float zFar,
+                                     GLenum drawMode,
+                                     GLenum frontFace,
+                                     bool ignoreViewport)
+{
+    if (!mDirtyBits.test(DIRTY_BIT_VIEWPORT) &amp;&amp; mCurIgnoreViewport == ignoreViewport)
+        return;
+
+    gl::Rectangle actualViewport = viewport;
+    float actualZNear            = gl::clamp01(zNear);
+    float actualZFar             = gl::clamp01(zFar);
+
+    if (ignoreViewport)
+    {
+        actualViewport.x      = 0;
+        actualViewport.y      = 0;
+        actualViewport.width  = static_cast&lt;int&gt;(mRenderTargetBounds.width);
+        actualViewport.height = static_cast&lt;int&gt;(mRenderTargetBounds.height);
+        actualZNear           = 0.0f;
+        actualZFar            = 1.0f;
+    }
+
+    D3DVIEWPORT9 dxViewport;
+    dxViewport.X = gl::clamp(actualViewport.x, 0, static_cast&lt;int&gt;(mRenderTargetBounds.width));
+    dxViewport.Y = gl::clamp(actualViewport.y, 0, static_cast&lt;int&gt;(mRenderTargetBounds.height));
+    dxViewport.Width =
+        gl::clamp(actualViewport.width, 0,
+                  static_cast&lt;int&gt;(mRenderTargetBounds.width) - static_cast&lt;int&gt;(dxViewport.X));
+    dxViewport.Height =
+        gl::clamp(actualViewport.height, 0,
+                  static_cast&lt;int&gt;(mRenderTargetBounds.height) - static_cast&lt;int&gt;(dxViewport.Y));
+    dxViewport.MinZ = actualZNear;
+    dxViewport.MaxZ = actualZFar;
+
+    float depthFront = !gl::IsTriangleMode(drawMode) ? 0.0f : (frontFace == GL_CCW ? 1.0f : -1.0f);
+
+    mRenderer9-&gt;getDevice()-&gt;SetViewport(&amp;dxViewport);
+
+    mCurViewport       = actualViewport;
+    mCurNear           = actualZNear;
+    mCurFar            = actualZFar;
+    mCurDepthFront     = depthFront;
+    mCurIgnoreViewport = ignoreViewport;
+
+    // Setting shader constants
+    dx_VertexConstants9 vc = {};
+    dx_PixelConstants9 pc  = {};
+
+    vc.viewAdjust[0] =
+        static_cast&lt;float&gt;((actualViewport.width - static_cast&lt;int&gt;(dxViewport.Width)) +
+                           2 * (actualViewport.x - static_cast&lt;int&gt;(dxViewport.X)) - 1) /
+        dxViewport.Width;
+    vc.viewAdjust[1] =
+        static_cast&lt;float&gt;((actualViewport.height - static_cast&lt;int&gt;(dxViewport.Height)) +
+                           2 * (actualViewport.y - static_cast&lt;int&gt;(dxViewport.Y)) - 1) /
+        dxViewport.Height;
+    vc.viewAdjust[2] = static_cast&lt;float&gt;(actualViewport.width) / dxViewport.Width;
+    vc.viewAdjust[3] = static_cast&lt;float&gt;(actualViewport.height) / dxViewport.Height;
+
+    pc.viewCoords[0] = actualViewport.width * 0.5f;
+    pc.viewCoords[1] = actualViewport.height * 0.5f;
+    pc.viewCoords[2] = actualViewport.x + (actualViewport.width * 0.5f);
+    pc.viewCoords[3] = actualViewport.y + (actualViewport.height * 0.5f);
+
+    pc.depthFront[0] = (actualZFar - actualZNear) * 0.5f;
+    pc.depthFront[1] = (actualZNear + actualZFar) * 0.5f;
+    pc.depthFront[2] = depthFront;
+
+    vc.depthRange[0] = actualZNear;
+    vc.depthRange[1] = actualZFar;
+    vc.depthRange[2] = actualZFar - actualZNear;
+
+    pc.depthRange[0] = actualZNear;
+    pc.depthRange[1] = actualZFar;
+    pc.depthRange[2] = actualZFar - actualZNear;
+
+    if (memcmp(&amp;vc, &amp;mVertexConstants, sizeof(dx_VertexConstants9)) != 0)
+    {
+        mVertexConstants = vc;
+        mDxUniformsDirty = true;
+    }
+
+    if (memcmp(&amp;pc, &amp;mPixelConstants, sizeof(dx_PixelConstants9)) != 0)
+    {
+        mPixelConstants  = pc;
+        mDxUniformsDirty = true;
+    }
+
+    mForceSetViewport = false;
+}
+
+void StateManager9::setShaderConstants()
+{
+    if (!mDxUniformsDirty)
+        return;
+
+    IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+    device-&gt;SetVertexShaderConstantF(0, reinterpret_cast&lt;float *&gt;(&amp;mVertexConstants),
+                                     sizeof(dx_VertexConstants9) / sizeof(float[4]));
+    device-&gt;SetPixelShaderConstantF(0, reinterpret_cast&lt;float *&gt;(&amp;mPixelConstants),
+                                    sizeof(dx_PixelConstants9) / sizeof(float[4]));
+    mDxUniformsDirty = false;
+}
+
+// This is separate from the main state loop because other functions
+// outside call only setScissorState to update scissor state
+void StateManager9::setScissorState(const gl::Rectangle &amp;scissor, bool enabled)
+{
+    if (mDirtyBits.test(DIRTY_BIT_SCISSOR_ENABLED))
+        setScissorEnabled(enabled);
+
+    if (mDirtyBits.test(DIRTY_BIT_SCISSOR_RECT))
+        setScissorRect(scissor, enabled);
+}
+
+void StateManager9::setRenderTargetBounds(size_t width, size_t height)
+{
+    mRenderTargetBounds.width  = (int)width;
+    mRenderTargetBounds.height = (int)height;
+    forceSetViewportState();
+}
+
+void StateManager9::setScissorEnabled(bool scissorEnabled)
+{
+    mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_SCISSORTESTENABLE, scissorEnabled ? TRUE : FALSE);
+    mCurScissorEnabled = scissorEnabled;
+}
+
+void StateManager9::setScissorRect(const gl::Rectangle &amp;scissor, bool enabled)
+{
+    if (!enabled)
+        return;
+
+    RECT rect;
+    rect.left = gl::clamp(scissor.x, 0, static_cast&lt;int&gt;(mRenderTargetBounds.width));
+    rect.top = gl::clamp(scissor.y, 0, static_cast&lt;int&gt;(mRenderTargetBounds.height));
+    rect.right =
+        gl::clamp(scissor.x + scissor.width, 0, static_cast&lt;int&gt;(mRenderTargetBounds.width));
+    rect.bottom =
+        gl::clamp(scissor.y + scissor.height, 0, static_cast&lt;int&gt;(mRenderTargetBounds.height));
+    mRenderer9-&gt;getDevice()-&gt;SetScissorRect(&amp;rect);
+}
+
+void StateManager9::setDepthFunc(bool depthTest, GLenum depthFunc)
+{
+    if (depthTest)
+    {
+        IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+        device-&gt;SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
+        device-&gt;SetRenderState(D3DRS_ZFUNC, gl_d3d9::ConvertComparison(depthFunc));
+    }
+    else
+    {
+        mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
+    }
+
+    mCurDepthStencilState.depthTest = depthTest;
+    mCurDepthStencilState.depthFunc = depthFunc;
+}
+
+void StateManager9::setStencilOpsFront(GLenum stencilFail,
+                                       GLenum stencilPassDepthFail,
+                                       GLenum stencilPassDepthPass,
+                                       bool frontFaceCCW)
+{
+    // TODO(dianx) It may be slightly more efficient todo these and other similar areas
+    // with separate dirty bits.
+    IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+    device-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILFAIL : D3DRS_CCW_STENCILFAIL,
+                           gl_d3d9::ConvertStencilOp(stencilFail));
+    device-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILZFAIL : D3DRS_CCW_STENCILZFAIL,
+                           gl_d3d9::ConvertStencilOp(stencilPassDepthFail));
+    device-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILPASS : D3DRS_CCW_STENCILPASS,
+                           gl_d3d9::ConvertStencilOp(stencilPassDepthPass));
+
+    mCurDepthStencilState.stencilFail          = stencilFail;
+    mCurDepthStencilState.stencilPassDepthFail = stencilPassDepthFail;
+    mCurDepthStencilState.stencilPassDepthPass = stencilPassDepthPass;
+}
+
+void StateManager9::setStencilOpsBack(GLenum stencilBackFail,
+                                      GLenum stencilBackPassDepthFail,
+                                      GLenum stencilBackPassDepthPass,
+                                      bool frontFaceCCW)
+{
+    IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+    device-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILFAIL : D3DRS_CCW_STENCILFAIL,
+                           gl_d3d9::ConvertStencilOp(stencilBackFail));
+    device-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILZFAIL : D3DRS_CCW_STENCILZFAIL,
+                           gl_d3d9::ConvertStencilOp(stencilBackPassDepthFail));
+    device-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILPASS : D3DRS_CCW_STENCILPASS,
+                           gl_d3d9::ConvertStencilOp(stencilBackPassDepthPass));
+
+    mCurDepthStencilState.stencilBackFail          = stencilBackFail;
+    mCurDepthStencilState.stencilBackPassDepthFail = stencilBackPassDepthFail;
+    mCurDepthStencilState.stencilBackPassDepthPass = stencilBackPassDepthPass;
+}
+
+void StateManager9::setStencilBackWriteMask(GLuint stencilBackWriteMask, bool frontFaceCCW)
+{
+    mRenderer9-&gt;getDevice()-&gt;SetRenderState(
+        !frontFaceCCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK, stencilBackWriteMask);
+
+    mCurDepthStencilState.stencilBackWritemask = stencilBackWriteMask;
+}
+
+void StateManager9::setStencilFuncsBack(GLenum stencilBackFunc,
+                                        GLuint stencilBackMask,
+                                        GLint stencilBackRef,
+                                        bool frontFaceCCW,
+                                        unsigned int maxStencil)
+{
+    IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+    device-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILFUNC : D3DRS_CCW_STENCILFUNC,
+                           gl_d3d9::ConvertComparison(stencilBackFunc));
+    device-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILREF : D3DRS_CCW_STENCILREF,
+                           (stencilBackRef &lt; (int)maxStencil) ? stencilBackRef : maxStencil);
+    device-&gt;SetRenderState(!frontFaceCCW ? D3DRS_STENCILMASK : D3DRS_CCW_STENCILMASK,
+                           stencilBackMask);
+
+    mCurDepthStencilState.stencilBackFunc = stencilBackFunc;
+    mCurStencilBackRef                    = stencilBackRef;
+    mCurDepthStencilState.stencilBackMask = stencilBackMask;
+}
+
+void StateManager9::setStencilWriteMask(GLuint stencilWriteMask, bool frontFaceCCW)
+{
+    mRenderer9-&gt;getDevice()-&gt;SetRenderState(
+        frontFaceCCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK, stencilWriteMask);
+    mCurDepthStencilState.stencilWritemask = stencilWriteMask;
+}
+
+void StateManager9::setStencilFuncsFront(GLenum stencilFunc,
+                                         GLuint stencilMask,
+                                         GLint stencilRef,
+                                         bool frontFaceCCW,
+                                         unsigned int maxStencil)
+{
+    IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+    device-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILFUNC : D3DRS_CCW_STENCILFUNC,
+                           gl_d3d9::ConvertComparison(stencilFunc));
+    device-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILREF : D3DRS_CCW_STENCILREF,
+                           (stencilRef &lt; static_cast&lt;int&gt;(maxStencil)) ? stencilRef : maxStencil);
+    device-&gt;SetRenderState(frontFaceCCW ? D3DRS_STENCILMASK : D3DRS_CCW_STENCILMASK, stencilMask);
+
+    mCurDepthStencilState.stencilFunc = stencilFunc;
+    mCurStencilRef                    = stencilRef;
+    mCurDepthStencilState.stencilMask = stencilMask;
+}
+void StateManager9::setStencilTestEnabled(bool stencilTestEnabled)
+{
+    if (stencilTestEnabled &amp;&amp; mCurStencilSize &gt; 0)
+    {
+        mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_STENCILENABLE, TRUE);
+    }
+    else
+    {
+        mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_STENCILENABLE, FALSE);
+    }
+
+    mCurDepthStencilState.stencilTest = stencilTestEnabled;
+}
+
+void StateManager9::setDepthMask(bool depthMask)
+{
+    mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_ZWRITEENABLE, depthMask ? TRUE : FALSE);
+    mCurDepthStencilState.depthMask = depthMask;
+}
+
+// TODO(dianx) one bit for sampleAlphaToCoverage
+void StateManager9::setSampleAlphaToCoverage(bool enabled)
+{
+    if (enabled)
+    {
+        FIXME(&quot;Sample alpha to coverage is unimplemented.&quot;);
+    }
+}
+
+void StateManager9::setBlendColor(const gl::BlendState &amp;blendState, const gl::ColorF &amp;blendColor)
+{
+    if (!blendState.blend)
+        return;
+
+    if (blendState.sourceBlendRGB != GL_CONSTANT_ALPHA &amp;&amp;
+        blendState.sourceBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA &amp;&amp;
+        blendState.destBlendRGB != GL_CONSTANT_ALPHA &amp;&amp;
+        blendState.destBlendRGB != GL_ONE_MINUS_CONSTANT_ALPHA)
+    {
+        mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_BLENDFACTOR,
+                                                gl_d3d9::ConvertColor(blendColor));
+    }
+    else
+    {
+        mRenderer9-&gt;getDevice()-&gt;SetRenderState(
+            D3DRS_BLENDFACTOR,
+            D3DCOLOR_RGBA(gl::unorm&lt;8&gt;(blendColor.alpha), gl::unorm&lt;8&gt;(blendColor.alpha),
+                          gl::unorm&lt;8&gt;(blendColor.alpha), gl::unorm&lt;8&gt;(blendColor.alpha)));
+    }
+    mCurBlendColor = blendColor;
+}
+
+void StateManager9::setBlendFuncsEquations(const gl::BlendState &amp;blendState)
+{
+    if (!blendState.blend)
+        return;
+
+    IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+
+    device-&gt;SetRenderState(D3DRS_SRCBLEND, gl_d3d9::ConvertBlendFunc(blendState.sourceBlendRGB));
+    device-&gt;SetRenderState(D3DRS_DESTBLEND, gl_d3d9::ConvertBlendFunc(blendState.destBlendRGB));
+    device-&gt;SetRenderState(D3DRS_BLENDOP, gl_d3d9::ConvertBlendOp(blendState.blendEquationRGB));
+
+    if (blendState.sourceBlendRGB != blendState.sourceBlendAlpha ||
+        blendState.destBlendRGB != blendState.destBlendAlpha ||
+        blendState.blendEquationRGB != blendState.blendEquationAlpha)
+    {
+        device-&gt;SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
+
+        device-&gt;SetRenderState(D3DRS_SRCBLENDALPHA,
+                               gl_d3d9::ConvertBlendFunc(blendState.sourceBlendAlpha));
+        device-&gt;SetRenderState(D3DRS_DESTBLENDALPHA,
+                               gl_d3d9::ConvertBlendFunc(blendState.destBlendAlpha));
+        device-&gt;SetRenderState(D3DRS_BLENDOPALPHA,
+                               gl_d3d9::ConvertBlendOp(blendState.blendEquationAlpha));
+    }
+    else
+    {
+        device-&gt;SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE);
+    }
+
+    mCurBlendState.sourceBlendRGB     = blendState.sourceBlendRGB;
+    mCurBlendState.destBlendRGB       = blendState.destBlendRGB;
+    mCurBlendState.blendEquationRGB   = blendState.blendEquationRGB;
+    mCurBlendState.blendEquationAlpha = blendState.blendEquationAlpha;
+}
+
+void StateManager9::setBlendEnabled(bool enabled)
+{
+    mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_ALPHABLENDENABLE, enabled ? TRUE : FALSE);
+    mCurBlendState.blend = enabled;
+}
+
+void StateManager9::setDither(bool dither)
+{
+    mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_DITHERENABLE, dither ? TRUE : FALSE);
+    mCurBlendState.dither = dither;
+}
+
+// TODO(dianx) one bit for color mask
+void StateManager9::setColorMask(const gl::Framebuffer *framebuffer,
+                                 bool red,
+                                 bool blue,
+                                 bool green,
+                                 bool alpha)
+{
+    // Set the color mask
+    bool zeroColorMaskAllowed = mRenderer9-&gt;getVendorId() != VENDOR_ID_AMD;
+    // Apparently some ATI cards have a bug where a draw with a zero color
+    // write mask can cause later draws to have incorrect results. Instead,
+    // set a nonzero color write mask but modify the blend state so that no
+    // drawing is done.
+    // http://code.google.com/p/angleproject/issues/detail?id=169
+
+    const gl::FramebufferAttachment *attachment = framebuffer-&gt;getFirstColorbuffer();
+    GLenum internalFormat                       = attachment ? attachment-&gt;getInternalFormat() : GL_NONE;
+
+    const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(internalFormat);
+
+    DWORD colorMask = gl_d3d9::ConvertColorMask(
+        formatInfo.redBits &gt; 0 &amp;&amp; red, formatInfo.greenBits &gt; 0 &amp;&amp; green,
+        formatInfo.blueBits &gt; 0 &amp;&amp; blue, formatInfo.alphaBits &gt; 0 &amp;&amp; alpha);
+
+    if (colorMask == 0 &amp;&amp; !zeroColorMaskAllowed)
+    {
+        IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+        // Enable green channel, but set blending so nothing will be drawn.
+        device-&gt;SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_GREEN);
+        device-&gt;SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
+
+        device-&gt;SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
+        device-&gt;SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
+        device-&gt;SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
+    }
+    else
+    {
+        mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_COLORWRITEENABLE, colorMask);
+    }
+
+    mCurBlendState.colorMaskRed   = red;
+    mCurBlendState.colorMaskGreen = green;
+    mCurBlendState.colorMaskBlue  = blue;
+    mCurBlendState.colorMaskAlpha = alpha;
+}
+
+void StateManager9::setSampleMask(unsigned int sampleMask)
+{
+    IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+    // Set the multisample mask
+    device-&gt;SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);
+    device-&gt;SetRenderState(D3DRS_MULTISAMPLEMASK, static_cast&lt;DWORD&gt;(sampleMask));
+
+    mCurSampleMask = sampleMask;
+}
+
+void StateManager9::setCullMode(bool cullFace, GLenum cullMode, GLenum frontFace)
+{
+    if (cullFace)
+    {
+        mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_CULLMODE,
+                                                gl_d3d9::ConvertCullMode(cullMode, frontFace));
+    }
+    else
+    {
+        mRenderer9-&gt;getDevice()-&gt;SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
+    }
+
+    mCurRasterState.cullFace  = cullFace;
+    mCurRasterState.cullMode  = cullMode;
+    mCurRasterState.frontFace = frontFace;
+}
+
+void StateManager9::setDepthBias(bool polygonOffsetFill,
+                                 GLfloat polygonOffsetFactor,
+                                 GLfloat polygonOffsetUnits)
+{
+    if (polygonOffsetFill)
+    {
+        if (mCurDepthSize &gt; 0)
+        {
+            IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+            device-&gt;SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, *(DWORD *)&amp;polygonOffsetFactor);
+
+            float depthBias = ldexp(polygonOffsetUnits, -static_cast&lt;int&gt;(mCurDepthSize));
+            device-&gt;SetRenderState(D3DRS_DEPTHBIAS, *(DWORD *)&amp;depthBias);
+        }
+    }
+    else
+    {
+        IDirect3DDevice9 *device = mRenderer9-&gt;getDevice();
+        device-&gt;SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, 0);
+        device-&gt;SetRenderState(D3DRS_DEPTHBIAS, 0);
+    }
+
+    mCurRasterState.polygonOffsetFill   = polygonOffsetFill;
+    mCurRasterState.polygonOffsetFactor = polygonOffsetFactor;
+    mCurRasterState.polygonOffsetUnits  = polygonOffsetUnits;
+}
+
+void StateManager9::updateDepthSizeIfChanged(bool depthStencilInitialized, unsigned int depthSize)
+{
+    if (!depthStencilInitialized || depthSize != mCurDepthSize)
+    {
+        mCurDepthSize = depthSize;
+        forceSetRasterState();
+    }
+}
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9StateManager9h"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/StateManager9.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/StateManager9.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/StateManager9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,206 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// StateManager9.h: Defines a class for caching D3D9 state
+
+#ifndef LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_
+#define LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_
+
+#include &quot;libANGLE/angletypes.h&quot;
+#include &quot;libANGLE/Data.h&quot;
+#include &quot;libANGLE/State.h&quot;
+#include &quot;libANGLE/renderer/d3d/RendererD3D.h&quot;
+
+namespace rx
+{
+
+class Renderer9;
+
+struct dx_VertexConstants9
+{
+    float depthRange[4];
+    float viewAdjust[4];
+    float viewCoords[4];
+};
+
+struct dx_PixelConstants9
+{
+    float depthRange[4];
+    float viewCoords[4];
+    float depthFront[4];
+};
+
+class StateManager9 final : angle::NonCopyable
+{
+  public:
+    StateManager9(Renderer9 *renderer9);
+    ~StateManager9();
+
+    void syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;dirtyBits);
+
+    gl::Error setBlendDepthRasterStates(const gl::State &amp;glState, unsigned int sampleMask);
+    void setScissorState(const gl::Rectangle &amp;scissor, bool enabled);
+    void setViewportState(const gl::Caps *caps,
+                          const gl::Rectangle &amp;viewport,
+                          float zNear,
+                          float zFar,
+                          GLenum drawMode,
+                          GLenum frontFace,
+                          bool ignoreViewport);
+
+    void setShaderConstants();
+
+    void forceSetBlendState();
+    void forceSetRasterState();
+    void forceSetDepthStencilState();
+    void forceSetScissorState();
+    void forceSetViewportState();
+    void forceSetDXUniformsState();
+
+    void updateDepthSizeIfChanged(bool depthStencilInitialized, unsigned int depthSize);
+    void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize);
+
+    void setRenderTargetBounds(size_t width, size_t height);
+
+    int getRenderTargetWidth() const { return mRenderTargetBounds.width; }
+    int getRenderTargetHeight() const { return mRenderTargetBounds.height; }
+
+    void resetDirtyBits() { mDirtyBits.reset(); }
+
+  private:
+    // Blend state functions
+    void setBlendEnabled(bool enabled);
+    void setBlendColor(const gl::BlendState &amp;blendState, const gl::ColorF &amp;blendColor);
+    void setBlendFuncsEquations(const gl::BlendState &amp;blendState);
+    void setColorMask(const gl::Framebuffer *framebuffer,
+                      bool red,
+                      bool blue,
+                      bool green,
+                      bool alpha);
+    void setSampleAlphaToCoverage(bool enabled);
+    void setDither(bool dither);
+    void setSampleMask(unsigned int sampleMask);
+
+    // Current raster state functions
+    void setCullMode(bool cullFace, GLenum cullMode, GLenum frontFace);
+    void setDepthBias(bool polygonOffsetFill,
+                      GLfloat polygonOffsetFactor,
+                      GLfloat polygonOffsetUnits);
+
+    // Depth stencil state functions
+    void setStencilOpsFront(GLenum stencilFail,
+                            GLenum stencilPassDepthFail,
+                            GLenum stencilPassDepthPass,
+                            bool frontFaceCCW);
+    void setStencilOpsBack(GLenum stencilBackFail,
+                           GLenum stencilBackPassDepthFail,
+                           GLenum stencilBackPassDepthPass,
+                           bool frontFaceCCW);
+    void setStencilBackWriteMask(GLuint stencilBackWriteMask, bool frontFaceCCW);
+    void setDepthFunc(bool depthTest, GLenum depthFunc);
+    void setStencilTestEnabled(bool enabled);
+    void setDepthMask(bool depthMask);
+    void setStencilFuncsFront(GLenum stencilFunc,
+                              GLuint stencilMask,
+                              GLint stencilRef,
+                              bool frontFaceCCW,
+                              unsigned int maxStencil);
+    void setStencilFuncsBack(GLenum stencilBackFunc,
+                             GLuint stencilBackMask,
+                             GLint stencilBackRef,
+                             bool frontFaceCCW,
+                             unsigned int maxStencil);
+    void setStencilWriteMask(GLuint stencilWriteMask, bool frontFaceCCW);
+
+    void setScissorEnabled(bool scissorEnabled);
+    void setScissorRect(const gl::Rectangle &amp;scissor, bool enabled);
+
+    enum DirtyBitType
+    {
+        // Blend dirty bits
+        DIRTY_BIT_BLEND_ENABLED,
+        DIRTY_BIT_BLEND_COLOR,
+        DIRTY_BIT_BLEND_FUNCS_EQUATIONS,
+        DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE,
+        DIRTY_BIT_COLOR_MASK,
+        DIRTY_BIT_DITHER,
+        DIRTY_BIT_SAMPLE_MASK,
+
+        // Rasterizer dirty bits
+        DIRTY_BIT_CULL_MODE,
+        DIRTY_BIT_DEPTH_BIAS,
+
+        // Depth stencil dirty bits
+        DIRTY_BIT_STENCIL_DEPTH_MASK,
+        DIRTY_BIT_STENCIL_DEPTH_FUNC,
+        DIRTY_BIT_STENCIL_TEST_ENABLED,
+        DIRTY_BIT_STENCIL_FUNCS_FRONT,
+        DIRTY_BIT_STENCIL_FUNCS_BACK,
+        DIRTY_BIT_STENCIL_WRITEMASK_FRONT,
+        DIRTY_BIT_STENCIL_WRITEMASK_BACK,
+        DIRTY_BIT_STENCIL_OPS_FRONT,
+        DIRTY_BIT_STENCIL_OPS_BACK,
+
+        // Scissor dirty bits
+        DIRTY_BIT_SCISSOR_ENABLED,
+        DIRTY_BIT_SCISSOR_RECT,
+
+        // Viewport dirty bits
+        DIRTY_BIT_VIEWPORT,
+
+        DIRTY_BIT_MAX
+    };
+
+    typedef std::bitset&lt;DIRTY_BIT_MAX&gt; DirtyBits;
+
+    // Currently applied blend state
+    gl::BlendState mCurBlendState;
+    gl::ColorF mCurBlendColor;
+    unsigned int mCurSampleMask;
+    DirtyBits mBlendStateDirtyBits;
+
+    // Currently applied raster state
+    gl::RasterizerState mCurRasterState;
+    unsigned int mCurDepthSize;
+    DirtyBits mRasterizerStateDirtyBits;
+
+    // Currently applied depth stencil state
+    gl::DepthStencilState mCurDepthStencilState;
+    int mCurStencilRef;
+    int mCurStencilBackRef;
+    bool mCurFrontFaceCCW;
+    unsigned int mCurStencilSize;
+    DirtyBits mDepthStencilStateDirtyBits;
+
+    // Currently applied scissor states
+    gl::Rectangle mCurScissorRect;
+    bool mCurScissorEnabled;
+    gl::Extents mRenderTargetBounds;
+    DirtyBits mScissorStateDirtyBits;
+
+    // Currently applied viewport states
+    bool mForceSetViewport;
+    gl::Rectangle mCurViewport;
+    float mCurNear;
+    float mCurFar;
+    float mCurDepthFront;
+    bool mCurIgnoreViewport;
+
+    dx_VertexConstants9 mVertexConstants;
+    dx_PixelConstants9 mPixelConstants;
+    bool mDxUniformsDirty;
+
+    // FIXME: Unsupported by D3D9
+    static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILREF       = D3DRS_STENCILREF;
+    static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILMASK      = D3DRS_STENCILMASK;
+    static const D3DRENDERSTATETYPE D3DRS_CCW_STENCILWRITEMASK = D3DRS_STENCILWRITEMASK;
+
+    Renderer9 *mRenderer9;
+    DirtyBits mDirtyBits;
+};
+
+}  // namespace rx
+#endif  // LIBANGLE_RENDERER_D3D9_STATEMANAGER9_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9SwapChain9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/SwapChain9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,21 +15,26 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-SwapChain9::SwapChain9(Renderer9 *renderer, NativeWindow nativeWindow, HANDLE shareHandle,
-                       GLenum backBufferFormat, GLenum depthBufferFormat)
-    : mRenderer(renderer),
-      SwapChainD3D(nativeWindow, shareHandle, backBufferFormat, depthBufferFormat),
</del><ins>+SwapChain9::SwapChain9(Renderer9 *renderer,
+                       NativeWindow nativeWindow,
+                       HANDLE shareHandle,
+                       GLenum backBufferFormat,
+                       GLenum depthBufferFormat,
+                       EGLint orientation)
+    : SwapChainD3D(nativeWindow, shareHandle, backBufferFormat, depthBufferFormat),
+      mRenderer(renderer),
+      mWidth(-1),
+      mHeight(-1),
+      mSwapInterval(-1),
+      mSwapChain(nullptr),
+      mBackBuffer(nullptr),
+      mRenderTarget(nullptr),
+      mDepthStencil(nullptr),
+      mOffscreenTexture(nullptr),
</ins><span class="cx">       mColorRenderTarget(this, false),
</span><span class="cx">       mDepthStencilRenderTarget(this, true)
</span><span class="cx"> {
</span><del>-    mSwapChain = NULL;
-    mBackBuffer = NULL;
-    mDepthStencil = NULL;
-    mRenderTarget = NULL;
-    mOffscreenTexture = NULL;
-    mWidth = -1;
-    mHeight = -1;
-    mSwapInterval = -1;
</del><ins>+    ASSERT(orientation == 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> SwapChain9::~SwapChain9()
</span><span class="lines">@@ -104,7 +109,7 @@
</span><span class="cx">         pShareHandle = &amp;mShareHandle;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const d3d9::TextureFormat &amp;backBufferd3dFormatInfo = d3d9::GetTextureFormatInfo(mBackBufferFormat);
</del><ins>+    const d3d9::TextureFormat &amp;backBufferd3dFormatInfo = d3d9::GetTextureFormatInfo(mOffscreenRenderTargetFormat);
</ins><span class="cx">     result = device-&gt;CreateTexture(backbufferWidth, backbufferHeight, 1, D3DUSAGE_RENDERTARGET,
</span><span class="cx">                                    backBufferd3dFormatInfo.texFormat, D3DPOOL_DEFAULT, &amp;mOffscreenTexture,
</span><span class="cx">                                    pShareHandle);
</span><span class="lines">@@ -312,8 +317,8 @@
</span><span class="cx"> 
</span><span class="cx">     RECT rect =
</span><span class="cx">     {
</span><del>-        x, mHeight - y - height,
-        x + width, mHeight - y
</del><ins>+        static_cast&lt;LONG&gt;(x), static_cast&lt;LONG&gt;(mHeight - y - height),
+        static_cast&lt;LONG&gt;(x + width), static_cast&lt;LONG&gt;(mHeight - y)
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     HRESULT result = mSwapChain-&gt;Present(&amp;rect, &amp;rect, NULL, NULL, 0);
</span><span class="lines">@@ -384,6 +389,12 @@
</span><span class="cx">     return mOffscreenTexture;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void *SwapChain9::getKeyedMutex()
+{
+    UNREACHABLE();
+    return nullptr;
+}
+
</ins><span class="cx"> void SwapChain9::recreate()
</span><span class="cx"> {
</span><span class="cx">     if (!mSwapChain)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9SwapChain9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/SwapChain9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -20,8 +20,12 @@
</span><span class="cx"> class SwapChain9 : public SwapChainD3D
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    SwapChain9(Renderer9 *renderer, NativeWindow nativeWindow, HANDLE shareHandle,
-               GLenum backBufferFormat, GLenum depthBufferFormat);
</del><ins>+    SwapChain9(Renderer9 *renderer,
+               NativeWindow nativeWindow,
+               HANDLE shareHandle,
+               GLenum backBufferFormat,
+               GLenum depthBufferFormat,
+               EGLint orientation);
</ins><span class="cx">     virtual ~SwapChain9();
</span><span class="cx"> 
</span><span class="cx">     EGLint resize(EGLint backbufferWidth, EGLint backbufferHeight);
</span><span class="lines">@@ -39,12 +43,14 @@
</span><span class="cx">     EGLint getWidth() const { return mWidth; }
</span><span class="cx">     EGLint getHeight() const { return mHeight; }
</span><span class="cx"> 
</span><ins>+    void *getKeyedMutex() override;
+
</ins><span class="cx">   private:
</span><span class="cx">     void release();
</span><span class="cx"> 
</span><span class="cx">     Renderer9 *mRenderer;
</span><ins>+    EGLint mWidth;
</ins><span class="cx">     EGLint mHeight;
</span><del>-    EGLint mWidth;
</del><span class="cx">     EGLint mSwapInterval;
</span><span class="cx"> 
</span><span class="cx">     IDirect3DSwapChain9 *mSwapChain;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9TextureStorage9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,14 +9,16 @@
</span><span class="cx"> // D3D9 texture.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/TextureStorage9.h&quot;
</span><ins>+
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/Texture.h&quot;
+#include &quot;libANGLE/renderer/d3d/EGLImageD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/TextureD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d9/formatutils9.h&quot;
+#include &quot;libANGLE/renderer/d3d/d3d9/renderer9_utils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/Renderer9.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d9/RenderTarget9.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/SwapChain9.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d9/RenderTarget9.h&quot;
-#include &quot;libANGLE/renderer/d3d/d3d9/renderer9_utils.h&quot;
-#include &quot;libANGLE/renderer/d3d/d3d9/formatutils9.h&quot;
-#include &quot;libANGLE/renderer/d3d/TextureD3D.h&quot;
-#include &quot;libANGLE/formatutils.h&quot;
-#include &quot;libANGLE/Texture.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -88,7 +90,7 @@
</span><span class="cx"> 
</span><span class="cx"> int TextureStorage9::getLevelCount() const
</span><span class="cx"> {
</span><del>-    return mMipLevels - mTopLevel;
</del><ins>+    return static_cast&lt;int&gt;(mMipLevels) - mTopLevel;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureStorage9::setData(const gl::ImageIndex &amp;index, ImageD3D *image, const gl::Box *destBox, GLenum type,
</span><span class="lines">@@ -105,7 +107,7 @@
</span><span class="cx">     mTexture = surfaceTexture;
</span><span class="cx">     mMipLevels = surfaceTexture-&gt;GetLevelCount();
</span><span class="cx"> 
</span><del>-    mInternalFormat = swapchain-&gt;GetBackBufferInternalFormat();
</del><ins>+    mInternalFormat = swapchain-&gt;GetRenderTargetInternalFormat();
</ins><span class="cx"> 
</span><span class="cx">     D3DSURFACE_DESC surfaceDesc;
</span><span class="cx">     surfaceTexture-&gt;GetLevelDesc(0, &amp;surfaceDesc);
</span><span class="lines">@@ -113,16 +115,13 @@
</span><span class="cx">     mTextureHeight = surfaceDesc.Height;
</span><span class="cx">     mTextureFormat = surfaceDesc.Format;
</span><span class="cx"> 
</span><del>-    mRenderTarget = NULL;
-
-    initializeSerials(1, 1);
</del><ins>+    mRenderTargets.resize(mMipLevels, nullptr);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureStorage9_2D::TextureStorage9_2D(Renderer9 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels)
</span><span class="cx">     : TextureStorage9(renderer, GetTextureUsage(internalformat, renderTarget))
</span><span class="cx"> {
</span><span class="cx">     mTexture = NULL;
</span><del>-    mRenderTarget = NULL;
</del><span class="cx"> 
</span><span class="cx">     mInternalFormat = internalformat;
</span><span class="cx"> 
</span><span class="lines">@@ -134,19 +133,28 @@
</span><span class="cx">     mTextureHeight = height;
</span><span class="cx">     mMipLevels = mTopLevel + levels;
</span><span class="cx"> 
</span><del>-    initializeSerials(getLevelCount(), 1);
</del><ins>+    mRenderTargets.resize(levels, nullptr);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureStorage9_2D::~TextureStorage9_2D()
</span><span class="cx"> {
</span><span class="cx">     SafeRelease(mTexture);
</span><del>-    SafeDelete(mRenderTarget);
</del><ins>+    for (auto &amp;renderTarget : mRenderTargets)
+    {
+        SafeDelete(renderTarget);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Increments refcount on surface.
</span><span class="cx"> // caller must Release() the returned surface
</span><del>-gl::Error TextureStorage9_2D::getSurfaceLevel(int level, bool dirty, IDirect3DSurface9 **outSurface)
</del><ins>+gl::Error TextureStorage9_2D::getSurfaceLevel(GLenum target,
+                                              int level,
+                                              bool dirty,
+                                              IDirect3DSurface9 **outSurface)
</ins><span class="cx"> {
</span><ins>+    ASSERT(target == GL_TEXTURE_2D);
+    UNUSED_ASSERTION_VARIABLE(target);
+
</ins><span class="cx">     IDirect3DBaseTexture9 *baseTexture = NULL;
</span><span class="cx">     gl::Error error = getBaseTexture(&amp;baseTexture);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -173,36 +181,52 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &amp;/*index*/, RenderTargetD3D **outRT)
</del><ins>+gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT)
</ins><span class="cx"> {
</span><del>-    if (!mRenderTarget &amp;&amp; isRenderTarget())
</del><ins>+    ASSERT(index.mipIndex &lt; getLevelCount());
+
+    if (!mRenderTargets[index.mipIndex] &amp;&amp; isRenderTarget())
</ins><span class="cx">     {
</span><ins>+        IDirect3DBaseTexture9 *baseTexture = NULL;
+        gl::Error error = getBaseTexture(&amp;baseTexture);
+        if (error.isError())
+        {
+            return error;
+        }
+
</ins><span class="cx">         IDirect3DSurface9 *surface = NULL;
</span><del>-        gl::Error error = getSurfaceLevel(0, false, &amp;surface);
</del><ins>+        error = getSurfaceLevel(GL_TEXTURE_2D, index.mipIndex, false, &amp;surface);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        mRenderTarget = new TextureRenderTarget9(surface, mInternalFormat, mTextureWidth, mTextureHeight, 1, 0);
</del><ins>+        size_t textureMipLevel = mTopLevel + index.mipIndex;
+        size_t mipWidth        = std::max&lt;size_t&gt;(mTextureWidth &gt;&gt; textureMipLevel, 1u);
+        size_t mipHeight       = std::max&lt;size_t&gt;(mTextureHeight &gt;&gt; textureMipLevel, 1u);
+
+        baseTexture-&gt;AddRef();
+        mRenderTargets[index.mipIndex] = new TextureRenderTarget9(
+            baseTexture, textureMipLevel, surface, mInternalFormat, static_cast&lt;GLsizei&gt;(mipWidth),
+            static_cast&lt;GLsizei&gt;(mipHeight), 1, 0);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT(outRT);
</span><del>-    *outRT = mRenderTarget;
</del><ins>+    *outRT = mRenderTargets[index.mipIndex];
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureStorage9_2D::generateMipmap(const gl::ImageIndex &amp;sourceIndex, const gl::ImageIndex &amp;destIndex)
</span><span class="cx"> {
</span><span class="cx">     IDirect3DSurface9 *upper = NULL;
</span><del>-    gl::Error error = getSurfaceLevel(sourceIndex.mipIndex, false, &amp;upper);
</del><ins>+    gl::Error error = getSurfaceLevel(GL_TEXTURE_2D, sourceIndex.mipIndex, false, &amp;upper);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     IDirect3DSurface9 *lower = NULL;
</span><del>-    error = getSurfaceLevel(destIndex.mipIndex, true, &amp;lower);
</del><ins>+    error = getSurfaceLevel(GL_TEXTURE_2D, destIndex.mipIndex, true, &amp;lower);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         SafeRelease(upper);
</span><span class="lines">@@ -227,8 +251,10 @@
</span><span class="cx">         ASSERT(mMipLevels &gt; 0);
</span><span class="cx"> 
</span><span class="cx">         IDirect3DDevice9 *device = mRenderer-&gt;getDevice();
</span><del>-        HRESULT result = device-&gt;CreateTexture(mTextureWidth, mTextureHeight, mMipLevels, getUsage(), mTextureFormat,
-                                               getPool(), &amp;mTexture, NULL);
</del><ins>+        HRESULT result = device-&gt;CreateTexture(static_cast&lt;unsigned int&gt;(mTextureWidth),
+                                               static_cast&lt;unsigned int&gt;(mTextureHeight),
+                                               static_cast&lt;unsigned int&gt;(mMipLevels), getUsage(),
+                                               mTextureFormat, getPool(), &amp;mTexture, NULL);
</ins><span class="cx"> 
</span><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><span class="lines">@@ -251,14 +277,14 @@
</span><span class="cx">     for (int i = 0; i &lt; levels; ++i)
</span><span class="cx">     {
</span><span class="cx">         IDirect3DSurface9 *srcSurf = NULL;
</span><del>-        gl::Error error = getSurfaceLevel(i, false, &amp;srcSurf);
</del><ins>+        gl::Error error = getSurfaceLevel(GL_TEXTURE_2D, i, false, &amp;srcSurf);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         IDirect3DSurface9 *dstSurf = NULL;
</span><del>-        error = dest9-&gt;getSurfaceLevel(i, true, &amp;dstSurf);
</del><ins>+        error = dest9-&gt;getSurfaceLevel(GL_TEXTURE_2D, i, true, &amp;dstSurf);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             SafeRelease(srcSurf);
</span><span class="lines">@@ -279,6 +305,131 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TextureStorage9_EGLImage::TextureStorage9_EGLImage(Renderer9 *renderer, EGLImageD3D *image)
+    : TextureStorage9(renderer, D3DUSAGE_RENDERTARGET), mImage(image)
+{
+    RenderTargetD3D *renderTargetD3D = nullptr;
+    mImage-&gt;getRenderTarget(&amp;renderTargetD3D);
+
+    RenderTarget9 *renderTarget9 = GetAs&lt;RenderTarget9&gt;(renderTargetD3D);
+
+    mInternalFormat = renderTarget9-&gt;getInternalFormat();
+    mTextureFormat  = renderTarget9-&gt;getD3DFormat();
+    mTextureWidth   = renderTarget9-&gt;getWidth();
+    mTextureHeight  = renderTarget9-&gt;getHeight();
+    mTopLevel       = static_cast&lt;int&gt;(renderTarget9-&gt;getTextureLevel());
+    mMipLevels      = mTopLevel + 1;
+}
+
+TextureStorage9_EGLImage::~TextureStorage9_EGLImage()
+{
+}
+
+gl::Error TextureStorage9_EGLImage::getSurfaceLevel(GLenum target,
+                                                    int level,
+                                                    bool,
+                                                    IDirect3DSurface9 **outSurface)
+{
+    ASSERT(target == GL_TEXTURE_2D);
+    ASSERT(level == 0);
+    UNUSED_ASSERTION_VARIABLE(target);
+    UNUSED_ASSERTION_VARIABLE(level);
+
+    RenderTargetD3D *renderTargetD3D = nullptr;
+    gl::Error error = mImage-&gt;getRenderTarget(&amp;renderTargetD3D);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    RenderTarget9 *renderTarget9 = GetAs&lt;RenderTarget9&gt;(renderTargetD3D);
+
+    *outSurface = renderTarget9-&gt;getSurface();
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error TextureStorage9_EGLImage::getRenderTarget(const gl::ImageIndex &amp;index,
+                                                    RenderTargetD3D **outRT)
+{
+    ASSERT(!index.hasLayer());
+    ASSERT(index.mipIndex == 0);
+    UNUSED_ASSERTION_VARIABLE(index);
+
+    return mImage-&gt;getRenderTarget(outRT);
+}
+
+gl::Error TextureStorage9_EGLImage::getBaseTexture(IDirect3DBaseTexture9 **outTexture)
+{
+    RenderTargetD3D *renderTargetD3D = nullptr;
+    gl::Error error = mImage-&gt;getRenderTarget(&amp;renderTargetD3D);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    RenderTarget9 *renderTarget9 = GetAs&lt;RenderTarget9&gt;(renderTargetD3D);
+    *outTexture = renderTarget9-&gt;getTexture();
+    ASSERT(*outTexture != nullptr);
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error TextureStorage9_EGLImage::generateMipmap(const gl::ImageIndex &amp;, const gl::ImageIndex &amp;)
+{
+    UNREACHABLE();
+    return gl::Error(GL_INVALID_OPERATION);
+}
+
+gl::Error TextureStorage9_EGLImage::copyToStorage(TextureStorage *destStorage)
+{
+    ASSERT(destStorage);
+    ASSERT(getLevelCount() == 1);
+
+    TextureStorage9 *dest9 = GetAs&lt;TextureStorage9&gt;(destStorage);
+
+    IDirect3DBaseTexture9 *destBaseTexture9 = nullptr;
+    gl::Error error = dest9-&gt;getBaseTexture(&amp;destBaseTexture9);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    IDirect3DTexture9 *destTexture9 = static_cast&lt;IDirect3DTexture9 *&gt;(destBaseTexture9);
+
+    IDirect3DSurface9 *destSurface = nullptr;
+    HRESULT result = destTexture9-&gt;GetSurfaceLevel(destStorage-&gt;getTopLevel(), &amp;destSurface);
+    if (FAILED(result))
+    {
+        return gl::Error(GL_OUT_OF_MEMORY,
+                         &quot;Failed to get the surface from a texture, result: 0x%X.&quot;, result);
+    }
+
+    RenderTargetD3D *sourceRenderTarget = nullptr;
+    error = mImage-&gt;getRenderTarget(&amp;sourceRenderTarget);
+    if (error.isError())
+    {
+        SafeRelease(destSurface);
+        return error;
+    }
+
+    RenderTarget9 *sourceRenderTarget9 = GetAs&lt;RenderTarget9&gt;(sourceRenderTarget);
+    error =
+        mRenderer-&gt;copyToRenderTarget(destSurface, sourceRenderTarget9-&gt;getSurface(), isManaged());
+    if (error.isError())
+    {
+        SafeRelease(destSurface);
+        return error;
+    }
+
+    if (destStorage-&gt;getTopLevel() != 0)
+    {
+        destTexture9-&gt;AddDirtyRect(nullptr);
+    }
+
+    SafeRelease(destSurface);
+    return gl::Error(GL_NO_ERROR);
+}
+
</ins><span class="cx"> TextureStorage9_Cube::TextureStorage9_Cube(Renderer9 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly)
</span><span class="cx">     : TextureStorage9(renderer, GetTextureUsage(internalformat, renderTarget))
</span><span class="cx"> {
</span><span class="lines">@@ -298,8 +449,6 @@
</span><span class="cx">     mTextureWidth = size;
</span><span class="cx">     mTextureHeight = size;
</span><span class="cx">     mMipLevels = mTopLevel + levels;
</span><del>-
-    initializeSerials(getLevelCount() * CUBE_FACE_COUNT, CUBE_FACE_COUNT);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureStorage9_Cube::~TextureStorage9_Cube()
</span><span class="lines">@@ -314,7 +463,10 @@
</span><span class="cx"> 
</span><span class="cx"> // Increments refcount on surface.
</span><span class="cx"> // caller must Release() the returned surface
</span><del>-gl::Error TextureStorage9_Cube::getCubeMapSurface(GLenum faceTarget, int level, bool dirty, IDirect3DSurface9 **outSurface)
</del><ins>+gl::Error TextureStorage9_Cube::getSurfaceLevel(GLenum target,
+                                                int level,
+                                                bool dirty,
+                                                IDirect3DSurface9 **outSurface)
</ins><span class="cx"> {
</span><span class="cx">     IDirect3DBaseTexture9 *baseTexture = NULL;
</span><span class="cx">     gl::Error error = getBaseTexture(&amp;baseTexture);
</span><span class="lines">@@ -325,8 +477,8 @@
</span><span class="cx"> 
</span><span class="cx">     IDirect3DCubeTexture9 *texture = static_cast&lt;IDirect3DCubeTexture9*&gt;(baseTexture);
</span><span class="cx"> 
</span><del>-    D3DCUBEMAP_FACES face = gl_d3d9::ConvertCubeFace(faceTarget);
-    HRESULT result = texture-&gt;GetCubeMapSurface(face, level + mTopLevel, outSurface);
</del><ins>+    D3DCUBEMAP_FACES face = gl_d3d9::ConvertCubeFace(target);
+    HRESULT result        = texture-&gt;GetCubeMapSurface(face, level, outSurface);
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(SUCCEEDED(result));
</span><span class="cx">     if (FAILED(result))
</span><span class="lines">@@ -351,14 +503,25 @@
</span><span class="cx"> 
</span><span class="cx">     if (mRenderTarget[index.layerIndex] == NULL &amp;&amp; isRenderTarget())
</span><span class="cx">     {
</span><ins>+        IDirect3DBaseTexture9 *baseTexture = NULL;
+        gl::Error error = getBaseTexture(&amp;baseTexture);
+        if (error.isError())
+        {
+            return error;
+        }
+
</ins><span class="cx">         IDirect3DSurface9 *surface = NULL;
</span><del>-        gl::Error error = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + index.layerIndex, 0, false, &amp;surface);
</del><ins>+        error = getSurfaceLevel(GL_TEXTURE_CUBE_MAP_POSITIVE_X + index.layerIndex,
+                                mTopLevel + index.mipIndex, false, &amp;surface);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        mRenderTarget[index.layerIndex] = new TextureRenderTarget9(surface, mInternalFormat, mTextureWidth, mTextureHeight, 1, 0);
</del><ins>+        baseTexture-&gt;AddRef();
+        mRenderTarget[index.layerIndex] = new TextureRenderTarget9(
+            baseTexture, mTopLevel + index.mipIndex, surface, mInternalFormat,
+            static_cast&lt;GLsizei&gt;(mTextureWidth), static_cast&lt;GLsizei&gt;(mTextureHeight), 1, 0);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     *outRT = mRenderTarget[index.layerIndex];
</span><span class="lines">@@ -368,14 +531,14 @@
</span><span class="cx"> gl::Error TextureStorage9_Cube::generateMipmap(const gl::ImageIndex &amp;sourceIndex, const gl::ImageIndex &amp;destIndex)
</span><span class="cx"> {
</span><span class="cx">     IDirect3DSurface9 *upper = NULL;
</span><del>-    gl::Error error = getCubeMapSurface(sourceIndex.type, sourceIndex.mipIndex, false, &amp;upper);
</del><ins>+    gl::Error error = getSurfaceLevel(sourceIndex.type, sourceIndex.mipIndex, false, &amp;upper);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     IDirect3DSurface9 *lower = NULL;
</span><del>-    error = getCubeMapSurface(destIndex.type, destIndex.mipIndex, true, &amp;lower);
</del><ins>+    error = getSurfaceLevel(destIndex.type, destIndex.mipIndex, true, &amp;lower);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         SafeRelease(upper);
</span><span class="lines">@@ -401,8 +564,9 @@
</span><span class="cx">         ASSERT(mTextureWidth == mTextureHeight);
</span><span class="cx"> 
</span><span class="cx">         IDirect3DDevice9 *device = mRenderer-&gt;getDevice();
</span><del>-        HRESULT result = device-&gt;CreateCubeTexture(mTextureWidth, mMipLevels, getUsage(), mTextureFormat, getPool(),
-                                                   &amp;mTexture, NULL);
</del><ins>+        HRESULT result = device-&gt;CreateCubeTexture(
+            static_cast&lt;unsigned int&gt;(mTextureWidth), static_cast&lt;unsigned int&gt;(mMipLevels),
+            getUsage(), mTextureFormat, getPool(), &amp;mTexture, NULL);
</ins><span class="cx"> 
</span><span class="cx">         if (FAILED(result))
</span><span class="cx">         {
</span><span class="lines">@@ -427,14 +591,15 @@
</span><span class="cx">         for (int i = 0; i &lt; levels; i++)
</span><span class="cx">         {
</span><span class="cx">             IDirect3DSurface9 *srcSurf = NULL;
</span><del>-            gl::Error error = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, false, &amp;srcSurf);
</del><ins>+            gl::Error error =
+                getSurfaceLevel(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, false, &amp;srcSurf);
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 return error;
</span><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             IDirect3DSurface9 *dstSurf = NULL;
</span><del>-            error = dest9-&gt;getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, true, &amp;dstSurf);
</del><ins>+            error = dest9-&gt;getSurfaceLevel(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i, true, &amp;dstSurf);
</ins><span class="cx">             if (error.isError())
</span><span class="cx">             {
</span><span class="cx">                 SafeRelease(srcSurf);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9TextureStorage9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,6 +16,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+class EGLImageD3D;
</ins><span class="cx"> class Renderer9;
</span><span class="cx"> class SwapChain9;
</span><span class="cx"> class RenderTargetD3D;
</span><span class="lines">@@ -31,6 +32,10 @@
</span><span class="cx">     D3DPOOL getPool() const;
</span><span class="cx">     DWORD getUsage() const;
</span><span class="cx"> 
</span><ins>+    virtual gl::Error getSurfaceLevel(GLenum target,
+                                      int level,
+                                      bool dirty,
+                                      IDirect3DSurface9 **outSurface) = 0;
</ins><span class="cx">     virtual gl::Error getBaseTexture(IDirect3DBaseTexture9 **outTexture) = 0;
</span><span class="cx">     virtual gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT) = 0;
</span><span class="cx"> 
</span><span class="lines">@@ -67,7 +72,10 @@
</span><span class="cx">     TextureStorage9_2D(Renderer9 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels);
</span><span class="cx">     virtual ~TextureStorage9_2D();
</span><span class="cx"> 
</span><del>-    gl::Error getSurfaceLevel(int level, bool dirty, IDirect3DSurface9 **outSurface);
</del><ins>+    gl::Error getSurfaceLevel(GLenum target,
+                              int level,
+                              bool dirty,
+                              IDirect3DSurface9 **outSurface) override;
</ins><span class="cx">     virtual gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT);
</span><span class="cx">     virtual gl::Error getBaseTexture(IDirect3DBaseTexture9 **outTexture);
</span><span class="cx">     virtual gl::Error generateMipmap(const gl::ImageIndex &amp;sourceIndex, const gl::ImageIndex &amp;destIndex);
</span><span class="lines">@@ -75,16 +83,39 @@
</span><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     IDirect3DTexture9 *mTexture;
</span><del>-    RenderTarget9 *mRenderTarget;
</del><ins>+    std::vector&lt;RenderTarget9 *&gt; mRenderTargets;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+class TextureStorage9_EGLImage final : public TextureStorage9
+{
+  public:
+    TextureStorage9_EGLImage(Renderer9 *renderer, EGLImageD3D *image);
+    ~TextureStorage9_EGLImage() override;
+
+    gl::Error getSurfaceLevel(GLenum target,
+                              int level,
+                              bool dirty,
+                              IDirect3DSurface9 **outSurface) override;
+    gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT) override;
+    gl::Error getBaseTexture(IDirect3DBaseTexture9 **outTexture) override;
+    gl::Error generateMipmap(const gl::ImageIndex &amp;sourceIndex,
+                             const gl::ImageIndex &amp;destIndex) override;
+    gl::Error copyToStorage(TextureStorage *destStorage) override;
+
+  private:
+    EGLImageD3D *mImage;
+};
+
</ins><span class="cx"> class TextureStorage9_Cube : public TextureStorage9
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     TextureStorage9_Cube(Renderer9 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly);
</span><span class="cx">     virtual ~TextureStorage9_Cube();
</span><span class="cx"> 
</span><del>-    gl::Error getCubeMapSurface(GLenum faceTarget, int level, bool dirty, IDirect3DSurface9 **outSurface);
</del><ins>+    gl::Error getSurfaceLevel(GLenum target,
+                              int level,
+                              bool dirty,
+                              IDirect3DSurface9 **outSurface) override;
</ins><span class="cx">     virtual gl::Error getRenderTarget(const gl::ImageIndex &amp;index, RenderTargetD3D **outRT);
</span><span class="cx">     virtual gl::Error getBaseTexture(IDirect3DBaseTexture9 **outTexture);
</span><span class="cx">     virtual gl::Error generateMipmap(const gl::ImageIndex &amp;sourceIndex, const gl::ImageIndex &amp;destIndex);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9VertexArray9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexArray9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -19,21 +19,12 @@
</span><span class="cx"> class VertexArray9 : public VertexArrayImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    VertexArray9(Renderer9 *renderer)
-        : VertexArrayImpl(),
-          mRenderer(renderer)
</del><ins>+    VertexArray9(const gl::VertexArray::Data &amp;data)
+        : VertexArrayImpl(data)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     virtual ~VertexArray9() { }
</span><del>-
-    virtual void setElementArrayBuffer(const gl::Buffer *buffer) { }
-    virtual void setAttribute(size_t idx, const gl::VertexAttribute &amp;attr) { }
-    virtual void setAttributeDivisor(size_t idx, GLuint divisor) { }
-    virtual void enableAttribute(size_t idx, bool enabledState) { }
-
-  private:
-    Renderer9 *mRenderer;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9VertexBuffer9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -56,67 +56,49 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexBuffer9::storeVertexAttributes(const gl::VertexAttribute &amp;attrib, const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                               GLint start, GLsizei count, GLsizei instances, unsigned int offset)
</del><ins>+gl::Error VertexBuffer9::storeVertexAttributes(const gl::VertexAttribute &amp;attrib,
+                                               GLenum currentValueType,
+                                               GLint start,
+                                               GLsizei count,
+                                               GLsizei instances,
+                                               unsigned int offset,
+                                               const uint8_t *sourceData)
</ins><span class="cx"> {
</span><span class="cx">     if (!mVertexBuffer)
</span><span class="cx">     {
</span><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Internal vertex buffer is not initialized.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::Buffer *buffer = attrib.buffer.get();
</del><ins>+    int inputStride = static_cast&lt;int&gt;(gl::ComputeVertexAttributeStride(attrib));
+    int elementSize = static_cast&lt;int&gt;(gl::ComputeVertexAttributeTypeSize(attrib));
</ins><span class="cx"> 
</span><del>-    int inputStride = gl::ComputeVertexAttributeStride(attrib);
-    int elementSize = gl::ComputeVertexAttributeTypeSize(attrib);
-
</del><span class="cx">     DWORD lockFlags = mDynamicUsage ? D3DLOCK_NOOVERWRITE : 0;
</span><span class="cx"> 
</span><del>-    uint8_t *mapPtr = NULL;
</del><ins>+    uint8_t *mapPtr = nullptr;
</ins><span class="cx"> 
</span><del>-    unsigned int mapSize;
-    gl::Error error = spaceRequired(attrib, count, instances, &amp;mapSize);
-    if (error.isError())
</del><ins>+    auto errorOrMapSize = mRenderer-&gt;getVertexSpaceRequired(attrib, count, instances);
+    if (errorOrMapSize.isError())
</ins><span class="cx">     {
</span><del>-        return error;
</del><ins>+        return errorOrMapSize.getError();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    unsigned int mapSize = errorOrMapSize.getResult();
+
</ins><span class="cx">     HRESULT result = mVertexBuffer-&gt;Lock(offset, mapSize, reinterpret_cast&lt;void**&gt;(&amp;mapPtr), lockFlags);
</span><span class="cx">     if (FAILED(result))
</span><span class="cx">     {
</span><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to lock internal vertex buffer, HRESULT: 0x%08x.&quot;, result);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const uint8_t *input = NULL;
-    if (attrib.enabled)
-    {
-        if (buffer)
-        {
-            BufferD3D *storage = GetImplAs&lt;BufferD3D&gt;(buffer);
-            ASSERT(storage);
-            error = storage-&gt;getData(&amp;input);
-            if (error.isError())
-            {
-                return error;
-            }
-            input += static_cast&lt;int&gt;(attrib.offset);
-        }
-        else
-        {
-            input = static_cast&lt;const uint8_t*&gt;(attrib.pointer);
-        }
-    }
-    else
-    {
-        input = reinterpret_cast&lt;const uint8_t*&gt;(currentValue.FloatValues);
-    }
</del><ins>+    const uint8_t *input = sourceData;
</ins><span class="cx"> 
</span><span class="cx">     if (instances == 0 || attrib.divisor == 0)
</span><span class="cx">     {
</span><span class="cx">         input += inputStride * start;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::VertexFormat vertexFormat(attrib, currentValue.Type);
-    const d3d9::VertexFormat &amp;d3dVertexInfo = d3d9::GetVertexFormatInfo(mRenderer-&gt;getCapsDeclTypes(), vertexFormat);
</del><ins>+    gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib, currentValueType);
+    const d3d9::VertexFormat &amp;d3dVertexInfo = d3d9::GetVertexFormatInfo(mRenderer-&gt;getCapsDeclTypes(), vertexFormatType);
</ins><span class="cx">     bool needsConversion = (d3dVertexInfo.conversionType &amp; VERTEX_CONVERT_CPU) &gt; 0;
</span><span class="cx"> 
</span><span class="cx">     if (!needsConversion &amp;&amp; inputStride == elementSize)
</span><span class="lines">@@ -134,12 +116,6 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexBuffer9::getSpaceRequired(const gl::VertexAttribute &amp;attrib, GLsizei count, GLsizei instances,
-                                          unsigned int *outSpaceRequired) const
-{
-    return spaceRequired(attrib, count, instances, outSpaceRequired);
-}
-
</del><span class="cx"> unsigned int VertexBuffer9::getBufferSize() const
</span><span class="cx"> {
</span><span class="cx">     return mBufferSize;
</span><span class="lines">@@ -186,48 +162,4 @@
</span><span class="cx"> {
</span><span class="cx">     return mVertexBuffer;
</span><span class="cx"> }
</span><del>-
-gl::Error VertexBuffer9::spaceRequired(const gl::VertexAttribute &amp;attrib, std::size_t count, GLsizei instances,
-                                       unsigned int *outSpaceRequired) const
-{
-    gl::VertexFormat vertexFormat(attrib, GL_FLOAT);
-    const d3d9::VertexFormat &amp;d3d9VertexInfo = d3d9::GetVertexFormatInfo(mRenderer-&gt;getCapsDeclTypes(), vertexFormat);
-
-    if (attrib.enabled)
-    {
-        unsigned int elementCount = 0;
-        if (instances == 0 || attrib.divisor == 0)
-        {
-            elementCount = count;
-        }
-        else
-        {
-            // Round up to divisor, if possible
-            elementCount = UnsignedCeilDivide(static_cast&lt;unsigned int&gt;(instances), attrib.divisor);
-        }
-
-        if (d3d9VertexInfo.outputElementSize &lt;= std::numeric_limits&lt;unsigned int&gt;::max() / elementCount)
-        {
-            if (outSpaceRequired)
-            {
-                *outSpaceRequired = d3d9VertexInfo.outputElementSize * elementCount;
-            }
-            return gl::Error(GL_NO_ERROR);
-        }
-        else
-        {
-            return gl::Error(GL_OUT_OF_MEMORY, &quot;New vertex buffer size would result in an overflow.&quot;);
-        }
-    }
-    else
-    {
-        const unsigned int elementSize = 4;
-        if (outSpaceRequired)
-        {
-            *outSpaceRequired = elementSize * 4;
-        }
-        return gl::Error(GL_NO_ERROR);
-    }
-}
-
-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9VertexBuffer9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexBuffer9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -19,30 +19,30 @@
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     explicit VertexBuffer9(Renderer9 *renderer);
</span><del>-    virtual ~VertexBuffer9();
</del><span class="cx"> 
</span><del>-    virtual gl::Error initialize(unsigned int size, bool dynamicUsage);
</del><ins>+    gl::Error initialize(unsigned int size, bool dynamicUsage) override;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error storeVertexAttributes(const gl::VertexAttribute &amp;attrib, const gl::VertexAttribCurrentValueData &amp;currentValue,
-                                            GLint start, GLsizei count, GLsizei instances, unsigned int offset);
</del><ins>+    gl::Error storeVertexAttributes(const gl::VertexAttribute &amp;attrib,
+                                    GLenum currentValueType,
+                                    GLint start,
+                                    GLsizei count,
+                                    GLsizei instances,
+                                    unsigned int offset,
+                                    const uint8_t *sourceData) override;
</ins><span class="cx"> 
</span><del>-    virtual gl::Error getSpaceRequired(const gl::VertexAttribute &amp;attrib, GLsizei count, GLsizei instances, unsigned int *outSpaceRequired) const;
</del><ins>+    unsigned int getBufferSize() const override;
+    gl::Error setBufferSize(unsigned int size) override;
+    gl::Error discard() override;
</ins><span class="cx"> 
</span><del>-    virtual unsigned int getBufferSize() const;
-    virtual gl::Error setBufferSize(unsigned int size);
-    virtual gl::Error discard();
-
</del><span class="cx">     IDirect3DVertexBuffer9 *getBuffer() const;
</span><span class="cx"> 
</span><span class="cx">   private:
</span><ins>+    ~VertexBuffer9() override;
</ins><span class="cx">     Renderer9 *mRenderer;
</span><span class="cx"> 
</span><span class="cx">     IDirect3DVertexBuffer9 *mVertexBuffer;
</span><span class="cx">     unsigned int mBufferSize;
</span><span class="cx">     bool mDynamicUsage;
</span><del>-
-    gl::Error spaceRequired(const gl::VertexAttribute &amp;attrib, std::size_t count, GLsizei instances,
-                            unsigned int *outSpaceRequired) const;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9VertexDeclarationCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,10 +7,12 @@
</span><span class="cx"> // VertexDeclarationCache.cpp: Implements a helper class to construct and cache vertex declarations.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h&quot;
</span><ins>+
+#include &quot;libANGLE/VertexAttribute.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/renderer/d3d/ProgramD3D.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/VertexBuffer9.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/formatutils9.h&quot;
</span><del>-#include &quot;libANGLE/Program.h&quot;
-#include &quot;libANGLE/VertexAttribute.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -40,16 +42,25 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexDeclarationCache::applyDeclaration(IDirect3DDevice9 *device, TranslatedAttribute attributes[], gl::Program *program, GLsizei instances, GLsizei *repeatDraw)
</del><ins>+gl::Error VertexDeclarationCache::applyDeclaration(
+    IDirect3DDevice9 *device,
+    const std::vector&lt;TranslatedAttribute&gt; &amp;attributes,
+    gl::Program *program,
+    GLint start,
+    GLsizei instances,
+    GLsizei *repeatDraw)
</ins><span class="cx"> {
</span><ins>+    ASSERT(gl::MAX_VERTEX_ATTRIBS &gt;= attributes.size());
+
</ins><span class="cx">     *repeatDraw = 1;
</span><span class="cx"> 
</span><del>-    int indexedAttribute = gl::MAX_VERTEX_ATTRIBS;
-    int instancedAttribute = gl::MAX_VERTEX_ATTRIBS;
</del><ins>+    const size_t invalidAttribIndex = attributes.size();
+    size_t indexedAttribute = invalidAttribIndex;
+    size_t instancedAttribute = invalidAttribIndex;
</ins><span class="cx"> 
</span><span class="cx">     if (instances == 0)
</span><span class="cx">     {
</span><del>-        for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; ++i)
</del><ins>+        for (size_t i = 0; i &lt; attributes.size(); ++i)
</ins><span class="cx">         {
</span><span class="cx">             if (attributes[i].divisor != 0)
</span><span class="cx">             {
</span><span class="lines">@@ -64,26 +75,26 @@
</span><span class="cx">     if (instances &gt; 0)
</span><span class="cx">     {
</span><span class="cx">         // Find an indexed attribute to be mapped to D3D stream 0
</span><del>-        for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+        for (size_t i = 0; i &lt; attributes.size(); i++)
</ins><span class="cx">         {
</span><span class="cx">             if (attributes[i].active)
</span><span class="cx">             {
</span><del>-                if (indexedAttribute == gl::MAX_VERTEX_ATTRIBS &amp;&amp; attributes[i].divisor == 0)
</del><ins>+                if (indexedAttribute == invalidAttribIndex &amp;&amp; attributes[i].divisor == 0)
</ins><span class="cx">                 {
</span><span class="cx">                     indexedAttribute = i;
</span><span class="cx">                 }
</span><del>-                else if (instancedAttribute == gl::MAX_VERTEX_ATTRIBS &amp;&amp; attributes[i].divisor != 0)
</del><ins>+                else if (instancedAttribute == invalidAttribIndex &amp;&amp; attributes[i].divisor != 0)
</ins><span class="cx">                 {
</span><span class="cx">                     instancedAttribute = i;
</span><span class="cx">                 }
</span><del>-                if (indexedAttribute != gl::MAX_VERTEX_ATTRIBS &amp;&amp; instancedAttribute != gl::MAX_VERTEX_ATTRIBS)
</del><ins>+                if (indexedAttribute != invalidAttribIndex &amp;&amp; instancedAttribute != invalidAttribIndex)
</ins><span class="cx">                     break;   // Found both an indexed and instanced attribute
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // The validation layer checks that there is at least one active attribute with a zero divisor as per
</span><span class="cx">         // the GL_ANGLE_instanced_arrays spec.
</span><del>-        ASSERT(indexedAttribute != gl::MAX_VERTEX_ATTRIBS);
</del><ins>+        ASSERT(indexedAttribute != invalidAttribIndex);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     D3DCAPS9 caps;
</span><span class="lines">@@ -92,19 +103,22 @@
</span><span class="cx">     D3DVERTEXELEMENT9 elements[gl::MAX_VERTEX_ATTRIBS + 1];
</span><span class="cx">     D3DVERTEXELEMENT9 *element = &amp;elements[0];
</span><span class="cx"> 
</span><del>-    for (int i = 0; i &lt; gl::MAX_VERTEX_ATTRIBS; i++)
</del><ins>+    ProgramD3D *programD3D      = GetImplAs&lt;ProgramD3D&gt;(program);
+    const auto &amp;semanticIndexes = programD3D-&gt;getAttribLocationToD3DSemantics();
+
+    for (size_t i = 0; i &lt; attributes.size(); i++)
</ins><span class="cx">     {
</span><span class="cx">         if (attributes[i].active)
</span><span class="cx">         {
</span><span class="cx">             // Directly binding the storage buffer is not supported for d3d9
</span><span class="cx">             ASSERT(attributes[i].storage == NULL);
</span><span class="cx"> 
</span><del>-            int stream = i;
</del><ins>+            int stream = static_cast&lt;int&gt;(i);
</ins><span class="cx"> 
</span><span class="cx">             if (instances &gt; 0)
</span><span class="cx">             {
</span><span class="cx">                 // Due to a bug on ATI cards we can't enable instancing when none of the attributes are instanced.
</span><del>-                if (instancedAttribute == gl::MAX_VERTEX_ATTRIBS)
</del><ins>+                if (instancedAttribute == invalidAttribIndex)
</ins><span class="cx">                 {
</span><span class="cx">                     *repeatDraw = instances;
</span><span class="cx">                 }
</span><span class="lines">@@ -116,7 +130,7 @@
</span><span class="cx">                     }
</span><span class="cx">                     else if (i == 0)
</span><span class="cx">                     {
</span><del>-                        stream = indexedAttribute;
</del><ins>+                        stream = static_cast&lt;int&gt;(indexedAttribute);
</ins><span class="cx">                     }
</span><span class="cx"> 
</span><span class="cx">                     UINT frequency = 1;
</span><span class="lines">@@ -135,32 +149,36 @@
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            VertexBuffer9 *vertexBuffer = GetAs&lt;VertexBuffer9&gt;(attributes[i].vertexBuffer);
</del><ins>+            VertexBuffer9 *vertexBuffer = GetAs&lt;VertexBuffer9&gt;(attributes[i].vertexBuffer.get());
</ins><span class="cx"> 
</span><ins>+            unsigned int offset = 0;
+            ANGLE_TRY_RESULT(attributes[i].computeOffset(start), offset);
+
</ins><span class="cx">             if (mAppliedVBs[stream].serial != attributes[i].serial ||
</span><span class="cx">                 mAppliedVBs[stream].stride != attributes[i].stride ||
</span><del>-                mAppliedVBs[stream].offset != attributes[i].offset)
</del><ins>+                mAppliedVBs[stream].offset != offset)
</ins><span class="cx">             {
</span><del>-                device-&gt;SetStreamSource(stream, vertexBuffer-&gt;getBuffer(), attributes[i].offset, attributes[i].stride);
</del><ins>+                device-&gt;SetStreamSource(stream, vertexBuffer-&gt;getBuffer(), offset,
+                                        attributes[i].stride);
</ins><span class="cx">                 mAppliedVBs[stream].serial = attributes[i].serial;
</span><span class="cx">                 mAppliedVBs[stream].stride = attributes[i].stride;
</span><del>-                mAppliedVBs[stream].offset = attributes[i].offset;
</del><ins>+                mAppliedVBs[stream].offset = offset;
</ins><span class="cx">             }
</span><span class="cx"> 
</span><del>-            gl::VertexFormat vertexFormat(*attributes[i].attribute, GL_FLOAT);
-            const d3d9::VertexFormat &amp;d3d9VertexInfo = d3d9::GetVertexFormatInfo(caps.DeclTypes, vertexFormat);
</del><ins>+            gl::VertexFormatType vertexformatType = gl::GetVertexFormatType(*attributes[i].attribute, GL_FLOAT);
+            const d3d9::VertexFormat &amp;d3d9VertexInfo = d3d9::GetVertexFormatInfo(caps.DeclTypes, vertexformatType);
</ins><span class="cx"> 
</span><span class="cx">             element-&gt;Stream = static_cast&lt;WORD&gt;(stream);
</span><span class="cx">             element-&gt;Offset = 0;
</span><span class="cx">             element-&gt;Type = static_cast&lt;BYTE&gt;(d3d9VertexInfo.nativeFormat);
</span><span class="cx">             element-&gt;Method = D3DDECLMETHOD_DEFAULT;
</span><span class="cx">             element-&gt;Usage = D3DDECLUSAGE_TEXCOORD;
</span><del>-            element-&gt;UsageIndex = static_cast&lt;BYTE&gt;(program-&gt;getSemanticIndex(i));
</del><ins>+            element-&gt;UsageIndex = static_cast&lt;BYTE&gt;(semanticIndexes[i]);
</ins><span class="cx">             element++;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (instances == 0 || instancedAttribute == gl::MAX_VERTEX_ATTRIBS)
</del><ins>+    if (instances == 0 || instancedAttribute == invalidAttribIndex)
</ins><span class="cx">     {
</span><span class="cx">         if (mInstancingEnabled)
</span><span class="cx">         {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9VertexDeclarationCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/VertexDeclarationCache.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -27,7 +27,12 @@
</span><span class="cx">     VertexDeclarationCache();
</span><span class="cx">     ~VertexDeclarationCache();
</span><span class="cx"> 
</span><del>-    gl::Error applyDeclaration(IDirect3DDevice9 *device, TranslatedAttribute attributes[], gl::Program *program, GLsizei instances, GLsizei *repeatDraw);
</del><ins>+    gl::Error applyDeclaration(IDirect3DDevice9 *device,
+                               const std::vector&lt;TranslatedAttribute&gt; &amp;attributes,
+                               gl::Program *program,
+                               GLint start,
+                               GLsizei instances,
+                               GLsizei *repeatDraw);
</ins><span class="cx"> 
</span><span class="cx">     void markStateDirty();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9formatutils9cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/formatutils9.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -119,8 +119,8 @@
</span><span class="cx">     InsertD3DFormatInfo(&amp;map, D3DFMT_L8,              8, 1, 1,  0,  0,  0,  0,  8,  0,  0, GL_LUMINANCE8_EXT,                  GenerateMip&lt;L8&gt;,            ReadColor&lt;L8, GLfloat&gt;           );
</span><span class="cx">     InsertD3DFormatInfo(&amp;map, D3DFMT_A8,              8, 1, 1,  0,  0,  0,  8,  0,  0,  0, GL_ALPHA8_EXT,                      GenerateMip&lt;A8&gt;,            ReadColor&lt;A8, GLfloat&gt;           );
</span><span class="cx">     InsertD3DFormatInfo(&amp;map, D3DFMT_A8L8,           16, 1, 1,  0,  0,  0,  8,  8,  0,  0, GL_LUMINANCE8_ALPHA8_EXT,           GenerateMip&lt;A8L8&gt;,          ReadColor&lt;A8L8, GLfloat&gt;         );
</span><del>-    InsertD3DFormatInfo(&amp;map, D3DFMT_A4R4G4B4,       16, 1, 1,  4,  4,  4,  4,  0,  0,  0, GL_BGRA4_ANGLEX,                    GenerateMip&lt;B4G4R4A4&gt;,      ReadColor&lt;B4G4R4A4, GLfloat&gt;     );
-    InsertD3DFormatInfo(&amp;map, D3DFMT_A1R5G5B5,       16, 1, 1,  5,  5,  5,  1,  0,  0,  0, GL_BGR5_A1_ANGLEX,                  GenerateMip&lt;B5G5R5A1&gt;,      ReadColor&lt;B5G5R5A1, GLfloat&gt;     );
</del><ins>+    InsertD3DFormatInfo(&amp;map, D3DFMT_A4R4G4B4,       16, 1, 1,  4,  4,  4,  4,  0,  0,  0, GL_BGRA4_ANGLEX,                    GenerateMip&lt;A4R4G4B4&gt;,      ReadColor&lt;A4R4G4B4, GLfloat&gt;     );
+    InsertD3DFormatInfo(&amp;map, D3DFMT_A1R5G5B5,       16, 1, 1,  5,  5,  5,  1,  0,  0,  0, GL_BGR5_A1_ANGLEX,                  GenerateMip&lt;A1R5G5B5&gt;,      ReadColor&lt;A1R5G5B5, GLfloat&gt;     );
</ins><span class="cx">     InsertD3DFormatInfo(&amp;map, D3DFMT_R5G6B5,         16, 1, 1,  5,  6,  5,  0,  0,  0,  0, GL_RGB565,                          GenerateMip&lt;R5G6B5&gt;,        ReadColor&lt;R5G6B5, GLfloat&gt;       );
</span><span class="cx">     InsertD3DFormatInfo(&amp;map, D3DFMT_X8R8G8B8,       32, 1, 1,  8,  8,  8,  0,  0,  0,  0, GL_BGRA8_EXT,                       GenerateMip&lt;B8G8R8X8&gt;,      ReadColor&lt;B8G8R8X8, GLfloat&gt;     );
</span><span class="cx">     InsertD3DFormatInfo(&amp;map, D3DFMT_A8R8G8B8,       32, 1, 1,  8,  8,  8,  8,  0,  0,  0, GL_BGRA8_EXT,                       GenerateMip&lt;B8G8R8A8&gt;,      ReadColor&lt;B8G8R8A8, GLfloat&gt;     );
</span><span class="lines">@@ -475,16 +475,25 @@
</span><span class="cx"> // and the D3DDECLTYPE member needed for the vertex declaration in declflag.
</span><span class="cx"> template &lt;GLenum fromType, bool normalized, int size, template &lt;class T&gt; class PreferenceRule&gt;
</span><span class="cx"> struct Converter
</span><del>-    : VertexDataConverter&lt;typename GLToCType&lt;fromType&gt;::type,
-                          WidenRule&lt;PreferenceRule&lt; VertexTypeMapping&lt;fromType, normalized&gt; &gt;::type, size&gt;,
-                          ConversionRule&lt;fromType,
-                                         normalized,
-                                         PreferenceRule&lt; VertexTypeMapping&lt;fromType, normalized&gt; &gt;::type&gt;,
-                          DefaultVertexValues&lt;typename D3DToCType&lt;PreferenceRule&lt; VertexTypeMapping&lt;fromType, normalized&gt; &gt;::type&gt;::type, normalized &gt; &gt;
</del><ins>+    : VertexDataConverter&lt;
+          typename GLToCType&lt;fromType&gt;::type,
+          WidenRule&lt;PreferenceRule&lt;VertexTypeMapping&lt;fromType, normalized&gt;&gt;::type, size&gt;,
+          ConversionRule&lt;fromType,
+                         normalized,
+                         PreferenceRule&lt;VertexTypeMapping&lt;fromType, normalized&gt;&gt;::type&gt;,
+          DefaultVertexValues&lt;typename D3DToCType&lt;PreferenceRule&lt;
+                                  VertexTypeMapping&lt;fromType, normalized&gt;&gt;::type&gt;::type,
+                              normalized&gt;&gt;
</ins><span class="cx"> {
</span><span class="cx"> private:
</span><del>-    enum { d3dtype = PreferenceRule&lt; VertexTypeMapping&lt;fromType, normalized&gt; &gt;::type };
-    enum { d3dsize = WidenRule&lt;d3dtype, size&gt;::finalWidth };
</del><ins>+  enum
+  {
+      d3dtype = PreferenceRule&lt;VertexTypeMapping&lt;fromType, normalized&gt;&gt;::type
+  };
+  enum
+  {
+      d3dsize = WidenRule&lt;d3dtype, size&gt;::finalWidth
+  };
</ins><span class="cx"> 
</span><span class="cx"> public:
</span><span class="cx">     enum { capflag = VertexTypeFlags&lt;d3dtype, d3dsize&gt;::capflag };
</span><span class="lines">@@ -555,7 +564,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const VertexFormat &amp;GetVertexFormatInfo(DWORD supportedDeclTypes, const gl::VertexFormat &amp;vertexFormat)
</del><ins>+const VertexFormat &amp;GetVertexFormatInfo(DWORD supportedDeclTypes, gl::VertexFormatType vertexFormatType)
</ins><span class="cx"> {
</span><span class="cx">     static bool initialized = false;
</span><span class="cx">     static DWORD initializedDeclTypes = 0;
</span><span class="lines">@@ -592,9 +601,11 @@
</span><span class="cx">         initializedDeclTypes = supportedDeclTypes;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    const gl::VertexFormat &amp;vertexFormat = gl::GetVertexFormatFromType(vertexFormatType);
+
</ins><span class="cx">     // Pure integer attributes only supported in ES3.0
</span><del>-    ASSERT(!vertexFormat.mPureInteger);
-    return formatConverters[ComputeTypeIndex(vertexFormat.mType)][vertexFormat.mNormalized][vertexFormat.mComponents - 1];
</del><ins>+    ASSERT(!vertexFormat.pureInteger);
+    return formatConverters[ComputeTypeIndex(vertexFormat.type)][vertexFormat.normalized][vertexFormat.components - 1];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9formatutils9h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/formatutils9.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/formatutils9.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/formatutils9.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,13 +10,13 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_D3D_D3D9_FORMATUTILS9_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_D3D_D3D9_FORMATUTILS9_H_
</span><span class="cx"> 
</span><del>-#include &quot;libANGLE/renderer/d3d/formatutilsD3D.h&quot;
-#include &quot;libANGLE/angletypes.h&quot;
</del><ins>+#include &lt;map&gt;
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;common/platform.h&quot;
</span><ins>+#include &quot;libANGLE/angletypes.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/renderer/d3d/formatutilsD3D.h&quot;
</ins><span class="cx"> 
</span><del>-#include &lt;map&gt;
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx">     D3DDECLTYPE nativeFormat;
</span><span class="cx">     GLenum componentType;
</span><span class="cx"> };
</span><del>-const VertexFormat &amp;GetVertexFormatInfo(DWORD supportedDeclTypes, const gl::VertexFormat &amp;vertexFormat);
</del><ins>+const VertexFormat &amp;GetVertexFormatInfo(DWORD supportedDeclTypes, gl::VertexFormatType vertexFormatType);
</ins><span class="cx"> 
</span><span class="cx"> struct TextureFormat
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9renderer9_utilscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,16 +8,17 @@
</span><span class="cx"> // specific to the D3D9 renderer.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/renderer9_utils.h&quot;
</span><del>-#include &quot;libANGLE/renderer/d3d/d3d9/formatutils9.h&quot;
-#include &quot;libANGLE/renderer/d3d/FramebufferD3D.h&quot;
-#include &quot;libANGLE/renderer/Workarounds.h&quot;
</del><ins>+
+#include &quot;common/mathutil.h&quot;
+#include &quot;common/debug.h&quot;
+
</ins><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/d3d9/formatutils9.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/d3d/d3d9/RenderTarget9.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/d3d/FramebufferD3D.h&quot;
+#include &quot;libANGLE/renderer/d3d/WorkaroundsD3D.h&quot;
</ins><span class="cx"> 
</span><del>-#include &quot;common/mathutil.h&quot;
-#include &quot;common/debug.h&quot;
-
</del><span class="cx"> #include &quot;third_party/systeminfo/SystemInfo.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="lines">@@ -208,7 +209,8 @@
</span><span class="cx">     return d3dMagFilter;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter, float maxAnisotropy)
</del><ins>+void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter,
+                      float *d3dLodBias, float maxAnisotropy, size_t baseLevel)
</ins><span class="cx"> {
</span><span class="cx">     switch (minFilter)
</span><span class="cx">     {
</span><span class="lines">@@ -242,6 +244,20 @@
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Disabling mipmapping will always sample from level 0 of the texture. It is possible to work
+    // around this by modifying D3DSAMP_MAXMIPLEVEL to force a specific mip level to become the
+    // lowest sampled mip level and using a large negative value for D3DSAMP_MIPMAPLODBIAS to
+    // ensure that only the base mip level is sampled.
+    if (baseLevel &gt; 0 &amp;&amp; *d3dMipFilter == D3DTEXF_NONE)
+    {
+        *d3dMipFilter = D3DTEXF_POINT;
+        *d3dLodBias = -static_cast&lt;float&gt;(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS);
+    }
+    else
+    {
+        *d3dLodBias = 0.0f;
+    }
+
</ins><span class="cx">     if (maxAnisotropy &gt; 1.0f)
</span><span class="cx">     {
</span><span class="cx">         *d3dMinFilter = D3DTEXF_ANISOTROPIC;
</span><span class="lines">@@ -258,6 +274,16 @@
</span><span class="cx"> namespace d3d9_gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+unsigned int GetReservedVertexUniformVectors()
+{
+    return 3;  // dx_ViewCoords, dx_ViewAdjust and dx_DepthRange.
+}
+
+unsigned int GetReservedFragmentUniformVectors()
+{
+    return 3;  // dx_ViewCoords, dx_DepthFront and dx_DepthRange.
+}
+
</ins><span class="cx"> GLsizei GetSamplesCount(D3DMULTISAMPLE_TYPE type)
</span><span class="cx"> {
</span><span class="cx">     return (type != D3DMULTISAMPLE_NONMASKABLE) ? type : 0;
</span><span class="lines">@@ -303,7 +329,7 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         textureCaps.sampleCounts.insert(1);
</span><del>-        for (size_t i = D3DMULTISAMPLE_2_SAMPLES; i &lt;= D3DMULTISAMPLE_16_SAMPLES; i++)
</del><ins>+        for (unsigned int i = D3DMULTISAMPLE_2_SAMPLES; i &lt;= D3DMULTISAMPLE_16_SAMPLES; i++)
</ins><span class="cx">         {
</span><span class="cx">             D3DMULTISAMPLE_TYPE multisampleType = D3DMULTISAMPLE_TYPE(i);
</span><span class="cx"> 
</span><span class="lines">@@ -318,8 +344,14 @@
</span><span class="cx">     return textureCaps;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceType, UINT adapter, gl::Caps *caps,
-                  gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions)
</del><ins>+void GenerateCaps(IDirect3D9 *d3d9,
+                  IDirect3DDevice9 *device,
+                  D3DDEVTYPE deviceType,
+                  UINT adapter,
+                  gl::Caps *caps,
+                  gl::TextureCapsMap *textureCapsMap,
+                  gl::Extensions *extensions,
+                  gl::Limitations *limitations)
</ins><span class="cx"> {
</span><span class="cx">     D3DCAPS9 deviceCaps;
</span><span class="cx">     if (FAILED(d3d9-&gt;GetDeviceCaps(adapter, deviceType, &amp;deviceCaps)))
</span><span class="lines">@@ -413,9 +445,9 @@
</span><span class="cx">     // Vertex shader limits
</span><span class="cx">     caps-&gt;maxVertexAttributes = 16;
</span><span class="cx"> 
</span><del>-    const size_t reservedVertexUniformVectors = 2; // dx_ViewAdjust and dx_DepthRange.
</del><span class="cx">     const size_t MAX_VERTEX_CONSTANT_VECTORS_D3D9 = 256;
</span><del>-    caps-&gt;maxVertexUniformVectors = MAX_VERTEX_CONSTANT_VECTORS_D3D9 - reservedVertexUniformVectors;
</del><ins>+    caps-&gt;maxVertexUniformVectors =
+        MAX_VERTEX_CONSTANT_VECTORS_D3D9 - GetReservedVertexUniformVectors();
</ins><span class="cx">     caps-&gt;maxVertexUniformComponents = caps-&gt;maxVertexUniformVectors * 4;
</span><span class="cx"> 
</span><span class="cx">     caps-&gt;maxVertexUniformBlocks = 0;
</span><span class="lines">@@ -441,12 +473,12 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Fragment shader limits
</span><del>-    const size_t reservedPixelUniformVectors = 3; // dx_ViewCoords, dx_DepthFront and dx_DepthRange.
-
</del><span class="cx">     const size_t MAX_PIXEL_CONSTANT_VECTORS_SM3 = 224;
</span><span class="cx">     const size_t MAX_PIXEL_CONSTANT_VECTORS_SM2 = 32;
</span><del>-    caps-&gt;maxFragmentUniformVectors = ((deviceCaps.PixelShaderVersion &gt;= D3DPS_VERSION(3, 0)) ? MAX_PIXEL_CONSTANT_VECTORS_SM3
-                                                                                              : MAX_PIXEL_CONSTANT_VECTORS_SM2) - reservedPixelUniformVectors;
</del><ins>+    caps-&gt;maxFragmentUniformVectors =
+        ((deviceCaps.PixelShaderVersion &gt;= D3DPS_VERSION(3, 0)) ? MAX_PIXEL_CONSTANT_VECTORS_SM3
+                                                                : MAX_PIXEL_CONSTANT_VECTORS_SM2) -
+        GetReservedFragmentUniformVectors();
</ins><span class="cx">     caps-&gt;maxFragmentUniformComponents = caps-&gt;maxFragmentUniformVectors * 4;
</span><span class="cx">     caps-&gt;maxFragmentUniformBlocks = 0;
</span><span class="cx">     caps-&gt;maxFragmentInputComponents = caps-&gt;maxVertexOutputComponents;
</span><span class="lines">@@ -478,7 +510,6 @@
</span><span class="cx">     // GL extension support
</span><span class="cx">     extensions-&gt;setTextureExtensionSupport(*textureCapsMap);
</span><span class="cx">     extensions-&gt;elementIndexUint = deviceCaps.MaxVertexIndex &gt;= (1 &lt;&lt; 16);
</span><del>-    extensions-&gt;packedDepthStencil = true;
</del><span class="cx">     extensions-&gt;getProgramBinary = true;
</span><span class="cx">     extensions-&gt;rgb8rgba8 = true;
</span><span class="cx">     extensions-&gt;readFormatBGRA = true;
</span><span class="lines">@@ -489,7 +520,7 @@
</span><span class="cx">     // textureRG is emulated and not performant.
</span><span class="cx">     extensions-&gt;textureRG = false;
</span><span class="cx"> 
</span><del>-    D3DADAPTER_IDENTIFIER9 adapterId = { 0 };
</del><ins>+    D3DADAPTER_IDENTIFIER9 adapterId = {};
</ins><span class="cx">     if (SUCCEEDED(d3d9-&gt;GetAdapterIdentifier(adapter, 0, &amp;adapterId)))
</span><span class="cx">     {
</span><span class="cx">         // ATI cards on XP have problems with non-power-of-two textures.
</span><span class="lines">@@ -527,6 +558,7 @@
</span><span class="cx">     SafeRelease(eventQuery);
</span><span class="cx"> 
</span><span class="cx">     extensions-&gt;timerQuery = false; // Unimplemented
</span><ins>+    extensions-&gt;disjointTimerQuery     = false;
</ins><span class="cx">     extensions-&gt;robustness = true;
</span><span class="cx">     extensions-&gt;blendMinMax = true;
</span><span class="cx">     extensions-&gt;framebufferBlit = true;
</span><span class="lines">@@ -539,7 +571,26 @@
</span><span class="cx">     extensions-&gt;textureUsage = true;
</span><span class="cx">     extensions-&gt;translatedShaderSource = true;
</span><span class="cx">     extensions-&gt;fboRenderMipmap = false;
</span><ins>+    extensions-&gt;discardFramebuffer = false; // It would be valid to set this to true, since glDiscardFramebufferEXT is just a hint
</ins><span class="cx">     extensions-&gt;colorBufferFloat = false;
</span><ins>+    extensions-&gt;debugMarker = true;
+    extensions-&gt;eglImage               = true;
+    extensions-&gt;unpackSubimage         = true;
+    extensions-&gt;packSubimage           = true;
+    extensions-&gt;vertexArrayObject      = true;
+    extensions-&gt;noError                = true;
+
+    // D3D9 has no concept of separate masks and refs for front and back faces in the depth stencil
+    // state.
+    limitations-&gt;noSeparateStencilRefsAndMasks = true;
+
+    // D3D9 shader models have limited support for looping, so the Appendix A
+    // index/loop limitations are necessary. Workarounds that are needed to
+    // support dynamic indexing of vectors on HLSL also don't work on D3D9.
+    limitations-&gt;shadersRequireIndexedLoopValidation = true;
+
+    // D3D9 cannot support constant color and alpha blend funcs together
+    limitations-&gt;noSimultaneousConstantColorAndAlphaBlendFunc = true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span><span class="lines">@@ -574,9 +625,9 @@
</span><span class="cx">     *levelOffset = upsampleCount;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Workarounds GenerateWorkarounds()
</del><ins>+WorkaroundsD3D GenerateWorkarounds()
</ins><span class="cx"> {
</span><del>-    Workarounds workarounds;
</del><ins>+    WorkaroundsD3D workarounds;
</ins><span class="cx">     workarounds.mrtPerfWorkaround = true;
</span><span class="cx">     workarounds.setDataFasterThanImageUpload = false;
</span><span class="cx">     workarounds.useInstancedPointSpriteEmulation = false;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9renderer9_utilsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -22,7 +22,7 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class RenderTarget9;
</span><del>-struct Workarounds;
</del><ins>+struct WorkaroundsD3D;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl_d3d9
</span><span class="cx"> {
</span><span class="lines">@@ -37,7 +37,8 @@
</span><span class="cx"> D3DCUBEMAP_FACES ConvertCubeFace(GLenum cubeFace);
</span><span class="cx"> DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha);
</span><span class="cx"> D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter, float maxAnisotropy);
</span><del>-void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter, float maxAnisotropy);
</del><ins>+void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter,
+                      float *d3dLodBias, float maxAnisotropy, size_t baseLevel);
</ins><span class="cx"> 
</span><span class="cx"> D3DMULTISAMPLE_TYPE GetMultisampleType(GLuint samples);
</span><span class="cx"> 
</span><span class="lines">@@ -46,13 +47,22 @@
</span><span class="cx"> namespace d3d9_gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+unsigned int GetReservedVertexUniformVectors();
+
+unsigned int GetReservedFragmentUniformVectors();
+
</ins><span class="cx"> GLsizei GetSamplesCount(D3DMULTISAMPLE_TYPE type);
</span><span class="cx"> 
</span><span class="cx"> bool IsFormatChannelEquivalent(D3DFORMAT d3dformat, GLenum format);
</span><span class="cx"> 
</span><del>-void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceType, UINT adapter, gl::Caps *caps,
-                  gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions);
-
</del><ins>+void GenerateCaps(IDirect3D9 *d3d9,
+                  IDirect3DDevice9 *device,
+                  D3DDEVTYPE deviceType,
+                  UINT adapter,
+                  gl::Caps *caps,
+                  gl::TextureCapsMap *textureCapsMap,
+                  gl::Extensions *extensions,
+                  gl::Limitations *limitations);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace d3d9
</span><span class="lines">@@ -76,8 +86,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Workarounds GenerateWorkarounds();
-
</del><ins>+WorkaroundsD3D GenerateWorkarounds();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shaderscompiledcomponentmaskpsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/componentmaskps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,84 +1,84 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-// Parameters:
-//
-//   float4 add;
-//   float4 mult;
-//   sampler2D tex;
-//
-//
-// Registers:
-//
-//   Name         Reg   Size
-//   ------------ ----- ----
-//   mult         c0       1
-//   add          c1       1
-//   tex          s0       1
-//
-
-    ps_2_0
-    dcl t0.xy
-    dcl_2d s0
-    texld r0, t0, s0
-    mov r1, c0
-    mad r0, r0, r1, c1
-    mov oC0, r0
-
-// approximately 4 instruction slots used (1 texture, 3 arithmetic)
-#endif
-
-const BYTE g_ps20_componentmaskps[] =
-{
-      0,   2, 255, 255, 254, 255, 
-     50,   0,  67,  84,  65,  66, 
-     28,   0,   0,   0, 143,   0, 
-      0,   0,   0,   2, 255, 255, 
-      3,   0,   0,   0,  28,   0, 
-      0,   0,   0,   1,   0,   0, 
-    136,   0,   0,   0,  88,   0, 
-      0,   0,   2,   0,   1,   0, 
-      1,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-    108,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-     92,   0,   0,   0,   0,   0, 
-      0,   0, 113,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0, 120,   0,   0,   0, 
-      0,   0,   0,   0,  97, 100, 
-    100,   0,   1,   0,   3,   0, 
-      1,   0,   4,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-    109, 117, 108, 116,   0, 116, 
-    101, 120,   0, 171, 171, 171, 
-      4,   0,  12,   0,   1,   0, 
-      1,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0, 112, 115, 
-     95,  50,  95,  48,   0,  77, 
-    105,  99, 114, 111, 115, 111, 
-    102, 116,  32,  40,  82,  41, 
-     32,  72,  76,  83,  76,  32, 
-     83, 104,  97, 100, 101, 114, 
-     32,  67, 111, 109, 112, 105, 
-    108, 101, 114,  32,  54,  46, 
-     51,  46,  57,  54,  48,  48, 
-     46,  49,  54,  51,  56,  52, 
-      0, 171, 171, 171,  31,   0, 
-      0,   2,   0,   0,   0, 128, 
-      0,   0,   3, 176,  31,   0, 
-      0,   2,   0,   0,   0, 144, 
-      0,   8,  15, 160,  66,   0, 
-      0,   3,   0,   0,  15, 128, 
-      0,   0, 228, 176,   0,   8, 
-    228, 160,   1,   0,   0,   2, 
-      1,   0,  15, 128,   0,   0, 
-    228, 160,   4,   0,   0,   4, 
-      0,   0,  15, 128,   0,   0, 
-    228, 128,   1,   0, 228, 128, 
-      1,   0, 228, 160,   1,   0, 
-      0,   2,   0,   8,  15, 128, 
-      0,   0, 228, 128, 255, 255, 
-      0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 add;
+//   float4 mult;
+//   sampler2D tex;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   mult         c0       1
+//   add          c1       1
+//   tex          s0       1
+//
+
+    ps_2_0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mov r1, c0
+    mad r0, r0, r1, c1
+    mov oC0, r0
+
+// approximately 4 instruction slots used (1 texture, 3 arithmetic)
+#endif
+
+const BYTE g_ps20_componentmaskps[] =
+{
+      0,   2, 255, 255, 254, 255, 
+     50,   0,  67,  84,  65,  66, 
+     28,   0,   0,   0, 143,   0, 
+      0,   0,   0,   2, 255, 255, 
+      3,   0,   0,   0,  28,   0, 
+      0,   0,   0,   1,   0,   0, 
+    136,   0,   0,   0,  88,   0, 
+      0,   0,   2,   0,   1,   0, 
+      1,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+    108,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+     92,   0,   0,   0,   0,   0, 
+      0,   0, 113,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0, 120,   0,   0,   0, 
+      0,   0,   0,   0,  97, 100, 
+    100,   0,   1,   0,   3,   0, 
+      1,   0,   4,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+    109, 117, 108, 116,   0, 116, 
+    101, 120,   0, 171, 171, 171, 
+      4,   0,  12,   0,   1,   0, 
+      1,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0, 112, 115, 
+     95,  50,  95,  48,   0,  77, 
+    105,  99, 114, 111, 115, 111, 
+    102, 116,  32,  40,  82,  41, 
+     32,  72,  76,  83,  76,  32, 
+     83, 104,  97, 100, 101, 114, 
+     32,  67, 111, 109, 112, 105, 
+    108, 101, 114,  32,  54,  46, 
+     51,  46,  57,  54,  48,  48, 
+     46,  49,  54,  51,  56,  52, 
+      0, 171, 171, 171,  31,   0, 
+      0,   2,   0,   0,   0, 128, 
+      0,   0,   3, 176,  31,   0, 
+      0,   2,   0,   0,   0, 144, 
+      0,   8,  15, 160,  66,   0, 
+      0,   3,   0,   0,  15, 128, 
+      0,   0, 228, 176,   0,   8, 
+    228, 160,   1,   0,   0,   2, 
+      1,   0,  15, 128,   0,   0, 
+    228, 160,   4,   0,   0,   4, 
+      0,   0,  15, 128,   0,   0, 
+    228, 128,   1,   0, 228, 128, 
+      1,   0, 228, 160,   1,   0, 
+      0,   2,   0,   8,  15, 128, 
+      0,   0, 228, 128, 255, 255, 
+      0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shaderscompiledflipyvsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/flipyvs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/flipyvs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/flipyvs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,66 +1,66 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-// Parameters:
-//
-//   float4 halfPixelSize;
-//
-//
-// Registers:
-//
-//   Name          Reg   Size
-//   ------------- ----- ----
-//   halfPixelSize c0       1
-//
-
-    vs_2_0
-    def c1, 0.5, 1, 0, 0
-    dcl_position v0
-    add oPos, v0, c0
-    mad oT0, v0, c1.xxyy, c1.xxzz
-
-// approximately 2 instruction slots used
-#endif
-
-const BYTE g_vs20_flipyvs[] =
-{
-      0,   2, 254, 255, 254, 255, 
-     36,   0,  67,  84,  65,  66, 
-     28,   0,   0,   0,  87,   0, 
-      0,   0,   0,   2, 254, 255, 
-      1,   0,   0,   0,  28,   0, 
-      0,   0,   0,   1,   0,   0, 
-     80,   0,   0,   0,  48,   0, 
-      0,   0,   2,   0,   0,   0, 
-      1,   0,   0,   0,  64,   0, 
-      0,   0,   0,   0,   0,   0, 
-    104,  97, 108, 102,  80, 105, 
-    120, 101, 108,  83, 105, 122, 
-    101,   0, 171, 171,   1,   0, 
-      3,   0,   1,   0,   4,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0, 118, 115,  95,  50, 
-     95,  48,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-    171, 171,  81,   0,   0,   5, 
-      1,   0,  15, 160,   0,   0, 
-      0,  63,   0,   0, 128,  63, 
-      0,   0,   0,   0,   0,   0, 
-      0,   0,  31,   0,   0,   2, 
-      0,   0,   0, 128,   0,   0, 
-     15, 144,   2,   0,   0,   3, 
-      0,   0,  15, 192,   0,   0, 
-    228, 144,   0,   0, 228, 160, 
-      4,   0,   0,   4,   0,   0, 
-     15, 224,   0,   0, 228, 144, 
-      1,   0,  80, 160,   1,   0, 
-    160, 160, 255, 255,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 halfPixelSize;
+//
+//
+// Registers:
+//
+//   Name          Reg   Size
+//   ------------- ----- ----
+//   halfPixelSize c0       1
+//
+
+    vs_2_0
+    def c1, 0.5, 1, 0, 0
+    dcl_position v0
+    add oPos, v0, c0
+    mad oT0, v0, c1.xxyy, c1.xxzz
+
+// approximately 2 instruction slots used
+#endif
+
+const BYTE g_vs20_flipyvs[] =
+{
+      0,   2, 254, 255, 254, 255, 
+     36,   0,  67,  84,  65,  66, 
+     28,   0,   0,   0,  87,   0, 
+      0,   0,   0,   2, 254, 255, 
+      1,   0,   0,   0,  28,   0, 
+      0,   0,   0,   1,   0,   0, 
+     80,   0,   0,   0,  48,   0, 
+      0,   0,   2,   0,   0,   0, 
+      1,   0,   0,   0,  64,   0, 
+      0,   0,   0,   0,   0,   0, 
+    104,  97, 108, 102,  80, 105, 
+    120, 101, 108,  83, 105, 122, 
+    101,   0, 171, 171,   1,   0, 
+      3,   0,   1,   0,   4,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0, 118, 115,  95,  50, 
+     95,  48,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+    171, 171,  81,   0,   0,   5, 
+      1,   0,  15, 160,   0,   0, 
+      0,  63,   0,   0, 128,  63, 
+      0,   0,   0,   0,   0,   0, 
+      0,   0,  31,   0,   0,   2, 
+      0,   0,   0, 128,   0,   0, 
+     15, 144,   2,   0,   0,   3, 
+      0,   0,  15, 192,   0,   0, 
+    228, 144,   0,   0, 228, 160, 
+      4,   0,   0,   4,   0,   0, 
+     15, 224,   0,   0, 228, 144, 
+      1,   0,  80, 160,   1,   0, 
+    160, 160, 255, 255,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shaderscompiledluminancepsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,94 +1,94 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-// Parameters:
-//
-//   float4 add;
-//   float4 mult;
-//   sampler2D tex;
-//
-//
-// Registers:
-//
-//   Name         Reg   Size
-//   ------------ ----- ----
-//   mult         c0       1
-//   add          c1       1
-//   tex          s0       1
-//
-
-    ps_2_0
-    dcl t0.xy
-    dcl_2d s0
-    texld r0, t0, s0
-    mov r1.xw, c0
-    mad r0.x, r0.x, r1.x, c1.x
-    mad r0.y, r0.w, r1.w, c1.w
-    mov r1.xyz, r0.x
-    mov r1.w, r0.y
-    mov oC0, r1
-
-// approximately 7 instruction slots used (1 texture, 6 arithmetic)
-#endif
-
-const BYTE g_ps20_luminanceps[] =
-{
-      0,   2, 255, 255, 254, 255, 
-     50,   0,  67,  84,  65,  66, 
-     28,   0,   0,   0, 143,   0, 
-      0,   0,   0,   2, 255, 255, 
-      3,   0,   0,   0,  28,   0, 
-      0,   0,   0,   1,   0,   0, 
-    136,   0,   0,   0,  88,   0, 
-      0,   0,   2,   0,   1,   0, 
-      1,   0,   0,   0,  92,   0, 
-      0,   0,   0,   0,   0,   0, 
-    108,   0,   0,   0,   2,   0, 
-      0,   0,   1,   0,   0,   0, 
-     92,   0,   0,   0,   0,   0, 
-      0,   0, 113,   0,   0,   0, 
-      3,   0,   0,   0,   1,   0, 
-      0,   0, 120,   0,   0,   0, 
-      0,   0,   0,   0,  97, 100, 
-    100,   0,   1,   0,   3,   0, 
-      1,   0,   4,   0,   1,   0, 
-      0,   0,   0,   0,   0,   0, 
-    109, 117, 108, 116,   0, 116, 
-    101, 120,   0, 171, 171, 171, 
-      4,   0,  12,   0,   1,   0, 
-      1,   0,   1,   0,   0,   0, 
-      0,   0,   0,   0, 112, 115, 
-     95,  50,  95,  48,   0,  77, 
-    105,  99, 114, 111, 115, 111, 
-    102, 116,  32,  40,  82,  41, 
-     32,  72,  76,  83,  76,  32, 
-     83, 104,  97, 100, 101, 114, 
-     32,  67, 111, 109, 112, 105, 
-    108, 101, 114,  32,  54,  46, 
-     51,  46,  57,  54,  48,  48, 
-     46,  49,  54,  51,  56,  52, 
-      0, 171, 171, 171,  31,   0, 
-      0,   2,   0,   0,   0, 128, 
-      0,   0,   3, 176,  31,   0, 
-      0,   2,   0,   0,   0, 144, 
-      0,   8,  15, 160,  66,   0, 
-      0,   3,   0,   0,  15, 128, 
-      0,   0, 228, 176,   0,   8, 
-    228, 160,   1,   0,   0,   2, 
-      1,   0,   9, 128,   0,   0, 
-    228, 160,   4,   0,   0,   4, 
-      0,   0,   1, 128,   0,   0, 
-      0, 128,   1,   0,   0, 128, 
-      1,   0,   0, 160,   4,   0, 
-      0,   4,   0,   0,   2, 128, 
-      0,   0, 255, 128,   1,   0, 
-    255, 128,   1,   0, 255, 160, 
-      1,   0,   0,   2,   1,   0, 
-      7, 128,   0,   0,   0, 128, 
-      1,   0,   0,   2,   1,   0, 
-      8, 128,   0,   0,  85, 128, 
-      1,   0,   0,   2,   0,   8, 
-     15, 128,   1,   0, 228, 128, 
-    255, 255,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 add;
+//   float4 mult;
+//   sampler2D tex;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   mult         c0       1
+//   add          c1       1
+//   tex          s0       1
+//
+
+    ps_2_0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mov r1.xw, c0
+    mad r0.x, r0.x, r1.x, c1.x
+    mad r0.y, r0.w, r1.w, c1.w
+    mov r1.xyz, r0.x
+    mov r1.w, r0.y
+    mov oC0, r1
+
+// approximately 7 instruction slots used (1 texture, 6 arithmetic)
+#endif
+
+const BYTE g_ps20_luminanceps[] =
+{
+      0,   2, 255, 255, 254, 255, 
+     50,   0,  67,  84,  65,  66, 
+     28,   0,   0,   0, 143,   0, 
+      0,   0,   0,   2, 255, 255, 
+      3,   0,   0,   0,  28,   0, 
+      0,   0,   0,   1,   0,   0, 
+    136,   0,   0,   0,  88,   0, 
+      0,   0,   2,   0,   1,   0, 
+      1,   0,   0,   0,  92,   0, 
+      0,   0,   0,   0,   0,   0, 
+    108,   0,   0,   0,   2,   0, 
+      0,   0,   1,   0,   0,   0, 
+     92,   0,   0,   0,   0,   0, 
+      0,   0, 113,   0,   0,   0, 
+      3,   0,   0,   0,   1,   0, 
+      0,   0, 120,   0,   0,   0, 
+      0,   0,   0,   0,  97, 100, 
+    100,   0,   1,   0,   3,   0, 
+      1,   0,   4,   0,   1,   0, 
+      0,   0,   0,   0,   0,   0, 
+    109, 117, 108, 116,   0, 116, 
+    101, 120,   0, 171, 171, 171, 
+      4,   0,  12,   0,   1,   0, 
+      1,   0,   1,   0,   0,   0, 
+      0,   0,   0,   0, 112, 115, 
+     95,  50,  95,  48,   0,  77, 
+    105,  99, 114, 111, 115, 111, 
+    102, 116,  32,  40,  82,  41, 
+     32,  72,  76,  83,  76,  32, 
+     83, 104,  97, 100, 101, 114, 
+     32,  67, 111, 109, 112, 105, 
+    108, 101, 114,  32,  54,  46, 
+     51,  46,  57,  54,  48,  48, 
+     46,  49,  54,  51,  56,  52, 
+      0, 171, 171, 171,  31,   0, 
+      0,   2,   0,   0,   0, 128, 
+      0,   0,   3, 176,  31,   0, 
+      0,   2,   0,   0,   0, 144, 
+      0,   8,  15, 160,  66,   0, 
+      0,   3,   0,   0,  15, 128, 
+      0,   0, 228, 176,   0,   8, 
+    228, 160,   1,   0,   0,   2, 
+      1,   0,   9, 128,   0,   0, 
+    228, 160,   4,   0,   0,   4, 
+      0,   0,   1, 128,   0,   0, 
+      0, 128,   1,   0,   0, 128, 
+      1,   0,   0, 160,   4,   0, 
+      0,   4,   0,   0,   2, 128, 
+      0,   0, 255, 128,   1,   0, 
+    255, 128,   1,   0, 255, 160, 
+      1,   0,   0,   2,   1,   0, 
+      7, 128,   0,   0,   0, 128, 
+      1,   0,   0,   2,   1,   0, 
+      8, 128,   0,   0,  85, 128, 
+      1,   0,   0,   2,   0,   8, 
+     15, 128,   1,   0, 228, 128, 
+    255, 255,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shaderscompiledpassthroughpsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,61 +1,61 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-// Parameters:
-//
-//   sampler2D tex;
-//
-//
-// Registers:
-//
-//   Name         Reg   Size
-//   ------------ ----- ----
-//   tex          s0       1
-//
-
-    ps_2_0
-    dcl t0.xy
-    dcl_2d s0
-    texld r0, t0, s0
-    mov oC0, r0
-
-// approximately 2 instruction slots used (1 texture, 1 arithmetic)
-#endif
-
-const BYTE g_ps20_passthroughps[] =
-{
-      0,   2, 255, 255, 254, 255, 
-     33,   0,  67,  84,  65,  66, 
-     28,   0,   0,   0,  75,   0, 
-      0,   0,   0,   2, 255, 255, 
-      1,   0,   0,   0,  28,   0, 
-      0,   0,   0,   1,   0,   0, 
-     68,   0,   0,   0,  48,   0, 
-      0,   0,   3,   0,   0,   0, 
-      1,   0,   0,   0,  52,   0, 
-      0,   0,   0,   0,   0,   0, 
-    116, 101, 120,   0,   4,   0, 
-     12,   0,   1,   0,   1,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0, 112, 115,  95,  50, 
-     95,  48,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-    171, 171,  31,   0,   0,   2, 
-      0,   0,   0, 128,   0,   0, 
-      3, 176,  31,   0,   0,   2, 
-      0,   0,   0, 144,   0,   8, 
-     15, 160,  66,   0,   0,   3, 
-      0,   0,  15, 128,   0,   0, 
-    228, 176,   0,   8, 228, 160, 
-      1,   0,   0,   2,   0,   8, 
-     15, 128,   0,   0, 228, 128, 
-    255, 255,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   sampler2D tex;
+//
+//
+// Registers:
+//
+//   Name         Reg   Size
+//   ------------ ----- ----
+//   tex          s0       1
+//
+
+    ps_2_0
+    dcl t0.xy
+    dcl_2d s0
+    texld r0, t0, s0
+    mov oC0, r0
+
+// approximately 2 instruction slots used (1 texture, 1 arithmetic)
+#endif
+
+const BYTE g_ps20_passthroughps[] =
+{
+      0,   2, 255, 255, 254, 255, 
+     33,   0,  67,  84,  65,  66, 
+     28,   0,   0,   0,  75,   0, 
+      0,   0,   0,   2, 255, 255, 
+      1,   0,   0,   0,  28,   0, 
+      0,   0,   0,   1,   0,   0, 
+     68,   0,   0,   0,  48,   0, 
+      0,   0,   3,   0,   0,   0, 
+      1,   0,   0,   0,  52,   0, 
+      0,   0,   0,   0,   0,   0, 
+    116, 101, 120,   0,   4,   0, 
+     12,   0,   1,   0,   1,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0, 112, 115,  95,  50, 
+     95,  48,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+    171, 171,  31,   0,   0,   2, 
+      0,   0,   0, 128,   0,   0, 
+      3, 176,  31,   0,   0,   2, 
+      0,   0,   0, 144,   0,   8, 
+     15, 160,  66,   0,   0,   3, 
+      0,   0,  15, 128,   0,   0, 
+    228, 176,   0,   8, 228, 160, 
+      1,   0,   0,   2,   0,   8, 
+     15, 128,   0,   0, 228, 128, 
+    255, 255,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shaderscompiledstandardvsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,66 +1,66 @@
</span><del>-#if 0
-//
-// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
-//
-// Parameters:
-//
-//   float4 halfPixelSize;
-//
-//
-// Registers:
-//
-//   Name          Reg   Size
-//   ------------- ----- ----
-//   halfPixelSize c0       1
-//
-
-    vs_2_0
-    def c1, 0.5, -0.5, 1, 0
-    dcl_position v0
-    add oPos, v0, c0
-    mad oT0, v0, c1.xyzz, c1.xxww
-
-// approximately 2 instruction slots used
-#endif
-
-const BYTE g_vs20_standardvs[] =
-{
-      0,   2, 254, 255, 254, 255, 
-     36,   0,  67,  84,  65,  66, 
-     28,   0,   0,   0,  87,   0, 
-      0,   0,   0,   2, 254, 255, 
-      1,   0,   0,   0,  28,   0, 
-      0,   0,   0,   1,   0,   0, 
-     80,   0,   0,   0,  48,   0, 
-      0,   0,   2,   0,   0,   0, 
-      1,   0,   0,   0,  64,   0, 
-      0,   0,   0,   0,   0,   0, 
-    104,  97, 108, 102,  80, 105, 
-    120, 101, 108,  83, 105, 122, 
-    101,   0, 171, 171,   1,   0, 
-      3,   0,   1,   0,   4,   0, 
-      1,   0,   0,   0,   0,   0, 
-      0,   0, 118, 115,  95,  50, 
-     95,  48,   0,  77, 105,  99, 
-    114, 111, 115, 111, 102, 116, 
-     32,  40,  82,  41,  32,  72, 
-     76,  83,  76,  32,  83, 104, 
-     97, 100, 101, 114,  32,  67, 
-    111, 109, 112, 105, 108, 101, 
-    114,  32,  54,  46,  51,  46, 
-     57,  54,  48,  48,  46,  49, 
-     54,  51,  56,  52,   0, 171, 
-    171, 171,  81,   0,   0,   5, 
-      1,   0,  15, 160,   0,   0, 
-      0,  63,   0,   0,   0, 191, 
-      0,   0, 128,  63,   0,   0, 
-      0,   0,  31,   0,   0,   2, 
-      0,   0,   0, 128,   0,   0, 
-     15, 144,   2,   0,   0,   3, 
-      0,   0,  15, 192,   0,   0, 
-    228, 144,   0,   0, 228, 160, 
-      4,   0,   0,   4,   0,   0, 
-     15, 224,   0,   0, 228, 144, 
-      1,   0, 164, 160,   1,   0, 
-    240, 160, 255, 255,   0,   0
-};
</del><ins>+#if 0
+//
+// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384
+//
+// Parameters:
+//
+//   float4 halfPixelSize;
+//
+//
+// Registers:
+//
+//   Name          Reg   Size
+//   ------------- ----- ----
+//   halfPixelSize c0       1
+//
+
+    vs_2_0
+    def c1, 0.5, -0.5, 1, 0
+    dcl_position v0
+    add oPos, v0, c0
+    mad oT0, v0, c1.xyzz, c1.xxww
+
+// approximately 2 instruction slots used
+#endif
+
+const BYTE g_vs20_standardvs[] =
+{
+      0,   2, 254, 255, 254, 255, 
+     36,   0,  67,  84,  65,  66, 
+     28,   0,   0,   0,  87,   0, 
+      0,   0,   0,   2, 254, 255, 
+      1,   0,   0,   0,  28,   0, 
+      0,   0,   0,   1,   0,   0, 
+     80,   0,   0,   0,  48,   0, 
+      0,   0,   2,   0,   0,   0, 
+      1,   0,   0,   0,  64,   0, 
+      0,   0,   0,   0,   0,   0, 
+    104,  97, 108, 102,  80, 105, 
+    120, 101, 108,  83, 105, 122, 
+    101,   0, 171, 171,   1,   0, 
+      3,   0,   1,   0,   4,   0, 
+      1,   0,   0,   0,   0,   0, 
+      0,   0, 118, 115,  95,  50, 
+     95,  48,   0,  77, 105,  99, 
+    114, 111, 115, 111, 102, 116, 
+     32,  40,  82,  41,  32,  72, 
+     76,  83,  76,  32,  83, 104, 
+     97, 100, 101, 114,  32,  67, 
+    111, 109, 112, 105, 108, 101, 
+    114,  32,  54,  46,  51,  46, 
+     57,  54,  48,  48,  46,  49, 
+     54,  51,  56,  52,   0, 171, 
+    171, 171,  81,   0,   0,   5, 
+      1,   0,  15, 160,   0,   0, 
+      0,  63,   0,   0,   0, 191, 
+      0,   0, 128,  63,   0,   0, 
+      0,   0,  31,   0,   0,   2, 
+      0,   0,   0, 128,   0,   0, 
+     15, 144,   2,   0,   0,   3, 
+      0,   0,  15, 192,   0,   0, 
+    228, 144,   0,   0, 228, 160, 
+      4,   0,   0,   4,   0,   0, 
+     15, 224,   0,   0, 228, 144, 
+      1,   0, 164, 160,   1,   0, 
+    240, 160, 255, 255,   0,   0
+};
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9shadersgenerate_shadersbat"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/generate_shaders.bat (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/generate_shaders.bat        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/shaders/generate_shaders.bat        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,63 +1,63 @@
</span><del>-@ECHO OFF
-REM
-REM Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
-REM Use of this source code is governed by a BSD-style license that can be
-REM found in the LICENSE file.
-REM
-
-PATH %PATH%;%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86;%DXSDK_DIR%\Utilities\bin\x86
-
-setlocal
-set errorCount=0
-set successCount=0
-set debug=0
-
-if &quot;%1&quot; == &quot;debug&quot; (
-    set debug=1
-)
-if &quot;%1&quot; == &quot;release&quot; (
-    set debug=0
-)
-
-::              | Input file          | Entry point           | Type | Output file                        | Debug |
-call:BuildShader Blit.vs               standardvs              vs_2_0 compiled\standardvs.h                %debug%
-call:BuildShader Blit.vs               flipyvs                 vs_2_0 compiled\flipyvs.h                   %debug%
-call:BuildShader Blit.ps               passthroughps           ps_2_0 compiled\passthroughps.h             %debug%
-call:BuildShader Blit.ps               luminanceps             ps_2_0 compiled\luminanceps.h               %debug%
-call:BuildShader Blit.ps               componentmaskps         ps_2_0 compiled\componentmaskps.h           %debug%
-
-echo.
-
-if %successCount% GTR 0 (
-   echo %successCount% shaders compiled successfully.
-)
-if %errorCount% GTR 0 (
-   echo There were %errorCount% shader compilation errors.
-)
-
-endlocal
-exit /b
-
-:BuildShader
-set input=%~1
-set entry=%~2
-set type=%~3
-set output=%~4
-set debug=%~5
-
-if %debug% == 0 (
-    set &quot;buildCMD=fxc /nologo /E %entry% /T %type% /Fh %output% %input%&quot;
-) else (
-    set &quot;buildCMD=fxc /nologo /Zi /Od /E %entry% /T %type% /Fh %output% %input%&quot;
-)
-
-set error=0
-%buildCMD% || set error=1
-
-if %error% == 0 (
-    set /a successCount=%successCount%+1
-) else (
-    set /a errorCount=%errorCount%+1
-)
-
-exit /b
</del><ins>+@ECHO OFF
+REM
+REM Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
+REM Use of this source code is governed by a BSD-style license that can be
+REM found in the LICENSE file.
+REM
+
+PATH %PATH%;%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86;%DXSDK_DIR%\Utilities\bin\x86
+
+setlocal
+set errorCount=0
+set successCount=0
+set debug=0
+
+if &quot;%1&quot; == &quot;debug&quot; (
+    set debug=1
+)
+if &quot;%1&quot; == &quot;release&quot; (
+    set debug=0
+)
+
+::              | Input file          | Entry point           | Type | Output file                        | Debug |
+call:BuildShader Blit.vs               standardvs              vs_2_0 compiled\standardvs.h                %debug%
+call:BuildShader Blit.vs               flipyvs                 vs_2_0 compiled\flipyvs.h                   %debug%
+call:BuildShader Blit.ps               passthroughps           ps_2_0 compiled\passthroughps.h             %debug%
+call:BuildShader Blit.ps               luminanceps             ps_2_0 compiled\luminanceps.h               %debug%
+call:BuildShader Blit.ps               componentmaskps         ps_2_0 compiled\componentmaskps.h           %debug%
+
+echo.
+
+if %successCount% GTR 0 (
+   echo %successCount% shaders compiled successfully.
+)
+if %errorCount% GTR 0 (
+   echo There were %errorCount% shader compilation errors.
+)
+
+endlocal
+exit /b
+
+:BuildShader
+set input=%~1
+set entry=%~2
+set type=%~3
+set output=%~4
+set debug=%~5
+
+if %debug% == 0 (
+    set &quot;buildCMD=fxc /nologo /E %entry% /T %type% /Fh %output% %input%&quot;
+) else (
+    set &quot;buildCMD=fxc /nologo /Zi /Od /E %entry% /T %type% /Fh %output% %input%&quot;
+)
+
+set error=0
+%buildCMD% || set error=1
+
+if %error% == 0 (
+    set /a successCount=%successCount%+1
+) else (
+    set /a errorCount=%errorCount%+1
+)
+
+exit /b
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dd3d9vertexconversionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/vertexconversion.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -149,7 +149,10 @@
</span><span class="cx"> // static const std::size_t finalSize: number of bytes per output vertex
</span><span class="cx"> // static void convertArray(const void *in, std::size_t stride, std::size_t n, void *out): convert an array of vertices. Input may be strided, but output will be unstrided.
</span><span class="cx"> 
</span><del>-template &lt;class InT, class WidenRule, class Converter, class DefaultValueRule = SimpleDefaultValues&lt;InT&gt; &gt;
</del><ins>+template &lt;class InT,
+          class WidenRule,
+          class Converter,
+          class DefaultValueRule = SimpleDefaultValues&lt;InT&gt;&gt;
</ins><span class="cx"> struct VertexDataConverter
</span><span class="cx"> {
</span><span class="cx">     typedef typename Converter::OutputType OutputType;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dformatutilsD3Dcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/formatutilsD3D.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/formatutilsD3D.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/formatutilsD3D.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -106,8 +106,8 @@
</span><span class="cx">     InsertFormatWriteFunctionMapping(&amp;map, GL_ALPHA,              GL_HALF_FLOAT_OES,                 WriteColor&lt;A16F, GLfloat&gt;         );
</span><span class="cx"> 
</span><span class="cx">     InsertFormatWriteFunctionMapping(&amp;map, GL_BGRA_EXT,           GL_UNSIGNED_BYTE,                  WriteColor&lt;B8G8R8A8, GLfloat&gt;     );
</span><del>-    InsertFormatWriteFunctionMapping(&amp;map, GL_BGRA_EXT,           GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, WriteColor&lt;B4G4R4A4, GLfloat&gt;     );
-    InsertFormatWriteFunctionMapping(&amp;map, GL_BGRA_EXT,           GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, WriteColor&lt;B5G5R5A1, GLfloat&gt;     );
</del><ins>+    InsertFormatWriteFunctionMapping(&amp;map, GL_BGRA_EXT,           GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, WriteColor&lt;A4R4G4B4, GLfloat&gt;     );
+    InsertFormatWriteFunctionMapping(&amp;map, GL_BGRA_EXT,           GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, WriteColor&lt;A1R5G5B5, GLfloat&gt;     );
</ins><span class="cx"> 
</span><span class="cx">     InsertFormatWriteFunctionMapping(&amp;map, GL_SRGB_EXT,           GL_UNSIGNED_BYTE,                  WriteColor&lt;R8G8B8, GLfloat&gt;       );
</span><span class="cx">     InsertFormatWriteFunctionMapping(&amp;map, GL_SRGB_ALPHA_EXT,     GL_UNSIGNED_BYTE,                  WriteColor&lt;R8G8B8A8, GLfloat&gt;     );
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dimageformatsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/imageformats.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/imageformats.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/imageformats.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -285,6 +285,8 @@
</span><span class="cx"> 
</span><span class="cx"> struct R5G6B5
</span><span class="cx"> {
</span><ins>+    // OpenGL ES 2.0.25 spec Section 3.6.2: &quot;Components are packed with the first component in the most significant
+    // bits of the bitfield, and successive component occupying progressively less significant locations&quot;
</ins><span class="cx">     unsigned short RGB;
</span><span class="cx"> 
</span><span class="cx">     static void readColor(gl::ColorF *dst, const R5G6B5 *src)
</span><span class="lines">@@ -491,160 +493,126 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-struct B5G5R5A1
</del><ins>+struct A1R5G5B5
</ins><span class="cx"> {
</span><del>-    unsigned short BGRA;
</del><ins>+    unsigned short ARGB;
</ins><span class="cx"> 
</span><del>-    static void readColor(gl::ColorF *dst, const B5G5R5A1 *src)
</del><ins>+    static void readColor(gl::ColorF *dst, const A1R5G5B5 *src)
</ins><span class="cx">     {
</span><del>-        dst-&gt;alpha = gl::normalizedToFloat&lt;1&gt;(gl::getShiftedData&lt;1, 15&gt;(src-&gt;BGRA));
-        dst-&gt;red   = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5, 10&gt;(src-&gt;BGRA));
-        dst-&gt;green = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5,  5&gt;(src-&gt;BGRA));
-        dst-&gt;blue  = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5,  0&gt;(src-&gt;BGRA));
</del><ins>+        dst-&gt;alpha = gl::normalizedToFloat&lt;1&gt;(gl::getShiftedData&lt;1, 15&gt;(src-&gt;ARGB));
+        dst-&gt;red   = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5, 10&gt;(src-&gt;ARGB));
+        dst-&gt;green = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5,  5&gt;(src-&gt;ARGB));
+        dst-&gt;blue  = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5,  0&gt;(src-&gt;ARGB));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static void writeColor(B5G5R5A1 *dst, const gl::ColorF *src)
</del><ins>+    static void writeColor(A1R5G5B5 *dst, const gl::ColorF *src)
</ins><span class="cx">     {
</span><del>-        dst-&gt;BGRA = gl::shiftData&lt;1, 15&gt;(gl::floatToNormalized&lt;1, unsigned short&gt;(src-&gt;alpha)) |
</del><ins>+        dst-&gt;ARGB = gl::shiftData&lt;1, 15&gt;(gl::floatToNormalized&lt;1, unsigned short&gt;(src-&gt;alpha)) |
</ins><span class="cx">                     gl::shiftData&lt;5, 10&gt;(gl::floatToNormalized&lt;5, unsigned short&gt;(src-&gt;red))   |
</span><span class="cx">                     gl::shiftData&lt;5,  5&gt;(gl::floatToNormalized&lt;5, unsigned short&gt;(src-&gt;green)) |
</span><span class="cx">                     gl::shiftData&lt;5,  0&gt;(gl::floatToNormalized&lt;5, unsigned short&gt;(src-&gt;blue));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static void average(B5G5R5A1 *dst, const B5G5R5A1 *src1, const B5G5R5A1 *src2)
</del><ins>+    static void average(A1R5G5B5 *dst, const A1R5G5B5 *src1, const A1R5G5B5 *src2)
</ins><span class="cx">     {
</span><del>-        dst-&gt;BGRA = gl::shiftData&lt;1, 15&gt;(gl::average(gl::getShiftedData&lt;1, 15&gt;(src1-&gt;BGRA), gl::getShiftedData&lt;1, 15&gt;(src2-&gt;BGRA))) |
-                    gl::shiftData&lt;5, 10&gt;(gl::average(gl::getShiftedData&lt;5, 10&gt;(src1-&gt;BGRA), gl::getShiftedData&lt;5, 10&gt;(src2-&gt;BGRA))) |
-                    gl::shiftData&lt;5,  5&gt;(gl::average(gl::getShiftedData&lt;5,  5&gt;(src1-&gt;BGRA), gl::getShiftedData&lt;5,  5&gt;(src2-&gt;BGRA))) |
-                    gl::shiftData&lt;5,  0&gt;(gl::average(gl::getShiftedData&lt;5,  0&gt;(src1-&gt;BGRA), gl::getShiftedData&lt;5,  0&gt;(src2-&gt;BGRA)));
</del><ins>+        dst-&gt;ARGB = gl::shiftData&lt;1, 15&gt;(gl::average(gl::getShiftedData&lt;1, 15&gt;(src1-&gt;ARGB), gl::getShiftedData&lt;1, 15&gt;(src2-&gt;ARGB))) |
+                    gl::shiftData&lt;5, 10&gt;(gl::average(gl::getShiftedData&lt;5, 10&gt;(src1-&gt;ARGB), gl::getShiftedData&lt;5, 10&gt;(src2-&gt;ARGB))) |
+                    gl::shiftData&lt;5,  5&gt;(gl::average(gl::getShiftedData&lt;5,  5&gt;(src1-&gt;ARGB), gl::getShiftedData&lt;5,  5&gt;(src2-&gt;ARGB))) |
+                    gl::shiftData&lt;5,  0&gt;(gl::average(gl::getShiftedData&lt;5,  0&gt;(src1-&gt;ARGB), gl::getShiftedData&lt;5,  0&gt;(src2-&gt;ARGB)));
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct R5G5B5A1
</span><span class="cx"> {
</span><ins>+    // OpenGL ES 2.0.25 spec Section 3.6.2: &quot;Components are packed with the first component in the most significant
+    // bits of the bitfield, and successive component occupying progressively less significant locations&quot;
</ins><span class="cx">     unsigned short RGBA;
</span><span class="cx"> 
</span><span class="cx">     static void readColor(gl::ColorF *dst, const R5G5B5A1 *src)
</span><span class="cx">     {
</span><del>-        dst-&gt;alpha = gl::normalizedToFloat&lt;1&gt;(gl::getShiftedData&lt;1, 15&gt;(src-&gt;RGBA));
-        dst-&gt;blue  = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5, 10&gt;(src-&gt;RGBA));
-        dst-&gt;green = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5,  5&gt;(src-&gt;RGBA));
-        dst-&gt;red   = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5,  0&gt;(src-&gt;RGBA));
</del><ins>+        dst-&gt;red   = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5, 11&gt;(src-&gt;RGBA));
+        dst-&gt;green = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5,  6&gt;(src-&gt;RGBA));
+        dst-&gt;blue  = gl::normalizedToFloat&lt;5&gt;(gl::getShiftedData&lt;5,  1&gt;(src-&gt;RGBA));
+        dst-&gt;alpha = gl::normalizedToFloat&lt;1&gt;(gl::getShiftedData&lt;1,  0&gt;(src-&gt;RGBA));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static void writeColor(R5G5B5A1 *dst, const gl::ColorF *src)
</span><span class="cx">     {
</span><del>-        dst-&gt;RGBA = gl::shiftData&lt;1, 15&gt;(gl::floatToNormalized&lt;1, unsigned short&gt;(src-&gt;alpha)) |
-                    gl::shiftData&lt;5, 10&gt;(gl::floatToNormalized&lt;5, unsigned short&gt;(src-&gt;blue))  |
-                    gl::shiftData&lt;5,  5&gt;(gl::floatToNormalized&lt;5, unsigned short&gt;(src-&gt;green)) |
-                    gl::shiftData&lt;5,  0&gt;(gl::floatToNormalized&lt;5, unsigned short&gt;(src-&gt;red));
</del><ins>+        dst-&gt;RGBA = gl::shiftData&lt;5, 11&gt;(gl::floatToNormalized&lt;5, unsigned short&gt;(src-&gt;red))   |
+                    gl::shiftData&lt;5,  6&gt;(gl::floatToNormalized&lt;5, unsigned short&gt;(src-&gt;green)) |
+                    gl::shiftData&lt;5,  1&gt;(gl::floatToNormalized&lt;5, unsigned short&gt;(src-&gt;blue))  |
+                    gl::shiftData&lt;1,  0&gt;(gl::floatToNormalized&lt;1, unsigned short&gt;(src-&gt;alpha));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static void average(R5G5B5A1 *dst, const R5G5B5A1 *src1, const R5G5B5A1 *src2)
</span><span class="cx">     {
</span><del>-        dst-&gt;RGBA = gl::shiftData&lt;1, 15&gt;(gl::average(gl::getShiftedData&lt;1, 15&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;1, 15&gt;(src2-&gt;RGBA))) |
-                    gl::shiftData&lt;5, 10&gt;(gl::average(gl::getShiftedData&lt;5, 10&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;5, 10&gt;(src2-&gt;RGBA))) |
-                    gl::shiftData&lt;5,  5&gt;(gl::average(gl::getShiftedData&lt;5,  5&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;5,  5&gt;(src2-&gt;RGBA))) |
-                    gl::shiftData&lt;5,  0&gt;(gl::average(gl::getShiftedData&lt;5,  0&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;5,  0&gt;(src2-&gt;RGBA)));
</del><ins>+        dst-&gt;RGBA = gl::shiftData&lt;5, 11&gt;(gl::average(gl::getShiftedData&lt;5, 11&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;5, 11&gt;(src2-&gt;RGBA))) |
+                    gl::shiftData&lt;5,  6&gt;(gl::average(gl::getShiftedData&lt;5,  6&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;5,  6&gt;(src2-&gt;RGBA))) |
+                    gl::shiftData&lt;5,  1&gt;(gl::average(gl::getShiftedData&lt;5,  1&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;5,  1&gt;(src2-&gt;RGBA))) |
+                    gl::shiftData&lt;1,  0&gt;(gl::average(gl::getShiftedData&lt;1,  0&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;1,  0&gt;(src2-&gt;RGBA)));
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct R4G4B4A4
</span><span class="cx"> {
</span><del>-    unsigned char R : 4;
-    unsigned char G : 4;
-    unsigned char B : 4;
-    unsigned char A : 4;
</del><ins>+    // OpenGL ES 2.0.25 spec Section 3.6.2: &quot;Components are packed with the first component in the most significant
+    // bits of the bitfield, and successive component occupying progressively less significant locations&quot;
+    unsigned short RGBA;
</ins><span class="cx"> 
</span><span class="cx">     static void readColor(gl::ColorF *dst, const R4G4B4A4 *src)
</span><span class="cx">     {
</span><del>-        dst-&gt;red   = gl::normalizedToFloat&lt;4&gt;(src-&gt;R);
-        dst-&gt;green = gl::normalizedToFloat&lt;4&gt;(src-&gt;G);
-        dst-&gt;blue  = gl::normalizedToFloat&lt;4&gt;(src-&gt;B);
-        dst-&gt;alpha = gl::normalizedToFloat&lt;4&gt;(src-&gt;A);
</del><ins>+        dst-&gt;red   = gl::normalizedToFloat&lt;4&gt;(gl::getShiftedData&lt;4, 12&gt;(src-&gt;RGBA));
+        dst-&gt;green = gl::normalizedToFloat&lt;4&gt;(gl::getShiftedData&lt;4,  8&gt;(src-&gt;RGBA));
+        dst-&gt;blue  = gl::normalizedToFloat&lt;4&gt;(gl::getShiftedData&lt;4,  4&gt;(src-&gt;RGBA));
+        dst-&gt;alpha = gl::normalizedToFloat&lt;4&gt;(gl::getShiftedData&lt;4,  0&gt;(src-&gt;RGBA));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static void writeColor(R4G4B4A4 *dst, const gl::ColorF *src)
</span><span class="cx">     {
</span><del>-        dst-&gt;R = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;red);
-        dst-&gt;G = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;green);
-        dst-&gt;B = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;blue);
-        dst-&gt;A = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;alpha);
</del><ins>+        dst-&gt;RGBA = gl::shiftData&lt;4, 12&gt;(gl::floatToNormalized&lt;4, unsigned short&gt;(src-&gt;red))  |
+                    gl::shiftData&lt;4,  8&gt;(gl::floatToNormalized&lt;4, unsigned short&gt;(src-&gt;green)) |
+                    gl::shiftData&lt;4,  4&gt;(gl::floatToNormalized&lt;4, unsigned short&gt;(src-&gt;blue))   |
+                    gl::shiftData&lt;4,  0&gt;(gl::floatToNormalized&lt;4, unsigned short&gt;(src-&gt;alpha));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static void average(R4G4B4A4 *dst, const R4G4B4A4 *src1, const R4G4B4A4 *src2)
</span><span class="cx">     {
</span><del>-        dst-&gt;R = gl::average(src1-&gt;R, src2-&gt;R);
-        dst-&gt;G = gl::average(src1-&gt;G, src2-&gt;G);
-        dst-&gt;B = gl::average(src1-&gt;B, src2-&gt;B);
-        dst-&gt;A = gl::average(src1-&gt;A, src2-&gt;A);
</del><ins>+        dst-&gt;RGBA = gl::shiftData&lt;4, 12&gt;(gl::average(gl::getShiftedData&lt;4, 12&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;4, 12&gt;(src2-&gt;RGBA))) |
+                    gl::shiftData&lt;4,  8&gt;(gl::average(gl::getShiftedData&lt;4,  8&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;4,  8&gt;(src2-&gt;RGBA))) |
+                    gl::shiftData&lt;4,  4&gt;(gl::average(gl::getShiftedData&lt;4,  4&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;4,  4&gt;(src2-&gt;RGBA))) |
+                    gl::shiftData&lt;4,  0&gt;(gl::average(gl::getShiftedData&lt;4,  0&gt;(src1-&gt;RGBA), gl::getShiftedData&lt;4,  0&gt;(src2-&gt;RGBA)));
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct A4R4G4B4
</span><span class="cx"> {
</span><del>-    unsigned char A : 4;
-    unsigned char R : 4;
-    unsigned char G : 4;
-    unsigned char B : 4;
</del><ins>+    unsigned short ARGB;
</ins><span class="cx"> 
</span><span class="cx">     static void readColor(gl::ColorF *dst, const A4R4G4B4 *src)
</span><span class="cx">     {
</span><del>-        dst-&gt;red   = gl::normalizedToFloat&lt;4&gt;(src-&gt;R);
-        dst-&gt;green = gl::normalizedToFloat&lt;4&gt;(src-&gt;G);
-        dst-&gt;blue  = gl::normalizedToFloat&lt;4&gt;(src-&gt;B);
-        dst-&gt;alpha = gl::normalizedToFloat&lt;4&gt;(src-&gt;A);
</del><ins>+        dst-&gt;alpha = gl::normalizedToFloat&lt;4&gt;(gl::getShiftedData&lt;4, 12&gt;(src-&gt;ARGB));
+        dst-&gt;red   = gl::normalizedToFloat&lt;4&gt;(gl::getShiftedData&lt;4,  8&gt;(src-&gt;ARGB));
+        dst-&gt;green = gl::normalizedToFloat&lt;4&gt;(gl::getShiftedData&lt;4,  4&gt;(src-&gt;ARGB));
+        dst-&gt;blue  = gl::normalizedToFloat&lt;4&gt;(gl::getShiftedData&lt;4,  0&gt;(src-&gt;ARGB));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static void writeColor(A4R4G4B4 *dst, const gl::ColorF *src)
</span><span class="cx">     {
</span><del>-        dst-&gt;R = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;red);
-        dst-&gt;G = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;green);
-        dst-&gt;B = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;blue);
-        dst-&gt;A = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;alpha);
</del><ins>+        dst-&gt;ARGB = gl::shiftData&lt;4, 12&gt;(gl::floatToNormalized&lt;4, unsigned short&gt;(src-&gt;alpha))  |
+                    gl::shiftData&lt;4,  8&gt;(gl::floatToNormalized&lt;4, unsigned short&gt;(src-&gt;red)) |
+                    gl::shiftData&lt;4,  4&gt;(gl::floatToNormalized&lt;4, unsigned short&gt;(src-&gt;green))   |
+                    gl::shiftData&lt;4,  0&gt;(gl::floatToNormalized&lt;4, unsigned short&gt;(src-&gt;blue));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static void average(A4R4G4B4 *dst, const A4R4G4B4 *src1, const A4R4G4B4 *src2)
</span><span class="cx">     {
</span><del>-        dst-&gt;R = gl::average(src1-&gt;R, src2-&gt;R);
-        dst-&gt;G = gl::average(src1-&gt;G, src2-&gt;G);
-        dst-&gt;B = gl::average(src1-&gt;B, src2-&gt;B);
-        dst-&gt;A = gl::average(src1-&gt;A, src2-&gt;A);
</del><ins>+        dst-&gt;ARGB = gl::shiftData&lt;4, 12&gt;(gl::average(gl::getShiftedData&lt;4, 12&gt;(src1-&gt;ARGB), gl::getShiftedData&lt;4, 12&gt;(src2-&gt;ARGB))) |
+                    gl::shiftData&lt;4,  8&gt;(gl::average(gl::getShiftedData&lt;4,  8&gt;(src1-&gt;ARGB), gl::getShiftedData&lt;4,  8&gt;(src2-&gt;ARGB))) |
+                    gl::shiftData&lt;4,  4&gt;(gl::average(gl::getShiftedData&lt;4,  4&gt;(src1-&gt;ARGB), gl::getShiftedData&lt;4,  4&gt;(src2-&gt;ARGB))) |
+                    gl::shiftData&lt;4,  0&gt;(gl::average(gl::getShiftedData&lt;4,  0&gt;(src1-&gt;ARGB), gl::getShiftedData&lt;4,  0&gt;(src2-&gt;ARGB)));
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-struct B4G4R4A4
-{
-    unsigned char B : 4;
-    unsigned char G : 4;
-    unsigned char R : 4;
-    unsigned char A : 4;
-
-    static void readColor(gl::ColorF *dst, const B4G4R4A4 *src)
-    {
-        dst-&gt;red   = gl::normalizedToFloat&lt;4&gt;(src-&gt;R);
-        dst-&gt;green = gl::normalizedToFloat&lt;4&gt;(src-&gt;G);
-        dst-&gt;blue  = gl::normalizedToFloat&lt;4&gt;(src-&gt;B);
-        dst-&gt;alpha = gl::normalizedToFloat&lt;4&gt;(src-&gt;A);
-    }
-
-    static void writeColor(B4G4R4A4 *dst, const gl::ColorF *src)
-    {
-        dst-&gt;R = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;red);
-        dst-&gt;G = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;green);
-        dst-&gt;B = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;blue);
-        dst-&gt;A = gl::floatToNormalized&lt;4, unsigned char&gt;(src-&gt;alpha);
-    }
-
-    static void average(B4G4R4A4 *dst, const B4G4R4A4 *src1, const B4G4R4A4 *src2)
-    {
-        dst-&gt;R = gl::average(src1-&gt;R, src2-&gt;R);
-        dst-&gt;G = gl::average(src1-&gt;G, src2-&gt;G);
-        dst-&gt;B = gl::average(src1-&gt;B, src2-&gt;B);
-        dst-&gt;A = gl::average(src1-&gt;A, src2-&gt;A);
-    }
-};
-
</del><span class="cx"> struct R16
</span><span class="cx"> {
</span><span class="cx">     unsigned short R;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dloadimagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -348,6 +348,24 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void LoadRGBA4ToARGB4(size_t width, size_t height, size_t depth,
+                      const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
+                      uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
+{
+    for (size_t z = 0; z &lt; depth; z++)
+    {
+        for (size_t y = 0; y &lt; height; y++)
+        {
+            const uint16_t *source = OffsetDataPointer&lt;uint16_t&gt;(input, y, z, inputRowPitch, inputDepthPitch);
+            uint16_t *dest = OffsetDataPointer&lt;uint16_t&gt;(output, y, z, outputRowPitch, outputDepthPitch);
+            for (size_t x = 0; x &lt; width; x++)
+            {
+                dest[x] = ANGLE_ROTR16(source[x], 4);
+            }
+        }
+    }
+}
+
</ins><span class="cx"> void LoadRGBA4ToBGRA8(size_t width, size_t height, size_t depth,
</span><span class="cx">                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
</span><span class="cx">                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
</span><span class="lines">@@ -414,6 +432,24 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void LoadRGB5A1ToA1RGB5(size_t width, size_t height, size_t depth,
+                        const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
+                        uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
+{
+    for (size_t z = 0; z &lt; depth; z++)
+    {
+        for (size_t y = 0; y &lt; height; y++)
+        {
+            const uint16_t *source = OffsetDataPointer&lt;uint16_t&gt;(input, y, z, inputRowPitch, inputDepthPitch);
+            uint16_t *dest = OffsetDataPointer&lt;uint16_t&gt;(output, y, z, outputRowPitch, outputDepthPitch);
+            for (size_t x = 0; x &lt; width; x++)
+            {
+                dest[x] = ANGLE_ROTR16(source[x], 1);
+            }
+        }
+    }
+}
+
</ins><span class="cx"> void LoadRGB5A1ToBGRA8(size_t width, size_t height, size_t depth,
</span><span class="cx">                        const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
</span><span class="cx">                        uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
</span><span class="lines">@@ -458,7 +494,6 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> void LoadBGR5A1ToBGRA8(size_t width, size_t height, size_t depth,
</span><span class="cx">                        const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
</span><span class="cx">                        uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dloadimageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -96,6 +96,10 @@
</span><span class="cx">                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
</span><span class="cx">                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
</span><span class="cx"> 
</span><ins>+void LoadRGBA4ToARGB4(size_t width, size_t height, size_t depth,
+                      const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
+                      uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
+
</ins><span class="cx"> void LoadRGBA4ToBGRA8(size_t width, size_t height, size_t depth,
</span><span class="cx">                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
</span><span class="cx">                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
</span><span class="lines">@@ -108,6 +112,10 @@
</span><span class="cx">                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
</span><span class="cx">                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
</span><span class="cx"> 
</span><ins>+void LoadRGB5A1ToA1RGB5(size_t width, size_t height, size_t depth,
+                        const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
+                        uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
+
</ins><span class="cx"> void LoadRGB5A1ToBGRA8(size_t width, size_t height, size_t depth,
</span><span class="cx">                        const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
</span><span class="cx">                        uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dloadimage_etccpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage_etc.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage_etc.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage_etc.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,1504 @@
</span><ins>+//
+// Copyright (c) 2013-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// loadimage_etc.cpp: Decodes ETC and EAC encoded textures.
+
+#include &quot;libANGLE/renderer/d3d/loadimage_etc.h&quot;
+
+#include &quot;libANGLE/renderer/d3d/loadimage.h&quot;
+#include &quot;libANGLE/renderer/d3d/imageformats.h&quot;
+
+namespace rx
+{
+namespace
+{
+// Table 3.17.2 sorted according to table 3.17.3
+// clang-format off
+static const int intensityModifierDefault[][4] =
+{
+    {  2,   8,  -2,   -8 },
+    {  5,  17,  -5,  -17 },
+    {  9,  29,  -9,  -29 },
+    { 13,  42, -13,  -42 },
+    { 18,  60, -18,  -60 },
+    { 24,  80, -24,  -80 },
+    { 33, 106, -33, -106 },
+    { 47, 183, -47, -183 },
+};
+// clang-format on
+
+// Table C.12, intensity modifier for non opaque punchthrough alpha
+// clang-format off
+static const int intensityModifierNonOpaque[][4] =
+{
+    { 0,   8, 0,   -8 },
+    { 0,  17, 0,  -17 },
+    { 0,  29, 0,  -29 },
+    { 0,  42, 0,  -42 },
+    { 0,  60, 0,  -60 },
+    { 0,  80, 0,  -80 },
+    { 0, 106, 0, -106 },
+    { 0, 183, 0, -183 },
+};
+// clang-format on
+
+struct ETC2Block
+{
+    // Decodes unsigned single or dual channel block to bytes
+    void decodeAsSingleChannel(uint8_t *dest,
+                               size_t x,
+                               size_t y,
+                               size_t w,
+                               size_t h,
+                               size_t destPixelStride,
+                               size_t destRowPitch,
+                               bool isSigned) const
+    {
+        for (size_t j = 0; j &lt; 4 &amp;&amp; (y + j) &lt; h; j++)
+        {
+            uint8_t *row = dest + (j * destRowPitch);
+            for (size_t i = 0; i &lt; 4 &amp;&amp; (x + i) &lt; w; i++)
+            {
+                uint8_t *pixel = row + (i * destPixelStride);
+                if (isSigned)
+                {
+                    *pixel = clampSByte(getSingleChannel(i, j, isSigned));
+                }
+                else
+                {
+                    *pixel = clampByte(getSingleChannel(i, j, isSigned));
+                }
+            }
+        }
+    }
+
+    // Decodes RGB block to rgba8
+    void decodeAsRGB(uint8_t *dest,
+                     size_t x,
+                     size_t y,
+                     size_t w,
+                     size_t h,
+                     size_t destRowPitch,
+                     const uint8_t alphaValues[4][4],
+                     bool punchThroughAlpha) const
+    {
+        bool opaqueBit                  = u.idht.mode.idm.diffbit;
+        bool nonOpaquePunchThroughAlpha = punchThroughAlpha &amp;&amp; !opaqueBit;
+        // Select mode
+        if (u.idht.mode.idm.diffbit || punchThroughAlpha)
+        {
+            const auto &amp;block = u.idht.mode.idm.colors.diff;
+            int r             = (block.R + block.dR);
+            int g             = (block.G + block.dG);
+            int b = (block.B + block.dB);
+            if (r &lt; 0 || r &gt; 31)
+            {
+                decodeTBlock(dest, x, y, w, h, destRowPitch, alphaValues,
+                             nonOpaquePunchThroughAlpha);
+            }
+            else if (g &lt; 0 || g &gt; 31)
+            {
+                decodeHBlock(dest, x, y, w, h, destRowPitch, alphaValues,
+                             nonOpaquePunchThroughAlpha);
+            }
+            else if (b &lt; 0 || b &gt; 31)
+            {
+                decodePlanarBlock(dest, x, y, w, h, destRowPitch, alphaValues);
+            }
+            else
+            {
+                decodeDifferentialBlock(dest, x, y, w, h, destRowPitch, alphaValues,
+                                        nonOpaquePunchThroughAlpha);
+            }
+        }
+        else
+        {
+            decodeIndividualBlock(dest, x, y, w, h, destRowPitch, alphaValues,
+                                  nonOpaquePunchThroughAlpha);
+        }
+    }
+
+    // Transcodes RGB block to BC1
+    void transcodeAsBC1(uint8_t *dest,
+                        size_t x,
+                        size_t y,
+                        size_t w,
+                        size_t h,
+                        const uint8_t alphaValues[4][4],
+                        bool punchThroughAlpha) const
+    {
+        bool opaqueBit                  = u.idht.mode.idm.diffbit;
+        bool nonOpaquePunchThroughAlpha = punchThroughAlpha &amp;&amp; !opaqueBit;
+        // Select mode
+        if (u.idht.mode.idm.diffbit || punchThroughAlpha)
+        {
+            const auto &amp;block = u.idht.mode.idm.colors.diff;
+            int r             = (block.R + block.dR);
+            int g             = (block.G + block.dG);
+            int b = (block.B + block.dB);
+            if (r &lt; 0 || r &gt; 31)
+            {
+                transcodeTBlockToBC1(dest, x, y, w, h, alphaValues, nonOpaquePunchThroughAlpha);
+            }
+            else if (g &lt; 0 || g &gt; 31)
+            {
+                transcodeHBlockToBC1(dest, x, y, w, h, alphaValues, nonOpaquePunchThroughAlpha);
+            }
+            else if (b &lt; 0 || b &gt; 31)
+            {
+                transcodePlanarBlockToBC1(dest, x, y, w, h, alphaValues);
+            }
+            else
+            {
+                transcodeDifferentialBlockToBC1(dest, x, y, w, h, alphaValues,
+                                                nonOpaquePunchThroughAlpha);
+            }
+        }
+        else
+        {
+            transcodeIndividualBlockToBC1(dest, x, y, w, h, alphaValues,
+                                          nonOpaquePunchThroughAlpha);
+        }
+    }
+
+  private:
+    union
+    {
+        // Individual, differential, H and T modes
+        struct
+        {
+            union
+            {
+                // Individual and differential modes
+                struct
+                {
+                    union
+                    {
+                        struct  // Individual colors
+                        {
+                            unsigned char R2 : 4;
+                            unsigned char R1 : 4;
+                            unsigned char G2 : 4;
+                            unsigned char G1 : 4;
+                            unsigned char B2 : 4;
+                            unsigned char B1 : 4;
+                        } indiv;
+                        struct  // Differential colors
+                        {
+                            signed char dR : 3;
+                            unsigned char R : 5;
+                            signed char dG : 3;
+                            unsigned char G : 5;
+                            signed char dB : 3;
+                            unsigned char B : 5;
+                        } diff;
+                    } colors;
+                    bool flipbit : 1;
+                    bool diffbit : 1;
+                    unsigned char cw2 : 3;
+                    unsigned char cw1 : 3;
+                } idm;
+                // T mode
+                struct
+                {
+                    // Byte 1
+                    unsigned char TR1b : 2;
+                    unsigned char TdummyB : 1;
+                    unsigned char TR1a : 2;
+                    unsigned char TdummyA : 3;
+                    // Byte 2
+                    unsigned char TB1 : 4;
+                    unsigned char TG1 : 4;
+                    // Byte 3
+                    unsigned char TG2 : 4;
+                    unsigned char TR2 : 4;
+                    // Byte 4
+                    unsigned char Tdb : 1;
+                    bool Tflipbit : 1;
+                    unsigned char Tda : 2;
+                    unsigned char TB2 : 4;
+                } tm;
+                // H mode
+                struct
+                {
+                    // Byte 1
+                    unsigned char HG1a : 3;
+                    unsigned char HR1 : 4;
+                    unsigned char HdummyA : 1;
+                    // Byte 2
+                    unsigned char HB1b : 2;
+                    unsigned char HdummyC : 1;
+                    unsigned char HB1a : 1;
+                    unsigned char HG1b : 1;
+                    unsigned char HdummyB : 3;
+                    // Byte 3
+                    unsigned char HG2a : 3;
+                    unsigned char HR2 : 4;
+                    unsigned char HB1c : 1;
+                    // Byte 4
+                    unsigned char Hdb : 1;
+                    bool Hflipbit : 1;
+                    unsigned char Hda : 1;
+                    unsigned char HB2 : 4;
+                    unsigned char HG2b : 1;
+                } hm;
+            } mode;
+            unsigned char pixelIndexMSB[2];
+            unsigned char pixelIndexLSB[2];
+        } idht;
+        // planar mode
+        struct
+        {
+            // Byte 1
+            unsigned char GO1 : 1;
+            unsigned char RO : 6;
+            unsigned char PdummyA : 1;
+            // Byte 2
+            unsigned char BO1 : 1;
+            unsigned char GO2 : 6;
+            unsigned char PdummyB : 1;
+            // Byte 3
+            unsigned char BO3a : 2;
+            unsigned char PdummyD : 1;
+            unsigned char BO2 : 2;
+            unsigned char PdummyC : 3;
+            // Byte 4
+            unsigned char RH2 : 1;
+            bool Pflipbit : 1;
+            unsigned char RH1 : 5;
+            unsigned char BO3b : 1;
+            // Byte 5
+            unsigned char BHa : 1;
+            unsigned char GH : 7;
+            // Byte 6
+            unsigned char RVa : 3;
+            unsigned char BHb : 5;
+            // Byte 7
+            unsigned char GVa : 5;
+            unsigned char RVb : 3;
+            // Byte 8
+            unsigned char BV : 6;
+            unsigned char GVb : 2;
+        } pblk;
+        // Single channel block
+        struct
+        {
+            union
+            {
+                unsigned char us;
+                signed char s;
+            } base_codeword;
+            unsigned char table_index : 4;
+            unsigned char multiplier : 4;
+            unsigned char mc1 : 2;
+            unsigned char mb : 3;
+            unsigned char ma : 3;
+            unsigned char mf1 : 1;
+            unsigned char me : 3;
+            unsigned char md : 3;
+            unsigned char mc2 : 1;
+            unsigned char mh : 3;
+            unsigned char mg : 3;
+            unsigned char mf2 : 2;
+            unsigned char mk1 : 2;
+            unsigned char mj : 3;
+            unsigned char mi : 3;
+            unsigned char mn1 : 1;
+            unsigned char mm : 3;
+            unsigned char ml : 3;
+            unsigned char mk2 : 1;
+            unsigned char mp : 3;
+            unsigned char mo : 3;
+            unsigned char mn2 : 2;
+        } scblk;
+    } u;
+
+    static unsigned char clampByte(int value)
+    {
+        return static_cast&lt;unsigned char&gt;(gl::clamp(value, 0, 255));
+    }
+
+    static signed char clampSByte(int value)
+    {
+        return static_cast&lt;signed char&gt;(gl::clamp(value, -128, 127));
+    }
+
+    static R8G8B8A8 createRGBA(int red, int green, int blue, int alpha)
+    {
+        R8G8B8A8 rgba;
+        rgba.R = clampByte(red);
+        rgba.G = clampByte(green);
+        rgba.B = clampByte(blue);
+        rgba.A = clampByte(alpha);
+        return rgba;
+    }
+
+    static R8G8B8A8 createRGBA(int red, int green, int blue)
+    {
+        return createRGBA(red, green, blue, 255);
+    }
+
+    static int extend_4to8bits(int x) { return (x &lt;&lt; 4) | x; }
+    static int extend_5to8bits(int x) { return (x &lt;&lt; 3) | (x &gt;&gt; 2); }
+    static int extend_6to8bits(int x) { return (x &lt;&lt; 2) | (x &gt;&gt; 4); }
+    static int extend_7to8bits(int x) { return (x &lt;&lt; 1) | (x &gt;&gt; 6); }
+
+    void decodeIndividualBlock(uint8_t *dest,
+                               size_t x,
+                               size_t y,
+                               size_t w,
+                               size_t h,
+                               size_t destRowPitch,
+                               const uint8_t alphaValues[4][4],
+                               bool nonOpaquePunchThroughAlpha) const
+    {
+        const auto &amp;block = u.idht.mode.idm.colors.indiv;
+        int r1            = extend_4to8bits(block.R1);
+        int g1            = extend_4to8bits(block.G1);
+        int b1            = extend_4to8bits(block.B1);
+        int r2            = extend_4to8bits(block.R2);
+        int g2            = extend_4to8bits(block.G2);
+        int b2 = extend_4to8bits(block.B2);
+        decodeIndividualOrDifferentialBlock(dest, x, y, w, h, destRowPitch, r1, g1, b1, r2, g2, b2,
+                                            alphaValues, nonOpaquePunchThroughAlpha);
+    }
+
+    void decodeDifferentialBlock(uint8_t *dest,
+                                 size_t x,
+                                 size_t y,
+                                 size_t w,
+                                 size_t h,
+                                 size_t destRowPitch,
+                                 const uint8_t alphaValues[4][4],
+                                 bool nonOpaquePunchThroughAlpha) const
+    {
+        const auto &amp;block = u.idht.mode.idm.colors.diff;
+        int b1            = extend_5to8bits(block.B);
+        int g1            = extend_5to8bits(block.G);
+        int r1            = extend_5to8bits(block.R);
+        int r2            = extend_5to8bits(block.R + block.dR);
+        int g2            = extend_5to8bits(block.G + block.dG);
+        int b2 = extend_5to8bits(block.B + block.dB);
+        decodeIndividualOrDifferentialBlock(dest, x, y, w, h, destRowPitch, r1, g1, b1, r2, g2, b2,
+                                            alphaValues, nonOpaquePunchThroughAlpha);
+    }
+
+    void decodeIndividualOrDifferentialBlock(uint8_t *dest,
+                                             size_t x,
+                                             size_t y,
+                                             size_t w,
+                                             size_t h,
+                                             size_t destRowPitch,
+                                             int r1,
+                                             int g1,
+                                             int b1,
+                                             int r2,
+                                             int g2,
+                                             int b2,
+                                             const uint8_t alphaValues[4][4],
+                                             bool nonOpaquePunchThroughAlpha) const
+    {
+        const auto intensityModifier =
+            nonOpaquePunchThroughAlpha ? intensityModifierNonOpaque : intensityModifierDefault;
+
+        R8G8B8A8 subblockColors0[4];
+        R8G8B8A8 subblockColors1[4];
+        for (size_t modifierIdx = 0; modifierIdx &lt; 4; modifierIdx++)
+        {
+            const int i1                 = intensityModifier[u.idht.mode.idm.cw1][modifierIdx];
+            subblockColors0[modifierIdx] = createRGBA(r1 + i1, g1 + i1, b1 + i1);
+
+            const int i2                 = intensityModifier[u.idht.mode.idm.cw2][modifierIdx];
+            subblockColors1[modifierIdx] = createRGBA(r2 + i2, g2 + i2, b2 + i2);
+        }
+
+        if (u.idht.mode.idm.flipbit)
+        {
+            uint8_t *curPixel = dest;
+            for (size_t j = 0; j &lt; 2 &amp;&amp; (y + j) &lt; h; j++)
+            {
+                R8G8B8A8 *row = reinterpret_cast&lt;R8G8B8A8 *&gt;(curPixel);
+                for (size_t i = 0; i &lt; 4 &amp;&amp; (x + i) &lt; w; i++)
+                {
+                    row[i]   = subblockColors0[getIndex(i, j)];
+                    row[i].A = alphaValues[j][i];
+                }
+                curPixel += destRowPitch;
+            }
+            for (size_t j = 2; j &lt; 4 &amp;&amp; (y + j) &lt; h; j++)
+            {
+                R8G8B8A8 *row = reinterpret_cast&lt;R8G8B8A8 *&gt;(curPixel);
+                for (size_t i = 0; i &lt; 4 &amp;&amp; (x + i) &lt; w; i++)
+                {
+                    row[i]   = subblockColors1[getIndex(i, j)];
+                    row[i].A = alphaValues[j][i];
+                }
+                curPixel += destRowPitch;
+            }
+        }
+        else
+        {
+            uint8_t *curPixel = dest;
+            for (size_t j = 0; j &lt; 4 &amp;&amp; (y + j) &lt; h; j++)
+            {
+                R8G8B8A8 *row = reinterpret_cast&lt;R8G8B8A8 *&gt;(curPixel);
+                for (size_t i = 0; i &lt; 2 &amp;&amp; (x + i) &lt; w; i++)
+                {
+                    row[i]   = subblockColors0[getIndex(i, j)];
+                    row[i].A = alphaValues[j][i];
+                }
+                for (size_t i = 2; i &lt; 4 &amp;&amp; (x + i) &lt; w; i++)
+                {
+                    row[i]   = subblockColors1[getIndex(i, j)];
+                    row[i].A = alphaValues[j][i];
+                }
+                curPixel += destRowPitch;
+            }
+        }
+        if (nonOpaquePunchThroughAlpha)
+        {
+            decodePunchThroughAlphaBlock(dest, x, y, w, h, destRowPitch);
+        }
+    }
+
+    void decodeTBlock(uint8_t *dest,
+                      size_t x,
+                      size_t y,
+                      size_t w,
+                      size_t h,
+                      size_t destRowPitch,
+                      const uint8_t alphaValues[4][4],
+                      bool nonOpaquePunchThroughAlpha) const
+    {
+        // Table C.8, distance index for T and H modes
+        const auto &amp;block = u.idht.mode.tm;
+
+        int r1 = extend_4to8bits(block.TR1a &lt;&lt; 2 | block.TR1b);
+        int g1 = extend_4to8bits(block.TG1);
+        int b1 = extend_4to8bits(block.TB1);
+        int r2 = extend_4to8bits(block.TR2);
+        int g2 = extend_4to8bits(block.TG2);
+        int b2 = extend_4to8bits(block.TB2);
+
+        static int distance[8] = {3, 6, 11, 16, 23, 32, 41, 64};
+        const int d            = distance[block.Tda &lt;&lt; 1 | block.Tdb];
+
+        const R8G8B8A8 paintColors[4] = {
+            createRGBA(r1, g1, b1), createRGBA(r2 + d, g2 + d, b2 + d), createRGBA(r2, g2, b2),
+            createRGBA(r2 - d, g2 - d, b2 - d),
+        };
+
+        uint8_t *curPixel = dest;
+        for (size_t j = 0; j &lt; 4 &amp;&amp; (y + j) &lt; h; j++)
+        {
+            R8G8B8A8 *row = reinterpret_cast&lt;R8G8B8A8 *&gt;(curPixel);
+            for (size_t i = 0; i &lt; 4 &amp;&amp; (x + i) &lt; w; i++)
+            {
+                row[i]   = paintColors[getIndex(i, j)];
+                row[i].A = alphaValues[j][i];
+            }
+            curPixel += destRowPitch;
+        }
+
+        if (nonOpaquePunchThroughAlpha)
+        {
+            decodePunchThroughAlphaBlock(dest, x, y, w, h, destRowPitch);
+        }
+    }
+
+    void decodeHBlock(uint8_t *dest,
+                      size_t x,
+                      size_t y,
+                      size_t w,
+                      size_t h,
+                      size_t destRowPitch,
+                      const uint8_t alphaValues[4][4],
+                      bool nonOpaquePunchThroughAlpha) const
+    {
+        // Table C.8, distance index for T and H modes
+        const auto &amp;block = u.idht.mode.hm;
+
+        int r1 = extend_4to8bits(block.HR1);
+        int g1 = extend_4to8bits(block.HG1a &lt;&lt; 1 | block.HG1b);
+        int b1 = extend_4to8bits(block.HB1a &lt;&lt; 3 | block.HB1b &lt;&lt; 1 | block.HB1c);
+        int r2 = extend_4to8bits(block.HR2);
+        int g2 = extend_4to8bits(block.HG2a &lt;&lt; 1 | block.HG2b);
+        int b2 = extend_4to8bits(block.HB2);
+
+        static const int distance[8] = {3, 6, 11, 16, 23, 32, 41, 64};
+        const int d = distance[(block.Hda &lt;&lt; 2) | (block.Hdb &lt;&lt; 1) |
+                               ((r1 &lt;&lt; 16 | g1 &lt;&lt; 8 | b1) &gt;= (r2 &lt;&lt; 16 | g2 &lt;&lt; 8 | b2) ? 1 : 0)];
+
+        const R8G8B8A8 paintColors[4] = {
+            createRGBA(r1 + d, g1 + d, b1 + d), createRGBA(r1 - d, g1 - d, b1 - d),
+            createRGBA(r2 + d, g2 + d, b2 + d), createRGBA(r2 - d, g2 - d, b2 - d),
+        };
+
+        uint8_t *curPixel = dest;
+        for (size_t j = 0; j &lt; 4 &amp;&amp; (y + j) &lt; h; j++)
+        {
+            R8G8B8A8 *row = reinterpret_cast&lt;R8G8B8A8 *&gt;(curPixel);
+            for (size_t i = 0; i &lt; 4 &amp;&amp; (x + i) &lt; w; i++)
+            {
+                row[i]   = paintColors[getIndex(i, j)];
+                row[i].A = alphaValues[j][i];
+            }
+            curPixel += destRowPitch;
+        }
+
+        if (nonOpaquePunchThroughAlpha)
+        {
+            decodePunchThroughAlphaBlock(dest, x, y, w, h, destRowPitch);
+        }
+    }
+
+    void decodePlanarBlock(uint8_t *dest,
+                           size_t x,
+                           size_t y,
+                           size_t w,
+                           size_t h,
+                           size_t pitch,
+                           const uint8_t alphaValues[4][4]) const
+    {
+        int ro = extend_6to8bits(u.pblk.RO);
+        int go = extend_7to8bits(u.pblk.GO1 &lt;&lt; 6 | u.pblk.GO2);
+        int bo =
+            extend_6to8bits(u.pblk.BO1 &lt;&lt; 5 | u.pblk.BO2 &lt;&lt; 3 | u.pblk.BO3a &lt;&lt; 1 | u.pblk.BO3b);
+        int rh = extend_6to8bits(u.pblk.RH1 &lt;&lt; 1 | u.pblk.RH2);
+        int gh = extend_7to8bits(u.pblk.GH);
+        int bh = extend_6to8bits(u.pblk.BHa &lt;&lt; 5 | u.pblk.BHb);
+        int rv = extend_6to8bits(u.pblk.RVa &lt;&lt; 3 | u.pblk.RVb);
+        int gv = extend_7to8bits(u.pblk.GVa &lt;&lt; 2 | u.pblk.GVb);
+        int bv = extend_6to8bits(u.pblk.BV);
+
+        uint8_t *curPixel = dest;
+        for (size_t j = 0; j &lt; 4 &amp;&amp; (y + j) &lt; h; j++)
+        {
+            R8G8B8A8 *row = reinterpret_cast&lt;R8G8B8A8 *&gt;(curPixel);
+
+            int ry = static_cast&lt;int&gt;(j) * (rv - ro) + 2;
+            int gy = static_cast&lt;int&gt;(j) * (gv - go) + 2;
+            int by = static_cast&lt;int&gt;(j) * (bv - bo) + 2;
+            for (size_t i = 0; i &lt; 4 &amp;&amp; (x + i) &lt; w; i++)
+            {
+                row[i] = createRGBA(((static_cast&lt;int&gt;(i) * (rh - ro) + ry) &gt;&gt; 2) + ro,
+                                    ((static_cast&lt;int&gt;(i) * (gh - go) + gy) &gt;&gt; 2) + go,
+                                    ((static_cast&lt;int&gt;(i) * (bh - bo) + by) &gt;&gt; 2) + bo,
+                                    alphaValues[j][i]);
+            }
+            curPixel += pitch;
+        }
+    }
+
+    // Index for individual, differential, H and T modes
+    size_t getIndex(size_t x, size_t y) const
+    {
+        size_t bitIndex  = x * 4 + y;
+        size_t bitOffset = bitIndex &amp; 7;
+        size_t lsb       = (u.idht.pixelIndexLSB[1 - (bitIndex &gt;&gt; 3)] &gt;&gt; bitOffset) &amp; 1;
+        size_t msb = (u.idht.pixelIndexMSB[1 - (bitIndex &gt;&gt; 3)] &gt;&gt; bitOffset) &amp; 1;
+        return (msb &lt;&lt; 1) | lsb;
+    }
+
+    void decodePunchThroughAlphaBlock(uint8_t *dest,
+                                      size_t x,
+                                      size_t y,
+                                      size_t w,
+                                      size_t h,
+                                      size_t destRowPitch) const
+    {
+        uint8_t *curPixel = dest;
+        for (size_t j = 0; j &lt; 4 &amp;&amp; (y + j) &lt; h; j++)
+        {
+            R8G8B8A8 *row = reinterpret_cast&lt;R8G8B8A8 *&gt;(curPixel);
+            for (size_t i = 0; i &lt; 4 &amp;&amp; (x + i) &lt; w; i++)
+            {
+                if (getIndex(i, j) == 2)  //  msb == 1 &amp;&amp; lsb == 0
+                {
+                    row[i] = createRGBA(0, 0, 0, 0);
+                }
+            }
+            curPixel += destRowPitch;
+        }
+    }
+
+    uint16_t RGB8ToRGB565(const R8G8B8A8 &amp;rgba) const
+    {
+        return (static_cast&lt;uint16_t&gt;(rgba.R &gt;&gt; 3) &lt;&lt; 11) |
+               (static_cast&lt;uint16_t&gt;(rgba.G &gt;&gt; 2) &lt;&lt; 5) |
+               (static_cast&lt;uint16_t&gt;(rgba.B &gt;&gt; 3) &lt;&lt; 0);
+    }
+
+    uint32_t matchBC1Bits(const R8G8B8A8 *rgba,
+                          const R8G8B8A8 &amp;minColor,
+                          const R8G8B8A8 &amp;maxColor,
+                          bool opaque) const
+    {
+        // Project each pixel on the (maxColor, minColor) line to decide which
+        // BC1 code to assign to it.
+
+        uint8_t decodedColors[2][3] = {{maxColor.R, maxColor.G, maxColor.B},
+                                       {minColor.R, minColor.G, minColor.B}};
+
+        int direction[3];
+        for (int ch = 0; ch &lt; 3; ch++)
+        {
+            direction[ch] = decodedColors[0][ch] - decodedColors[1][ch];
+        }
+
+        int stops[2];
+        for (int i = 0; i &lt; 2; i++)
+        {
+            stops[i] = decodedColors[i][0] * direction[0] + decodedColors[i][1] * direction[1] +
+                       decodedColors[i][2] * direction[2];
+        }
+
+        uint32_t bits = 0;
+        if (opaque)
+        {
+            for (int i = 15; i &gt;= 0; i--)
+            {
+                // In opaque mode, the code is from 0 to 3.
+
+                bits &lt;&lt;= 2;
+                const int dot =
+                    rgba[i].R * direction[0] + rgba[i].G * direction[1] + rgba[i].B * direction[2];
+                const int factor = gl::clamp(
+                    static_cast&lt;int&gt;(
+                        (static_cast&lt;float&gt;(dot - stops[1]) / (stops[0] - stops[1])) * 3 + 0.5f),
+                    0, 3);
+                switch (factor)
+                {
+                    case 0:
+                        bits |= 1;
+                        break;
+                    case 1:
+                        bits |= 3;
+                        break;
+                    case 2:
+                        bits |= 2;
+                        break;
+                    case 3:
+                    default:
+                        bits |= 0;
+                        break;
+                }
+            }
+        }
+        else
+        {
+            for (int i = 15; i &gt;= 0; i--)
+            {
+                // In non-opaque mode, 3 is for tranparent pixels.
+
+                bits &lt;&lt;= 2;
+                if (0 == rgba[i].A)
+                {
+                    bits |= 3;
+                }
+                else
+                {
+                    const int dot = rgba[i].R * direction[0] + rgba[i].G * direction[1] +
+                                    rgba[i].B * direction[2];
+                    const int factor = gl::clamp(
+                        static_cast&lt;int&gt;(
+                            (static_cast&lt;float&gt;(dot - stops[1]) / (stops[0] - stops[1])) * 2 +
+                            0.5f),
+                        0, 2);
+                    switch (factor)
+                    {
+                        case 0:
+                            bits |= 0;
+                            break;
+                        case 1:
+                            bits |= 2;
+                            break;
+                        case 2:
+                        default:
+                            bits |= 1;
+                            break;
+                    }
+                }
+            }
+        }
+
+        return bits;
+    }
+
+    void packBC1(void *bc1,
+                 const R8G8B8A8 *rgba,
+                 const R8G8B8A8 &amp;minColor,
+                 const R8G8B8A8 &amp;maxColor,
+                 bool opaque) const
+    {
+        uint32_t bits;
+        uint16_t max16 = RGB8ToRGB565(maxColor);
+        uint16_t min16 = RGB8ToRGB565(minColor);
+        if (max16 != min16)
+        {
+            // Find the best BC1 code for each pixel
+            bits = matchBC1Bits(rgba, minColor, maxColor, opaque);
+        }
+        else
+        {
+            // Same colors, BC1 index 0 is the color in both opaque and transparent mode
+            bits = 0;
+            // BC1 index 3 is transparent
+            if (!opaque)
+            {
+                for (int i = 0; i &lt; 16; i++)
+                {
+                    if (0 == rgba[i].A)
+                    {
+                        bits |= (3 &lt;&lt; (i * 2));
+                    }
+                }
+            }
+        }
+
+        if (max16 &lt; min16)
+        {
+            std::swap(max16, min16);
+
+            uint32_t xorMask = 0;
+            if (opaque)
+            {
+                // In opaque mode switching the two colors is doing the
+                // following code swaps: 0 &lt;-&gt; 1 and 2 &lt;-&gt; 3. This is
+                // equivalent to flipping the first bit of each code
+                // (5 = 0b0101)
+                xorMask = 0x55555555;
+            }
+            else
+            {
+                // In transparent mode switching the colors is doing the
+                // following code swap: 0 &lt;-&gt; 1. 0xA selects the second bit of
+                // each code, bits &gt;&gt; 1 selects the first bit of the code when
+                // the seconds bit is set (case 2 and 3). We invert all the
+                // non-selected bits, that is the first bit when the code is
+                // 0 or 1.
+                xorMask = ~((bits &gt;&gt; 1) | 0xAAAAAAAA);
+            }
+            bits ^= xorMask;
+        }
+
+        struct BC1Block
+        {
+            uint16_t color0;
+            uint16_t color1;
+            uint32_t bits;
+        };
+
+        // Encode the opaqueness in the order of the two BC1 colors
+        BC1Block *dest = reinterpret_cast&lt;BC1Block *&gt;(bc1);
+        if (opaque)
+        {
+            dest-&gt;color0 = max16;
+            dest-&gt;color1 = min16;
+        }
+        else
+        {
+            dest-&gt;color0 = min16;
+            dest-&gt;color1 = max16;
+        }
+        dest-&gt;bits = bits;
+    }
+
+    void transcodeIndividualBlockToBC1(uint8_t *dest,
+                                       size_t x,
+                                       size_t y,
+                                       size_t w,
+                                       size_t h,
+                                       const uint8_t alphaValues[4][4],
+                                       bool nonOpaquePunchThroughAlpha) const
+    {
+        const auto &amp;block = u.idht.mode.idm.colors.indiv;
+        int r1            = extend_4to8bits(block.R1);
+        int g1            = extend_4to8bits(block.G1);
+        int b1            = extend_4to8bits(block.B1);
+        int r2            = extend_4to8bits(block.R2);
+        int g2            = extend_4to8bits(block.G2);
+        int b2 = extend_4to8bits(block.B2);
+        transcodeIndividualOrDifferentialBlockToBC1(dest, x, y, w, h, r1, g1, b1, r2, g2, b2,
+                                                    alphaValues, nonOpaquePunchThroughAlpha);
+    }
+
+    void transcodeDifferentialBlockToBC1(uint8_t *dest,
+                                         size_t x,
+                                         size_t y,
+                                         size_t w,
+                                         size_t h,
+                                         const uint8_t alphaValues[4][4],
+                                         bool nonOpaquePunchThroughAlpha) const
+    {
+        const auto &amp;block = u.idht.mode.idm.colors.diff;
+        int b1            = extend_5to8bits(block.B);
+        int g1            = extend_5to8bits(block.G);
+        int r1            = extend_5to8bits(block.R);
+        int r2            = extend_5to8bits(block.R + block.dR);
+        int g2            = extend_5to8bits(block.G + block.dG);
+        int b2 = extend_5to8bits(block.B + block.dB);
+        transcodeIndividualOrDifferentialBlockToBC1(dest, x, y, w, h, r1, g1, b1, r2, g2, b2,
+                                                    alphaValues, nonOpaquePunchThroughAlpha);
+    }
+
+    void decodeSubblock(R8G8B8A8 *rgbaBlock,
+                        size_t x,
+                        size_t y,
+                        size_t w,
+                        size_t h,
+                        const uint8_t alphaValues[4][4],
+                        bool flipbit,
+                        size_t subblockIdx,
+                        const R8G8B8A8 subblockColors[2][4]) const
+    {
+        size_t dxBegin = 0;
+        size_t dxEnd   = 4;
+        size_t dyBegin = subblockIdx * 2;
+        size_t dyEnd = dyBegin + 2;
+        if (!flipbit)
+        {
+            std::swap(dxBegin, dyBegin);
+            std::swap(dxEnd, dyEnd);
+        }
+
+        for (size_t j = dyBegin; j &lt; dyEnd &amp;&amp; (y + j) &lt; h; j++)
+        {
+            R8G8B8A8 *row = &amp;rgbaBlock[j * 4];
+            for (size_t i = dxBegin; i &lt; dxEnd &amp;&amp; (x + i) &lt; w; i++)
+            {
+                const size_t pixelIndex = getIndex(i, j);
+                row[i]                  = subblockColors[subblockIdx][pixelIndex];
+                row[i].A                = alphaValues[j][i];
+            }
+        }
+    }
+
+    void selectEndPointPCA(const R8G8B8A8 *pixels, R8G8B8A8 *minColor, R8G8B8A8 *maxColor) const
+    {
+        static const int kNumPixels = 16;
+
+        // determine color distribution
+        int mu[3], min[3], max[3];
+        for (int ch = 0; ch &lt; 3; ch++)
+        {
+            int muv, minv, maxv;
+
+            muv = minv = maxv = (&amp;pixels[0].R)[ch];
+            for (size_t i = 1; i &lt; kNumPixels; i++)
+            {
+                muv += (&amp;pixels[i].R)[ch];
+                minv = std::min&lt;int&gt;(minv, (&amp;pixels[i].R)[ch]);
+                maxv = std::max&lt;int&gt;(maxv, (&amp;pixels[i].R)[ch]);
+            }
+
+            mu[ch]  = (muv + kNumPixels / 2) / kNumPixels;
+            min[ch] = minv;
+            max[ch] = maxv;
+        }
+
+        // determine covariance matrix
+        int cov[6] = {0, 0, 0, 0, 0, 0};
+        for (size_t i = 0; i &lt; kNumPixels; i++)
+        {
+            int r = pixels[i].R - mu[0];
+            int g = pixels[i].G - mu[1];
+            int b = pixels[i].B - mu[2];
+
+            cov[0] += r * r;
+            cov[1] += r * g;
+            cov[2] += r * b;
+            cov[3] += g * g;
+            cov[4] += g * b;
+            cov[5] += b * b;
+        }
+
+        // Power iteration algorithm to get the eigenvalues and eigenvector
+
+        // Starts with diagonal vector
+        float vfr = static_cast&lt;float&gt;(max[0] - min[0]);
+        float vfg = static_cast&lt;float&gt;(max[1] - min[1]);
+        float vfb = static_cast&lt;float&gt;(max[2] - min[2]);
+        float eigenvalue;
+
+        static const size_t kPowerIterations = 4;
+        for (size_t i = 0; i &lt; kPowerIterations; i++)
+        {
+            float r = vfr * cov[0] + vfg * cov[1] + vfb * cov[2];
+            float g = vfr * cov[1] + vfg * cov[3] + vfb * cov[4];
+            float b = vfr * cov[2] + vfg * cov[4] + vfb * cov[5];
+
+            vfr = r;
+            vfg = g;
+            vfb = b;
+
+            eigenvalue = sqrt(r * r + g * g + b * b);
+            if (eigenvalue &gt; 0)
+            {
+                float invNorm = 1.0f / eigenvalue;
+                vfr *= invNorm;
+                vfg *= invNorm;
+                vfb *= invNorm;
+            }
+        }
+
+        int vr, vg, vb;
+
+        static const float kDefaultLuminanceThreshold = 4.0f * 255;
+        static const float kQuantizeRange = 512.0f;
+        if (eigenvalue &lt; kDefaultLuminanceThreshold)  // too small, default to luminance
+        {
+            // Luminance weights defined by ITU-R Recommendation BT.601, scaled by 1000
+            vr = 299;
+            vg = 587;
+            vb = 114;
+        }
+        else
+        {
+            // From the eigenvalue and eigenvector, choose the axis to project
+            // colors on. When projecting colors we want to do integer computations
+            // for speed, so we normalize the eigenvector to the [0, 512] range.
+            float magn = std::max(std::max(std::abs(vfr), std::abs(vfg)), std::abs(vfb));
+            magn       = kQuantizeRange / magn;
+            vr         = static_cast&lt;int&gt;(vfr * magn);
+            vg         = static_cast&lt;int&gt;(vfg * magn);
+            vb         = static_cast&lt;int&gt;(vfb * magn);
+        }
+
+        // Pick colors at extreme points
+        int minD        = pixels[0].R * vr + pixels[0].G * vg + pixels[0].B * vb;
+        int maxD        = minD;
+        size_t minIndex = 0;
+        size_t maxIndex = 0;
+        for (size_t i = 1; i &lt; kNumPixels; i++)
+        {
+            int dot = pixels[i].R * vr + pixels[i].G * vg + pixels[i].B * vb;
+            if (dot &lt; minD)
+            {
+                minD     = dot;
+                minIndex = i;
+            }
+            if (dot &gt; maxD)
+            {
+                maxD     = dot;
+                maxIndex = i;
+            }
+        }
+
+        *minColor = pixels[minIndex];
+        *maxColor = pixels[maxIndex];
+    }
+
+    void transcodeIndividualOrDifferentialBlockToBC1(uint8_t *dest,
+                                                     size_t x,
+                                                     size_t y,
+                                                     size_t w,
+                                                     size_t h,
+                                                     int r1,
+                                                     int g1,
+                                                     int b1,
+                                                     int r2,
+                                                     int g2,
+                                                     int b2,
+                                                     const uint8_t alphaValues[4][4],
+                                                     bool nonOpaquePunchThroughAlpha) const
+    {
+        // A BC1 block has 2 endpoints, pixels is encoded as linear
+        // interpolations of them. A ETC1/ETC2 individual or differential block
+        // has 2 subblocks. Each subblock has one color and a modifier. We
+        // select axis by principal component analysis (PCA) to use as
+        // our two BC1 endpoints and then map pixels to BC1 by projecting on the
+        // line between the two endpoints and choosing the right fraction.
+        //
+        // In the future, we have a potential improvements to this algorithm.
+        // 1. We don't actually need to decode ETC blocks to RGBs. Instead,
+        //    the subblock colors and pixel indices alreay contains enough
+        //    information for transcode. A direct mapping would be more
+        //    efficient here.
+
+        const auto intensityModifier =
+            nonOpaquePunchThroughAlpha ? intensityModifierNonOpaque : intensityModifierDefault;
+
+        // Compute the colors that pixels can have in each subblock both for
+        // the decoding of the RGBA data and BC1 encoding
+        R8G8B8A8 subblockColors[2][4];
+        for (size_t modifierIdx = 0; modifierIdx &lt; 4; modifierIdx++)
+        {
+            const int i1                   = intensityModifier[u.idht.mode.idm.cw1][modifierIdx];
+            subblockColors[0][modifierIdx] = createRGBA(r1 + i1, g1 + i1, b1 + i1);
+
+            const int i2                   = intensityModifier[u.idht.mode.idm.cw2][modifierIdx];
+            subblockColors[1][modifierIdx] = createRGBA(r2 + i2, g2 + i2, b2 + i2);
+        }
+
+        R8G8B8A8 rgbaBlock[16];
+        // Decode the block in rgbaBlock.
+        for (size_t blockIdx = 0; blockIdx &lt; 2; blockIdx++)
+        {
+            decodeSubblock(rgbaBlock, x, y, w, h, alphaValues, u.idht.mode.idm.flipbit, blockIdx,
+                           subblockColors);
+        }
+        if (nonOpaquePunchThroughAlpha)
+        {
+            decodePunchThroughAlphaBlock(reinterpret_cast&lt;uint8_t *&gt;(rgbaBlock), x, y, w, h,
+                                         sizeof(R8G8B8A8) * 4);
+        }
+
+        R8G8B8A8 minColor, maxColor;
+        selectEndPointPCA(rgbaBlock, &amp;minColor, &amp;maxColor);
+
+        packBC1(dest, rgbaBlock, minColor, maxColor, !nonOpaquePunchThroughAlpha);
+    }
+
+    void transcodeTBlockToBC1(uint8_t *dest,
+                              size_t x,
+                              size_t y,
+                              size_t w,
+                              size_t h,
+                              const uint8_t alphaValues[4][4],
+                              bool nonOpaquePunchThroughAlpha) const
+    {
+        // TODO (mgong): Will be implemented soon
+        UNIMPLEMENTED();
+    }
+
+    void transcodeHBlockToBC1(uint8_t *dest,
+                              size_t x,
+                              size_t y,
+                              size_t w,
+                              size_t h,
+                              const uint8_t alphaValues[4][4],
+                              bool nonOpaquePunchThroughAlpha) const
+    {
+        // TODO (mgong): Will be implemented soon
+        UNIMPLEMENTED();
+    }
+
+    void transcodePlanarBlockToBC1(uint8_t *dest,
+                                   size_t x,
+                                   size_t y,
+                                   size_t w,
+                                   size_t h,
+                                   const uint8_t alphaValues[4][4]) const
+    {
+        // TODO (mgong): Will be implemented soon
+        UNIMPLEMENTED();
+    }
+
+    // Single channel utility functions
+    int getSingleChannel(size_t x, size_t y, bool isSigned) const
+    {
+        int codeword = isSigned ? u.scblk.base_codeword.s : u.scblk.base_codeword.us;
+        return codeword + getSingleChannelModifier(x, y) * u.scblk.multiplier;
+    }
+
+    int getSingleChannelIndex(size_t x, size_t y) const
+    {
+        ASSERT(x &lt; 4 &amp;&amp; y &lt; 4);
+
+        // clang-format off
+        switch (x * 4 + y)
+        {
+            case 0: return u.scblk.ma;
+            case 1: return u.scblk.mb;
+            case 2: return u.scblk.mc1 &lt;&lt; 1 | u.scblk.mc2;
+            case 3: return u.scblk.md;
+            case 4: return u.scblk.me;
+            case 5: return u.scblk.mf1 &lt;&lt; 2 | u.scblk.mf2;
+            case 6: return u.scblk.mg;
+            case 7: return u.scblk.mh;
+            case 8: return u.scblk.mi;
+            case 9: return u.scblk.mj;
+            case 10: return u.scblk.mk1 &lt;&lt; 1 | u.scblk.mk2;
+            case 11: return u.scblk.ml;
+            case 12: return u.scblk.mm;
+            case 13: return u.scblk.mn1 &lt;&lt; 2 | u.scblk.mn2;
+            case 14: return u.scblk.mo;
+            case 15: return u.scblk.mp;
+            default: UNREACHABLE(); return 0;
+        }
+        // clang-format on
+    }
+
+    int getSingleChannelModifier(size_t x, size_t y) const
+    {
+        // clang-format off
+        static const int modifierTable[16][8] =
+        {
+            { -3, -6,  -9, -15, 2, 5, 8, 14 },
+            { -3, -7, -10, -13, 2, 6, 9, 12 },
+            { -2, -5,  -8, -13, 1, 4, 7, 12 },
+            { -2, -4,  -6, -13, 1, 3, 5, 12 },
+            { -3, -6,  -8, -12, 2, 5, 7, 11 },
+            { -3, -7,  -9, -11, 2, 6, 8, 10 },
+            { -4, -7,  -8, -11, 3, 6, 7, 10 },
+            { -3, -5,  -8, -11, 2, 4, 7, 10 },
+            { -2, -6,  -8, -10, 1, 5, 7,  9 },
+            { -2, -5,  -8, -10, 1, 4, 7,  9 },
+            { -2, -4,  -8, -10, 1, 3, 7,  9 },
+            { -2, -5,  -7, -10, 1, 4, 6,  9 },
+            { -3, -4,  -7, -10, 2, 3, 6,  9 },
+            { -1, -2,  -3, -10, 0, 1, 2,  9 },
+            { -4, -6,  -8,  -9, 3, 5, 7,  8 },
+            { -3, -5,  -7,  -9, 2, 4, 6,  8 }
+        };
+        // clang-format on
+
+        return modifierTable[u.scblk.table_index][getSingleChannelIndex(x, y)];
+    }
+};
+
+// clang-format off
+static const uint8_t DefaultETCAlphaValues[4][4] =
+{
+    { 255, 255, 255, 255 },
+    { 255, 255, 255, 255 },
+    { 255, 255, 255, 255 },
+    { 255, 255, 255, 255 },
+};
+// clang-format on
+
+void LoadR11EACToR8(size_t width,
+                    size_t height,
+                    size_t depth,
+                    const uint8_t *input,
+                    size_t inputRowPitch,
+                    size_t inputDepthPitch,
+                    uint8_t *output,
+                    size_t outputRowPitch,
+                    size_t outputDepthPitch,
+                    bool isSigned)
+{
+    for (size_t z = 0; z &lt; depth; z++)
+    {
+        for (size_t y = 0; y &lt; height; y += 4)
+        {
+            const ETC2Block *sourceRow =
+                OffsetDataPointer&lt;ETC2Block&gt;(input, y / 4, z, inputRowPitch, inputDepthPitch);
+            uint8_t *destRow =
+                OffsetDataPointer&lt;uint8_t&gt;(output, y, z, outputRowPitch, outputDepthPitch);
+
+            for (size_t x = 0; x &lt; width; x += 4)
+            {
+                const ETC2Block *sourceBlock = sourceRow + (x / 4);
+                uint8_t *destPixels          = destRow + x;
+
+                sourceBlock-&gt;decodeAsSingleChannel(destPixels, x, y, width, height, 1,
+                                                   outputRowPitch, isSigned);
+            }
+        }
+    }
+}
+
+void LoadRG11EACToRG8(size_t width,
+                      size_t height,
+                      size_t depth,
+                      const uint8_t *input,
+                      size_t inputRowPitch,
+                      size_t inputDepthPitch,
+                      uint8_t *output,
+                      size_t outputRowPitch,
+                      size_t outputDepthPitch,
+                      bool isSigned)
+{
+    for (size_t z = 0; z &lt; depth; z++)
+    {
+        for (size_t y = 0; y &lt; height; y += 4)
+        {
+            const ETC2Block *sourceRow =
+                OffsetDataPointer&lt;ETC2Block&gt;(input, y / 4, z, inputRowPitch, inputDepthPitch);
+            uint8_t *destRow =
+                OffsetDataPointer&lt;uint8_t&gt;(output, y, z, outputRowPitch, outputDepthPitch);
+
+            for (size_t x = 0; x &lt; width; x += 4)
+            {
+                uint8_t *destPixelsRed          = destRow + (x * 2);
+                const ETC2Block *sourceBlockRed = sourceRow + (x / 2);
+                sourceBlockRed-&gt;decodeAsSingleChannel(destPixelsRed, x, y, width, height, 2,
+                                                      outputRowPitch, isSigned);
+
+                uint8_t *destPixelsGreen          = destPixelsRed + 1;
+                const ETC2Block *sourceBlockGreen = sourceBlockRed + 1;
+                sourceBlockGreen-&gt;decodeAsSingleChannel(destPixelsGreen, x, y, width, height, 2,
+                                                        outputRowPitch, isSigned);
+            }
+        }
+    }
+}
+
+void LoadETC2RGB8ToRGBA8(size_t width,
+                         size_t height,
+                         size_t depth,
+                         const uint8_t *input,
+                         size_t inputRowPitch,
+                         size_t inputDepthPitch,
+                         uint8_t *output,
+                         size_t outputRowPitch,
+                         size_t outputDepthPitch,
+                         bool punchthroughAlpha)
+{
+    for (size_t z = 0; z &lt; depth; z++)
+    {
+        for (size_t y = 0; y &lt; height; y += 4)
+        {
+            const ETC2Block *sourceRow =
+                OffsetDataPointer&lt;ETC2Block&gt;(input, y / 4, z, inputRowPitch, inputDepthPitch);
+            uint8_t *destRow =
+                OffsetDataPointer&lt;uint8_t&gt;(output, y, z, outputRowPitch, outputDepthPitch);
+
+            for (size_t x = 0; x &lt; width; x += 4)
+            {
+                const ETC2Block *sourceBlock = sourceRow + (x / 4);
+                uint8_t *destPixels          = destRow + (x * 4);
+
+                sourceBlock-&gt;decodeAsRGB(destPixels, x, y, width, height, outputRowPitch,
+                                         DefaultETCAlphaValues, punchthroughAlpha);
+            }
+        }
+    }
+}
+
+void LoadETC2RGB8ToBC1(size_t width,
+                       size_t height,
+                       size_t depth,
+                       const uint8_t *input,
+                       size_t inputRowPitch,
+                       size_t inputDepthPitch,
+                       uint8_t *output,
+                       size_t outputRowPitch,
+                       size_t outputDepthPitch,
+                       bool punchthroughAlpha)
+{
+    for (size_t z = 0; z &lt; depth; z++)
+    {
+        for (size_t y = 0; y &lt; height; y += 4)
+        {
+            const ETC2Block *sourceRow =
+                OffsetDataPointer&lt;ETC2Block&gt;(input, y / 4, z, inputRowPitch, inputDepthPitch);
+            uint8_t *destRow =
+                OffsetDataPointer&lt;uint8_t&gt;(output, y / 4, z, outputRowPitch, outputDepthPitch);
+
+            for (size_t x = 0; x &lt; width; x += 4)
+            {
+                const ETC2Block *sourceBlock = sourceRow + (x / 4);
+                uint8_t *destPixels          = destRow + (x * 2);
+
+                sourceBlock-&gt;transcodeAsBC1(destPixels, x, y, width, height, DefaultETCAlphaValues,
+                                            punchthroughAlpha);
+            }
+        }
+    }
+}
+
+void LoadETC2RGBA8ToRGBA8(size_t width,
+                          size_t height,
+                          size_t depth,
+                          const uint8_t *input,
+                          size_t inputRowPitch,
+                          size_t inputDepthPitch,
+                          uint8_t *output,
+                          size_t outputRowPitch,
+                          size_t outputDepthPitch,
+                          bool srgb)
+{
+    uint8_t decodedAlphaValues[4][4];
+
+    for (size_t z = 0; z &lt; depth; z++)
+    {
+        for (size_t y = 0; y &lt; height; y += 4)
+        {
+            const ETC2Block *sourceRow =
+                OffsetDataPointer&lt;ETC2Block&gt;(input, y / 4, z, inputRowPitch, inputDepthPitch);
+            uint8_t *destRow =
+                OffsetDataPointer&lt;uint8_t&gt;(output, y, z, outputRowPitch, outputDepthPitch);
+
+            for (size_t x = 0; x &lt; width; x += 4)
+            {
+                const ETC2Block *sourceBlockAlpha = sourceRow + (x / 2);
+                sourceBlockAlpha-&gt;decodeAsSingleChannel(
+                    reinterpret_cast&lt;uint8_t *&gt;(decodedAlphaValues), x, y, width, height, 1, 4,
+                    false);
+
+                uint8_t *destPixels             = destRow + (x * 4);
+                const ETC2Block *sourceBlockRGB = sourceBlockAlpha + 1;
+                sourceBlockRGB-&gt;decodeAsRGB(destPixels, x, y, width, height, outputRowPitch,
+                                            decodedAlphaValues, false);
+            }
+        }
+    }
+}
+
+}  // anonymous namespace
+
+void LoadETC1RGB8ToRGBA8(size_t width,
+                         size_t height,
+                         size_t depth,
+                         const uint8_t *input,
+                         size_t inputRowPitch,
+                         size_t inputDepthPitch,
+                         uint8_t *output,
+                         size_t outputRowPitch,
+                         size_t outputDepthPitch)
+{
+    LoadETC2RGB8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                        outputRowPitch, outputDepthPitch, false);
+}
+
+void LoadETC1RGB8ToBC1(size_t width,
+                       size_t height,
+                       size_t depth,
+                       const uint8_t *input,
+                       size_t inputRowPitch,
+                       size_t inputDepthPitch,
+                       uint8_t *output,
+                       size_t outputRowPitch,
+                       size_t outputDepthPitch)
+{
+    LoadETC2RGB8ToBC1(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                      outputRowPitch, outputDepthPitch, false);
+}
+
+void LoadEACR11ToR8(size_t width,
+                    size_t height,
+                    size_t depth,
+                    const uint8_t *input,
+                    size_t inputRowPitch,
+                    size_t inputDepthPitch,
+                    uint8_t *output,
+                    size_t outputRowPitch,
+                    size_t outputDepthPitch)
+{
+    LoadR11EACToR8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                   outputRowPitch, outputDepthPitch, false);
+}
+
+void LoadEACR11SToR8(size_t width,
+                     size_t height,
+                     size_t depth,
+                     const uint8_t *input,
+                     size_t inputRowPitch,
+                     size_t inputDepthPitch,
+                     uint8_t *output,
+                     size_t outputRowPitch,
+                     size_t outputDepthPitch)
+{
+    LoadR11EACToR8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                   outputRowPitch, outputDepthPitch, true);
+}
+
+void LoadEACRG11ToRG8(size_t width,
+                      size_t height,
+                      size_t depth,
+                      const uint8_t *input,
+                      size_t inputRowPitch,
+                      size_t inputDepthPitch,
+                      uint8_t *output,
+                      size_t outputRowPitch,
+                      size_t outputDepthPitch)
+{
+    LoadRG11EACToRG8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                     outputRowPitch, outputDepthPitch, false);
+}
+
+void LoadEACRG11SToRG8(size_t width,
+                       size_t height,
+                       size_t depth,
+                       const uint8_t *input,
+                       size_t inputRowPitch,
+                       size_t inputDepthPitch,
+                       uint8_t *output,
+                       size_t outputRowPitch,
+                       size_t outputDepthPitch)
+{
+    LoadRG11EACToRG8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                     outputRowPitch, outputDepthPitch, true);
+}
+
+void LoadETC2RGB8ToRGBA8(size_t width,
+                         size_t height,
+                         size_t depth,
+                         const uint8_t *input,
+                         size_t inputRowPitch,
+                         size_t inputDepthPitch,
+                         uint8_t *output,
+                         size_t outputRowPitch,
+                         size_t outputDepthPitch)
+{
+    LoadETC2RGB8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                        outputRowPitch, outputDepthPitch, false);
+}
+
+void LoadETC2SRGB8ToRGBA8(size_t width,
+                          size_t height,
+                          size_t depth,
+                          const uint8_t *input,
+                          size_t inputRowPitch,
+                          size_t inputDepthPitch,
+                          uint8_t *output,
+                          size_t outputRowPitch,
+                          size_t outputDepthPitch)
+{
+    LoadETC2RGB8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                        outputRowPitch, outputDepthPitch, false);
+}
+
+void LoadETC2RGB8A1ToRGBA8(size_t width,
+                           size_t height,
+                           size_t depth,
+                           const uint8_t *input,
+                           size_t inputRowPitch,
+                           size_t inputDepthPitch,
+                           uint8_t *output,
+                           size_t outputRowPitch,
+                           size_t outputDepthPitch)
+{
+    LoadETC2RGB8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                        outputRowPitch, outputDepthPitch, true);
+}
+
+void LoadETC2SRGB8A1ToRGBA8(size_t width,
+                            size_t height,
+                            size_t depth,
+                            const uint8_t *input,
+                            size_t inputRowPitch,
+                            size_t inputDepthPitch,
+                            uint8_t *output,
+                            size_t outputRowPitch,
+                            size_t outputDepthPitch)
+{
+    LoadETC2RGB8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                        outputRowPitch, outputDepthPitch, true);
+}
+
+void LoadETC2RGBA8ToRGBA8(size_t width,
+                          size_t height,
+                          size_t depth,
+                          const uint8_t *input,
+                          size_t inputRowPitch,
+                          size_t inputDepthPitch,
+                          uint8_t *output,
+                          size_t outputRowPitch,
+                          size_t outputDepthPitch)
+{
+    LoadETC2RGBA8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                         outputRowPitch, outputDepthPitch, false);
+}
+
+void LoadETC2SRGBA8ToSRGBA8(size_t width,
+                            size_t height,
+                            size_t depth,
+                            const uint8_t *input,
+                            size_t inputRowPitch,
+                            size_t inputDepthPitch,
+                            uint8_t *output,
+                            size_t outputRowPitch,
+                            size_t outputDepthPitch)
+{
+    LoadETC2RGBA8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,
+                         outputRowPitch, outputDepthPitch, true);
+}
+
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererd3dloadimage_etch"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage_etc.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage_etc.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/loadimage_etc.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,140 @@
</span><ins>+//
+// Copyright (c) 2013-2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// loadimage_etc.h: Decodes ETC and EAC encoded textures.
+
+#ifndef LIBANGLE_RENDERER_D3D_LOADIMAGE_ETC_H_
+#define LIBANGLE_RENDERER_D3D_LOADIMAGE_ETC_H_
+
+#include &quot;libANGLE/angletypes.h&quot;
+
+#include &lt;stdint.h&gt;
+
+namespace rx
+{
+
+void LoadETC1RGB8ToRGBA8(size_t width,
+                         size_t height,
+                         size_t depth,
+                         const uint8_t *input,
+                         size_t inputRowPitch,
+                         size_t inputDepthPitch,
+                         uint8_t *output,
+                         size_t outputRowPitch,
+                         size_t outputDepthPitch);
+
+void LoadETC1RGB8ToBC1(size_t width,
+                       size_t height,
+                       size_t depth,
+                       const uint8_t *input,
+                       size_t inputRowPitch,
+                       size_t inputDepthPitch,
+                       uint8_t *output,
+                       size_t outputRowPitch,
+                       size_t outputDepthPitch);
+
+void LoadEACR11ToR8(size_t width,
+                    size_t height,
+                    size_t depth,
+                    const uint8_t *input,
+                    size_t inputRowPitch,
+                    size_t inputDepthPitch,
+                    uint8_t *output,
+                    size_t outputRowPitch,
+                    size_t outputDepthPitch);
+
+void LoadEACR11SToR8(size_t width,
+                     size_t height,
+                     size_t depth,
+                     const uint8_t *input,
+                     size_t inputRowPitch,
+                     size_t inputDepthPitch,
+                     uint8_t *output,
+                     size_t outputRowPitch,
+                     size_t outputDepthPitch);
+
+void LoadEACRG11ToRG8(size_t width,
+                      size_t height,
+                      size_t depth,
+                      const uint8_t *input,
+                      size_t inputRowPitch,
+                      size_t inputDepthPitch,
+                      uint8_t *output,
+                      size_t outputRowPitch,
+                      size_t outputDepthPitch);
+
+void LoadEACRG11SToRG8(size_t width,
+                       size_t height,
+                       size_t depth,
+                       const uint8_t *input,
+                       size_t inputRowPitch,
+                       size_t inputDepthPitch,
+                       uint8_t *output,
+                       size_t outputRowPitch,
+                       size_t outputDepthPitch);
+
+void LoadETC2RGB8ToRGBA8(size_t width,
+                         size_t height,
+                         size_t depth,
+                         const uint8_t *input,
+                         size_t inputRowPitch,
+                         size_t inputDepthPitch,
+                         uint8_t *output,
+                         size_t outputRowPitch,
+                         size_t outputDepthPitch);
+
+void LoadETC2SRGB8ToRGBA8(size_t width,
+                          size_t height,
+                          size_t depth,
+                          const uint8_t *input,
+                          size_t inputRowPitch,
+                          size_t inputDepthPitch,
+                          uint8_t *output,
+                          size_t outputRowPitch,
+                          size_t outputDepthPitch);
+
+void LoadETC2RGB8A1ToRGBA8(size_t width,
+                           size_t height,
+                           size_t depth,
+                           const uint8_t *input,
+                           size_t inputRowPitch,
+                           size_t inputDepthPitch,
+                           uint8_t *output,
+                           size_t outputRowPitch,
+                           size_t outputDepthPitch);
+
+void LoadETC2SRGB8A1ToRGBA8(size_t width,
+                            size_t height,
+                            size_t depth,
+                            const uint8_t *input,
+                            size_t inputRowPitch,
+                            size_t inputDepthPitch,
+                            uint8_t *output,
+                            size_t outputRowPitch,
+                            size_t outputDepthPitch);
+
+void LoadETC2RGBA8ToRGBA8(size_t width,
+                          size_t height,
+                          size_t depth,
+                          const uint8_t *input,
+                          size_t inputRowPitch,
+                          size_t inputDepthPitch,
+                          uint8_t *output,
+                          size_t outputRowPitch,
+                          size_t outputDepthPitch);
+
+void LoadETC2SRGBA8ToSRGBA8(size_t width,
+                            size_t height,
+                            size_t depth,
+                            const uint8_t *input,
+                            size_t inputRowPitch,
+                            size_t inputDepthPitch,
+                            uint8_t *output,
+                            size_t outputRowPitch,
+                            size_t outputDepthPitch);
+}
+
+#endif  // LIBANGLE_RENDERER_D3D_LOADIMAGE_ETC_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglBlitGLcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BlitGL.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BlitGL.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BlitGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,304 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// BlitGL.cpp: Implements the BlitGL class, a helper for blitting textures
+
+#include &quot;libANGLE/renderer/gl/BlitGL.h&quot;
+
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/Framebuffer.h&quot;
+#include &quot;libANGLE/renderer/gl/formatutilsgl.h&quot;
+#include &quot;libANGLE/renderer/gl/FramebufferGL.h&quot;
+#include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
+#include &quot;libANGLE/renderer/gl/TextureGL.h&quot;
+#include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
+#include &quot;libANGLE/renderer/gl/WorkaroundsGL.h&quot;
+
+namespace
+{
+
+gl::Error CheckCompileStatus(const rx::FunctionsGL *functions, GLuint shader)
+{
+    GLint compileStatus = GL_FALSE;
+    functions-&gt;getShaderiv(shader, GL_COMPILE_STATUS, &amp;compileStatus);
+    ASSERT(compileStatus == GL_TRUE);
+    if (compileStatus == GL_FALSE)
+    {
+        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to compile internal blit shader.&quot;);
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error CheckLinkStatus(const rx::FunctionsGL *functions, GLuint program)
+{
+    GLint linkStatus = GL_FALSE;
+    functions-&gt;getProgramiv(program, GL_LINK_STATUS, &amp;linkStatus);
+    ASSERT(linkStatus == GL_TRUE);
+    if (linkStatus == GL_FALSE)
+    {
+        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to link internal blit program.&quot;);
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+} // anonymous namespace
+
+namespace rx
+{
+
+BlitGL::BlitGL(const FunctionsGL *functions,
+               const WorkaroundsGL &amp;workarounds,
+               StateManagerGL *stateManager)
+    : mFunctions(functions),
+      mWorkarounds(workarounds),
+      mStateManager(stateManager),
+      mBlitProgram(0),
+      mScratchFBO(0),
+      mVAO(0)
+{
+    for (size_t i = 0; i &lt; ArraySize(mScratchTextures); i++)
+    {
+        mScratchTextures[i] = 0;
+    }
+
+    ASSERT(mFunctions);
+    ASSERT(mStateManager);
+}
+
+BlitGL::~BlitGL()
+{
+    if (mBlitProgram != 0)
+    {
+        mStateManager-&gt;deleteProgram(mBlitProgram);
+        mBlitProgram = 0;
+    }
+
+    for (size_t i = 0; i &lt; ArraySize(mScratchTextures); i++)
+    {
+        if (mScratchTextures[i] != 0)
+        {
+            mStateManager-&gt;deleteTexture(mScratchTextures[i]);
+            mScratchTextures[i] = 0;
+        }
+    }
+
+    if (mScratchFBO != 0)
+    {
+        mStateManager-&gt;deleteFramebuffer(mScratchFBO);
+        mScratchFBO = 0;
+    }
+
+    if (mVAO != 0)
+    {
+        mStateManager-&gt;deleteVertexArray(mVAO);
+        mVAO = 0;
+    }
+}
+
+gl::Error BlitGL::copyImageToLUMAWorkaroundTexture(GLuint texture,
+                                                   GLenum textureType,
+                                                   GLenum target,
+                                                   GLenum lumaFormat,
+                                                   size_t level,
+                                                   const gl::Rectangle &amp;sourceArea,
+                                                   GLenum internalFormat,
+                                                   const gl::Framebuffer *source)
+{
+    mStateManager-&gt;bindTexture(textureType, texture);
+
+    // Allocate the texture memory
+    const gl::InternalFormat &amp;internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
+    mFunctions-&gt;texImage2D(target, static_cast&lt;GLint&gt;(level), internalFormat, sourceArea.width,
+                           sourceArea.height, 0, internalFormatInfo.format,
+                           source-&gt;getImplementationColorReadType(), nullptr);
+
+    return copySubImageToLUMAWorkaroundTexture(texture, textureType, target, lumaFormat, level,
+                                               gl::Offset(0, 0, 0), sourceArea, source);
+}
+
+gl::Error BlitGL::copySubImageToLUMAWorkaroundTexture(GLuint texture,
+                                                      GLenum textureType,
+                                                      GLenum target,
+                                                      GLenum lumaFormat,
+                                                      size_t level,
+                                                      const gl::Offset &amp;destOffset,
+                                                      const gl::Rectangle &amp;sourceArea,
+                                                      const gl::Framebuffer *source)
+{
+    gl::Error error = initializeResources();
+    if (error.isError())
+    {
+        return error;
+    }
+
+    // Blit the framebuffer to the first scratch texture
+    const FramebufferGL *sourceFramebufferGL = GetImplAs&lt;FramebufferGL&gt;(source);
+    mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, sourceFramebufferGL-&gt;getFramebufferID());
+
+    nativegl::CopyTexImageImageFormat copyTexImageFormat = nativegl::GetCopyTexImageImageFormat(
+        mFunctions, mWorkarounds, source-&gt;getImplementationColorReadFormat(),
+        source-&gt;getImplementationColorReadType());
+    const gl::InternalFormat &amp;internalFormatInfo =
+        gl::GetInternalFormatInfo(copyTexImageFormat.internalFormat);
+
+    mStateManager-&gt;activeTexture(0);
+    mStateManager-&gt;bindTexture(GL_TEXTURE_2D, mScratchTextures[0]);
+    mFunctions-&gt;copyTexImage2D(GL_TEXTURE_2D, 0, copyTexImageFormat.internalFormat, sourceArea.x,
+                               sourceArea.y, sourceArea.width, sourceArea.height, 0);
+
+    // Set the swizzle of the scratch texture so that the channels sample into the correct emulated
+    // LUMA channels.
+    GLint swizzle[4] = {
+        (lumaFormat == GL_ALPHA) ? GL_ALPHA : GL_RED,
+        (lumaFormat == GL_LUMINANCE_ALPHA) ? GL_ALPHA : GL_ZERO, GL_ZERO, GL_ZERO,
+    };
+    mFunctions-&gt;texParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
+
+    // Make a temporary framebuffer using the second scratch texture to render the swizzled result
+    // to.
+    mStateManager-&gt;bindTexture(GL_TEXTURE_2D, mScratchTextures[1]);
+    mFunctions-&gt;texImage2D(GL_TEXTURE_2D, 0, copyTexImageFormat.internalFormat, sourceArea.width,
+                           sourceArea.height, 0, internalFormatInfo.format,
+                           source-&gt;getImplementationColorReadType(), nullptr);
+
+    mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mScratchFBO);
+    mFunctions-&gt;framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                     mScratchTextures[1], 0);
+
+    // Render to the destination texture, sampling from the scratch texture
+    mStateManager-&gt;useProgram(mBlitProgram);
+    mStateManager-&gt;setViewport(gl::Rectangle(0, 0, sourceArea.width, sourceArea.height));
+    mStateManager-&gt;setScissorTestEnabled(false);
+    mStateManager-&gt;setDepthRange(0.0f, 1.0f);
+    mStateManager-&gt;setBlendEnabled(false);
+    mStateManager-&gt;setColorMask(true, true, true, true);
+    mStateManager-&gt;setSampleAlphaToCoverageEnabled(false);
+    mStateManager-&gt;setSampleCoverageEnabled(false);
+    mStateManager-&gt;setDepthTestEnabled(false);
+    mStateManager-&gt;setStencilTestEnabled(false);
+    mStateManager-&gt;setCullFaceEnabled(false);
+    mStateManager-&gt;setPolygonOffsetFillEnabled(false);
+    mStateManager-&gt;setRasterizerDiscardEnabled(false);
+    mStateManager-&gt;bindTexture(GL_TEXTURE_2D, mScratchTextures[0]);
+
+    mStateManager-&gt;bindVertexArray(mVAO, 0);
+
+    mFunctions-&gt;drawArrays(GL_TRIANGLES, 0, 6);
+
+    // Finally, copy the swizzled texture to the destination texture
+    mStateManager-&gt;bindTexture(textureType, texture);
+    mFunctions-&gt;copyTexSubImage2D(target, static_cast&lt;GLint&gt;(level), destOffset.x, destOffset.y, 0,
+                                  0, sourceArea.width, sourceArea.height);
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error BlitGL::initializeResources()
+{
+    if (mBlitProgram == 0)
+    {
+        mBlitProgram = mFunctions-&gt;createProgram();
+
+        // Compile the fragment shader
+        const char *vsSource =
+            &quot;#version 150\n&quot;
+            &quot;out vec2 v_texcoord;\n&quot;
+            &quot;\n&quot;
+            &quot;void main()\n&quot;
+            &quot;{\n&quot;
+            &quot;    const vec2 quad_positions[6] = vec2[6]\n&quot;
+            &quot;    (\n&quot;
+            &quot;        vec2(0.0f, 0.0f),\n&quot;
+            &quot;        vec2(0.0f, 1.0f),\n&quot;
+            &quot;        vec2(1.0f, 0.0f),\n&quot;
+            &quot;\n&quot;
+            &quot;        vec2(0.0f, 1.0f),\n&quot;
+            &quot;        vec2(1.0f, 0.0f),\n&quot;
+            &quot;        vec2(1.0f, 1.0f)\n&quot;
+            &quot;    );\n&quot;
+            &quot;\n&quot;
+            &quot;    gl_Position = vec4((quad_positions[gl_VertexID] * 2.0) - 1.0, 0.0, 1.0);\n&quot;
+            &quot;    v_texcoord = quad_positions[gl_VertexID];\n&quot;
+            &quot;}\n&quot;;
+
+        GLuint vs = mFunctions-&gt;createShader(GL_VERTEX_SHADER);
+        mFunctions-&gt;shaderSource(vs, 1, &amp;vsSource, nullptr);
+        mFunctions-&gt;compileShader(vs);
+        gl::Error error = CheckCompileStatus(mFunctions, vs);
+
+        mFunctions-&gt;attachShader(mBlitProgram, vs);
+        mFunctions-&gt;deleteShader(vs);
+
+        if (error.isError())
+        {
+            return error;
+        }
+
+        // Compile the vertex shader
+        const char *fsSource =
+            &quot;#version 150\n&quot;
+            &quot;uniform sampler2D u_source_texture;\n&quot;
+            &quot;in vec2 v_texcoord;\n&quot;
+            &quot;out vec4 output_color;\n&quot;
+            &quot;\n&quot;
+            &quot;void main()\n&quot;
+            &quot;{\n&quot;
+            &quot;    output_color = texture(u_source_texture, v_texcoord);\n&quot;
+            &quot;}\n&quot;;
+
+        GLuint fs = mFunctions-&gt;createShader(GL_FRAGMENT_SHADER);
+        mFunctions-&gt;shaderSource(fs, 1, &amp;fsSource, nullptr);
+        mFunctions-&gt;compileShader(fs);
+        error = CheckCompileStatus(mFunctions, fs);
+
+        mFunctions-&gt;attachShader(mBlitProgram, fs);
+        mFunctions-&gt;deleteShader(fs);
+
+        if (error.isError())
+        {
+            return error;
+        }
+
+        mFunctions-&gt;linkProgram(mBlitProgram);
+        error = CheckLinkStatus(mFunctions, mBlitProgram);
+        if (error.isError())
+        {
+            return error;
+        }
+
+        GLuint textureUniform = mFunctions-&gt;getUniformLocation(mBlitProgram, &quot;u_source_texture&quot;);
+        mStateManager-&gt;useProgram(mBlitProgram);
+        mFunctions-&gt;uniform1i(textureUniform, 0);
+    }
+
+    for (size_t i = 0; i &lt; ArraySize(mScratchTextures); i++)
+    {
+        if (mScratchTextures[i] == 0)
+        {
+            mFunctions-&gt;genTextures(1, &amp;mScratchTextures[i]);
+            mStateManager-&gt;bindTexture(GL_TEXTURE_2D, mScratchTextures[i]);
+
+            // Use nearest, non-mipmapped sampling with the scratch texture
+            mFunctions-&gt;texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+            mFunctions-&gt;texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        }
+    }
+
+    if (mScratchFBO == 0)
+    {
+        mFunctions-&gt;genFramebuffers(1, &amp;mScratchFBO);
+    }
+
+    if (mVAO == 0)
+    {
+        mFunctions-&gt;genVertexArrays(1, &amp;mVAO);
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglBlitGLh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BlitGL.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BlitGL.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BlitGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,71 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// BlitGL.h: Defines the BlitGL class, a helper for blitting textures
+
+#ifndef LIBANGLE_RENDERER_GL_BLITGL_H_
+#define LIBANGLE_RENDERER_GL_BLITGL_H_
+
+#include &quot;angle_gl.h&quot;
+#include &quot;common/angleutils.h&quot;
+#include &quot;libANGLE/angletypes.h&quot;
+#include &quot;libANGLE/Error.h&quot;
+
+namespace gl
+{
+class Framebuffer;
+}
+
+namespace rx
+{
+
+class FramebufferGL;
+class FunctionsGL;
+class StateManagerGL;
+struct WorkaroundsGL;
+
+class BlitGL : public angle::NonCopyable
+{
+  public:
+    BlitGL(const FunctionsGL *functions,
+           const WorkaroundsGL &amp;workarounds,
+           StateManagerGL *stateManager);
+    ~BlitGL();
+
+    gl::Error copyImageToLUMAWorkaroundTexture(GLuint texture,
+                                               GLenum textureType,
+                                               GLenum target,
+                                               GLenum lumaFormat,
+                                               size_t level,
+                                               const gl::Rectangle &amp;sourceArea,
+                                               GLenum internalFormat,
+                                               const gl::Framebuffer *source);
+    gl::Error copySubImageToLUMAWorkaroundTexture(GLuint texture,
+                                                  GLenum textureType,
+                                                  GLenum target,
+                                                  GLenum lumaFormat,
+                                                  size_t level,
+                                                  const gl::Offset &amp;destOffset,
+                                                  const gl::Rectangle &amp;sourceArea,
+                                                  const gl::Framebuffer *source);
+
+    gl::Error initializeResources();
+
+  private:
+    const FunctionsGL *mFunctions;
+    const WorkaroundsGL &amp;mWorkarounds;
+    StateManagerGL *mStateManager;
+
+    GLuint mBlitProgram;
+
+    GLuint mScratchTextures[2];
+    GLuint mScratchFBO;
+
+    GLuint mVAO;
+};
+}
+
+#endif  // LIBANGLE_RENDERER_GL_BLITGL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglBufferGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BufferGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BufferGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BufferGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,9 +9,12 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/BufferGL.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><ins>+#include &quot;common/utilities.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><ins>+#include &quot;libANGLE/formatutils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/renderergl_utils.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -28,6 +31,12 @@
</span><span class="cx"> 
</span><span class="cx"> BufferGL::BufferGL(const FunctionsGL *functions, StateManagerGL *stateManager)
</span><span class="cx">     : BufferImpl(),
</span><ins>+      mIsMapped(false),
+      mMapOffset(0),
+      mMapSize(0),
+      mShadowBufferData(!CanMapBufferForRead(functions)),
+      mShadowCopy(),
+      mBufferSize(0),
</ins><span class="cx">       mFunctions(functions),
</span><span class="cx">       mStateManager(stateManager),
</span><span class="cx">       mBufferID(0)
</span><span class="lines">@@ -40,17 +49,30 @@
</span><span class="cx"> 
</span><span class="cx"> BufferGL::~BufferGL()
</span><span class="cx"> {
</span><del>-    if (mBufferID)
-    {
-        mFunctions-&gt;deleteBuffers(1, &amp;mBufferID);
-        mBufferID = 0;
-    }
</del><ins>+    mStateManager-&gt;deleteBuffer(mBufferID);
+    mBufferID = 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error BufferGL::setData(const void* data, size_t size, GLenum usage)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;bindBuffer(DestBufferOperationTarget, mBufferID);
</span><span class="cx">     mFunctions-&gt;bufferData(DestBufferOperationTarget, size, data, usage);
</span><ins>+
+    if (mShadowBufferData)
+    {
+        if (!mShadowCopy.resize(size))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to resize buffer data shadow copy.&quot;);
+        }
+
+        if (size &gt; 0 &amp;&amp; data != nullptr)
+        {
+            memcpy(mShadowCopy.data(), data, size);
+        }
+    }
+
+    mBufferSize = size;
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -58,6 +80,12 @@
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;bindBuffer(DestBufferOperationTarget, mBufferID);
</span><span class="cx">     mFunctions-&gt;bufferSubData(DestBufferOperationTarget, offset, size, data);
</span><ins>+
+    if (mShadowBufferData &amp;&amp; size &gt; 0)
+    {
+        memcpy(mShadowCopy.data() + offset, data, size);
+    }
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -70,36 +98,100 @@
</span><span class="cx"> 
</span><span class="cx">     mFunctions-&gt;copyBufferSubData(SourceBufferOperationTarget, DestBufferOperationTarget, sourceOffset, destOffset, size);
</span><span class="cx"> 
</span><ins>+    if (mShadowBufferData &amp;&amp; size &gt; 0)
+    {
+        ASSERT(sourceGL-&gt;mShadowBufferData);
+        memcpy(mShadowCopy.data() + destOffset, sourceGL-&gt;mShadowCopy.data() + sourceOffset, size);
+    }
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error BufferGL::map(GLenum access, GLvoid **mapPtr)
</span><span class="cx"> {
</span><del>-    mStateManager-&gt;bindBuffer(DestBufferOperationTarget, mBufferID);
-    *mapPtr = mFunctions-&gt;mapBuffer(DestBufferOperationTarget, access);
</del><ins>+    if (mShadowBufferData)
+    {
+        *mapPtr = mShadowCopy.data();
+    }
+    else
+    {
+        mStateManager-&gt;bindBuffer(DestBufferOperationTarget, mBufferID);
+        *mapPtr = mFunctions-&gt;mapBuffer(DestBufferOperationTarget, access);
+    }
+
+    mIsMapped = true;
+    mMapOffset = 0;
+    mMapSize   = mBufferSize;
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error BufferGL::mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr)
</span><span class="cx"> {
</span><del>-    mStateManager-&gt;bindBuffer(DestBufferOperationTarget, mBufferID);
-    *mapPtr = mFunctions-&gt;mapBufferRange(DestBufferOperationTarget, offset, length, access);
</del><ins>+    if (mShadowBufferData)
+    {
+        *mapPtr = mShadowCopy.data() + offset;
+    }
+    else
+    {
+        mStateManager-&gt;bindBuffer(DestBufferOperationTarget, mBufferID);
+        *mapPtr = mFunctions-&gt;mapBufferRange(DestBufferOperationTarget, offset, length, access);
+    }
+
+    mIsMapped = true;
+    mMapOffset = offset;
+    mMapSize   = length;
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error BufferGL::unmap(GLboolean *result)
</span><span class="cx"> {
</span><del>-    ASSERT(*result);
</del><ins>+    ASSERT(result);
+    ASSERT(mIsMapped);
</ins><span class="cx"> 
</span><del>-    mStateManager-&gt;bindBuffer(DestBufferOperationTarget, mBufferID);
-    *result = mFunctions-&gt;unmapBuffer(DestBufferOperationTarget);
</del><ins>+    if (mShadowBufferData)
+    {
+        mStateManager-&gt;bindBuffer(DestBufferOperationTarget, mBufferID);
+        mFunctions-&gt;bufferSubData(DestBufferOperationTarget, mMapOffset, mMapSize,
+                                  mShadowCopy.data() + mMapOffset);
+        *result = GL_TRUE;
+    }
+    else
+    {
+        mStateManager-&gt;bindBuffer(DestBufferOperationTarget, mBufferID);
+        *result = mFunctions-&gt;unmapBuffer(DestBufferOperationTarget);
+    }
+
+    mIsMapped = false;
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error BufferGL::getData(const uint8_t **outData)
</del><ins>+gl::Error BufferGL::getIndexRange(GLenum type,
+                                  size_t offset,
+                                  size_t count,
+                                  bool primitiveRestartEnabled,
+                                  gl::IndexRange *outRange)
</ins><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
-    return gl::Error(GL_INVALID_OPERATION);
</del><ins>+    ASSERT(!mIsMapped);
+
+    if (mShadowBufferData)
+    {
+        *outRange = gl::ComputeIndexRange(type, mShadowCopy.data() + offset, count,
+                                          primitiveRestartEnabled);
+    }
+    else
+    {
+        mStateManager-&gt;bindBuffer(DestBufferOperationTarget, mBufferID);
+
+        const gl::Type &amp;typeInfo  = gl::GetTypeInfo(type);
+        const uint8_t *bufferData = MapBufferRangeWithFallback(
+            mFunctions, DestBufferOperationTarget, offset, count * typeInfo.bytes, GL_MAP_READ_BIT);
+        *outRange = gl::ComputeIndexRange(type, bufferData, count, primitiveRestartEnabled);
+        mFunctions-&gt;unmapBuffer(DestBufferOperationTarget);
+    }
+
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLuint BufferGL::getBufferID() const
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglBufferGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BufferGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BufferGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/BufferGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,6 +9,7 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_GL_BUFFERGL_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_GL_BUFFERGL_H_
</span><span class="cx"> 
</span><ins>+#include &quot;common/MemoryBuffer.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/BufferImpl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="lines">@@ -30,13 +31,24 @@
</span><span class="cx">     gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) override;
</span><span class="cx">     gl::Error unmap(GLboolean *result) override;
</span><span class="cx"> 
</span><del>-    // This method may not have a corresponding GL-backed function. It is necessary
-    // for validation, for certain indexed draw calls.
-    gl::Error getData(const uint8_t **outData) override;
</del><ins>+    gl::Error getIndexRange(GLenum type,
+                            size_t offset,
+                            size_t count,
+                            bool primitiveRestartEnabled,
+                            gl::IndexRange *outRange) override;
</ins><span class="cx"> 
</span><span class="cx">     GLuint getBufferID() const;
</span><span class="cx"> 
</span><span class="cx">   private:
</span><ins>+    bool mIsMapped;
+    size_t mMapOffset;
+    size_t mMapSize;
+
+    bool mShadowBufferData;
+    MemoryBuffer mShadowCopy;
+
+    size_t mBufferSize;
+
</ins><span class="cx">     const FunctionsGL *mFunctions;
</span><span class="cx">     StateManagerGL *mStateManager;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglCompilerGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/CompilerGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/CompilerGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/CompilerGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -3,120 +3,89 @@
</span><span class="cx"> // Use of this source code is governed by a BSD-style license that can be
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><ins>+// CompilerGL:
+//   Implementation of the GL compiler methods.
+//
</ins><span class="cx"> 
</span><del>-// CompilerGL.cpp: Implements the class methods for CompilerGL.
-
</del><span class="cx"> #include &quot;libANGLE/renderer/gl/CompilerGL.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;common/debug.h&quot;
-#include &quot;libANGLE/Caps.h&quot;
-#include &quot;libANGLE/Data.h&quot;
</del><ins>+#include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-// Global count of active shader compiler handles. Needed to know when to call ShInitialize and ShFinalize.
-static size_t activeCompilerHandles = 0;
-
-CompilerGL::CompilerGL(const gl::Data &amp;data)
-    : CompilerImpl(),
-      mSpec(data.clientVersion &gt; 2 ? SH_GLES3_SPEC : SH_GLES2_SPEC),
-      mOutputType(SH_GLSL_OUTPUT),
-      mResources(),
-      mFragmentCompiler(nullptr),
-      mVertexCompiler(nullptr)
</del><ins>+namespace
</ins><span class="cx"> {
</span><del>-    ASSERT(data.clientVersion == 2 || data.clientVersion == 3);
</del><span class="cx"> 
</span><del>-    const gl::Caps &amp;caps = *data.caps;
-    const gl::Extensions &amp;extensions = *data.extensions;
-
-    ShInitBuiltInResources(&amp;mResources);
-    mResources.MaxVertexAttribs = caps.maxVertexAttributes;
-    mResources.MaxVertexUniformVectors = caps.maxVertexUniformVectors;
-    mResources.MaxVaryingVectors = caps.maxVaryingVectors;
-    mResources.MaxVertexTextureImageUnits = caps.maxVertexTextureImageUnits;
-    mResources.MaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
-    mResources.MaxTextureImageUnits = caps.maxTextureImageUnits;
-    mResources.MaxFragmentUniformVectors = caps.maxFragmentUniformVectors;
-    mResources.MaxDrawBuffers = caps.maxDrawBuffers;
-    mResources.OES_standard_derivatives = extensions.standardDerivatives;
-    mResources.EXT_draw_buffers = extensions.drawBuffers;
-    mResources.EXT_shader_texture_lod = extensions.shaderTextureLOD;
-    mResources.OES_EGL_image_external = 0; // TODO: disabled until the extension is actually supported.
-    mResources.FragmentPrecisionHigh = 1; // TODO: use shader precision caps to determine if high precision is supported?
-    mResources.EXT_frag_depth = extensions.fragDepth;
-
-    // GLSL ES 3.0 constants
-    mResources.MaxVertexOutputVectors = caps.maxVertexOutputComponents / 4;
-    mResources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4;
-    mResources.MinProgramTexelOffset = caps.minProgramTexelOffset;
-    mResources.MaxProgramTexelOffset = caps.maxProgramTexelOffset;
-}
-
-CompilerGL::~CompilerGL()
</del><ins>+ShShaderOutput GetShaderOutputType(const FunctionsGL *functions)
</ins><span class="cx"> {
</span><del>-    release();
-}
</del><ins>+    ASSERT(functions);
</ins><span class="cx"> 
</span><del>-gl::Error CompilerGL::release()
-{
-    if (mFragmentCompiler)
</del><ins>+    if (functions-&gt;standard == STANDARD_GL_DESKTOP)
</ins><span class="cx">     {
</span><del>-        ShDestruct(mFragmentCompiler);
-        mFragmentCompiler = NULL;
-
-        ASSERT(activeCompilerHandles &gt; 0);
-        activeCompilerHandles--;
</del><ins>+        // GLSL outputs
+        if (functions-&gt;isAtLeastGL(gl::Version(4, 5)))
+        {
+            return SH_GLSL_450_CORE_OUTPUT;
+        }
+        else if (functions-&gt;isAtLeastGL(gl::Version(4, 4)))
+        {
+            return SH_GLSL_440_CORE_OUTPUT;
+        }
+        else if (functions-&gt;isAtLeastGL(gl::Version(4, 3)))
+        {
+            return SH_GLSL_430_CORE_OUTPUT;
+        }
+        else if (functions-&gt;isAtLeastGL(gl::Version(4, 2)))
+        {
+            return SH_GLSL_420_CORE_OUTPUT;
+        }
+        else if (functions-&gt;isAtLeastGL(gl::Version(4, 1)))
+        {
+            return SH_GLSL_410_CORE_OUTPUT;
+        }
+        else if (functions-&gt;isAtLeastGL(gl::Version(4, 0)))
+        {
+            return SH_GLSL_400_CORE_OUTPUT;
+        }
+        else if (functions-&gt;isAtLeastGL(gl::Version(3, 3)))
+        {
+            return SH_GLSL_330_CORE_OUTPUT;
+        }
+        else if (functions-&gt;isAtLeastGL(gl::Version(3, 2)))
+        {
+            return SH_GLSL_150_CORE_OUTPUT;
+        }
+        else if (functions-&gt;isAtLeastGL(gl::Version(3, 1)))
+        {
+            return SH_GLSL_140_OUTPUT;
+        }
+        else if (functions-&gt;isAtLeastGL(gl::Version(3, 0)))
+        {
+            return SH_GLSL_130_OUTPUT;
+        }
+        else
+        {
+            return SH_GLSL_COMPATIBILITY_OUTPUT;
+        }
</ins><span class="cx">     }
</span><del>-
-    if (mVertexCompiler)
</del><ins>+    else if (functions-&gt;standard == STANDARD_GL_ES)
</ins><span class="cx">     {
</span><del>-        ShDestruct(mVertexCompiler);
-        mVertexCompiler = NULL;
-
-        ASSERT(activeCompilerHandles &gt; 0);
-        activeCompilerHandles--;
</del><ins>+        // ESSL outputs
+        return SH_ESSL_OUTPUT;
</ins><span class="cx">     }
</span><del>-
-    if (activeCompilerHandles == 0)
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        ShFinalize();
</del><ins>+        UNREACHABLE();
+        return ShShaderOutput(0);
</ins><span class="cx">     }
</span><del>-
-    return gl::Error(GL_NO_ERROR);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-ShHandle CompilerGL::getCompilerHandle(GLenum type)
-{
-    ShHandle *compiler = NULL;
-    switch (type)
-    {
-      case GL_VERTEX_SHADER:
-        compiler = &amp;mVertexCompiler;
-        break;
</del><ins>+}  // anonymous namespace
</ins><span class="cx"> 
</span><del>-      case GL_FRAGMENT_SHADER:
-        compiler = &amp;mFragmentCompiler;
-        break;
-
-      default:
-        UNREACHABLE();
-        return NULL;
-    }
-
-    if ((*compiler) == nullptr)
-    {
-        if (activeCompilerHandles == 0)
-        {
-            ShInitialize();
-        }
-
-        *compiler = ShConstructCompiler(type, mSpec, mOutputType, &amp;mResources);
-        activeCompilerHandles++;
-    }
-
-    return *compiler;
</del><ins>+CompilerGL::CompilerGL(const FunctionsGL *functions)
+    : mTranslatorOutputType(GetShaderOutputType(functions))
+{
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglCompilerGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/CompilerGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/CompilerGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/CompilerGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,33 +11,21 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/CompilerImpl.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;GLSLANG/ShaderLang.h&quot;
-
-namespace gl
-{
-struct Data;
-}
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+class FunctionsGL;
</ins><span class="cx"> 
</span><span class="cx"> class CompilerGL : public CompilerImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    CompilerGL(const gl::Data &amp;data);
-    ~CompilerGL() override;
</del><ins>+    CompilerGL(const FunctionsGL *functions);
+    ~CompilerGL() override {}
</ins><span class="cx"> 
</span><del>-    gl::Error release() override;
</del><ins>+    gl::Error release() override { return gl::Error(GL_NO_ERROR); }
+    ShShaderOutput getTranslatorOutputType() const override { return mTranslatorOutputType; }
</ins><span class="cx"> 
</span><del>-    ShHandle getCompilerHandle(GLenum type);
-
</del><span class="cx">   private:
</span><del>-    ShShaderSpec mSpec;
-    ShShaderOutput mOutputType;
-    ShBuiltInResources mResources;
-
-    ShHandle mFragmentCompiler;
-    ShHandle mVertexCompiler;
</del><ins>+    ShShaderOutput mTranslatorOutputType;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglDisplayGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/DisplayGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/DisplayGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/DisplayGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,6 +10,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/AttributeMap.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Context.h&quot;
</span><ins>+#include &quot;libANGLE/Display.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/RendererGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/SurfaceGL.h&quot;
</span><span class="lines">@@ -30,7 +31,14 @@
</span><span class="cx"> 
</span><span class="cx"> egl::Error DisplayGL::initialize(egl::Display *display)
</span><span class="cx"> {
</span><del>-    mRenderer = new RendererGL(getFunctionsGL());
</del><ins>+    mRenderer = new RendererGL(getFunctionsGL(), display-&gt;getAttributeMap());
+
+    const gl::Version &amp;maxVersion = mRenderer-&gt;getMaxSupportedESVersion();
+    if (maxVersion &lt; gl::Version(2, 0))
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;OpenGL ES 2.0 is not supportable.&quot;);
+    }
+
</ins><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -39,16 +47,26 @@
</span><span class="cx">     SafeDelete(mRenderer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error DisplayGL::createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &amp;attribs, gl::Context **outContext)
</del><ins>+ImageImpl *DisplayGL::createImage(EGLenum target,
+                                  egl::ImageSibling *buffer,
+                                  const egl::AttributeMap &amp;attribs)
</ins><span class="cx"> {
</span><ins>+    UNIMPLEMENTED();
+    return nullptr;
+}
+
+gl::Context *DisplayGL::createContext(const egl::Config *config,
+                                      const gl::Context *shareContext,
+                                      const egl::AttributeMap &amp;attribs)
+{
</ins><span class="cx">     ASSERT(mRenderer != nullptr);
</span><ins>+    return new gl::Context(config, shareContext, mRenderer, attribs);
+}
</ins><span class="cx"> 
</span><del>-    EGLint clientVersion = attribs.get(EGL_CONTEXT_CLIENT_VERSION, 1);
-    bool notifyResets = (attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION_EXT) == EGL_LOSE_CONTEXT_ON_RESET_EXT);
-    bool robustAccess = (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE);
-
-    *outContext = new gl::Context(config, clientVersion, shareContext, mRenderer, notifyResets, robustAccess);
-    return egl::Error(EGL_SUCCESS);
</del><ins>+StreamImpl *DisplayGL::createStream(const egl::AttributeMap &amp;attribs)
+{
+    UNREACHABLE();
+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> egl::Error DisplayGL::makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context)
</span><span class="lines">@@ -62,4 +80,10 @@
</span><span class="cx">     return glDrawSurface-&gt;makeCurrent();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const gl::Version &amp;DisplayGL::getMaxSupportedESVersion() const
+{
+    ASSERT(mRenderer != nullptr);
+    return mRenderer-&gt;getMaxSupportedESVersion();
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglDisplayGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/DisplayGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/DisplayGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/DisplayGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -26,11 +26,24 @@
</span><span class="cx">     egl::Error initialize(egl::Display *display) override;
</span><span class="cx">     void terminate() override;
</span><span class="cx"> 
</span><del>-    egl::Error createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &amp;attribs,
-                             gl::Context **outContext) override;
</del><ins>+    ImageImpl *createImage(EGLenum target,
+                           egl::ImageSibling *buffer,
+                           const egl::AttributeMap &amp;attribs) override;
</ins><span class="cx"> 
</span><ins>+    gl::Context *createContext(const egl::Config *config,
+                               const gl::Context *shareContext,
+                               const egl::AttributeMap &amp;attribs) override;
+
+    StreamImpl *createStream(const egl::AttributeMap &amp;attribs) override;
+
</ins><span class="cx">     egl::Error makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context) override;
</span><span class="cx"> 
</span><ins>+    virtual egl::Error getDriverVersion(std::string *version) const = 0;
+
+  protected:
+    RendererGL *getRenderer() const { return mRenderer; };
+    const gl::Version &amp;getMaxSupportedESVersion() const;
+
</ins><span class="cx">   private:
</span><span class="cx">     virtual const FunctionsGL *getFunctionsGL() const = 0;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglFeatureSupportGLmd"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FeatureSupportGL.md (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FeatureSupportGL.md                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FeatureSupportGL.md        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,107 @@
</span><ins>+# ANGLE RendererGL feature support
+Documentation of OpenGL ES and EGL features, caps and formats and required extensions.
+
+## OpenGL ES Feature Support
+|Feature|OpenGL version|OpenGL extension|OpenGL ES version|OpenGL ES extension|Notes|
+|---|---|---|---|---|---|
+|Framebuffer/renderbuffer objects|3.0|[GL_EXT_framebuffer_object](https://www.opengl.org/registry/specs/EXT/framebuffer_object.txt)|2.0|--|Can potentially be emulated with Pbuffers but realistically this extension is always required.|
+|Blit framebuffer|3.0|[GL_EXT_framebuffer_blit](https://www.opengl.org/registry/specs/EXT/framebuffer_blit.txt)|3.0|[GL_ANGLE_framebuffer_blit](https://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_framebuffer_blit.txt) or [GL_NV_framebuffer_blit](https://www.khronos.org/registry/gles/extensions/NV/NV_framebuffer_blit.txt)||
+|Multisampling|3.0|[GL_EXT_framebuffer_multisample](https://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt)|3.0|[GL_EXT_multisampled_render_to_texture](https://www.khronos.org/registry/gles/extensions/EXT/EXT_multisampled_render_to_texture.txt) or [GL_ANGLE_framebuffer_multisample](https://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_framebuffer_multisample.txt)||
+|Depth textures|3.0|[GL_ARB_depth_texture](https://www.opengl.org/registry/specs/ARB/depth_texture.txt)|3.0|[GL_OES_depth_texture](https://www.khronos.org/registry/gles/extensions/OES/OES_depth_texture.txt) or [GL_ANGLE_depth_texture](https://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_depth_texture.txt)
+|Draw buffers (MRT)|2.0?|[GL_ARB_draw_buffers](https://www.opengl.org/registry/specs/ARB/draw_buffers.txt) or [GL_EXT_draw_buffers2](https://www.opengl.org/registry/specs/EXT/draw_buffers2.txt)|3.0|[GL_EXT_draw_buffers](https://www.khronos.org/registry/gles/extensions/EXT/EXT_draw_buffers.txt)||
+|3D textures|1.2|[GL_EXT_texture3D](https://www.opengl.org/registry/specs/EXT/texture3D.txt)|3.0|[GL_OES_texture_3D](https://www.khronos.org/registry/gles/extensions/OES/OES_texture_3D.txt)||
+|Array textures|3.0|[GL_EXT_texture_array](https://www.opengl.org/registry/specs/EXT/texture_array.txt)|3.0|--||
+|Texture storage|4.2|[GL_EXT_texture_storage](https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_storage.txt)|3.0|[GL_EXT_texture_storage](https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_storage.txt)|Can be emulated with TexImage calls.|
+|Uniform buffer object|3.1|[GL_ARB_uniform_buffer_object](https://www.opengl.org/registry/specs/ARB/uniform_buffer_object.txt)|3.0|--||
+|Sync objects|3.2|[GL_ARB_sync](https://www.opengl.org/registry/specs/ARB/sync.txt)|3.0|--||
+|Fence objects|--|[GL_NV_fence](https://www.opengl.org/registry/specs/NV/fence.txt)|--|[GL_NV_fence](https://www.opengl.org/registry/specs/NV/fence.txt)||
+|MapBuffer|1.5|--|--|[GL_OES_mapbuffer](https://www.khronos.org/registry/gles/extensions/OES/OES_mapbuffer.txt)||
+|MapBufferRange|3.0|[GL_ARB_map_buffer_range](https://www.opengl.org/registry/specs/ARB/map_buffer_range.txt)|3.0|[GL_EXT_map_buffer_range](https://www.khronos.org/registry/gles/extensions/EXT/EXT_map_buffer_range.txt)||
+|Transform feedback|3.0|[GL_EXT_transform_feedback](GL_EXT_transform_feedback) or [GL_EXT_transform_feedback2](http://developer.download.nvidia.com/opengl/specs/GL_EXT_transform_feedback2.txt) or [GL_ARB_transform_feedback3](https://www.opengl.org/registry/specs/ARB/transform_feedback3.txt)|3.0|--||
+|Sampler object|3.3|[GL_ARB_sampler_objects](https://www.opengl.org/registry/specs/ARB/sampler_objects.txt)|3.0|--||
+|Occlusion query|1.5|[GL_ARB_occlusion_query](https://www.opengl.org/registry/specs/ARB/occlusion_query.txt)|2.0|--||
+|Timer query|3.3|[GL_ARB_timer_query](https://www.opengl.org/registry/specs/ARB/timer_query.txt)|--|[GL_EXT_disjoint_timer_query](https://www.khronos.org/registry/gles/extensions/EXT/EXT_disjoint_timer_query.txt)||
+|Vertex array object|3.0|[GL_ARB_vertex_array_object](https://www.opengl.org/registry/specs/ARB/vertex_array_object.txt)|3.0|[GL_OES_vertex_array_object](https://www.khronos.org/registry/gles/extensions/OES/OES_vertex_array_object.txt)|Can be emulated but costsmany extra API calls.  Virtualized contexts also require some kind of emulation of the default attribute state.|
+|Anisotropic filtering|--|[GL_EXT_texture_filter_anisotropic](https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt)|--|[GL_EXT_texture_filter_anisotropic](https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt)|Ubiquitous extension.|
+
+## OpenGL ES Caps
+|Cap(s)|OpenGL version|OpenGL extension|OpenGL ES version|OpenGL ES extension|Notes|
+|---|---|---|---|---|---|
+|GL_MAX_ELEMENT_INDEX|4.3|[GL_ARB_ES3_compatibility](https://www.opengl.org/registry/specs/ARB/ES3_compatibility.txt)|3.0|--|Seems pretty safe to use an arbitrary limit, all implementations tested return 0xFFFFFFFF.|
+|GL_MAX_3D_TEXTURE_SIZE|1.2|[GL_EXT_texture3D](https://www.opengl.org/registry/specs/EXT/texture3D.txt)|3.0|[GL_OES_texture_3D](https://www.khronos.org/registry/gles/extensions/OES/OES_texture_3D.txt)||
+|GL_MAX_TEXTURE_SIZE|1.0|--|2.0|--||
+|GL_MAX_CUBE_MAP_TEXTURE_SIZE|1.3|--|2.0||
+|GL_MAX_ARRAY_TEXTURE_LAYERS|3.0|[GL_EXT_texture_array](https://www.opengl.org/registry/specs/EXT/texture_array.txt)|3.0|--||
+|GL_MAX_TEXTURE_LOD_BIAS|1.5|[GL_EXT_texture_lod_bias](https://www.opengl.org/registry/specs/EXT/texture_lod_bias.txt)|3.0|--||
+|GL_MAX_RENDERBUFFER_SIZE GL_MAX_COLOR_ATTACHMENTS|3.0|[GL_EXT_framebuffer_object](https://www.opengl.org/registry/specs/EXT/framebuffer_object.txt) |2.0|--||
+|GL_MAX_DRAW_BUFFERS|2.0?|[GL_ARB_draw_buffers](https://www.opengl.org/registry/specs/ARB/draw_buffers.txt) or [GL_EXT_draw_buffers2](https://www.opengl.org/registry/specs/EXT/draw_buffers2.txt)|3.0|[GL_EXT_draw_buffers](https://www.khronos.org/registry/gles/extensions/EXT/EXT_draw_buffers.txt)||
+|GL_MAX_VIEWPORT_DIMS|1.0|--|2.0|--||
+|GL_ALIASED_POINT_SIZE_RANGE|1.0?|--|2.0|--||
+|GL_ALIASED_LINE_WIDTH_RANGE|1.2|--|2.0|--||
+|GL_ALIASED_LINE_WIDTH_RANGE|1.2|--|2.0|--||
+|GL_MAX_ELEMENTS_INDICES|1.2|--|3.0|--||
+|GL_MAX_ELEMENTS_VERTICES|1.2|--|3.0|--||
+|Shader format precision (glGetShaderPrecisionFormat)|4.1|[GL_ARB_ES2_compatibility](https://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt)|2.0|--|Can use reasonable default values (IEEE float and twos complement integer).|
+|GL_MAX_VERTEX_ATTRIBS|2.0|--|2.0|--||
+|GL_MAX_VERTEX_UNIFORM_COMPONENTS|2.0|--|2.0|--||
+|GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS|2.0|--|2.0|--||
+|GL_MAX_VERTEX_UNIFORM_VECTORS GL_MAX_FRAGMENT_UNIFORM_VECTORS|4.1|[GL_ARB_ES2_compatibility](https://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt)|2.0|--|Defined as GL_MAX_VERTEX_UNIFORM_COMPONENTS / 4 and GL_MAX_FRAGMENT_UNIFORM_COMPONENTS / 4.  Can simply use those values when the cap is not available.|
+|GL_MAX_VERTEX_UNIFORM_BLOCKS GL_MAX_FRAGMENT_UNIFORM_BLOCKS GL_MAX_UNIFORM_BUFFER_BINDINGS GL_MAX_UNIFORM_BLOCK_SIZE GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT GL_MAX_COMBINED_UNIFORM_BLOCKS GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS |3.1|[GL_ARB_uniform_buffer_object](https://www.opengl.org/registry/specs/ARB/uniform_buffer_object.txt)|3.0|--||
+|GL_MAX_VERTEX_OUTPUT_COMPONENTS|3.2|--|3.0|--|Doesn't seem to be a desktop extension for this cap, it may be possible to use the minimum ES3 value (64) if lower than GL 3.2.|
+|GL_MAX_FRAGMENT_UNIFORM_COMPONENTS|2.0|--|2.0|--||
+|GL_MAX_TEXTURE_IMAGE_UNITS|2.0|--|2.0|--||
+|GL_MAX_FRAGMENT_INPUT_COMPONENTS|3.2|--|3.0|--|Doesn't seem to be a desktop extension for this cap either, it may be possible to use the minimum ES3 value (60) if lower than GL 3.2.|
+|GL_MIN_PROGRAM_TEXEL_OFFSET GL_MAX_PROGRAM_TEXEL_OFFSET|3.0|--|3.0|--|Could potentially be emulated in the shader by adding the offsets in normalized texture coordinates before sampling.|
+|GL_MAX_VARYING_COMPONENTS|3.0|[GL_ARB_ES3_compatibility](https://www.opengl.org/registry/specs/ARB/ES3_compatibility.txt)|3.0|--|Was depricated in the OpenGL core spec but re-added in GL_ARB_ES3_compatibility|
+|GL_MAX_VARYING_VECTORS|4.1|[GL_ARB_ES2_compatibility](https://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt)|2.0|--|Defined as GL_MAX_VARYING_COMPONENTS / 4.|
+|GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS|3.0|[GL_EXT_transform_feedback](GL_EXT_transform_feedback) or [GL_EXT_transform_feedback2](http://developer.download.nvidia.com/opengl/specs/GL_EXT_transform_feedback2.txt) or [GL_ARB_transform_feedback3](https://www.opengl.org/registry/specs/ARB/transform_feedback3.txt)|3.0|--
+|GL_MAX_SAMPLES|3.0|[GL_EXT_framebuffer_multisample](https://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt)|3.0|[GL_EXT_multisampled_render_to_texture](https://www.khronos.org/registry/gles/extensions/EXT/EXT_multisampled_render_to_texture.txt) or [GL_ANGLE_framebuffer_multisample](https://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_framebuffer_multisample.txt)||
+|GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT|--|[GL_EXT_texture_filter_anisotropic](https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt)|--|[GL_EXT_texture_filter_anisotropic](https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt)|Ubiquitous extension.|
+|IMPLEMENTATION_COLOR_READ_FORMAT IMPLEMENTATION_COLOR_READ_TYPE|--|[GL_ARB_ES2_compatibility](https://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt)|2.0|--|Desktop GL doesn't as many limitations as ES for ReadPixels, can either always return GL_RGBA/GL_UNSIGNED_BYTE or return the format and type of the read buffer.|
+
+##OpenGL ES Formats (TODO)
+|Format|OpenGL version|OpenGL extension|OpenGL ES version|OpenGL ES extension|Notes|
+|---|---|---|---|---|---|
+|GL_RGBA8&lt;br&gt;GL_RGB8 |1.0|--|3.0|[GL_OES_rgb8_rgba8](https://www.khronos.org/registry/gles/extensions/OES/OES_rgb8_rgba8.txt)||
+
+## ESSL Features (TODO)
+|Feature|GLSL version|Notes|
+|---|---|---|
+|Unsigned integers|1.30||
+|Pack layout std140|1.40||
+
+## ESSL3 Builtins
+Builtins that are added going from ESSL1 to ESSL3.
+
+|Function|GLSL version|Extension|Notes|
+|---|---|---|---|
+|sinh&lt;br&gt;cosh&lt;br&gt;tanh&lt;br&gt;asinh&lt;br&gt;acosh|1.30|||
+|atanh|1.10|||
+|abs (genIType)|1.30|[GL_EXT_gpu_shader4](https://www.opengl.org/registry/specs/EXT/gpu_shader4.txt)||
+|sign (genIType)|1.50|[GL_EXT_gpu_shader4](https://www.opengl.org/registry/specs/EXT/gpu_shader4.txt)|Can be emulated easily.|
+|trunc|1.30|||
+|round&lt;br&gt;roundEven|1.30|||
+|min (genIType, genUType)&lt;br&gt;max (genIType, genUType)&lt;br&gt;clamp (genIType, genUType)|1.30||
+|mix (genBType)|4.50|[GL_EXT_shader_integer_mix](https://www.opengl.org/registry/specs/EXT/shader_integer_mix.txt)|Should be possible to emulate with a ternery operation.|
+|modf|1.30|||
+|isnan|1.30|||
+|isinf|1.10|||
+|floatBitsToInt&lt;br&gt;floatBitsToUint&lt;br&gt;intBitsToFloat&lt;br&gt;uintBitsToFloat|3.30|[GL_ARB_shader_bit_encoding](https://www.opengl.org/registry/specs/ARB/shader_bit_encoding.txt) or [ARB_gpu_shader5](https://www.opengl.org/registry/specs/ARB/gpu_shader5.txt)||
+|packSnorm2x16&lt;br&gt;packHalf2x16&lt;br&gt;unpackSnorm2x16&lt;br&gt;unpackHalf2x16|4.20|[GL_ARB_shading_language_packing](https://www.opengl.org/registry/specs/ARB/shading_language_packing.txt)|Can be emulated using bit casting functions.|
+|packUnorm2x16&lt;br&gt;unpackUnorm2x16|4.10|[GL_ARB_shading_language_packing](https://www.opengl.org/registry/specs/ARB/shading_language_packing.txt)|Can be emulated using bit casting functions.|
+|matrixCompMult (NxM matrices)|1.10|||
+|outerProduct|1.20|||
+|transpose|1.20|||
+|determinant|1.50||Can be emulated.|
+|inverse|1.40||Can be emulated.|
+|lessThan (uvec)&lt;br&gt;lessThanEqual (uvec)&lt;br&gt;greaterThan (uvec)&lt;br&gt;greaterThanEqual (uvec)&lt;br&gt;equal (uvec)&lt;br&gt;notEqual (uvec)|1.30|||
+|texture&lt;br&gt;textureProj&lt;br&gt;textureLod&lt;br&gt;textureOffset&lt;br&gt;textureProjOffset&lt;br&gt;textureLodOffset&lt;br&gt;textureProjLod&lt;br&gt;textureProjLodOffset&lt;br&gt;texelFetch&lt;br&gt;texelFetchOffset&lt;br&gt;textureGrad&lt;br&gt;textureGradOffset&lt;br&gt;textureProjGrad&lt;br&gt;textureProjGradOffset&lt;br&gt;textureSize|1.30||Equivalent to texture2D, textureCube, etc|
+|dFdx&lt;br&gt;dFdy&lt;br&gt;fwidth|1.10||
+
+## EGL Feature Support (TODO)
+|Feature|EGL version|EGL extension|WGL core|WGL extension|GLX version|GLX extensions|Notes|
+|---|---|---|---|---|---|---|---|
+|Pbuffers|||No|[WGL_ARB_pbuffer](https://www.opengl.org/registry/specs/ARB/wgl_pbuffer.txt)||||
+|BindTexImage|||No|[WGL_ARB_render_texture](https://www.opengl.org/registry/specs/ARB/wgl_render_texture.txt)|||Possibly to emulate with OpenGL textures but not strictly required, it is possible only export EGL configs without EGL_BIND_TO_TEXTURE_RGB and EGL_BIND_TO_TEXTURE_RGBA. Bindable pbuffers may be required by Chrome though.|
+|Pixmaps||||||||
+|Swap control|||No|[WGL_EXT_swap_control](https://www.opengl.org/registry/specs/EXT/wgl_swap_control.txt)|No|[GLX_EXT_swap_control](https://www.opengl.org/registry/specs/EXT/swap_control.txt)||
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglFramebufferGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,6 +8,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/FramebufferGL.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/BitSetIterator.h&quot;
</ins><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Data.h&quot;
</span><span class="cx"> #include &quot;libANGLE/State.h&quot;
</span><span class="lines">@@ -18,39 +19,61 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/RenderbufferGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/TextureGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/WorkaroundsGL.h&quot;
+#include &quot;platform/Platform.h&quot;
</ins><span class="cx"> 
</span><ins>+using namespace gl;
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-FramebufferGL::FramebufferGL(const gl::Framebuffer::Data &amp;data, const FunctionsGL *functions, StateManagerGL *stateManager, bool isDefault)
</del><ins>+FramebufferGL::FramebufferGL(const Framebuffer::Data &amp;data,
+                             const FunctionsGL *functions,
+                             StateManagerGL *stateManager,
+                             const WorkaroundsGL &amp;workarounds,
+                             bool isDefault)
</ins><span class="cx">     : FramebufferImpl(data),
</span><span class="cx">       mFunctions(functions),
</span><span class="cx">       mStateManager(stateManager),
</span><del>-      mFramebufferID(0)
</del><ins>+      mWorkarounds(workarounds),
+      mFramebufferID(0),
+      mIsDefault(isDefault)
</ins><span class="cx"> {
</span><del>-    if (!isDefault)
</del><ins>+    if (!mIsDefault)
</ins><span class="cx">     {
</span><span class="cx">         mFunctions-&gt;genFramebuffers(1, &amp;mFramebufferID);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+FramebufferGL::FramebufferGL(GLuint id,
+                             const Framebuffer::Data &amp;data,
+                             const FunctionsGL *functions,
+                             const WorkaroundsGL &amp;workarounds,
+                             StateManagerGL *stateManager)
+    : FramebufferImpl(data),
+      mFunctions(functions),
+      mStateManager(stateManager),
+      mWorkarounds(workarounds),
+      mFramebufferID(id),
+      mIsDefault(true)
+{
+}
+
</ins><span class="cx"> FramebufferGL::~FramebufferGL()
</span><span class="cx"> {
</span><del>-    if (mFramebufferID != 0)
-    {
-        mFunctions-&gt;deleteFramebuffers(1, &amp;mFramebufferID);
-        mFramebufferID = 0;
-    }
</del><ins>+    mStateManager-&gt;deleteFramebuffer(mFramebufferID);
+    mFramebufferID = 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void BindFramebufferAttachment(const FunctionsGL *functions, GLenum attachmentPoint,
-                                      const gl::FramebufferAttachment *attachment)
</del><ins>+static void BindFramebufferAttachment(const FunctionsGL *functions,
+                                      GLenum attachmentPoint,
+                                      const FramebufferAttachment *attachment)
</ins><span class="cx"> {
</span><span class="cx">     if (attachment)
</span><span class="cx">     {
</span><span class="cx">         if (attachment-&gt;type() == GL_TEXTURE)
</span><span class="cx">         {
</span><del>-            const gl::Texture *texture = attachment-&gt;getTexture();
</del><ins>+            const Texture *texture     = attachment-&gt;getTexture();
</ins><span class="cx">             const TextureGL *textureGL = GetImplAs&lt;TextureGL&gt;(texture);
</span><span class="cx"> 
</span><span class="cx">             if (texture-&gt;getTarget() == GL_TEXTURE_2D)
</span><span class="lines">@@ -75,7 +98,7 @@
</span><span class="cx">         }
</span><span class="cx">         else if (attachment-&gt;type() == GL_RENDERBUFFER)
</span><span class="cx">         {
</span><del>-            const gl::Renderbuffer *renderbuffer = attachment-&gt;getRenderbuffer();
</del><ins>+            const Renderbuffer *renderbuffer     = attachment-&gt;getRenderbuffer();
</ins><span class="cx">             const RenderbufferGL *renderbufferGL = GetImplAs&lt;RenderbufferGL&gt;(renderbuffer);
</span><span class="cx"> 
</span><span class="cx">             functions-&gt;framebufferRenderbuffer(GL_FRAMEBUFFER, attachmentPoint, GL_RENDERBUFFER,
</span><span class="lines">@@ -93,206 +116,280 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FramebufferGL::onUpdateColorAttachment(size_t index)
</del><ins>+Error FramebufferGL::discard(size_t count, const GLenum *attachments)
</ins><span class="cx"> {
</span><del>-    if (mFramebufferID != 0)
-    {
-        mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
-        BindFramebufferAttachment(mFunctions,
-                                  GL_COLOR_ATTACHMENT0 + index,
-                                  mData.getColorAttachment(static_cast&lt;unsigned int&gt;(index)));
-    }
</del><ins>+    UNIMPLEMENTED();
+    return Error(GL_INVALID_OPERATION);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FramebufferGL::onUpdateDepthAttachment()
</del><ins>+Error FramebufferGL::invalidate(size_t count, const GLenum *attachments)
</ins><span class="cx"> {
</span><del>-    if (mFramebufferID != 0)
-    {
-        mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
-        BindFramebufferAttachment(mFunctions,
-                                  GL_DEPTH_ATTACHMENT,
-                                  mData.getDepthAttachment());
-    }
-}
-
-void FramebufferGL::onUpdateStencilAttachment()
-{
-    if (mFramebufferID != 0)
-    {
-        mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
-        BindFramebufferAttachment(mFunctions,
-                                  GL_STENCIL_ATTACHMENT,
-                                  mData.getStencilAttachment());
-    }
-}
-
-void FramebufferGL::onUpdateDepthStencilAttachment()
-{
-    if (mFramebufferID != 0)
-    {
-        mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
-        BindFramebufferAttachment(mFunctions,
-                                  GL_DEPTH_STENCIL_ATTACHMENT,
-                                  mData.getDepthStencilAttachment());
-    }
-}
-
-void FramebufferGL::setDrawBuffers(size_t count, const GLenum *buffers)
-{
-    if (mFramebufferID != 0)
-    {
-        mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
-        mFunctions-&gt;drawBuffers(count, buffers);
-    }
-}
-
-void FramebufferGL::setReadBuffer(GLenum buffer)
-{
-    if (mFramebufferID != 0)
-    {
-        mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
-        mFunctions-&gt;readBuffer(buffer);
-    }
-}
-
-gl::Error FramebufferGL::invalidate(size_t count, const GLenum *attachments)
-{
</del><span class="cx">     // Since this function is just a hint and not available until OpenGL 4.3, only call it if it is available.
</span><span class="cx">     if (mFunctions-&gt;invalidateFramebuffer)
</span><span class="cx">     {
</span><span class="cx">         mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
</span><del>-        mFunctions-&gt;invalidateFramebuffer(GL_FRAMEBUFFER, count, attachments);
</del><ins>+        mFunctions-&gt;invalidateFramebuffer(GL_FRAMEBUFFER, static_cast&lt;GLsizei&gt;(count), attachments);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferGL::invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &amp;area)
</del><ins>+Error FramebufferGL::invalidateSub(size_t count,
+                                   const GLenum *attachments,
+                                   const gl::Rectangle &amp;area)
</ins><span class="cx"> {
</span><span class="cx">     // Since this function is just a hint and not available until OpenGL 4.3, only call it if it is available.
</span><span class="cx">     if (mFunctions-&gt;invalidateSubFramebuffer)
</span><span class="cx">     {
</span><span class="cx">         mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
</span><del>-        mFunctions-&gt;invalidateSubFramebuffer(GL_FRAMEBUFFER, count, attachments, area.x, area.y, area.width, area.height);
</del><ins>+        mFunctions-&gt;invalidateSubFramebuffer(GL_FRAMEBUFFER, static_cast&lt;GLsizei&gt;(count),
+                                             attachments, area.x, area.y, area.width, area.height);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferGL::clear(const gl::Data &amp;data, GLbitfield mask)
</del><ins>+Error FramebufferGL::clear(const Data &amp;data, GLbitfield mask)
</ins><span class="cx"> {
</span><del>-    mStateManager-&gt;setClearState(*data.state, mask);
</del><ins>+    syncClearState(mask);
</ins><span class="cx">     mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
</span><span class="cx">     mFunctions-&gt;clear(mask);
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static GLbitfield GetClearBufferMask(GLenum buffer)
</del><ins>+Error FramebufferGL::clearBufferfv(const Data &amp;data,
+                                   GLenum buffer,
+                                   GLint drawbuffer,
+                                   const GLfloat *values)
</ins><span class="cx"> {
</span><del>-    switch (buffer)
-    {
-      case GL_COLOR:          return GL_COLOR_BUFFER_BIT;
-      case GL_DEPTH:          return GL_DEPTH_BUFFER_BIT;
-      case GL_STENCIL:        return GL_STENCIL_BUFFER_BIT;
-      case GL_DEPTH_STENCIL:  return GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
-      default: UNREACHABLE(); return 0;
-    }
-}
-
-gl::Error FramebufferGL::clearBufferfv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLfloat *values)
-{
-    mStateManager-&gt;setClearState(state, GetClearBufferMask(buffer));
</del><ins>+    syncClearBufferState(buffer, drawbuffer);
</ins><span class="cx">     mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
</span><span class="cx">     mFunctions-&gt;clearBufferfv(buffer, drawbuffer, values);
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferGL::clearBufferuiv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLuint *values)
</del><ins>+Error FramebufferGL::clearBufferuiv(const Data &amp;data,
+                                    GLenum buffer,
+                                    GLint drawbuffer,
+                                    const GLuint *values)
</ins><span class="cx"> {
</span><del>-    mStateManager-&gt;setClearState(state, GetClearBufferMask(buffer));
</del><ins>+    syncClearBufferState(buffer, drawbuffer);
</ins><span class="cx">     mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
</span><span class="cx">     mFunctions-&gt;clearBufferuiv(buffer, drawbuffer, values);
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferGL::clearBufferiv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLint *values)
</del><ins>+Error FramebufferGL::clearBufferiv(const Data &amp;data,
+                                   GLenum buffer,
+                                   GLint drawbuffer,
+                                   const GLint *values)
</ins><span class="cx"> {
</span><del>-    mStateManager-&gt;setClearState(state, GetClearBufferMask(buffer));
</del><ins>+    syncClearBufferState(buffer, drawbuffer);
</ins><span class="cx">     mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
</span><span class="cx">     mFunctions-&gt;clearBufferiv(buffer, drawbuffer, values);
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferGL::clearBufferfi(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
</del><ins>+Error FramebufferGL::clearBufferfi(const Data &amp;data,
+                                   GLenum buffer,
+                                   GLint drawbuffer,
+                                   GLfloat depth,
+                                   GLint stencil)
</ins><span class="cx"> {
</span><del>-    mStateManager-&gt;setClearState(state, GetClearBufferMask(buffer));
</del><ins>+    syncClearBufferState(buffer, drawbuffer);
</ins><span class="cx">     mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
</span><span class="cx">     mFunctions-&gt;clearBufferfi(buffer, drawbuffer, depth, stencil);
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLenum FramebufferGL::getImplementationColorReadFormat() const
</span><span class="cx"> {
</span><del>-    const gl::FramebufferAttachment *readAttachment = getData().getReadAttachment();
</del><ins>+    const FramebufferAttachment *readAttachment = getData().getReadAttachment();
</ins><span class="cx">     GLenum internalFormat = readAttachment-&gt;getInternalFormat();
</span><del>-    const gl::InternalFormat &amp;internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
</del><ins>+    const InternalFormat &amp;internalFormatInfo    = GetInternalFormatInfo(internalFormat);
</ins><span class="cx">     return internalFormatInfo.format;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLenum FramebufferGL::getImplementationColorReadType() const
</span><span class="cx"> {
</span><del>-    const gl::FramebufferAttachment *readAttachment = getData().getReadAttachment();
</del><ins>+    const FramebufferAttachment *readAttachment = getData().getReadAttachment();
</ins><span class="cx">     GLenum internalFormat = readAttachment-&gt;getInternalFormat();
</span><del>-    const gl::InternalFormat &amp;internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
</del><ins>+    const InternalFormat &amp;internalFormatInfo    = GetInternalFormatInfo(internalFormat);
</ins><span class="cx">     return internalFormatInfo.type;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferGL::readPixels(const gl::State &amp;state, const gl::Rectangle &amp;area, GLenum format, GLenum type, GLvoid *pixels) const
</del><ins>+Error FramebufferGL::readPixels(const State &amp;state,
+                                const gl::Rectangle &amp;area,
+                                GLenum format,
+                                GLenum type,
+                                GLvoid *pixels) const
</ins><span class="cx"> {
</span><del>-    const gl::PixelPackState &amp;packState = state.getPackState();
</del><ins>+    // TODO: don't sync the pixel pack state here once the dirty bits contain the pixel pack buffer
+    // binding
+    const PixelPackState &amp;packState = state.getPackState();
+    mStateManager-&gt;setPixelPackState(packState);
</ins><span class="cx"> 
</span><del>-    // TODO: set pack state
-    if (packState.rowLength != 0 || packState.skipRows != 0 || packState.skipPixels != 0)
-    {
-        UNIMPLEMENTED();
-        return gl::Error(GL_INVALID_OPERATION, &quot;invalid pixel store parameters in readPixels&quot;);
-    }
-
</del><span class="cx">     mStateManager-&gt;bindFramebuffer(GL_READ_FRAMEBUFFER, mFramebufferID);
</span><span class="cx">     mFunctions-&gt;readPixels(area.x, area.y, area.width, area.height, format, type, pixels);
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error FramebufferGL::blit(const gl::State &amp;state, const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea,
-                              GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer)
</del><ins>+Error FramebufferGL::blit(const State &amp;state,
+                          const gl::Rectangle &amp;sourceArea,
+                          const gl::Rectangle &amp;destArea,
+                          GLbitfield mask,
+                          GLenum filter,
+                          const Framebuffer *sourceFramebuffer)
</ins><span class="cx"> {
</span><span class="cx">     const FramebufferGL *sourceFramebufferGL = GetImplAs&lt;FramebufferGL&gt;(sourceFramebuffer);
</span><span class="cx"> 
</span><span class="cx">     mStateManager-&gt;bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL-&gt;getFramebufferID());
</span><span class="cx">     mStateManager-&gt;bindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebufferID);
</span><span class="cx"> 
</span><del>-    mFunctions-&gt;blitFramebuffer(sourceArea.x, sourceArea.y, sourceArea.x + sourceArea.width, sourceArea.y + sourceArea.height,
-                                destArea.x, destArea.y, destArea.x + destArea.width, destArea.y + destArea.height,
-                                mask, filter);
</del><ins>+    mFunctions-&gt;blitFramebuffer(sourceArea.x, sourceArea.y, sourceArea.x1(), sourceArea.y1(),
+                                destArea.x, destArea.y, destArea.x1(), destArea.y1(), mask, filter);
</ins><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLenum FramebufferGL::checkStatus() const
</del><ins>+bool FramebufferGL::checkStatus() const
</ins><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
</span><del>-    return mFunctions-&gt;checkFramebufferStatus(GL_FRAMEBUFFER);
</del><ins>+    GLenum status = mFunctions-&gt;checkFramebufferStatus(GL_FRAMEBUFFER);
+    if (status != GL_FRAMEBUFFER_COMPLETE)
+    {
+        ANGLEPlatformCurrent()-&gt;logWarning(&quot;GL framebuffer returned incomplete.&quot;);
+    }
+    return (status == GL_FRAMEBUFFER_COMPLETE);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void FramebufferGL::syncState(const Framebuffer::DirtyBits &amp;dirtyBits)
+{
+    // Don't need to sync state for the default FBO.
+    if (mIsDefault)
+    {
+        return;
+    }
+
+    mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
+
+    for (auto dirtyBit : angle::IterateBitSet(dirtyBits))
+    {
+        switch (dirtyBit)
+        {
+            case Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT:
+                BindFramebufferAttachment(mFunctions, GL_DEPTH_ATTACHMENT,
+                                          mData.getDepthAttachment());
+                break;
+            case Framebuffer::DIRTY_BIT_STENCIL_ATTACHMENT:
+                BindFramebufferAttachment(mFunctions, GL_STENCIL_ATTACHMENT,
+                                          mData.getStencilAttachment());
+                break;
+            case Framebuffer::DIRTY_BIT_DRAW_BUFFERS:
+            {
+                const auto &amp;drawBuffers = mData.getDrawBufferStates();
+                mFunctions-&gt;drawBuffers(static_cast&lt;GLsizei&gt;(drawBuffers.size()),
+                                        drawBuffers.data());
+                break;
+            }
+            case Framebuffer::DIRTY_BIT_READ_BUFFER:
+                mFunctions-&gt;readBuffer(mData.getReadBufferState());
+                break;
+            default:
+            {
+                ASSERT(Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 == 0 &amp;&amp;
+                       dirtyBit &lt; Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX);
+                size_t index =
+                    static_cast&lt;size_t&gt;(dirtyBit - Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0);
+                BindFramebufferAttachment(mFunctions,
+                                          static_cast&lt;GLenum&gt;(GL_COLOR_ATTACHMENT0 + index),
+                                          mData.getColorAttachment(index));
+                break;
+            }
+        }
+    }
+}
+
</ins><span class="cx"> GLuint FramebufferGL::getFramebufferID() const
</span><span class="cx"> {
</span><span class="cx">     return mFramebufferID;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void FramebufferGL::syncDrawState() const
+{
+    if (mFunctions-&gt;standard == STANDARD_GL_DESKTOP)
+    {
+        // Enable SRGB blending for all framebuffers except the default framebuffer on Desktop
+        // OpenGL.
+        // When SRGB blending is enabled, only SRGB capable formats will use it but the default
+        // framebuffer will always use it if it is enabled.
+        // TODO(geofflang): Update this when the framebuffer binding dirty changes, when it exists.
+        mStateManager-&gt;setFramebufferSRGBEnabled(!mIsDefault);
+    }
</ins><span class="cx"> }
</span><ins>+
+void FramebufferGL::syncClearState(GLbitfield mask)
+{
+    if (mFunctions-&gt;standard == STANDARD_GL_DESKTOP)
+    {
+        if (mWorkarounds.doesSRGBClearsOnLinearFramebufferAttachments &amp;&amp;
+            (mask &amp; GL_COLOR_BUFFER_BIT) != 0 &amp;&amp; !mIsDefault)
+        {
+            bool hasSRBAttachment = false;
+            for (const auto &amp;attachment : mData.getColorAttachments())
+            {
+                if (attachment.isAttached() &amp;&amp; attachment.getColorEncoding() == GL_SRGB)
+                {
+                    hasSRBAttachment = true;
+                    break;
+                }
+            }
+
+            mStateManager-&gt;setFramebufferSRGBEnabled(hasSRBAttachment);
+        }
+        else
+        {
+            mStateManager-&gt;setFramebufferSRGBEnabled(!mIsDefault);
+        }
+    }
+}
+
+void FramebufferGL::syncClearBufferState(GLenum buffer, GLint drawBuffer)
+{
+    if (mFunctions-&gt;standard == STANDARD_GL_DESKTOP)
+    {
+        if (mWorkarounds.doesSRGBClearsOnLinearFramebufferAttachments &amp;&amp; buffer == GL_COLOR &amp;&amp;
+            !mIsDefault)
+        {
+            // If doing a clear on a color buffer, set SRGB blend enabled only if the color buffer
+            // is an SRGB format.
+            const auto &amp;drawbufferState  = mData.getDrawBufferStates();
+            const auto &amp;colorAttachments = mData.getColorAttachments();
+
+            const FramebufferAttachment *attachment = nullptr;
+            if (drawbufferState[drawBuffer] &gt;= GL_COLOR_ATTACHMENT0 &amp;&amp;
+                drawbufferState[drawBuffer] &lt; GL_COLOR_ATTACHMENT0 + colorAttachments.size())
+            {
+                size_t attachmentIdx =
+                    static_cast&lt;size_t&gt;(drawbufferState[drawBuffer] - GL_COLOR_ATTACHMENT0);
+                attachment = &amp;colorAttachments[attachmentIdx];
+            }
+
+            if (attachment != nullptr)
+            {
+                mStateManager-&gt;setFramebufferSRGBEnabled(attachment-&gt;getColorEncoding() == GL_SRGB);
+            }
+        }
+        else
+        {
+            mStateManager-&gt;setFramebufferSRGBEnabled(!mIsDefault);
+        }
+    }
+}
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglFramebufferGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,29 +16,48 @@
</span><span class="cx"> 
</span><span class="cx"> class FunctionsGL;
</span><span class="cx"> class StateManagerGL;
</span><ins>+struct WorkaroundsGL;
</ins><span class="cx"> 
</span><span class="cx"> class FramebufferGL : public FramebufferImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    FramebufferGL(const gl::Framebuffer::Data &amp;data, const FunctionsGL *functions, StateManagerGL *stateManager, bool isDefault);
</del><ins>+    FramebufferGL(const gl::Framebuffer::Data &amp;data,
+                  const FunctionsGL *functions,
+                  StateManagerGL *stateManager,
+                  const WorkaroundsGL &amp;workarounds,
+                  bool isDefault);
+    // Constructor called when we need to create a FramebufferGL from an
+    // existing framebuffer name, for example for the default framebuffer
+    // on the Mac EGL CGL backend.
+    FramebufferGL(GLuint id,
+                  const gl::Framebuffer::Data &amp;data,
+                  const FunctionsGL *functions,
+                  const WorkaroundsGL &amp;workarounds,
+                  StateManagerGL *stateManager);
</ins><span class="cx">     ~FramebufferGL() override;
</span><span class="cx"> 
</span><del>-    void onUpdateColorAttachment(size_t index) override;
-    void onUpdateDepthAttachment() override;
-    void onUpdateStencilAttachment() override;
-    void onUpdateDepthStencilAttachment() override;
-
-    void setDrawBuffers(size_t count, const GLenum *buffers) override;
-    void setReadBuffer(GLenum buffer) override;
-
</del><ins>+    gl::Error discard(size_t count, const GLenum *attachments) override;
</ins><span class="cx">     gl::Error invalidate(size_t count, const GLenum *attachments) override;
</span><span class="cx">     gl::Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &amp;area) override;
</span><span class="cx"> 
</span><span class="cx">     gl::Error clear(const gl::Data &amp;data, GLbitfield mask) override;
</span><del>-    gl::Error clearBufferfv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLfloat *values) override;
-    gl::Error clearBufferuiv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLuint *values) override;
-    gl::Error clearBufferiv(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, const GLint *values) override;
-    gl::Error clearBufferfi(const gl::State &amp;state, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) override;
</del><ins>+    gl::Error clearBufferfv(const gl::Data &amp;data,
+                            GLenum buffer,
+                            GLint drawbuffer,
+                            const GLfloat *values) override;
+    gl::Error clearBufferuiv(const gl::Data &amp;data,
+                             GLenum buffer,
+                             GLint drawbuffer,
+                             const GLuint *values) override;
+    gl::Error clearBufferiv(const gl::Data &amp;data,
+                            GLenum buffer,
+                            GLint drawbuffer,
+                            const GLint *values) override;
+    gl::Error clearBufferfi(const gl::Data &amp;data,
+                            GLenum buffer,
+                            GLint drawbuffer,
+                            GLfloat depth,
+                            GLint stencil) override;
</ins><span class="cx"> 
</span><span class="cx">     GLenum getImplementationColorReadFormat() const override;
</span><span class="cx">     GLenum getImplementationColorReadType() const override;
</span><span class="lines">@@ -47,15 +66,24 @@
</span><span class="cx">     gl::Error blit(const gl::State &amp;state, const gl::Rectangle &amp;sourceArea, const gl::Rectangle &amp;destArea,
</span><span class="cx">                    GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer) override;
</span><span class="cx"> 
</span><del>-    GLenum checkStatus() const override;
</del><ins>+    bool checkStatus() const override;
</ins><span class="cx"> 
</span><ins>+    void syncState(const gl::Framebuffer::DirtyBits &amp;dirtyBits) override;
+
+    void syncDrawState() const;
+
</ins><span class="cx">     GLuint getFramebufferID() const;
</span><span class="cx"> 
</span><span class="cx">   private:
</span><ins>+    void syncClearState(GLbitfield mask);
+    void syncClearBufferState(GLenum buffer, GLint drawBuffer);
+
</ins><span class="cx">     const FunctionsGL *mFunctions;
</span><span class="cx">     StateManagerGL *mStateManager;
</span><ins>+    const WorkaroundsGL &amp;mWorkarounds;
</ins><span class="cx"> 
</span><span class="cx">     GLuint mFramebufferID;
</span><ins>+    bool mIsDefault;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglFunctionsGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FunctionsGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FunctionsGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FunctionsGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,48 +10,32 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;algorithm&gt;
</span><span class="cx"> 
</span><ins>+#include &quot;common/string_utils.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/renderergl_utils.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-static void GetGLVersion(PFNGLGETSTRINGPROC getStringFunction, GLuint *outMajorVersion, GLuint *outMinorVersion,
-                         bool *outIsES)
</del><ins>+static void GetGLVersion(PFNGLGETSTRINGPROC getStringFunction, gl::Version *outVersion, StandardGL *outStandard)
</ins><span class="cx"> {
</span><span class="cx">     const std::string version = reinterpret_cast&lt;const char*&gt;(getStringFunction(GL_VERSION));
</span><span class="cx">     if (version.find(&quot;OpenGL ES&quot;) == std::string::npos)
</span><span class="cx">     {
</span><del>-        // ES spec states that the GL_VERSION string will be in the following format:
-        // &quot;OpenGL ES N.M vendor-specific information&quot;
-        *outIsES = false;
-        *outMajorVersion = version[0] - '0';
-        *outMinorVersion = version[2] - '0';
-    }
-    else
-    {
</del><span class="cx">         // OpenGL spec states the GL_VERSION string will be in the following format:
</span><span class="cx">         // &lt;version number&gt;&lt;space&gt;&lt;vendor-specific information&gt;
</span><span class="cx">         // The version number is either of the form major number.minor number or major
</span><span class="cx">         // number.minor number.release number, where the numbers all have one or more
</span><span class="cx">         // digits
</span><del>-        *outIsES = true;
-        *outMajorVersion = version[10] - '0';
-        *outMinorVersion = version[12] - '0';
</del><ins>+        *outStandard = STANDARD_GL_DESKTOP;
+        *outVersion = gl::Version(version[0] - '0', version[2] - '0');
</ins><span class="cx">     }
</span><del>-}
-
-static std::vector&lt;std::string&gt; GetNonIndexedExtensions(PFNGLGETSTRINGPROC getStringFunction)
-{
-    std::vector&lt;std::string&gt; result;
-
-    std::istringstream stream(reinterpret_cast&lt;const char*&gt;(getStringFunction(GL_EXTENSIONS)));
-    std::string extension;
-    while (std::getline(stream, extension, ' '))
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        result.push_back(extension);
</del><ins>+        // ES spec states that the GL_VERSION string will be in the following format:
+        // &quot;OpenGL ES N.M vendor-specific information&quot;
+        *outStandard = STANDARD_GL_ES;
+        *outVersion = gl::Version(version[10] - '0', version[12] - '0');
</ins><span class="cx">     }
</span><del>-
-    return result;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static std::vector&lt;std::string&gt; GetIndexedExtensions(PFNGLGETINTEGERVPROC getIntegerFunction, PFNGLGETSTRINGIPROC getStringIFunction)
</span><span class="lines">@@ -78,18 +62,25 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename T&gt;
</span><del>-static void AssignGLExtensionEntryPoint(const std::vector&lt;std::string&gt; &amp;extensions, const std::string &amp;extension, void *function, T *outFunction)
</del><ins>+static void AssignGLExtensionEntryPoint(const std::vector&lt;std::string&gt; &amp;extensions, const char *requiredExtensionString,
+                                        void *function, T *outFunction)
</ins><span class="cx"> {
</span><del>-    if (std::find(extensions.begin(), extensions.end(), extension) != extensions.end())
</del><ins>+    std::vector&lt;std::string&gt; requiredExtensions;
+    angle::SplitStringAlongWhitespace(requiredExtensionString, &amp;requiredExtensions);
+    for (const std::string&amp; requiredExtension : requiredExtensions)
</ins><span class="cx">     {
</span><del>-        *outFunction = reinterpret_cast&lt;T&gt;(function);
</del><ins>+        if (std::find(extensions.begin(), extensions.end(), requiredExtension) == extensions.end())
+        {
+            return;
+        }
</ins><span class="cx">     }
</span><ins>+
+    *outFunction = reinterpret_cast&lt;T&gt;(function);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FunctionsGL::FunctionsGL()
</span><del>-    : majorVersion(0),
-      minorVersion(0),
-      openGLES(false),
</del><ins>+    : version(),
+      standard(),
</ins><span class="cx">       extensions(),
</span><span class="cx"> 
</span><span class="cx">       blendFunc(nullptr),
</span><span class="lines">@@ -618,6 +609,7 @@
</span><span class="cx">       getDebugMessageLog(nullptr),
</span><span class="cx">       getFramebufferParameteriv(nullptr),
</span><span class="cx">       getInternalformati64v(nullptr),
</span><ins>+      getPointerv(nullptr),
</ins><span class="cx">       getObjectLabel(nullptr),
</span><span class="cx">       getObjectPtrLabel(nullptr),
</span><span class="cx">       getProgramInterfaceiv(nullptr),
</span><span class="lines">@@ -768,7 +760,11 @@
</span><span class="cx">       vertexArrayBindingDivisor(nullptr),
</span><span class="cx">       vertexArrayElementBuffer(nullptr),
</span><span class="cx">       vertexArrayVertexBuffer(nullptr),
</span><del>-      vertexArrayVertexBuffers(nullptr)
</del><ins>+      vertexArrayVertexBuffers(nullptr),
+      blendBarrier(nullptr),
+      primitiveBoundingBox(nullptr),
+      eglImageTargetRenderbufferStorageOES(nullptr),
+      eglImageTargetTexture2DOES(nullptr)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -780,22 +776,193 @@
</span><span class="cx"> {
</span><span class="cx">     // Grab the version number
</span><span class="cx">     AssignGLEntryPoint(loadProcAddress(&quot;glGetString&quot;), &amp;getString);
</span><del>-    GetGLVersion(getString, &amp;majorVersion, &amp;minorVersion, &amp;openGLES);
</del><ins>+    AssignGLEntryPoint(loadProcAddress(&quot;glGetIntegerv&quot;), &amp;getIntegerv);
+    GetGLVersion(getString, &amp;version, &amp;standard);
</ins><span class="cx"> 
</span><span class="cx">     // Grab the GL extensions
</span><del>-    if (majorVersion &gt;= 3)
</del><ins>+    if (isAtLeastGL(gl::Version(3, 0)) || isAtLeastGLES(gl::Version(3, 0)))
</ins><span class="cx">     {
</span><del>-        AssignGLEntryPoint(loadProcAddress(&quot;glGetIntegerv&quot;), &amp;getIntegerv);
</del><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glGetStringi&quot;), &amp;getStringi);
</span><span class="cx">         extensions = GetIndexedExtensions(getIntegerv, getStringi);
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        extensions = GetNonIndexedExtensions(getString);
</del><ins>+        const char *exts = reinterpret_cast&lt;const char*&gt;(getString(GL_EXTENSIONS));
+        angle::SplitStringAlongWhitespace(std::string(exts), &amp;extensions);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Load the entry points
+    switch (standard)
+    {
+        case STANDARD_GL_DESKTOP:
+            initializeProcsDesktopGL();
+            break;
+
+        case STANDARD_GL_ES:
+            initializeProcsGLES();
+            break;
+
+        default:
+            UNREACHABLE();
+            break;
+    }
+}
+
+void FunctionsGL::initializeProcsDesktopGL()
+{
+    // Check the context profile
+    profile = 0;
+    if (isAtLeastGL(gl::Version(3, 2)))
+    {
+        getIntegerv(GL_CONTEXT_PROFILE_MASK, &amp;profile);
+    }
+
+    // clang-format off
+
+    // Load extensions
+    // Even though extensions are written against specific versions of GL, many drivers expose the extensions
+    // in even older versions.  Always try loading the extensions regardless of GL version.
+
+    // GL_NV_fence
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glDeleteFencesNV&quot;), &amp;deleteFencesNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glGenFencesNV&quot;), &amp;genFencesNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glIsFenceNV&quot;), &amp;isFenceNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glTestFenceNV&quot;), &amp;testFenceNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glGetFenceivNV&quot;), &amp;getFenceivNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glFinishFenceNV&quot;), &amp;finishFenceNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glSetFenceNV&quot;), &amp;setFenceNV);
+
+    // GL_EXT_texture_storage
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_texture_storage&quot;, loadProcAddress(&quot;glTexStorage1DEXT&quot;), &amp;texStorage1D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_texture_storage&quot;, loadProcAddress(&quot;glTexStorage2DEXT&quot;), &amp;texStorage2D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_texture_storage GL_EXT_texture3D&quot;, loadProcAddress(&quot;glTexStorage3DEXT&quot;), &amp;texStorage3D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_texture_storage GL_EXT_direct_state_access&quot;, loadProcAddress(&quot;glTextureStorage1DEXT&quot;), &amp;textureStorage1D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_texture_storage GL_EXT_direct_state_access&quot;, loadProcAddress(&quot;glTextureStorage2DEXT&quot;), &amp;textureStorage2D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_texture_storage GL_EXT_direct_state_access GL_EXT_texture3D&quot;, loadProcAddress(&quot;glTextureStorage3DEXT&quot;), &amp;textureStorage3D);
+
+    // GL_ARB_vertex_array_object
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_vertex_array_object&quot;, loadProcAddress(&quot;glBindVertexArray&quot;), &amp;bindVertexArray);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_vertex_array_object&quot;, loadProcAddress(&quot;glDeleteVertexArrays&quot;), &amp;deleteVertexArrays);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_vertex_array_object&quot;, loadProcAddress(&quot;glGenVertexArrays&quot;), &amp;genVertexArrays);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_vertex_array_object&quot;, loadProcAddress(&quot;glIsVertexArray&quot;), &amp;isVertexArray);
+
+    // GL_ARB_sync
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glClientWaitSync&quot;), &amp;clientWaitSync);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glDeleteSync&quot;), &amp;deleteSync);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glFenceSync&quot;), &amp;fenceSync);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glGetInteger64i_v&quot;), &amp;getInteger64i_v);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glGetInteger64v&quot;), &amp;getInteger64v);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glGetSynciv&quot;), &amp;getSynciv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glIsSync&quot;), &amp;isSync);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glWaitSync&quot;), &amp;waitSync);
+
+    // GL_EXT_framebuffer_object
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glIsRenderbufferEXT&quot;), &amp;isRenderbuffer);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glBindRenderbufferEXT&quot;), &amp;bindRenderbuffer);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glDeleteRenderbuffersEXT&quot;), &amp;deleteRenderbuffers);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glGenRenderbuffersEXT&quot;), &amp;genRenderbuffers);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glRenderbufferStorageEXT&quot;), &amp;renderbufferStorage);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glGetRenderbufferParameterivEXT&quot;), &amp;getRenderbufferParameteriv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glIsFramebufferEXT&quot;), &amp;isFramebuffer);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glBindFramebufferEXT&quot;), &amp;bindFramebuffer);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glDeleteFramebuffersEXT&quot;), &amp;deleteFramebuffers);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glGenFramebuffersEXT&quot;), &amp;genFramebuffers);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glCheckFramebufferStatusEXT&quot;), &amp;checkFramebufferStatus);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glFramebufferTexture1DEXT&quot;), &amp;framebufferTexture1D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glFramebufferTexture2DEXT&quot;), &amp;framebufferTexture2D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glFramebufferTexture3DEXT&quot;), &amp;framebufferTexture3D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glFramebufferRenderbufferEXT&quot;), &amp;framebufferRenderbuffer);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glGetFramebufferAttachmentParameterivEXT&quot;), &amp;getFramebufferAttachmentParameteriv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_object&quot;, loadProcAddress(&quot;glGenerateMipmapEXT&quot;), &amp;generateMipmap);
+
+    // GL_EXT_framebuffer_blit
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_framebuffer_blit&quot;, loadProcAddress(&quot;glBlitFramebufferEXT&quot;), &amp;blitFramebuffer);
+
+    // GL_KHR_debug
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glDebugMessageControl&quot;), &amp;debugMessageControl);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glDebugMessageInsert&quot;), &amp;debugMessageInsert);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glDebugMessageCallback&quot;), &amp;debugMessageCallback);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glGetDebugMessageLog&quot;), &amp;getDebugMessageLog);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glGetPointerv&quot;), &amp;getPointerv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glPushDebugGroup&quot;), &amp;pushDebugGroup);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glPopDebugGroup&quot;), &amp;popDebugGroup);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glObjectLabel&quot;), &amp;objectLabel);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glGetObjectLabel&quot;), &amp;getObjectLabel);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glObjectPtrLabel&quot;), &amp;objectPtrLabel);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glGetObjectPtrLabel&quot;), &amp;getObjectPtrLabel);
+
+    // GL_ARB_internalformat_query
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_internalformat_query&quot;, loadProcAddress(&quot;glGetInternalformativ&quot;), &amp;getInternalformativ);
+
+    // GL_ARB_ES2_compatibility
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_ES2_compatibility&quot;, loadProcAddress(&quot;glReleaseShaderCompiler&quot;), &amp;releaseShaderCompiler);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_ES2_compatibility&quot;, loadProcAddress(&quot;glShaderBinary&quot;), &amp;shaderBinary);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_ES2_compatibility&quot;, loadProcAddress(&quot;glGetShaderPrecisionFormat&quot;), &amp;getShaderPrecisionFormat);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_ES2_compatibility&quot;, loadProcAddress(&quot;glDepthRangef&quot;), &amp;depthRangef);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_ES2_compatibility&quot;, loadProcAddress(&quot;glClearDepthf&quot;), &amp;clearDepthf);
+
+    // GL_ARB_instanced_arrays
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_instanced_arrays&quot;, loadProcAddress(&quot;glVertexAttribDivisorARB&quot;), &amp;vertexAttribDivisor);
+
+    // GL_EXT_draw_instanced
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_draw_instanced&quot;, loadProcAddress(&quot;glDrawArraysInstancedEXT&quot;), &amp;drawArraysInstanced);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_draw_instanced&quot;, loadProcAddress(&quot;glDrawElementsInstancedEXT&quot;), &amp;drawElementsInstanced);
+
+    // GL_ARB_draw_instanced
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_draw_instanced&quot;, loadProcAddress(&quot;glDrawArraysInstancedARB&quot;), &amp;drawArraysInstanced);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_draw_instanced&quot;, loadProcAddress(&quot;glDrawElementsInstancedARB&quot;), &amp;drawElementsInstanced);
+
+    // GL_ARB_sampler_objects
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glGenSamplers&quot;), &amp;genSamplers);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glDeleteSamplers&quot;), &amp;deleteSamplers);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glIsSampler&quot;), &amp;isSampler);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glBindSampler&quot;), &amp;bindSampler);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glSamplerParameteri&quot;), &amp;samplerParameteri);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glSamplerParameterf&quot;), &amp;samplerParameterf);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glSamplerParameteriv&quot;), &amp;samplerParameteriv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glSamplerParameterfv&quot;), &amp;samplerParameterfv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glSamplerParameterIiv&quot;), &amp;samplerParameterIiv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glSamplerParameterIuiv&quot;), &amp;samplerParameterIuiv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glGetSamplerParameteriv&quot;), &amp;getSamplerParameteriv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glGetSamplerParameterfv&quot;), &amp;getSamplerParameterfv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glGetSamplerParameterIiv&quot;), &amp;getSamplerParameterIiv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sampler_objects&quot;, loadProcAddress(&quot;glGetSamplerParameterIuiv&quot;), &amp;getSamplerParameterIuiv);
+
+    // GL_ARB_occlusion_query
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_occlusion_query&quot;, loadProcAddress(&quot;glGenQueriesARB&quot;), &amp;genQueries);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_occlusion_query&quot;, loadProcAddress(&quot;glDeleteQueriesARB&quot;), &amp;deleteQueries);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_occlusion_query&quot;, loadProcAddress(&quot;glIsQueryARB&quot;), &amp;isQuery);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_occlusion_query&quot;, loadProcAddress(&quot;glBeginQueryARB&quot;), &amp;beginQuery);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_occlusion_query&quot;, loadProcAddress(&quot;glEndQueryARB&quot;), &amp;endQuery);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_occlusion_query&quot;, loadProcAddress(&quot;glGetQueryivARB&quot;), &amp;getQueryiv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_occlusion_query&quot;, loadProcAddress(&quot;glGetQueryObjectivARB&quot;), &amp;getQueryObjectiv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_occlusion_query&quot;, loadProcAddress(&quot;glGetQueryObjectuivARB&quot;), &amp;getQueryObjectuiv);
+
+    // EXT_transform_feedback
+    AssignGLExtensionEntryPoint(extensions, &quot;EXT_transform_feedback&quot;, loadProcAddress(&quot;glBindBufferRangeEXT&quot;), &amp;bindBufferRange);
+    AssignGLExtensionEntryPoint(extensions, &quot;EXT_transform_feedback&quot;, loadProcAddress(&quot;glBindBufferBaseEXT&quot;), &amp;bindBufferBase);
+    AssignGLExtensionEntryPoint(extensions, &quot;EXT_transform_feedback&quot;, loadProcAddress(&quot;glBeginTransformFeedbackEXT&quot;), &amp;beginTransformFeedback);
+    AssignGLExtensionEntryPoint(extensions, &quot;EXT_transform_feedback&quot;, loadProcAddress(&quot;glEndTransformFeedbackEXT&quot;), &amp;endTransformFeedback);
+    AssignGLExtensionEntryPoint(extensions, &quot;EXT_transform_feedback&quot;, loadProcAddress(&quot;glTransformFeedbackVaryingsEXT&quot;), &amp;transformFeedbackVaryings);
+    AssignGLExtensionEntryPoint(extensions, &quot;EXT_transform_feedback&quot;, loadProcAddress(&quot;glGetTransformFeedbackVaryingEXT&quot;), &amp;getTransformFeedbackVarying);
+
+    // GL_ARB_transform_feedback2
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback2&quot;, loadProcAddress(&quot;glBindTransformFeedback&quot;), &amp;bindTransformFeedback);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback2&quot;, loadProcAddress(&quot;glDeleteTransformFeedbacks&quot;), &amp;deleteTransformFeedbacks);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback2&quot;, loadProcAddress(&quot;glGenTransformFeedbacks&quot;), &amp;genTransformFeedbacks);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback2&quot;, loadProcAddress(&quot;glIsTransformFeedback&quot;), &amp;isTransformFeedback);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback2&quot;, loadProcAddress(&quot;glPauseTransformFeedback&quot;), &amp;pauseTransformFeedback);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback2&quot;, loadProcAddress(&quot;glResumeTransformFeedback&quot;), &amp;resumeTransformFeedback);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback2&quot;, loadProcAddress(&quot;glDrawTransformFeedback&quot;), &amp;drawTransformFeedback);
+
+    // GL_ARB_transform_feedback3
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback3&quot;, loadProcAddress(&quot;glDrawTransformFeedbackStream&quot;), &amp;drawTransformFeedbackStream);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback3&quot;, loadProcAddress(&quot;glBeginQueryIndexed&quot;), &amp;beginQueryIndexed);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback3&quot;, loadProcAddress(&quot;glEndQueryIndexed&quot;), &amp;endQueryIndexed);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_transform_feedback3&quot;, loadProcAddress(&quot;glGetQueryIndexediv&quot;), &amp;getQueryIndexediv);
+
</ins><span class="cx">     // 1.0
</span><del>-    if (majorVersion &gt;= 1)
</del><ins>+    if (isAtLeastGL(gl::Version(1, 0)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBlendFunc&quot;), &amp;blendFunc);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glClear&quot;), &amp;clear);
</span><span class="lines">@@ -848,7 +1015,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 1.1
</span><del>-    if (majorVersion &gt; 1 || (majorVersion == 1 &amp;&amp; minorVersion &gt;= 1))
</del><ins>+    if (isAtLeastGL(gl::Version(1, 1)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindTexture&quot;), &amp;bindTexture);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glCopyTexImage1D&quot;), &amp;copyTexImage1D);
</span><span class="lines">@@ -866,7 +1033,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 1.2
</span><del>-    if (majorVersion &gt; 1 || (majorVersion == 1 &amp;&amp; minorVersion &gt;= 2))
</del><ins>+    if (isAtLeastGL(gl::Version(1, 2)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBlendColor&quot;), &amp;blendColor);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBlendEquation&quot;), &amp;blendEquation);
</span><span class="lines">@@ -874,19 +1041,10 @@
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glDrawRangeElements&quot;), &amp;drawRangeElements);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glTexImage3D&quot;), &amp;texImage3D);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glTexSubImage3D&quot;), &amp;texSubImage3D);
</span><del>-
-        // Extensions
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glDeleteFencesNV&quot;), &amp;deleteFencesNV);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glGenFencesNV&quot;), &amp;genFencesNV);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glIsFenceNV&quot;), &amp;isFenceNV);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glTestFenceNV&quot;), &amp;testFenceNV);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glGetFenceivNV&quot;), &amp;getFenceivNV);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glFinishFenceNV&quot;), &amp;finishFenceNV);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glSetFenceNV&quot;), &amp;setFenceNV);
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 1.3
</span><del>-    if (majorVersion &gt; 1 || (majorVersion == 1 &amp;&amp; minorVersion &gt;= 3))
</del><ins>+    if (isAtLeastGL(gl::Version(1, 3)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glActiveTexture&quot;), &amp;activeTexture);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glCompressedTexImage1D&quot;), &amp;compressedTexImage1D);
</span><span class="lines">@@ -900,7 +1058,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 1.4
</span><del>-    if (majorVersion &gt; 1 || (majorVersion == 1 &amp;&amp; minorVersion &gt;= 4))
</del><ins>+    if (isAtLeastGL(gl::Version(1, 4)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBlendFuncSeparate&quot;), &amp;blendFuncSeparate);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glMultiDrawArrays&quot;), &amp;multiDrawArrays);
</span><span class="lines">@@ -912,7 +1070,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 1.5
</span><del>-    if (majorVersion &gt; 1 || (majorVersion == 1 &amp;&amp; minorVersion &gt;= 5))
</del><ins>+    if (isAtLeastGL(gl::Version(1, 5)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBeginQuery&quot;), &amp;beginQuery);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindBuffer&quot;), &amp;bindBuffer);
</span><span class="lines">@@ -936,7 +1094,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 2.0
</span><del>-    if (majorVersion &gt;= 2)
</del><ins>+    if (isAtLeastGL(gl::Version(2, 0)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glAttachShader&quot;), &amp;attachShader);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindAttribLocation&quot;), &amp;bindAttribLocation);
</span><span class="lines">@@ -1034,7 +1192,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 2.1
</span><del>-    if (majorVersion &gt; 2 || (majorVersion == 2 &amp;&amp; minorVersion &gt;= 1))
</del><ins>+    if (isAtLeastGL(gl::Version(2, 1)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix2x3fv&quot;), &amp;uniformMatrix2x3fv);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix2x4fv&quot;), &amp;uniformMatrix2x4fv);
</span><span class="lines">@@ -1045,7 +1203,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 3.0
</span><del>-    if (majorVersion &gt;= 3)
</del><ins>+    if (isAtLeastGL(gl::Version(3, 0)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBeginConditionalRender&quot;), &amp;beginConditionalRender);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBeginTransformFeedback&quot;), &amp;beginTransformFeedback);
</span><span class="lines">@@ -1131,13 +1289,10 @@
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribI4uiv&quot;), &amp;vertexAttribI4uiv);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribI4usv&quot;), &amp;vertexAttribI4usv);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribIPointer&quot;), &amp;vertexAttribIPointer);
</span><del>-
-        // Extensions
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_internalformat_query&quot;, loadProcAddress(&quot;glGetInternalformativ&quot;), &amp;getInternalformativ);
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 3.1
</span><del>-    if (majorVersion &gt; 3 || (majorVersion == 3 &amp;&amp; minorVersion &gt;= 1))
</del><ins>+    if (isAtLeastGL(gl::Version(3, 1)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glCopyBufferSubData&quot;), &amp;copyBufferSubData);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glDrawArraysInstanced&quot;), &amp;drawArraysInstanced);
</span><span class="lines">@@ -1151,20 +1306,10 @@
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glPrimitiveRestartIndex&quot;), &amp;primitiveRestartIndex);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glTexBuffer&quot;), &amp;texBuffer);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glUniformBlockBinding&quot;), &amp;uniformBlockBinding);
</span><del>-
-        // Extensions
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glClientWaitSync&quot;), &amp;clientWaitSync);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glDeleteSync&quot;), &amp;deleteSync);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glFenceSync&quot;), &amp;fenceSync);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glGetInteger64i_v&quot;), &amp;getInteger64i_v);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glGetInteger64v&quot;), &amp;getInteger64v);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glGetSynciv&quot;), &amp;getSynciv);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glIsSync&quot;), &amp;isSync);
-        AssignGLExtensionEntryPoint(extensions, &quot;GL_ARB_sync&quot;, loadProcAddress(&quot;glWaitSync&quot;), &amp;waitSync);
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 3.2
</span><del>-    if (majorVersion &gt; 3 || (majorVersion == 3 &amp;&amp; minorVersion &gt;= 2))
</del><ins>+    if (isAtLeastGL(gl::Version(3, 2)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glClientWaitSync&quot;), &amp;clientWaitSync);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glDeleteSync&quot;), &amp;deleteSync);
</span><span class="lines">@@ -1188,7 +1333,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 3.3
</span><del>-    if (majorVersion &gt; 3 || (majorVersion == 3 &amp;&amp; minorVersion &gt;= 3))
</del><ins>+    if (isAtLeastGL(gl::Version(3, 3)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindFragDataLocationIndexed&quot;), &amp;bindFragDataLocationIndexed);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindSampler&quot;), &amp;bindSampler);
</span><span class="lines">@@ -1221,7 +1366,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 4.0
</span><del>-    if (majorVersion &gt;= 4)
</del><ins>+    if (isAtLeastGL(gl::Version(4, 0)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBeginQueryIndexed&quot;), &amp;beginQueryIndexed);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindTransformFeedback&quot;), &amp;bindTransformFeedback);
</span><span class="lines">@@ -1272,7 +1417,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 4.1
</span><del>-    if (majorVersion &gt; 4 || (majorVersion == 4 &amp;&amp; minorVersion &gt;= 1))
</del><ins>+    if (isAtLeastGL(gl::Version(4, 1)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glActiveShaderProgram&quot;), &amp;activeShaderProgram);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindProgramPipeline&quot;), &amp;bindProgramPipeline);
</span><span class="lines">@@ -1365,7 +1510,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 4.2
</span><del>-    if (majorVersion &gt; 4 || (majorVersion == 4 &amp;&amp; minorVersion &gt;= 2))
</del><ins>+    if (isAtLeastGL(gl::Version(4, 2)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindImageTexture&quot;), &amp;bindImageTexture);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glDrawArraysInstancedBaseInstance&quot;), &amp;drawArraysInstancedBaseInstance);
</span><span class="lines">@@ -1382,7 +1527,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 4.3
</span><del>-    if (majorVersion &gt; 4 || (majorVersion == 4 &amp;&amp; minorVersion &gt;= 3))
</del><ins>+    if (isAtLeastGL(gl::Version(4, 3)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindVertexBuffer&quot;), &amp;bindVertexBuffer);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glClearBufferData&quot;), &amp;clearBufferData);
</span><span class="lines">@@ -1397,6 +1542,7 @@
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glGetDebugMessageLog&quot;), &amp;getDebugMessageLog);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glGetFramebufferParameteriv&quot;), &amp;getFramebufferParameteriv);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glGetInternalformati64v&quot;), &amp;getInternalformati64v);
</span><ins>+        AssignGLEntryPoint(loadProcAddress(&quot;glGetPointerv&quot;), &amp;getPointerv);
</ins><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glGetObjectLabel&quot;), &amp;getObjectLabel);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glGetObjectPtrLabel&quot;), &amp;getObjectPtrLabel);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramInterfaceiv&quot;), &amp;getProgramInterfaceiv);
</span><span class="lines">@@ -1430,7 +1576,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 4.4
</span><del>-    if (majorVersion &gt; 4 || (majorVersion == 4 &amp;&amp; minorVersion &gt;= 4))
</del><ins>+    if (isAtLeastGL(gl::Version(4, 4)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindBuffersBase&quot;), &amp;bindBuffersBase);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindBuffersRange&quot;), &amp;bindBuffersRange);
</span><span class="lines">@@ -1444,7 +1590,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 4.5
</span><del>-    if (majorVersion &gt; 4 || (majorVersion == 4 &amp;&amp; minorVersion &gt;= 5))
</del><ins>+    if (isAtLeastGL(gl::Version(4, 5)))
</ins><span class="cx">     {
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBindTextureUnit&quot;), &amp;bindTextureUnit);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glBlitNamedFramebuffer&quot;), &amp;blitNamedFramebuffer);
</span><span class="lines">@@ -1557,6 +1703,498 @@
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glVertexArrayVertexBuffer&quot;), &amp;vertexArrayVertexBuffer);
</span><span class="cx">         AssignGLEntryPoint(loadProcAddress(&quot;glVertexArrayVertexBuffers&quot;), &amp;vertexArrayVertexBuffers);
</span><span class="cx">     }
</span><ins>+
+    // clang-format on
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void FunctionsGL::initializeProcsGLES()
+{
+    // No profiles in GLES
+    profile = 0;
+
+    // clang-format off
+
+    // GL_OES_texture_3D
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_texture_3D&quot;, loadProcAddress(&quot;glTexImage3DOES&quot;), &amp;texImage3D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_texture_3D&quot;, loadProcAddress(&quot;glTexSubImage3DOES&quot;), &amp;texSubImage3D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_texture_3D&quot;, loadProcAddress(&quot;glCopyTexSubImage3DOES&quot;), &amp;copyTexSubImage3D);
+
+    // GL_NV_fence
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glDeleteFencesNV&quot;), &amp;deleteFencesNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glGenFencesNV&quot;), &amp;genFencesNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glIsFenceNV&quot;), &amp;isFenceNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glTestFenceNV&quot;), &amp;testFenceNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glGetFenceivNV&quot;), &amp;getFenceivNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glFinishFenceNV&quot;), &amp;finishFenceNV);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_NV_fence&quot;, loadProcAddress(&quot;glSetFenceNV&quot;), &amp;setFenceNV);
+
+    // GL_EXT_texture_storage
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_texture_storage&quot;, loadProcAddress(&quot;glTexStorage2DEXT&quot;), &amp;texStorage2D);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_texture_storage GL_OES_texture3D&quot;, loadProcAddress(&quot;glTexStorage3DEXT&quot;), &amp;texStorage3D);
+
+    // GL_OES_vertex_array_object
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_vertex_array_object&quot;, loadProcAddress(&quot;glBindVertexArray&quot;), &amp;bindVertexArray);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_vertex_array_object&quot;, loadProcAddress(&quot;glDeleteVertexArrays&quot;), &amp;deleteVertexArrays);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_vertex_array_object&quot;, loadProcAddress(&quot;glGenVertexArrays&quot;), &amp;genVertexArrays);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_vertex_array_object&quot;, loadProcAddress(&quot;glIsVertexArray&quot;), &amp;isVertexArray);
+
+    // GL_EXT_map_buffer_range
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_map_buffer_range&quot;, loadProcAddress(&quot;glMapBufferRangeEXT&quot;), &amp;mapBufferRange);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_map_buffer_range&quot;, loadProcAddress(&quot;glFlushMappedBufferRangeEXT&quot;), &amp;flushMappedBufferRange);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_map_buffer_range&quot;, loadProcAddress(&quot;glUnmapBufferOES&quot;), &amp;unmapBuffer);
+
+    // GL_OES_mapbuffer
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_mapbuffer&quot;, loadProcAddress(&quot;glMapBufferOES&quot;), &amp;mapBuffer);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_mapbuffer&quot;, loadProcAddress(&quot;glUnmapBufferOES&quot;), &amp;unmapBuffer);
+
+    // GL_KHR_debug
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glDebugMessageControl&quot;), &amp;debugMessageControl);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glDebugMessageInsert&quot;), &amp;debugMessageInsert);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glDebugMessageCallback&quot;), &amp;debugMessageCallback);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glGetDebugMessageLog&quot;), &amp;getDebugMessageLog);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glGetPointerv&quot;), &amp;getPointerv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glPushDebugGroup&quot;), &amp;pushDebugGroup);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glPopDebugGroup&quot;), &amp;popDebugGroup);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glObjectLabel&quot;), &amp;objectLabel);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glGetObjectLabel&quot;), &amp;getObjectLabel);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glObjectPtrLabel&quot;), &amp;objectPtrLabel);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_KHR_debug&quot;, loadProcAddress(&quot;glGetObjectPtrLabel&quot;), &amp;getObjectPtrLabel);
+
+    // GL_EXT_draw_instanced
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_draw_instanced&quot;, loadProcAddress(&quot;glVertexAttribDivisorEXT&quot;), &amp;vertexAttribDivisor);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_draw_instanced&quot;, loadProcAddress(&quot;glDrawArraysInstancedEXT&quot;), &amp;drawArraysInstanced);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_draw_instanced&quot;, loadProcAddress(&quot;glDrawElementsInstancedEXT&quot;), &amp;drawElementsInstanced);
+
+    // GL_EXT_occlusion_query_boolean
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_occlusion_query_boolean&quot;, loadProcAddress(&quot;glGenQueriesEXT&quot;), &amp;genQueries);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_occlusion_query_boolean&quot;, loadProcAddress(&quot;glDeleteQueriesEXT&quot;), &amp;deleteQueries);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_occlusion_query_boolean&quot;, loadProcAddress(&quot;glIsQueryEXT&quot;), &amp;isQuery);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_occlusion_query_boolean&quot;, loadProcAddress(&quot;glBeginQueryEXT&quot;), &amp;beginQuery);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_occlusion_query_boolean&quot;, loadProcAddress(&quot;glEndQueryEXT&quot;), &amp;endQuery);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_occlusion_query_boolean&quot;, loadProcAddress(&quot;glGetQueryivEXT&quot;), &amp;getQueryiv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_occlusion_query_boolean&quot;, loadProcAddress(&quot;glGetQueryObjectuivEXT&quot;), &amp;getQueryObjectuiv);
+
+    // GL_EXT_disjoint_timer_query
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glGenQueriesEXT&quot;), &amp;genQueries);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glDeleteQueriesEXT&quot;), &amp;deleteQueries);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glIsQueryEXT&quot;), &amp;isQuery);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glBeginQueryEXT&quot;), &amp;beginQuery);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glEndQueryEXT&quot;), &amp;endQuery);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glQueryCounterEXT&quot;), &amp;queryCounter);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glGetQueryivEXT&quot;), &amp;getQueryiv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glGetQueryObjectivEXT&quot;), &amp;getQueryObjectiv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glGetQueryObjectuivEXT&quot;), &amp;getQueryObjectuiv);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glGetQueryObjecti64vEXT&quot;), &amp;getQueryObjecti64v);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_EXT_disjoint_timer_query&quot;, loadProcAddress(&quot;glGetQueryObjectui64vEXT&quot;), &amp;getQueryObjectui64v);
+
+    // GL_OES_EGL_image
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_EGL_image&quot;, loadProcAddress(&quot;glEGLImageTargetRenderbufferStorageOES&quot;), &amp;eglImageTargetRenderbufferStorageOES);
+    AssignGLExtensionEntryPoint(extensions, &quot;GL_OES_EGL_image&quot;, loadProcAddress(&quot;glEGLImageTargetTexture2DOES&quot;), &amp;eglImageTargetTexture2DOES);
+
+    // 2.0
+    if (isAtLeastGLES(gl::Version(2, 0)))
+    {
+        AssignGLEntryPoint(loadProcAddress(&quot;glActiveTexture&quot;), &amp;activeTexture);
+        AssignGLEntryPoint(loadProcAddress(&quot;glAttachShader&quot;), &amp;attachShader);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindAttribLocation&quot;), &amp;bindAttribLocation);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindBuffer&quot;), &amp;bindBuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindFramebuffer&quot;), &amp;bindFramebuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindRenderbuffer&quot;), &amp;bindRenderbuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindTexture&quot;), &amp;bindTexture);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlendColor&quot;), &amp;blendColor);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlendEquation&quot;), &amp;blendEquation);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlendEquationSeparate&quot;), &amp;blendEquationSeparate);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlendFunc&quot;), &amp;blendFunc);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlendFuncSeparate&quot;), &amp;blendFuncSeparate);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBufferData&quot;), &amp;bufferData);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBufferSubData&quot;), &amp;bufferSubData);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCheckFramebufferStatus&quot;), &amp;checkFramebufferStatus);
+        AssignGLEntryPoint(loadProcAddress(&quot;glClear&quot;), &amp;clear);
+        AssignGLEntryPoint(loadProcAddress(&quot;glClearColor&quot;), &amp;clearColor);
+        AssignGLEntryPoint(loadProcAddress(&quot;glClearDepthf&quot;), &amp;clearDepthf);
+        AssignGLEntryPoint(loadProcAddress(&quot;glClearStencil&quot;), &amp;clearStencil);
+        AssignGLEntryPoint(loadProcAddress(&quot;glColorMask&quot;), &amp;colorMask);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCompileShader&quot;), &amp;compileShader);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCompressedTexImage2D&quot;), &amp;compressedTexImage2D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCompressedTexSubImage2D&quot;), &amp;compressedTexSubImage2D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCopyTexImage2D&quot;), &amp;copyTexImage2D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCopyTexSubImage2D&quot;), &amp;copyTexSubImage2D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCreateProgram&quot;), &amp;createProgram);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCreateShader&quot;), &amp;createShader);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCullFace&quot;), &amp;cullFace);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteBuffers&quot;), &amp;deleteBuffers);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteFramebuffers&quot;), &amp;deleteFramebuffers);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteProgram&quot;), &amp;deleteProgram);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteRenderbuffers&quot;), &amp;deleteRenderbuffers);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteShader&quot;), &amp;deleteShader);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteTextures&quot;), &amp;deleteTextures);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDepthFunc&quot;), &amp;depthFunc);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDepthMask&quot;), &amp;depthMask);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDepthRangef&quot;), &amp;depthRangef);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDetachShader&quot;), &amp;detachShader);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDisable&quot;), &amp;disable);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDisableVertexAttribArray&quot;), &amp;disableVertexAttribArray);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawArrays&quot;), &amp;drawArrays);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawElements&quot;), &amp;drawElements);
+        AssignGLEntryPoint(loadProcAddress(&quot;glEnable&quot;), &amp;enable);
+        AssignGLEntryPoint(loadProcAddress(&quot;glEnableVertexAttribArray&quot;), &amp;enableVertexAttribArray);
+        AssignGLEntryPoint(loadProcAddress(&quot;glFinish&quot;), &amp;finish);
+        AssignGLEntryPoint(loadProcAddress(&quot;glFlush&quot;), &amp;flush);
+        AssignGLEntryPoint(loadProcAddress(&quot;glFramebufferRenderbuffer&quot;), &amp;framebufferRenderbuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glFramebufferTexture2D&quot;), &amp;framebufferTexture2D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glFrontFace&quot;), &amp;frontFace);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGenBuffers&quot;), &amp;genBuffers);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGenerateMipmap&quot;), &amp;generateMipmap);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGenFramebuffers&quot;), &amp;genFramebuffers);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGenRenderbuffers&quot;), &amp;genRenderbuffers);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGenTextures&quot;), &amp;genTextures);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetActiveAttrib&quot;), &amp;getActiveAttrib);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetActiveUniform&quot;), &amp;getActiveUniform);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetAttachedShaders&quot;), &amp;getAttachedShaders);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetAttribLocation&quot;), &amp;getAttribLocation);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetBooleanv&quot;), &amp;getBooleanv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetBufferParameteriv&quot;), &amp;getBufferParameteriv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetError&quot;), &amp;getError);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetFloatv&quot;), &amp;getFloatv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetFramebufferAttachmentParameteriv&quot;), &amp;getFramebufferAttachmentParameteriv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetIntegerv&quot;), &amp;getIntegerv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramiv&quot;), &amp;getProgramiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramInfoLog&quot;), &amp;getProgramInfoLog);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetRenderbufferParameteriv&quot;), &amp;getRenderbufferParameteriv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetShaderiv&quot;), &amp;getShaderiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetShaderInfoLog&quot;), &amp;getShaderInfoLog);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetShaderPrecisionFormat&quot;), &amp;getShaderPrecisionFormat);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetShaderSource&quot;), &amp;getShaderSource);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetString&quot;), &amp;getString);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetTexParameterfv&quot;), &amp;getTexParameterfv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetTexParameteriv&quot;), &amp;getTexParameteriv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetUniformfv&quot;), &amp;getUniformfv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetUniformiv&quot;), &amp;getUniformiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetUniformLocation&quot;), &amp;getUniformLocation);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetVertexAttribfv&quot;), &amp;getVertexAttribfv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetVertexAttribiv&quot;), &amp;getVertexAttribiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetVertexAttribPointerv&quot;), &amp;getVertexAttribPointerv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glHint&quot;), &amp;hint);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsBuffer&quot;), &amp;isBuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsEnabled&quot;), &amp;isEnabled);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsFramebuffer&quot;), &amp;isFramebuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsProgram&quot;), &amp;isProgram);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsRenderbuffer&quot;), &amp;isRenderbuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsShader&quot;), &amp;isShader);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsTexture&quot;), &amp;isTexture);
+        AssignGLEntryPoint(loadProcAddress(&quot;glLineWidth&quot;), &amp;lineWidth);
+        AssignGLEntryPoint(loadProcAddress(&quot;glLinkProgram&quot;), &amp;linkProgram);
+        AssignGLEntryPoint(loadProcAddress(&quot;glPixelStorei&quot;), &amp;pixelStorei);
+        AssignGLEntryPoint(loadProcAddress(&quot;glPolygonOffset&quot;), &amp;polygonOffset);
+        AssignGLEntryPoint(loadProcAddress(&quot;glReadPixels&quot;), &amp;readPixels);
+        AssignGLEntryPoint(loadProcAddress(&quot;glReleaseShaderCompiler&quot;), &amp;releaseShaderCompiler);
+        AssignGLEntryPoint(loadProcAddress(&quot;glRenderbufferStorage&quot;), &amp;renderbufferStorage);
+        AssignGLEntryPoint(loadProcAddress(&quot;glSampleCoverage&quot;), &amp;sampleCoverage);
+        AssignGLEntryPoint(loadProcAddress(&quot;glScissor&quot;), &amp;scissor);
+        AssignGLEntryPoint(loadProcAddress(&quot;glShaderBinary&quot;), &amp;shaderBinary);
+        AssignGLEntryPoint(loadProcAddress(&quot;glShaderSource&quot;), &amp;shaderSource);
+        AssignGLEntryPoint(loadProcAddress(&quot;glStencilFunc&quot;), &amp;stencilFunc);
+        AssignGLEntryPoint(loadProcAddress(&quot;glStencilFuncSeparate&quot;), &amp;stencilFuncSeparate);
+        AssignGLEntryPoint(loadProcAddress(&quot;glStencilMask&quot;), &amp;stencilMask);
+        AssignGLEntryPoint(loadProcAddress(&quot;glStencilMaskSeparate&quot;), &amp;stencilMaskSeparate);
+        AssignGLEntryPoint(loadProcAddress(&quot;glStencilOp&quot;), &amp;stencilOp);
+        AssignGLEntryPoint(loadProcAddress(&quot;glStencilOpSeparate&quot;), &amp;stencilOpSeparate);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexImage2D&quot;), &amp;texImage2D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexParameterf&quot;), &amp;texParameterf);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexParameterfv&quot;), &amp;texParameterfv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexParameteri&quot;), &amp;texParameteri);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexParameteriv&quot;), &amp;texParameteriv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexSubImage2D&quot;), &amp;texSubImage2D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform1f&quot;), &amp;uniform1f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform1fv&quot;), &amp;uniform1fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform1i&quot;), &amp;uniform1i);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform1iv&quot;), &amp;uniform1iv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform2f&quot;), &amp;uniform2f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform2fv&quot;), &amp;uniform2fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform2i&quot;), &amp;uniform2i);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform2iv&quot;), &amp;uniform2iv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform3f&quot;), &amp;uniform3f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform3fv&quot;), &amp;uniform3fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform3i&quot;), &amp;uniform3i);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform3iv&quot;), &amp;uniform3iv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform4f&quot;), &amp;uniform4f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform4fv&quot;), &amp;uniform4fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform4i&quot;), &amp;uniform4i);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform4iv&quot;), &amp;uniform4iv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix2fv&quot;), &amp;uniformMatrix2fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix3fv&quot;), &amp;uniformMatrix3fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix4fv&quot;), &amp;uniformMatrix4fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUseProgram&quot;), &amp;useProgram);
+        AssignGLEntryPoint(loadProcAddress(&quot;glValidateProgram&quot;), &amp;validateProgram);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttrib1f&quot;), &amp;vertexAttrib1f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttrib1fv&quot;), &amp;vertexAttrib1fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttrib2f&quot;), &amp;vertexAttrib2f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttrib2fv&quot;), &amp;vertexAttrib2fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttrib3f&quot;), &amp;vertexAttrib3f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttrib3fv&quot;), &amp;vertexAttrib3fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttrib4f&quot;), &amp;vertexAttrib4f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttrib4fv&quot;), &amp;vertexAttrib4fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribPointer&quot;), &amp;vertexAttribPointer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glViewport&quot;), &amp;viewport);
+    }
+
+    // 3.0
+    if (isAtLeastGLES(gl::Version(3, 0)))
+    {
+        AssignGLEntryPoint(loadProcAddress(&quot;glReadBuffer&quot;), &amp;readBuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawRangeElements&quot;), &amp;drawRangeElements);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexImage3D&quot;), &amp;texImage3D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexSubImage3D&quot;), &amp;texSubImage3D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCopyTexSubImage3D&quot;), &amp;copyTexSubImage3D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCompressedTexImage3D&quot;), &amp;compressedTexImage3D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCompressedTexSubImage3D&quot;), &amp;compressedTexSubImage3D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGenQueries&quot;), &amp;genQueries);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteQueries&quot;), &amp;deleteQueries);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsQuery&quot;), &amp;isQuery);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBeginQuery&quot;), &amp;beginQuery);
+        AssignGLEntryPoint(loadProcAddress(&quot;glEndQuery&quot;), &amp;endQuery);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetQueryiv&quot;), &amp;getQueryiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetQueryObjectuiv&quot;), &amp;getQueryObjectuiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUnmapBuffer&quot;), &amp;unmapBuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetBufferPointerv&quot;), &amp;getBufferPointerv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawBuffers&quot;), &amp;drawBuffers);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix2x3fv&quot;), &amp;uniformMatrix2x3fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix3x2fv&quot;), &amp;uniformMatrix3x2fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix2x4fv&quot;), &amp;uniformMatrix2x4fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix4x2fv&quot;), &amp;uniformMatrix4x2fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix3x4fv&quot;), &amp;uniformMatrix3x4fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniformMatrix4x3fv&quot;), &amp;uniformMatrix4x3fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlitFramebuffer&quot;), &amp;blitFramebuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glRenderbufferStorageMultisample&quot;), &amp;renderbufferStorageMultisample);
+        AssignGLEntryPoint(loadProcAddress(&quot;glFramebufferTextureLayer&quot;), &amp;framebufferTextureLayer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glMapBufferRange&quot;), &amp;mapBufferRange);
+        AssignGLEntryPoint(loadProcAddress(&quot;glFlushMappedBufferRange&quot;), &amp;flushMappedBufferRange);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindVertexArray&quot;), &amp;bindVertexArray);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteVertexArrays&quot;), &amp;deleteVertexArrays);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGenVertexArrays&quot;), &amp;genVertexArrays);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsVertexArray&quot;), &amp;isVertexArray);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetIntegeri_v&quot;), &amp;getIntegeri_v);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBeginTransformFeedback&quot;), &amp;beginTransformFeedback);
+        AssignGLEntryPoint(loadProcAddress(&quot;glEndTransformFeedback&quot;), &amp;endTransformFeedback);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindBufferRange&quot;), &amp;bindBufferRange);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindBufferBase&quot;), &amp;bindBufferBase);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTransformFeedbackVaryings&quot;), &amp;transformFeedbackVaryings);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetTransformFeedbackVarying&quot;), &amp;getTransformFeedbackVarying);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribIPointer&quot;), &amp;vertexAttribIPointer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetVertexAttribIiv&quot;), &amp;getVertexAttribIiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetVertexAttribIuiv&quot;), &amp;getVertexAttribIuiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribI4i&quot;), &amp;vertexAttribI4i);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribI4ui&quot;), &amp;vertexAttribI4ui);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribI4iv&quot;), &amp;vertexAttribI4iv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribI4uiv&quot;), &amp;vertexAttribI4uiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetUniformuiv&quot;), &amp;getUniformuiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetFragDataLocation&quot;), &amp;getFragDataLocation);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform1ui&quot;), &amp;uniform1ui);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform2ui&quot;), &amp;uniform2ui);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform3ui&quot;), &amp;uniform3ui);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform4ui&quot;), &amp;uniform4ui);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform1uiv&quot;), &amp;uniform1uiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform2uiv&quot;), &amp;uniform2uiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform3uiv&quot;), &amp;uniform3uiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniform4uiv&quot;), &amp;uniform4uiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glClearBufferiv&quot;), &amp;clearBufferiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glClearBufferuiv&quot;), &amp;clearBufferuiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glClearBufferfv&quot;), &amp;clearBufferfv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glClearBufferfi&quot;), &amp;clearBufferfi);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetStringi&quot;), &amp;getStringi);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCopyBufferSubData&quot;), &amp;copyBufferSubData);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetUniformIndices&quot;), &amp;getUniformIndices);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetActiveUniformsiv&quot;), &amp;getActiveUniformsiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetUniformBlockIndex&quot;), &amp;getUniformBlockIndex);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetActiveUniformBlockiv&quot;), &amp;getActiveUniformBlockiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetActiveUniformBlockName&quot;), &amp;getActiveUniformBlockName);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUniformBlockBinding&quot;), &amp;uniformBlockBinding);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawArraysInstanced&quot;), &amp;drawArraysInstanced);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawElementsInstanced&quot;), &amp;drawElementsInstanced);
+        AssignGLEntryPoint(loadProcAddress(&quot;glFenceSync&quot;), &amp;fenceSync);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsSync&quot;), &amp;isSync);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteSync&quot;), &amp;deleteSync);
+        AssignGLEntryPoint(loadProcAddress(&quot;glClientWaitSync&quot;), &amp;clientWaitSync);
+        AssignGLEntryPoint(loadProcAddress(&quot;glWaitSync&quot;), &amp;waitSync);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetInteger64v&quot;), &amp;getInteger64v);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetSynciv&quot;), &amp;getSynciv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetInteger64i_v&quot;), &amp;getInteger64i_v);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetBufferParameteri64v&quot;), &amp;getBufferParameteri64v);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGenSamplers&quot;), &amp;genSamplers);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteSamplers&quot;), &amp;deleteSamplers);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsSampler&quot;), &amp;isSampler);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindSampler&quot;), &amp;bindSampler);
+        AssignGLEntryPoint(loadProcAddress(&quot;glSamplerParameteri&quot;), &amp;samplerParameteri);
+        AssignGLEntryPoint(loadProcAddress(&quot;glSamplerParameteriv&quot;), &amp;samplerParameteriv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glSamplerParameterf&quot;), &amp;samplerParameterf);
+        AssignGLEntryPoint(loadProcAddress(&quot;glSamplerParameterfv&quot;), &amp;samplerParameterfv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetSamplerParameteriv&quot;), &amp;getSamplerParameteriv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetSamplerParameterfv&quot;), &amp;getSamplerParameterfv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribDivisor&quot;), &amp;vertexAttribDivisor);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindTransformFeedback&quot;), &amp;bindTransformFeedback);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteTransformFeedbacks&quot;), &amp;deleteTransformFeedbacks);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGenTransformFeedbacks&quot;), &amp;genTransformFeedbacks);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsTransformFeedback&quot;), &amp;isTransformFeedback);
+        AssignGLEntryPoint(loadProcAddress(&quot;glPauseTransformFeedback&quot;), &amp;pauseTransformFeedback);
+        AssignGLEntryPoint(loadProcAddress(&quot;glResumeTransformFeedback&quot;), &amp;resumeTransformFeedback);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramBinary&quot;), &amp;getProgramBinary);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramBinary&quot;), &amp;programBinary);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramParameteri&quot;), &amp;programParameteri);
+        AssignGLEntryPoint(loadProcAddress(&quot;glInvalidateFramebuffer&quot;), &amp;invalidateFramebuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glInvalidateSubFramebuffer&quot;), &amp;invalidateSubFramebuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexStorage2D&quot;), &amp;texStorage2D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexStorage3D&quot;), &amp;texStorage3D);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetInternalformativ&quot;), &amp;getInternalformativ);
+    }
+
+    // 3.1
+    if (isAtLeastGLES(gl::Version(3, 1)))
+    {
+        AssignGLEntryPoint(loadProcAddress(&quot;glDispatchCompute&quot;), &amp;dispatchCompute);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDispatchComputeIndirect&quot;), &amp;dispatchComputeIndirect);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawArraysIndirect&quot;), &amp;drawArraysIndirect);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawElementsIndirect&quot;), &amp;drawElementsIndirect);
+        AssignGLEntryPoint(loadProcAddress(&quot;glFramebufferParameteri&quot;), &amp;framebufferParameteri);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetFramebufferParameteriv&quot;), &amp;getFramebufferParameteriv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramInterfaceiv&quot;), &amp;getProgramInterfaceiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramResourceIndex&quot;), &amp;getProgramResourceIndex);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramResourceName&quot;), &amp;getProgramResourceName);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramResourceiv&quot;), &amp;getProgramResourceiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramResourceLocation&quot;), &amp;getProgramResourceLocation);
+        AssignGLEntryPoint(loadProcAddress(&quot;glUseProgramStages&quot;), &amp;useProgramStages);
+        AssignGLEntryPoint(loadProcAddress(&quot;glActiveShaderProgram&quot;), &amp;activeShaderProgram);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCreateShaderProgramv&quot;), &amp;createShaderProgramv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindProgramPipeline&quot;), &amp;bindProgramPipeline);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDeleteProgramPipelines&quot;), &amp;deleteProgramPipelines);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGenProgramPipelines&quot;), &amp;genProgramPipelines);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsProgramPipeline&quot;), &amp;isProgramPipeline);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramPipelineiv&quot;), &amp;getProgramPipelineiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform1i&quot;), &amp;programUniform1i);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform2i&quot;), &amp;programUniform2i);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform3i&quot;), &amp;programUniform3i);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform4i&quot;), &amp;programUniform4i);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform1ui&quot;), &amp;programUniform1ui);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform2ui&quot;), &amp;programUniform2ui);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform3ui&quot;), &amp;programUniform3ui);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform4ui&quot;), &amp;programUniform4ui);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform1f&quot;), &amp;programUniform1f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform2f&quot;), &amp;programUniform2f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform3f&quot;), &amp;programUniform3f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform4f&quot;), &amp;programUniform4f);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform1iv&quot;), &amp;programUniform1iv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform2iv&quot;), &amp;programUniform2iv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform3iv&quot;), &amp;programUniform3iv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform4iv&quot;), &amp;programUniform4iv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform1uiv&quot;), &amp;programUniform1uiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform2uiv&quot;), &amp;programUniform2uiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform3uiv&quot;), &amp;programUniform3uiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform4uiv&quot;), &amp;programUniform4uiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform1fv&quot;), &amp;programUniform1fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform2fv&quot;), &amp;programUniform2fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform3fv&quot;), &amp;programUniform3fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniform4fv&quot;), &amp;programUniform4fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniformMatrix2fv&quot;), &amp;programUniformMatrix2fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniformMatrix3fv&quot;), &amp;programUniformMatrix3fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniformMatrix4fv&quot;), &amp;programUniformMatrix4fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniformMatrix2x3fv&quot;), &amp;programUniformMatrix2x3fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniformMatrix3x2fv&quot;), &amp;programUniformMatrix3x2fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniformMatrix2x4fv&quot;), &amp;programUniformMatrix2x4fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniformMatrix4x2fv&quot;), &amp;programUniformMatrix4x2fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniformMatrix3x4fv&quot;), &amp;programUniformMatrix3x4fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glProgramUniformMatrix4x3fv&quot;), &amp;programUniformMatrix4x3fv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glValidateProgramPipeline&quot;), &amp;validateProgramPipeline);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetProgramPipelineInfoLog&quot;), &amp;getProgramPipelineInfoLog);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindImageTexture&quot;), &amp;bindImageTexture);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetBooleani_v&quot;), &amp;getBooleani_v);
+        AssignGLEntryPoint(loadProcAddress(&quot;glMemoryBarrier&quot;), &amp;memoryBarrier);
+        AssignGLEntryPoint(loadProcAddress(&quot;glMemoryBarrierByRegion&quot;), &amp;memoryBarrierByRegion);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexStorage2DMultisample&quot;), &amp;texStorage2DMultisample);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetMultisamplefv&quot;), &amp;getMultisamplefv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glSampleMaski&quot;), &amp;sampleMaski);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetTexLevelParameteriv&quot;), &amp;getTexLevelParameteriv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetTexLevelParameterfv&quot;), &amp;getTexLevelParameterfv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBindVertexBuffer&quot;), &amp;bindVertexBuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribFormat&quot;), &amp;vertexAttribFormat);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribIFormat&quot;), &amp;vertexAttribIFormat);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexAttribBinding&quot;), &amp;vertexAttribBinding);
+        AssignGLEntryPoint(loadProcAddress(&quot;glVertexBindingDivisor&quot;), &amp;vertexBindingDivisor);
+    }
+
+    // 3.2
+    if (isAtLeastGLES(gl::Version(3, 2)))
+    {
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlendBarrier&quot;), &amp;blendBarrier);
+        AssignGLEntryPoint(loadProcAddress(&quot;glCopyImageSubData&quot;), &amp;copyImageSubData);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDebugMessageControl&quot;), &amp;debugMessageControl);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDebugMessageInsert&quot;), &amp;debugMessageInsert);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDebugMessageCallback&quot;), &amp;debugMessageCallback);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetDebugMessageLog&quot;), &amp;getDebugMessageLog);
+        AssignGLEntryPoint(loadProcAddress(&quot;glPushDebugGroup&quot;), &amp;pushDebugGroup);
+        AssignGLEntryPoint(loadProcAddress(&quot;glPopDebugGroup&quot;), &amp;popDebugGroup);
+        AssignGLEntryPoint(loadProcAddress(&quot;glObjectLabel&quot;), &amp;objectLabel);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetObjectLabel&quot;), &amp;getObjectLabel);
+        AssignGLEntryPoint(loadProcAddress(&quot;glObjectPtrLabel&quot;), &amp;objectPtrLabel);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetObjectPtrLabel&quot;), &amp;getObjectPtrLabel);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetPointerv&quot;), &amp;getPointerv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glEnablei&quot;), &amp;enablei);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDisablei&quot;), &amp;disablei);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlendEquationi&quot;), &amp;blendEquationi);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlendEquationSeparatei&quot;), &amp;blendEquationSeparatei);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlendFunci&quot;), &amp;blendFunci);
+        AssignGLEntryPoint(loadProcAddress(&quot;glBlendFuncSeparatei&quot;), &amp;blendFuncSeparatei);
+        AssignGLEntryPoint(loadProcAddress(&quot;glColorMaski&quot;), &amp;colorMaski);
+        AssignGLEntryPoint(loadProcAddress(&quot;glIsEnabledi&quot;), &amp;isEnabledi);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawElementsBaseVertex&quot;), &amp;drawElementsBaseVertex);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawRangeElementsBaseVertex&quot;), &amp;drawRangeElementsBaseVertex);
+        AssignGLEntryPoint(loadProcAddress(&quot;glDrawElementsInstancedBaseVertex&quot;), &amp;drawElementsInstancedBaseVertex);
+        AssignGLEntryPoint(loadProcAddress(&quot;glFramebufferTexture&quot;), &amp;framebufferTexture);
+        AssignGLEntryPoint(loadProcAddress(&quot;glPrimitiveBoundingBox&quot;), &amp;primitiveBoundingBox);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetGraphicsResetStatus&quot;), &amp;getGraphicsResetStatus);
+        AssignGLEntryPoint(loadProcAddress(&quot;glReadnPixels&quot;), &amp;readnPixels);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetnUniformfv&quot;), &amp;getnUniformfv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetnUniformiv&quot;), &amp;getnUniformiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetnUniformuiv&quot;), &amp;getnUniformuiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glMinSampleShading&quot;), &amp;minSampleShading);
+        AssignGLEntryPoint(loadProcAddress(&quot;glPatchParameteri&quot;), &amp;patchParameteri);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexParameterIiv&quot;), &amp;texParameterIiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexParameterIuiv&quot;), &amp;texParameterIuiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetTexParameterIiv&quot;), &amp;getTexParameterIiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetTexParameterIuiv&quot;), &amp;getTexParameterIuiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glSamplerParameterIiv&quot;), &amp;samplerParameterIiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glSamplerParameterIuiv&quot;), &amp;samplerParameterIuiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetSamplerParameterIiv&quot;), &amp;getSamplerParameterIiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glGetSamplerParameterIuiv&quot;), &amp;getSamplerParameterIuiv);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexBuffer&quot;), &amp;texBuffer);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexBufferRange&quot;), &amp;texBufferRange);
+        AssignGLEntryPoint(loadProcAddress(&quot;glTexStorage3DMultisample&quot;), &amp;texStorage3DMultisample);
+    }
+
+    // clang-format on
</ins><span class="cx"> }
</span><ins>+
+bool FunctionsGL::isAtLeastGL(const gl::Version &amp;glVersion) const
+{
+    return standard == STANDARD_GL_DESKTOP &amp;&amp; version &gt;= glVersion;
+}
+
+bool FunctionsGL::isAtLeastGLES(const gl::Version &amp;glesVersion) const
+{
+    return standard == STANDARD_GL_ES &amp;&amp; version &gt;= glesVersion;
+}
+
+bool FunctionsGL::hasExtension(const std::string &amp;ext) const
+{
+    return std::find(extensions.begin(), extensions.end(), ext) != extensions.end();
+}
+
+bool FunctionsGL::hasGLExtension(const std::string &amp;ext) const
+{
+    return standard == STANDARD_GL_DESKTOP &amp;&amp; hasExtension(ext);
+}
+
+bool FunctionsGL::hasGLESExtension(const std::string &amp;ext) const
+{
+    return standard == STANDARD_GL_ES &amp;&amp; hasExtension(ext);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglFunctionsGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FunctionsGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FunctionsGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FunctionsGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,12 +10,19 @@
</span><span class="cx"> #define LIBANGLE_RENDERER_GL_FUNCTIONSGL_H_
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><ins>+#include &quot;libANGLE/Version.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/functionsgl_enums.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/functionsgl_typedefs.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+enum StandardGL
+{
+    STANDARD_GL_DESKTOP,
+    STANDARD_GL_ES,
+};
+
</ins><span class="cx"> class FunctionsGL
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="lines">@@ -25,12 +32,17 @@
</span><span class="cx">     void initialize();
</span><span class="cx"> 
</span><span class="cx">     // Version information
</span><del>-    GLuint majorVersion;
-    GLuint minorVersion;
-    bool openGLES;
</del><ins>+    gl::Version version;
+    StandardGL standard;
+    GLint profile;
+    bool isAtLeastGL(const gl::Version &amp;glVersion) const;
+    bool isAtLeastGLES(const gl::Version &amp;glesVersion) const;
</ins><span class="cx"> 
</span><span class="cx">     // Extensions
</span><span class="cx">     std::vector&lt;std::string&gt; extensions;
</span><ins>+    bool hasExtension(const std::string &amp;ext) const;
+    bool hasGLExtension(const std::string &amp;ext) const;
+    bool hasGLESExtension(const std::string &amp;ext) const;
</ins><span class="cx"> 
</span><span class="cx">     // Entry Points
</span><span class="cx">     // 1.0
</span><span class="lines">@@ -576,6 +588,7 @@
</span><span class="cx">     PFNGLGETDEBUGMESSAGELOGPROC getDebugMessageLog;
</span><span class="cx">     PFNGLGETFRAMEBUFFERPARAMETERIVPROC getFramebufferParameteriv;
</span><span class="cx">     PFNGLGETINTERNALFORMATI64VPROC getInternalformati64v;
</span><ins>+    PFNGLGETPOINTERVPROC getPointerv;
</ins><span class="cx">     PFNGLGETOBJECTLABELPROC getObjectLabel;
</span><span class="cx">     PFNGLGETOBJECTPTRLABELPROC getObjectPtrLabel;
</span><span class="cx">     PFNGLGETPROGRAMINTERFACEIVPROC getProgramInterfaceiv;
</span><span class="lines">@@ -730,7 +743,18 @@
</span><span class="cx">     PFNGLVERTEXARRAYVERTEXBUFFERPROC vertexArrayVertexBuffer;
</span><span class="cx">     PFNGLVERTEXARRAYVERTEXBUFFERSPROC vertexArrayVertexBuffers;
</span><span class="cx"> 
</span><ins>+    // ES 3.2
+    PFNGLBLENDBARRIERPROC blendBarrier;
+    PFNGLPRIMITIVEBOUNDINGBOXPROC primitiveBoundingBox;
+
+    // ES extensions
+    PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC eglImageTargetRenderbufferStorageOES;
+    PFNGLEGLIMAGETARGETTEXTURE2DOESPROC eglImageTargetTexture2DOES;
+
</ins><span class="cx">   private:
</span><ins>+    void initializeProcsDesktopGL();
+    void initializeProcsGLES();
+
</ins><span class="cx">     virtual void *loadProcAddress(const std::string &amp;function) = 0;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglProgramGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,229 +13,253 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/ShaderGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/WorkaroundsGL.h&quot;
+#include &quot;platform/Platform.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-ProgramGL::ProgramGL(const FunctionsGL *functions, StateManagerGL *stateManager)
-    : ProgramImpl(),
</del><ins>+ProgramGL::ProgramGL(const gl::Program::Data &amp;data,
+                     const FunctionsGL *functions,
+                     const WorkaroundsGL &amp;workarounds,
+                     StateManagerGL *stateManager)
+    : ProgramImpl(data),
</ins><span class="cx">       mFunctions(functions),
</span><ins>+      mWorkarounds(workarounds),
</ins><span class="cx">       mStateManager(stateManager),
</span><span class="cx">       mProgramID(0)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(mFunctions);
</span><span class="cx">     ASSERT(mStateManager);
</span><ins>+
+    mProgramID = mFunctions-&gt;createProgram();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ProgramGL::~ProgramGL()
</span><span class="cx"> {
</span><del>-    if (mProgramID != 0)
-    {
-        mFunctions-&gt;deleteProgram(mProgramID);
-        mProgramID = 0;
-    }
</del><ins>+    mFunctions-&gt;deleteProgram(mProgramID);
+    mProgramID = 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ProgramGL::usesPointSize() const
</del><ins>+LinkResult ProgramGL::load(gl::InfoLog &amp;infoLog, gl::BinaryInputStream *stream)
</ins><span class="cx"> {
</span><span class="cx">     UNIMPLEMENTED();
</span><del>-    return bool();
</del><ins>+    return LinkResult(false, gl::Error(GL_INVALID_OPERATION));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-int ProgramGL::getShaderVersion() const
</del><ins>+gl::Error ProgramGL::save(gl::BinaryOutputStream *stream)
</ins><span class="cx"> {
</span><span class="cx">     UNIMPLEMENTED();
</span><del>-    return int();
</del><ins>+    return gl::Error(GL_INVALID_OPERATION);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLenum ProgramGL::getTransformFeedbackBufferMode() const
</del><ins>+void ProgramGL::setBinaryRetrievableHint(bool retrievable)
</ins><span class="cx"> {
</span><span class="cx">     UNIMPLEMENTED();
</span><del>-    return GLenum();
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLenum ProgramGL::getBinaryFormat()
</del><ins>+LinkResult ProgramGL::link(const gl::Data &amp;data, gl::InfoLog &amp;infoLog)
</ins><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
-    return GLenum();
-}
</del><ins>+    // Reset the program state, delete the current program if one exists
+    reset();
</ins><span class="cx"> 
</span><del>-LinkResult ProgramGL::load(gl::InfoLog &amp;infoLog, gl::BinaryInputStream *stream)
-{
-    UNIMPLEMENTED();
-    return LinkResult(false, gl::Error(GL_INVALID_OPERATION));
-}
</del><ins>+    // Set the transform feedback state
+    std::vector&lt;const GLchar *&gt; transformFeedbackVaryings;
+    for (const auto &amp;tfVarying : mData.getTransformFeedbackVaryingNames())
+    {
+        transformFeedbackVaryings.push_back(tfVarying.c_str());
+    }
</ins><span class="cx"> 
</span><del>-gl::Error ProgramGL::save(gl::BinaryOutputStream *stream)
-{
-    UNIMPLEMENTED();
-    return gl::Error(GL_INVALID_OPERATION);
-}
</del><ins>+    if (transformFeedbackVaryings.empty())
+    {
+        if (mFunctions-&gt;transformFeedbackVaryings)
+        {
+            mFunctions-&gt;transformFeedbackVaryings(mProgramID, 0, nullptr,
+                                                  mData.getTransformFeedbackBufferMode());
+        }
+    }
+    else
+    {
+        ASSERT(mFunctions-&gt;transformFeedbackVaryings);
+        mFunctions-&gt;transformFeedbackVaryings(
+            mProgramID, static_cast&lt;GLsizei&gt;(transformFeedbackVaryings.size()),
+            &amp;transformFeedbackVaryings[0], mData.getTransformFeedbackBufferMode());
+    }
</ins><span class="cx"> 
</span><del>-LinkResult ProgramGL::link(const gl::Data &amp;data, gl::InfoLog &amp;infoLog,
-                           gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                           const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings,
-                           GLenum transformFeedbackBufferMode,
-                           int *registers, std::vector&lt;gl::LinkedVarying&gt; *linkedVaryings,
-                           std::map&lt;int, gl::VariableLocation&gt; *outputVariables)
-{
-    // Reset the program state, delete the current program if one exists
-    reset();
</del><ins>+    const gl::Shader *vertexShader   = mData.getAttachedVertexShader();
+    const gl::Shader *fragmentShader = mData.getAttachedFragmentShader();
</ins><span class="cx"> 
</span><del>-    ShaderGL *vertexShaderGL = GetImplAs&lt;ShaderGL&gt;(vertexShader);
-    ShaderGL *fragmentShaderGL = GetImplAs&lt;ShaderGL&gt;(fragmentShader);
</del><ins>+    const ShaderGL *vertexShaderGL   = GetImplAs&lt;ShaderGL&gt;(vertexShader);
+    const ShaderGL *fragmentShaderGL = GetImplAs&lt;ShaderGL&gt;(fragmentShader);
</ins><span class="cx"> 
</span><del>-    // Generate a new program, make sure one doesn't already exist
-    ASSERT(mProgramID == 0);
-    mProgramID = mFunctions-&gt;createProgram();
-
</del><span class="cx">     // Attach the shaders
</span><span class="cx">     mFunctions-&gt;attachShader(mProgramID, vertexShaderGL-&gt;getShaderID());
</span><span class="cx">     mFunctions-&gt;attachShader(mProgramID, fragmentShaderGL-&gt;getShaderID());
</span><span class="cx"> 
</span><del>-    // TODO: bind attribute locations?
</del><ins>+    // Bind attribute locations to match the GL layer.
+    for (const sh::Attribute &amp;attribute : mData.getAttributes())
+    {
+        if (!attribute.staticUse)
+        {
+            continue;
+        }
</ins><span class="cx"> 
</span><ins>+        mFunctions-&gt;bindAttribLocation(mProgramID, attribute.location, attribute.name.c_str());
+    }
+
</ins><span class="cx">     // Link and verify
</span><span class="cx">     mFunctions-&gt;linkProgram(mProgramID);
</span><span class="cx"> 
</span><ins>+    // Detach the shaders
+    mFunctions-&gt;detachShader(mProgramID, vertexShaderGL-&gt;getShaderID());
+    mFunctions-&gt;detachShader(mProgramID, fragmentShaderGL-&gt;getShaderID());
+
+    // Verify the link
</ins><span class="cx">     GLint linkStatus = GL_FALSE;
</span><span class="cx">     mFunctions-&gt;getProgramiv(mProgramID, GL_LINK_STATUS, &amp;linkStatus);
</span><del>-    ASSERT(linkStatus == GL_TRUE);
</del><span class="cx">     if (linkStatus == GL_FALSE)
</span><span class="cx">     {
</span><span class="cx">         // Linking failed, put the error into the info log
</span><span class="cx">         GLint infoLogLength = 0;
</span><span class="cx">         mFunctions-&gt;getProgramiv(mProgramID, GL_INFO_LOG_LENGTH, &amp;infoLogLength);
</span><span class="cx"> 
</span><del>-        std::vector&lt;char&gt; buf(infoLogLength);
-        mFunctions-&gt;getProgramInfoLog(mProgramID, infoLogLength, nullptr, &amp;buf[0]);
</del><ins>+        std::string warning;
</ins><span class="cx"> 
</span><del>-        mFunctions-&gt;deleteProgram(mProgramID);
-        mProgramID = 0;
</del><ins>+        // Info log length includes the null terminator, so 1 means that the info log is an empty
+        // string.
+        if (infoLogLength &gt; 1)
+        {
+            std::vector&lt;char&gt; buf(infoLogLength);
+            mFunctions-&gt;getProgramInfoLog(mProgramID, infoLogLength, nullptr, &amp;buf[0]);
</ins><span class="cx"> 
</span><del>-        infoLog.append(&amp;buf[0]);
-        TRACE(&quot;\n%s&quot;, &amp;buf[0]);
</del><ins>+            mFunctions-&gt;deleteProgram(mProgramID);
+            mProgramID = 0;
</ins><span class="cx"> 
</span><ins>+            infoLog &lt;&lt; buf.data();
+
+            warning = FormatString(&quot;Program link failed unexpectedly: %s&quot;, buf.data());
+        }
+        else
+        {
+            warning = &quot;Program link failed unexpectedly with no info log.&quot;;
+        }
+        ANGLEPlatformCurrent()-&gt;logWarning(warning.c_str());
+        TRACE(&quot;\n%s&quot;, warning.c_str());
+
</ins><span class="cx">         // TODO, return GL_OUT_OF_MEMORY or just fail the link? This is an unexpected case
</span><span class="cx">         return LinkResult(false, gl::Error(GL_NO_ERROR));
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (mWorkarounds.alwaysCallUseProgramAfterLink)
+    {
+        mStateManager-&gt;forceUseProgram(mProgramID);
+    }
+
</ins><span class="cx">     // Query the uniform information
</span><del>-    // TODO: A lot of this logic should be done at the gl::Program level
-    GLint activeUniformMaxLength = 0;
-    mFunctions-&gt;getProgramiv(mProgramID, GL_ACTIVE_UNIFORM_MAX_LENGTH, &amp;activeUniformMaxLength);
-
-    std::vector&lt;GLchar&gt; uniformNameBuffer(activeUniformMaxLength);
-
-    GLint uniformCount = 0;
-    mFunctions-&gt;getProgramiv(mProgramID, GL_ACTIVE_UNIFORMS, &amp;uniformCount);
-    for (GLint i = 0; i &lt; uniformCount; i++)
</del><ins>+    ASSERT(mUniformRealLocationMap.empty());
+    const auto &amp;uniforms = mData.getUniforms();
+    for (const gl::VariableLocation &amp;entry : mData.getUniformLocations())
</ins><span class="cx">     {
</span><del>-        GLsizei uniformNameLength = 0;
-        GLint uniformSize = 0;
-        GLenum uniformType = GL_NONE;
-        mFunctions-&gt;getActiveUniform(mProgramID, i, uniformNameBuffer.size(), &amp;uniformNameLength, &amp;uniformSize, &amp;uniformType, &amp;uniformNameBuffer[0]);
-
-        std::string uniformName = gl::ParseUniformName(std::string(&amp;uniformNameBuffer[0], uniformNameLength), nullptr);
-
-        for (size_t arrayIndex = 0; arrayIndex &lt; static_cast&lt;size_t&gt;(uniformSize); arrayIndex++)
</del><ins>+        // From the spec:
+        // &quot;Locations for sequential array indices are not required to be sequential.&quot;
+        const gl::LinkedUniform &amp;uniform = uniforms[entry.index];
+        std::stringstream fullNameStr;
+        fullNameStr &lt;&lt; uniform.name;
+        if (uniform.isArray())
</ins><span class="cx">         {
</span><del>-            std::string locationName = uniformName;
-            if (uniformSize &gt; 1)
-            {
-                locationName += &quot;[&quot; + Str(arrayIndex) + &quot;]&quot;;
-            }
-
-            GLint location = mFunctions-&gt;getUniformLocation(mProgramID, locationName.c_str());
-            if (location &gt;= 0)
-            {
-                // Make sure the uniform index array is large enough
-                if (static_cast&lt;size_t&gt;(location) &gt;= mUniformIndex.size())
-                {
-                    mUniformIndex.resize(location + 1);
-                }
-
-                mUniformIndex[location] = gl::VariableLocation(uniformName, arrayIndex, static_cast&lt;unsigned int&gt;(mUniforms.size()));
-            }
</del><ins>+            fullNameStr &lt;&lt; &quot;[&quot; &lt;&lt; entry.element &lt;&lt; &quot;]&quot;;
</ins><span class="cx">         }
</span><ins>+        const std::string &amp;fullName = fullNameStr.str();
</ins><span class="cx"> 
</span><del>-        // ANGLE uses 0 to identify an non-array uniform.
-        unsigned int arraySize = (uniformSize &gt; 1) ? static_cast&lt;unsigned int&gt;(uniformSize) : 0;
-
-        // TODO: determine uniform precision
-        mUniforms.push_back(new gl::LinkedUniform(uniformType, GL_NONE, uniformName, arraySize, -1, sh::BlockMemberInfo::getDefaultBlockInfo()));
</del><ins>+        GLint realLocation = mFunctions-&gt;getUniformLocation(mProgramID, fullName.c_str());
+        mUniformRealLocationMap.push_back(realLocation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Query the attribute information
-    GLint activeAttributeMaxLength = 0;
-    mFunctions-&gt;getProgramiv(mProgramID, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &amp;activeAttributeMaxLength);
</del><ins>+    mUniformIndexToSamplerIndex.resize(mData.getUniforms().size(), GL_INVALID_INDEX);
</ins><span class="cx"> 
</span><del>-    std::vector&lt;GLchar&gt; attributeNameBuffer(activeAttributeMaxLength);
-
-    GLint attributeCount = 0;
-    mFunctions-&gt;getProgramiv(mProgramID, GL_ACTIVE_ATTRIBUTES, &amp;attributeCount);
-    for (GLint i = 0; i &lt; attributeCount; i++)
</del><ins>+    for (size_t uniformId = 0; uniformId &lt; uniforms.size(); ++uniformId)
</ins><span class="cx">     {
</span><del>-        GLsizei attributeNameLength = 0;
-        GLint attributeSize = 0;
-        GLenum attributeType = GL_NONE;
-        mFunctions-&gt;getActiveAttrib(mProgramID, i, attributeNameBuffer.size(), &amp;attributeNameLength, &amp;attributeSize, &amp;attributeType, &amp;attributeNameBuffer[0]);
</del><ins>+        const gl::LinkedUniform &amp;linkedUniform = uniforms[uniformId];
</ins><span class="cx"> 
</span><del>-        std::string attributeName(&amp;attributeNameBuffer[0], attributeNameLength);
</del><ins>+        if (!linkedUniform.isSampler() || !linkedUniform.staticUse)
+            continue;
</ins><span class="cx"> 
</span><del>-        // TODO: determine attribute precision
-        setShaderAttribute(static_cast&lt;size_t&gt;(i), attributeType, GL_NONE, attributeName, attributeSize, i);
</del><ins>+        mUniformIndexToSamplerIndex[uniformId] = mSamplerBindings.size();
+
+        // If uniform is a sampler type, insert it into the mSamplerBindings array
+        SamplerBindingGL samplerBinding;
+        samplerBinding.textureType = gl::SamplerTypeToTextureType(linkedUniform.type);
+        samplerBinding.boundTextureUnits.resize(linkedUniform.elementCount(), 0);
+        mSamplerBindings.push_back(samplerBinding);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return LinkResult(true, gl::Error(GL_NO_ERROR));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLboolean ProgramGL::validate(const gl::Caps &amp; /*caps*/, gl::InfoLog * /*infoLog*/)
+{
+    // TODO(jmadill): implement validate
+    return true;
+}
+
</ins><span class="cx"> void ProgramGL::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform1fv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform1fv(uniLoc(location), count, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform2fv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform2fv(uniLoc(location), count, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform3fv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform3fv(uniLoc(location), count, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform4fv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform4fv(uniLoc(location), count, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniform1iv(GLint location, GLsizei count, const GLint *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform1iv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform1iv(uniLoc(location), count, v);
+
+    const gl::VariableLocation &amp;locationEntry = mData.getUniformLocations()[location];
+
+    size_t samplerIndex = mUniformIndexToSamplerIndex[locationEntry.index];
+    if (samplerIndex != GL_INVALID_INDEX)
+    {
+        std::vector&lt;GLuint&gt; &amp;boundTextureUnits = mSamplerBindings[samplerIndex].boundTextureUnits;
+
+        size_t copyCount =
+            std::max&lt;size_t&gt;(count, boundTextureUnits.size() - locationEntry.element);
+        std::copy(v, v + copyCount, boundTextureUnits.begin() + locationEntry.element);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniform2iv(GLint location, GLsizei count, const GLint *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform2iv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform2iv(uniLoc(location), count, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniform3iv(GLint location, GLsizei count, const GLint *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform3iv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform3iv(uniLoc(location), count, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniform4iv(GLint location, GLsizei count, const GLint *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform4iv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform4iv(uniLoc(location), count, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
</span><span class="lines">@@ -247,173 +271,158 @@
</span><span class="cx"> void ProgramGL::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform2uiv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform2uiv(uniLoc(location), count, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform3uiv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform3uiv(uniLoc(location), count, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniform4uiv(location, count, v);
</del><ins>+    mFunctions-&gt;uniform4uiv(uniLoc(location), count, v);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniformMatrix2fv(location, count, transpose, value);
</del><ins>+    mFunctions-&gt;uniformMatrix2fv(uniLoc(location), count, transpose, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniformMatrix3fv(location, count, transpose, value);
</del><ins>+    mFunctions-&gt;uniformMatrix3fv(uniLoc(location), count, transpose, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniformMatrix4fv(location, count, transpose, value);
</del><ins>+    mFunctions-&gt;uniformMatrix4fv(uniLoc(location), count, transpose, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniformMatrix2x3fv(location, count, transpose, value);
</del><ins>+    mFunctions-&gt;uniformMatrix2x3fv(uniLoc(location), count, transpose, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniformMatrix3x2fv(location, count, transpose, value);
</del><ins>+    mFunctions-&gt;uniformMatrix3x2fv(uniLoc(location), count, transpose, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniformMatrix2x4fv(location, count, transpose, value);
</del><ins>+    mFunctions-&gt;uniformMatrix2x4fv(uniLoc(location), count, transpose, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniformMatrix4x2fv(location, count, transpose, value);
</del><ins>+    mFunctions-&gt;uniformMatrix4x2fv(uniLoc(location), count, transpose, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniformMatrix3x4fv(location, count, transpose, value);
</del><ins>+    mFunctions-&gt;uniformMatrix3x4fv(uniLoc(location), count, transpose, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ProgramGL::setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;useProgram(mProgramID);
</span><del>-    mFunctions-&gt;uniformMatrix4x3fv(location, count, transpose, value);
</del><ins>+    mFunctions-&gt;uniformMatrix4x3fv(uniLoc(location), count, transpose, value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramGL::getUniformfv(GLint location, GLfloat *params)
</del><ins>+void ProgramGL::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
</ins><span class="cx"> {
</span><del>-    mFunctions-&gt;getUniformfv(mProgramID, location, params);
-}
</del><ins>+    // Lazy init
+    if (mUniformBlockRealLocationMap.empty())
+    {
+        mUniformBlockRealLocationMap.reserve(mData.getUniformBlocks().size());
+        for (const gl::UniformBlock &amp;uniformBlock : mData.getUniformBlocks())
+        {
+            const std::string &amp;nameWithIndex = uniformBlock.nameWithArrayIndex();
+            GLuint blockIndex = mFunctions-&gt;getUniformBlockIndex(mProgramID, nameWithIndex.c_str());
+            mUniformBlockRealLocationMap.push_back(blockIndex);
+        }
+    }
</ins><span class="cx"> 
</span><del>-void ProgramGL::getUniformiv(GLint location, GLint *params)
-{
-    mFunctions-&gt;getUniformiv(mProgramID, location, params);
</del><ins>+    GLuint realBlockIndex = mUniformBlockRealLocationMap[uniformBlockIndex];
+    if (realBlockIndex != GL_INVALID_INDEX)
+    {
+        mFunctions-&gt;uniformBlockBinding(mProgramID, realBlockIndex, uniformBlockBinding);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ProgramGL::getUniformuiv(GLint location, GLuint *params)
</del><ins>+void ProgramGL::reset()
</ins><span class="cx"> {
</span><del>-    mFunctions-&gt;getUniformuiv(mProgramID, location, params);
</del><ins>+    mUniformRealLocationMap.clear();
+    mUniformBlockRealLocationMap.clear();
+    mSamplerBindings.clear();
+    mUniformIndexToSamplerIndex.clear();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLint ProgramGL::getSamplerMapping(gl::SamplerType type, unsigned int samplerIndex, const gl::Caps &amp;caps) const
</del><ins>+GLuint ProgramGL::getProgramID() const
</ins><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
-    return GLint();
</del><ins>+    return mProgramID;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLenum ProgramGL::getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const
</del><ins>+const std::vector&lt;SamplerBindingGL&gt; &amp;ProgramGL::getAppliedSamplerUniforms() const
</ins><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
-    return GLenum();
</del><ins>+    return mSamplerBindings;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLint ProgramGL::getUsedSamplerRange(gl::SamplerType type) const
</del><ins>+bool ProgramGL::getUniformBlockSize(const std::string &amp;blockName, size_t *sizeOut) const
</ins><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
-    return GLint();
-}
</del><ins>+    ASSERT(mProgramID != 0u);
</ins><span class="cx"> 
</span><del>-void ProgramGL::updateSamplerMapping()
-{
-    UNIMPLEMENTED();
-}
</del><ins>+    GLuint blockIndex = mFunctions-&gt;getUniformBlockIndex(mProgramID, blockName.c_str());
+    if (blockIndex == GL_INVALID_INDEX)
+    {
+        *sizeOut = 0;
+        return false;
+    }
</ins><span class="cx"> 
</span><del>-bool ProgramGL::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &amp;caps)
-{
-    //UNIMPLEMENTED();
</del><ins>+    GLint dataSize = 0;
+    mFunctions-&gt;getActiveUniformBlockiv(mProgramID, blockIndex, GL_UNIFORM_BLOCK_DATA_SIZE,
+                                        &amp;dataSize);
+    *sizeOut = static_cast&lt;size_t&gt;(dataSize);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-LinkResult ProgramGL::compileProgramExecutables(gl::InfoLog &amp;infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                                                int registers)
</del><ins>+bool ProgramGL::getUniformBlockMemberInfo(const std::string &amp;memberUniformName,
+                                          sh::BlockMemberInfo *memberInfoOut) const
</ins><span class="cx"> {
</span><del>-    //UNIMPLEMENTED();
-    return LinkResult(true, gl::Error(GL_NO_ERROR));
-}
</del><ins>+    GLuint uniformIndex;
+    const GLchar *memberNameGLStr = memberUniformName.c_str();
+    mFunctions-&gt;getUniformIndices(mProgramID, 1, &amp;memberNameGLStr, &amp;uniformIndex);
</ins><span class="cx"> 
</span><del>-bool ProgramGL::linkUniforms(gl::InfoLog &amp;infoLog, const gl::Shader &amp;vertexShader, const gl::Shader &amp;fragmentShader,
-                             const gl::Caps &amp;caps)
-{
-    //UNIMPLEMENTED();
-    return true;
-}
-
-bool ProgramGL::defineUniformBlock(gl::InfoLog &amp;infoLog, const gl::Shader &amp;shader, const sh::InterfaceBlock &amp;interfaceBlock,
-                                   const gl::Caps &amp;caps)
-{
-    UNIMPLEMENTED();
-    return bool();
-}
-
-gl::Error ProgramGL::applyUniforms()
-{
-    UNIMPLEMENTED();
-    return gl::Error(GL_INVALID_OPERATION);
-}
-
-gl::Error ProgramGL::applyUniformBuffers(const gl::Data &amp;data, GLuint uniformBlockBindings[])
-{
-    UNIMPLEMENTED();
-    return gl::Error(GL_INVALID_OPERATION);
-}
-
-bool ProgramGL::assignUniformBlockRegister(gl::InfoLog &amp;infoLog, gl::UniformBlock *uniformBlock, GLenum shader,
-                                           unsigned int registerIndex, const gl::Caps &amp;caps)
-{
-    UNIMPLEMENTED();
-    return bool();
-}
-
-void ProgramGL::reset()
-{
-    ProgramImpl::reset();
-
-    if (mProgramID)
</del><ins>+    if (uniformIndex == GL_INVALID_INDEX)
</ins><span class="cx">     {
</span><del>-        mFunctions-&gt;deleteProgram(mProgramID);
-        mProgramID = 0;
</del><ins>+        *memberInfoOut = sh::BlockMemberInfo::getDefaultBlockInfo();
+        return false;
</ins><span class="cx">     }
</span><del>-}
</del><span class="cx"> 
</span><del>-GLuint ProgramGL::getProgramID() const
-{
-    return mProgramID;
</del><ins>+    mFunctions-&gt;getActiveUniformsiv(mProgramID, 1, &amp;uniformIndex, GL_UNIFORM_OFFSET,
+                                    &amp;memberInfoOut-&gt;offset);
+    mFunctions-&gt;getActiveUniformsiv(mProgramID, 1, &amp;uniformIndex, GL_UNIFORM_ARRAY_STRIDE,
+                                    &amp;memberInfoOut-&gt;arrayStride);
+    mFunctions-&gt;getActiveUniformsiv(mProgramID, 1, &amp;uniformIndex, GL_UNIFORM_MATRIX_STRIDE,
+                                    &amp;memberInfoOut-&gt;matrixStride);
+
+    // TODO(jmadill): possibly determine this at the gl::Program level.
+    GLint isRowMajorMatrix = 0;
+    mFunctions-&gt;getActiveUniformsiv(mProgramID, 1, &amp;uniformIndex, GL_UNIFORM_IS_ROW_MAJOR,
+                                    &amp;isRowMajorMatrix);
+    memberInfoOut-&gt;isRowMajorMatrix = isRowMajorMatrix != GL_FALSE;
+    return true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-}
</del><ins>+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglProgramGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,6 +9,7 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_GL_PROGRAMGL_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_GL_PROGRAMGL_H_
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/renderer/gl/WorkaroundsGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/ProgramImpl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="lines">@@ -17,26 +18,27 @@
</span><span class="cx"> class FunctionsGL;
</span><span class="cx"> class StateManagerGL;
</span><span class="cx"> 
</span><ins>+struct SamplerBindingGL
+{
+    GLenum textureType;
+    std::vector&lt;GLuint&gt; boundTextureUnits;
+};
+
</ins><span class="cx"> class ProgramGL : public ProgramImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    ProgramGL(const FunctionsGL *functions, StateManagerGL *stateManager);
</del><ins>+    ProgramGL(const gl::Program::Data &amp;data,
+              const FunctionsGL *functions,
+              const WorkaroundsGL &amp;workarounds,
+              StateManagerGL *stateManager);
</ins><span class="cx">     ~ProgramGL() override;
</span><span class="cx"> 
</span><del>-    bool usesPointSize() const override;
-    int getShaderVersion() const override;
-    GLenum getTransformFeedbackBufferMode() const override;
-
-    GLenum getBinaryFormat() override;
</del><span class="cx">     LinkResult load(gl::InfoLog &amp;infoLog, gl::BinaryInputStream *stream) override;
</span><span class="cx">     gl::Error save(gl::BinaryOutputStream *stream) override;
</span><ins>+    void setBinaryRetrievableHint(bool retrievable) override;
</ins><span class="cx"> 
</span><del>-    LinkResult link(const gl::Data &amp;data, gl::InfoLog &amp;infoLog,
-                    gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                    const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings,
-                    GLenum transformFeedbackBufferMode,
-                    int *registers, std::vector&lt;gl::LinkedVarying&gt; *linkedVaryings,
-                    std::map&lt;int, gl::VariableLocation&gt; *outputVariables) override;
</del><ins>+    LinkResult link(const gl::Data &amp;data, gl::InfoLog &amp;infoLog) override;
+    GLboolean validate(const gl::Caps &amp;caps, gl::InfoLog *infoLog) override;
</ins><span class="cx"> 
</span><span class="cx">     void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
</span><span class="cx">     void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override;
</span><span class="lines">@@ -60,37 +62,34 @@
</span><span class="cx">     void setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) override;
</span><span class="cx">     void setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) override;
</span><span class="cx"> 
</span><del>-    void getUniformfv(GLint location, GLfloat *params) override;
-    void getUniformiv(GLint location, GLint *params) override;
-    void getUniformuiv(GLint location, GLuint *params) override;
</del><ins>+    void setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) override;
</ins><span class="cx"> 
</span><del>-    GLint getSamplerMapping(gl::SamplerType type, unsigned int samplerIndex, const gl::Caps &amp;caps) const override;
-    GLenum getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const override;
-    GLint getUsedSamplerRange(gl::SamplerType type) const override;
-    void updateSamplerMapping() override;
-    bool validateSamplers(gl::InfoLog *infoLog, const gl::Caps &amp;caps) override;
</del><ins>+    bool getUniformBlockSize(const std::string &amp;blockName, size_t *sizeOut) const override;
+    bool getUniformBlockMemberInfo(const std::string &amp;memberUniformName,
+                                   sh::BlockMemberInfo *memberInfoOut) const override;
</ins><span class="cx"> 
</span><del>-    LinkResult compileProgramExecutables(gl::InfoLog &amp;infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                                         int registers) override;
-
-    bool linkUniforms(gl::InfoLog &amp;infoLog, const gl::Shader &amp;vertexShader, const gl::Shader &amp;fragmentShader,
-                      const gl::Caps &amp;caps) override;
-    bool defineUniformBlock(gl::InfoLog &amp;infoLog, const gl::Shader &amp;shader, const sh::InterfaceBlock &amp;interfaceBlock,
-                            const gl::Caps &amp;caps) override;
-
-    gl::Error applyUniforms() override;
-    gl::Error applyUniformBuffers(const gl::Data &amp;data, GLuint uniformBlockBindings[]) override;
-    bool assignUniformBlockRegister(gl::InfoLog &amp;infoLog, gl::UniformBlock *uniformBlock, GLenum shader,
-                                    unsigned int registerIndex, const gl::Caps &amp;caps) override;
-
-    void reset() override;
-
</del><span class="cx">     GLuint getProgramID() const;
</span><ins>+    const std::vector&lt;SamplerBindingGL&gt; &amp;getAppliedSamplerUniforms() const;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><ins>+    void reset();
+
+    // Helper function, makes it simpler to type.
+    GLint uniLoc(GLint glLocation) const { return mUniformRealLocationMap[glLocation]; }
+
</ins><span class="cx">     const FunctionsGL *mFunctions;
</span><ins>+    const WorkaroundsGL &amp;mWorkarounds;
</ins><span class="cx">     StateManagerGL *mStateManager;
</span><span class="cx"> 
</span><ins>+    std::vector&lt;GLint&gt; mUniformRealLocationMap;
+    std::vector&lt;GLuint&gt; mUniformBlockRealLocationMap;
+
+    // An array of the samplers that are used by the program
+    std::vector&lt;SamplerBindingGL&gt; mSamplerBindings;
+
+    // A map from a mData.getUniforms() index to a mSamplerBindings index.
+    std::vector&lt;size_t&gt; mUniformIndexToSamplerIndex;
+
</ins><span class="cx">     GLuint mProgramID;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglQueryGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/QueryGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/QueryGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/QueryGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,39 +9,214 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/QueryGL.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
+#include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
</ins><span class="cx"> 
</span><ins>+namespace
+{
+
+GLuint64 MergeQueryResults(GLenum type, GLuint64 currentResult, GLuint64 newResult)
+{
+    switch (type)
+    {
+        case GL_ANY_SAMPLES_PASSED:
+        case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
+            return (currentResult == GL_TRUE || newResult == GL_TRUE) ? GL_TRUE : GL_FALSE;
+
+        case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
+            return currentResult + newResult;
+
+        case GL_TIME_ELAPSED:
+            return currentResult + newResult;
+
+        case GL_TIMESTAMP:
+            return newResult;
+
+        default:
+            UNREACHABLE();
+            return 0;
+    }
+}
+
+}  // anonymous namespace
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-QueryGL::QueryGL(GLenum type)
-    : QueryImpl(type)
-{}
</del><ins>+QueryGL::QueryGL(GLenum type, const FunctionsGL *functions, StateManagerGL *stateManager)
+    : QueryImpl(type),
+      mType(type),
+      mFunctions(functions),
+      mStateManager(stateManager),
+      mActiveQuery(0),
+      mPendingQueries(),
+      mResultSum(0)
+{
+}
</ins><span class="cx"> 
</span><span class="cx"> QueryGL::~QueryGL()
</span><del>-{}
</del><ins>+{
+    mStateManager-&gt;deleteQuery(mActiveQuery);
+    mStateManager-&gt;onDeleteQueryObject(this);
+    while (!mPendingQueries.empty())
+    {
+        mStateManager-&gt;deleteQuery(mPendingQueries.front());
+        mPendingQueries.pop_front();
+    }
+}
</ins><span class="cx"> 
</span><span class="cx"> gl::Error QueryGL::begin()
</span><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
-    return gl::Error(GL_INVALID_OPERATION);
</del><ins>+    mResultSum = 0;
+    mStateManager-&gt;onBeginQuery(this);
+    return resume();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error QueryGL::end()
</span><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
-    return gl::Error(GL_INVALID_OPERATION);
</del><ins>+    return pause();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+gl::Error QueryGL::queryCounter()
+{
+    ASSERT(mType == GL_TIMESTAMP);
+
+    // Directly create a query for the timestamp and add it to the pending query queue, as timestamp
+    // queries do not have the traditional begin/end block and never need to be paused/resumed
+    GLuint query;
+    mFunctions-&gt;genQueries(1, &amp;query);
+    mFunctions-&gt;queryCounter(query, GL_TIMESTAMP);
+    mPendingQueries.push_back(query);
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+template &lt;typename T&gt;
+gl::Error QueryGL::getResultBase(T *params)
+{
+    ASSERT(mActiveQuery == 0);
+
+    gl::Error error = flush(true);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    ASSERT(mPendingQueries.empty());
+    *params = static_cast&lt;T&gt;(mResultSum);
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error QueryGL::getResult(GLint *params)
+{
+    return getResultBase(params);
+}
+
</ins><span class="cx"> gl::Error QueryGL::getResult(GLuint *params)
</span><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
-    return gl::Error(GL_INVALID_OPERATION);
</del><ins>+    return getResultBase(params);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error QueryGL::isResultAvailable(GLuint *available)
</del><ins>+gl::Error QueryGL::getResult(GLint64 *params)
</ins><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
-    return gl::Error(GL_INVALID_OPERATION);
</del><ins>+    return getResultBase(params);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+gl::Error QueryGL::getResult(GLuint64 *params)
+{
+    return getResultBase(params);
</ins><span class="cx"> }
</span><ins>+
+gl::Error QueryGL::isResultAvailable(bool *available)
+{
+    ASSERT(mActiveQuery == 0);
+
+    gl::Error error = flush(false);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    *available = mPendingQueries.empty();
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error QueryGL::pause()
+{
+    if (mActiveQuery != 0)
+    {
+        mStateManager-&gt;endQuery(mType, mActiveQuery);
+
+        mPendingQueries.push_back(mActiveQuery);
+        mActiveQuery = 0;
+    }
+
+    // Flush to make sure the pending queries don't add up too much.
+    gl::Error error = flush(false);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error QueryGL::resume()
+{
+    if (mActiveQuery == 0)
+    {
+        // Flush to make sure the pending queries don't add up too much.
+        gl::Error error = flush(false);
+        if (error.isError())
+        {
+            return error;
+        }
+
+        mFunctions-&gt;genQueries(1, &amp;mActiveQuery);
+        mStateManager-&gt;beginQuery(mType, mActiveQuery);
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error QueryGL::flush(bool force)
+{
+    while (!mPendingQueries.empty())
+    {
+        GLuint id = mPendingQueries.front();
+        if (!force)
+        {
+            GLuint resultAvailable = 0;
+            mFunctions-&gt;getQueryObjectuiv(id, GL_QUERY_RESULT_AVAILABLE, &amp;resultAvailable);
+            if (resultAvailable == GL_FALSE)
+            {
+                return gl::Error(GL_NO_ERROR);
+            }
+        }
+
+        // Even though getQueryObjectui64v was introduced for timer queries, there is nothing in the
+        // standard that says that it doesn't work for any other queries. It also passes on all the
+        // trybots, so we use it if it is available
+        if (mFunctions-&gt;getQueryObjectui64v != nullptr)
+        {
+            GLuint64 result = 0;
+            mFunctions-&gt;getQueryObjectui64v(id, GL_QUERY_RESULT, &amp;result);
+            mResultSum = MergeQueryResults(mType, mResultSum, result);
+        }
+        else
+        {
+            GLuint result = 0;
+            mFunctions-&gt;getQueryObjectuiv(id, GL_QUERY_RESULT, &amp;result);
+            mResultSum = MergeQueryResults(mType, mResultSum, static_cast&lt;GLuint64&gt;(result));
+        }
+
+        mStateManager-&gt;deleteQuery(id);
+
+        mPendingQueries.pop_front();
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglQueryGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/QueryGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/QueryGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/QueryGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,21 +9,54 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_GL_QUERYGL_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_GL_QUERYGL_H_
</span><span class="cx"> 
</span><ins>+#include &lt;deque&gt;
+
</ins><span class="cx"> #include &quot;libANGLE/renderer/QueryImpl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+class FunctionsGL;
+class StateManagerGL;
+
</ins><span class="cx"> class QueryGL : public QueryImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    QueryGL(GLenum type);
</del><ins>+    QueryGL(GLenum type, const FunctionsGL *functions, StateManagerGL *stateManager);
</ins><span class="cx">     ~QueryGL() override;
</span><span class="cx"> 
</span><span class="cx">     gl::Error begin() override;
</span><span class="cx">     gl::Error end() override;
</span><ins>+    gl::Error queryCounter() override;
+    gl::Error getResult(GLint *params) override;
</ins><span class="cx">     gl::Error getResult(GLuint *params) override;
</span><del>-    gl::Error isResultAvailable(GLuint *available) override;
</del><ins>+    gl::Error getResult(GLint64 *params) override;
+    gl::Error getResult(GLuint64 *params) override;
+    gl::Error isResultAvailable(bool *available) override;
+
+    // OpenGL is only allowed to have one query of each type active at any given time. Since ANGLE
+    // virtualizes contexts, queries need to be able to be paused and resumed.
+    // A query is &quot;paused&quot; by ending it and pushing the ID into a list of queries awaiting readback.
+    // When it is &quot;resumed&quot;, a new query is generated and started.
+    // When a result is required, the queries are &quot;flushed&quot; by iterating over the list of pending
+    // queries and merging their results.
+    gl::Error pause();
+    gl::Error resume();
+
+  private:
+    gl::Error flush(bool force);
+
+    template &lt;typename T&gt;
+    gl::Error getResultBase(T *params);
+
+    GLenum mType;
+
+    const FunctionsGL *mFunctions;
+    StateManagerGL *mStateManager;
+
+    GLuint mActiveQuery;
+    std::deque&lt;GLuint&gt; mPendingQueries;
+    GLuint64 mResultSum;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglRenderbufferGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RenderbufferGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RenderbufferGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RenderbufferGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,42 +13,54 @@
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/formatutilsgl.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/renderergl_utils.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><del>-
-RenderbufferGL::RenderbufferGL(const FunctionsGL *functions, StateManagerGL *stateManager, const gl::TextureCapsMap &amp;textureCaps)
</del><ins>+RenderbufferGL::RenderbufferGL(const FunctionsGL *functions,
+                               const WorkaroundsGL &amp;workarounds,
+                               StateManagerGL *stateManager,
+                               const gl::TextureCapsMap &amp;textureCaps)
</ins><span class="cx">     : RenderbufferImpl(),
</span><span class="cx">       mFunctions(functions),
</span><ins>+      mWorkarounds(workarounds),
</ins><span class="cx">       mStateManager(stateManager),
</span><span class="cx">       mTextureCaps(textureCaps),
</span><span class="cx">       mRenderbufferID(0)
</span><span class="cx"> {
</span><span class="cx">     mFunctions-&gt;genRenderbuffers(1, &amp;mRenderbufferID);
</span><ins>+    mStateManager-&gt;bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RenderbufferGL::~RenderbufferGL()
</span><span class="cx"> {
</span><del>-    if (mRenderbufferID != 0)
-    {
-        mFunctions-&gt;deleteRenderbuffers(1, &amp;mRenderbufferID);
-        mRenderbufferID = 0;
-    }
</del><ins>+    mStateManager-&gt;deleteRenderbuffer(mRenderbufferID);
+    mRenderbufferID = 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error RenderbufferGL::setStorage(GLenum internalformat, size_t width, size_t height)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
</span><del>-    mFunctions-&gt;renderbufferStorage(GL_RENDERBUFFER, internalformat, width, height);
</del><ins>+
+    nativegl::RenderbufferFormat renderbufferFormat =
+        nativegl::GetRenderbufferFormat(mFunctions, mWorkarounds, internalformat);
+    mFunctions-&gt;renderbufferStorage(GL_RENDERBUFFER, renderbufferFormat.internalFormat,
+                                    static_cast&lt;GLsizei&gt;(width), static_cast&lt;GLsizei&gt;(height));
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error RenderbufferGL::setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height)
</span><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
</span><del>-    mFunctions-&gt;renderbufferStorageMultisample(GL_RENDERBUFFER, samples, internalformat, width, height);
</del><span class="cx"> 
</span><ins>+    nativegl::RenderbufferFormat renderbufferFormat =
+        nativegl::GetRenderbufferFormat(mFunctions, mWorkarounds, internalformat);
+    mFunctions-&gt;renderbufferStorageMultisample(
+        GL_RENDERBUFFER, static_cast&lt;GLsizei&gt;(samples), renderbufferFormat.internalFormat,
+        static_cast&lt;GLsizei&gt;(width), static_cast&lt;GLsizei&gt;(height));
+
</ins><span class="cx">     const gl::TextureCaps &amp;formatCaps = mTextureCaps.get(internalformat);
</span><span class="cx">     if (samples &gt; formatCaps.getMaxSamples())
</span><span class="cx">     {
</span><span class="lines">@@ -70,6 +82,12 @@
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+gl::Error RenderbufferGL::setStorageEGLImageTarget(egl::Image *image)
+{
+    UNIMPLEMENTED();
+    return gl::Error(GL_INVALID_OPERATION);
+}
+
</ins><span class="cx"> GLuint RenderbufferGL::getRenderbufferID() const
</span><span class="cx"> {
</span><span class="cx">     return mRenderbufferID;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglRenderbufferGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RenderbufferGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RenderbufferGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RenderbufferGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,15 +21,20 @@
</span><span class="cx"> 
</span><span class="cx"> class FunctionsGL;
</span><span class="cx"> class StateManagerGL;
</span><ins>+struct WorkaroundsGL;
</ins><span class="cx"> 
</span><span class="cx"> class RenderbufferGL : public RenderbufferImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    RenderbufferGL(const FunctionsGL *functions, StateManagerGL *stateManager, const gl::TextureCapsMap &amp;textureCaps);
</del><ins>+    RenderbufferGL(const FunctionsGL *functions,
+                   const WorkaroundsGL &amp;workarounds,
+                   StateManagerGL *stateManager,
+                   const gl::TextureCapsMap &amp;textureCaps);
</ins><span class="cx">     ~RenderbufferGL() override;
</span><span class="cx"> 
</span><span class="cx">     virtual gl::Error setStorage(GLenum internalformat, size_t width, size_t height) override;
</span><span class="cx">     virtual gl::Error setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height) override;
</span><ins>+    virtual gl::Error setStorageEGLImageTarget(egl::Image *image) override;
</ins><span class="cx"> 
</span><span class="cx">     GLuint getRenderbufferID() const;
</span><span class="cx"> 
</span><span class="lines">@@ -41,6 +46,7 @@
</span><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     const FunctionsGL *mFunctions;
</span><ins>+    const WorkaroundsGL &amp;mWorkarounds;
</ins><span class="cx">     StateManagerGL *mStateManager;
</span><span class="cx">     const gl::TextureCapsMap &amp;mTextureCaps;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglRendererGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RendererGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RendererGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RendererGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,9 +8,13 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/RendererGL.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;EGL/eglext.h&gt;
+
</ins><span class="cx"> #include &quot;common/debug.h&quot;
</span><ins>+#include &quot;libANGLE/AttributeMap.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Data.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/BlitGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/BufferGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/CompilerGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/FenceNVGL.h&quot;
</span><span class="lines">@@ -20,6 +24,7 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/ProgramGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/QueryGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/RenderbufferGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/SamplerGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/ShaderGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/SurfaceGL.h&quot;
</span><span class="lines">@@ -28,20 +33,94 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/VertexArrayGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/renderergl_utils.h&quot;
</span><span class="cx"> 
</span><ins>+#ifndef NDEBUG
+static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length,
+                                                   const GLchar *message, const void *userParam)
+{
+    std::string sourceText;
+    switch (source)
+    {
+      case GL_DEBUG_SOURCE_API:             sourceText = &quot;OpenGL&quot;;          break;
+      case GL_DEBUG_SOURCE_WINDOW_SYSTEM:   sourceText = &quot;Windows&quot;;         break;
+      case GL_DEBUG_SOURCE_SHADER_COMPILER: sourceText = &quot;Shader Compiler&quot;; break;
+      case GL_DEBUG_SOURCE_THIRD_PARTY:     sourceText = &quot;Third Party&quot;;     break;
+      case GL_DEBUG_SOURCE_APPLICATION:     sourceText = &quot;Application&quot;;     break;
+      case GL_DEBUG_SOURCE_OTHER:           sourceText = &quot;Other&quot;;           break;
+      default:                              sourceText = &quot;UNKNOWN&quot;;         break;
+    }
+
+    std::string typeText;
+    switch (type)
+    {
+      case GL_DEBUG_TYPE_ERROR:               typeText = &quot;Error&quot;;               break;
+      case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: typeText = &quot;Deprecated behavior&quot;; break;
+      case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:  typeText = &quot;Undefined behavior&quot;;  break;
+      case GL_DEBUG_TYPE_PORTABILITY:         typeText = &quot;Portability&quot;;         break;
+      case GL_DEBUG_TYPE_PERFORMANCE:         typeText = &quot;Performance&quot;;         break;
+      case GL_DEBUG_TYPE_OTHER:               typeText = &quot;Other&quot;;               break;
+      case GL_DEBUG_TYPE_MARKER:              typeText = &quot;Marker&quot;;              break;
+      default:                                typeText = &quot;UNKNOWN&quot;;             break;
+    }
+
+    std::string severityText;
+    switch (severity)
+    {
+      case GL_DEBUG_SEVERITY_HIGH:         severityText = &quot;High&quot;;         break;
+      case GL_DEBUG_SEVERITY_MEDIUM:       severityText = &quot;Medium&quot;;       break;
+      case GL_DEBUG_SEVERITY_LOW:          severityText = &quot;Low&quot;;          break;
+      case GL_DEBUG_SEVERITY_NOTIFICATION: severityText = &quot;Notification&quot;; break;
+      default:                             severityText = &quot;UNKNOWN&quot;;      break;
+    }
+
+    ERR(&quot;\n\tSource: %s\n\tType: %s\n\tID: %d\n\tSeverity: %s\n\tMessage: %s&quot;, sourceText.c_str(), typeText.c_str(), id,
+        severityText.c_str(), message);
+}
+#endif
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-RendererGL::RendererGL(const FunctionsGL *functions)
</del><ins>+RendererGL::RendererGL(const FunctionsGL *functions, const egl::AttributeMap &amp;attribMap)
</ins><span class="cx">     : Renderer(),
</span><ins>+      mMaxSupportedESVersion(0, 0),
</ins><span class="cx">       mFunctions(functions),
</span><del>-      mStateManager(nullptr)
</del><ins>+      mStateManager(nullptr),
+      mBlitter(nullptr),
+      mHasDebugOutput(false),
+      mSkipDrawCalls(false)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mFunctions);
</span><span class="cx">     mStateManager = new StateManagerGL(mFunctions, getRendererCaps());
</span><ins>+    nativegl_gl::GenerateWorkarounds(mFunctions, &amp;mWorkarounds);
+    mBlitter = new BlitGL(functions, mWorkarounds, mStateManager);
+
+    mHasDebugOutput = mFunctions-&gt;isAtLeastGL(gl::Version(4, 3)) ||
+                      mFunctions-&gt;hasGLExtension(&quot;GL_KHR_debug&quot;) ||
+                      mFunctions-&gt;isAtLeastGLES(gl::Version(3, 2)) ||
+                      mFunctions-&gt;hasGLESExtension(&quot;GL_KHR_debug&quot;);
+#ifndef NDEBUG
+    if (mHasDebugOutput)
+    {
+        mFunctions-&gt;enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+        mFunctions-&gt;debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE);
+        mFunctions-&gt;debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr, GL_TRUE);
+        mFunctions-&gt;debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, nullptr, GL_FALSE);
+        mFunctions-&gt;debugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
+        mFunctions-&gt;debugMessageCallback(&amp;LogGLDebugMessage, nullptr);
+    }
+#endif
+
+    EGLint deviceType =
+        static_cast&lt;EGLint&gt;(attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_NONE));
+    if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
+    {
+        mSkipDrawCalls = true;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RendererGL::~RendererGL()
</span><span class="cx"> {
</span><ins>+    SafeDelete(mBlitter);
</ins><span class="cx">     SafeDelete(mStateManager);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -53,78 +132,161 @@
</span><span class="cx"> 
</span><span class="cx"> gl::Error RendererGL::finish()
</span><span class="cx"> {
</span><ins>+#ifdef NDEBUG
+    if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable &amp;&amp; mHasDebugOutput)
+    {
+        mFunctions-&gt;enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+    }
+#endif
+
</ins><span class="cx">     mFunctions-&gt;finish();
</span><ins>+
+#ifdef NDEBUG
+    if (mWorkarounds.finishDoesNotCauseQueriesToBeAvailable &amp;&amp; mHasDebugOutput)
+    {
+        mFunctions-&gt;disable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+    }
+#endif
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error RendererGL::drawArrays(const gl::Data &amp;data, GLenum mode,
-                                 GLint first, GLsizei count, GLsizei instances)
</del><ins>+gl::Error RendererGL::drawArrays(const gl::Data &amp;data, GLenum mode, GLint first, GLsizei count)
</ins><span class="cx"> {
</span><del>-    gl::Error error = mStateManager-&gt;setDrawArraysState(data, first, count);
</del><ins>+    gl::Error error = mStateManager-&gt;setDrawArraysState(data, first, count, 0);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mFunctions-&gt;drawArrays(mode, first, count);
</del><ins>+    if (!mSkipDrawCalls)
+    {
+        mFunctions-&gt;drawArrays(mode, first, count);
+    }
</ins><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error RendererGL::drawElements(const gl::Data &amp;data, GLenum mode, GLsizei count, GLenum type,
-                                   const GLvoid *indices, GLsizei instances,
-                                   const RangeUI &amp;indexRange)
</del><ins>+gl::Error RendererGL::drawArraysInstanced(const gl::Data &amp;data,
+                                          GLenum mode,
+                                          GLint first,
+                                          GLsizei count,
+                                          GLsizei instanceCount)
</ins><span class="cx"> {
</span><del>-    if (instances &gt; 0)
</del><ins>+    gl::Error error = mStateManager-&gt;setDrawArraysState(data, first, count, instanceCount);
+    if (error.isError())
</ins><span class="cx">     {
</span><del>-        UNIMPLEMENTED();
</del><ins>+        return error;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (!mSkipDrawCalls)
+    {
+        mFunctions-&gt;drawArraysInstanced(mode, first, count, instanceCount);
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
+gl::Error RendererGL::drawElements(const gl::Data &amp;data,
+                                   GLenum mode,
+                                   GLsizei count,
+                                   GLenum type,
+                                   const GLvoid *indices,
+                                   const gl::IndexRange &amp;indexRange)
+{
</ins><span class="cx">     const GLvoid *drawIndexPointer = nullptr;
</span><del>-    gl::Error error = mStateManager-&gt;setDrawElementsState(data, count, type, indices, &amp;drawIndexPointer);
</del><ins>+    gl::Error error =
+        mStateManager-&gt;setDrawElementsState(data, count, type, indices, 0, &amp;drawIndexPointer);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mFunctions-&gt;drawElements(mode, count, type, drawIndexPointer);
</del><ins>+    if (!mSkipDrawCalls)
+    {
+        mFunctions-&gt;drawElements(mode, count, type, drawIndexPointer);
+    }
</ins><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CompilerImpl *RendererGL::createCompiler(const gl::Data &amp;data)
</del><ins>+gl::Error RendererGL::drawElementsInstanced(const gl::Data &amp;data,
+                                            GLenum mode,
+                                            GLsizei count,
+                                            GLenum type,
+                                            const GLvoid *indices,
+                                            GLsizei instances,
+                                            const gl::IndexRange &amp;indexRange)
</ins><span class="cx"> {
</span><del>-    return new CompilerGL(data);
</del><ins>+    const GLvoid *drawIndexPointer = nullptr;
+    gl::Error error = mStateManager-&gt;setDrawElementsState(data, count, type, indices, instances,
+                                                          &amp;drawIndexPointer);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (!mSkipDrawCalls)
+    {
+        mFunctions-&gt;drawElementsInstanced(mode, count, type, drawIndexPointer, instances);
+    }
+
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ShaderImpl *RendererGL::createShader(GLenum type)
</del><ins>+gl::Error RendererGL::drawRangeElements(const gl::Data &amp;data,
+                                        GLenum mode,
+                                        GLuint start,
+                                        GLuint end,
+                                        GLsizei count,
+                                        GLenum type,
+                                        const GLvoid *indices,
+                                        const gl::IndexRange &amp;indexRange)
</ins><span class="cx"> {
</span><del>-    return new ShaderGL(type, mFunctions);
</del><ins>+    const GLvoid *drawIndexPointer = nullptr;
+    gl::Error error =
+        mStateManager-&gt;setDrawElementsState(data, count, type, indices, 0, &amp;drawIndexPointer);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (!mSkipDrawCalls)
+    {
+        mFunctions-&gt;drawRangeElements(mode, start, end, count, type, drawIndexPointer);
+    }
+
+    return gl::Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ProgramImpl *RendererGL::createProgram()
</del><ins>+CompilerImpl *RendererGL::createCompiler()
</ins><span class="cx"> {
</span><del>-    return new ProgramGL(mFunctions, mStateManager);
</del><ins>+    return new CompilerGL(mFunctions);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-FramebufferImpl *RendererGL::createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data)
</del><ins>+ShaderImpl *RendererGL::createShader(const gl::Shader::Data &amp;data)
</ins><span class="cx"> {
</span><del>-    return new FramebufferGL(data, mFunctions, mStateManager, true);
</del><ins>+    return new ShaderGL(data, mFunctions, mWorkarounds);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ProgramImpl *RendererGL::createProgram(const gl::Program::Data &amp;data)
+{
+    return new ProgramGL(data, mFunctions, mWorkarounds, mStateManager);
+}
+
</ins><span class="cx"> FramebufferImpl *RendererGL::createFramebuffer(const gl::Framebuffer::Data &amp;data)
</span><span class="cx"> {
</span><del>-    return new FramebufferGL(data, mFunctions, mStateManager, false);
</del><ins>+    return new FramebufferGL(data, mFunctions, mStateManager, mWorkarounds, false);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureImpl *RendererGL::createTexture(GLenum target)
</span><span class="cx"> {
</span><del>-    return new TextureGL(target, mFunctions, mStateManager);
</del><ins>+    return new TextureGL(target, mFunctions, mWorkarounds, mStateManager, mBlitter);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RenderbufferImpl *RendererGL::createRenderbuffer()
</span><span class="cx"> {
</span><del>-    return new RenderbufferGL(mFunctions, mStateManager, getRendererTextureCaps());
</del><ins>+    return new RenderbufferGL(mFunctions, mWorkarounds, mStateManager, getRendererTextureCaps());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> BufferImpl *RendererGL::createBuffer()
</span><span class="lines">@@ -132,14 +294,14 @@
</span><span class="cx">     return new BufferGL(mFunctions, mStateManager);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-VertexArrayImpl *RendererGL::createVertexArray()
</del><ins>+VertexArrayImpl *RendererGL::createVertexArray(const gl::VertexArray::Data &amp;data)
</ins><span class="cx"> {
</span><del>-    return new VertexArrayGL(mFunctions, mStateManager);
</del><ins>+    return new VertexArrayGL(data, mFunctions, mStateManager);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> QueryImpl *RendererGL::createQuery(GLenum type)
</span><span class="cx"> {
</span><del>-    return new QueryGL(type);
</del><ins>+    return new QueryGL(type, mFunctions, mStateManager);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FenceNVImpl *RendererGL::createFenceNV()
</span><span class="lines">@@ -154,9 +316,31 @@
</span><span class="cx"> 
</span><span class="cx"> TransformFeedbackImpl *RendererGL::createTransformFeedback()
</span><span class="cx"> {
</span><del>-    return new TransformFeedbackGL();
</del><ins>+    return new TransformFeedbackGL(mFunctions, mStateManager,
+                                   getRendererCaps().maxTransformFeedbackSeparateComponents);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+SamplerImpl *RendererGL::createSampler()
+{
+    return new SamplerGL(mFunctions, mStateManager);
+}
+
+void RendererGL::insertEventMarker(GLsizei length, const char *marker)
+{
+    mFunctions-&gt;debugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0,
+                                   GL_DEBUG_SEVERITY_NOTIFICATION, length, marker);
+}
+
+void RendererGL::pushGroupMarker(GLsizei length, const char *marker)
+{
+    mFunctions-&gt;pushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, length, marker);
+}
+
+void RendererGL::popGroupMarker()
+{
+    mFunctions-&gt;popDebugGroup();
+}
+
</ins><span class="cx"> void RendererGL::notifyDeviceLost()
</span><span class="cx"> {
</span><span class="cx">     UNIMPLEMENTED();
</span><span class="lines">@@ -180,12 +364,6 @@
</span><span class="cx">     return bool();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-VendorID RendererGL::getVendorId() const
-{
-    UNIMPLEMENTED();
-    return VendorID();
-}
-
</del><span class="cx"> std::string RendererGL::getVendorString() const
</span><span class="cx"> {
</span><span class="cx">     return std::string(reinterpret_cast&lt;const char*&gt;(mFunctions-&gt;getString(GL_VENDOR)));
</span><span class="lines">@@ -198,24 +376,64 @@
</span><span class="cx"> 
</span><span class="cx">     std::ostringstream rendererString;
</span><span class="cx">     rendererString &lt;&lt; nativeVendorString &lt;&lt; &quot; &quot; &lt;&lt; nativeRendererString &lt;&lt; &quot; OpenGL&quot;;
</span><del>-    if (mFunctions-&gt;openGLES)
</del><ins>+    if (mFunctions-&gt;standard == STANDARD_GL_ES)
</ins><span class="cx">     {
</span><span class="cx">         rendererString &lt;&lt; &quot; ES&quot;;
</span><span class="cx">     }
</span><del>-    rendererString &lt;&lt; &quot; &quot; &lt;&lt; mFunctions-&gt;majorVersion &lt;&lt; &quot;.&quot; &lt;&lt; mFunctions-&gt;minorVersion;
</del><ins>+    rendererString &lt;&lt; &quot; &quot; &lt;&lt; mFunctions-&gt;version.major &lt;&lt; &quot;.&quot; &lt;&lt; mFunctions-&gt;version.minor;
+    if (mFunctions-&gt;standard == STANDARD_GL_DESKTOP)
+    {
+        // Some drivers (NVIDIA) use a profile mask of 0 when in compatibility profile.
+        if ((mFunctions-&gt;profile &amp; GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0 ||
+            (mFunctions-&gt;isAtLeastGL(gl::Version(3, 2)) &amp;&amp; mFunctions-&gt;profile == 0))
+        {
+            rendererString &lt;&lt; &quot; compatibility&quot;;
+        }
+        else if ((mFunctions-&gt;profile &amp; GL_CONTEXT_CORE_PROFILE_BIT) != 0)
+        {
+            rendererString &lt;&lt; &quot; core&quot;;
+        }
+    }
</ins><span class="cx"> 
</span><span class="cx">     return rendererString.str();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps, gl::Extensions *outExtensions) const
</del><ins>+const gl::Version &amp;RendererGL::getMaxSupportedESVersion() const
</ins><span class="cx"> {
</span><del>-    nativegl_gl::GenerateCaps(mFunctions, outCaps, outTextureCaps, outExtensions);
</del><ins>+    // Force generation of caps
+    getRendererCaps();
+
+    return mMaxSupportedESVersion;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Workarounds RendererGL::generateWorkarounds() const
</del><ins>+void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps,
+                              gl::Extensions *outExtensions,
+                              gl::Limitations * /* outLimitations */) const
</ins><span class="cx"> {
</span><del>-    Workarounds workarounds;
-    return workarounds;
</del><ins>+    nativegl_gl::GenerateCaps(mFunctions, outCaps, outTextureCaps, outExtensions, &amp;mMaxSupportedESVersion);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RendererGL::syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;dirtyBits)
+{
+    mStateManager-&gt;syncState(state, dirtyBits);
</ins><span class="cx"> }
</span><ins>+
+GLint RendererGL::getGPUDisjoint()
+{
+    // TODO(ewell): On GLES backends we should find a way to reliably query disjoint events
+    return 0;
+}
+
+GLint64 RendererGL::getTimestamp()
+{
+    GLint64 result = 0;
+    mFunctions-&gt;getInteger64v(GL_TIMESTAMP, &amp;result);
+    return result;
+}
+
+void RendererGL::onMakeCurrent(const gl::Data &amp;data)
+{
+    // Queries need to be paused/resumed on context switches
+    mStateManager-&gt;onMakeCurrent(data);
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglRendererGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RendererGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RendererGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/RendererGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,35 +9,60 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_GL_RENDERERGL_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_GL_RENDERERGL_H_
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/Version.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/Renderer.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/WorkaroundsGL.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+class BlitGL;
</ins><span class="cx"> class FunctionsGL;
</span><span class="cx"> class StateManagerGL;
</span><span class="cx"> 
</span><span class="cx"> class RendererGL : public Renderer
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    RendererGL(const FunctionsGL *functions);
</del><ins>+    RendererGL(const FunctionsGL *functions, const egl::AttributeMap &amp;attribMap);
</ins><span class="cx">     ~RendererGL() override;
</span><span class="cx"> 
</span><span class="cx">     gl::Error flush() override;
</span><span class="cx">     gl::Error finish() override;
</span><span class="cx"> 
</span><del>-    gl::Error drawArrays(const gl::Data &amp;data, GLenum mode,
-                         GLint first, GLsizei count, GLsizei instances) override;
-    gl::Error drawElements(const gl::Data &amp;data, GLenum mode, GLsizei count, GLenum type,
-                           const GLvoid *indices, GLsizei instances,
-                           const RangeUI &amp;indexRange) override;
</del><ins>+    gl::Error drawArrays(const gl::Data &amp;data, GLenum mode, GLint first, GLsizei count) override;
+    gl::Error drawArraysInstanced(const gl::Data &amp;data,
+                                  GLenum mode,
+                                  GLint first,
+                                  GLsizei count,
+                                  GLsizei instanceCount) override;
</ins><span class="cx"> 
</span><ins>+    gl::Error drawElements(const gl::Data &amp;data,
+                           GLenum mode,
+                           GLsizei count,
+                           GLenum type,
+                           const GLvoid *indices,
+                           const gl::IndexRange &amp;indexRange) override;
+    gl::Error drawElementsInstanced(const gl::Data &amp;data,
+                                    GLenum mode,
+                                    GLsizei count,
+                                    GLenum type,
+                                    const GLvoid *indices,
+                                    GLsizei instances,
+                                    const gl::IndexRange &amp;indexRange) override;
+    gl::Error drawRangeElements(const gl::Data &amp;data,
+                                GLenum mode,
+                                GLuint start,
+                                GLuint end,
+                                GLsizei count,
+                                GLenum type,
+                                const GLvoid *indices,
+                                const gl::IndexRange &amp;indexRange) override;
+
</ins><span class="cx">     // Shader creation
</span><del>-    CompilerImpl *createCompiler(const gl::Data &amp;data) override;
-    ShaderImpl *createShader(GLenum type) override;
-    ProgramImpl *createProgram() override;
</del><ins>+    CompilerImpl *createCompiler() override;
+    ShaderImpl *createShader(const gl::Shader::Data &amp;data) override;
+    ProgramImpl *createProgram(const gl::Program::Data &amp;data) override;
</ins><span class="cx"> 
</span><span class="cx">     // Framebuffer creation
</span><del>-    FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data) override;
</del><span class="cx">     FramebufferImpl *createFramebuffer(const gl::Framebuffer::Data &amp;data) override;
</span><span class="cx"> 
</span><span class="cx">     // Texture creation
</span><span class="lines">@@ -50,7 +75,7 @@
</span><span class="cx">     BufferImpl *createBuffer() override;
</span><span class="cx"> 
</span><span class="cx">     // Vertex Array creation
</span><del>-    VertexArrayImpl *createVertexArray() override;
</del><ins>+    VertexArrayImpl *createVertexArray(const gl::VertexArray::Data &amp;data) override;
</ins><span class="cx"> 
</span><span class="cx">     // Query and Fence creation
</span><span class="cx">     QueryImpl *createQuery(GLenum type) override;
</span><span class="lines">@@ -60,22 +85,53 @@
</span><span class="cx">     // Transform Feedback creation
</span><span class="cx">     TransformFeedbackImpl *createTransformFeedback() override;
</span><span class="cx"> 
</span><ins>+    // Sampler object creation
+    SamplerImpl *createSampler() override;
+
+    // EXT_debug_marker
+    void insertEventMarker(GLsizei length, const char *marker) override;
+    void pushGroupMarker(GLsizei length, const char *marker) override;
+    void popGroupMarker() override;
+
</ins><span class="cx">     // lost device
</span><span class="cx">     void notifyDeviceLost() override;
</span><span class="cx">     bool isDeviceLost() const override;
</span><span class="cx">     bool testDeviceLost() override;
</span><span class="cx">     bool testDeviceResettable() override;
</span><span class="cx"> 
</span><del>-    VendorID getVendorId() const override;
</del><span class="cx">     std::string getVendorString() const override;
</span><span class="cx">     std::string getRendererDescription() const override;
</span><span class="cx"> 
</span><ins>+    void syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;dirtyBits) override;
+
+    GLint getGPUDisjoint() override;
+    GLint64 getTimestamp() override;
+
+    void onMakeCurrent(const gl::Data &amp;data) override;
+
+    const gl::Version &amp;getMaxSupportedESVersion() const;
+    const FunctionsGL *getFunctions() const { return mFunctions; }
+    StateManagerGL *getStateManager() const { return mStateManager; }
+    const WorkaroundsGL &amp;getWorkarounds() const { return mWorkarounds; }
+
</ins><span class="cx">   private:
</span><del>-    void generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps, gl::Extensions *outExtensions) const override;
-    Workarounds generateWorkarounds() const override;
</del><ins>+    void generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps,
+                      gl::Extensions *outExtensions,
+                      gl::Limitations *outLimitations) const override;
</ins><span class="cx"> 
</span><ins>+    mutable gl::Version mMaxSupportedESVersion;
+
</ins><span class="cx">     const FunctionsGL *mFunctions;
</span><span class="cx">     StateManagerGL *mStateManager;
</span><ins>+
+    BlitGL *mBlitter;
+
+    WorkaroundsGL mWorkarounds;
+
+    bool mHasDebugOutput;
+
+    // For performance debugging
+    bool mSkipDrawCalls;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglSamplerGLcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SamplerGL.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SamplerGL.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SamplerGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,72 @@
</span><ins>+//
+// Copyright 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// SamplerGL.cpp: Defines the rx::SamplerGL class, an implementation of SamplerImpl.
+
+#include &quot;libANGLE/renderer/gl/SamplerGL.h&quot;
+
+#include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
+#include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
+
+namespace
+{
+
+template &lt;typename T&gt;
+static inline void SyncSamplerStateMember(const rx::FunctionsGL *functions,
+                                          GLuint sampler,
+                                          const gl::SamplerState &amp;newState,
+                                          gl::SamplerState &amp;curState,
+                                          GLenum name,
+                                          T(gl::SamplerState::*samplerMember))
+{
+    if (curState.*samplerMember != newState.*samplerMember)
+    {
+        curState.*samplerMember = newState.*samplerMember;
+        functions-&gt;samplerParameterf(sampler, name, static_cast&lt;GLfloat&gt;(curState.*samplerMember));
+    }
+}
+}
+
+namespace rx
+{
+
+SamplerGL::SamplerGL(const FunctionsGL *functions, StateManagerGL *stateManager)
+    : SamplerImpl(),
+      mFunctions(functions),
+      mStateManager(stateManager),
+      mAppliedSamplerState(),
+      mSamplerID(0)
+{
+    mFunctions-&gt;genSamplers(1, &amp;mSamplerID);
+}
+
+SamplerGL::~SamplerGL()
+{
+    mStateManager-&gt;deleteSampler(mSamplerID);
+    mSamplerID = 0;
+}
+
+void SamplerGL::syncState(const gl::SamplerState &amp;samplerState) const
+{
+    // clang-format off
+    SyncSamplerStateMember(mFunctions, mSamplerID, samplerState, mAppliedSamplerState, GL_TEXTURE_MIN_FILTER, &amp;gl::SamplerState::minFilter);
+    SyncSamplerStateMember(mFunctions, mSamplerID, samplerState, mAppliedSamplerState, GL_TEXTURE_MAG_FILTER, &amp;gl::SamplerState::magFilter);
+    SyncSamplerStateMember(mFunctions, mSamplerID, samplerState, mAppliedSamplerState, GL_TEXTURE_WRAP_S, &amp;gl::SamplerState::wrapS);
+    SyncSamplerStateMember(mFunctions, mSamplerID, samplerState, mAppliedSamplerState, GL_TEXTURE_WRAP_T, &amp;gl::SamplerState::wrapT);
+    SyncSamplerStateMember(mFunctions, mSamplerID, samplerState, mAppliedSamplerState, GL_TEXTURE_WRAP_R, &amp;gl::SamplerState::wrapR);
+    SyncSamplerStateMember(mFunctions, mSamplerID, samplerState, mAppliedSamplerState, GL_TEXTURE_MAX_ANISOTROPY_EXT, &amp;gl::SamplerState::maxAnisotropy);
+    SyncSamplerStateMember(mFunctions, mSamplerID, samplerState, mAppliedSamplerState, GL_TEXTURE_MIN_LOD, &amp;gl::SamplerState::minLod);
+    SyncSamplerStateMember(mFunctions, mSamplerID, samplerState, mAppliedSamplerState, GL_TEXTURE_MAX_LOD, &amp;gl::SamplerState::maxLod);
+    SyncSamplerStateMember(mFunctions, mSamplerID, samplerState, mAppliedSamplerState, GL_TEXTURE_COMPARE_MODE, &amp;gl::SamplerState::compareMode);
+    SyncSamplerStateMember(mFunctions, mSamplerID, samplerState, mAppliedSamplerState, GL_TEXTURE_COMPARE_FUNC, &amp;gl::SamplerState::compareFunc);
+    // clang-format on
+}
+
+GLuint SamplerGL::getSamplerID() const
+{
+    return mSamplerID;
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglSamplerGLh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SamplerGL.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SamplerGL.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SamplerGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,40 @@
</span><ins>+//
+// Copyright 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// SamplerGL.h: Defines the rx::SamplerGL class, an implementation of SamplerImpl.
+
+#ifndef LIBANGLE_RENDERER_GL_SAMPLERGL_H_
+#define LIBANGLE_RENDERER_GL_SAMPLERGL_H_
+
+#include &quot;libANGLE/angletypes.h&quot;
+#include &quot;libANGLE/renderer/SamplerImpl.h&quot;
+
+namespace rx
+{
+
+class FunctionsGL;
+class StateManagerGL;
+
+class SamplerGL : public SamplerImpl
+{
+  public:
+    SamplerGL(const FunctionsGL *functions, StateManagerGL *stateManager);
+    ~SamplerGL() override;
+
+    void syncState(const gl::SamplerState &amp;samplerState) const;
+
+    GLuint getSamplerID() const;
+
+  private:
+    const FunctionsGL *mFunctions;
+    StateManagerGL *mStateManager;
+
+    mutable gl::SamplerState mAppliedSamplerState;
+    GLuint mSamplerID;
+};
+}
+
+#endif  // LIBANGLE_RENDERER_GL_SAMPLERGL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglShaderGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,40 +10,19 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Compiler.h&quot;
</span><del>-#include &quot;libANGLE/renderer/gl/CompilerGL.h&quot;
</del><span class="cx"> #include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/RendererGL.h&quot;
+#include &quot;libANGLE/renderer/gl/WorkaroundsGL.h&quot;
</ins><span class="cx"> 
</span><del>-template &lt;typename VarT&gt;
-static std::vector&lt;VarT&gt; GetFilteredShaderVariables(const std::vector&lt;VarT&gt; *variableList)
-{
-    ASSERT(variableList);
-    std::vector&lt;VarT&gt; result;
-    for (size_t varIndex = 0; varIndex &lt; variableList-&gt;size(); varIndex++)
-    {
-        const VarT &amp;var = variableList-&gt;at(varIndex);
-        if (var.staticUse)
-        {
-            result.push_back(var);
-        }
-    }
-    return result;
-}
</del><ins>+#include &lt;iostream&gt;
</ins><span class="cx"> 
</span><del>-template &lt;typename VarT&gt;
-static const std::vector&lt;VarT&gt; &amp;GetShaderVariables(const std::vector&lt;VarT&gt; *variableList)
-{
-    ASSERT(variableList);
-    return *variableList;
-}
-
</del><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-ShaderGL::ShaderGL(GLenum type, const FunctionsGL *functions)
-    : ShaderImpl(),
-      mFunctions(functions),
-      mType(type),
-      mShaderID(0)
</del><ins>+ShaderGL::ShaderGL(const gl::Shader::Data &amp;data,
+                   const FunctionsGL *functions,
+                   const WorkaroundsGL &amp;workarounds)
+    : ShaderImpl(data), mFunctions(functions), mWorkarounds(workarounds), mShaderID(0)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mFunctions);
</span><span class="cx"> }
</span><span class="lines">@@ -57,84 +36,67 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ShaderGL::compile(gl::Compiler *compiler, const std::string &amp;source)
</del><ins>+int ShaderGL::prepareSourceAndReturnOptions(std::stringstream *sourceStream,
+                                            std::string * /*sourcePath*/)
</ins><span class="cx"> {
</span><span class="cx">     // Reset the previous state
</span><del>-    mActiveAttributes.clear();
-    mVaryings.clear();
-    mUniforms.clear();
-    mInterfaceBlocks.clear();
-    mActiveOutputVariables.clear();
</del><span class="cx">     if (mShaderID != 0)
</span><span class="cx">     {
</span><span class="cx">         mFunctions-&gt;deleteShader(mShaderID);
</span><span class="cx">         mShaderID = 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Translate the ESSL into GLSL
-    CompilerGL *compilerGL = GetImplAs&lt;CompilerGL&gt;(compiler);
-    ShHandle compilerHandle = compilerGL-&gt;getCompilerHandle(mType);
</del><ins>+    *sourceStream &lt;&lt; mData.getSource();
</ins><span class="cx"> 
</span><del>-    int compileOptions = (SH_OBJECT_CODE | SH_VARIABLES);
-    const char* sourceCString = source.c_str();
-    if (!ShCompile(compilerHandle, &amp;sourceCString, 1, compileOptions))
</del><ins>+    int options = SH_INIT_GL_POSITION;
+
+    if (mWorkarounds.doWhileGLSLCausesGPUHang)
</ins><span class="cx">     {
</span><del>-        mInfoLog = ShGetInfoLog(compilerHandle);
-        TRACE(&quot;\n%s&quot;, mInfoLog.c_str());
-        return false;
</del><ins>+        options |= SH_REWRITE_DO_WHILE_LOOPS;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mTranslatedSource = ShGetObjectCode(compilerHandle);
-    const char* translatedSourceCString = mTranslatedSource.c_str();
</del><ins>+    return options;
+}
</ins><span class="cx"> 
</span><ins>+bool ShaderGL::postTranslateCompile(gl::Compiler *compiler, std::string *infoLog)
+{
+    // Translate the ESSL into GLSL
+    const char *translatedSourceCString = mData.getTranslatedSource().c_str();
+
</ins><span class="cx">     // Generate a shader object and set the source
</span><del>-    mShaderID = mFunctions-&gt;createShader(mType);
</del><ins>+    mShaderID = mFunctions-&gt;createShader(mData.getShaderType());
</ins><span class="cx">     mFunctions-&gt;shaderSource(mShaderID, 1, &amp;translatedSourceCString, nullptr);
</span><span class="cx">     mFunctions-&gt;compileShader(mShaderID);
</span><span class="cx"> 
</span><span class="cx">     // Check for compile errors from the native driver
</span><span class="cx">     GLint compileStatus = GL_FALSE;
</span><span class="cx">     mFunctions-&gt;getShaderiv(mShaderID, GL_COMPILE_STATUS, &amp;compileStatus);
</span><del>-    ASSERT(compileStatus == GL_TRUE);
</del><span class="cx">     if (compileStatus == GL_FALSE)
</span><span class="cx">     {
</span><span class="cx">         // Compilation failed, put the error into the info log
</span><span class="cx">         GLint infoLogLength = 0;
</span><span class="cx">         mFunctions-&gt;getShaderiv(mShaderID, GL_INFO_LOG_LENGTH, &amp;infoLogLength);
</span><span class="cx"> 
</span><del>-        std::vector&lt;char&gt; buf(infoLogLength);
-        mFunctions-&gt;getShaderInfoLog(mShaderID, infoLogLength, nullptr, &amp;buf[0]);
</del><ins>+        // Info log length includes the null terminator, so 1 means that the info log is an empty
+        // string.
+        if (infoLogLength &gt; 1)
+        {
+            std::vector&lt;char&gt; buf(infoLogLength);
+            mFunctions-&gt;getShaderInfoLog(mShaderID, infoLogLength, nullptr, &amp;buf[0]);
</ins><span class="cx"> 
</span><del>-        mFunctions-&gt;deleteShader(mShaderID);
-        mShaderID = 0;
</del><ins>+            mFunctions-&gt;deleteShader(mShaderID);
+            mShaderID = 0;
</ins><span class="cx"> 
</span><del>-        mInfoLog = &amp;buf[0];
-        TRACE(&quot;\n%s&quot;, mInfoLog.c_str());
</del><ins>+            *infoLog = &amp;buf[0];
+            TRACE(&quot;\n%s&quot;, infoLog-&gt;c_str());
+        }
+        else
+        {
+            TRACE(&quot;\nShader compilation failed with no info log.&quot;);
+        }
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Gather the shader information
-    // TODO: refactor this out, gathering of the attributes, varyings and outputs should be done
-    // at the gl::Shader level
-    if (mType == GL_VERTEX_SHADER)
-    {
-        mActiveAttributes = GetFilteredShaderVariables(ShGetAttributes(compilerHandle));
-    }
-
-    const std::vector&lt;sh::Varying&gt; &amp;varyings = GetShaderVariables(ShGetVaryings(compilerHandle));
-    for (size_t varyingIndex = 0; varyingIndex &lt; varyings.size(); varyingIndex++)
-    {
-        mVaryings.push_back(gl::PackedVarying(varyings[varyingIndex]));
-    }
-
-    mUniforms = GetShaderVariables(ShGetUniforms(compilerHandle));
-    mInterfaceBlocks = GetShaderVariables(ShGetInterfaceBlocks(compilerHandle));
-
-    if (mType == GL_FRAGMENT_SHADER)
-    {
-        mActiveOutputVariables = GetFilteredShaderVariables(ShGetOutputVariables(compilerHandle));
-    }
-
</del><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglShaderGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,24 +13,29 @@
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><del>-
</del><span class="cx"> class FunctionsGL;
</span><ins>+struct WorkaroundsGL;
</ins><span class="cx"> 
</span><span class="cx"> class ShaderGL : public ShaderImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    ShaderGL(GLenum type, const FunctionsGL *functions);
</del><ins>+    ShaderGL(const gl::Shader::Data &amp;data,
+             const FunctionsGL *functions,
+             const WorkaroundsGL &amp;workarounds);
</ins><span class="cx">     ~ShaderGL() override;
</span><span class="cx"> 
</span><del>-    bool compile(gl::Compiler *compiler, const std::string &amp;source) override;
</del><ins>+    // ShaderImpl implementation
+    int prepareSourceAndReturnOptions(std::stringstream *sourceStream,
+                                      std::string *sourcePath) override;
+    bool postTranslateCompile(gl::Compiler *compiler, std::string *infoLog) override;
</ins><span class="cx">     std::string getDebugInfo() const override;
</span><span class="cx"> 
</span><span class="cx">     GLuint getShaderID() const;
</span><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     const FunctionsGL *mFunctions;
</span><ins>+    const WorkaroundsGL &amp;mWorkarounds;
</ins><span class="cx"> 
</span><del>-    GLenum mType;
</del><span class="cx">     GLuint mShaderID;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglStateManagerGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/StateManagerGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/StateManagerGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/StateManagerGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,28 +8,58 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/BitSetIterator.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Data.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><ins>+#include &quot;libANGLE/TransformFeedback.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/VertexArray.h&quot;
</span><ins>+#include &quot;libANGLE/Query.h&quot;
+#include &quot;libANGLE/renderer/gl/BufferGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/FramebufferGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/ProgramGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/SamplerGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/TextureGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/TransformFeedbackGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/VertexArrayGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/QueryGL.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+static const GLenum QueryTypes[] = {GL_ANY_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED_CONSERVATIVE,
+                                    GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, GL_TIME_ELAPSED};
+
+StateManagerGL::IndexedBufferBinding::IndexedBufferBinding() : offset(0), size(0), buffer(0)
+{
+}
+
</ins><span class="cx"> StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &amp;rendererCaps)
</span><span class="cx">     : mFunctions(functions),
</span><span class="cx">       mProgram(0),
</span><span class="cx">       mVAO(0),
</span><ins>+      mVertexAttribCurrentValues(rendererCaps.maxVertexAttributes),
</ins><span class="cx">       mBuffers(),
</span><ins>+      mIndexedBuffers(),
</ins><span class="cx">       mTextureUnitIndex(0),
</span><span class="cx">       mTextures(),
</span><ins>+      mSamplers(rendererCaps.maxCombinedTextureImageUnits, 0),
+      mTransformFeedback(0),
+      mQueries(),
+      mPrevDrawTransformFeedback(nullptr),
+      mCurrentQueries(),
+      mPrevDrawContext(0),
</ins><span class="cx">       mUnpackAlignment(4),
</span><span class="cx">       mUnpackRowLength(0),
</span><del>-      mFramebuffers(),
</del><ins>+      mUnpackSkipRows(0),
+      mUnpackSkipPixels(0),
+      mUnpackImageHeight(0),
+      mUnpackSkipImages(0),
+      mPackAlignment(4),
+      mPackRowLength(0),
+      mPackSkipRows(0),
+      mPackSkipPixels(0),
+      mFramebuffers(angle::FramebufferBindingSingletonMax, 0),
</ins><span class="cx">       mRenderbuffer(0),
</span><span class="cx">       mScissorTestEnabled(false),
</span><span class="cx">       mScissor(0, 0, 0, 0),
</span><span class="lines">@@ -74,13 +104,15 @@
</span><span class="cx">       mPolygonOffsetFillEnabled(false),
</span><span class="cx">       mPolygonOffsetFactor(0.0f),
</span><span class="cx">       mPolygonOffsetUnits(0.0f),
</span><del>-      mMultisampleEnabled(true),
</del><span class="cx">       mRasterizerDiscardEnabled(false),
</span><span class="cx">       mLineWidth(1.0f),
</span><span class="cx">       mPrimitiveRestartEnabled(false),
</span><span class="cx">       mClearColor(0.0f, 0.0f, 0.0f, 0.0f),
</span><span class="cx">       mClearDepth(1.0f),
</span><del>-      mClearStencil(0)
</del><ins>+      mClearStencil(0),
+      mFramebufferSRGBEnabled(false),
+      mTextureCubemapSeamlessEnabled(false),
+      mLocalDirtyBits()
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(mFunctions);
</span><span class="cx"> 
</span><span class="lines">@@ -89,24 +121,203 @@
</span><span class="cx">     mTextures[GL_TEXTURE_2D_ARRAY].resize(rendererCaps.maxCombinedTextureImageUnits);
</span><span class="cx">     mTextures[GL_TEXTURE_3D].resize(rendererCaps.maxCombinedTextureImageUnits);
</span><span class="cx"> 
</span><del>-    mFramebuffers[GL_READ_FRAMEBUFFER] = 0;
-    mFramebuffers[GL_DRAW_FRAMEBUFFER] = 0;
</del><ins>+    mIndexedBuffers[GL_UNIFORM_BUFFER].resize(rendererCaps.maxCombinedUniformBlocks);
+
+    for (GLenum queryType : QueryTypes)
+    {
+        mQueries[queryType] = 0;
+    }
+
+    // Initialize point sprite state for desktop GL
+    if (mFunctions-&gt;standard == STANDARD_GL_DESKTOP)
+    {
+        mFunctions-&gt;enable(GL_PROGRAM_POINT_SIZE);
+
+        // GL_POINT_SPRITE was deprecated in the core profile. Point rasterization is always
+        // performed
+        // as though POINT_SPRITE were enabled.
+        if ((mFunctions-&gt;profile &amp; GL_CONTEXT_CORE_PROFILE_BIT) == 0)
+        {
+            mFunctions-&gt;enable(GL_POINT_SPRITE);
+        }
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void StateManagerGL::deleteProgram(GLuint program)
+{
+    if (program != 0)
+    {
+        if (mProgram == program)
+        {
+            useProgram(0);
+        }
+
+        mFunctions-&gt;deleteProgram(program);
+    }
+}
+
+void StateManagerGL::deleteVertexArray(GLuint vao)
+{
+    if (vao != 0)
+    {
+        if (mVAO == vao)
+        {
+            bindVertexArray(0, 0);
+        }
+
+        mFunctions-&gt;deleteVertexArrays(1, &amp;vao);
+    }
+}
+
+void StateManagerGL::deleteTexture(GLuint texture)
+{
+    if (texture != 0)
+    {
+        for (const auto &amp;textureTypeIter : mTextures)
+        {
+            const std::vector&lt;GLuint&gt; &amp;textureVector = textureTypeIter.second;
+            for (size_t textureUnitIndex = 0; textureUnitIndex &lt; textureVector.size(); textureUnitIndex++)
+            {
+                if (textureVector[textureUnitIndex] == texture)
+                {
+                    activeTexture(textureUnitIndex);
+                    bindTexture(textureTypeIter.first, 0);
+                }
+            }
+        }
+
+        mFunctions-&gt;deleteTextures(1, &amp;texture);
+    }
+}
+
+void StateManagerGL::deleteSampler(GLuint sampler)
+{
+    if (sampler != 0)
+    {
+        for (size_t unit = 0; unit &lt; mSamplers.size(); unit++)
+        {
+            if (mSamplers[unit] == sampler)
+            {
+                bindSampler(unit, 0);
+            }
+        }
+
+        mFunctions-&gt;deleteSamplers(1, &amp;sampler);
+    }
+}
+
+void StateManagerGL::deleteBuffer(GLuint buffer)
+{
+    if (buffer != 0)
+    {
+        for (const auto &amp;bufferTypeIter : mBuffers)
+        {
+            if (bufferTypeIter.second == buffer)
+            {
+                bindBuffer(bufferTypeIter.first, 0);
+            }
+        }
+
+        for (const auto &amp;bufferTypeIter : mIndexedBuffers)
+        {
+            for (size_t bindIndex = 0; bindIndex &lt; bufferTypeIter.second.size(); bindIndex++)
+            {
+                if (bufferTypeIter.second[bindIndex].buffer == buffer)
+                {
+                    bindBufferBase(bufferTypeIter.first, bindIndex, 0);
+                }
+            }
+        }
+
+        mFunctions-&gt;deleteBuffers(1, &amp;buffer);
+    }
+}
+
+void StateManagerGL::deleteFramebuffer(GLuint fbo)
+{
+    if (fbo != 0)
+    {
+        for (size_t binding = 0; binding &lt; mFramebuffers.size(); ++binding)
+        {
+            if (mFramebuffers[binding] == fbo)
+            {
+                GLenum enumValue = angle::FramebufferBindingToEnum(
+                    static_cast&lt;angle::FramebufferBinding&gt;(binding));
+                bindFramebuffer(enumValue, 0);
+            }
+            mFunctions-&gt;deleteFramebuffers(1, &amp;fbo);
+        }
+    }
+}
+
+void StateManagerGL::deleteRenderbuffer(GLuint rbo)
+{
+    if (rbo != 0)
+    {
+        if (mRenderbuffer == rbo)
+        {
+            bindRenderbuffer(GL_RENDERBUFFER, 0);
+        }
+
+        mFunctions-&gt;deleteRenderbuffers(1, &amp;rbo);
+    }
+}
+
+void StateManagerGL::deleteTransformFeedback(GLuint transformFeedback)
+{
+    if (transformFeedback != 0)
+    {
+        if (mTransformFeedback == transformFeedback)
+        {
+            bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
+        }
+
+        if (mPrevDrawTransformFeedback != nullptr &amp;&amp;
+            mPrevDrawTransformFeedback-&gt;getTransformFeedbackID() == transformFeedback)
+        {
+            mPrevDrawTransformFeedback = nullptr;
+        }
+
+        mFunctions-&gt;deleteTransformFeedbacks(1, &amp;transformFeedback);
+    }
+}
+
+void StateManagerGL::deleteQuery(GLuint query)
+{
+    if (query != 0)
+    {
+        for (auto &amp;activeQuery : mQueries)
+        {
+            GLuint activeQueryID = activeQuery.second;
+            if (activeQueryID == query)
+            {
+                GLenum type = activeQuery.first;
+                endQuery(type, query);
+            }
+        }
+    }
+}
+
</ins><span class="cx"> void StateManagerGL::useProgram(GLuint program)
</span><span class="cx"> {
</span><span class="cx">     if (mProgram != program)
</span><span class="cx">     {
</span><del>-        mProgram = program;
-        mFunctions-&gt;useProgram(mProgram);
</del><ins>+        forceUseProgram(program);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void StateManagerGL::bindVertexArray(GLuint vao)
</del><ins>+void StateManagerGL::forceUseProgram(GLuint program)
</ins><span class="cx"> {
</span><ins>+    mProgram = program;
+    mFunctions-&gt;useProgram(mProgram);
+}
+
+void StateManagerGL::bindVertexArray(GLuint vao, GLuint elementArrayBuffer)
+{
</ins><span class="cx">     if (mVAO != vao)
</span><span class="cx">     {
</span><span class="cx">         mVAO = vao;
</span><ins>+        mBuffers[GL_ELEMENT_ARRAY_BUFFER] = elementArrayBuffer;
</ins><span class="cx">         mFunctions-&gt;bindVertexArray(vao);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -120,12 +331,41 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void StateManagerGL::bindBufferBase(GLenum type, size_t index, GLuint buffer)
+{
+    auto &amp;binding = mIndexedBuffers[type][index];
+    if (binding.buffer != buffer || binding.offset != static_cast&lt;size_t&gt;(-1) ||
+        binding.size != static_cast&lt;size_t&gt;(-1))
+    {
+        binding.buffer = buffer;
+        binding.offset = static_cast&lt;size_t&gt;(-1);
+        binding.size = static_cast&lt;size_t&gt;(-1);
+        mFunctions-&gt;bindBufferBase(type, static_cast&lt;GLuint&gt;(index), buffer);
+    }
+}
+
+void StateManagerGL::bindBufferRange(GLenum type,
+                                     size_t index,
+                                     GLuint buffer,
+                                     size_t offset,
+                                     size_t size)
+{
+    auto &amp;binding = mIndexedBuffers[type][index];
+    if (binding.buffer != buffer || binding.offset != offset || binding.size != size)
+    {
+        binding.buffer = buffer;
+        binding.offset = offset;
+        binding.size = size;
+        mFunctions-&gt;bindBufferRange(type, static_cast&lt;GLuint&gt;(index), buffer, offset, size);
+    }
+}
+
</ins><span class="cx"> void StateManagerGL::activeTexture(size_t unit)
</span><span class="cx"> {
</span><span class="cx">     if (mTextureUnitIndex != unit)
</span><span class="cx">     {
</span><span class="cx">         mTextureUnitIndex = unit;
</span><del>-        mFunctions-&gt;activeTexture(GL_TEXTURE0 + mTextureUnitIndex);
</del><ins>+        mFunctions-&gt;activeTexture(GL_TEXTURE0 + static_cast&lt;GLenum&gt;(mTextureUnitIndex));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -138,38 +378,157 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void StateManagerGL::setPixelUnpackState(GLint alignment, GLint rowLength)
</del><ins>+void StateManagerGL::bindSampler(size_t unit, GLuint sampler)
</ins><span class="cx"> {
</span><ins>+    if (mSamplers[unit] != sampler)
+    {
+        mSamplers[unit] = sampler;
+        mFunctions-&gt;bindSampler(static_cast&lt;GLuint&gt;(unit), sampler);
+    }
+}
+
+void StateManagerGL::setPixelUnpackState(const gl::PixelUnpackState &amp;unpack)
+{
+    GLuint unpackBufferID          = 0;
+    const gl::Buffer *unpackBuffer = unpack.pixelBuffer.get();
+    if (unpackBuffer != nullptr)
+    {
+        unpackBufferID = GetImplAs&lt;BufferGL&gt;(unpackBuffer)-&gt;getBufferID();
+    }
+    setPixelUnpackState(unpack.alignment, unpack.rowLength, unpack.skipRows, unpack.skipPixels,
+                        unpack.imageHeight, unpack.skipImages, unpackBufferID);
+}
+
+void StateManagerGL::setPixelUnpackState(GLint alignment,
+                                         GLint rowLength,
+                                         GLint skipRows,
+                                         GLint skipPixels,
+                                         GLint imageHeight,
+                                         GLint skipImages,
+                                         GLuint unpackBuffer)
+{
</ins><span class="cx">     if (mUnpackAlignment != alignment)
</span><span class="cx">     {
</span><span class="cx">         mUnpackAlignment = alignment;
</span><span class="cx">         mFunctions-&gt;pixelStorei(GL_UNPACK_ALIGNMENT, mUnpackAlignment);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_ALIGNMENT);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (mUnpackRowLength != rowLength)
</span><span class="cx">     {
</span><span class="cx">         mUnpackRowLength = rowLength;
</span><span class="cx">         mFunctions-&gt;pixelStorei(GL_UNPACK_ROW_LENGTH, mUnpackRowLength);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_ROW_LENGTH);
</ins><span class="cx">     }
</span><ins>+
+    if (mUnpackSkipRows != skipRows)
+    {
+        mUnpackSkipRows = skipRows;
+        mFunctions-&gt;pixelStorei(GL_UNPACK_SKIP_ROWS, mUnpackSkipRows);
+
+        // TODO: set dirty bit once one exists
+    }
+
+    if (mUnpackSkipPixels != skipPixels)
+    {
+        mUnpackSkipPixels = skipPixels;
+        mFunctions-&gt;pixelStorei(GL_UNPACK_SKIP_PIXELS, mUnpackSkipPixels);
+
+        // TODO: set dirty bit once one exists
+    }
+
+    if (mUnpackImageHeight != imageHeight)
+    {
+        mUnpackImageHeight = imageHeight;
+        mFunctions-&gt;pixelStorei(GL_UNPACK_IMAGE_HEIGHT, mUnpackImageHeight);
+
+        // TODO: set dirty bit once one exists
+    }
+
+    if (mUnpackSkipImages != skipImages)
+    {
+        mUnpackSkipImages = skipImages;
+        mFunctions-&gt;pixelStorei(GL_UNPACK_SKIP_IMAGES, mUnpackSkipImages);
+
+        // TODO: set dirty bit once one exists
+    }
+
+    bindBuffer(GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void StateManagerGL::setPixelPackState(const gl::PixelPackState &amp;pack)
+{
+    GLuint packBufferID          = 0;
+    const gl::Buffer *packBuffer = pack.pixelBuffer.get();
+    if (packBuffer != nullptr)
+    {
+        packBufferID = GetImplAs&lt;BufferGL&gt;(packBuffer)-&gt;getBufferID();
+    }
+    setPixelPackState(pack.alignment, pack.rowLength, pack.skipRows, pack.skipPixels, packBufferID);
+}
+
+void StateManagerGL::setPixelPackState(GLint alignment,
+                                       GLint rowLength,
+                                       GLint skipRows,
+                                       GLint skipPixels,
+                                       GLuint packBuffer)
+{
+    if (mPackAlignment != alignment)
+    {
+        mPackAlignment = alignment;
+        mFunctions-&gt;pixelStorei(GL_PACK_ALIGNMENT, mPackAlignment);
+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_PACK_ALIGNMENT);
+    }
+
+    if (mPackRowLength != rowLength)
+    {
+        mPackRowLength = rowLength;
+        mFunctions-&gt;pixelStorei(GL_PACK_ROW_LENGTH, mPackRowLength);
+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_UNPACK_ROW_LENGTH);
+    }
+
+    if (mPackSkipRows != skipRows)
+    {
+        mPackSkipRows = skipRows;
+        mFunctions-&gt;pixelStorei(GL_PACK_SKIP_ROWS, mPackSkipRows);
+
+        // TODO: set dirty bit once one exists
+    }
+
+    if (mPackSkipPixels != skipPixels)
+    {
+        mPackSkipPixels = skipPixels;
+        mFunctions-&gt;pixelStorei(GL_PACK_SKIP_PIXELS, mPackSkipPixels);
+
+        // TODO: set dirty bit once one exists
+    }
+
+    bindBuffer(GL_PIXEL_PACK_BUFFER, packBuffer);
+}
+
</ins><span class="cx"> void StateManagerGL::bindFramebuffer(GLenum type, GLuint framebuffer)
</span><span class="cx"> {
</span><span class="cx">     if (type == GL_FRAMEBUFFER)
</span><span class="cx">     {
</span><del>-        if (mFramebuffers[GL_READ_FRAMEBUFFER] != framebuffer ||
-            mFramebuffers[GL_DRAW_FRAMEBUFFER] != framebuffer)
</del><ins>+        if (mFramebuffers[angle::FramebufferBindingRead] != framebuffer ||
+            mFramebuffers[angle::FramebufferBindingDraw] != framebuffer)
</ins><span class="cx">         {
</span><del>-            mFramebuffers[GL_READ_FRAMEBUFFER] = framebuffer;
-            mFramebuffers[GL_DRAW_FRAMEBUFFER] = framebuffer;
</del><ins>+            mFramebuffers[angle::FramebufferBindingRead] = framebuffer;
+            mFramebuffers[angle::FramebufferBindingDraw] = framebuffer;
</ins><span class="cx">             mFunctions-&gt;bindFramebuffer(GL_FRAMEBUFFER, framebuffer);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        if (mFramebuffers[type] != framebuffer)
</del><ins>+        angle::FramebufferBinding binding = angle::EnumToFramebufferBinding(type);
+
+        if (mFramebuffers[binding] != framebuffer)
</ins><span class="cx">         {
</span><del>-            mFramebuffers[type] = framebuffer;
</del><ins>+            mFramebuffers[binding] = framebuffer;
</ins><span class="cx">             mFunctions-&gt;bindFramebuffer(type, framebuffer);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -185,104 +544,184 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void StateManagerGL::setClearState(const gl::State &amp;state, GLbitfield mask)
</del><ins>+void StateManagerGL::bindTransformFeedback(GLenum type, GLuint transformFeedback)
</ins><span class="cx"> {
</span><del>-    // Only apply the state required to do a clear
-    const gl::RasterizerState &amp;rasterizerState = state.getRasterizerState();
-    setRasterizerDiscardEnabled(rasterizerState.rasterizerDiscard);
-    if (!rasterizerState.rasterizerDiscard)
</del><ins>+    ASSERT(type == GL_TRANSFORM_FEEDBACK);
+    if (mTransformFeedback != transformFeedback)
</ins><span class="cx">     {
</span><del>-        setScissor(state.getScissor());
-        setViewport(state.getViewport());
-
-        if ((mask &amp; GL_COLOR_BUFFER_BIT) != 0)
</del><ins>+        // Pause the current transform feedback if one is active.
+        // To handle virtualized contexts, StateManagerGL needs to be able to bind a new transform
+        // feedback at any time, even if there is one active.
+        if (mPrevDrawTransformFeedback != nullptr &amp;&amp;
+            mPrevDrawTransformFeedback-&gt;getTransformFeedbackID() != transformFeedback)
</ins><span class="cx">         {
</span><del>-            setClearColor(state.getColorClearValue());
-
-            const gl::BlendState &amp;blendState = state.getBlendState();
-            setColorMask(blendState.colorMaskRed, blendState.colorMaskGreen, blendState.colorMaskBlue, blendState.colorMaskAlpha);
</del><ins>+            mPrevDrawTransformFeedback-&gt;syncPausedState(true);
+            mPrevDrawTransformFeedback = nullptr;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if ((mask &amp; GL_DEPTH_BUFFER_BIT) != 0)
-        {
-            setClearDepth(state.getDepthClearValue());
-            setDepthMask(state.getDepthStencilState().depthMask);
-        }
-
-        if ((mask &amp; GL_STENCIL_BUFFER_BIT) != 0)
-        {
-            setClearStencil(state.getStencilClearValue());
-            setStencilFrontWritemask(state.getDepthStencilState().stencilWritemask);
-            setStencilBackWritemask(state.getDepthStencilState().stencilBackWritemask);
-        }
</del><ins>+        mTransformFeedback = transformFeedback;
+        mFunctions-&gt;bindTransformFeedback(type, mTransformFeedback);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error StateManagerGL::setDrawArraysState(const gl::Data &amp;data, GLint first, GLsizei count)
</del><ins>+void StateManagerGL::beginQuery(GLenum type, GLuint query)
</ins><span class="cx"> {
</span><ins>+    // Make sure this is a valid query type and there is no current active query of this type
+    ASSERT(mQueries.find(type) != mQueries.end());
+    ASSERT(mQueries[type] == 0);
+    ASSERT(query != 0);
+
+    mQueries[type] = query;
+    mFunctions-&gt;beginQuery(type, query);
+}
+
+void StateManagerGL::endQuery(GLenum type, GLuint query)
+{
+    ASSERT(mQueries[type] == query);
+    mQueries[type] = 0;
+    mFunctions-&gt;endQuery(type);
+}
+
+void StateManagerGL::onBeginQuery(QueryGL *query)
+{
+    mCurrentQueries.insert(query);
+}
+
+void StateManagerGL::onDeleteQueryObject(QueryGL *query)
+{
+    mCurrentQueries.erase(query);
+}
+
+gl::Error StateManagerGL::setDrawArraysState(const gl::Data &amp;data,
+                                             GLint first,
+                                             GLsizei count,
+                                             GLsizei instanceCount)
+{
</ins><span class="cx">     const gl::State &amp;state = *data.state;
</span><span class="cx"> 
</span><ins>+    const gl::Program *program = state.getProgram();
+
</ins><span class="cx">     const gl::VertexArray *vao = state.getVertexArray();
</span><span class="cx">     const VertexArrayGL *vaoGL = GetImplAs&lt;VertexArrayGL&gt;(vao);
</span><del>-    vaoGL-&gt;syncDrawArraysState(first, count);
-    bindVertexArray(vaoGL-&gt;getVertexArrayID());
</del><span class="cx"> 
</span><ins>+    gl::Error error = vaoGL-&gt;syncDrawArraysState(program-&gt;getActiveAttribLocationsMask(), first,
+                                                 count, instanceCount);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    bindVertexArray(vaoGL-&gt;getVertexArrayID(), vaoGL-&gt;getAppliedElementArrayBufferID());
+
</ins><span class="cx">     return setGenericDrawState(data);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error StateManagerGL::setDrawElementsState(const gl::Data &amp;data, GLsizei count, GLenum type, const GLvoid *indices,
</del><ins>+gl::Error StateManagerGL::setDrawElementsState(const gl::Data &amp;data,
+                                               GLsizei count,
+                                               GLenum type,
+                                               const GLvoid *indices,
+                                               GLsizei instanceCount,
</ins><span class="cx">                                                const GLvoid **outIndices)
</span><span class="cx"> {
</span><span class="cx">     const gl::State &amp;state = *data.state;
</span><span class="cx"> 
</span><ins>+    const gl::Program *program = state.getProgram();
+
</ins><span class="cx">     const gl::VertexArray *vao = state.getVertexArray();
</span><span class="cx">     const VertexArrayGL *vaoGL = GetImplAs&lt;VertexArrayGL&gt;(vao);
</span><span class="cx"> 
</span><del>-    gl::Error error = vaoGL-&gt;syncDrawElementsState(count, type, indices, outIndices);
</del><ins>+    gl::Error error =
+        vaoGL-&gt;syncDrawElementsState(program-&gt;getActiveAttribLocationsMask(), count, type, indices,
+                                     instanceCount, state.isPrimitiveRestartEnabled(), outIndices);
</ins><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bindVertexArray(vaoGL-&gt;getVertexArrayID());
</del><ins>+    bindVertexArray(vaoGL-&gt;getVertexArrayID(), vaoGL-&gt;getAppliedElementArrayBufferID());
</ins><span class="cx"> 
</span><span class="cx">     return setGenericDrawState(data);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+gl::Error StateManagerGL::onMakeCurrent(const gl::Data &amp;data)
+{
+    const gl::State &amp;state = *data.state;
+
+    // If the context has changed, pause the previous context's transform feedback and queries
+    if (data.context != mPrevDrawContext)
+    {
+        if (mPrevDrawTransformFeedback != nullptr)
+        {
+            mPrevDrawTransformFeedback-&gt;syncPausedState(true);
+        }
+
+        for (QueryGL *prevQuery : mCurrentQueries)
+        {
+            prevQuery-&gt;pause();
+        }
+    }
+    mCurrentQueries.clear();
+    mPrevDrawTransformFeedback = nullptr;
+    mPrevDrawContext = data.context;
+
+    // Set the current query state
+    for (GLenum queryType : QueryTypes)
+    {
+        gl::Query *query = state.getActiveQuery(queryType);
+        if (query != nullptr)
+        {
+            QueryGL *queryGL = GetImplAs&lt;QueryGL&gt;(query);
+            queryGL-&gt;resume();
+
+            mCurrentQueries.insert(queryGL);
+        }
+    }
+
+    return gl::Error(GL_NO_ERROR);
+}
+
</ins><span class="cx"> gl::Error StateManagerGL::setGenericDrawState(const gl::Data &amp;data)
</span><span class="cx"> {
</span><span class="cx">     const gl::State &amp;state = *data.state;
</span><del>-    const gl::Caps &amp;caps = *data.caps;
</del><span class="cx"> 
</span><ins>+    // Sync the current program state
</ins><span class="cx">     const gl::Program *program = state.getProgram();
</span><span class="cx">     const ProgramGL *programGL = GetImplAs&lt;ProgramGL&gt;(program);
</span><span class="cx">     useProgram(programGL-&gt;getProgramID());
</span><span class="cx"> 
</span><del>-    // TODO: Only apply textures referenced by the program.
-    for (auto textureTypeIter = mTextures.begin(); textureTypeIter != mTextures.end(); textureTypeIter++)
</del><ins>+    for (size_t uniformBlockIndex = 0; uniformBlockIndex &lt; program-&gt;getActiveUniformBlockCount();
+         uniformBlockIndex++)
</ins><span class="cx">     {
</span><del>-        GLenum textureType = textureTypeIter-&gt;first;
</del><ins>+        GLuint binding = program-&gt;getUniformBlockBinding(static_cast&lt;GLuint&gt;(uniformBlockIndex));
+        const OffsetBindingPointer&lt;gl::Buffer&gt; &amp;uniformBuffer =
+            data.state-&gt;getIndexedUniformBuffer(binding);
</ins><span class="cx"> 
</span><del>-        // Determine if this texture type can exist in the source context
-        bool validTextureType = (textureType == GL_TEXTURE_2D || textureType == GL_TEXTURE_CUBE_MAP ||
-                                 (textureType == GL_TEXTURE_2D_ARRAY &amp;&amp; data.clientVersion &gt;= 3) ||
-                                 (textureType == GL_TEXTURE_3D &amp;&amp; data.clientVersion &gt;= 3));
-
-        const std::vector&lt;GLuint&gt; &amp;textureVector = textureTypeIter-&gt;second;
-        for (size_t textureUnitIndex = 0; textureUnitIndex &lt; textureVector.size(); textureUnitIndex++)
</del><ins>+        if (uniformBuffer.get() != nullptr)
</ins><span class="cx">         {
</span><del>-            const gl::Texture *texture = nullptr;
</del><ins>+            BufferGL *bufferGL = GetImplAs&lt;BufferGL&gt;(uniformBuffer.get());
</ins><span class="cx"> 
</span><del>-            bool validTextureUnit = textureUnitIndex &lt; caps.maxCombinedTextureImageUnits;
-            if (validTextureType &amp;&amp; validTextureUnit)
</del><ins>+            if (uniformBuffer.getSize() == 0)
</ins><span class="cx">             {
</span><del>-                texture = state.getSamplerTexture(textureUnitIndex, textureType);
</del><ins>+                bindBufferBase(GL_UNIFORM_BUFFER, binding, bufferGL-&gt;getBufferID());
</ins><span class="cx">             }
</span><ins>+            else
+            {
+                bindBufferRange(GL_UNIFORM_BUFFER, binding, bufferGL-&gt;getBufferID(),
+                                uniformBuffer.getOffset(), uniformBuffer.getSize());
+            }
+        }
+    }
</ins><span class="cx"> 
</span><ins>+    const std::vector&lt;SamplerBindingGL&gt; &amp;appliedSamplerUniforms = programGL-&gt;getAppliedSamplerUniforms();
+    for (const SamplerBindingGL &amp;samplerUniform : appliedSamplerUniforms)
+    {
+        GLenum textureType = samplerUniform.textureType;
+        for (GLuint textureUnitIndex : samplerUniform.boundTextureUnits)
+        {
+            const gl::Texture *texture = state.getSamplerTexture(textureUnitIndex, textureType);
</ins><span class="cx">             if (texture != nullptr)
</span><span class="cx">             {
</span><span class="cx">                 const TextureGL *textureGL = GetImplAs&lt;TextureGL&gt;(texture);
</span><del>-                textureGL-&gt;syncSamplerState(texture-&gt;getSamplerState());
</del><span class="cx"> 
</span><span class="cx">                 if (mTextures[textureType][textureUnitIndex] != textureGL-&gt;getTextureID())
</span><span class="cx">                 {
</span><span class="lines">@@ -290,7 +729,7 @@
</span><span class="cx">                     bindTexture(textureType, textureGL-&gt;getTextureID());
</span><span class="cx">                 }
</span><span class="cx"> 
</span><del>-                // TODO: apply sampler object if one is bound
</del><ins>+                textureGL-&gt;syncState(textureUnitIndex, texture-&gt;getTextureState());
</ins><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><span class="lines">@@ -300,75 +739,75 @@
</span><span class="cx">                     bindTexture(textureType, 0);
</span><span class="cx">                 }
</span><span class="cx">             }
</span><ins>+
+            const gl::Sampler *sampler = state.getSampler(textureUnitIndex);
+            if (sampler != nullptr)
+            {
+                const SamplerGL *samplerGL = GetImplAs&lt;SamplerGL&gt;(sampler);
+                samplerGL-&gt;syncState(sampler-&gt;getSamplerState());
+                bindSampler(textureUnitIndex, samplerGL-&gt;getSamplerID());
+            }
+            else
+            {
+                bindSampler(textureUnitIndex, 0);
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     const gl::Framebuffer *framebuffer = state.getDrawFramebuffer();
</span><span class="cx">     const FramebufferGL *framebufferGL = GetImplAs&lt;FramebufferGL&gt;(framebuffer);
</span><span class="cx">     bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebufferGL-&gt;getFramebufferID());
</span><ins>+    framebufferGL-&gt;syncDrawState();
</ins><span class="cx"> 
</span><del>-    setScissorTestEnabled(state.isScissorTestEnabled());
-    if (state.isScissorTestEnabled())
-    {
-        setScissor(state.getScissor());
-    }
</del><ins>+    // Seamless cubemaps are required for ES3 and higher contexts.
+    setTextureCubemapSeamlessEnabled(data.clientVersion &gt;= 3);
</ins><span class="cx"> 
</span><del>-    setViewport(state.getViewport());
-    setDepthRange(state.getNearPlane(), state.getFarPlane());
-
-    const gl::BlendState &amp;blendState = state.getBlendState();
-    setBlendEnabled(blendState.blend);
-    if (blendState.blend)
</del><ins>+    // Set the current transform feedback state
+    gl::TransformFeedback *transformFeedback = state.getCurrentTransformFeedback();
+    if (transformFeedback)
</ins><span class="cx">     {
</span><del>-        setBlendColor(state.getBlendColor());
-        setBlendFuncs(blendState.sourceBlendRGB, blendState.destBlendRGB, blendState.sourceBlendAlpha, blendState.destBlendAlpha);
-        setBlendEquations(blendState.blendEquationRGB, blendState.blendEquationAlpha);
-        setColorMask(blendState.colorMaskRed, blendState.colorMaskGreen, blendState.colorMaskBlue, blendState.colorMaskAlpha);
</del><ins>+        TransformFeedbackGL *transformFeedbackGL =
+            GetImplAs&lt;TransformFeedbackGL&gt;(transformFeedback);
+        bindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedbackGL-&gt;getTransformFeedbackID());
+        transformFeedbackGL-&gt;syncActiveState(transformFeedback-&gt;isActive(),
+                                             transformFeedback-&gt;getPrimitiveMode());
+        transformFeedbackGL-&gt;syncPausedState(transformFeedback-&gt;isPaused());
+        mPrevDrawTransformFeedback = transformFeedbackGL;
</ins><span class="cx">     }
</span><del>-    setSampleAlphaToCoverageEnabled(blendState.sampleAlphaToCoverage);
-    setSampleCoverageEnabled(state.isSampleCoverageEnabled());
-    setSampleCoverage(state.getSampleCoverageValue(), state.getSampleCoverageInvert());
-
-    const gl::DepthStencilState &amp;depthStencilState = state.getDepthStencilState();
-    setDepthTestEnabled(depthStencilState.depthTest);
-    if (depthStencilState.depthTest)
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        setDepthFunc(depthStencilState.depthFunc);
-        setDepthMask(depthStencilState.depthMask);
</del><ins>+        bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
+        mPrevDrawTransformFeedback = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    setStencilTestEnabled(depthStencilState.stencilTest);
-    if (depthStencilState.stencilTest)
-    {
-        setStencilFrontWritemask(state.getDepthStencilState().stencilWritemask);
-        setStencilBackWritemask(state.getDepthStencilState().stencilBackWritemask);
-        setStencilFrontFuncs(depthStencilState.stencilFunc, state.getStencilRef(), depthStencilState.stencilMask);
-        setStencilBackFuncs(depthStencilState.stencilBackFunc, state.getStencilBackRef(), depthStencilState.stencilBackMask);
-        setStencilFrontOps(depthStencilState.stencilFail, depthStencilState.stencilPassDepthFail, depthStencilState.stencilPassDepthPass);
-        setStencilBackOps(depthStencilState.stencilBackFail, depthStencilState.stencilBackPassDepthFail, depthStencilState.stencilBackPassDepthPass);
-    }
</del><ins>+    return gl::Error(GL_NO_ERROR);
+}
</ins><span class="cx"> 
</span><del>-    const gl::RasterizerState &amp;rasterizerState = state.getRasterizerState();
-    setCullFaceEnabled(rasterizerState.cullFace);
-    if (rasterizerState.cullFace)
</del><ins>+void StateManagerGL::setAttributeCurrentData(size_t index,
+                                             const gl::VertexAttribCurrentValueData &amp;data)
+{
+    if (mVertexAttribCurrentValues[index] != data)
</ins><span class="cx">     {
</span><del>-        setCullFace(rasterizerState.cullMode);
-        setFrontFace(rasterizerState.frontFace);
-    }
</del><ins>+        mVertexAttribCurrentValues[index] = data;
+        switch (mVertexAttribCurrentValues[index].Type)
+        {
+            case GL_FLOAT:
+                mFunctions-&gt;vertexAttrib4fv(static_cast&lt;GLuint&gt;(index),
+                                            mVertexAttribCurrentValues[index].FloatValues);
+                break;
+            case GL_INT:
+                mFunctions-&gt;vertexAttrib4iv(static_cast&lt;GLuint&gt;(index),
+                                            mVertexAttribCurrentValues[index].IntValues);
+                break;
+            case GL_UNSIGNED_INT:
+                mFunctions-&gt;vertexAttrib4uiv(static_cast&lt;GLuint&gt;(index),
+                                             mVertexAttribCurrentValues[index].UnsignedIntValues);
+                break;
+          default: UNREACHABLE();
+        }
</ins><span class="cx"> 
</span><del>-    setPolygonOffsetFillEnabled(rasterizerState.polygonOffsetFill);
-    if (rasterizerState.polygonOffsetFill)
-    {
-        setPolygonOffset(rasterizerState.polygonOffsetFactor, rasterizerState.polygonOffsetUnits);
</del><ins>+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_CURRENT_VALUE_0 + index);
</ins><span class="cx">     }
</span><del>-
-    setMultisampleEnabled(rasterizerState.multiSample);
-    setRasterizerDiscardEnabled(rasterizerState.rasterizerDiscard);
-    setLineWidth(state.getLineWidth());
-
-    setPrimitiveRestartEnabled(state.isPrimitiveRestartEnabled());
-
-    return gl::Error(GL_NO_ERROR);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void StateManagerGL::setScissorTestEnabled(bool enabled)
</span><span class="lines">@@ -384,6 +823,8 @@
</span><span class="cx">         {
</span><span class="cx">             mFunctions-&gt;disable(GL_SCISSOR_TEST);
</span><span class="cx">         }
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -393,6 +834,8 @@
</span><span class="cx">     {
</span><span class="cx">         mScissor = scissor;
</span><span class="cx">         mFunctions-&gt;scissor(mScissor.x, mScissor.y, mScissor.width, mScissor.height);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_SCISSOR);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -402,6 +845,8 @@
</span><span class="cx">     {
</span><span class="cx">         mViewport = viewport;
</span><span class="cx">         mFunctions-&gt;viewport(mViewport.x, mViewport.y, mViewport.width, mViewport.height);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_VIEWPORT);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -411,7 +856,20 @@
</span><span class="cx">     {
</span><span class="cx">         mNear = near;
</span><span class="cx">         mFar = far;
</span><del>-        mFunctions-&gt;depthRange(mNear, mFar);
</del><ins>+
+        // The glDepthRangef function isn't available until OpenGL 4.1.  Prefer it when it is
+        // available because OpenGL ES only works in floats.
+        if (mFunctions-&gt;depthRangef)
+        {
+            mFunctions-&gt;depthRangef(mNear, mFar);
+        }
+        else
+        {
+            ASSERT(mFunctions-&gt;depthRange);
+            mFunctions-&gt;depthRange(mNear, mFar);
+        }
+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_DEPTH_RANGE);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -428,6 +886,8 @@
</span><span class="cx">         {
</span><span class="cx">             mFunctions-&gt;disable(GL_BLEND);
</span><span class="cx">         }
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_BLEND_ENABLED);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -437,10 +897,14 @@
</span><span class="cx">     {
</span><span class="cx">         mBlendColor = blendColor;
</span><span class="cx">         mFunctions-&gt;blendColor(mBlendColor.red, mBlendColor.green, mBlendColor.blue, mBlendColor.alpha);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_BLEND_COLOR);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void StateManagerGL::setBlendFuncs(GLenum sourceBlendRGB, GLenum destBlendRGB, GLenum sourceBlendAlpha,
</del><ins>+void StateManagerGL::setBlendFuncs(GLenum sourceBlendRGB,
+                                   GLenum destBlendRGB,
+                                   GLenum sourceBlendAlpha,
</ins><span class="cx">                                    GLenum destBlendAlpha)
</span><span class="cx"> {
</span><span class="cx">     if (mSourceBlendRGB != sourceBlendRGB || mDestBlendRGB != destBlendRGB ||
</span><span class="lines">@@ -452,6 +916,8 @@
</span><span class="cx">         mDestBlendAlpha = destBlendAlpha;
</span><span class="cx"> 
</span><span class="cx">         mFunctions-&gt;blendFuncSeparate(mSourceBlendRGB, mDestBlendRGB, mSourceBlendAlpha, mDestBlendAlpha);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_BLEND_FUNCS);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -460,9 +926,11 @@
</span><span class="cx">     if (mBlendEquationRGB != blendEquationRGB || mBlendEquationAlpha != blendEquationAlpha)
</span><span class="cx">     {
</span><span class="cx">         mBlendEquationRGB = blendEquationRGB;
</span><del>-        mBlendEquationAlpha = mDestBlendAlpha;
</del><ins>+        mBlendEquationAlpha = blendEquationAlpha;
</ins><span class="cx"> 
</span><span class="cx">         mFunctions-&gt;blendEquationSeparate(mBlendEquationRGB, mBlendEquationAlpha);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_BLEND_EQUATIONS);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -475,6 +943,8 @@
</span><span class="cx">         mColorMaskBlue = blue;
</span><span class="cx">         mColorMaskAlpha = alpha;
</span><span class="cx">         mFunctions-&gt;colorMask(mColorMaskRed, mColorMaskGreen, mColorMaskBlue, mColorMaskAlpha);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_COLOR_MASK);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -491,6 +961,8 @@
</span><span class="cx">         {
</span><span class="cx">             mFunctions-&gt;disable(GL_SAMPLE_ALPHA_TO_COVERAGE);
</span><span class="cx">         }
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -507,6 +979,8 @@
</span><span class="cx">         {
</span><span class="cx">             mFunctions-&gt;disable(GL_SAMPLE_COVERAGE);
</span><span class="cx">         }
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_SAMPLE_COVERAGE_ENABLED);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -517,6 +991,8 @@
</span><span class="cx">         mSampleCoverageValue = value;
</span><span class="cx">         mSampleCoverageInvert = invert;
</span><span class="cx">         mFunctions-&gt;sampleCoverage(mSampleCoverageValue, mSampleCoverageInvert);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_SAMPLE_COVERAGE);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -533,6 +1009,8 @@
</span><span class="cx">         {
</span><span class="cx">             mFunctions-&gt;disable(GL_DEPTH_TEST);
</span><span class="cx">         }
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -542,6 +1020,8 @@
</span><span class="cx">     {
</span><span class="cx">         mDepthFunc = depthFunc;
</span><span class="cx">         mFunctions-&gt;depthFunc(mDepthFunc);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_DEPTH_FUNC);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -551,6 +1031,8 @@
</span><span class="cx">     {
</span><span class="cx">         mDepthMask = mask;
</span><span class="cx">         mFunctions-&gt;depthMask(mDepthMask);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_DEPTH_MASK);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -567,6 +1049,8 @@
</span><span class="cx">         {
</span><span class="cx">             mFunctions-&gt;disable(GL_STENCIL_TEST);
</span><span class="cx">         }
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -576,6 +1060,8 @@
</span><span class="cx">     {
</span><span class="cx">         mStencilFrontWritemask = mask;
</span><span class="cx">         mFunctions-&gt;stencilMaskSeparate(GL_FRONT, mStencilFrontWritemask);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -585,6 +1071,8 @@
</span><span class="cx">     {
</span><span class="cx">         mStencilBackWritemask = mask;
</span><span class="cx">         mFunctions-&gt;stencilMaskSeparate(GL_BACK, mStencilBackWritemask);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -596,6 +1084,8 @@
</span><span class="cx">         mStencilFrontRef = ref;
</span><span class="cx">         mStencilFrontValueMask = mask;
</span><span class="cx">         mFunctions-&gt;stencilFuncSeparate(GL_FRONT, mStencilFrontFunc, mStencilFrontRef, mStencilFrontValueMask);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -607,6 +1097,8 @@
</span><span class="cx">         mStencilBackRef = ref;
</span><span class="cx">         mStencilBackValueMask = mask;
</span><span class="cx">         mFunctions-&gt;stencilFuncSeparate(GL_BACK, mStencilBackFunc, mStencilBackRef, mStencilBackValueMask);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -618,6 +1110,8 @@
</span><span class="cx">         mStencilFrontStencilPassDepthFailOp = dpfail;
</span><span class="cx">         mStencilFrontStencilPassDepthPassOp = dppass;
</span><span class="cx">         mFunctions-&gt;stencilOpSeparate(GL_FRONT, mStencilFrontStencilFailOp, mStencilFrontStencilPassDepthFailOp, mStencilFrontStencilPassDepthPassOp);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_STENCIL_OPS_FRONT);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -629,6 +1123,8 @@
</span><span class="cx">         mStencilBackStencilPassDepthFailOp = dpfail;
</span><span class="cx">         mStencilBackStencilPassDepthPassOp = dppass;
</span><span class="cx">         mFunctions-&gt;stencilOpSeparate(GL_BACK, mStencilBackStencilFailOp, mStencilBackStencilPassDepthFailOp, mStencilBackStencilPassDepthPassOp);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_STENCIL_OPS_BACK);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -645,6 +1141,8 @@
</span><span class="cx">         {
</span><span class="cx">             mFunctions-&gt;disable(GL_CULL_FACE);
</span><span class="cx">         }
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_CULL_FACE_ENABLED);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -654,6 +1152,8 @@
</span><span class="cx">     {
</span><span class="cx">         mCullFace = cullFace;
</span><span class="cx">         mFunctions-&gt;cullFace(mCullFace);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_CULL_FACE);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -663,6 +1163,8 @@
</span><span class="cx">     {
</span><span class="cx">         mFrontFace = frontFace;
</span><span class="cx">         mFunctions-&gt;frontFace(mFrontFace);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_FRONT_FACE);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -679,6 +1181,8 @@
</span><span class="cx">         {
</span><span class="cx">             mFunctions-&gt;disable(GL_POLYGON_OFFSET_FILL);
</span><span class="cx">         }
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -689,22 +1193,8 @@
</span><span class="cx">         mPolygonOffsetFactor = factor;
</span><span class="cx">         mPolygonOffsetUnits = units;
</span><span class="cx">         mFunctions-&gt;polygonOffset(mPolygonOffsetFactor, mPolygonOffsetUnits);
</span><del>-    }
-}
</del><span class="cx"> 
</span><del>-void StateManagerGL::setMultisampleEnabled(bool enabled)
-{
-    if (mMultisampleEnabled != enabled)
-    {
-        mMultisampleEnabled = enabled;
-        if (mMultisampleEnabled)
-        {
-            mFunctions-&gt;enable(GL_MULTISAMPLE);
-        }
-        else
-        {
-            mFunctions-&gt;disable(GL_MULTISAMPLE);
-        }
</del><ins>+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_POLYGON_OFFSET);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -721,6 +1211,8 @@
</span><span class="cx">         {
</span><span class="cx">             mFunctions-&gt;disable(GL_RASTERIZER_DISCARD);
</span><span class="cx">         }
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -730,6 +1222,8 @@
</span><span class="cx">     {
</span><span class="cx">         mLineWidth = width;
</span><span class="cx">         mFunctions-&gt;lineWidth(mLineWidth);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_LINE_WIDTH);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -747,6 +1241,8 @@
</span><span class="cx">         {
</span><span class="cx">             mFunctions-&gt;disable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
</span><span class="cx">         }
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_PRIMITIVE_RESTART_ENABLED);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -755,7 +1251,20 @@
</span><span class="cx">     if (mClearDepth != clearDepth)
</span><span class="cx">     {
</span><span class="cx">         mClearDepth = clearDepth;
</span><del>-        mFunctions-&gt;clearDepth(mClearDepth);
</del><ins>+
+        // The glClearDepthf function isn't available until OpenGL 4.1.  Prefer it when it is
+        // available because OpenGL ES only works in floats.
+        if (mFunctions-&gt;clearDepthf)
+        {
+            mFunctions-&gt;clearDepthf(mClearDepth);
+        }
+        else
+        {
+            ASSERT(mFunctions-&gt;clearDepth);
+            mFunctions-&gt;clearDepth(mClearDepth);
+        }
+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_CLEAR_DEPTH);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -765,6 +1274,8 @@
</span><span class="cx">     {
</span><span class="cx">         mClearColor = clearColor;
</span><span class="cx">         mFunctions-&gt;clearColor(mClearColor.red, mClearColor.green, mClearColor.blue, mClearColor.alpha);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_CLEAR_COLOR);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -774,7 +1285,271 @@
</span><span class="cx">     {
</span><span class="cx">         mClearStencil = clearStencil;
</span><span class="cx">         mFunctions-&gt;clearStencil(mClearStencil);
</span><ins>+
+        mLocalDirtyBits.set(gl::State::DIRTY_BIT_CLEAR_STENCIL);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void StateManagerGL::syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;glDirtyBits)
+{
+    const auto &amp;glAndLocalDirtyBits = (glDirtyBits | mLocalDirtyBits);
+
+    if (!glAndLocalDirtyBits.any())
+    {
+        return;
+    }
+
+    // TODO(jmadill): Investigate only syncing vertex state for active attributes
+    for (auto dirtyBit : angle::IterateBitSet(glAndLocalDirtyBits))
+    {
+        switch (dirtyBit)
+        {
+            case gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED:
+                setScissorTestEnabled(state.isScissorTestEnabled());
+                break;
+            case gl::State::DIRTY_BIT_SCISSOR:
+                setScissor(state.getScissor());
+                break;
+            case gl::State::DIRTY_BIT_VIEWPORT:
+                setViewport(state.getViewport());
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_RANGE:
+                setDepthRange(state.getNearPlane(), state.getFarPlane());
+                break;
+            case gl::State::DIRTY_BIT_BLEND_ENABLED:
+                setBlendEnabled(state.isBlendEnabled());
+                break;
+            case gl::State::DIRTY_BIT_BLEND_COLOR:
+                setBlendColor(state.getBlendColor());
+                break;
+            case gl::State::DIRTY_BIT_BLEND_FUNCS:
+            {
+                const auto &amp;blendState = state.getBlendState();
+                setBlendFuncs(blendState.sourceBlendRGB, blendState.destBlendRGB,
+                              blendState.sourceBlendAlpha, blendState.destBlendAlpha);
+                break;
+            }
+            case gl::State::DIRTY_BIT_BLEND_EQUATIONS:
+            {
+                const auto &amp;blendState = state.getBlendState();
+                setBlendEquations(blendState.blendEquationRGB, blendState.blendEquationAlpha);
+                break;
+            }
+            case gl::State::DIRTY_BIT_COLOR_MASK:
+            {
+                const auto &amp;blendState = state.getBlendState();
+                setColorMask(blendState.colorMaskRed, blendState.colorMaskGreen,
+                             blendState.colorMaskBlue, blendState.colorMaskAlpha);
+                break;
+            }
+            case gl::State::DIRTY_BIT_SAMPLE_ALPHA_TO_COVERAGE_ENABLED:
+                setSampleAlphaToCoverageEnabled(state.isSampleAlphaToCoverageEnabled());
+                break;
+            case gl::State::DIRTY_BIT_SAMPLE_COVERAGE_ENABLED:
+                setSampleCoverageEnabled(state.isSampleCoverageEnabled());
+                break;
+            case gl::State::DIRTY_BIT_SAMPLE_COVERAGE:
+                setSampleCoverage(state.getSampleCoverageValue(), state.getSampleCoverageInvert());
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED:
+                setDepthTestEnabled(state.isDepthTestEnabled());
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_FUNC:
+                setDepthFunc(state.getDepthStencilState().depthFunc);
+                break;
+            case gl::State::DIRTY_BIT_DEPTH_MASK:
+                setDepthMask(state.getDepthStencilState().depthMask);
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_TEST_ENABLED:
+                setStencilTestEnabled(state.isStencilTestEnabled());
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_FUNCS_FRONT:
+            {
+                const auto &amp;depthStencilState = state.getDepthStencilState();
+                setStencilFrontFuncs(depthStencilState.stencilFunc, state.getStencilRef(),
+                                     depthStencilState.stencilMask);
+                break;
+            }
+            case gl::State::DIRTY_BIT_STENCIL_FUNCS_BACK:
+            {
+                const auto &amp;depthStencilState = state.getDepthStencilState();
+                setStencilBackFuncs(depthStencilState.stencilBackFunc, state.getStencilBackRef(),
+                                    depthStencilState.stencilBackMask);
+                break;
+            }
+            case gl::State::DIRTY_BIT_STENCIL_OPS_FRONT:
+            {
+                const auto &amp;depthStencilState = state.getDepthStencilState();
+                setStencilFrontOps(depthStencilState.stencilFail,
+                                   depthStencilState.stencilPassDepthFail,
+                                   depthStencilState.stencilPassDepthPass);
+                break;
+            }
+            case gl::State::DIRTY_BIT_STENCIL_OPS_BACK:
+            {
+                const auto &amp;depthStencilState = state.getDepthStencilState();
+                setStencilBackOps(depthStencilState.stencilBackFail,
+                                  depthStencilState.stencilBackPassDepthFail,
+                                  depthStencilState.stencilBackPassDepthPass);
+                break;
+            }
+            case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_FRONT:
+                setStencilFrontWritemask(state.getDepthStencilState().stencilWritemask);
+                break;
+            case gl::State::DIRTY_BIT_STENCIL_WRITEMASK_BACK:
+                setStencilBackWritemask(state.getDepthStencilState().stencilBackWritemask);
+                break;
+            case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
+                setCullFaceEnabled(state.isCullFaceEnabled());
+                break;
+            case gl::State::DIRTY_BIT_CULL_FACE:
+                setCullFace(state.getRasterizerState().cullMode);
+                break;
+            case gl::State::DIRTY_BIT_FRONT_FACE:
+                setFrontFace(state.getRasterizerState().frontFace);
+                break;
+            case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
+                setPolygonOffsetFillEnabled(state.isPolygonOffsetFillEnabled());
+                break;
+            case gl::State::DIRTY_BIT_POLYGON_OFFSET:
+            {
+                const auto &amp;rasterizerState = state.getRasterizerState();
+                setPolygonOffset(rasterizerState.polygonOffsetFactor,
+                                 rasterizerState.polygonOffsetUnits);
+                break;
+            }
+            case gl::State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED:
+                setRasterizerDiscardEnabled(state.isRasterizerDiscardEnabled());
+                break;
+            case gl::State::DIRTY_BIT_LINE_WIDTH:
+                setLineWidth(state.getLineWidth());
+                break;
+            case gl::State::DIRTY_BIT_PRIMITIVE_RESTART_ENABLED:
+                setPrimitiveRestartEnabled(state.isPrimitiveRestartEnabled());
+                break;
+            case gl::State::DIRTY_BIT_CLEAR_COLOR:
+                setClearColor(state.getColorClearValue());
+                break;
+            case gl::State::DIRTY_BIT_CLEAR_DEPTH:
+                setClearDepth(state.getDepthClearValue());
+                break;
+            case gl::State::DIRTY_BIT_CLEAR_STENCIL:
+                setClearStencil(state.getStencilClearValue());
+                break;
+            case gl::State::DIRTY_BIT_UNPACK_ALIGNMENT:
+                // TODO(jmadill): split this
+                setPixelUnpackState(state.getUnpackState());
+                break;
+            case gl::State::DIRTY_BIT_UNPACK_ROW_LENGTH:
+                // TODO(jmadill): split this
+                setPixelUnpackState(state.getUnpackState());
+                break;
+            case gl::State::DIRTY_BIT_UNPACK_IMAGE_HEIGHT:
+                // TODO(jmadill): split this
+                setPixelUnpackState(state.getUnpackState());
+                break;
+            case gl::State::DIRTY_BIT_UNPACK_SKIP_IMAGES:
+                // TODO(jmadill): split this
+                setPixelUnpackState(state.getUnpackState());
+                break;
+            case gl::State::DIRTY_BIT_UNPACK_SKIP_ROWS:
+                // TODO(jmadill): split this
+                setPixelUnpackState(state.getUnpackState());
+                break;
+            case gl::State::DIRTY_BIT_UNPACK_SKIP_PIXELS:
+                // TODO(jmadill): split this
+                setPixelUnpackState(state.getUnpackState());
+                break;
+            case gl::State::DIRTY_BIT_PACK_ALIGNMENT:
+                // TODO(jmadill): split this
+                setPixelPackState(state.getPackState());
+                break;
+            case gl::State::DIRTY_BIT_PACK_REVERSE_ROW_ORDER:
+                // TODO(jmadill): split this
+                setPixelPackState(state.getPackState());
+                break;
+            case gl::State::DIRTY_BIT_PACK_ROW_LENGTH:
+                // TODO(jmadill): split this
+                setPixelPackState(state.getPackState());
+                break;
+            case gl::State::DIRTY_BIT_PACK_SKIP_ROWS:
+                // TODO(jmadill): split this
+                setPixelPackState(state.getPackState());
+                break;
+            case gl::State::DIRTY_BIT_PACK_SKIP_PIXELS:
+                // TODO(jmadill): split this
+                setPixelPackState(state.getPackState());
+                break;
+            case gl::State::DIRTY_BIT_DITHER_ENABLED:
+                // TODO(jmadill): implement this
+                break;
+            case gl::State::DIRTY_BIT_GENERATE_MIPMAP_HINT:
+                // TODO(jmadill): implement this
+                break;
+            case gl::State::DIRTY_BIT_SHADER_DERIVATIVE_HINT:
+                // TODO(jmadill): implement this
+                break;
+            case gl::State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING:
+                // TODO(jmadill): implement this
+                break;
+            case gl::State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING:
+                // TODO(jmadill): implement this
+                break;
+            case gl::State::DIRTY_BIT_RENDERBUFFER_BINDING:
+                // TODO(jmadill): implement this
+                break;
+            case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING:
+                // TODO(jmadill): implement this
+                break;
+            case gl::State::DIRTY_BIT_PROGRAM_BINDING:
+                // TODO(jmadill): implement this
+                break;
+            default:
+            {
+                ASSERT(dirtyBit &gt;= gl::State::DIRTY_BIT_CURRENT_VALUE_0 &amp;&amp;
+                       dirtyBit &lt; gl::State::DIRTY_BIT_CURRENT_VALUE_MAX);
+                size_t attribIndex =
+                    static_cast&lt;size_t&gt;(dirtyBit) - gl::State::DIRTY_BIT_CURRENT_VALUE_0;
+                setAttributeCurrentData(attribIndex, state.getVertexAttribCurrentValue(
+                                                         static_cast&lt;unsigned int&gt;(attribIndex)));
+                break;
+            }
+        }
+
+        mLocalDirtyBits.reset();
+    }
</ins><span class="cx"> }
</span><ins>+
+void StateManagerGL::setFramebufferSRGBEnabled(bool enabled)
+{
+    if (mFramebufferSRGBEnabled != enabled)
+    {
+        mFramebufferSRGBEnabled = enabled;
+        if (mFramebufferSRGBEnabled)
+        {
+            mFunctions-&gt;enable(GL_FRAMEBUFFER_SRGB);
+        }
+        else
+        {
+            mFunctions-&gt;disable(GL_FRAMEBUFFER_SRGB);
+        }
+    }
+}
+
+void StateManagerGL::setTextureCubemapSeamlessEnabled(bool enabled)
+{
+    if (mTextureCubemapSeamlessEnabled != enabled)
+    {
+        mTextureCubemapSeamlessEnabled = enabled;
+        if (mTextureCubemapSeamlessEnabled)
+        {
+            mFunctions-&gt;enable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
+        }
+        else
+        {
+            mFunctions-&gt;disable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
+        }
+    }
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglStateManagerGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/StateManagerGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/StateManagerGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/StateManagerGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -11,6 +11,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><ins>+#include &quot;libANGLE/State.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/functionsgl_typedefs.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -27,30 +28,42 @@
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> class FunctionsGL;
</span><ins>+class TransformFeedbackGL;
+class QueryGL;
</ins><span class="cx"> 
</span><del>-class StateManagerGL : angle::NonCopyable
</del><ins>+class StateManagerGL final : angle::NonCopyable
</ins><span class="cx"> {
</span><span class="cx">   public:
</span><span class="cx">     StateManagerGL(const FunctionsGL *functions, const gl::Caps &amp;rendererCaps);
</span><span class="cx"> 
</span><ins>+    void deleteProgram(GLuint program);
+    void deleteVertexArray(GLuint vao);
+    void deleteTexture(GLuint texture);
+    void deleteSampler(GLuint sampler);
+    void deleteBuffer(GLuint buffer);
+    void deleteFramebuffer(GLuint fbo);
+    void deleteRenderbuffer(GLuint rbo);
+    void deleteTransformFeedback(GLuint transformFeedback);
+    void deleteQuery(GLuint query);
+
</ins><span class="cx">     void useProgram(GLuint program);
</span><del>-    void bindVertexArray(GLuint vao);
</del><ins>+    void forceUseProgram(GLuint program);
+    void bindVertexArray(GLuint vao, GLuint elementArrayBuffer);
</ins><span class="cx">     void bindBuffer(GLenum type, GLuint buffer);
</span><ins>+    void bindBufferBase(GLenum type, size_t index, GLuint buffer);
+    void bindBufferRange(GLenum type, size_t index, GLuint buffer, size_t offset, size_t size);
</ins><span class="cx">     void activeTexture(size_t unit);
</span><span class="cx">     void bindTexture(GLenum type, GLuint texture);
</span><del>-    void setPixelUnpackState(GLint alignment, GLint rowLength);
</del><ins>+    void bindSampler(size_t unit, GLuint sampler);
</ins><span class="cx">     void bindFramebuffer(GLenum type, GLuint framebuffer);
</span><span class="cx">     void bindRenderbuffer(GLenum type, GLuint renderbuffer);
</span><ins>+    void bindTransformFeedback(GLenum type, GLuint transformFeedback);
+    void beginQuery(GLenum type, GLuint query);
+    void endQuery(GLenum type, GLuint query);
+    void onBeginQuery(QueryGL *query);
</ins><span class="cx"> 
</span><del>-    void setClearState(const gl::State &amp;state, GLbitfield mask);
</del><ins>+    void setAttributeCurrentData(size_t index, const gl::VertexAttribCurrentValueData &amp;data);
</ins><span class="cx"> 
</span><del>-    gl::Error setDrawArraysState(const gl::Data &amp;data, GLint first, GLsizei count);
-    gl::Error setDrawElementsState(const gl::Data &amp;data, GLsizei count, GLenum type, const GLvoid *indices,
-                                   const GLvoid **outIndices);
-
-  private:
-    gl::Error setGenericDrawState(const gl::Data &amp;data);
-
</del><span class="cx">     void setScissorTestEnabled(bool enabled);
</span><span class="cx">     void setScissor(const gl::Rectangle &amp;scissor);
</span><span class="cx"> 
</span><span class="lines">@@ -59,7 +72,10 @@
</span><span class="cx"> 
</span><span class="cx">     void setBlendEnabled(bool enabled);
</span><span class="cx">     void setBlendColor(const gl::ColorF &amp;blendColor);
</span><del>-    void setBlendFuncs(GLenum sourceBlendRGB, GLenum destBlendRGB, GLenum sourceBlendAlpha, GLenum destBlendAlpha);
</del><ins>+    void setBlendFuncs(GLenum sourceBlendRGB,
+                       GLenum destBlendRGB,
+                       GLenum sourceBlendAlpha,
+                       GLenum destBlendAlpha);
</ins><span class="cx">     void setBlendEquations(GLenum blendEquationRGB, GLenum blendEquationAlpha);
</span><span class="cx">     void setColorMask(bool red, bool green, bool blue, bool alpha);
</span><span class="cx">     void setSampleAlphaToCoverageEnabled(bool enabled);
</span><span class="lines">@@ -82,7 +98,6 @@
</span><span class="cx">     void setFrontFace(GLenum frontFace);
</span><span class="cx">     void setPolygonOffsetFillEnabled(bool enabled);
</span><span class="cx">     void setPolygonOffset(float factor, float units);
</span><del>-    void setMultisampleEnabled(bool enabled);
</del><span class="cx">     void setRasterizerDiscardEnabled(bool enabled);
</span><span class="cx">     void setLineWidth(float width);
</span><span class="cx"> 
</span><span class="lines">@@ -92,19 +107,90 @@
</span><span class="cx">     void setClearDepth(float clearDepth);
</span><span class="cx">     void setClearStencil(GLint clearStencil);
</span><span class="cx"> 
</span><ins>+    void setPixelUnpackState(const gl::PixelUnpackState &amp;unpack);
+    void setPixelUnpackState(GLint alignment,
+                             GLint rowLength,
+                             GLint skipRows,
+                             GLint skipPixels,
+                             GLint imageHeight,
+                             GLint skipImages,
+                             GLuint unpackBuffer);
+    void setPixelPackState(const gl::PixelPackState &amp;pack);
+    void setPixelPackState(GLint alignment,
+                           GLint rowLength,
+                           GLint skipRows,
+                           GLint skipPixels,
+                           GLuint packBuffer);
+
+    void setFramebufferSRGBEnabled(bool enabled);
+
+    void onDeleteQueryObject(QueryGL *query);
+
+    gl::Error setDrawArraysState(const gl::Data &amp;data,
+                                 GLint first,
+                                 GLsizei count,
+                                 GLsizei instanceCount);
+    gl::Error setDrawElementsState(const gl::Data &amp;data,
+                                   GLsizei count,
+                                   GLenum type,
+                                   const GLvoid *indices,
+                                   GLsizei instanceCount,
+                                   const GLvoid **outIndices);
+
+    gl::Error onMakeCurrent(const gl::Data &amp;data);
+
+    void syncState(const gl::State &amp;state, const gl::State::DirtyBits &amp;glDirtyBits);
+
+  private:
+    gl::Error setGenericDrawState(const gl::Data &amp;data);
+
+    void setTextureCubemapSeamlessEnabled(bool enabled);
+
</ins><span class="cx">     const FunctionsGL *mFunctions;
</span><span class="cx"> 
</span><span class="cx">     GLuint mProgram;
</span><ins>+
</ins><span class="cx">     GLuint mVAO;
</span><ins>+    std::vector&lt;gl::VertexAttribCurrentValueData&gt; mVertexAttribCurrentValues;
+
</ins><span class="cx">     std::map&lt;GLenum, GLuint&gt; mBuffers;
</span><span class="cx"> 
</span><ins>+    struct IndexedBufferBinding
+    {
+        IndexedBufferBinding();
+
+        size_t offset;
+        size_t size;
+        GLuint buffer;
+    };
+    std::map&lt;GLenum, std::vector&lt;IndexedBufferBinding&gt;&gt; mIndexedBuffers;
+
</ins><span class="cx">     size_t mTextureUnitIndex;
</span><span class="cx">     std::map&lt;GLenum, std::vector&lt;GLuint&gt;&gt; mTextures;
</span><ins>+    std::vector&lt;GLuint&gt; mSamplers;
</ins><span class="cx"> 
</span><ins>+    GLuint mTransformFeedback;
+
+    std::map&lt;GLenum, GLuint&gt; mQueries;
+
+    TransformFeedbackGL *mPrevDrawTransformFeedback;
+    std::set&lt;QueryGL *&gt; mCurrentQueries;
+    uintptr_t mPrevDrawContext;
+
</ins><span class="cx">     GLint mUnpackAlignment;
</span><span class="cx">     GLint mUnpackRowLength;
</span><ins>+    GLint mUnpackSkipRows;
+    GLint mUnpackSkipPixels;
+    GLint mUnpackImageHeight;
+    GLint mUnpackSkipImages;
</ins><span class="cx"> 
</span><del>-    std::map&lt;GLenum, GLuint&gt; mFramebuffers;
</del><ins>+    GLint mPackAlignment;
+    GLint mPackRowLength;
+    GLint mPackSkipRows;
+    GLint mPackSkipPixels;
+
+    // TODO(jmadill): Convert to std::array when available
+    std::vector&lt;GLenum&gt; mFramebuffers;
</ins><span class="cx">     GLuint mRenderbuffer;
</span><span class="cx"> 
</span><span class="cx">     bool mScissorTestEnabled;
</span><span class="lines">@@ -156,7 +242,6 @@
</span><span class="cx">     bool mPolygonOffsetFillEnabled;
</span><span class="cx">     GLfloat mPolygonOffsetFactor;
</span><span class="cx">     GLfloat mPolygonOffsetUnits;
</span><del>-    bool mMultisampleEnabled;
</del><span class="cx">     bool mRasterizerDiscardEnabled;
</span><span class="cx">     float mLineWidth;
</span><span class="cx"> 
</span><span class="lines">@@ -165,6 +250,11 @@
</span><span class="cx">     gl::ColorF mClearColor;
</span><span class="cx">     float mClearDepth;
</span><span class="cx">     GLint mClearStencil;
</span><ins>+
+    bool mFramebufferSRGBEnabled;
+    bool mTextureCubemapSeamlessEnabled;
+
+    gl::State::DirtyBits mLocalDirtyBits;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglSurfaceGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SurfaceGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SurfaceGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SurfaceGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,11 +8,13 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/SurfaceGL.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/renderer/gl/FramebufferGL.h&quot;
+#include &quot;libANGLE/renderer/gl/RendererGL.h&quot;
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-SurfaceGL::SurfaceGL()
-    : SurfaceImpl()
</del><ins>+SurfaceGL::SurfaceGL(RendererGL *renderer) : SurfaceImpl(), mRenderer(renderer)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -20,4 +22,9 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+FramebufferImpl *SurfaceGL::createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data)
+{
+    return new FramebufferGL(data, mRenderer-&gt;getFunctions(), mRenderer-&gt;getStateManager(),
+                             mRenderer-&gt;getWorkarounds(), true);
</ins><span class="cx"> }
</span><ins>+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglSurfaceGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SurfaceGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SurfaceGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/SurfaceGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,10 +14,12 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+class RendererGL;
+
</ins><span class="cx"> class SurfaceGL : public SurfaceImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    SurfaceGL();
</del><ins>+    SurfaceGL(RendererGL *renderer);
</ins><span class="cx">     ~SurfaceGL() override;
</span><span class="cx"> 
</span><span class="cx">     gl::Error getAttachmentRenderTarget(const gl::FramebufferAttachment::Target &amp;target,
</span><span class="lines">@@ -26,7 +28,12 @@
</span><span class="cx">         return gl::Error(GL_OUT_OF_MEMORY, &quot;Not supported on OpenGL&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data) override;
+
</ins><span class="cx">     virtual egl::Error makeCurrent() = 0;
</span><ins>+
+  private:
+    RendererGL *mRenderer;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglTextureGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TextureGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TextureGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TextureGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,28 +13,17 @@
</span><span class="cx"> #include &quot;libANGLE/State.h&quot;
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/BlitGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/BufferGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/FramebufferGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/WorkaroundsGL.h&quot;
+#include &quot;libANGLE/renderer/gl/formatutilsgl.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-static void SetUnpackStateForTexImage(StateManagerGL *stateManager, const gl::PixelUnpackState &amp;unpack)
-{
-    const gl::Buffer *unpackBuffer = unpack.pixelBuffer.get();
-    if (unpackBuffer != nullptr)
-    {
-        UNIMPLEMENTED();
-    }
-    if (unpack.skipRows != 0 || unpack.skipPixels != 0 || unpack.imageHeight != 0 || unpack.skipImages != 0)
-    {
-        UNIMPLEMENTED();
-    }
-    stateManager-&gt;setPixelUnpackState(unpack.alignment, unpack.rowLength);
-}
-
</del><span class="cx"> static bool UseTexImage2D(GLenum textureType)
</span><span class="cx"> {
</span><span class="cx">     return textureType == GL_TEXTURE_2D || textureType == GL_TEXTURE_CUBE_MAP;
</span><span class="lines">@@ -57,27 +46,93 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-TextureGL::TextureGL(GLenum type, const FunctionsGL *functions, StateManagerGL *stateManager)
</del><ins>+static bool IsLUMAFormat(GLenum format)
+{
+    return format == GL_LUMINANCE || format == GL_ALPHA || format == GL_LUMINANCE_ALPHA;
+}
+
+static LUMAWorkaroundGL GetLUMAWorkaroundInfo(const gl::InternalFormat &amp;originalFormatInfo,
+                                              GLenum destinationFormat)
+{
+    if (IsLUMAFormat(originalFormatInfo.format))
+    {
+        const gl::InternalFormat &amp;destinationFormatInfo =
+            gl::GetInternalFormatInfo(destinationFormat);
+        return LUMAWorkaroundGL(!IsLUMAFormat(destinationFormatInfo.format),
+                                destinationFormatInfo.format);
+    }
+    else
+    {
+        return LUMAWorkaroundGL(false, GL_NONE);
+    }
+}
+
+static bool IsDepthStencilFormat(GLenum format)
+{
+    return format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL;
+}
+
+static bool GetDepthStencilWorkaround(const gl::InternalFormat &amp;originalFormatInfo)
+{
+    return IsDepthStencilFormat(originalFormatInfo.format);
+}
+
+static LevelInfoGL GetLevelInfo(GLenum originalFormat, GLenum destinationFormat)
+{
+    const gl::InternalFormat &amp;originalFormatInfo = gl::GetInternalFormatInfo(originalFormat);
+    return LevelInfoGL(originalFormat, GetDepthStencilWorkaround(originalFormatInfo),
+                       GetLUMAWorkaroundInfo(originalFormatInfo, destinationFormat));
+}
+
+LUMAWorkaroundGL::LUMAWorkaroundGL() : LUMAWorkaroundGL(false, GL_NONE)
+{
+}
+
+LUMAWorkaroundGL::LUMAWorkaroundGL(bool enabled_, GLenum workaroundFormat_)
+    : enabled(enabled_), workaroundFormat(workaroundFormat_)
+{
+}
+
+LevelInfoGL::LevelInfoGL() : LevelInfoGL(GL_NONE, false, LUMAWorkaroundGL())
+{
+}
+
+LevelInfoGL::LevelInfoGL(GLenum sourceFormat_,
+                         bool depthStencilWorkaround_,
+                         const LUMAWorkaroundGL &amp;lumaWorkaround_)
+    : sourceFormat(sourceFormat_),
+      depthStencilWorkaround(depthStencilWorkaround_),
+      lumaWorkaround(lumaWorkaround_)
+{
+}
+
+TextureGL::TextureGL(GLenum type,
+                     const FunctionsGL *functions,
+                     const WorkaroundsGL &amp;workarounds,
+                     StateManagerGL *stateManager,
+                     BlitGL *blitter)
</ins><span class="cx">     : TextureImpl(),
</span><span class="cx">       mTextureType(type),
</span><span class="cx">       mFunctions(functions),
</span><ins>+      mWorkarounds(workarounds),
</ins><span class="cx">       mStateManager(stateManager),
</span><del>-      mAppliedSamplerState(),
</del><ins>+      mBlitter(blitter),
+      mLevelInfo(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS),
+      mAppliedTextureState(),
</ins><span class="cx">       mTextureID(0)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(mFunctions);
</span><span class="cx">     ASSERT(mStateManager);
</span><ins>+    ASSERT(mBlitter);
</ins><span class="cx"> 
</span><span class="cx">     mFunctions-&gt;genTextures(1, &amp;mTextureID);
</span><ins>+    mStateManager-&gt;bindTexture(mTextureType, mTextureID);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TextureGL::~TextureGL()
</span><span class="cx"> {
</span><del>-    if (mTextureID)
-    {
-        mFunctions-&gt;deleteTextures(1, &amp;mTextureID);
-        mTextureID = 0;
-    }
</del><ins>+    mStateManager-&gt;deleteTexture(mTextureID);
+    mTextureID = 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TextureGL::setUsage(GLenum usage)
</span><span class="lines">@@ -92,23 +147,30 @@
</span><span class="cx">     UNUSED_ASSERTION_VARIABLE(&amp;CompatibleTextureTarget); // Reference this function to avoid warnings.
</span><span class="cx">     ASSERT(CompatibleTextureTarget(mTextureType, target));
</span><span class="cx"> 
</span><del>-    SetUnpackStateForTexImage(mStateManager, unpack);
</del><ins>+    nativegl::TexImageFormat texImageFormat =
+        nativegl::GetTexImageFormat(mFunctions, mWorkarounds, internalFormat, format, type);
</ins><span class="cx"> 
</span><span class="cx">     mStateManager-&gt;bindTexture(mTextureType, mTextureID);
</span><span class="cx">     if (UseTexImage2D(mTextureType))
</span><span class="cx">     {
</span><span class="cx">         ASSERT(size.depth == 1);
</span><del>-        mFunctions-&gt;texImage2D(target, level, internalFormat, size.width, size.height, 0, format, type, pixels);
</del><ins>+        mFunctions-&gt;texImage2D(target, static_cast&lt;GLint&gt;(level), texImageFormat.internalFormat,
+                               size.width, size.height, 0, texImageFormat.format,
+                               texImageFormat.type, pixels);
</ins><span class="cx">     }
</span><span class="cx">     else if (UseTexImage3D(mTextureType))
</span><span class="cx">     {
</span><del>-        mFunctions-&gt;texImage3D(target, level, internalFormat, size.width, size.height, size.depth, 0, format, type, pixels);
</del><ins>+        mFunctions-&gt;texImage3D(target, static_cast&lt;GLint&gt;(level), texImageFormat.internalFormat,
+                               size.width, size.height, size.depth, 0, texImageFormat.format,
+                               texImageFormat.type, pixels);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    mLevelInfo[level] = GetLevelInfo(internalFormat, texImageFormat.internalFormat);
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -117,108 +179,140 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(CompatibleTextureTarget(mTextureType, target));
</span><span class="cx"> 
</span><del>-    SetUnpackStateForTexImage(mStateManager, unpack);
</del><ins>+    nativegl::TexSubImageFormat texSubImageFormat =
+        nativegl::GetTexSubImageFormat(mFunctions, mWorkarounds, format, type);
</ins><span class="cx"> 
</span><span class="cx">     mStateManager-&gt;bindTexture(mTextureType, mTextureID);
</span><span class="cx">     if (UseTexImage2D(mTextureType))
</span><span class="cx">     {
</span><span class="cx">         ASSERT(area.z == 0 &amp;&amp; area.depth == 1);
</span><del>-        mFunctions-&gt;texSubImage2D(target, level, area.x, area.y, area.width, area.height, format, type, pixels);
</del><ins>+        mFunctions-&gt;texSubImage2D(target, static_cast&lt;GLint&gt;(level), area.x, area.y, area.width,
+                                  area.height, texSubImageFormat.format, texSubImageFormat.type,
+                                  pixels);
</ins><span class="cx">     }
</span><span class="cx">     else if (UseTexImage3D(mTextureType))
</span><span class="cx">     {
</span><del>-        mFunctions-&gt;texSubImage3D(target, level, area.x, area.y, area.z, area.width, area.height, area.depth,
-                                  format, type, pixels);
</del><ins>+        mFunctions-&gt;texSubImage3D(target, static_cast&lt;GLint&gt;(level), area.x, area.y, area.z,
+                                  area.width, area.height, area.depth, texSubImageFormat.format,
+                                  texSubImageFormat.type, pixels);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    ASSERT(mLevelInfo[level].lumaWorkaround.enabled ==
+           GetLevelInfo(format, texSubImageFormat.format).lumaWorkaround.enabled);
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureGL::setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
</span><del>-                                        const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+                                        const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(CompatibleTextureTarget(mTextureType, target));
</span><span class="cx"> 
</span><del>-    SetUnpackStateForTexImage(mStateManager, unpack);
</del><ins>+    nativegl::CompressedTexImageFormat compressedTexImageFormat =
+        nativegl::GetCompressedTexImageFormat(mFunctions, mWorkarounds, internalFormat);
</ins><span class="cx"> 
</span><del>-    const gl::InternalFormat &amp;internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
-    size_t depthPitch = internalFormatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, size.width, size.height,
-                                                             unpack.alignment, unpack.rowLength);
-    size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, size.width, size.height) * depthPitch;
-
</del><span class="cx">     mStateManager-&gt;bindTexture(mTextureType, mTextureID);
</span><span class="cx">     if (UseTexImage2D(mTextureType))
</span><span class="cx">     {
</span><span class="cx">         ASSERT(size.depth == 1);
</span><del>-        mFunctions-&gt;compressedTexImage2D(target, level, internalFormat, size.width, size.height, 0, dataSize, pixels);
</del><ins>+        mFunctions-&gt;compressedTexImage2D(target, static_cast&lt;GLint&gt;(level),
+                                         compressedTexImageFormat.internalFormat, size.width,
+                                         size.height, 0, static_cast&lt;GLsizei&gt;(imageSize), pixels);
</ins><span class="cx">     }
</span><span class="cx">     else if (UseTexImage3D(mTextureType))
</span><span class="cx">     {
</span><del>-        mFunctions-&gt;compressedTexImage3D(target, level, internalFormat, size.width, size.height, size.depth, 0,
-                                         dataSize, pixels);
</del><ins>+        mFunctions-&gt;compressedTexImage3D(
+            target, static_cast&lt;GLint&gt;(level), compressedTexImageFormat.internalFormat, size.width,
+            size.height, size.depth, 0, static_cast&lt;GLsizei&gt;(imageSize), pixels);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    mLevelInfo[level] = GetLevelInfo(internalFormat, compressedTexImageFormat.internalFormat);
+    ASSERT(!mLevelInfo[level].lumaWorkaround.enabled);
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureGL::setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                           const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels)
</del><ins>+                                           const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(CompatibleTextureTarget(mTextureType, target));
</span><span class="cx"> 
</span><del>-    SetUnpackStateForTexImage(mStateManager, unpack);
</del><ins>+    nativegl::CompressedTexSubImageFormat compressedTexSubImageFormat =
+        nativegl::GetCompressedSubTexImageFormat(mFunctions, mWorkarounds, format);
</ins><span class="cx"> 
</span><del>-    const gl::InternalFormat &amp;internalFormatInfo = gl::GetInternalFormatInfo(format);
-    size_t depthPitch = internalFormatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, area.width, area.height,
-                                                             unpack.alignment, unpack.rowLength);
-    size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, area.width, area.height) * depthPitch;
-
</del><span class="cx">     mStateManager-&gt;bindTexture(mTextureType, mTextureID);
</span><span class="cx">     if (UseTexImage2D(mTextureType))
</span><span class="cx">     {
</span><span class="cx">         ASSERT(area.z == 0 &amp;&amp; area.depth == 1);
</span><del>-        mFunctions-&gt;compressedTexSubImage2D(target, level, area.x, area.y, area.width, area.height, format, dataSize,
-                                            pixels);
</del><ins>+        mFunctions-&gt;compressedTexSubImage2D(
+            target, static_cast&lt;GLint&gt;(level), area.x, area.y, area.width, area.height,
+            compressedTexSubImageFormat.format, static_cast&lt;GLsizei&gt;(imageSize), pixels);
</ins><span class="cx">     }
</span><span class="cx">     else if (UseTexImage3D(mTextureType))
</span><span class="cx">     {
</span><del>-        mFunctions-&gt;compressedTexSubImage3D(target, level, area.x, area.y, area.z, area.width, area.height, area.depth,
-                                            format, dataSize, pixels);
</del><ins>+        mFunctions-&gt;compressedTexSubImage3D(target, static_cast&lt;GLint&gt;(level), area.x, area.y,
+                                            area.z, area.width, area.height, area.depth,
+                                            compressedTexSubImageFormat.format,
+                                            static_cast&lt;GLsizei&gt;(imageSize), pixels);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    ASSERT(!mLevelInfo[level].lumaWorkaround.enabled &amp;&amp;
+           !GetLevelInfo(format, compressedTexSubImageFormat.format).lumaWorkaround.enabled);
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> gl::Error TextureGL::copyImage(GLenum target, size_t level, const gl::Rectangle &amp;sourceArea, GLenum internalFormat,
</span><span class="cx">                                const gl::Framebuffer *source)
</span><span class="cx"> {
</span><del>-    const FramebufferGL *sourceFramebufferGL = GetImplAs&lt;FramebufferGL&gt;(source);
</del><ins>+    nativegl::CopyTexImageImageFormat copyTexImageFormat = nativegl::GetCopyTexImageImageFormat(
+        mFunctions, mWorkarounds, internalFormat, source-&gt;getImplementationColorReadType());
</ins><span class="cx"> 
</span><del>-    mStateManager-&gt;bindTexture(mTextureType, mTextureID);
-    mStateManager-&gt;bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL-&gt;getFramebufferID());
-
-    if (UseTexImage2D(mTextureType))
</del><ins>+    LevelInfoGL levelInfo = GetLevelInfo(internalFormat, copyTexImageFormat.internalFormat);
+    if (levelInfo.lumaWorkaround.enabled)
</ins><span class="cx">     {
</span><del>-        mFunctions-&gt;copyTexImage2D(target, level, internalFormat, sourceArea.x, sourceArea.y,
-                                   sourceArea.width, sourceArea.height, 0);
</del><ins>+        gl::Error error = mBlitter-&gt;copyImageToLUMAWorkaroundTexture(
+            mTextureID, mTextureType, target, levelInfo.sourceFormat, level, sourceArea,
+            copyTexImageFormat.internalFormat, source);
+        if (error.isError())
+        {
+            return error;
+        }
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        UNREACHABLE();
</del><ins>+        const FramebufferGL *sourceFramebufferGL = GetImplAs&lt;FramebufferGL&gt;(source);
+
+        mStateManager-&gt;bindTexture(mTextureType, mTextureID);
+        mStateManager-&gt;bindFramebuffer(GL_READ_FRAMEBUFFER,
+                                       sourceFramebufferGL-&gt;getFramebufferID());
+
+        if (UseTexImage2D(mTextureType))
+        {
+            mFunctions-&gt;copyTexImage2D(target, static_cast&lt;GLint&gt;(level),
+                                       copyTexImageFormat.internalFormat, sourceArea.x,
+                                       sourceArea.y, sourceArea.width, sourceArea.height, 0);
+        }
+        else
+        {
+            UNREACHABLE();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    mLevelInfo[level] = levelInfo;
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -230,20 +324,36 @@
</span><span class="cx">     mStateManager-&gt;bindTexture(mTextureType, mTextureID);
</span><span class="cx">     mStateManager-&gt;bindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebufferGL-&gt;getFramebufferID());
</span><span class="cx"> 
</span><del>-    if (UseTexImage2D(mTextureType))
</del><ins>+    const LevelInfoGL &amp;levelInfo = mLevelInfo[level];
+    if (levelInfo.lumaWorkaround.enabled)
</ins><span class="cx">     {
</span><del>-        ASSERT(destOffset.z == 0);
-        mFunctions-&gt;copyTexSubImage2D(target, level, destOffset.x, destOffset.y,
-                                      sourceArea.x, sourceArea.y, sourceArea.width, sourceArea.height);
</del><ins>+        gl::Error error = mBlitter-&gt;copySubImageToLUMAWorkaroundTexture(
+            mTextureID, mTextureType, target, levelInfo.sourceFormat, level, destOffset, sourceArea,
+            source);
+        if (error.isError())
+        {
+            return error;
+        }
</ins><span class="cx">     }
</span><del>-    else if (UseTexImage3D(mTextureType))
-    {
-        mFunctions-&gt;copyTexSubImage3D(target, level, destOffset.x, destOffset.y, destOffset.z,
-                                      sourceArea.x, sourceArea.y, sourceArea.width, sourceArea.height);
-    }
</del><span class="cx">     else
</span><span class="cx">     {
</span><del>-        UNREACHABLE();
</del><ins>+        if (UseTexImage2D(mTextureType))
+        {
+            ASSERT(destOffset.z == 0);
+            mFunctions-&gt;copyTexSubImage2D(target, static_cast&lt;GLint&gt;(level), destOffset.x,
+                                          destOffset.y, sourceArea.x, sourceArea.y,
+                                          sourceArea.width, sourceArea.height);
+        }
+        else if (UseTexImage3D(mTextureType))
+        {
+            mFunctions-&gt;copyTexSubImage3D(target, static_cast&lt;GLint&gt;(level), destOffset.x,
+                                          destOffset.y, destOffset.z, sourceArea.x, sourceArea.y,
+                                          sourceArea.width, sourceArea.height);
+        }
+        else
+        {
+            UNREACHABLE();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="lines">@@ -254,13 +364,17 @@
</span><span class="cx">     // TODO: emulate texture storage with TexImage calls if on GL version &lt;4.2 or the
</span><span class="cx">     // ARB_texture_storage extension is not available.
</span><span class="cx"> 
</span><ins>+    nativegl::TexStorageFormat texStorageFormat =
+        nativegl::GetTexStorageFormat(mFunctions, mWorkarounds, internalFormat);
+
</ins><span class="cx">     mStateManager-&gt;bindTexture(mTextureType, mTextureID);
</span><span class="cx">     if (UseTexImage2D(mTextureType))
</span><span class="cx">     {
</span><span class="cx">         ASSERT(size.depth == 1);
</span><span class="cx">         if (mFunctions-&gt;texStorage2D)
</span><span class="cx">         {
</span><del>-            mFunctions-&gt;texStorage2D(target, levels, internalFormat, size.width, size.height);
</del><ins>+            mFunctions-&gt;texStorage2D(target, static_cast&lt;GLsizei&gt;(levels),
+                                     texStorageFormat.internalFormat, size.width, size.height);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="lines">@@ -280,15 +394,41 @@
</span><span class="cx"> 
</span><span class="cx">                 if (mTextureType == GL_TEXTURE_2D)
</span><span class="cx">                 {
</span><del>-                    mFunctions-&gt;texImage2D(target, level, internalFormat, levelSize.width, levelSize.height,
-                                           0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
</del><ins>+                    if (internalFormatInfo.compressed)
+                    {
+                        size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height);
+                        mFunctions-&gt;compressedTexImage2D(target, static_cast&lt;GLint&gt;(level),
+                                                         texStorageFormat.internalFormat,
+                                                         levelSize.width, levelSize.height, 0,
+                                                         static_cast&lt;GLsizei&gt;(dataSize), nullptr);
+                    }
+                    else
+                    {
+                        mFunctions-&gt;texImage2D(target, static_cast&lt;GLint&gt;(level),
+                                               texStorageFormat.internalFormat, levelSize.width,
+                                               levelSize.height, 0, internalFormatInfo.format,
+                                               internalFormatInfo.type, nullptr);
+                    }
</ins><span class="cx">                 }
</span><span class="cx">                 else if (mTextureType == GL_TEXTURE_CUBE_MAP)
</span><span class="cx">                 {
</span><span class="cx">                     for (GLenum face = gl::FirstCubeMapTextureTarget; face &lt;= gl::LastCubeMapTextureTarget; face++)
</span><span class="cx">                     {
</span><del>-                        mFunctions-&gt;texImage2D(face, level, internalFormat, levelSize.width, levelSize.height,
-                                               0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
</del><ins>+                        if (internalFormatInfo.compressed)
+                        {
+                            size_t dataSize = internalFormatInfo.computeBlockSize(GL_UNSIGNED_BYTE, levelSize.width, levelSize.height);
+                            mFunctions-&gt;compressedTexImage2D(
+                                face, static_cast&lt;GLint&gt;(level), texStorageFormat.internalFormat,
+                                levelSize.width, levelSize.height, 0,
+                                static_cast&lt;GLsizei&gt;(dataSize), nullptr);
+                        }
+                        else
+                        {
+                            mFunctions-&gt;texImage2D(face, static_cast&lt;GLint&gt;(level),
+                                                   texStorageFormat.internalFormat, levelSize.width,
+                                                   levelSize.height, 0, internalFormatInfo.format,
+                                                   internalFormatInfo.type, nullptr);
+                        }
</ins><span class="cx">                     }
</span><span class="cx">                 }
</span><span class="cx">                 else
</span><span class="lines">@@ -302,7 +442,9 @@
</span><span class="cx">     {
</span><span class="cx">         if (mFunctions-&gt;texStorage3D)
</span><span class="cx">         {
</span><del>-            mFunctions-&gt;texStorage3D(target, levels, internalFormat, size.width, size.height, size.depth);
</del><ins>+            mFunctions-&gt;texStorage3D(target, static_cast&lt;GLsizei&gt;(levels),
+                                     texStorageFormat.internalFormat, size.width, size.height,
+                                     size.depth);
</ins><span class="cx">         }
</span><span class="cx">         else
</span><span class="cx">         {
</span><span class="lines">@@ -314,14 +456,28 @@
</span><span class="cx">             // Internal format must be sized
</span><span class="cx">             ASSERT(internalFormatInfo.pixelBytes != 0);
</span><span class="cx"> 
</span><del>-            for (size_t i = 0; i &lt; levels; i++)
</del><ins>+            for (GLsizei i = 0; i &lt; static_cast&lt;GLsizei&gt;(levels); i++)
</ins><span class="cx">             {
</span><span class="cx">                 gl::Extents levelSize(std::max(size.width &gt;&gt; i, 1),
</span><span class="cx">                                       std::max(size.height &gt;&gt; i, 1),
</span><span class="cx">                                       mTextureType == GL_TEXTURE_3D ? std::max(size.depth &gt;&gt; i, 1) : size.depth);
</span><span class="cx"> 
</span><del>-                mFunctions-&gt;texImage3D(target, i, internalFormat, levelSize.width, levelSize.height, levelSize.depth,
-                                       0, internalFormatInfo.format, internalFormatInfo.type, nullptr);
</del><ins>+                if (internalFormatInfo.compressed)
+                {
+                    GLsizei dataSize = static_cast&lt;GLsizei&gt;(internalFormatInfo.computeBlockSize(
+                                           GL_UNSIGNED_BYTE, levelSize.width, levelSize.height)) *
+                                       levelSize.depth;
+                    mFunctions-&gt;compressedTexImage3D(target, i, texStorageFormat.internalFormat,
+                                                     levelSize.width, levelSize.height,
+                                                     levelSize.depth, 0, dataSize, nullptr);
+                }
+                else
+                {
+                    mFunctions-&gt;texImage3D(target, i, texStorageFormat.internalFormat,
+                                           levelSize.width, levelSize.height, levelSize.depth, 0,
+                                           internalFormatInfo.format, internalFormatInfo.type,
+                                           nullptr);
+                }
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -330,13 +486,25 @@
</span><span class="cx">         UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    LevelInfoGL levelInfo = GetLevelInfo(internalFormat, texStorageFormat.internalFormat);
+    for (size_t level = 0; level &lt; mLevelInfo.size(); level++)
+    {
+        mLevelInfo[level] = levelInfo;
+    }
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error TextureGL::generateMipmaps(const gl::SamplerState &amp;samplerState)
</del><ins>+gl::Error TextureGL::generateMipmaps(const gl::TextureState &amp;textureState)
</ins><span class="cx"> {
</span><span class="cx">     mStateManager-&gt;bindTexture(mTextureType, mTextureID);
</span><span class="cx">     mFunctions-&gt;generateMipmap(mTextureType);
</span><ins>+
+    for (size_t level = textureState.baseLevel; level &lt; mLevelInfo.size(); level++)
+    {
+        mLevelInfo[level] = mLevelInfo[textureState.baseLevel];
+    }
+
</ins><span class="cx">     return gl::Error(GL_NO_ERROR);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -346,6 +514,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Make sure this texture is bound
</span><span class="cx">     mStateManager-&gt;bindTexture(mTextureType, mTextureID);
</span><ins>+
+    mLevelInfo[0] = LevelInfoGL();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TextureGL::releaseTexImage()
</span><span class="lines">@@ -364,42 +534,216 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;typename T&gt;
-static inline void SyncSamplerStateMember(const FunctionsGL *functions, const gl::SamplerState &amp;newState,
-                                          gl::SamplerState &amp;curState, GLenum textureType, GLenum name,
</del><ins>+gl::Error TextureGL::setEGLImageTarget(GLenum target, egl::Image *image)
+{
+    UNIMPLEMENTED();
+    return gl::Error(GL_INVALID_OPERATION);
+}
+
+template &lt;typename T, typename ApplyTextureFuncType&gt;
+static inline void SyncSamplerStateMember(const FunctionsGL *functions,
+                                          ApplyTextureFuncType applyTextureFunc,
+                                          const gl::SamplerState &amp;newState,
+                                          gl::SamplerState &amp;curState,
+                                          GLenum textureType,
+                                          GLenum name,
</ins><span class="cx">                                           T(gl::SamplerState::*samplerMember))
</span><span class="cx"> {
</span><span class="cx">     if (curState.*samplerMember != newState.*samplerMember)
</span><span class="cx">     {
</span><ins>+        applyTextureFunc();
</ins><span class="cx">         curState.*samplerMember = newState.*samplerMember;
</span><span class="cx">         functions-&gt;texParameterf(textureType, name, static_cast&lt;GLfloat&gt;(curState.*samplerMember));
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TextureGL::syncSamplerState(const gl::SamplerState &amp;samplerState) const
</del><ins>+template &lt;typename T, typename ApplyTextureFuncType&gt;
+static inline void SyncTextureStateMember(const FunctionsGL *functions,
+                                          ApplyTextureFuncType applyTextureFunc,
+                                          const gl::TextureState &amp;newState,
+                                          gl::TextureState &amp;curState,
+                                          GLenum textureType,
+                                          GLenum name,
+                                          T(gl::TextureState::*stateMember))
</ins><span class="cx"> {
</span><del>-    if (mAppliedSamplerState != samplerState)
</del><ins>+    if (curState.*stateMember != newState.*stateMember)
</ins><span class="cx">     {
</span><del>-        mStateManager-&gt;bindTexture(mTextureType, mTextureID);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MIN_FILTER, &amp;gl::SamplerState::minFilter);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAG_FILTER, &amp;gl::SamplerState::magFilter);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_WRAP_S, &amp;gl::SamplerState::wrapS);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_WRAP_T, &amp;gl::SamplerState::wrapT);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_WRAP_R, &amp;gl::SamplerState::wrapR);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAX_ANISOTROPY_EXT, &amp;gl::SamplerState::maxAnisotropy);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_BASE_LEVEL, &amp;gl::SamplerState::baseLevel);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAX_LEVEL, &amp;gl::SamplerState::maxLevel);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MIN_LOD, &amp;gl::SamplerState::minLod);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_MAX_LOD, &amp;gl::SamplerState::maxLod);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_COMPARE_MODE, &amp;gl::SamplerState::compareMode);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_COMPARE_FUNC, &amp;gl::SamplerState::compareFunc);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_R, &amp;gl::SamplerState::swizzleRed);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_G, &amp;gl::SamplerState::swizzleGreen);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_B, &amp;gl::SamplerState::swizzleBlue);
-        SyncSamplerStateMember(mFunctions, samplerState, mAppliedSamplerState, mTextureType, GL_TEXTURE_SWIZZLE_A, &amp;gl::SamplerState::swizzleAlpha);
</del><ins>+        applyTextureFunc();
+        curState.*stateMember = newState.*stateMember;
+        functions-&gt;texParameterf(textureType, name, static_cast&lt;GLfloat&gt;(curState.*stateMember));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template &lt;typename T, typename ApplyTextureFuncType&gt;
+static inline void SyncTextureStateSwizzle(const FunctionsGL *functions,
+                                           ApplyTextureFuncType applyTextureFunc,
+                                           const LevelInfoGL &amp;levelInfo,
+                                           const gl::TextureState &amp;newState,
+                                           gl::TextureState &amp;curState,
+                                           GLenum textureType,
+                                           GLenum name,
+                                           T(gl::TextureState::*stateMember))
+{
+    if (levelInfo.lumaWorkaround.enabled || levelInfo.depthStencilWorkaround)
+    {
+        GLenum resultSwizzle = GL_NONE;
+        if (levelInfo.lumaWorkaround.enabled)
+        {
+            UNUSED_ASSERTION_VARIABLE(levelInfo.lumaWorkaround.workaroundFormat);
+
+            switch (newState.*stateMember)
+            {
+            case GL_RED:
+            case GL_GREEN:
+            case GL_BLUE:
+                if (levelInfo.sourceFormat == GL_LUMINANCE ||
+                    levelInfo.sourceFormat == GL_LUMINANCE_ALPHA)
+                {
+                    // Texture is backed by a RED or RG texture, point all color channels at the red
+                    // channel.
+                    ASSERT(levelInfo.lumaWorkaround.workaroundFormat == GL_RED ||
+                           levelInfo.lumaWorkaround.workaroundFormat == GL_RG);
+                    resultSwizzle = GL_RED;
+                }
+                else if (levelInfo.sourceFormat == GL_ALPHA)
+                {
+                    // Color channels are not supposed to exist, make them always sample 0.
+                    resultSwizzle = GL_ZERO;
+                }
+                else
+                {
+                    UNREACHABLE();
+                }
+                break;
+
+            case GL_ALPHA:
+                if (levelInfo.sourceFormat == GL_LUMINANCE)
+                {
+                    // Alpha channel is not supposed to exist, make it always sample 1.
+                    resultSwizzle = GL_ONE;
+                }
+                else if (levelInfo.sourceFormat == GL_ALPHA)
+                {
+                    // Texture is backed by a RED texture, point the alpha channel at the red
+                    // channel.
+                    ASSERT(levelInfo.lumaWorkaround.workaroundFormat == GL_RED);
+                    resultSwizzle = GL_RED;
+                }
+                else if (levelInfo.sourceFormat == GL_LUMINANCE_ALPHA)
+                {
+                    // Texture is backed by an RG texture, point the alpha channel at the green
+                    // channel.
+                    ASSERT(levelInfo.lumaWorkaround.workaroundFormat == GL_RG);
+                    resultSwizzle = GL_GREEN;
+                }
+                else
+                {
+                    UNREACHABLE();
+                }
+                break;
+
+            case GL_ZERO:
+            case GL_ONE:
+                // Don't modify the swizzle state when requesting ZERO or ONE.
+                resultSwizzle = newState.*stateMember;
+                break;
+
+            default:
+                UNREACHABLE();
+                break;
+            }
+        }
+        else if (levelInfo.depthStencilWorkaround)
+        {
+            switch (newState.*stateMember)
+            {
+                case GL_RED:
+                    // Don't modify the swizzle state when requesting the red channel.
+                    resultSwizzle = newState.*stateMember;
+                    break;
+
+                case GL_GREEN:
+                case GL_BLUE:
+                    // Depth textures should sample 0 from the green and blue channels.
+                    resultSwizzle = GL_ZERO;
+                    break;
+
+                case GL_ALPHA:
+                    // Depth textures should sample 1 from the alpha channel.
+                    resultSwizzle = GL_ONE;
+                    break;
+
+                case GL_ZERO:
+                case GL_ONE:
+                    // Don't modify the swizzle state when requesting ZERO or ONE.
+                    resultSwizzle = newState.*stateMember;
+                    break;
+
+                default:
+                    UNREACHABLE();
+                    break;
+            }
+        }
+        else
+        {
+            UNREACHABLE();
+        }
+
+        // Apply the new swizzle state if needed
+        if (curState.*stateMember != resultSwizzle)
+        {
+            applyTextureFunc();
+            curState.*stateMember = resultSwizzle;
+            functions-&gt;texParameterf(textureType, name, static_cast&lt;GLfloat&gt;(resultSwizzle));
+        }
+    }
+    else
+    {
+        SyncTextureStateMember(functions, applyTextureFunc, newState, curState, textureType, name,
+                               stateMember);
+    }
+}
+
+void TextureGL::syncState(size_t textureUnit, const gl::TextureState &amp;textureState) const
+{
+    // Callback lamdba to bind this texture only if needed.
+    bool textureApplied   = false;
+    auto applyTextureFunc = [&amp;]()
+    {
+        if (!textureApplied)
+        {
+            mStateManager-&gt;activeTexture(textureUnit);
+            mStateManager-&gt;bindTexture(mTextureType, mTextureID);
+            textureApplied = true;
+        }
+    };
+
+    // clang-format off
+
+    // Sync texture state
+    SyncTextureStateMember(mFunctions, applyTextureFunc, textureState, mAppliedTextureState, mTextureType, GL_TEXTURE_BASE_LEVEL, &amp;gl::TextureState::baseLevel);
+    SyncTextureStateMember(mFunctions, applyTextureFunc, textureState, mAppliedTextureState, mTextureType, GL_TEXTURE_MAX_LEVEL, &amp;gl::TextureState::maxLevel);
+
+    const LevelInfoGL &amp;levelInfo = mLevelInfo[textureState.baseLevel];
+    SyncTextureStateSwizzle(mFunctions, applyTextureFunc, levelInfo, textureState, mAppliedTextureState, mTextureType, GL_TEXTURE_SWIZZLE_R, &amp;gl::TextureState::swizzleRed);
+    SyncTextureStateSwizzle(mFunctions, applyTextureFunc, levelInfo, textureState, mAppliedTextureState, mTextureType, GL_TEXTURE_SWIZZLE_G, &amp;gl::TextureState::swizzleGreen);
+    SyncTextureStateSwizzle(mFunctions, applyTextureFunc, levelInfo, textureState, mAppliedTextureState, mTextureType, GL_TEXTURE_SWIZZLE_B, &amp;gl::TextureState::swizzleBlue);
+    SyncTextureStateSwizzle(mFunctions, applyTextureFunc, levelInfo, textureState, mAppliedTextureState, mTextureType, GL_TEXTURE_SWIZZLE_A, &amp;gl::TextureState::swizzleAlpha);
+
+    // Sync sampler state
+    SyncSamplerStateMember(mFunctions, applyTextureFunc, textureState.samplerState, mAppliedTextureState.samplerState, mTextureType, GL_TEXTURE_MIN_FILTER, &amp;gl::SamplerState::minFilter);
+    SyncSamplerStateMember(mFunctions, applyTextureFunc, textureState.samplerState, mAppliedTextureState.samplerState, mTextureType, GL_TEXTURE_MAG_FILTER, &amp;gl::SamplerState::magFilter);
+    SyncSamplerStateMember(mFunctions, applyTextureFunc, textureState.samplerState, mAppliedTextureState.samplerState, mTextureType, GL_TEXTURE_WRAP_S, &amp;gl::SamplerState::wrapS);
+    SyncSamplerStateMember(mFunctions, applyTextureFunc, textureState.samplerState, mAppliedTextureState.samplerState, mTextureType, GL_TEXTURE_WRAP_T, &amp;gl::SamplerState::wrapT);
+    SyncSamplerStateMember(mFunctions, applyTextureFunc, textureState.samplerState, mAppliedTextureState.samplerState, mTextureType, GL_TEXTURE_WRAP_R, &amp;gl::SamplerState::wrapR);
+    SyncSamplerStateMember(mFunctions, applyTextureFunc, textureState.samplerState, mAppliedTextureState.samplerState, mTextureType, GL_TEXTURE_MAX_ANISOTROPY_EXT, &amp;gl::SamplerState::maxAnisotropy);
+    SyncSamplerStateMember(mFunctions, applyTextureFunc, textureState.samplerState, mAppliedTextureState.samplerState, mTextureType, GL_TEXTURE_MIN_LOD, &amp;gl::SamplerState::minLod);
+    SyncSamplerStateMember(mFunctions, applyTextureFunc, textureState.samplerState, mAppliedTextureState.samplerState, mTextureType, GL_TEXTURE_MAX_LOD, &amp;gl::SamplerState::maxLod);
+    SyncSamplerStateMember(mFunctions, applyTextureFunc, textureState.samplerState, mAppliedTextureState.samplerState, mTextureType, GL_TEXTURE_COMPARE_MODE, &amp;gl::SamplerState::compareMode);
+    SyncSamplerStateMember(mFunctions, applyTextureFunc, textureState.samplerState, mAppliedTextureState.samplerState, mTextureType, GL_TEXTURE_COMPARE_FUNC, &amp;gl::SamplerState::compareFunc);
+    // clang-format on
+}
+
</ins><span class="cx"> GLuint TextureGL::getTextureID() const
</span><span class="cx"> {
</span><span class="cx">     return mTextureID;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglTextureGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TextureGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TextureGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TextureGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -15,13 +15,47 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+class BlitGL;
</ins><span class="cx"> class FunctionsGL;
</span><span class="cx"> class StateManagerGL;
</span><ins>+struct WorkaroundsGL;
</ins><span class="cx"> 
</span><ins>+struct LUMAWorkaroundGL
+{
+    bool enabled;
+    GLenum workaroundFormat;
+
+    LUMAWorkaroundGL();
+    LUMAWorkaroundGL(bool enabled, GLenum workaroundFormat);
+};
+
+// Structure containing information about format and workarounds for each mip level of the
+// TextureGL.
+struct LevelInfoGL
+{
+    // Format of the data used in this mip level.
+    GLenum sourceFormat;
+
+    // If this mip level requires sampler-state re-writing so that only a red channel is exposed.
+    bool depthStencilWorkaround;
+
+    // Information about luminance alpha texture workarounds in the core profile.
+    LUMAWorkaroundGL lumaWorkaround;
+
+    LevelInfoGL();
+    LevelInfoGL(GLenum sourceFormat,
+                bool depthStencilWorkaround,
+                const LUMAWorkaroundGL &amp;lumaWorkaround);
+};
+
</ins><span class="cx"> class TextureGL : public TextureImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    TextureGL(GLenum type, const FunctionsGL *functions, StateManagerGL *stateManager);
</del><ins>+    TextureGL(GLenum type,
+              const FunctionsGL *functions,
+              const WorkaroundsGL &amp;workarounds,
+              StateManagerGL *stateManager,
+              BlitGL *blitter);
</ins><span class="cx">     ~TextureGL() override;
</span><span class="cx"> 
</span><span class="cx">     void setUsage(GLenum usage) override;
</span><span class="lines">@@ -32,9 +66,9 @@
</span><span class="cx">                           const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</span><span class="cx"> 
</span><span class="cx">     gl::Error setCompressedImage(GLenum target, size_t level, GLenum internalFormat, const gl::Extents &amp;size,
</span><del>-                                 const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</del><ins>+                                 const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) override;
</ins><span class="cx">     gl::Error setCompressedSubImage(GLenum target, size_t level, const gl::Box &amp;area, GLenum format,
</span><del>-                                    const gl::PixelUnpackState &amp;unpack, const uint8_t *pixels) override;
</del><ins>+                                    const gl::PixelUnpackState &amp;unpack, size_t imageSize, const uint8_t *pixels) override;
</ins><span class="cx"> 
</span><span class="cx">     gl::Error copyImage(GLenum target, size_t level, const gl::Rectangle &amp;sourceArea, GLenum internalFormat,
</span><span class="cx">                         const gl::Framebuffer *source) override;
</span><span class="lines">@@ -43,12 +77,14 @@
</span><span class="cx"> 
</span><span class="cx">     gl::Error setStorage(GLenum target, size_t levels, GLenum internalFormat, const gl::Extents &amp;size) override;
</span><span class="cx"> 
</span><del>-    gl::Error generateMipmaps(const gl::SamplerState &amp;samplerState) override;
</del><ins>+    gl::Error generateMipmaps(const gl::TextureState &amp;textureState) override;
</ins><span class="cx"> 
</span><span class="cx">     void bindTexImage(egl::Surface *surface) override;
</span><span class="cx">     void releaseTexImage() override;
</span><span class="cx"> 
</span><del>-    void syncSamplerState(const gl::SamplerState &amp;samplerState) const;
</del><ins>+    gl::Error setEGLImageTarget(GLenum target, egl::Image *image) override;
+
+    void syncState(size_t textureUnit, const gl::TextureState &amp;textureState) const;
</ins><span class="cx">     GLuint getTextureID() const;
</span><span class="cx"> 
</span><span class="cx">     gl::Error getAttachmentRenderTarget(const gl::FramebufferAttachment::Target &amp;target,
</span><span class="lines">@@ -61,9 +97,13 @@
</span><span class="cx">     GLenum mTextureType;
</span><span class="cx"> 
</span><span class="cx">     const FunctionsGL *mFunctions;
</span><ins>+    const WorkaroundsGL &amp;mWorkarounds;
</ins><span class="cx">     StateManagerGL *mStateManager;
</span><ins>+    BlitGL *mBlitter;
</ins><span class="cx"> 
</span><del>-    mutable gl::SamplerState mAppliedSamplerState;
</del><ins>+    std::vector&lt;LevelInfoGL&gt; mLevelInfo;
+
+    mutable gl::TextureState mAppliedTextureState;
</ins><span class="cx">     GLuint mTextureID;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglTransformFeedbackGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TransformFeedbackGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,45 +9,134 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/TransformFeedbackGL.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><ins>+#include &quot;libANGLE/Data.h&quot;
+#include &quot;libANGLE/renderer/gl/BufferGL.h&quot;
+#include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
+#include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-TransformFeedbackGL::TransformFeedbackGL()
-    : TransformFeedbackImpl()
-{}
</del><ins>+TransformFeedbackGL::TransformFeedbackGL(const FunctionsGL *functions,
+                                         StateManagerGL *stateManager,
+                                         size_t maxTransformFeedbackBufferBindings)
+    : TransformFeedbackImpl(),
+      mFunctions(functions),
+      mStateManager(stateManager),
+      mTransformFeedbackID(0),
+      mIsActive(false),
+      mIsPaused(false),
+      mCurrentIndexedBuffers(maxTransformFeedbackBufferBindings)
+{
+    mFunctions-&gt;genTransformFeedbacks(1, &amp;mTransformFeedbackID);
+}
</ins><span class="cx"> 
</span><span class="cx"> TransformFeedbackGL::~TransformFeedbackGL()
</span><del>-{}
</del><ins>+{
+    mStateManager-&gt;deleteTransformFeedback(mTransformFeedbackID);
+    mTransformFeedbackID = 0;
</ins><span class="cx"> 
</span><ins>+    for (auto &amp;bufferBinding : mCurrentIndexedBuffers)
+    {
+        bufferBinding.set(nullptr);
+    }
+}
+
</ins><span class="cx"> void TransformFeedbackGL::begin(GLenum primitiveMode)
</span><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
</del><ins>+    // Do not begin directly, StateManagerGL will handle beginning and resuming transform feedback.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TransformFeedbackGL::end()
</span><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
</del><ins>+    syncActiveState(false, GL_NONE);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TransformFeedbackGL::pause()
</span><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
</del><ins>+    syncPausedState(true);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TransformFeedbackGL::resume()
</span><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
</del><ins>+    // Do not resume directly, StateManagerGL will handle beginning and resuming transform feedback.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TransformFeedbackGL::bindGenericBuffer(const BindingPointer&lt;gl::Buffer&gt; &amp;binding)
</span><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TransformFeedbackGL::bindIndexedBuffer(size_t index, const OffsetBindingPointer&lt;gl::Buffer&gt; &amp;binding)
</span><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
</del><ins>+    // Directly bind buffer (not through the StateManager methods) because the buffer bindings are
+    // tracked per transform feedback object
+    if (binding != mCurrentIndexedBuffers[index])
+    {
+        mStateManager-&gt;bindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedbackID);
+        if (binding.get() != nullptr)
+        {
+            const BufferGL *bufferGL = GetImplAs&lt;BufferGL&gt;(binding.get());
+            if (binding.getSize() != 0)
+            {
+                mFunctions-&gt;bindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER,
+                                            static_cast&lt;GLuint&gt;(index), bufferGL-&gt;getBufferID(),
+                                            binding.getOffset(), binding.getSize());
+            }
+            else
+            {
+                mFunctions-&gt;bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, static_cast&lt;GLuint&gt;(index),
+                                           bufferGL-&gt;getBufferID());
+            }
+        }
+        else
+        {
+            mFunctions-&gt;bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, static_cast&lt;GLuint&gt;(index), 0);
+        }
+
+        mCurrentIndexedBuffers[index] = binding;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLuint TransformFeedbackGL::getTransformFeedbackID() const
+{
+    return mTransformFeedbackID;
</ins><span class="cx"> }
</span><ins>+
+void TransformFeedbackGL::syncActiveState(bool active, GLenum primitiveMode) const
+{
+    if (mIsActive != active)
+    {
+        mIsActive = active;
+        mIsPaused = false;
+
+        mStateManager-&gt;bindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedbackID);
+        if (mIsActive)
+        {
+            mFunctions-&gt;beginTransformFeedback(primitiveMode);
+        }
+        else
+        {
+            mFunctions-&gt;endTransformFeedback();
+        }
+    }
+}
+
+void TransformFeedbackGL::syncPausedState(bool paused) const
+{
+    if (mIsActive &amp;&amp; mIsPaused != paused)
+    {
+        mIsPaused = paused;
+
+        mStateManager-&gt;bindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedbackID);
+        if (mIsPaused)
+        {
+            mFunctions-&gt;pauseTransformFeedback();
+        }
+        else
+        {
+            mFunctions-&gt;resumeTransformFeedback();
+        }
+    }
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglTransformFeedbackGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TransformFeedbackGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TransformFeedbackGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/TransformFeedbackGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,10 +14,15 @@
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+class FunctionsGL;
+class StateManagerGL;
+
</ins><span class="cx"> class TransformFeedbackGL : public TransformFeedbackImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    TransformFeedbackGL();
</del><ins>+    TransformFeedbackGL(const FunctionsGL *functions,
+                        StateManagerGL *stateManager,
+                        size_t maxTransformFeedbackBufferBindings);
</ins><span class="cx">     ~TransformFeedbackGL() override;
</span><span class="cx"> 
</span><span class="cx">     void begin(GLenum primitiveMode) override;
</span><span class="lines">@@ -27,6 +32,22 @@
</span><span class="cx"> 
</span><span class="cx">     void bindGenericBuffer(const BindingPointer&lt;gl::Buffer&gt; &amp;binding) override;
</span><span class="cx">     void bindIndexedBuffer(size_t index, const OffsetBindingPointer&lt;gl::Buffer&gt; &amp;binding) override;
</span><ins>+
+    GLuint getTransformFeedbackID() const;
+
+    void syncActiveState(bool active, GLenum primitiveMode) const;
+    void syncPausedState(bool paused) const;
+
+  private:
+    const FunctionsGL *mFunctions;
+    StateManagerGL *mStateManager;
+
+    GLuint mTransformFeedbackID;
+
+    mutable bool mIsActive;
+    mutable bool mIsPaused;
+
+    std::vector&lt;OffsetBindingPointer&lt;gl::Buffer&gt;&gt; mCurrentIndexedBuffers;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglVertexArrayGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/VertexArrayGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/VertexArrayGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/VertexArrayGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,8 +8,10 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/VertexArrayGL.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/BitSetIterator.h&quot;
</ins><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="cx"> #include &quot;common/mathutil.h&quot;
</span><ins>+#include &quot;common/utilities.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Buffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/angletypes.h&quot;
</span><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><span class="lines">@@ -17,18 +19,27 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
</span><span class="cx"> 
</span><ins>+using namespace gl;
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+namespace
+{
+bool AttributeNeedsStreaming(const VertexAttribute &amp;attribute)
+{
+    return (attribute.enabled &amp;&amp; attribute.buffer.get() == nullptr);
+}
</ins><span class="cx"> 
</span><del>-VertexArrayGL::VertexArrayGL(const FunctionsGL *functions, StateManagerGL *stateManager)
-    : VertexArrayImpl(),
</del><ins>+}  // anonymous namespace
+
+VertexArrayGL::VertexArrayGL(const VertexArray::Data &amp;data,
+                             const FunctionsGL *functions,
+                             StateManagerGL *stateManager)
+    : VertexArrayImpl(data),
</ins><span class="cx">       mFunctions(functions),
</span><span class="cx">       mStateManager(stateManager),
</span><span class="cx">       mVertexArrayID(0),
</span><del>-      mElementArrayBuffer(),
-      mAttributes(),
-      mAppliedElementArrayBuffer(0),
-      mAppliedAttributes(),
</del><ins>+      mAppliedElementArrayBuffer(),
</ins><span class="cx">       mStreamingElementArrayBufferSize(0),
</span><span class="cx">       mStreamingElementArrayBuffer(0),
</span><span class="cx">       mStreamingArrayBufferSize(0),
</span><span class="lines">@@ -39,88 +50,72 @@
</span><span class="cx">     mFunctions-&gt;genVertexArrays(1, &amp;mVertexArrayID);
</span><span class="cx"> 
</span><span class="cx">     // Set the cached vertex attribute array size
</span><del>-    GLint maxVertexAttribs;
</del><ins>+    GLint maxVertexAttribs = 0;
</ins><span class="cx">     mFunctions-&gt;getIntegerv(GL_MAX_VERTEX_ATTRIBS, &amp;maxVertexAttribs);
</span><del>-    mAttributes.resize(maxVertexAttribs);
</del><span class="cx">     mAppliedAttributes.resize(maxVertexAttribs);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> VertexArrayGL::~VertexArrayGL()
</span><span class="cx"> {
</span><del>-    if (mVertexArrayID != 0)
-    {
-        mFunctions-&gt;deleteVertexArrays(1, &amp;mVertexArrayID);
-        mVertexArrayID = 0;
-    }
</del><ins>+    mStateManager-&gt;deleteVertexArray(mVertexArrayID);
+    mVertexArrayID = 0;
</ins><span class="cx"> 
</span><del>-    if (mStreamingElementArrayBuffer != 0)
-    {
-        mFunctions-&gt;deleteBuffers(1, &amp;mStreamingElementArrayBuffer);
-        mStreamingElementArrayBufferSize = 0;
-        mStreamingElementArrayBuffer = 0;
-    }
</del><ins>+    mStateManager-&gt;deleteBuffer(mStreamingElementArrayBuffer);
+    mStreamingElementArrayBufferSize = 0;
+    mStreamingElementArrayBuffer = 0;
</ins><span class="cx"> 
</span><del>-    if (mStreamingArrayBuffer != 0)
-    {
-        mFunctions-&gt;deleteBuffers(1, &amp;mStreamingArrayBuffer);
-        mStreamingArrayBufferSize = 0;
-        mStreamingArrayBuffer = 0;
-    }
</del><ins>+    mStateManager-&gt;deleteBuffer(mStreamingArrayBuffer);
+    mStreamingArrayBufferSize = 0;
+    mStreamingArrayBuffer = 0;
</ins><span class="cx"> 
</span><del>-    mElementArrayBuffer.set(nullptr);
-    for (size_t idx = 0; idx &lt; mAttributes.size(); idx++)
-    {
-        mAttributes[idx].buffer.set(NULL);
-    }
-
</del><ins>+    mAppliedElementArrayBuffer.set(nullptr);
</ins><span class="cx">     for (size_t idx = 0; idx &lt; mAppliedAttributes.size(); idx++)
</span><span class="cx">     {
</span><del>-        mAppliedAttributes[idx].buffer.set(NULL);
</del><ins>+        mAppliedAttributes[idx].buffer.set(nullptr);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void VertexArrayGL::setElementArrayBuffer(const gl::Buffer *buffer)
</del><ins>+gl::Error VertexArrayGL::syncDrawArraysState(const gl::AttributesMask &amp;activeAttributesMask,
+                                             GLint first,
+                                             GLsizei count,
+                                             GLsizei instanceCount) const
</ins><span class="cx"> {
</span><del>-    mElementArrayBuffer.set(buffer);
</del><ins>+    return syncDrawState(activeAttributesMask, first, count, GL_NONE, nullptr, instanceCount, false,
+                         nullptr);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void VertexArrayGL::setAttribute(size_t idx, const gl::VertexAttribute &amp;attr)
</del><ins>+gl::Error VertexArrayGL::syncDrawElementsState(const gl::AttributesMask &amp;activeAttributesMask,
+                                               GLsizei count,
+                                               GLenum type,
+                                               const GLvoid *indices,
+                                               GLsizei instanceCount,
+                                               bool primitiveRestartEnabled,
+                                               const GLvoid **outIndices) const
</ins><span class="cx"> {
</span><del>-    mAttributes[idx] = attr;
</del><ins>+    return syncDrawState(activeAttributesMask, 0, count, type, indices, instanceCount,
+                         primitiveRestartEnabled, outIndices);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void VertexArrayGL::setAttributeDivisor(size_t idx, GLuint divisor)
</del><ins>+gl::Error VertexArrayGL::syncDrawState(const gl::AttributesMask &amp;activeAttributesMask,
+                                       GLint first,
+                                       GLsizei count,
+                                       GLenum type,
+                                       const GLvoid *indices,
+                                       GLsizei instanceCount,
+                                       bool primitiveRestartEnabled,
+                                       const GLvoid **outIndices) const
</ins><span class="cx"> {
</span><del>-    mAttributes[idx].divisor = divisor;
-}
</del><ins>+    mStateManager-&gt;bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID());
</ins><span class="cx"> 
</span><del>-void VertexArrayGL::enableAttribute(size_t idx, bool enabledState)
-{
-    mAttributes[idx].enabled = enabledState;
-}
-
-gl::Error VertexArrayGL::syncDrawArraysState(GLint first, GLsizei count) const
-{
-    return syncDrawState(first, count, GL_NONE, nullptr, nullptr);
-}
-
-gl::Error VertexArrayGL::syncDrawElementsState(GLsizei count, GLenum type, const GLvoid *indices, const GLvoid **outIndices) const
-{
-    return syncDrawState(0, count, type, indices, outIndices);
-}
-
-gl::Error VertexArrayGL::syncDrawState(GLint first, GLsizei count, GLenum type, const GLvoid *indices, const GLvoid **outIndices) const
-{
-    mStateManager-&gt;bindVertexArray(mVertexArrayID);
-
</del><span class="cx">     // Check if any attributes need to be streamed, determines if the index range needs to be computed
</span><del>-    bool attributesNeedStreaming = doAttributesNeedStreaming();
</del><ins>+    bool attributesNeedStreaming = mAttributesNeedStreaming.any();
</ins><span class="cx"> 
</span><span class="cx">     // Determine if an index buffer needs to be streamed and the range of vertices that need to be copied
</span><del>-    RangeUI indexRange(0, 0);
</del><ins>+    IndexRange indexRange;
</ins><span class="cx">     if (type != GL_NONE)
</span><span class="cx">     {
</span><del>-        gl::Error error = syncIndexData(count, type, indices, attributesNeedStreaming, &amp;indexRange, outIndices);
</del><ins>+        Error error = syncIndexData(count, type, indices, primitiveRestartEnabled,
+                                    attributesNeedStreaming, &amp;indexRange, outIndices);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="lines">@@ -128,157 +123,54 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        // Not an indexed call, set the range to [first, first + count)
</del><ins>+        // Not an indexed call, set the range to [first, first + count - 1]
</ins><span class="cx">         indexRange.start = first;
</span><del>-        indexRange.end = first + count;
</del><ins>+        indexRange.end = first + count - 1;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Sync the vertex attribute state and track what data needs to be streamed
-    size_t streamingDataSize = 0;
-    size_t maxAttributeDataSize = 0;
-    gl::Error error = syncAttributeState(attributesNeedStreaming, indexRange, &amp;streamingDataSize, &amp;maxAttributeDataSize);
-    if (error.isError())
</del><ins>+    if (attributesNeedStreaming)
</ins><span class="cx">     {
</span><del>-        return error;
-    }
-
-    if (streamingDataSize &gt; 0)
-    {
-        ASSERT(attributesNeedStreaming);
-
-        gl::Error error = streamAttributes(streamingDataSize, maxAttributeDataSize, indexRange);
</del><ins>+        Error error = streamAttributes(activeAttributesMask, instanceCount, indexRange);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             return error;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool VertexArrayGL::doAttributesNeedStreaming() const
</del><ins>+Error VertexArrayGL::syncIndexData(GLsizei count,
+                                   GLenum type,
+                                   const GLvoid *indices,
+                                   bool primitiveRestartEnabled,
+                                   bool attributesNeedStreaming,
+                                   IndexRange *outIndexRange,
+                                   const GLvoid **outIndices) const
</ins><span class="cx"> {
</span><del>-    // TODO: if GLES, nothing needs to be streamed
-    for (size_t idx = 0; idx &lt; mAttributes.size(); idx++)
-    {
-        if (mAttributes[idx].enabled &amp;&amp; mAttributes[idx].buffer.get() == nullptr)
-        {
-            return true;
-        }
-    }
</del><ins>+    ASSERT(outIndices);
</ins><span class="cx"> 
</span><del>-    return false;
-}
</del><ins>+    gl::Buffer *elementArrayBuffer = mData.getElementArrayBuffer().get();
</ins><span class="cx"> 
</span><del>-gl::Error VertexArrayGL::syncAttributeState(bool attributesNeedStreaming, const RangeUI &amp;indexRange,
-                                            size_t *outStreamingDataSize, size_t *outMaxAttributeDataSize) const
-{
-    *outStreamingDataSize = 0;
-    *outMaxAttributeDataSize = 0;
-
-    for (size_t idx = 0; idx &lt; mAttributes.size(); idx++)
-    {
-        // Always sync the enabled and divisor state, they are required for both streaming and buffered
-        // attributes
-        if (mAppliedAttributes[idx].enabled != mAttributes[idx].enabled)
-        {
-            if (mAttributes[idx].enabled)
-            {
-                mFunctions-&gt;enableVertexAttribArray(idx);
-            }
-            else
-            {
-                mFunctions-&gt;disableVertexAttribArray(idx);
-            }
-            mAppliedAttributes[idx].enabled = mAttributes[idx].enabled;
-        }
-        if (mAppliedAttributes[idx].divisor != mAttributes[idx].divisor)
-        {
-            mFunctions-&gt;vertexAttribDivisor(idx, mAttributes[idx].divisor);
-            mAppliedAttributes[idx].divisor = mAttributes[idx].divisor;
-        }
-
-        if (mAttributes[idx].enabled &amp;&amp; mAttributes[idx].buffer.get() == nullptr)
-        {
-            ASSERT(attributesNeedStreaming);
-
-            const size_t streamedVertexCount = indexRange.end - indexRange.start + 1;
-
-            // If streaming is going to be required, compute the size of the required buffer
-            // and how much slack space at the beginning of the buffer will be required by determining
-            // the attribute with the largest data size.
-            size_t typeSize = ComputeVertexAttributeTypeSize(mAttributes[idx]);
-            *outStreamingDataSize += typeSize * streamedVertexCount;
-            *outMaxAttributeDataSize = std::max(*outMaxAttributeDataSize, typeSize);
-        }
-        else
-        {
-            // Sync the attribute with no translation
-            if (mAppliedAttributes[idx] != mAttributes[idx])
-            {
-                const gl::Buffer *arrayBuffer = mAttributes[idx].buffer.get();
-                const BufferGL *arrayBufferGL = GetImplAs&lt;BufferGL&gt;(arrayBuffer);
-                mStateManager-&gt;bindBuffer(GL_ARRAY_BUFFER, arrayBufferGL-&gt;getBufferID());
-
-                if (mAttributes[idx].pureInteger)
-                {
-                    mFunctions-&gt;vertexAttribIPointer(idx, mAttributes[idx].size, mAttributes[idx].type,
-                                                     mAttributes[idx].stride, mAttributes[idx].pointer);
-                }
-                else
-                {
-                    mFunctions-&gt;vertexAttribPointer(idx, mAttributes[idx].size, mAttributes[idx].type,
-                                                    mAttributes[idx].normalized, mAttributes[idx].stride,
-                                                    mAttributes[idx].pointer);
-                }
-
-                mAppliedAttributes[idx] = mAttributes[idx];
-            }
-        }
-    }
-
-    return gl::Error(GL_NO_ERROR);
-}
-
-gl::Error VertexArrayGL::syncIndexData(GLsizei count, GLenum type, const GLvoid *indices, bool attributesNeedStreaming,
-                                       RangeUI *outIndexRange, const GLvoid **outIndices) const
-{
-    ASSERT(outIndices);
-
</del><span class="cx">     // Need to check the range of indices if attributes need to be streamed
</span><del>-    if (mElementArrayBuffer.get() != nullptr)
</del><ins>+    if (elementArrayBuffer != nullptr)
</ins><span class="cx">     {
</span><del>-        const BufferGL *bufferGL = GetImplAs&lt;BufferGL&gt;(mElementArrayBuffer.get());
-        GLuint elementArrayBufferID = bufferGL-&gt;getBufferID();
-        if (elementArrayBufferID != mAppliedElementArrayBuffer)
</del><ins>+        if (elementArrayBuffer != mAppliedElementArrayBuffer.get())
</ins><span class="cx">         {
</span><del>-            mStateManager-&gt;bindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementArrayBufferID);
-            mAppliedElementArrayBuffer = elementArrayBufferID;
</del><ins>+            const BufferGL *bufferGL = GetImplAs&lt;BufferGL&gt;(elementArrayBuffer);
+            mStateManager-&gt;bindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferGL-&gt;getBufferID());
+            mAppliedElementArrayBuffer.set(elementArrayBuffer);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Only compute the index range if the attributes also need to be streamed
</span><span class="cx">         if (attributesNeedStreaming)
</span><span class="cx">         {
</span><span class="cx">             ptrdiff_t elementArrayBufferOffset = reinterpret_cast&lt;ptrdiff_t&gt;(indices);
</span><del>-
-            // Find the index range in the buffer
-            const IndexRangeCache *rangeCache = mElementArrayBuffer.get()-&gt;getIndexRangeCache();
-
-            if (!rangeCache-&gt;findRange(type, static_cast&lt;unsigned int&gt;(elementArrayBufferOffset), count, outIndexRange))
</del><ins>+            Error error = mData.getElementArrayBuffer()-&gt;getIndexRange(
+                type, elementArrayBufferOffset, count, primitiveRestartEnabled, outIndexRange);
+            if (error.isError())
</ins><span class="cx">             {
</span><del>-                // Need to compute the index range.
-                mStateManager-&gt;bindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementArrayBufferID);
-                uint8_t *elementArrayBufferPointer = reinterpret_cast&lt;uint8_t*&gt;(mFunctions-&gt;mapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_READ_ONLY));
-
-                *outIndexRange = IndexRangeCache::ComputeRange(type, elementArrayBufferPointer + elementArrayBufferOffset, count);
-
-                // TODO: Store the range cache at the impl level since the gl::Buffer object is supposed to remain constant
-                const_cast&lt;IndexRangeCache*&gt;(rangeCache)-&gt;addRange(type, static_cast&lt;unsigned int&gt;(elementArrayBufferOffset), count, *outIndexRange);
-
-                if (!mFunctions-&gt;unmapBuffer(GL_ELEMENT_ARRAY_BUFFER))
-                {
-                    return gl::Error(GL_OUT_OF_MEMORY);
-                }
</del><ins>+                return error;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -293,7 +185,7 @@
</span><span class="cx">         // Only compute the index range if the attributes also need to be streamed
</span><span class="cx">         if (attributesNeedStreaming)
</span><span class="cx">         {
</span><del>-            *outIndexRange = IndexRangeCache::ComputeRange(type, indices, count);
</del><ins>+            *outIndexRange = ComputeIndexRange(type, indices, count, primitiveRestartEnabled);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Allocate the streaming element array buffer
</span><span class="lines">@@ -304,10 +196,10 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         mStateManager-&gt;bindBuffer(GL_ELEMENT_ARRAY_BUFFER, mStreamingElementArrayBuffer);
</span><del>-        mAppliedElementArrayBuffer = mStreamingElementArrayBuffer;
</del><ins>+        mAppliedElementArrayBuffer.set(nullptr);
</ins><span class="cx"> 
</span><span class="cx">         // Make sure the element array buffer is large enough
</span><del>-        const gl::Type &amp;indexTypeInfo = gl::GetTypeInfo(type);
</del><ins>+        const Type &amp;indexTypeInfo          = GetTypeInfo(type);
</ins><span class="cx">         size_t requiredStreamingBufferSize = indexTypeInfo.bytes * count;
</span><span class="cx">         if (requiredStreamingBufferSize &gt; mStreamingElementArrayBufferSize)
</span><span class="cx">         {
</span><span class="lines">@@ -325,11 +217,52 @@
</span><span class="cx">         *outIndices = nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-gl::Error VertexArrayGL::streamAttributes(size_t streamingDataSize, size_t maxAttributeDataSize, const RangeUI &amp;indexRange) const
</del><ins>+void VertexArrayGL::computeStreamingAttributeSizes(const gl::AttributesMask &amp;activeAttributesMask,
+                                                   GLsizei instanceCount,
+                                                   const gl::IndexRange &amp;indexRange,
+                                                   size_t *outStreamingDataSize,
+                                                   size_t *outMaxAttributeDataSize) const
</ins><span class="cx"> {
</span><ins>+    *outStreamingDataSize    = 0;
+    *outMaxAttributeDataSize = 0;
+
+    ASSERT(mAttributesNeedStreaming.any());
+
+    const auto &amp;attribs = mData.getVertexAttributes();
+    for (auto idx : angle::IterateBitSet(mAttributesNeedStreaming &amp; activeAttributesMask))
+    {
+        const auto &amp;attrib = attribs[idx];
+        ASSERT(AttributeNeedsStreaming(attrib));
+
+        // If streaming is going to be required, compute the size of the required buffer
+        // and how much slack space at the beginning of the buffer will be required by determining
+        // the attribute with the largest data size.
+        size_t typeSize = ComputeVertexAttributeTypeSize(attrib);
+        *outStreamingDataSize += typeSize * ComputeVertexAttributeElementCount(
+                                                attrib, indexRange.vertexCount(), instanceCount);
+        *outMaxAttributeDataSize = std::max(*outMaxAttributeDataSize, typeSize);
+    }
+}
+
+gl::Error VertexArrayGL::streamAttributes(const gl::AttributesMask &amp;activeAttributesMask,
+                                          GLsizei instanceCount,
+                                          const gl::IndexRange &amp;indexRange) const
+{
+    // Sync the vertex attribute state and track what data needs to be streamed
+    size_t streamingDataSize    = 0;
+    size_t maxAttributeDataSize = 0;
+
+    computeStreamingAttributeSizes(activeAttributesMask, instanceCount, indexRange,
+                                   &amp;streamingDataSize, &amp;maxAttributeDataSize);
+
+    if (streamingDataSize == 0)
+    {
+        return gl::Error(GL_NO_ERROR);
+    }
+
</ins><span class="cx">     if (mStreamingArrayBuffer == 0)
</span><span class="cx">     {
</span><span class="cx">         mFunctions-&gt;genBuffers(1, &amp;mStreamingArrayBuffer);
</span><span class="lines">@@ -358,50 +291,65 @@
</span><span class="cx">         uint8_t *bufferPointer = reinterpret_cast&lt;uint8_t*&gt;(mFunctions-&gt;mapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY));
</span><span class="cx">         size_t curBufferOffset = bufferEmptySpace;
</span><span class="cx"> 
</span><del>-        const size_t streamedVertexCount = indexRange.end - indexRange.start + 1;
-
-        for (size_t idx = 0; idx &lt; mAttributes.size(); idx++)
</del><ins>+        const auto &amp;attribs = mData.getVertexAttributes();
+        for (auto idx : angle::IterateBitSet(mAttributesNeedStreaming &amp; activeAttributesMask))
</ins><span class="cx">         {
</span><del>-            if (mAttributes[idx].enabled &amp;&amp; mAttributes[idx].buffer.get() == nullptr)
-            {
-                const size_t sourceStride = ComputeVertexAttributeStride(mAttributes[idx]);
-                const size_t destStride = ComputeVertexAttributeTypeSize(mAttributes[idx]);
</del><ins>+            const auto &amp;attrib = attribs[idx];
+            ASSERT(AttributeNeedsStreaming(attrib));
</ins><span class="cx"> 
</span><del>-                const uint8_t *inputPointer = reinterpret_cast&lt;const uint8_t*&gt;(mAttributes[idx].pointer);
</del><ins>+            const size_t streamedVertexCount =
+                ComputeVertexAttributeElementCount(attrib, indexRange.vertexCount(), instanceCount);
</ins><span class="cx"> 
</span><del>-                // Pack the data when copying it, user could have supplied a very large stride that would
-                // cause the buffer to be much larger than needed.
-                if (destStride == sourceStride)
</del><ins>+            const size_t sourceStride = ComputeVertexAttributeStride(attrib);
+            const size_t destStride   = ComputeVertexAttributeTypeSize(attrib);
+
+            const uint8_t *inputPointer = reinterpret_cast&lt;const uint8_t *&gt;(attrib.pointer);
+
+            // Pack the data when copying it, user could have supplied a very large stride that
+            // would cause the buffer to be much larger than needed.
+            if (destStride == sourceStride)
+            {
+                // Can copy in one go, the data is packed
+                memcpy(bufferPointer + curBufferOffset,
+                       inputPointer + (sourceStride * indexRange.start),
+                       destStride * streamedVertexCount);
+            }
+            else
+            {
+                // Copy each vertex individually
+                for (size_t vertexIdx = 0; vertexIdx &lt; streamedVertexCount; vertexIdx++)
</ins><span class="cx">                 {
</span><del>-                    // Can copy in one go, the data is packed
-                    memcpy(bufferPointer + curBufferOffset,
-                           inputPointer + (sourceStride * indexRange.start),
-                           destStride * streamedVertexCount);
</del><ins>+                    uint8_t *out = bufferPointer + curBufferOffset + (destStride * vertexIdx);
+                    const uint8_t *in =
+                        inputPointer + sourceStride * (vertexIdx + indexRange.start);
+                    memcpy(out, in, destStride);
</ins><span class="cx">                 }
</span><del>-                else
-                {
-                    // Copy each vertex individually
-                    for (size_t vertexIdx = indexRange.start; vertexIdx &lt;= indexRange.end; vertexIdx++)
-                    {
-                        memcpy(bufferPointer + curBufferOffset + (destStride * vertexIdx),
-                               inputPointer + (sourceStride * vertexIdx),
-                               destStride);
-                    }
-                }
</del><ins>+            }
</ins><span class="cx"> 
</span><del>-                // Compute where the 0-index vertex would be.
-                const size_t vertexStartOffset = curBufferOffset - (indexRange.start * destStride);
</del><ins>+            // Compute where the 0-index vertex would be.
+            const size_t vertexStartOffset = curBufferOffset - (indexRange.start * destStride);
</ins><span class="cx"> 
</span><del>-                mFunctions-&gt;vertexAttribPointer(idx, mAttributes[idx].size, mAttributes[idx].type,
-                                                mAttributes[idx].normalized, destStride,
-                                                reinterpret_cast&lt;const GLvoid*&gt;(vertexStartOffset));
</del><ins>+            if (attrib.pureInteger)
+            {
+                ASSERT(!attrib.normalized);
+                mFunctions-&gt;vertexAttribIPointer(
+                    static_cast&lt;GLuint&gt;(idx), attrib.size, attrib.type,
+                    static_cast&lt;GLsizei&gt;(destStride),
+                    reinterpret_cast&lt;const GLvoid *&gt;(vertexStartOffset));
+            }
+            else
+            {
+                mFunctions-&gt;vertexAttribPointer(
+                    static_cast&lt;GLuint&gt;(idx), attrib.size, attrib.type, attrib.normalized,
+                    static_cast&lt;GLsizei&gt;(destStride),
+                    reinterpret_cast&lt;const GLvoid *&gt;(vertexStartOffset));
+            }
</ins><span class="cx"> 
</span><del>-                curBufferOffset += destStride * streamedVertexCount;
</del><ins>+            curBufferOffset += destStride * streamedVertexCount;
</ins><span class="cx"> 
</span><del>-                // Mark the applied attribute as dirty by setting an invalid size so that if it doesn't
-                // need to be streamed later, there is no chance that the caching will skip it.
-                mAppliedAttributes[idx].size = static_cast&lt;GLuint&gt;(-1);
-            }
</del><ins>+            // Mark the applied attribute as dirty by setting an invalid size so that if it doesn't
+            // need to be streamed later, there is no chance that the caching will skip it.
+            mAppliedAttributes[idx].size = static_cast&lt;GLuint&gt;(-1);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         unmapResult = mFunctions-&gt;unmapBuffer(GL_ARRAY_BUFFER);
</span><span class="lines">@@ -409,10 +357,10 @@
</span><span class="cx"> 
</span><span class="cx">     if (unmapResult != GL_TRUE)
</span><span class="cx">     {
</span><del>-        return gl::Error(GL_OUT_OF_MEMORY, &quot;Failed to unmap the client data streaming buffer.&quot;);
</del><ins>+        return Error(GL_OUT_OF_MEMORY, &quot;Failed to unmap the client data streaming buffer.&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return gl::Error(GL_NO_ERROR);
</del><ins>+    return Error(GL_NO_ERROR);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GLuint VertexArrayGL::getVertexArrayID() const
</span><span class="lines">@@ -420,4 +368,130 @@
</span><span class="cx">     return mVertexArrayID;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLuint VertexArrayGL::getAppliedElementArrayBufferID() const
+{
+    if (mAppliedElementArrayBuffer.get() == nullptr)
+    {
+        return mStreamingElementArrayBuffer;
+    }
+
+    return GetImplAs&lt;BufferGL&gt;(mAppliedElementArrayBuffer.get())-&gt;getBufferID();
</ins><span class="cx"> }
</span><ins>+
+void VertexArrayGL::updateNeedsStreaming(size_t attribIndex)
+{
+    const VertexAttribute &amp;attrib = mData.getVertexAttribute(attribIndex);
+    mAttributesNeedStreaming.set(attribIndex, AttributeNeedsStreaming(attrib));
+}
+
+void VertexArrayGL::updateAttribEnabled(size_t attribIndex)
+{
+    const VertexAttribute &amp;attrib = mData.getVertexAttribute(attribIndex);
+    if (mAppliedAttributes[attribIndex].enabled == attrib.enabled)
+    {
+        return;
+    }
+
+    updateNeedsStreaming(attribIndex);
+
+    mStateManager-&gt;bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID());
+    if (attrib.enabled)
+    {
+        mFunctions-&gt;enableVertexAttribArray(static_cast&lt;GLuint&gt;(attribIndex));
+    }
+    else
+    {
+        mFunctions-&gt;disableVertexAttribArray(static_cast&lt;GLuint&gt;(attribIndex));
+    }
+    mAppliedAttributes[attribIndex].enabled = attrib.enabled;
+}
+
+void VertexArrayGL::updateAttribPointer(size_t attribIndex)
+{
+    const VertexAttribute &amp;attrib = mData.getVertexAttribute(attribIndex);
+    if (mAppliedAttributes[attribIndex] == attrib)
+    {
+        return;
+    }
+
+    updateNeedsStreaming(attribIndex);
+
+    // If we need to stream, defer the attribPointer to the draw call.
+    if (mAttributesNeedStreaming[attribIndex])
+    {
+        return;
+    }
+
+    mStateManager-&gt;bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID());
+    const Buffer *arrayBuffer = attrib.buffer.get();
+    if (arrayBuffer != nullptr)
+    {
+        const BufferGL *arrayBufferGL = GetImplAs&lt;BufferGL&gt;(arrayBuffer);
+        mStateManager-&gt;bindBuffer(GL_ARRAY_BUFFER, arrayBufferGL-&gt;getBufferID());
+    }
+    else
+    {
+        mStateManager-&gt;bindBuffer(GL_ARRAY_BUFFER, 0);
+    }
+    mAppliedAttributes[attribIndex].buffer = attrib.buffer;
+
+    if (attrib.pureInteger)
+    {
+        mFunctions-&gt;vertexAttribIPointer(static_cast&lt;GLuint&gt;(attribIndex), attrib.size, attrib.type,
+                                         attrib.stride, attrib.pointer);
+    }
+    else
+    {
+        mFunctions-&gt;vertexAttribPointer(static_cast&lt;GLuint&gt;(attribIndex), attrib.size, attrib.type,
+                                        attrib.normalized, attrib.stride, attrib.pointer);
+    }
+    mAppliedAttributes[attribIndex].size        = attrib.size;
+    mAppliedAttributes[attribIndex].type        = attrib.type;
+    mAppliedAttributes[attribIndex].normalized  = attrib.normalized;
+    mAppliedAttributes[attribIndex].pureInteger = attrib.pureInteger;
+    mAppliedAttributes[attribIndex].stride      = attrib.stride;
+    mAppliedAttributes[attribIndex].pointer     = attrib.pointer;
+}
+
+void VertexArrayGL::syncState(const VertexArray::DirtyBits &amp;dirtyBits)
+{
+    for (unsigned long dirtyBit : angle::IterateBitSet(dirtyBits))
+    {
+        if (dirtyBit == VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER)
+        {
+            // TODO(jmadill): Element array buffer bindings
+        }
+        else if (dirtyBit &gt;= VertexArray::DIRTY_BIT_ATTRIB_0_ENABLED &amp;&amp;
+                 dirtyBit &lt; VertexArray::DIRTY_BIT_ATTRIB_MAX_ENABLED)
+        {
+            size_t attribIndex =
+                static_cast&lt;size_t&gt;(dirtyBit) - VertexArray::DIRTY_BIT_ATTRIB_0_ENABLED;
+            updateAttribEnabled(attribIndex);
+        }
+        else if (dirtyBit &gt;= VertexArray::DIRTY_BIT_ATTRIB_0_POINTER &amp;&amp;
+                 dirtyBit &lt; VertexArray::DIRTY_BIT_ATTRIB_MAX_POINTER)
+        {
+            size_t attribIndex =
+                static_cast&lt;size_t&gt;(dirtyBit) - VertexArray::DIRTY_BIT_ATTRIB_0_POINTER;
+            updateAttribPointer(attribIndex);
+        }
+        else if (dirtyBit &gt;= VertexArray::DIRTY_BIT_ATTRIB_0_DIVISOR &amp;&amp;
+                 dirtyBit &lt; VertexArray::DIRTY_BIT_ATTRIB_MAX_DIVISOR)
+        {
+            size_t attribIndex =
+                static_cast&lt;size_t&gt;(dirtyBit) - VertexArray::DIRTY_BIT_ATTRIB_0_DIVISOR;
+            const VertexAttribute &amp;attrib = mData.getVertexAttribute(attribIndex);
+
+            if (mAppliedAttributes[attribIndex].divisor != attrib.divisor)
+            {
+                mStateManager-&gt;bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID());
+                mFunctions-&gt;vertexAttribDivisor(static_cast&lt;GLuint&gt;(attribIndex), attrib.divisor);
+                mAppliedAttributes[attribIndex].divisor = attrib.divisor;
+            }
+        }
+        else
+            UNREACHABLE();
+    }
+}
+
+}  // rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglVertexArrayGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/VertexArrayGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/VertexArrayGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/VertexArrayGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -20,46 +20,68 @@
</span><span class="cx"> class VertexArrayGL : public VertexArrayImpl
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    VertexArrayGL(const FunctionsGL *functions, StateManagerGL *stateManager);
</del><ins>+    VertexArrayGL(const gl::VertexArray::Data &amp;data, const FunctionsGL *functions, StateManagerGL *stateManager);
</ins><span class="cx">     ~VertexArrayGL() override;
</span><span class="cx"> 
</span><del>-    void setElementArrayBuffer(const gl::Buffer *buffer) override;
-    void setAttribute(size_t idx, const gl::VertexAttribute &amp;attr) override;
-    void setAttributeDivisor(size_t idx, GLuint divisor) override;
-    void enableAttribute(size_t idx, bool enabledState) override;
</del><ins>+    gl::Error syncDrawArraysState(const gl::AttributesMask &amp;activeAttributesMask,
+                                  GLint first,
+                                  GLsizei count,
+                                  GLsizei instanceCount) const;
+    gl::Error syncDrawElementsState(const gl::AttributesMask &amp;activeAttributesMask,
+                                    GLsizei count,
+                                    GLenum type,
+                                    const GLvoid *indices,
+                                    GLsizei instanceCount,
+                                    bool primitiveRestartEnabled,
+                                    const GLvoid **outIndices) const;
</ins><span class="cx"> 
</span><del>-    gl::Error syncDrawArraysState(GLint first, GLsizei count) const;
-    gl::Error syncDrawElementsState(GLsizei count, GLenum type, const GLvoid *indices, const GLvoid **outIndices) const;
-
</del><span class="cx">     GLuint getVertexArrayID() const;
</span><ins>+    GLuint getAppliedElementArrayBufferID() const;
</ins><span class="cx"> 
</span><ins>+    void syncState(const gl::VertexArray::DirtyBits &amp;dirtyBits) override;
+
</ins><span class="cx">   private:
</span><del>-    gl::Error syncDrawState(GLint first, GLsizei count, GLenum type, const GLvoid *indices, const GLvoid **outIndices) const;
</del><ins>+    gl::Error syncDrawState(const gl::AttributesMask &amp;activeAttributesMask,
+                            GLint first,
+                            GLsizei count,
+                            GLenum type,
+                            const GLvoid *indices,
+                            GLsizei instanceCount,
+                            bool primitiveRestartEnabled,
+                            const GLvoid **outIndices) const;
</ins><span class="cx"> 
</span><del>-    // Check if any vertex attributes need to be streamed
-    bool doAttributesNeedStreaming() const;
</del><ins>+    // Apply index data, only sets outIndexRange if attributesNeedStreaming is true
+    gl::Error syncIndexData(GLsizei count,
+                            GLenum type,
+                            const GLvoid *indices,
+                            bool primitiveRestartEnabled,
+                            bool attributesNeedStreaming,
+                            gl::IndexRange *outIndexRange,
+                            const GLvoid **outIndices) const;
</ins><span class="cx"> 
</span><del>-    // Apply attribute state, returns the amount of space needed to stream all attributes that need streaming
</del><ins>+    // Returns the amount of space needed to stream all attributes that need streaming
</ins><span class="cx">     // and the data size of the largest attribute
</span><del>-    gl::Error syncAttributeState(bool attributesNeedStreaming, const RangeUI &amp;indexRange, size_t *outStreamingDataSize,
-                                 size_t *outMaxAttributeDataSize) const;
</del><ins>+    void computeStreamingAttributeSizes(const gl::AttributesMask &amp;activeAttributesMask,
+                                        GLsizei instanceCount,
+                                        const gl::IndexRange &amp;indexRange,
+                                        size_t *outStreamingDataSize,
+                                        size_t *outMaxAttributeDataSize) const;
</ins><span class="cx"> 
</span><del>-    // Apply index data, only sets outIndexRange if attributesNeedStreaming is true
-    gl::Error syncIndexData(GLsizei count, GLenum type, const GLvoid *indices, bool attributesNeedStreaming,
-                            RangeUI *outIndexRange, const GLvoid **outIndices) const;
-
</del><span class="cx">     // Stream attributes that have client data
</span><del>-    gl::Error streamAttributes(size_t streamingDataSize, size_t maxAttributeDataSize, const RangeUI &amp;indexRange) const;
</del><ins>+    gl::Error streamAttributes(const gl::AttributesMask &amp;activeAttributesMask,
+                               GLsizei instanceCount,
+                               const gl::IndexRange &amp;indexRange) const;
</ins><span class="cx"> 
</span><ins>+    void updateNeedsStreaming(size_t attribIndex);
+    void updateAttribEnabled(size_t attribIndex);
+    void updateAttribPointer(size_t attribIndex);
+
</ins><span class="cx">     const FunctionsGL *mFunctions;
</span><span class="cx">     StateManagerGL *mStateManager;
</span><span class="cx"> 
</span><span class="cx">     GLuint mVertexArrayID;
</span><span class="cx"> 
</span><del>-    BindingPointer&lt;const gl::Buffer&gt; mElementArrayBuffer;
-    std::vector&lt;gl::VertexAttribute&gt; mAttributes;
-
-    mutable GLuint mAppliedElementArrayBuffer;
</del><ins>+    mutable BindingPointer&lt;gl::Buffer&gt; mAppliedElementArrayBuffer;
</ins><span class="cx">     mutable std::vector&lt;gl::VertexAttribute&gt; mAppliedAttributes;
</span><span class="cx"> 
</span><span class="cx">     mutable size_t mStreamingElementArrayBufferSize;
</span><span class="lines">@@ -67,6 +89,8 @@
</span><span class="cx"> 
</span><span class="cx">     mutable size_t mStreamingArrayBufferSize;
</span><span class="cx">     mutable GLuint mStreamingArrayBuffer;
</span><ins>+
+    gl::AttributesMask mAttributesNeedStreaming;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglWorkaroundsGLh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/WorkaroundsGL.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/WorkaroundsGL.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/WorkaroundsGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,69 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// WorkaroundsGL.h: Workarounds for GL driver bugs and other issues.
+
+#ifndef LIBANGLE_RENDERER_GL_WORKAROUNDSGL_H_
+#define LIBANGLE_RENDERER_GL_WORKAROUNDSGL_H_
+
+namespace rx
+{
+
+struct WorkaroundsGL
+{
+    WorkaroundsGL()
+        : avoid1BitAlphaTextureFormats(false),
+          rgba4IsNotSupportedForColorRendering(false),
+          doesSRGBClearsOnLinearFramebufferAttachments(false),
+          doWhileGLSLCausesGPUHang(false),
+          finishDoesNotCauseQueriesToBeAvailable(false),
+          alwaysCallUseProgramAfterLink(false)
+    {
+    }
+
+    // When writing a float to a normalized integer framebuffer, desktop OpenGL is allowed to write
+    // one of the two closest normalized integer representations (although round to nearest is
+    // preferred) (see section 2.3.5.2 of the GL 4.5 core specification). OpenGL ES requires that
+    // round-to-nearest is used (see &quot;Conversion from Floating-Point to Framebuffer Fixed-Point&quot; in
+    // section 2.1.2 of the OpenGL ES 2.0.25 spec).  This issue only shows up on Intel and AMD
+    // drivers on framebuffer formats that have 1-bit alpha, work around this by using higher
+    // precision formats instead.
+    bool avoid1BitAlphaTextureFormats;
+
+    // On some older Intel drivers, GL_RGBA4 is not color renderable, glCheckFramebufferStatus
+    // returns GL_FRAMEBUFFER_UNSUPPORTED. Work around this by using a known color-renderable
+    // format.
+    bool rgba4IsNotSupportedForColorRendering;
+
+    // When clearing a framebuffer on Intel or AMD drivers, when GL_FRAMEBUFFER_SRGB is enabled, the
+    // driver clears to the linearized clear color despite the framebuffer not supporting SRGB
+    // blending.  It only seems to do this when the framebuffer has only linear attachments, mixed
+    // attachments appear to get the correct clear color.
+    bool doesSRGBClearsOnLinearFramebufferAttachments;
+
+    // On Mac some GLSL constructs involving do-while loops cause GPU hangs, such as the following:
+    //  int i = 1;
+    //  do {
+    //      i --;
+    //      continue;
+    //  } while (i &gt; 0)
+    // Work around this by rewriting the do-while to use another GLSL construct (block + while)
+    bool doWhileGLSLCausesGPUHang;
+
+    // Calling glFinish doesn't cause all queries to report that the result is available on some
+    // (NVIDIA) drivers.  It was found that enabling GL_DEBUG_OUTPUT_SYNCHRONOUS before the finish
+    // causes it to fully finish.
+    bool finishDoesNotCauseQueriesToBeAvailable;
+
+    // Always call useProgram after a successful link to avoid a driver bug.
+    // This workaround is meant to reproduce the use_current_program_after_successful_link
+    // workaround in Chromium (http://crbug.com/110263). It has been shown that this workaround is
+    // not necessary for MacOSX 10.9 and higher (http://crrev.com/39eb535b).
+    bool alwaysCallUseProgramAfterLink;
+};
+}
+
+#endif  // LIBANGLE_RENDERER_GL_WORKAROUNDSGL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglcglDisplayCGLh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/DisplayCGL.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/DisplayCGL.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/DisplayCGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,73 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// DisplayCGL.h: CGL implementation of egl::Display
+
+#ifndef LIBANGLE_RENDERER_GL_CGL_DISPLAYCGL_H_
+#define LIBANGLE_RENDERER_GL_CGL_DISPLAYCGL_H_
+
+#include &quot;libANGLE/renderer/gl/DisplayGL.h&quot;
+
+struct _CGLContextObject;
+typedef _CGLContextObject *CGLContextObj;
+
+namespace rx
+{
+
+class DisplayCGL : public DisplayGL
+{
+  public:
+    DisplayCGL();
+    ~DisplayCGL() override;
+
+    egl::Error initialize(egl::Display *display) override;
+    void terminate() override;
+
+    SurfaceImpl *createWindowSurface(const egl::Config *configuration,
+                                     EGLNativeWindowType window,
+                                     const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
+                                      const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
+                                               EGLClientBuffer shareHandle,
+                                               const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
+                                     NativePixmapType nativePixmap,
+                                     const egl::AttributeMap &amp;attribs) override;
+
+    egl::ConfigSet generateConfigs() const override;
+
+    bool isDeviceLost() const override;
+    bool testDeviceLost() override;
+    egl::Error restoreLostDevice() override;
+
+    bool isValidNativeWindow(EGLNativeWindowType window) const override;
+
+    egl::Error getDevice(DeviceImpl **device) override;
+
+    std::string getVendorString() const override;
+
+    egl::Error waitClient() const override;
+    egl::Error waitNative(EGLint engine,
+                          egl::Surface *drawSurface,
+                          egl::Surface *readSurface) const override;
+
+    egl::Error getDriverVersion(std::string *version) const override;
+
+  private:
+    const FunctionsGL *getFunctionsGL() const override;
+
+    void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
+    void generateCaps(egl::Caps *outCaps) const override;
+
+    egl::Display *mEGLDisplay;
+    FunctionsGL *mFunctions;
+    CGLContextObj mContext;
+};
+
+}
+
+#endif // LIBANGLE_RENDERER_GL_CGL_DISPLAYCGL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglcglDisplayCGLmm"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,278 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// DisplayCGL.mm: CGL implementation of egl::Display
+
+#include &quot;libANGLE/renderer/gl/cgl/DisplayCGL.h&quot;
+
+#import &lt;Cocoa/Cocoa.h&gt;
+#include &lt;dlfcn.h&gt;
+#include &lt;EGL/eglext.h&gt;
+
+#include &quot;common/debug.h&quot;
+#include &quot;libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h&quot;
+#include &quot;libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h&quot;
+
+namespace
+{
+
+const char *kDefaultOpenGLDylibName =
+    &quot;/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib&quot;;
+const char *kFallbackOpenGLDylibName = &quot;GL&quot;;
+
+}
+
+namespace rx
+{
+
+class FunctionsGLCGL : public FunctionsGL
+{
+  public:
+    FunctionsGLCGL(void *dylibHandle) : mDylibHandle(dylibHandle) {}
+
+    ~FunctionsGLCGL() override { dlclose(mDylibHandle); }
+
+  private:
+    void *loadProcAddress(const std::string &amp;function) override
+    {
+        return dlsym(mDylibHandle, function.c_str());
+    }
+
+    void *mDylibHandle;
+};
+
+DisplayCGL::DisplayCGL() : DisplayGL(), mEGLDisplay(nullptr), mFunctions(nullptr), mContext(nullptr)
+{
+}
+
+DisplayCGL::~DisplayCGL()
+{
+}
+
+egl::Error DisplayCGL::initialize(egl::Display *display)
+{
+    mEGLDisplay = display;
+
+    CGLPixelFormatObj pixelFormat;
+    {
+        // TODO(cwallez) investigate which pixel format we want
+        CGLPixelFormatAttribute attribs[] = {
+            kCGLPFAOpenGLProfile, static_cast&lt;CGLPixelFormatAttribute&gt;(kCGLOGLPVersion_3_2_Core),
+            static_cast&lt;CGLPixelFormatAttribute&gt;(0)};
+        GLint nVirtualScreens = 0;
+        CGLChoosePixelFormat(attribs, &amp;pixelFormat, &amp;nVirtualScreens);
+
+        if (pixelFormat == nullptr)
+        {
+            return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not create the context's pixel format.&quot;);
+        }
+    }
+
+    CGLCreateContext(pixelFormat, nullptr, &amp;mContext);
+    if (mContext == nullptr)
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not create the CGL context.&quot;);
+    }
+    CGLSetCurrentContext(mContext);
+
+    // There is no equivalent getProcAddress in CGL so we open the dylib directly
+    void *handle = dlopen(kDefaultOpenGLDylibName, RTLD_NOW);
+    if (!handle)
+    {
+        handle = dlopen(kFallbackOpenGLDylibName, RTLD_NOW);
+    }
+    if (!handle)
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not open the OpenGL Framework.&quot;);
+    }
+
+    mFunctions = new FunctionsGLCGL(handle);
+    mFunctions-&gt;initialize();
+
+    return DisplayGL::initialize(display);
+}
+
+void DisplayCGL::terminate()
+{
+    DisplayGL::terminate();
+
+    if (mContext != nullptr)
+    {
+        CGLSetCurrentContext(nullptr);
+        CGLReleaseContext(mContext);
+        mContext = nullptr;
+    }
+
+    SafeDelete(mFunctions);
+}
+
+SurfaceImpl *DisplayCGL::createWindowSurface(const egl::Config *configuration,
+                                             EGLNativeWindowType window,
+                                             const egl::AttributeMap &amp;attribs)
+{
+    return new WindowSurfaceCGL(this-&gt;getRenderer(), window, mFunctions, mContext);
+}
+
+SurfaceImpl *DisplayCGL::createPbufferSurface(const egl::Config *configuration,
+                                              const egl::AttributeMap &amp;attribs)
+{
+    EGLint width  = static_cast&lt;EGLint&gt;(attribs.get(EGL_WIDTH, 0));
+    EGLint height = static_cast&lt;EGLint&gt;(attribs.get(EGL_HEIGHT, 0));
+    return new PbufferSurfaceCGL(this-&gt;getRenderer(), width, height, mFunctions);
+}
+
+SurfaceImpl* DisplayCGL::createPbufferFromClientBuffer(const egl::Config *configuration,
+                                                       EGLClientBuffer shareHandle,
+                                                       const egl::AttributeMap &amp;attribs)
+{
+    UNIMPLEMENTED();
+    return nullptr;
+}
+
+SurfaceImpl *DisplayCGL::createPixmapSurface(const egl::Config *configuration,
+                                             NativePixmapType nativePixmap,
+                                             const egl::AttributeMap &amp;attribs)
+{
+    UNIMPLEMENTED();
+    return nullptr;
+}
+
+egl::Error DisplayCGL::getDevice(DeviceImpl **device)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_BAD_DISPLAY);
+}
+
+egl::ConfigSet DisplayCGL::generateConfigs() const
+{
+    // TODO(cwallez): generate more config permutations
+    egl::ConfigSet configs;
+
+    const gl::Version &amp;maxVersion = getMaxSupportedESVersion();
+    ASSERT(maxVersion &gt;= gl::Version(2, 0));
+    bool supportsES3 = maxVersion &gt;= gl::Version(3, 0);
+
+    egl::Config config;
+
+    // Native stuff
+    config.nativeVisualID   = 0;
+    config.nativeVisualType = 0;
+    config.nativeRenderable = EGL_TRUE;
+
+    // Buffer sizes
+    config.redSize     = 8;
+    config.greenSize   = 8;
+    config.blueSize    = 8;
+    config.alphaSize   = 8;
+    config.depthSize   = 24;
+    config.stencilSize = 8;
+
+    config.colorBufferType = EGL_RGB_BUFFER;
+    config.luminanceSize   = 0;
+    config.alphaMaskSize   = 0;
+
+    config.bufferSize = config.redSize + config.greenSize + config.blueSize + config.alphaSize;
+
+    config.transparentType = EGL_NONE;
+
+    // Pbuffer
+    config.maxPBufferWidth  = 4096;
+    config.maxPBufferHeight = 4096;
+    config.maxPBufferPixels = 4096 * 4096;
+
+    // Caveat
+    config.configCaveat = EGL_NONE;
+
+    // Misc
+    config.sampleBuffers     = 0;
+    config.samples           = 0;
+    config.level             = 0;
+    config.bindToTextureRGB  = EGL_FALSE;
+    config.bindToTextureRGBA = EGL_FALSE;
+
+    config.surfaceType = EGL_WINDOW_BIT | EGL_PBUFFER_BIT;
+
+    config.minSwapInterval = 1;
+    config.maxSwapInterval = 1;
+
+    config.renderTargetFormat = GL_RGBA8;
+    config.depthStencilFormat = GL_DEPTH24_STENCIL8;
+
+    config.conformant     = EGL_OPENGL_ES2_BIT | (supportsES3 ? EGL_OPENGL_ES3_BIT_KHR : 0);
+    config.renderableType = config.conformant;
+
+    config.matchNativePixmap = EGL_NONE;
+
+    configs.add(config);
+    return configs;
+}
+
+bool DisplayCGL::isDeviceLost() const
+{
+    // TODO(cwallez) investigate implementing this
+    return false;
+}
+
+bool DisplayCGL::testDeviceLost()
+{
+    // TODO(cwallez) investigate implementing this
+    return false;
+}
+
+egl::Error DisplayCGL::restoreLostDevice()
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_BAD_DISPLAY);
+}
+
+bool DisplayCGL::isValidNativeWindow(EGLNativeWindowType window) const
+{
+    // TODO(cwallez) investigate implementing this
+    return true;
+}
+
+std::string DisplayCGL::getVendorString() const
+{
+    // TODO(cwallez) find a useful vendor string
+    return &quot;&quot;;
+}
+
+const FunctionsGL *DisplayCGL::getFunctionsGL() const
+{
+    return mFunctions;
+}
+
+void DisplayCGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
+{
+    outExtensions-&gt;createContext = true;
+    outExtensions-&gt;createContextNoError = true;
+}
+
+void DisplayCGL::generateCaps(egl::Caps *outCaps) const
+{
+    outCaps-&gt;textureNPOT = true;
+}
+
+egl::Error DisplayCGL::waitClient() const
+{
+    // TODO(cwallez) UNIMPLEMENTED()
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error DisplayCGL::waitNative(EGLint engine,
+                                  egl::Surface *drawSurface,
+                                  egl::Surface *readSurface) const
+{
+    // TODO(cwallez) UNIMPLEMENTED()
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error DisplayCGL::getDriverVersion(std::string *version) const
+{
+    *version = &quot;&quot;;
+    return egl::Error(EGL_SUCCESS);
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglcglPbufferSurfaceCGLh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,64 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// PBufferSurfaceCGL.h: an implementation of egl::Surface for PBuffers for the CLG backend,
+//                      currently implemented using renderbuffers
+
+#ifndef LIBANGLE_RENDERER_GL_CGL_PBUFFERSURFACECGL_H_
+#define LIBANGLE_RENDERER_GL_CGL_PBUFFERSURFACECGL_H_
+
+#include &quot;libANGLE/renderer/gl/SurfaceGL.h&quot;
+
+namespace rx
+{
+
+class FunctionsGL;
+class StateManagerGL;
+struct WorkaroundsGL;
+
+class PbufferSurfaceCGL : public SurfaceGL
+{
+  public:
+    PbufferSurfaceCGL(RendererGL *renderer,
+                      EGLint width,
+                      EGLint height,
+                      const FunctionsGL *functions);
+    ~PbufferSurfaceCGL() override;
+
+    egl::Error initialize() override;
+    egl::Error makeCurrent() override;
+
+    egl::Error swap() override;
+    egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
+    egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
+    egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
+    egl::Error releaseTexImage(EGLint buffer) override;
+    void setSwapInterval(EGLint interval) override;
+
+    EGLint getWidth() const override;
+    EGLint getHeight() const override;
+
+    EGLint isPostSubBufferSupported() const override;
+    EGLint getSwapBehavior() const override;
+
+    FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data) override;
+
+  private:
+    unsigned mWidth;
+    unsigned mHeight;
+
+    const FunctionsGL *mFunctions;
+    StateManagerGL *mStateManager;
+    const WorkaroundsGL &amp;mWorkarounds;
+
+    GLuint mFramebuffer;
+    GLuint mColorRenderbuffer;
+    GLuint mDSRenderbuffer;
+};
+
+}
+
+#endif // LIBANGLE_RENDERER_GL_CGL_PBUFFERSURFACECGL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglcglPbufferSurfaceCGLmm"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,141 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// PBufferSurfaceCGL.cpp: an implementation of egl::Surface for PBuffers for the CLG backend,
+//                      currently implemented using renderbuffers
+
+#include &quot;libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h&quot;
+
+#include &quot;common/debug.h&quot;
+#include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
+#include &quot;libANGLE/renderer/gl/FramebufferGL.h&quot;
+#include &quot;libANGLE/renderer/gl/RendererGL.h&quot;
+#include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
+
+namespace rx
+{
+
+PbufferSurfaceCGL::PbufferSurfaceCGL(RendererGL *renderer,
+                                     EGLint width,
+                                     EGLint height,
+                                     const FunctionsGL *functions)
+    : SurfaceGL(renderer),
+      mWidth(width),
+      mHeight(height),
+      mFunctions(functions),
+      mStateManager(renderer-&gt;getStateManager()),
+      mWorkarounds(renderer-&gt;getWorkarounds()),
+      mFramebuffer(0),
+      mColorRenderbuffer(0),
+      mDSRenderbuffer(0)
+{
+}
+
+PbufferSurfaceCGL::~PbufferSurfaceCGL()
+{
+    if (mFramebuffer != 0)
+    {
+        mFunctions-&gt;deleteFramebuffers(1, &amp;mFramebuffer);
+        mFramebuffer = 0;
+    }
+
+    if (mColorRenderbuffer != 0)
+    {
+        mFunctions-&gt;deleteRenderbuffers(1, &amp;mColorRenderbuffer);
+        mColorRenderbuffer = 0;
+    }
+    if (mDSRenderbuffer != 0)
+    {
+        mFunctions-&gt;deleteRenderbuffers(1, &amp;mDSRenderbuffer);
+        mDSRenderbuffer = 0;
+    }
+}
+
+egl::Error PbufferSurfaceCGL::initialize()
+{
+    mFunctions-&gt;genRenderbuffers(1, &amp;mColorRenderbuffer);
+    mStateManager-&gt;bindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
+    mFunctions-&gt;renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, mWidth, mHeight);
+
+    mFunctions-&gt;genRenderbuffers(1, &amp;mDSRenderbuffer);
+    mStateManager-&gt;bindRenderbuffer(GL_RENDERBUFFER, mDSRenderbuffer);
+    mFunctions-&gt;renderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mWidth, mHeight);
+
+    mFunctions-&gt;genFramebuffers(1, &amp;mFramebuffer);
+    mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
+    mFunctions-&gt;framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+                                        mColorRenderbuffer);
+    mFunctions-&gt;framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
+                                        GL_RENDERBUFFER, mDSRenderbuffer);
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceCGL::makeCurrent()
+{
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceCGL::swap()
+{
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceCGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+{
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceCGL::querySurfacePointerANGLE(EGLint attribute, void **value)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceCGL::bindTexImage(gl::Texture *texture, EGLint buffer)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceCGL::releaseTexImage(EGLint buffer)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+void PbufferSurfaceCGL::setSwapInterval(EGLint interval)
+{
+}
+
+EGLint PbufferSurfaceCGL::getWidth() const
+{
+    return mWidth;
+}
+
+EGLint PbufferSurfaceCGL::getHeight() const
+{
+    return mHeight;
+}
+
+EGLint PbufferSurfaceCGL::isPostSubBufferSupported() const
+{
+    UNIMPLEMENTED();
+    return EGL_FALSE;
+}
+
+EGLint PbufferSurfaceCGL::getSwapBehavior() const
+{
+    return EGL_BUFFER_PRESERVED;
+}
+
+FramebufferImpl *PbufferSurfaceCGL::createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data)
+{
+    // TODO(cwallez) assert it happens only once?
+    return new FramebufferGL(mFramebuffer, data, mFunctions, mWorkarounds, mStateManager);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglcglWindowSurfaceCGLh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,98 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// WindowSurfaceCGL.h: CGL implementation of egl::Surface for windows
+
+#ifndef LIBANGLE_RENDERER_GL_CGL_WINDOWSURFACECGL_H_
+#define LIBANGLE_RENDERER_GL_CGL_WINDOWSURFACECGL_H_
+
+#include &quot;libANGLE/renderer/gl/SurfaceGL.h&quot;
+
+struct _CGLContextObject;
+typedef _CGLContextObject *CGLContextObj;
+@class CALayer;
+struct __IOSurface;
+typedef __IOSurface *IOSurfaceRef;
+
+@class SwapLayer;
+
+namespace rx
+{
+
+class DisplayCGL;
+class FramebufferGL;
+class FunctionsGL;
+class StateManagerGL;
+struct WorkaroundsGL;
+
+struct SharedSwapState
+{
+    struct SwapTexture
+    {
+        GLuint texture;
+        unsigned int width;
+        unsigned int height;
+        uint64_t swapId;
+    };
+
+    SwapTexture textures[3];
+
+    // This code path is not going to be used by Chrome so we take the liberty
+    // to use pthreads directly instead of using mutexes and condition variables
+    // via the Platform API.
+    pthread_mutex_t mutex;
+    // The following members should be accessed only when holding the mutex
+    // (or doing construction / destruction)
+    SwapTexture *beingRendered;
+    SwapTexture *lastRendered;
+    SwapTexture *beingPresented;
+};
+
+class WindowSurfaceCGL : public SurfaceGL
+{
+  public:
+    WindowSurfaceCGL(RendererGL *renderer,
+                     CALayer *layer,
+                     const FunctionsGL *functions,
+                     CGLContextObj context);
+    ~WindowSurfaceCGL() override;
+
+    egl::Error initialize() override;
+    egl::Error makeCurrent() override;
+
+    egl::Error swap() override;
+    egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
+    egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
+    egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
+    egl::Error releaseTexImage(EGLint buffer) override;
+    void setSwapInterval(EGLint interval) override;
+
+    EGLint getWidth() const override;
+    EGLint getHeight() const override;
+
+    EGLint isPostSubBufferSupported() const override;
+    EGLint getSwapBehavior() const override;
+
+    FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data) override;
+
+  private:
+    SwapLayer *mSwapLayer;
+    SharedSwapState mSwapState;
+    uint64_t mCurrentSwapId;
+
+    CALayer *mLayer;
+    CGLContextObj mContext;
+    const FunctionsGL *mFunctions;
+    StateManagerGL *mStateManager;
+    const WorkaroundsGL &amp;mWorkarounds;
+
+    GLuint mFramebuffer;
+    GLuint mDSRenderbuffer;
+};
+
+}
+
+#endif // LIBANGLE_RENDERER_GL_CGL_WINDOWSURFACECGL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglcglWindowSurfaceCGLmm"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,329 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// WindowSurfaceCGL.cpp: CGL implementation of egl::Surface for windows
+
+#include &quot;libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h&quot;
+
+#import &lt;Cocoa/Cocoa.h&gt;
+#include &lt;OpenGL/OpenGL.h&gt;
+#import &lt;QuartzCore/QuartzCore.h&gt;
+
+#include &quot;common/debug.h&quot;
+#include &quot;libANGLE/renderer/gl/cgl/DisplayCGL.h&quot;
+#include &quot;libANGLE/renderer/gl/FramebufferGL.h&quot;
+#include &quot;libANGLE/renderer/gl/RendererGL.h&quot;
+#include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
+
+@interface SwapLayer : CAOpenGLLayer
+{
+    CGLContextObj mDisplayContext;
+
+    bool initialized;
+    rx::SharedSwapState *mSwapState;
+    const rx::FunctionsGL *mFunctions;
+
+    GLuint mReadFramebuffer;
+}
+- (id)initWithSharedState:(rx::SharedSwapState *)swapState
+              withContext:(CGLContextObj)displayContext
+            withFunctions:(const rx::FunctionsGL *)functions;
+@end
+
+@implementation SwapLayer
+- (id)initWithSharedState:(rx::SharedSwapState *)swapState
+              withContext:(CGLContextObj)displayContext
+            withFunctions:(const rx::FunctionsGL *)functions
+    {
+        self = [super init];
+        if (self != nil)
+        {
+            self.asynchronous = YES;
+            mDisplayContext   = displayContext;
+
+            initialized = false;
+            mSwapState  = swapState;
+            mFunctions  = functions;
+
+            [self setFrame:CGRectMake(0, 0, mSwapState-&gt;textures[0].width,
+                                      mSwapState-&gt;textures[0].height)];
+        }
+        return self;
+    }
+
+    - (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask
+    {
+        CGLPixelFormatAttribute attribs[] = {
+            kCGLPFADisplayMask, static_cast&lt;CGLPixelFormatAttribute&gt;(mask), kCGLPFAOpenGLProfile,
+            static_cast&lt;CGLPixelFormatAttribute&gt;(kCGLOGLPVersion_3_2_Core),
+            static_cast&lt;CGLPixelFormatAttribute&gt;(0)};
+
+        CGLPixelFormatObj pixelFormat = nullptr;
+        GLint numFormats = 0;
+        CGLChoosePixelFormat(attribs, &amp;pixelFormat, &amp;numFormats);
+
+        return pixelFormat;
+    }
+
+    - (CGLContextObj)copyCGLContextForPixelFormat:(CGLPixelFormatObj)pixelFormat
+    {
+        CGLContextObj context = nullptr;
+        CGLCreateContext(pixelFormat, mDisplayContext, &amp;context);
+        return context;
+    }
+
+    - (BOOL)canDrawInCGLContext:(CGLContextObj)glContext
+                    pixelFormat:(CGLPixelFormatObj)pixelFormat
+                   forLayerTime:(CFTimeInterval)timeInterval
+                    displayTime:(const CVTimeStamp *)timeStamp
+    {
+        BOOL result = NO;
+
+        pthread_mutex_lock(&amp;mSwapState-&gt;mutex);
+        {
+            if (mSwapState-&gt;lastRendered-&gt;swapId &gt; mSwapState-&gt;beingPresented-&gt;swapId)
+            {
+                std::swap(mSwapState-&gt;lastRendered, mSwapState-&gt;beingPresented);
+                result = YES;
+            }
+        }
+        pthread_mutex_unlock(&amp;mSwapState-&gt;mutex);
+
+        return result;
+    }
+
+    - (void)drawInCGLContext:(CGLContextObj)glContext
+                 pixelFormat:(CGLPixelFormatObj)pixelFormat
+                forLayerTime:(CFTimeInterval)timeInterval
+                 displayTime:(const CVTimeStamp *)timeStamp
+    {
+        CGLSetCurrentContext(glContext);
+        if (!initialized)
+        {
+            initialized = true;
+
+            mFunctions-&gt;genFramebuffers(1, &amp;mReadFramebuffer);
+        }
+
+        const auto &amp;texture = *mSwapState-&gt;beingPresented;
+        if ([self frame].size.width != texture.width || [self frame].size.height != texture.height)
+        {
+            [self setFrame:CGRectMake(0, 0, texture.width, texture.height)];
+
+            // Without this, the OSX compositor / window system doesn't see the resize.
+            [self setNeedsDisplay];
+        }
+
+        // TODO(cwallez) support 2.1 contexts too that don't have blitFramebuffer nor the
+        // GL_DRAW_FRAMEBUFFER_BINDING query
+        GLint drawFBO;
+        mFunctions-&gt;getIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &amp;drawFBO);
+
+        mFunctions-&gt;bindFramebuffer(GL_FRAMEBUFFER, mReadFramebuffer);
+        mFunctions-&gt;framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                         texture.texture, 0);
+
+        mFunctions-&gt;bindFramebuffer(GL_READ_FRAMEBUFFER, mReadFramebuffer);
+        mFunctions-&gt;bindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFBO);
+        mFunctions-&gt;blitFramebuffer(0, 0, texture.width, texture.height, 0, 0, texture.width,
+                                    texture.height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
+
+        // Call the super method to flush the context
+        [super drawInCGLContext:glContext
+                    pixelFormat:pixelFormat
+                   forLayerTime:timeInterval
+                    displayTime:timeStamp];
+    }
+    @end
+
+    namespace rx
+    {
+
+    WindowSurfaceCGL::WindowSurfaceCGL(RendererGL *renderer,
+                                       CALayer *layer,
+                                       const FunctionsGL *functions,
+                                       CGLContextObj context)
+        : SurfaceGL(renderer),
+          mSwapLayer(nil),
+          mCurrentSwapId(0),
+          mLayer(layer),
+          mContext(context),
+          mFunctions(functions),
+          mStateManager(renderer-&gt;getStateManager()),
+          mWorkarounds(renderer-&gt;getWorkarounds()),
+          mFramebuffer(0),
+          mDSRenderbuffer(0)
+{
+    pthread_mutex_init(&amp;mSwapState.mutex, nullptr);
+}
+
+WindowSurfaceCGL::~WindowSurfaceCGL()
+{
+    pthread_mutex_destroy(&amp;mSwapState.mutex);
+    if (mFramebuffer != 0)
+    {
+        mFunctions-&gt;deleteFramebuffers(1, &amp;mFramebuffer);
+        mFramebuffer = 0;
+    }
+
+    if (mDSRenderbuffer != 0)
+    {
+        mFunctions-&gt;deleteRenderbuffers(1, &amp;mDSRenderbuffer);
+        mDSRenderbuffer = 0;
+    }
+
+    if (mSwapLayer != nil)
+    {
+        [mSwapLayer removeFromSuperlayer];
+        [mSwapLayer release];
+        mSwapLayer = nil;
+    }
+
+    for (size_t i = 0; i &lt; ArraySize(mSwapState.textures); ++i)
+    {
+        if (mSwapState.textures[i].texture != 0)
+        {
+            mFunctions-&gt;deleteTextures(1, &amp;mSwapState.textures[i].texture);
+            mSwapState.textures[i].texture = 0;
+        }
+    }
+}
+
+egl::Error WindowSurfaceCGL::initialize()
+{
+    unsigned width  = getWidth();
+    unsigned height = getHeight();
+
+    for (size_t i = 0; i &lt; ArraySize(mSwapState.textures); ++i)
+    {
+        mFunctions-&gt;genTextures(1, &amp;mSwapState.textures[i].texture);
+        mStateManager-&gt;bindTexture(GL_TEXTURE_2D, mSwapState.textures[i].texture);
+        mFunctions-&gt;texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
+                               GL_UNSIGNED_BYTE, nullptr);
+        mSwapState.textures[i].width  = width;
+        mSwapState.textures[i].height = height;
+        mSwapState.textures[i].swapId = 0;
+    }
+    mSwapState.beingRendered  = &amp;mSwapState.textures[0];
+    mSwapState.lastRendered   = &amp;mSwapState.textures[1];
+    mSwapState.beingPresented = &amp;mSwapState.textures[2];
+
+    mSwapLayer = [[SwapLayer alloc] initWithSharedState:&amp;mSwapState
+                                            withContext:mContext
+                                          withFunctions:mFunctions];
+    [mLayer addSublayer:mSwapLayer];
+
+    mFunctions-&gt;genRenderbuffers(1, &amp;mDSRenderbuffer);
+    mStateManager-&gt;bindRenderbuffer(GL_RENDERBUFFER, mDSRenderbuffer);
+    mFunctions-&gt;renderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
+
+    mFunctions-&gt;genFramebuffers(1, &amp;mFramebuffer);
+    mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
+    mFunctions-&gt;framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                     mSwapState.beingRendered-&gt;texture, 0);
+    mFunctions-&gt;framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
+                                        mDSRenderbuffer);
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceCGL::makeCurrent()
+{
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceCGL::swap()
+{
+    mFunctions-&gt;flush();
+    mSwapState.beingRendered-&gt;swapId = ++mCurrentSwapId;
+
+    pthread_mutex_lock(&amp;mSwapState.mutex);
+    {
+        std::swap(mSwapState.beingRendered, mSwapState.lastRendered);
+    }
+    pthread_mutex_unlock(&amp;mSwapState.mutex);
+
+    unsigned width  = getWidth();
+    unsigned height = getHeight();
+    auto &amp;texture   = *mSwapState.beingRendered;
+
+    if (texture.width != width || texture.height != height)
+    {
+        mStateManager-&gt;bindTexture(GL_TEXTURE_2D, texture.texture);
+        mFunctions-&gt;texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
+                               GL_UNSIGNED_BYTE, nullptr);
+
+        mStateManager-&gt;bindRenderbuffer(GL_RENDERBUFFER, mDSRenderbuffer);
+        mFunctions-&gt;renderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
+
+        texture.width  = width;
+        texture.height = height;
+    }
+
+    mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
+    mFunctions-&gt;framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+                                     mSwapState.beingRendered-&gt;texture, 0);
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceCGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceCGL::querySurfacePointerANGLE(EGLint attribute, void **value)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceCGL::bindTexImage(gl::Texture *texture, EGLint buffer)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceCGL::releaseTexImage(EGLint buffer)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+void WindowSurfaceCGL::setSwapInterval(EGLint interval)
+{
+    // TODO(cwallez) investigate implementing swap intervals other than 0
+}
+
+EGLint WindowSurfaceCGL::getWidth() const
+{
+    return CGRectGetWidth([mLayer frame]);
+}
+
+EGLint WindowSurfaceCGL::getHeight() const
+{
+    return CGRectGetHeight([mLayer frame]);
+}
+
+EGLint WindowSurfaceCGL::isPostSubBufferSupported() const
+{
+    UNIMPLEMENTED();
+    return EGL_FALSE;
+}
+
+EGLint WindowSurfaceCGL::getSwapBehavior() const
+{
+    return EGL_BUFFER_DESTROYED;
+}
+
+FramebufferImpl *WindowSurfaceCGL::createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data)
+{
+    // TODO(cwallez) assert it happens only once?
+    return new FramebufferGL(mFramebuffer, data, mFunctions, mWorkarounds, mStateManager);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglformatutilsglcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/formatutilsgl.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/formatutilsgl.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/formatutilsgl.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,57 +9,116 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/formatutilsgl.h&quot;
</span><span class="cx"> 
</span><del>-#include &lt;map&gt;
</del><ins>+#include &lt;limits&gt;
</ins><span class="cx"> 
</span><ins>+#include &quot;common/string_utils.h&quot;
+#include &quot;libANGLE/formatutils.h&quot;
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> namespace nativegl
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-// Information about internal formats
-static bool AlwaysSupported(GLuint, GLuint, const std::vector&lt;std::string&gt; &amp;)
</del><ins>+SupportRequirement::SupportRequirement()
+    : version(std::numeric_limits&lt;GLuint&gt;::max(), std::numeric_limits&lt;GLuint&gt;::max()),
+      versionExtensions(),
+      requiredExtensions()
</ins><span class="cx"> {
</span><del>-    return true;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool UnimplementedSupport(GLuint, GLuint, const std::vector&lt;std::string&gt; &amp;)
</del><ins>+InternalFormat::InternalFormat()
+    : texture(),
+      filter(),
+      renderbuffer(),
+      framebufferAttachment()
</ins><span class="cx"> {
</span><del>-    return false;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool NeverSupported(GLuint, GLuint, const std::vector&lt;std::string&gt; &amp;)
</del><ins>+// supported = version || vertexExt
+static inline SupportRequirement VersionOrExts(GLuint major, GLuint minor, const std::string &amp;versionExt)
</ins><span class="cx"> {
</span><del>-    return false;
</del><ins>+    SupportRequirement requirement;
+    requirement.version.major = major;
+    requirement.version.minor = minor;
+    angle::SplitStringAlongWhitespace(versionExt, &amp;requirement.versionExtensions);
+    return requirement;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;GLuint minMajorVersion, GLuint minMinorVersion&gt;
-static bool RequireGL(GLuint major, GLuint minor, const std::vector&lt;std::string&gt; &amp;)
</del><ins>+// supported = (version || vertexExt) &amp;&amp; requiredExt
+static inline SupportRequirement VersionOrExtsAndExts(GLuint major,
+                                                      GLuint minor,
+                                                      const std::string &amp;versionExt,
+                                                      const std::string &amp;requiredExt)
</ins><span class="cx"> {
</span><del>-    return major &gt; minMajorVersion || (major == minMajorVersion &amp;&amp; minor &gt;= minMinorVersion);
</del><ins>+    SupportRequirement requirement;
+    requirement.version.major = major;
+    requirement.version.minor = minor;
+    angle::SplitStringAlongWhitespace(versionExt, &amp;requirement.versionExtensions);
+    angle::SplitStringAlongWhitespace(requiredExt, &amp;requirement.requiredExtensions);
+    return requirement;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// supported = version
+static inline SupportRequirement VersionOnly(GLuint major, GLuint minor)
+{
+    SupportRequirement requirement;
+    requirement.version.major = major;
+    requirement.version.minor = minor;
+    return requirement;
+}
</ins><span class="cx"> 
</span><del>-InternalFormat::InternalFormat()
-    : textureSupport(NeverSupported),
-      renderSupport(NeverSupported),
-      filterSupport(NeverSupported)
</del><ins>+// supported = ext
+static inline SupportRequirement ExtsOnly(const std::string &amp;ext)
</ins><span class="cx"> {
</span><ins>+    SupportRequirement requirement;
+    requirement.version.major = 0;
+    requirement.version.minor = 0;
+    angle::SplitStringAlongWhitespace(ext, &amp;requirement.requiredExtensions);
+    return requirement;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-typedef std::pair&lt;GLenum, InternalFormat&gt; InternalFormatInfoPair;
-typedef std::map&lt;GLenum, InternalFormat&gt; InternalFormatInfoMap;
</del><ins>+// supported = true
+static inline SupportRequirement Always()
+{
+    SupportRequirement requirement;
+    requirement.version.major = 0;
+    requirement.version.minor = 0;
+    return requirement;
+}
</ins><span class="cx"> 
</span><ins>+// supported = false
+static inline SupportRequirement Never()
+{
+    SupportRequirement requirement;
+    requirement.version.major = std::numeric_limits&lt;GLuint&gt;::max();
+    requirement.version.minor = std::numeric_limits&lt;GLuint&gt;::max();
+    return requirement;
+}
+
+struct InternalFormatInfo
+{
+    InternalFormat glesInfo;
+    InternalFormat glInfo;
+};
+
+typedef std::pair&lt;GLenum, InternalFormatInfo&gt; InternalFormatInfoPair;
+typedef std::map&lt;GLenum, InternalFormatInfo&gt; InternalFormatInfoMap;
+
</ins><span class="cx"> // A helper function to insert data into the format map with fewer characters.
</span><span class="cx"> static inline void InsertFormatMapping(InternalFormatInfoMap *map, GLenum internalFormat,
</span><del>-                                       InternalFormat::SupportCheckFunction textureSupport,
-                                       InternalFormat::SupportCheckFunction renderSupport,
-                                       InternalFormat::SupportCheckFunction filterSupport)
</del><ins>+                                       const SupportRequirement &amp;desktopTexture, const SupportRequirement &amp;desktopFilter, const SupportRequirement &amp;desktopRender,
+                                       const SupportRequirement &amp;esTexture, const SupportRequirement &amp;esFilter, const SupportRequirement &amp;esRender)
</ins><span class="cx"> {
</span><del>-    InternalFormat formatInfo;
-    formatInfo.textureSupport = textureSupport;
-    formatInfo.renderSupport = renderSupport;
-    formatInfo.filterSupport = filterSupport;
</del><ins>+    InternalFormatInfo formatInfo;
+    formatInfo.glInfo.texture = desktopTexture;
+    formatInfo.glInfo.filter = desktopFilter;
+    formatInfo.glInfo.renderbuffer = desktopRender;
+    formatInfo.glInfo.framebufferAttachment = desktopRender;
+    formatInfo.glesInfo.texture = esTexture;
+    formatInfo.glesInfo.filter = esTexture;
+    formatInfo.glesInfo.renderbuffer = esFilter;
+    formatInfo.glesInfo.framebufferAttachment = esRender;
</ins><span class="cx">     map-&gt;insert(std::make_pair(internalFormat, formatInfo));
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -67,130 +126,132 @@
</span><span class="cx"> {
</span><span class="cx">     InternalFormatInfoMap map;
</span><span class="cx"> 
</span><del>-    // From ES 3.0.1 spec, table 3.12
-    InsertFormatMapping(&amp;map, GL_NONE,              NeverSupported,       NeverSupported,       NeverSupported);
</del><ins>+    // clang-format off
+    //                       | Format              | OpenGL texture support                          | Filter  | OpenGL render support                        | OpenGL ES texture support                 | Filter  | OpenGL ES render support                 |
+    InsertFormatMapping(&amp;map, GL_R8,                VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOrExts(3, 0, &quot;GL_EXT_texture_rg&quot;),   Always(), VersionOrExts(3, 0, &quot;GL_EXT_texture_rg&quot;)  );
+    InsertFormatMapping(&amp;map, GL_R8_SNORM,          VersionOnly(3, 1),                                Always(), Never(),                                       VersionOnly(3, 0),                          Always(), Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RG8,               VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOrExts(3, 0, &quot;GL_EXT_texture_rg&quot;),   Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;)  );
+    InsertFormatMapping(&amp;map, GL_RG8_SNORM,         VersionOnly(3, 1),                                Always(), Never(),                                       VersionOnly(3, 0),                          Always(), Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RGB8,              Always(),                                         Always(), Always(),                                      VersionOrExts(3, 0, &quot;GL_OES_rgb8_rgba8&quot;),   Always(), Always()                                  );
+    InsertFormatMapping(&amp;map, GL_RG8_SNORM,         VersionOnly(3, 1),                                Always(), Never(),                                       VersionOnly(3, 0),                          Always(), Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RGB565,            Always(),                                         Always(), Always(),                                      Always(),                                   Always(), Always()                                  );
+    InsertFormatMapping(&amp;map, GL_RGBA4,             Always(),                                         Always(), Always(),                                      Always(),                                   Always(), Always()                                  );
+    InsertFormatMapping(&amp;map, GL_RGB5_A1,           Always(),                                         Always(), Always(),                                      Always(),                                   Always(), Always()                                  );
+    InsertFormatMapping(&amp;map, GL_RGBA8,             Always(),                                         Always(), Always(),                                      VersionOrExts(3, 0, &quot;GL_OES_rgb8_rgba8&quot;),   Always(), VersionOrExts(3, 0, &quot;GL_OES_rgb8_rgba8&quot;)  );
+    InsertFormatMapping(&amp;map, GL_RGBA8_SNORM,       VersionOnly(3, 1),                                Always(), Never(),                                       VersionOnly(3, 0),                          Always(), Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RGB10_A2,          Always(),                                         Always(), Always(),                                      VersionOnly(3, 0),                          Always(), VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RGB10_A2UI,        VersionOrExts(3, 3, &quot;GL_ARB_texture_rgb10_a2ui&quot;), Never(),  Always(),                                      VersionOnly(3, 0),                          Never(),  Always()                                  );
+    InsertFormatMapping(&amp;map, GL_SRGB8,             VersionOrExts(2, 1, &quot;GL_EXT_texture_sRGB&quot;),       Always(), VersionOrExts(2, 1, &quot;GL_EXT_texture_sRGB&quot;),    VersionOnly(3, 0),                          Always(), Never()                                   );
+    InsertFormatMapping(&amp;map, GL_SRGB8_ALPHA8,      VersionOrExts(2, 1, &quot;GL_EXT_texture_sRGB&quot;),       Always(), VersionOrExts(2, 1, &quot;GL_EXT_texture_sRGB&quot;),    VersionOnly(3, 0),                          Always(), VersionOrExts(3, 0, &quot;GL_EXT_sRGB&quot;)        );
+    InsertFormatMapping(&amp;map, GL_R8I,               VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_R8UI,              VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_R16I,              VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_R16UI,             VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_R32I,              VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_R32UI,             VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RG8I,              VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RG8UI,             VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RG16I,             VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RG16UI,            VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RG32I,             VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RG32UI,            VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RGB8I,             VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  Never(),                                       VersionOnly(3, 0),                          Never(),  Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RGB8UI,            VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  Never(),                                       VersionOnly(3, 0),                          Never(),  Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RGB16I,            VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  Never(),                                       VersionOnly(3, 0),                          Never(),  Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RGB16UI,           VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  Never(),                                       VersionOnly(3, 0),                          Never(),  Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RGB32I,            VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  Never(),                                       VersionOnly(3, 0),                          Never(),  Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RGB32UI,           VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  Never(),                                       VersionOnly(3, 0),                          Never(),  Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RGBA8I,            VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;), VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RGBA8UI,           VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;), VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RGBA16I,           VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;), VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RGBA16UI,          VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;), VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RGBA32I,           VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;), VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RGBA32UI,          VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;), VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
</ins><span class="cx"> 
</span><del>-    //                       | Internal format     | Texture support     | Render support     | Filter support      |
-    InsertFormatMapping(&amp;map, GL_R8,                UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_R8_SNORM,          UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG8,               UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG8_SNORM,         UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB8,              AlwaysSupported,      AlwaysSupported,      AlwaysSupported     );
-    InsertFormatMapping(&amp;map, GL_RGB8_SNORM,        UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB565,            AlwaysSupported,      AlwaysSupported,      AlwaysSupported     );
-    InsertFormatMapping(&amp;map, GL_RGBA4,             AlwaysSupported,      AlwaysSupported,      AlwaysSupported     );
-    InsertFormatMapping(&amp;map, GL_RGB5_A1,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA8,             AlwaysSupported,      AlwaysSupported,      AlwaysSupported     );
-    InsertFormatMapping(&amp;map, GL_RGBA8_SNORM,       UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB10_A2,          UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB10_A2UI,        UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_SRGB8,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_SRGB8_ALPHA8,      UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_R11F_G11F_B10F,    UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB9_E5,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_R8I,               UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_R8UI,              UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_R16I,              UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_R16UI,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_R32I,              UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_R32UI,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG8I,              UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG8UI,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG16I,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG16UI,            UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG32I,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG32UI,            UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB8I,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB8UI,            UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB16I,            UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB16UI,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB32I,            UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB32UI,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA8I,            UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA8UI,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA16I,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA16UI,          UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA32I,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA32UI,          UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
</del><ins>+    // Unsized formats
+    InsertFormatMapping(&amp;map, GL_ALPHA,             Never(),                                          Never(),  Never(),                                       Never(),                                    Never(),  Never()                                   );
+    InsertFormatMapping(&amp;map, GL_LUMINANCE,         Never(),                                          Never(),  Never(),                                       Never(),                                    Never(),  Never()                                   );
+    InsertFormatMapping(&amp;map, GL_LUMINANCE_ALPHA,   Never(),                                          Never(),  Never(),                                       Never(),                                    Never(),  Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RED,               VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOrExts(3, 0, &quot;GL_EXT_texture_rg&quot;),   Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;)  );
+    InsertFormatMapping(&amp;map, GL_RG,                VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOrExts(3, 0, &quot;GL_EXT_texture_rg&quot;),   Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;)  );
+    InsertFormatMapping(&amp;map, GL_RGB,               Always(),                                         Always(), Always(),                                      Always(),                                   Always(), Always()                                  );
+    InsertFormatMapping(&amp;map, GL_RGBA,              Always(),                                         Always(), Always(),                                      Always(),                                   Always(), Always()                                  );
+    InsertFormatMapping(&amp;map, GL_RED_INTEGER,       VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RG_INTEGER,        VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),         Never(),  VersionOrExts(3, 0, &quot;GL_ARB_texture_rg&quot;),      VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_RGB_INTEGER,       VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  Never(),                                       VersionOnly(3, 0),                          Never(),  Never()                                   );
+    InsertFormatMapping(&amp;map, GL_RGBA_INTEGER,      VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;),    Never(),  VersionOrExts(3, 0, &quot;GL_EXT_texture_integer&quot;), VersionOnly(3, 0),                          Never(),  VersionOnly(3, 0)                         );
+    InsertFormatMapping(&amp;map, GL_SRGB,              VersionOrExts(2, 1, &quot;GL_EXT_texture_sRGB&quot;),       Always(), VersionOrExts(2, 1, &quot;GL_EXT_texture_sRGB&quot;),    ExtsOnly(&quot;GL_EXT_sRGB&quot;),                    Always(), Never()                                   );
+    InsertFormatMapping(&amp;map, GL_SRGB_ALPHA,        VersionOrExts(2, 1, &quot;GL_EXT_texture_sRGB&quot;),       Always(), VersionOrExts(2, 1, &quot;GL_EXT_texture_sRGB&quot;),    ExtsOnly(&quot;GL_EXT_sRGB&quot;),                    Always(), Never()                                   );
</ins><span class="cx"> 
</span><del>-    InsertFormatMapping(&amp;map, GL_BGRA8_EXT,         UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
</del><ins>+    // From GL_EXT_texture_format_BGRA8888
+    InsertFormatMapping(&amp;map, GL_BGRA8_EXT,         VersionOrExts(1, 2, &quot;GL_EXT_bgra&quot;),               Always(), VersionOrExts(1, 2, &quot;GL_EXT_bgra&quot;),            ExtsOnly(&quot;GL_EXT_texture_format_BGRA8888&quot;), Always(), Never()                                   );
+    InsertFormatMapping(&amp;map, GL_BGRA_EXT,          VersionOrExts(1, 2, &quot;GL_EXT_bgra&quot;),               Always(), VersionOrExts(1, 2, &quot;GL_EXT_bgra&quot;),            ExtsOnly(&quot;GL_EXT_texture_format_BGRA8888&quot;), Always(), Never()                                   );
</ins><span class="cx"> 
</span><span class="cx">     // Floating point formats
</span><del>-    //                       | Internal format     | Texture support     | Render support     | Filter support      |
-    InsertFormatMapping(&amp;map, GL_R16F,              UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG16F,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB16F,            UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA16F,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_R32F,              UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG32F,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB32F,            UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA32F,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
</del><ins>+    //                       | Format              | OpenGL texture support                                       | Filter  | OpenGL render support                                                                  | OpenGL ES texture support                                         | Filter                                                 | OpenGL ES render support                                                        |
+    InsertFormatMapping(&amp;map, GL_R11F_G11F_B10F,    VersionOrExts(3, 0, &quot;GL_EXT_packed_float&quot;),                    Always(), VersionOrExts(3, 0, &quot;GL_EXT_packed_float GL_ARB_color_buffer_float&quot;),                    VersionOnly(3, 0),                                                  Always(),                                                ExtsOnly(&quot;GL_EXT_color_buffer_float&quot;)                                            );
+    InsertFormatMapping(&amp;map, GL_RGB9_E5,           VersionOrExts(3, 0, &quot;GL_EXT_texture_shared_exponent&quot;),         Always(), VersionOrExts(3, 0, &quot;GL_EXT_texture_shared_exponent GL_ARB_color_buffer_float&quot;),         VersionOnly(3, 0),                                                  Always(),                                                Never()                                                                          );
+    InsertFormatMapping(&amp;map, GL_R16F,              VersionOrExts(3, 0, &quot;GL_ARB_texture_rg ARB_texture_float&quot;),    Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg GL_ARB_texture_float GL_ARB_color_buffer_float&quot;), VersionOrExts(3, 0, &quot;GL_OES_texture_half_float GL_EXT_texture_rg&quot;), VersionOrExts(3, 0, &quot;GL_OES_texture_half_float_linear&quot;), VersionOrExtsAndExts(3, 0, &quot;GL_EXT_texture_rg&quot;, &quot;GL_EXT_color_buffer_half_float&quot;));
+    InsertFormatMapping(&amp;map, GL_RG16F,             VersionOrExts(3, 0, &quot;GL_ARB_texture_rg ARB_texture_float&quot;),    Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg GL_ARB_texture_float GL_ARB_color_buffer_float&quot;), VersionOrExts(3, 0, &quot;GL_OES_texture_half_float GL_EXT_texture_rg&quot;), VersionOrExts(3, 0, &quot;GL_OES_texture_half_float_linear&quot;), VersionOrExtsAndExts(3, 0, &quot;GL_EXT_texture_rg&quot;, &quot;GL_EXT_color_buffer_half_float&quot;));
+    InsertFormatMapping(&amp;map, GL_RGB16F,            VersionOrExts(3, 0, &quot;GL_ARB_texture_float&quot;),                   Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_float GL_ARB_color_buffer_float&quot;),                   VersionOrExts(3, 0, &quot;GL_OES_texture_half_float&quot;),                   VersionOrExts(3, 0, &quot;GL_OES_texture_half_float_linear&quot;), ExtsOnly(&quot;GL_EXT_color_buffer_half_float&quot;)                                       );
+    InsertFormatMapping(&amp;map, GL_RGBA16F,           VersionOrExts(3, 0, &quot;GL_ARB_texture_float&quot;),                   Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_float GL_ARB_color_buffer_float&quot;),                   VersionOrExts(3, 0, &quot;GL_OES_texture_half_float&quot;),                   VersionOrExts(3, 0, &quot;GL_OES_texture_half_float_linear&quot;), ExtsOnly(&quot;GL_EXT_color_buffer_half_float&quot;)                                       );
+    InsertFormatMapping(&amp;map, GL_R32F,              VersionOrExts(3, 0, &quot;GL_ARB_texture_rg GL_ARB_texture_float&quot;), Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg GL_ARB_texture_float GL_ARB_color_buffer_float&quot;), VersionOrExts(3, 0, &quot;GL_OES_texture_float GL_EXT_texture_rg&quot;),      VersionOrExts(3, 0, &quot;GL_OES_texture_float_linear&quot;),      ExtsOnly(&quot;GL_EXT_color_buffer_float&quot;)                                            );
+    InsertFormatMapping(&amp;map, GL_RG32F,             VersionOrExts(3, 0, &quot;GL_ARB_texture_rg GL_ARB_texture_float&quot;), Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_rg GL_ARB_texture_float GL_ARB_color_buffer_float&quot;), VersionOrExts(3, 0, &quot;GL_OES_texture_float GL_EXT_texture_rg&quot;),      VersionOrExts(3, 0, &quot;GL_OES_texture_float_linear&quot;),      ExtsOnly(&quot;GL_EXT_color_buffer_float&quot;)                                            );
+    InsertFormatMapping(&amp;map, GL_RGB32F,            VersionOrExts(3, 0, &quot;GL_ARB_texture_float&quot;),                   Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_float GL_ARB_color_buffer_float&quot;),                   VersionOrExts(3, 0, &quot;GL_OES_texture_float&quot;),                        VersionOrExts(3, 0, &quot;GL_OES_texture_float_linear&quot;),      Never()                                                                          );
+    InsertFormatMapping(&amp;map, GL_RGBA32F,           VersionOrExts(3, 0, &quot;GL_ARB_texture_float&quot;),                   Always(), VersionOrExts(3, 0, &quot;GL_ARB_texture_float GL_ARB_color_buffer_float&quot;),                   VersionOrExts(3, 0, &quot;GL_OES_texture_float&quot;),                        VersionOrExts(3, 0, &quot;GL_OES_texture_float_linear&quot;),      ExtsOnly(&quot;GL_EXT_color_buffer_float&quot;)                                            );
</ins><span class="cx"> 
</span><span class="cx">     // Depth stencil formats
</span><del>-    //                       | Internal format         | Texture support     | Render support     | Filter support      |
-    InsertFormatMapping(&amp;map, GL_DEPTH_COMPONENT16,     AlwaysSupported,      AlwaysSupported,      NeverSupported      );
-    InsertFormatMapping(&amp;map, GL_DEPTH_COMPONENT24,     UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_DEPTH_COMPONENT32F,    UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_DEPTH_COMPONENT32_OES, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_DEPTH24_STENCIL8,      UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_DEPTH32F_STENCIL8,     UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_STENCIL_INDEX8,        AlwaysSupported,      AlwaysSupported,      NeverSupported      );
</del><ins>+    //                       | Format                  | OpenGL texture support                            | Filter                                     | OpenGL render support                             | OpenGL ES texture support                  | Filter                                     | OpenGL ES render support                                              |
+    InsertFormatMapping(&amp;map, GL_DEPTH_COMPONENT16,     VersionOnly(1, 5),                                  VersionOrExts(1, 5, &quot;GL_ARB_depth_texture&quot;), VersionOnly(1, 5),                                  VersionOnly(2, 0),                           VersionOrExts(3, 0, &quot;GL_OES_depth_texture&quot;), VersionOnly(2, 0)                                                      );
+    InsertFormatMapping(&amp;map, GL_DEPTH_COMPONENT24,     VersionOnly(1, 5),                                  VersionOrExts(1, 5, &quot;GL_ARB_depth_texture&quot;), VersionOnly(1, 5),                                  VersionOnly(2, 0),                           VersionOrExts(3, 0, &quot;GL_OES_depth_texture&quot;), VersionOnly(2, 0)                                                      );
+    InsertFormatMapping(&amp;map, GL_DEPTH_COMPONENT32_OES, VersionOnly(1, 5),                                  VersionOrExts(1, 5, &quot;GL_ARB_depth_texture&quot;), VersionOnly(1, 5),                                  ExtsOnly(&quot;GL_OES_depth_texture&quot;),            Always(),                                    ExtsOnly(&quot;GL_OES_depth32&quot;)                                             );
+    InsertFormatMapping(&amp;map, GL_DEPTH_COMPONENT32F,    VersionOrExts(3, 0, &quot;GL_ARB_depth_buffer_float&quot;),   Always(),                                    VersionOrExts(3, 0, &quot;GL_ARB_depth_buffer_float&quot;),   VersionOnly(3, 0),                           VersionOrExts(3, 0, &quot;GL_OES_depth_texture&quot;), VersionOnly(3, 0)                                                      );
+    InsertFormatMapping(&amp;map, GL_STENCIL_INDEX8,        VersionOrExts(3, 0, &quot;GL_EXT_packed_depth_stencil&quot;), Never(),                                     VersionOrExts(3, 0, &quot;GL_EXT_packed_depth_stencil&quot;), VersionOnly(2, 0),                           Never(),                                     VersionOnly(2, 0)                                                      );
+    InsertFormatMapping(&amp;map, GL_DEPTH24_STENCIL8,      VersionOrExts(3, 0, &quot;GL_ARB_framebuffer_object&quot;),   VersionOrExts(3, 0, &quot;GL_ARB_depth_texture&quot;), VersionOrExts(3, 0, &quot;GL_ARB_framebuffer_object&quot;),   VersionOrExts(3, 0, &quot;GL_OES_depth_texture&quot;), Always(),                                    VersionOrExts(3, 0, &quot;GL_OES_depth_texture GL_OES_packed_depth_stencil&quot;));
+    InsertFormatMapping(&amp;map, GL_DEPTH32F_STENCIL8,     VersionOrExts(3, 0, &quot;GL_ARB_depth_buffer_float&quot;),   Always(),                                    VersionOrExts(3, 0, &quot;GL_ARB_depth_buffer_float&quot;),   VersionOnly(3, 0),                           Always(),                                    VersionOnly(3, 0)                                                      );
+    InsertFormatMapping(&amp;map, GL_DEPTH_COMPONENT,       VersionOnly(1, 5),                                  VersionOrExts(1, 5, &quot;GL_ARB_depth_texture&quot;), VersionOnly(1, 5),                                  VersionOnly(2, 0),                           VersionOrExts(3, 0, &quot;GL_OES_depth_texture&quot;), VersionOnly(2, 0)                                                      );
+    InsertFormatMapping(&amp;map, GL_DEPTH_STENCIL,         VersionOnly(1, 5),                                  VersionOrExts(1, 5, &quot;GL_ARB_depth_texture&quot;), VersionOnly(1, 5),                                  VersionOnly(2, 0),                           VersionOrExts(3, 0, &quot;GL_OES_depth_texture&quot;), VersionOnly(2, 0)                                                      );
</ins><span class="cx"> 
</span><span class="cx">     // Luminance alpha formats
</span><del>-    //                       | Internal format          | Texture support     | Render support     | Filter support      |
-    InsertFormatMapping(&amp;map, GL_ALPHA8_EXT,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_LUMINANCE8_EXT,         UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_ALPHA32F_EXT,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_LUMINANCE32F_EXT,       UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_ALPHA16F_EXT,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_LUMINANCE16F_EXT,       UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_LUMINANCE8_ALPHA8_EXT,  UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_LUMINANCE_ALPHA32F_EXT, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_LUMINANCE_ALPHA16F_EXT, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
</del><ins>+    //                       | Format                  | OpenGL texture support                      | Filter  | Render | OpenGL ES texture support         | Filter  | Render |
+    InsertFormatMapping(&amp;map, GL_ALPHA8_EXT,             Always(),                                    Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_storage&quot;), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_LUMINANCE8_EXT,         Always(),                                    Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_storage&quot;), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_ALPHA32F_EXT,           VersionOrExts(3, 0, &quot;GL_ARB_texture_float&quot;), Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_storage&quot;), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_LUMINANCE32F_EXT,       VersionOrExts(3, 0, &quot;GL_ARB_texture_float&quot;), Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_storage&quot;), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_ALPHA16F_EXT,           VersionOrExts(3, 0, &quot;GL_ARB_texture_float&quot;), Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_storage&quot;), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_LUMINANCE16F_EXT,       VersionOrExts(3, 0, &quot;GL_ARB_texture_float&quot;), Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_storage&quot;), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_LUMINANCE8_ALPHA8_EXT,  Always(),                                    Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_storage&quot;), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_LUMINANCE_ALPHA32F_EXT, VersionOrExts(3, 0, &quot;GL_ARB_texture_float&quot;), Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_storage&quot;), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_LUMINANCE_ALPHA16F_EXT, VersionOrExts(3, 0, &quot;GL_ARB_texture_float&quot;), Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_storage&quot;), Always(), Never());
</ins><span class="cx"> 
</span><del>-    // Unsized formats
-    //                       | Internal format   | Texture support     | Render support     | Filter support      |
-    InsertFormatMapping(&amp;map, GL_ALPHA,           UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_LUMINANCE,       UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_LUMINANCE_ALPHA, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RED,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG,              UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB,             UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA,            UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RED_INTEGER,     UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RG_INTEGER,      UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGB_INTEGER,     UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_RGBA_INTEGER,    UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_BGRA_EXT,        UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_DEPTH_COMPONENT, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_DEPTH_STENCIL,   UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_SRGB_EXT,        UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_SRGB_ALPHA_EXT,  UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-
</del><span class="cx">     // Compressed formats, From ES 3.0.1 spec, table 3.16
</span><del>-    //                       | Internal format                             | Texture support     | Render support     | Filter support      |
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_R11_EAC,                        UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_SIGNED_R11_EAC,                 UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_RG11_EAC,                       UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_SIGNED_RG11_EAC,                UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGB8_ETC2,                      UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_SRGB8_ETC2,                     UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGBA8_ETC2_EAC,                 UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
</del><ins>+    InsertFormatMapping(&amp;map, GL_COMPRESSED_R11_EAC,                        VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOnly(3, 0), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_SIGNED_R11_EAC,                 VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOnly(3, 0), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_RG11_EAC,                       VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOnly(3, 0), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_SIGNED_RG11_EAC,                VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOnly(3, 0), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGB8_ETC2,                      VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOnly(3, 0), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_SRGB8_ETC2,                     VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOnly(3, 0), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOnly(3, 0), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOnly(3, 0), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGBA8_ETC2_EAC,                 VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOnly(3, 0), Always(), Never());
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOnly(3, 0), Always(), Never());
</ins><span class="cx"> 
</span><span class="cx">     // From GL_EXT_texture_compression_dxt1
</span><del>-    //                       | Internal format                   | Texture support     | Render support     | Filter support      |
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,    UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
-    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,   UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
</del><ins>+    //                       | Format                            | OpenGL texture support                         | Filter  | Render | OpenGL ES texture support                    | Filter  | Render |
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,    ExtsOnly(&quot;GL_EXT_texture_compression_s3tc&quot;),     Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_compression_dxt1&quot;),   Always(), Never());
+    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,   ExtsOnly(&quot;GL_EXT_texture_compression_s3tc&quot;),     Always(), Never(), ExtsOnly(&quot;GL_EXT_texture_compression_dxt1&quot;),   Always(), Never());
</ins><span class="cx"> 
</span><span class="cx">     // From GL_ANGLE_texture_compression_dxt3
</span><del>-    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
</del><ins>+    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, ExtsOnly(&quot;GL_EXT_texture_compression_s3tc&quot;),     Always(), Never(), ExtsOnly(&quot;GL_ANGLE_texture_compression_dxt3&quot;), Always(), Never());
</ins><span class="cx"> 
</span><span class="cx">     // From GL_ANGLE_texture_compression_dxt5
</span><del>-    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport);
</del><ins>+    InsertFormatMapping(&amp;map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, ExtsOnly(&quot;GL_EXT_texture_compression_s3tc&quot;),     Always(), Never(), ExtsOnly(&quot;GL_ANGLE_texture_compression_dxt5&quot;), Always(), Never());
</ins><span class="cx"> 
</span><ins>+    // From GL_ETC1_RGB8_OES
+    InsertFormatMapping(&amp;map, GL_ETC1_RGB8_OES,                   VersionOrExts(4, 3, &quot;GL_ARB_ES3_compatibility&quot;), Always(), Never(), VersionOrExts(3, 0, &quot;GL_ETC1_RGB8_OES&quot;),       Always(), Never());
+
+    // clang-format on
+
</ins><span class="cx">     return map;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -200,21 +261,257 @@
</span><span class="cx">     return formatMap;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const InternalFormat &amp;GetInternalFormatInfo(GLenum internalFormat)
</del><ins>+const InternalFormat &amp;GetInternalFormatInfo(GLenum internalFormat, StandardGL standard)
</ins><span class="cx"> {
</span><span class="cx">     const InternalFormatInfoMap &amp;formatMap = GetInternalFormatMap();
</span><span class="cx">     InternalFormatInfoMap::const_iterator iter = formatMap.find(internalFormat);
</span><span class="cx">     if (iter != formatMap.end())
</span><span class="cx">     {
</span><del>-        return iter-&gt;second;
</del><ins>+        const InternalFormatInfo &amp;info = iter-&gt;second;
+        switch (standard)
+        {
+          case STANDARD_GL_ES:      return info.glesInfo;
+          case STANDARD_GL_DESKTOP: return info.glInfo;
+          default: UNREACHABLE();   break;
+        }
</ins><span class="cx">     }
</span><del>-    else
</del><ins>+
+    static const InternalFormat defaultInternalFormat;
+    return defaultInternalFormat;
+}
+
+static GLenum GetNativeInternalFormat(const FunctionsGL *functions,
+                                      const WorkaroundsGL &amp;workarounds,
+                                      GLenum internalFormat,
+                                      GLenum sizedInternalFormat)
+{
+    GLenum result = internalFormat;
+
+    if (functions-&gt;standard == STANDARD_GL_DESKTOP)
</ins><span class="cx">     {
</span><del>-        static const InternalFormat defaultInternalFormat;
-        return defaultInternalFormat;
</del><ins>+        // Use sized internal formats whenever possible to guarantee the requested precision.
+        // On Desktop GL, passing an internal format of GL_RGBA will generate a GL_RGBA8 texture
+        // even if the provided type is GL_FLOAT.
+        result = sizedInternalFormat;
+
+        const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(sizedInternalFormat);
+
+        if (workarounds.avoid1BitAlphaTextureFormats &amp;&amp; formatInfo.alphaBits == 1)
+        {
+            // Use an 8-bit format instead
+            result = GL_RGBA8;
+        }
+
+        if (workarounds.rgba4IsNotSupportedForColorRendering &amp;&amp; sizedInternalFormat == GL_RGBA4)
+        {
+            // Use an 8-bit format instead
+            result = GL_RGBA8;
+        }
+
+        if (sizedInternalFormat == GL_RGB565 &amp;&amp; !functions-&gt;isAtLeastGL(gl::Version(4, 1)) &amp;&amp;
+            !functions-&gt;hasGLExtension(&quot;GL_ARB_ES2_compatibility&quot;))
+        {
+            // GL_RGB565 is required for basic ES2 functionality but was not added to desktop GL
+            // until 4.1.
+            // Work around this by using an 8-bit format instead.
+            result = GL_RGB8;
+        }
+
+        if (sizedInternalFormat == GL_BGRA8_EXT)
+        {
+            // GLES accepts GL_BGRA as an internal format but desktop GL only accepts it as a type.
+            // Update the internal format to GL_RGBA.
+            result = GL_RGBA8;
+        }
+
+        if ((functions-&gt;profile &amp; GL_CONTEXT_CORE_PROFILE_BIT) != 0)
+        {
+            // Work around deprecated luminance alpha formats in the OpenGL core profile by backing
+            // them with R or RG textures.
+            if (formatInfo.format == GL_LUMINANCE || formatInfo.format == GL_ALPHA)
+            {
+                result = gl::GetSizedInternalFormat(GL_RED, formatInfo.type);
+            }
+
+            if (formatInfo.format == GL_LUMINANCE_ALPHA)
+            {
+                result = gl::GetSizedInternalFormat(GL_RG, formatInfo.type);
+            }
+        }
</ins><span class="cx">     }
</span><ins>+
+    return result;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static GLenum GetNativeFormat(const FunctionsGL *functions,
+                              const WorkaroundsGL &amp;workarounds,
+                              GLenum format)
+{
+    GLenum result = format;
+
+    if (functions-&gt;standard == STANDARD_GL_DESKTOP)
+    {
+        // The ES SRGB extensions require that the provided format is GL_SRGB or SRGB_ALPHA but
+        // the desktop GL extensions only accept GL_RGB or GL_RGBA.  Convert them.
+        if (format == GL_SRGB)
+        {
+            result = GL_RGB;
+        }
+
+        if (format == GL_SRGB_ALPHA)
+        {
+            result = GL_RGBA;
+        }
+
+        if ((functions-&gt;profile &amp; GL_CONTEXT_CORE_PROFILE_BIT) != 0)
+        {
+            // Work around deprecated luminance alpha formats in the OpenGL core profile by backing
+            // them with R or RG textures.
+            if (format == GL_LUMINANCE || format == GL_ALPHA)
+            {
+                result = GL_RED;
+            }
+
+            if (format == GL_LUMINANCE_ALPHA)
+            {
+                result = GL_RG;
+            }
+        }
+    }
+
+    return result;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static GLenum GetNativeCompressedFormat(const FunctionsGL *functions,
+                                        const WorkaroundsGL &amp;workarounds,
+                                        GLenum format)
+{
+    GLenum result = format;
+
+    if (functions-&gt;standard == STANDARD_GL_DESKTOP)
+    {
+        if (format == GL_ETC1_RGB8_OES)
+        {
+            // GL_ETC1_RGB8_OES is not available in any desktop GL extension but the compression
+            // format is forwards compatible so just use the ETC2 format.
+            result = GL_COMPRESSED_RGB8_ETC2;
+        }
+    }
+
+    if (functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        if (format == GL_ETC1_RGB8_OES)
+        {
+            // Pass GL_COMPRESSED_RGB8_ETC2 as the target format in ES3 and higher because it
+            // becomes a core format.
+            result = GL_COMPRESSED_RGB8_ETC2;
+        }
+    }
+
+    return result;
</ins><span class="cx"> }
</span><ins>+
+static GLenum GetNativeType(const FunctionsGL *functions,
+                            const WorkaroundsGL &amp;workarounds,
+                            GLenum type)
+{
+    GLenum result = type;
+
+    if (functions-&gt;standard == STANDARD_GL_DESKTOP)
+    {
+        if (type == GL_HALF_FLOAT_OES)
+        {
+            // The enums differ for the OES half float extensions and desktop GL spec. Update it.
+            result = GL_HALF_FLOAT;
+        }
+    }
+
+    if (functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        if (type == GL_HALF_FLOAT_OES)
+        {
+            // The enums differ for the OES half float extensions and ES 3 spec. Update it.
+            result = GL_HALF_FLOAT;
+        }
+    }
+
+    return result;
+}
+
+TexImageFormat GetTexImageFormat(const FunctionsGL *functions,
+                                 const WorkaroundsGL &amp;workarounds,
+                                 GLenum internalFormat,
+                                 GLenum format,
+                                 GLenum type)
+{
+    TexImageFormat result;
+    result.internalFormat = GetNativeInternalFormat(
+        functions, workarounds, internalFormat, gl::GetSizedInternalFormat(internalFormat, type));
+    result.format = GetNativeFormat(functions, workarounds, format);
+    result.type   = GetNativeType(functions, workarounds, type);
+    return result;
+}
+
+TexSubImageFormat GetTexSubImageFormat(const FunctionsGL *functions,
+                                       const WorkaroundsGL &amp;workarounds,
+                                       GLenum format,
+                                       GLenum type)
+{
+    TexSubImageFormat result;
+    result.format = GetNativeFormat(functions, workarounds, format);
+    result.type   = GetNativeType(functions, workarounds, type);
+    return result;
+}
+
+CompressedTexImageFormat GetCompressedTexImageFormat(const FunctionsGL *functions,
+                                                     const WorkaroundsGL &amp;workarounds,
+                                                     GLenum internalFormat)
+{
+    CompressedTexImageFormat result;
+    result.internalFormat = GetNativeCompressedFormat(functions, workarounds, internalFormat);
+    return result;
+}
+
+CompressedTexSubImageFormat GetCompressedSubTexImageFormat(const FunctionsGL *functions,
+                                                           const WorkaroundsGL &amp;workarounds,
+                                                           GLenum format)
+{
+    CompressedTexSubImageFormat result;
+    result.format = GetNativeCompressedFormat(functions, workarounds, format);
+    return result;
+}
+
+CopyTexImageImageFormat GetCopyTexImageImageFormat(const FunctionsGL *functions,
+                                                   const WorkaroundsGL &amp;workarounds,
+                                                   GLenum internalFormat,
+                                                   GLenum framebufferType)
+{
+    CopyTexImageImageFormat result;
+    result.internalFormat =
+        GetNativeInternalFormat(functions, workarounds, internalFormat,
+                                gl::GetSizedInternalFormat(internalFormat, framebufferType));
+    return result;
+}
+
+TexStorageFormat GetTexStorageFormat(const FunctionsGL *functions,
+                                     const WorkaroundsGL &amp;workarounds,
+                                     GLenum internalFormat)
+{
+    TexStorageFormat result;
+    result.internalFormat =
+        GetNativeInternalFormat(functions, workarounds, internalFormat, internalFormat);
+    return result;
+}
+
+RenderbufferFormat GetRenderbufferFormat(const FunctionsGL *functions,
+                                         const WorkaroundsGL &amp;workarounds,
+                                         GLenum internalFormat)
+{
+    RenderbufferFormat result;
+    result.internalFormat =
+        GetNativeInternalFormat(functions, workarounds, internalFormat, internalFormat);
+    return result;
+}
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglformatutilsglh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/formatutilsgl.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/formatutilsgl.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/formatutilsgl.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,10 +10,14 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_GL_FORMATUTILSGL_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_GL_FORMATUTILSGL_H_
</span><span class="cx"> 
</span><ins>+#include &lt;map&gt;
</ins><span class="cx"> #include &lt;string&gt;
</span><span class="cx"> #include &lt;vector&gt;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;angle_gl.h&quot;
</span><ins>+#include &quot;libANGLE/Version.h&quot;
+#include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
+#include &quot;libANGLE/renderer/gl/WorkaroundsGL.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="lines">@@ -21,18 +25,93 @@
</span><span class="cx"> namespace nativegl
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+struct SupportRequirement
+{
+    SupportRequirement();
+
+    // Version that this format became supported without extensions
+    gl::Version version;
+
+    // Extensions that are required if the minimum version is not met
+    std::vector&lt;std::string&gt; versionExtensions;
+
+    // Extensions that are always required to support this format
+    std::vector&lt;std::string&gt; requiredExtensions;
+};
+
</ins><span class="cx"> struct InternalFormat
</span><span class="cx"> {
</span><span class="cx">     InternalFormat();
</span><span class="cx"> 
</span><del>-    typedef bool(*SupportCheckFunction)(GLuint majorVersion, GLuint minorVersion,
-                                        const std::vector&lt;std::string&gt; &amp;extensions);
-    SupportCheckFunction textureSupport;
-    SupportCheckFunction renderSupport;
-    SupportCheckFunction filterSupport;
</del><ins>+    SupportRequirement texture;
+    SupportRequirement filter;
+    SupportRequirement renderbuffer;
+    SupportRequirement framebufferAttachment;
</ins><span class="cx"> };
</span><del>-const InternalFormat &amp;GetInternalFormatInfo(GLenum internalFormat);
</del><ins>+const InternalFormat &amp;GetInternalFormatInfo(GLenum internalFormat, StandardGL standard);
</ins><span class="cx"> 
</span><ins>+struct TexImageFormat
+{
+    GLenum internalFormat;
+    GLenum format;
+    GLenum type;
+};
+TexImageFormat GetTexImageFormat(const FunctionsGL *functions,
+                                 const WorkaroundsGL &amp;workarounds,
+                                 GLenum internalFormat,
+                                 GLenum format,
+                                 GLenum type);
+
+struct TexSubImageFormat
+{
+    GLenum format;
+    GLenum type;
+};
+TexSubImageFormat GetTexSubImageFormat(const FunctionsGL *functions,
+                                       const WorkaroundsGL &amp;workarounds,
+                                       GLenum format,
+                                       GLenum type);
+
+struct CompressedTexImageFormat
+{
+    GLenum internalFormat;
+};
+CompressedTexImageFormat GetCompressedTexImageFormat(const FunctionsGL *functions,
+                                                     const WorkaroundsGL &amp;workarounds,
+                                                     GLenum internalFormat);
+
+struct CompressedTexSubImageFormat
+{
+    GLenum format;
+};
+CompressedTexSubImageFormat GetCompressedSubTexImageFormat(const FunctionsGL *functions,
+                                                           const WorkaroundsGL &amp;workarounds,
+                                                           GLenum format);
+
+struct CopyTexImageImageFormat
+{
+    GLenum internalFormat;
+};
+CopyTexImageImageFormat GetCopyTexImageImageFormat(const FunctionsGL *functions,
+                                                   const WorkaroundsGL &amp;workarounds,
+                                                   GLenum internalFormat,
+                                                   GLenum framebufferType);
+
+struct TexStorageFormat
+{
+    GLenum internalFormat;
+};
+TexStorageFormat GetTexStorageFormat(const FunctionsGL *functions,
+                                     const WorkaroundsGL &amp;workarounds,
+                                     GLenum internalFormat);
+
+struct RenderbufferFormat
+{
+    GLenum internalFormat;
+};
+RenderbufferFormat GetRenderbufferFormat(const FunctionsGL *functions,
+                                         const WorkaroundsGL &amp;workarounds,
+                                         GLenum internalFormat);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglfunctionsgl_enumsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/functionsgl_enums.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/functionsgl_enums.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/functionsgl_enums.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -429,6 +429,7 @@
</span><span class="cx"> #define GL_MAX_VERTEX_ATTRIBS 0x8869
</span><span class="cx"> #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
</span><span class="cx"> #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
</span><ins>+#define GL_POINT_SPRITE 0x8861
</ins><span class="cx"> #define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0
</span><span class="cx"> #define GL_SAMPLER_1D 0x8B5D
</span><span class="cx"> #define GL_SAMPLER_1D_SHADOW 0x8B61
</span><span class="lines">@@ -523,7 +524,7 @@
</span><span class="cx"> #define GL_DEPTH_STENCIL 0x84F9
</span><span class="cx"> #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
</span><span class="cx"> #define GL_DRAW_FRAMEBUFFER 0x8CA9
</span><del>-#define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING
</del><ins>+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
</ins><span class="cx"> #define GL_FIXED_ONLY 0x891D
</span><span class="cx"> #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
</span><span class="cx"> #define GL_FRAMEBUFFER 0x8D40
</span><span class="lines">@@ -974,8 +975,8 @@
</span><span class="cx"> #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E
</span><span class="cx"> #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F
</span><span class="cx"> #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D
</span><del>-#define GL_COPY_READ_BUFFER_BINDING GL_COPY_READ_BUFFER
-#define GL_COPY_WRITE_BUFFER_BINDING GL_COPY_WRITE_BUFFER
</del><ins>+#define GL_COPY_READ_BUFFER_BINDING 0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
</ins><span class="cx"> #define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
</span><span class="cx"> #define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400
</span><span class="cx"> #define GL_IMAGE_1D 0x904C
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglfunctionsgl_typedefsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/functionsgl_typedefs.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/functionsgl_typedefs.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/functionsgl_typedefs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -595,6 +595,7 @@
</span><span class="cx"> typedef GLuint (INTERNAL_GL_APIENTRY *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint, GLsizei, GLenum *, GLenum *, GLuint *, GLenum *, GLsizei *, GLchar *);
</span><span class="cx"> typedef void (INTERNAL_GL_APIENTRY *PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum, GLenum, GLint *);
</span><span class="cx"> typedef void (INTERNAL_GL_APIENTRY *PFNGLGETINTERNALFORMATI64VPROC)(GLenum, GLenum, GLenum, GLsizei, GLint64 *);
</span><ins>+typedef void (INTERNAL_GL_APIENTRY *PFNGLGETPOINTERVPROC)(GLenum, void **);
</ins><span class="cx"> typedef void (INTERNAL_GL_APIENTRY *PFNGLGETOBJECTLABELPROC)(GLenum, GLuint, GLsizei, GLsizei *, GLchar *);
</span><span class="cx"> typedef void (INTERNAL_GL_APIENTRY *PFNGLGETOBJECTPTRLABELPROC)(const void *, GLsizei, GLsizei *, GLchar *);
</span><span class="cx"> typedef void (INTERNAL_GL_APIENTRY *PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint, GLenum, GLenum, GLint *);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxDisplayGLXcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,909 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// DisplayGLX.cpp: GLX implementation of egl::Display
+
+#include &quot;libANGLE/renderer/gl/glx/DisplayGLX.h&quot;
+
+#include &lt;EGL/eglext.h&gt;
+#include &lt;algorithm&gt;
+
+#include &quot;common/debug.h&quot;
+#include &quot;libANGLE/Config.h&quot;
+#include &quot;libANGLE/Display.h&quot;
+#include &quot;libANGLE/Surface.h&quot;
+#include &quot;libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h&quot;
+#include &quot;libANGLE/renderer/gl/glx/WindowSurfaceGLX.h&quot;
+#include &quot;libANGLE/renderer/gl/renderergl_utils.h&quot;
+#include &quot;third_party/libXNVCtrl/NVCtrl.h&quot;
+#include &quot;third_party/libXNVCtrl/NVCtrlLib.h&quot;
+
+namespace rx
+{
+
+static int IgnoreX11Errors(Display *, XErrorEvent *)
+{
+    return 0;
+}
+
+SwapControlData::SwapControlData()
+  : targetSwapInterval(0),
+    maxSwapInterval(-1),
+    currentSwapInterval(-1)
+{
+}
+
+class FunctionsGLGLX : public FunctionsGL
+{
+  public:
+    FunctionsGLGLX(PFNGETPROCPROC getProc)
+      : mGetProc(getProc)
+    {
+    }
+
+    ~FunctionsGLGLX() override {}
+
+  private:
+    void *loadProcAddress(const std::string &amp;function) override
+    {
+        return reinterpret_cast&lt;void*&gt;(mGetProc(function.c_str()));
+    }
+
+    PFNGETPROCPROC mGetProc;
+};
+
+DisplayGLX::DisplayGLX()
+    : DisplayGL(),
+      mFunctionsGL(nullptr),
+      mRequestedVisual(-1),
+      mContextConfig(nullptr),
+      mContext(nullptr),
+      mDummyPbuffer(0),
+      mUsesNewXDisplay(false),
+      mIsMesa(false),
+      mHasMultisample(false),
+      mHasARBCreateContext(false),
+      mHasARBCreateContextProfile(false),
+      mHasEXTCreateContextES2Profile(false),
+      mSwapControl(SwapControl::Absent),
+      mMinSwapInterval(0),
+      mMaxSwapInterval(0),
+      mCurrentSwapInterval(-1),
+      mXDisplay(nullptr),
+      mEGLDisplay(nullptr)
+{
+}
+
+DisplayGLX::~DisplayGLX()
+{
+}
+
+egl::Error DisplayGLX::initialize(egl::Display *display)
+{
+    mEGLDisplay = display;
+    mXDisplay             = display-&gt;getNativeDisplayId();
+    const auto &amp;attribMap = display-&gt;getAttributeMap();
+
+    // ANGLE_platform_angle allows the creation of a default display
+    // using EGL_DEFAULT_DISPLAY (= nullptr). In this case just open
+    // the display specified by the DISPLAY environment variable.
+    if (mXDisplay == EGL_DEFAULT_DISPLAY)
+    {
+        mUsesNewXDisplay = true;
+        mXDisplay = XOpenDisplay(NULL);
+        if (!mXDisplay)
+        {
+            return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not open the default X display.&quot;);
+        }
+    }
+
+    std::string glxInitError;
+    if (!mGLX.initialize(mXDisplay, DefaultScreen(mXDisplay), &amp;glxInitError))
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, glxInitError.c_str());
+    }
+
+    mHasMultisample      = mGLX.minorVersion &gt; 3 || mGLX.hasExtension(&quot;GLX_ARB_multisample&quot;);
+    mHasARBCreateContext = mGLX.hasExtension(&quot;GLX_ARB_create_context&quot;);
+    mHasARBCreateContextProfile    = mGLX.hasExtension(&quot;GLX_ARB_create_context_profile&quot;);
+    mHasEXTCreateContextES2Profile = mGLX.hasExtension(&quot;GLX_EXT_create_context_es2_profile&quot;);
+
+    // Choose the swap_control extension to use, if any.
+    // The EXT version is better as it allows glXSwapInterval to be called per
+    // window, while we'll potentially need to change the swap interval on each
+    // swap buffers when using the SGI or MESA versions.
+    if (mGLX.hasExtension(&quot;GLX_EXT_swap_control&quot;))
+    {
+        mSwapControl = SwapControl::EXT;
+
+        // In GLX_EXT_swap_control querying these is done on a GLXWindow so we just
+        // set default values.
+        mMinSwapInterval = 0;
+        mMaxSwapInterval = 4;
+    }
+    else if (mGLX.hasExtension(&quot;GLX_MESA_swap_control&quot;))
+    {
+        // If we have the Mesa or SGI extension, assume that you can at least set
+        // a swap interval of 0 or 1.
+        mSwapControl = SwapControl::Mesa;
+        mMinSwapInterval = 0;
+        mMinSwapInterval = 1;
+    }
+    else if (mGLX.hasExtension(&quot;GLX_SGI_swap_control&quot;))
+    {
+        mSwapControl = SwapControl::SGI;
+        mMinSwapInterval = 0;
+        mMinSwapInterval = 1;
+    }
+    else
+    {
+        mSwapControl = SwapControl::Absent;
+        mMinSwapInterval = 1;
+        mMinSwapInterval = 1;
+    }
+
+    if (attribMap.contains(EGL_X11_VISUAL_ID_ANGLE))
+    {
+        mRequestedVisual = static_cast&lt;EGLint&gt;(attribMap.get(EGL_X11_VISUAL_ID_ANGLE, -1));
+
+        // There is no direct way to get the GLXFBConfig matching an X11 visual ID
+        // so we have to iterate over all the GLXFBConfigs to find the right one.
+        int nConfigs;
+        int attribList[] = {
+            None,
+        };
+        glx::FBConfig *allConfigs = mGLX.chooseFBConfig(attribList, &amp;nConfigs);
+
+        for (int i = 0; i &lt; nConfigs; ++i)
+        {
+            if (getGLXFBConfigAttrib(allConfigs[i], GLX_VISUAL_ID) == mRequestedVisual)
+            {
+                mContextConfig = allConfigs[i];
+                break;
+            }
+        }
+        XFree(allConfigs);
+
+        if (mContextConfig == nullptr)
+        {
+            return egl::Error(EGL_NOT_INITIALIZED, &quot;Invalid visual ID requested.&quot;);
+        }
+    }
+    else
+    {
+        // When glXMakeCurrent is called, the context and the surface must be
+        // compatible which in glX-speak means that their config have the same
+        // color buffer type, are both RGBA or ColorIndex, and their buffers have
+        // the same depth, if they exist.
+        // Since our whole EGL implementation is backed by only one GL context, this
+        // context must be compatible with all the GLXFBConfig corresponding to the
+        // EGLconfigs that we will be exposing.
+        int nConfigs;
+        int attribList[] =
+        {
+            // We want RGBA8 and DEPTH24_STENCIL8
+            GLX_RED_SIZE, 8,
+            GLX_GREEN_SIZE, 8,
+            GLX_BLUE_SIZE, 8,
+            GLX_ALPHA_SIZE, 8,
+            GLX_DEPTH_SIZE, 24,
+            GLX_STENCIL_SIZE, 8,
+            // We want RGBA rendering (vs COLOR_INDEX) and doublebuffer
+            GLX_RENDER_TYPE, GLX_RGBA_BIT,
+            // Double buffer is not strictly required as a non-doublebuffer
+            // context can work with a doublebuffered surface, but it still
+            // flickers and all applications want doublebuffer anyway.
+            GLX_DOUBLEBUFFER, True,
+            // All of these must be supported for full EGL support
+            GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT | GLX_PBUFFER_BIT | GLX_PIXMAP_BIT,
+            // This makes sure the config have an associated visual Id
+            GLX_X_RENDERABLE, True,
+            GLX_CONFIG_CAVEAT, GLX_NONE,
+            None
+        };
+        glx::FBConfig *candidates = mGLX.chooseFBConfig(attribList, &amp;nConfigs);
+        if (nConfigs == 0)
+        {
+            XFree(candidates);
+            return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not find a decent GLX FBConfig to create the context.&quot;);
+        }
+        mContextConfig = candidates[0];
+        XFree(candidates);
+    }
+
+    const auto &amp;eglAttributes = display-&gt;getAttributeMap();
+    if (mHasARBCreateContext)
+    {
+        egl::Error error = initializeContext(mContextConfig, eglAttributes, &amp;mContext);
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+    else
+    {
+        if (eglAttributes.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE,
+                              EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE) ==
+            EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)
+        {
+            return egl::Error(EGL_NOT_INITIALIZED,
+                              &quot;Cannot create an OpenGL ES platform on GLX without the &quot;
+                              &quot;GLX_ARB_create_context extension.&quot;);
+        }
+
+        XVisualInfo visualTemplate;
+        visualTemplate.visualid = getGLXFBConfigAttrib(mContextConfig, GLX_VISUAL_ID);
+
+        int numVisuals       = 0;
+        XVisualInfo *visuals =
+            XGetVisualInfo(mXDisplay, VisualIDMask, &amp;visualTemplate, &amp;numVisuals);
+        if (numVisuals &lt;= 0)
+        {
+            return egl::Error(EGL_NOT_INITIALIZED,
+                              &quot;Could not get the visual info from the fb config&quot;);
+        }
+        ASSERT(numVisuals == 1);
+
+        mContext = mGLX.createContext(&amp;visuals[0], nullptr, true);
+        XFree(visuals);
+
+        if (!mContext)
+        {
+            return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not create GL context.&quot;);
+        }
+    }
+    ASSERT(mContext);
+
+    // FunctionsGL and DisplayGL need to make a few GL calls, for example to
+    // query the version of the context so we need to make the context current.
+    // glXMakeCurrent requires a GLXDrawable so we create a temporary Pbuffer
+    // (of size 1, 1) for the duration of these calls.
+    // Ideally we would want to unset the current context and destroy the pbuffer
+    // before going back to the application but this is TODO
+    // We could use a pbuffer of size (0, 0) but it fails on the Intel Mesa driver
+    // as commented on https://bugs.freedesktop.org/show_bug.cgi?id=38869 so we
+    // use (1, 1) instead.
+
+    int dummyPbufferAttribs[] =
+    {
+        GLX_PBUFFER_WIDTH, 1,
+        GLX_PBUFFER_HEIGHT, 1,
+        None,
+    };
+    mDummyPbuffer = mGLX.createPbuffer(mContextConfig, dummyPbufferAttribs);
+    if (!mDummyPbuffer)
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not create the dummy pbuffer.&quot;);
+    }
+
+    if (!mGLX.makeCurrent(mDummyPbuffer, mContext))
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not make the dummy pbuffer current.&quot;);
+    }
+
+    mFunctionsGL = new FunctionsGLGLX(mGLX.getProc);
+    mFunctionsGL-&gt;initialize();
+
+    // TODO(cwallez, angleproject:1303) Disable the OpenGL ES backend on Linux NVIDIA and Intel as
+    // it has problems on our automated testing. An OpenGL ES backend might not trigger this test if
+    // there is no Desktop OpenGL support, but that's not the case in our automated testing.
+    VendorID vendor = GetVendorID(mFunctionsGL);
+    bool isOpenGLES =
+        eglAttributes.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE) ==
+        EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE;
+    if (isOpenGLES &amp;&amp; (vendor == VENDOR_ID_INTEL || vendor == VENDOR_ID_NVIDIA))
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Intel or NVIDIA OpenGL ES drivers are not supported.&quot;);
+    }
+
+    syncXCommands();
+
+    std::string rendererString =
+        reinterpret_cast&lt;const char*&gt;(mFunctionsGL-&gt;getString(GL_RENDERER));
+    mIsMesa = rendererString.find(&quot;Mesa&quot;) != std::string::npos;
+
+    std::string version;
+    getDriverVersion(&amp;version);
+
+    return DisplayGL::initialize(display);
+}
+
+void DisplayGLX::terminate()
+{
+    DisplayGL::terminate();
+
+    if (mDummyPbuffer)
+    {
+        mGLX.destroyPbuffer(mDummyPbuffer);
+        mDummyPbuffer = 0;
+    }
+
+    if (mContext)
+    {
+        mGLX.destroyContext(mContext);
+        mContext = nullptr;
+    }
+
+    mGLX.terminate();
+
+    SafeDelete(mFunctionsGL);
+}
+
+SurfaceImpl *DisplayGLX::createWindowSurface(const egl::Config *configuration,
+                                             EGLNativeWindowType window,
+                                             const egl::AttributeMap &amp;attribs)
+{
+    ASSERT(configIdToGLXConfig.count(configuration-&gt;configID) &gt; 0);
+    glx::FBConfig fbConfig = configIdToGLXConfig[configuration-&gt;configID];
+
+    return new WindowSurfaceGLX(mGLX, this, this-&gt;getRenderer(), window, mGLX.getDisplay(),
+                                mContext, fbConfig);
+}
+
+SurfaceImpl *DisplayGLX::createPbufferSurface(const egl::Config *configuration,
+                                              const egl::AttributeMap &amp;attribs)
+{
+    ASSERT(configIdToGLXConfig.count(configuration-&gt;configID) &gt; 0);
+    glx::FBConfig fbConfig = configIdToGLXConfig[configuration-&gt;configID];
+
+    EGLint width  = static_cast&lt;EGLint&gt;(attribs.get(EGL_WIDTH, 0));
+    EGLint height = static_cast&lt;EGLint&gt;(attribs.get(EGL_HEIGHT, 0));
+    bool largest = (attribs.get(EGL_LARGEST_PBUFFER, EGL_FALSE) == EGL_TRUE);
+
+    return new PbufferSurfaceGLX(this-&gt;getRenderer(), width, height, largest, mGLX, mContext,
+                                 fbConfig);
+}
+
+SurfaceImpl* DisplayGLX::createPbufferFromClientBuffer(const egl::Config *configuration,
+                                                       EGLClientBuffer shareHandle,
+                                                       const egl::AttributeMap &amp;attribs)
+{
+    UNIMPLEMENTED();
+    return nullptr;
+}
+
+SurfaceImpl *DisplayGLX::createPixmapSurface(const egl::Config *configuration,
+                                             NativePixmapType nativePixmap,
+                                             const egl::AttributeMap &amp;attribs)
+{
+    UNIMPLEMENTED();
+    return nullptr;
+}
+
+egl::Error DisplayGLX::getDevice(DeviceImpl **device)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_BAD_DISPLAY);
+}
+
+egl::Error DisplayGLX::initializeContext(glx::FBConfig config,
+                                         const egl::AttributeMap &amp;eglAttributes,
+                                         glx::Context *context)
+{
+    int profileMask = 0;
+
+    EGLint requestedDisplayType = static_cast&lt;EGLint&gt;(
+        eglAttributes.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE));
+    if (requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)
+    {
+        if (!mHasEXTCreateContextES2Profile)
+        {
+            return egl::Error(EGL_NOT_INITIALIZED,
+                              &quot;Cannot create an OpenGL ES platform on GLX without the &quot;
+                              &quot;GLX_EXT_create_context_es_profile extension.&quot;);
+        }
+
+        ASSERT(mHasARBCreateContextProfile);
+        profileMask |= GLX_CONTEXT_ES2_PROFILE_BIT_EXT;
+    }
+
+    // Create a context of the requested version, if any.
+    gl::Version requestedVersion(static_cast&lt;EGLint&gt;(eglAttributes.get(
+                                     EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE)),
+                                 static_cast&lt;EGLint&gt;(eglAttributes.get(
+                                     EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE)));
+    if (static_cast&lt;EGLint&gt;(requestedVersion.major) != EGL_DONT_CARE &amp;&amp;
+        static_cast&lt;EGLint&gt;(requestedVersion.minor) != EGL_DONT_CARE)
+    {
+        if (!(profileMask &amp; GLX_CONTEXT_ES2_PROFILE_BIT_EXT) &amp;&amp;
+            requestedVersion &gt;= gl::Version(3, 2))
+        {
+            profileMask |= GLX_CONTEXT_CORE_PROFILE_BIT_ARB;
+        }
+        return createContextAttribs(config, requestedVersion, profileMask, context);
+    }
+
+    // It is commonly assumed that glXCreateContextAttrib will create a context
+    // of the highest version possible but it is not specified in the spec and
+    // is not true on the Mesa drivers. Instead we try to create a context per
+    // GL version until we succeed, starting from newer version. When the default
+    // platform is selected, if no desktop context can be created, we fallback to
+    // an ES context.
+    // clang-format off
+    const gl::Version desktopVersionsFrom3_2[] = {
+        gl::Version(4, 5),
+        gl::Version(4, 4),
+        gl::Version(4, 3),
+        gl::Version(4, 2),
+        gl::Version(4, 1),
+        gl::Version(4, 0),
+        gl::Version(3, 3),
+        gl::Version(3, 2),
+    };
+    const gl::Version desktopVersionsPre3_2[] = {
+        gl::Version(3, 1),
+        gl::Version(3, 0),
+        gl::Version(2, 0),
+        gl::Version(1, 5),
+        gl::Version(1, 4),
+        gl::Version(1, 3),
+        gl::Version(1, 2),
+        gl::Version(1, 1),
+        gl::Version(1, 0),
+    };
+    const gl::Version esVersionsFrom2_0[] = {
+        gl::Version(3, 2),
+        gl::Version(3, 1),
+        gl::Version(3, 0),
+        gl::Version(2, 0),
+    };
+    // clang-format on
+
+    // NOTE: below we return as soon as we're able to create a context so the
+    // &quot;error&quot; variable is EGL_SUCCESS when returned contrary to the common idiom
+    // of returning &quot;error&quot; when there is an actual error.
+    if (requestedDisplayType != EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)
+    {
+        for (auto &amp;version : desktopVersionsFrom3_2)
+        {
+            egl::Error error =
+                createContextAttribs(config, version, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, context);
+            if (!error.isError())
+            {
+                return error;
+            }
+        }
+        for (auto &amp;version : desktopVersionsPre3_2)
+        {
+            egl::Error error = createContextAttribs(config, version, 0, context);
+            if (!error.isError())
+            {
+                return error;
+            }
+        }
+    }
+
+    if (requestedDisplayType != EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
+    {
+        for (auto &amp;version : esVersionsFrom2_0)
+        {
+            egl::Error error =
+                createContextAttribs(config, version, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, context);
+            if (!error.isError())
+            {
+                return error;
+            }
+        }
+    }
+
+    return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not create a backing OpenGL context.&quot;);
+}
+
+egl::ConfigSet DisplayGLX::generateConfigs() const
+{
+    egl::ConfigSet configs;
+    configIdToGLXConfig.clear();
+
+    const gl::Version &amp;maxVersion = getMaxSupportedESVersion();
+    ASSERT(maxVersion &gt;= gl::Version(2, 0));
+    bool supportsES3 = maxVersion &gt;= gl::Version(3, 0);
+
+    int contextRedSize   = getGLXFBConfigAttrib(mContextConfig, GLX_RED_SIZE);
+    int contextGreenSize = getGLXFBConfigAttrib(mContextConfig, GLX_GREEN_SIZE);
+    int contextBlueSize  = getGLXFBConfigAttrib(mContextConfig, GLX_BLUE_SIZE);
+    int contextAlphaSize = getGLXFBConfigAttrib(mContextConfig, GLX_ALPHA_SIZE);
+
+    int contextDepthSize   = getGLXFBConfigAttrib(mContextConfig, GLX_DEPTH_SIZE);
+    int contextStencilSize = getGLXFBConfigAttrib(mContextConfig, GLX_STENCIL_SIZE);
+
+    int contextSamples = mHasMultisample ? getGLXFBConfigAttrib(mContextConfig, GLX_SAMPLES) : 0;
+    int contextSampleBuffers =
+        mHasMultisample ? getGLXFBConfigAttrib(mContextConfig, GLX_SAMPLE_BUFFERS) : 0;
+
+    int contextAccumRedSize = getGLXFBConfigAttrib(mContextConfig, GLX_ACCUM_RED_SIZE);
+    int contextAccumGreenSize = getGLXFBConfigAttrib(mContextConfig, GLX_ACCUM_GREEN_SIZE);
+    int contextAccumBlueSize = getGLXFBConfigAttrib(mContextConfig, GLX_ACCUM_BLUE_SIZE);
+    int contextAccumAlphaSize = getGLXFBConfigAttrib(mContextConfig, GLX_ACCUM_ALPHA_SIZE);
+
+    int attribList[] =
+    {
+        GLX_RENDER_TYPE, GLX_RGBA_BIT,
+        GLX_X_RENDERABLE, True,
+        GLX_DOUBLEBUFFER, True,
+        None,
+    };
+
+    int glxConfigCount;
+    glx::FBConfig *glxConfigs = mGLX.chooseFBConfig(attribList, &amp;glxConfigCount);
+
+    for (int i = 0; i &lt; glxConfigCount; i++)
+    {
+        glx::FBConfig glxConfig = glxConfigs[i];
+        egl::Config config;
+
+        // Native stuff
+        config.nativeVisualID = getGLXFBConfigAttrib(glxConfig, GLX_VISUAL_ID);
+        config.nativeVisualType = getGLXFBConfigAttrib(glxConfig, GLX_X_VISUAL_TYPE);
+        config.nativeRenderable = EGL_TRUE;
+
+        // When a visual ID has been specified with EGL_ANGLE_x11_visual we should
+        // only return configs with this visual: it will maximize performance by avoid
+        // blits in the driver when showing the window on the screen.
+        if (mRequestedVisual != -1 &amp;&amp; config.nativeVisualID != mRequestedVisual)
+        {
+            continue;
+        }
+
+        // Buffer sizes
+        config.redSize = getGLXFBConfigAttrib(glxConfig, GLX_RED_SIZE);
+        config.greenSize = getGLXFBConfigAttrib(glxConfig, GLX_GREEN_SIZE);
+        config.blueSize = getGLXFBConfigAttrib(glxConfig, GLX_BLUE_SIZE);
+        config.alphaSize = getGLXFBConfigAttrib(glxConfig, GLX_ALPHA_SIZE);
+        config.depthSize = getGLXFBConfigAttrib(glxConfig, GLX_DEPTH_SIZE);
+        config.stencilSize = getGLXFBConfigAttrib(glxConfig, GLX_STENCIL_SIZE);
+
+        // We require RGBA8 and the D24S8 (or no DS buffer)
+        if (config.redSize != contextRedSize || config.greenSize != contextGreenSize ||
+            config.blueSize != contextBlueSize || config.alphaSize != contextAlphaSize)
+        {
+            continue;
+        }
+        // The GLX spec says that it is ok for a whole buffer to not be present
+        // however the Mesa Intel driver (and probably on other Mesa drivers)
+        // fails to make current when the Depth stencil doesn't exactly match the
+        // configuration.
+        bool hasSameDepthStencil =
+            config.depthSize == contextDepthSize &amp;&amp; config.stencilSize == contextStencilSize;
+        bool hasNoDepthStencil = config.depthSize == 0 &amp;&amp; config.stencilSize == 0;
+        if (!hasSameDepthStencil &amp;&amp; (mIsMesa || !hasNoDepthStencil))
+        {
+            continue;
+        }
+
+        config.colorBufferType = EGL_RGB_BUFFER;
+        config.luminanceSize = 0;
+        config.alphaMaskSize = 0;
+
+        config.bufferSize = config.redSize + config.greenSize + config.blueSize + config.alphaSize;
+
+        // Multisample and accumulation buffers
+        int samples = mHasMultisample ? getGLXFBConfigAttrib(glxConfig, GLX_SAMPLES) : 0;
+        int sampleBuffers =
+            mHasMultisample ? getGLXFBConfigAttrib(glxConfig, GLX_SAMPLE_BUFFERS) : 0;
+
+        int accumRedSize = getGLXFBConfigAttrib(glxConfig, GLX_ACCUM_RED_SIZE);
+        int accumGreenSize = getGLXFBConfigAttrib(glxConfig, GLX_ACCUM_GREEN_SIZE);
+        int accumBlueSize = getGLXFBConfigAttrib(glxConfig, GLX_ACCUM_BLUE_SIZE);
+        int accumAlphaSize = getGLXFBConfigAttrib(glxConfig, GLX_ACCUM_ALPHA_SIZE);
+
+        if (samples != contextSamples ||
+            sampleBuffers != contextSampleBuffers ||
+            accumRedSize != contextAccumRedSize ||
+            accumGreenSize != contextAccumGreenSize ||
+            accumBlueSize != contextAccumBlueSize ||
+            accumAlphaSize != contextAccumAlphaSize)
+        {
+            continue;
+        }
+
+        config.samples = samples;
+        config.sampleBuffers = sampleBuffers;
+
+        // Transparency
+        if (getGLXFBConfigAttrib(glxConfig, GLX_TRANSPARENT_TYPE) == GLX_TRANSPARENT_RGB)
+        {
+            config.transparentType = EGL_TRANSPARENT_RGB;
+            config.transparentRedValue = getGLXFBConfigAttrib(glxConfig, GLX_TRANSPARENT_RED_VALUE);
+            config.transparentGreenValue = getGLXFBConfigAttrib(glxConfig, GLX_TRANSPARENT_GREEN_VALUE);
+            config.transparentBlueValue = getGLXFBConfigAttrib(glxConfig, GLX_TRANSPARENT_BLUE_VALUE);
+        }
+        else
+        {
+            config.transparentType = EGL_NONE;
+        }
+
+        // Pbuffer
+        config.maxPBufferWidth = getGLXFBConfigAttrib(glxConfig, GLX_MAX_PBUFFER_WIDTH);
+        config.maxPBufferHeight = getGLXFBConfigAttrib(glxConfig, GLX_MAX_PBUFFER_HEIGHT);
+        config.maxPBufferPixels = getGLXFBConfigAttrib(glxConfig, GLX_MAX_PBUFFER_PIXELS);
+
+        // Caveat
+        config.configCaveat = EGL_NONE;
+
+        int caveat = getGLXFBConfigAttrib(glxConfig, GLX_CONFIG_CAVEAT);
+        if (caveat == GLX_SLOW_CONFIG)
+        {
+            config.configCaveat = EGL_SLOW_CONFIG;
+        }
+        else if (caveat == GLX_NON_CONFORMANT_CONFIG)
+        {
+            continue;
+        }
+
+        // Misc
+        config.level = getGLXFBConfigAttrib(glxConfig, GLX_LEVEL);
+
+        config.bindToTextureRGB = EGL_FALSE;
+        config.bindToTextureRGBA = EGL_FALSE;
+
+        int glxDrawable = getGLXFBConfigAttrib(glxConfig, GLX_DRAWABLE_TYPE);
+        config.surfaceType = 0 |
+            (glxDrawable &amp; GLX_WINDOW_BIT ? EGL_WINDOW_BIT : 0) |
+            (glxDrawable &amp; GLX_PBUFFER_BIT ? EGL_PBUFFER_BIT : 0) |
+            (glxDrawable &amp; GLX_PIXMAP_BIT ? EGL_PIXMAP_BIT : 0);
+
+        config.minSwapInterval = mMinSwapInterval;
+        config.maxSwapInterval = mMaxSwapInterval;
+
+        // TODO(cwallez) wildly guessing these formats, another TODO says they should be removed anyway
+        config.renderTargetFormat = GL_RGBA8;
+        config.depthStencilFormat = GL_DEPTH24_STENCIL8;
+
+        config.conformant = EGL_OPENGL_ES2_BIT | (supportsES3 ? EGL_OPENGL_ES3_BIT_KHR : 0);
+        config.renderableType = config.conformant;
+
+        // TODO(cwallez) I have no idea what this is
+        config.matchNativePixmap = EGL_NONE;
+
+        int id = configs.add(config);
+        configIdToGLXConfig[id] = glxConfig;
+    }
+
+    XFree(glxConfigs);
+
+    return configs;
+}
+
+bool DisplayGLX::isDeviceLost() const
+{
+    // UNIMPLEMENTED();
+    return false;
+}
+
+bool DisplayGLX::testDeviceLost()
+{
+    // UNIMPLEMENTED();
+    return false;
+}
+
+egl::Error DisplayGLX::restoreLostDevice()
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_BAD_DISPLAY);
+}
+
+bool DisplayGLX::isValidNativeWindow(EGLNativeWindowType window) const
+{
+    // There is no function in Xlib to check the validity of a Window directly.
+    // However a small number of functions used to obtain window information
+    // return a status code (0 meaning failure) and guarantee that they will
+    // fail if the window doesn't exist (the rational is that these function
+    // are used by window managers). Out of these function we use XQueryTree
+    // as it seems to be the simplest; a drawback is that it will allocate
+    // memory for the list of children, becasue we use a child window for
+    // WindowSurface.
+    Window root;
+    Window parent;
+    Window *children = nullptr;
+    unsigned nChildren;
+    int status = XQueryTree(mGLX.getDisplay(), window, &amp;root, &amp;parent, &amp;children, &amp;nChildren);
+    if (children)
+    {
+        XFree(children);
+    }
+    return status != 0;
+}
+
+std::string DisplayGLX::getVendorString() const
+{
+    // UNIMPLEMENTED();
+    return &quot;&quot;;
+}
+
+egl::Error DisplayGLX::waitClient() const
+{
+    mGLX.waitGL();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error DisplayGLX::getDriverVersion(std::string *version) const
+{
+    VendorID vendor = GetVendorID(mFunctionsGL);
+
+    switch (vendor)
+    {
+        case VENDOR_ID_NVIDIA:
+            return getNVIDIADriverVersion(version);
+        default:
+            *version = &quot;&quot;;
+            return egl::Error(EGL_SUCCESS);
+    }
+}
+
+egl::Error DisplayGLX::waitNative(EGLint engine,
+                                  egl::Surface *drawSurface,
+                                  egl::Surface *readSurface) const
+{
+    // eglWaitNative is used to notice the driver of changes in X11 for the current surface, such as
+    // changes of the window size. We use this event to update the child window of WindowSurfaceGLX
+    // to match its parent window's size.
+    // Handling eglWaitNative this way helps the application control when resize happens. This is
+    // important because drivers have a tendency to clobber the back buffer when the windows are
+    // resized. See http://crbug.com/326995
+    if (drawSurface != nullptr)
+    {
+        SurfaceGLX *glxDrawSurface = GetImplAs&lt;SurfaceGLX&gt;(drawSurface);
+        egl::Error error = glxDrawSurface-&gt;checkForResize();
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+
+    if (readSurface != drawSurface &amp;&amp; readSurface != nullptr)
+    {
+        SurfaceGLX *glxReadSurface = GetImplAs&lt;SurfaceGLX&gt;(readSurface);
+        egl::Error error = glxReadSurface-&gt;checkForResize();
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+
+    // We still need to forward the resizing of the child window to the driver.
+    mGLX.waitX();
+    return egl::Error(EGL_SUCCESS);
+}
+
+void DisplayGLX::syncXCommands() const
+{
+    if (mUsesNewXDisplay)
+    {
+        XSync(mGLX.getDisplay(), False);
+    }
+}
+
+void DisplayGLX::setSwapInterval(glx::Drawable drawable, SwapControlData *data)
+{
+    ASSERT(data != nullptr);
+
+    // TODO(cwallez) error checking?
+    if (mSwapControl == SwapControl::EXT)
+    {
+        // Prefer the EXT extension, it gives per-drawable swap intervals, which will
+        // minimize the number of driver calls.
+        if (data-&gt;maxSwapInterval &lt; 0)
+        {
+            unsigned int maxSwapInterval = 0;
+            mGLX.queryDrawable(drawable, GLX_MAX_SWAP_INTERVAL_EXT, &amp;maxSwapInterval);
+            data-&gt;maxSwapInterval = static_cast&lt;int&gt;(maxSwapInterval);
+        }
+
+        // When the egl configs were generated we had to guess what the max swap interval
+        // was because we didn't have a window to query it one (and that this max could
+        // depend on the monitor). This means that the target interval might be higher
+        // than the max interval and needs to be clamped.
+        const int realInterval = std::min(data-&gt;targetSwapInterval, data-&gt;maxSwapInterval);
+        if (data-&gt;currentSwapInterval != realInterval)
+        {
+            mGLX.swapIntervalEXT(drawable, realInterval);
+            data-&gt;currentSwapInterval = realInterval;
+        }
+    }
+    else if (mCurrentSwapInterval != data-&gt;targetSwapInterval)
+    {
+        // With the Mesa or SGI extensions we can still do per-drawable swap control
+        // manually but it is more expensive in number of driver calls.
+        if (mSwapControl == SwapControl::Mesa)
+        {
+            mGLX.swapIntervalMESA(data-&gt;targetSwapInterval);
+        }
+        else if (mSwapControl == SwapControl::SGI)
+        {
+            mGLX.swapIntervalSGI(data-&gt;targetSwapInterval);
+        }
+        mCurrentSwapInterval = data-&gt;targetSwapInterval;
+    }
+}
+
+bool DisplayGLX::isValidWindowVisualId(unsigned long visualId) const
+{
+    return mRequestedVisual == -1 || static_cast&lt;unsigned long&gt;(mRequestedVisual) == visualId;
+}
+
+const FunctionsGL *DisplayGLX::getFunctionsGL() const
+{
+    return mFunctionsGL;
+}
+
+void DisplayGLX::generateExtensions(egl::DisplayExtensions *outExtensions) const
+{
+    outExtensions-&gt;createContext = true;
+    outExtensions-&gt;createContextNoError = true;
+}
+
+void DisplayGLX::generateCaps(egl::Caps *outCaps) const
+{
+    // UNIMPLEMENTED();
+    outCaps-&gt;textureNPOT = true;
+}
+
+int DisplayGLX::getGLXFBConfigAttrib(glx::FBConfig config, int attrib) const
+{
+    int result;
+    mGLX.getFBConfigAttrib(config, attrib, &amp;result);
+    return result;
+}
+
+egl::Error DisplayGLX::createContextAttribs(glx::FBConfig,
+                                            gl::Version version,
+                                            int profileMask,
+                                            glx::Context *context) const
+{
+    std::vector&lt;int&gt; attribs;
+    attribs.push_back(GLX_CONTEXT_MAJOR_VERSION_ARB);
+    attribs.push_back(version.major);
+
+    attribs.push_back(GLX_CONTEXT_MINOR_VERSION_ARB);
+    attribs.push_back(version.minor);
+
+    if (profileMask != 0 &amp;&amp; mHasARBCreateContextProfile)
+    {
+        attribs.push_back(GLX_CONTEXT_PROFILE_MASK_ARB);
+        attribs.push_back(profileMask);
+    }
+
+    attribs.push_back(None);
+
+    // When creating a context with glXCreateContextAttribsARB, a variety of X11 errors can
+    // be generated. To prevent these errors from crashing our process, we simply ignore
+    // them and only look if GLXContext was created.
+    auto oldErrorHandler = XSetErrorHandler(IgnoreX11Errors);
+    *context = mGLX.createContextAttribsARB(mContextConfig, nullptr, True, attribs.data());
+    XSetErrorHandler(oldErrorHandler);
+
+    if (!*context)
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not create GL context.&quot;);
+    }
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error DisplayGLX::getNVIDIADriverVersion(std::string *version) const
+{
+    *version = &quot;&quot;;
+
+    int eventBase = 0;
+    int errorBase = 0;
+    if (XNVCTRLQueryExtension(mXDisplay, &amp;eventBase, &amp;errorBase))
+    {
+        int screenCount = ScreenCount(mXDisplay);
+        for (int screen = 0; screen &lt; screenCount; ++screen)
+        {
+            char *buffer = nullptr;
+            if (XNVCTRLIsNvScreen(mXDisplay, screen) &amp;&amp;
+                XNVCTRLQueryStringAttribute(mXDisplay, screen, 0,
+                                            NV_CTRL_STRING_NVIDIA_DRIVER_VERSION, &amp;buffer))
+            {
+                *version = buffer;
+                XFree(buffer);
+            }
+        }
+    }
+
+    return egl::Error(EGL_SUCCESS);
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxDisplayGLXh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/DisplayGLX.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/DisplayGLX.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/DisplayGLX.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,146 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// DisplayGLX.h: GLX implementation of egl::Display
+
+#ifndef LIBANGLE_RENDERER_GL_GLX_DISPLAYGLX_H_
+#define LIBANGLE_RENDERER_GL_GLX_DISPLAYGLX_H_
+
+#include &lt;string&gt;
+#include &lt;vector&gt;
+
+#include &quot;libANGLE/renderer/gl/DisplayGL.h&quot;
+#include &quot;libANGLE/renderer/gl/glx/FunctionsGLX.h&quot;
+
+namespace rx
+{
+
+class FunctionsGLX;
+
+// State-tracking data for the swap control to allow DisplayGLX to remember per
+// drawable information for swap control.
+struct SwapControlData
+{
+    SwapControlData();
+
+    // Set by the drawable
+    int targetSwapInterval;
+
+    // DisplayGLX-side state-tracking
+    int maxSwapInterval;
+    int currentSwapInterval;
+};
+
+class DisplayGLX : public DisplayGL
+{
+  public:
+    DisplayGLX();
+    ~DisplayGLX() override;
+
+    egl::Error initialize(egl::Display *display) override;
+    void terminate() override;
+
+    SurfaceImpl *createWindowSurface(const egl::Config *configuration,
+                                     EGLNativeWindowType window,
+                                     const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
+                                      const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
+                                               EGLClientBuffer shareHandle,
+                                               const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
+                                     NativePixmapType nativePixmap,
+                                     const egl::AttributeMap &amp;attribs) override;
+
+    egl::ConfigSet generateConfigs() const override;
+
+    bool isDeviceLost() const override;
+    bool testDeviceLost() override;
+    egl::Error restoreLostDevice() override;
+
+    bool isValidNativeWindow(EGLNativeWindowType window) const override;
+
+    egl::Error getDevice(DeviceImpl **device) override;
+
+    std::string getVendorString() const override;
+
+    egl::Error waitClient() const override;
+    egl::Error waitNative(EGLint engine,
+                          egl::Surface *drawSurface,
+                          egl::Surface *readSurface) const override;
+
+    egl::Error getDriverVersion(std::string *version) const override;
+
+    // Synchronizes with the X server, if the display has been opened by ANGLE.
+    // Calling this is required at the end of every functions that does buffered
+    // X calls (not for glX calls) otherwise there might be race conditions
+    // between the application's display and ANGLE's one.
+    void syncXCommands() const;
+
+    // Depending on the supported GLX extension, swap interval can be set
+    // globally or per drawable. This function will make sure the drawable's
+    // swap interval is the one required so that the subsequent swapBuffers
+    // acts as expected.
+    void setSwapInterval(glx::Drawable drawable, SwapControlData *data);
+
+    bool isValidWindowVisualId(unsigned long visualId) const;
+
+  private:
+    const FunctionsGL *getFunctionsGL() const override;
+
+    egl::Error initializeContext(glx::FBConfig config,
+                                 const egl::AttributeMap &amp;eglAttributes,
+                                 glx::Context *context);
+
+    void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
+    void generateCaps(egl::Caps *outCaps) const override;
+
+    int getGLXFBConfigAttrib(glx::FBConfig config, int attrib) const;
+    egl::Error createContextAttribs(glx::FBConfig,
+                                    gl::Version version,
+                                    int profileMask,
+                                    glx::Context *context) const;
+
+    egl::Error getNVIDIADriverVersion(std::string *version) const;
+
+    FunctionsGL *mFunctionsGL;
+
+    //TODO(cwallez) yuck, change generateConfigs to be non-const or add a userdata member to egl::Config?
+    mutable std::map&lt;int, glx::FBConfig&gt; configIdToGLXConfig;
+
+    EGLint mRequestedVisual;
+    glx::FBConfig mContextConfig;
+    glx::Context mContext;
+    // A pbuffer the context is current on during ANGLE initialization
+    glx::Pbuffer mDummyPbuffer;
+
+    bool mUsesNewXDisplay;
+    bool mIsMesa;
+    bool mHasMultisample;
+    bool mHasARBCreateContext;
+    bool mHasARBCreateContextProfile;
+    bool mHasEXTCreateContextES2Profile;
+
+    enum class SwapControl
+    {
+        Absent,
+        EXT,
+        Mesa,
+        SGI,
+    };
+    SwapControl mSwapControl;
+    int mMinSwapInterval;
+    int mMaxSwapInterval;
+    int mCurrentSwapInterval;
+
+    FunctionsGLX mGLX;
+    Display *mXDisplay;
+    egl::Display *mEGLDisplay;
+};
+
+}
+
+#endif // LIBANGLE_RENDERER_GL_GLX_DISPLAYGLX_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxFBConfigCompatibilitymd"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FBConfigCompatibility.md (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FBConfigCompatibility.md                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FBConfigCompatibility.md        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,204 @@
</span><ins>+GLX Framebuffer Compatibility investigation
+===========================================
+
+In GLX and EGL, contexts are created with respect to a config that
+describes the type of surfaces they will be used to render to.
+Likewise surfaces are created with respect to a config and for
+a context to be able to render to a surface, both their configs
+must be compatible. Compatibility is losely described in both
+the GLX and EGL specs but the following is clear:
+ * In GLX the config's color buffer must have the same type, including
+RGBA vs. ColorIndex and the buffers must have the same depth, if they
+exist.
+ * In EGL the config's color buffer must have the same type and the
+buffers must have the same depth (not clear if it is only if they exist)
+
+Obviously the EGLconfig we will expose will have a one-to-one
+correspondance with GLXFBConfigs.
+
+Our EGL implementation uses a single OpenGL context to back all
+the EGLcontexts created by the application. Since our GL context
+and GLXContext are the same object but in two APIs, we will make
+the confusion and call the GLX context our backing context.
+
+The problem we have is that the the GLX context is created before
+the application can choose what type of context it wants to use,
+that means we have to expose EGLconfigs whose respective GLXFBConfigs
+are compatible with the GLXFBConfig of our GLX context; we also need
+to choose the GLXFBConfig of our GLX context so that it matches the
+most common needs of application.
+
+Choice of the GLX context GLXFBConfig
+-------------------------------------
+
+We decided that our GLX context's configuration must satisfy the following:
+ * Have a RGBA8 color buffer and D24S8 depth-stencil buffer which is what
+the vast majority of applications use.
+ * It must render in direct colors, i.e. not in a color indexed format.
+ * It must be double-buffered (see later)
+ * It must support rendering to all the types of GLX surfaces so that we can
+use it for all types of EGL surfaces
+ * It must have an associated visual ID so that we can use it with X, it seems
+like this would be strongly tied to it having the ```WINDOW_BIT``` set.
+ * We would like a conformant context.
+
+Study of compatible GLXFBConfigs
+--------------------------------
+
+When using the condition of compatibility defined in the GLX spec and filtering
+out the non-conformant GLXFBConfig we got the following list (see function
+```print_visual_attribs_short``` in [glxinfo's source code](http://cgit.freedesktop.org/mesa/demos/tree/src/xdemos/glxinfo.c)
+to understand how to read the table):
+
+```
+    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
+  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat  Result
+----------------------------------------------------------------------------
+0x02e 24 tc  0  32  0 r  . .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None Fail
+0x0e4 32 tc  0  32  0 r  . .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None BadMatch
+0x02c 24 tc  0  32  0 r  y .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None Pass
+0x0e2 32 tc  0  32  0 r  y .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None BadMatch
+0x089 24 dc  0  32  0 r  . .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None Fail
+0x087 24 dc  0  32  0 r  y .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None Pass
+0x026 24 tc  0  32  0 r  . .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None Fail
+0x0dc 32 tc  0  32  0 r  . .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None BadMatch
+0x024 24 tc  0  32  0 r  y .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None Pass
+0x0da 32 tc  0  32  0 r  y .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None BadMatch
+0x081 24 dc  0  32  0 r  . .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None Fail
+0x07f 24 dc  0  32  0 r  y .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None Pass
+```
+
+The last column shows the result of trying to render on a window using the config,
+with a GLX context using config 0x024. The first thing we see is that BadMatch is
+thrown by the X server when creating the subwindow for rendering. This was because
+we didn't set the border pixel of the subwindow *shake fist at X11* (see this [StackOverflow question](http://stackoverflow.com/questions/3645632/how-to-create-a-window-with-a-bit-depth-of-32)).
+The result updated with this fix give:
+
+```
+    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
+  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat
+----------------------------------------------------------------------------
+0x02e 24 tc  0  32  0 r  . .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None Fail
+0x0e4 32 tc  0  32  0 r  . .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None Fail
+0x02c 24 tc  0  32  0 r  y .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None Pass
+0x0e2 32 tc  0  32  0 r  y .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None Pass
+0x089 24 dc  0  32  0 r  . .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None Fail
+0x087 24 dc  0  32  0 r  y .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None Pass
+0x026 24 tc  0  32  0 r  . .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None Fail
+0x0dc 32 tc  0  32  0 r  . .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None Fail
+0x024 24 tc  0  32  0 r  y .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None Pass
+0x0da 32 tc  0  32  0 r  y .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None Pass
+0x081 24 dc  0  32  0 r  . .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None Fail
+0x07f 24 dc  0  32  0 r  y .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None Pass
+```
+
+From this we see that our rendering test passed if and only if the config was double
+buffered like 0x024 which is our GLX context config. The compatible configs are then:
+
+```
+    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
+  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat
+----------------------------------------------------------------------------
+0x02c 24 tc  0  32  0 r  y .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None
+0x0e2 32 tc  0  32  0 r  y .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None
+0x087 24 dc  0  32  0 r  y .   8  8  8  8 .  s  4  0  0 16 16 16 16  0 0 None
+0x024 24 tc  0  32  0 r  y .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None
+0x0da 32 tc  0  32  0 r  y .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None
+0x07f 24 dc  0  32  0 r  y .   8  8  8  8 .  s  4 24  8 16 16 16 16  0 0 None
+```
+
+We can see two dimensions, with our without a depth-stencil buffer and with TrueColor
+or DirectColor. The depth-stencil will be useful to expose to application.
+
+More on double buffering
+------------------------
+The tests above show that double-buffered contexts are not compatible with single-
+buffered surfaces; however other tests show that single-buffered contexts are
+compatible with both single and double-buffered surfaces. The problem is that in
+that case, we can see some flickering even with double-buffered surfaces. If we
+can find a trick to avoid that flicker, then we would be able to expose single
+and double-buffered surfaces at the EGL level. Not exposing them isn't too much
+of a problem though as the vast majority of application want double-buffering.
+
+AMD and extra buffers
+---------------------
+As can be seen above, NVIDIA does not expose conformant context with multisampled
+buffers or non RGBA16 accumulation buffers. The behavior is different on AMD that
+exposes them as conformant, which gives the following list after filtering as
+explained above:
+
+```
+    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
+  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat
+----------------------------------------------------------------------------
+0x023 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 None
+0x027 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+0x02b 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  2 1 None
+0x02f 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  4 1 None
+0x03b 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8 16 16 16 16  0 0 None
+0x03f 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+0x043 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  2 1 None
+0x047 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  4 1 None
+```
+
+ANGLE's context is created using 0x027 and experimentation shows it is only compatible
+with 0x03f which is the only other config lacking both an accumulation buffer and a
+multisample buffer. The GLX spec seems to hint it should still work (&quot;should have the
+same size, if they exist&quot;) but it doesn't work in this case. Filtering the configs to
+have the same multisample and accumulation buffers gives the following:
+
+```
+    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
+  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat
+----------------------------------------------------------------------------
+0x027 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+0x03f 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+```
+
+Mesa Intel driver
+-----------------
+In GLX, a criterium for context and surface compatibility is that buffers
+should have the same depth, if they exist at all in the surface. This means
+that it should be possible to make a context with a D24S8 depth-stencil
+buffer to a surface without a depth-stencil buffer. This doesn't work on the
+Mesa Intel driver. The list before the workaround was the following, with
+0x020 being the fbconfig chosen for the context:
+
+```
+    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
+  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat
+----------------------------------------------------------------------------
+0x020 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+0x021 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+0x08f 32 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+0x0d0 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
+0x0e2 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0  0  0  0  0  0  0  0 0 None
+0x0e9 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+```
+
+After the workaround that list becomes the following:
+
+```
+    visual  x   bf lv rg d st  colorbuffer  sr ax dp st accumbuffer  ms  cav
+  id dep cl sp  sz l  ci b ro  r  g  b  a F gb bf th cl  r  g  b  a ns b eat
+----------------------------------------------------------------------------
+0x020 24 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+0x021 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+0x08f 32 tc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+0x0e9 24 dc  0  32  0 r  y .   8  8  8  8 .  .  0 24  8  0  0  0  0  0 0 None
+```
+
+Future investigation
+--------------------
+All the non-conformant configs have a multisampled buffer, so it could be interesting
+to see if we can use them to expose another EGL extension.
+
+Finally this document is written with respect to a small number of drivers, before
+using the GLX EGL implementation in the wild it would be good to test it on other
+drivers and hardware.
+
+The drivers tested were:
+
+ - the proprietary NVIDIA driver
+ - the proprietary AMD driver
+ - the open source Intel (Broadwell) Mesa driver
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxFunctionsGLXcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FunctionsGLX.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,390 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// FunctionsGLX.cpp: Implements the FunctionsGLX class.
+
+#define ANGLE_SKIP_GLX_DEFINES 1
+#include &quot;libANGLE/renderer/gl/glx/FunctionsGLX.h&quot;
+#undef ANGLE_SKIP_GLX_DEFINES
+
+// We can only include glx.h in files which do not include ANGLE's GLES
+// headers, to avoid doubly-defined GLenum macros, typedefs, etc.
+#include &lt;GL/glx.h&gt;
+
+#include &lt;dlfcn.h&gt;
+#include &lt;algorithm&gt;
+
+#include &quot;common/string_utils.h&quot;
+#include &quot;libANGLE/renderer/gl/glx/functionsglx_typedefs.h&quot;
+
+namespace rx
+{
+
+void* FunctionsGLX::sLibHandle = nullptr;
+
+template&lt;typename T&gt;
+static bool GetProc(PFNGETPROCPROC getProc, T *member, const char *name)
+{
+    *member = reinterpret_cast&lt;T&gt;(getProc(name));
+    return *member != nullptr;
+}
+
+struct FunctionsGLX::GLXFunctionTable
+{
+    GLXFunctionTable()
+        : createContextPtr(nullptr),
+          destroyContextPtr(nullptr),
+          makeCurrentPtr(nullptr),
+          swapBuffersPtr(nullptr),
+          queryExtensionPtr(nullptr),
+          queryVersionPtr(nullptr),
+          getCurrentContextPtr(nullptr),
+          getCurrentDrawablePtr(nullptr),
+          waitXPtr(nullptr),
+          waitGLPtr(nullptr),
+          queryExtensionsStringPtr(nullptr),
+          getFBConfigsPtr(nullptr),
+          chooseFBConfigPtr(nullptr),
+          getFBConfigAttribPtr(nullptr),
+          getVisualFromFBConfigPtr(nullptr),
+          createWindowPtr(nullptr),
+          destroyWindowPtr(nullptr),
+          createPbufferPtr(nullptr),
+          destroyPbufferPtr(nullptr),
+          queryDrawablePtr(nullptr),
+          createContextAttribsARBPtr(nullptr),
+          swapIntervalEXTPtr(nullptr),
+          swapIntervalMESAPtr(nullptr),
+          swapIntervalSGIPtr(nullptr)
+    {
+    }
+
+    // GLX 1.0
+    PFNGLXCREATECONTEXTPROC createContextPtr;
+    PFNGLXDESTROYCONTEXTPROC destroyContextPtr;
+    PFNGLXMAKECURRENTPROC makeCurrentPtr;
+    PFNGLXSWAPBUFFERSPROC swapBuffersPtr;
+    PFNGLXQUERYEXTENSIONPROC queryExtensionPtr;
+    PFNGLXQUERYVERSIONPROC queryVersionPtr;
+    PFNGLXGETCURRENTCONTEXTPROC getCurrentContextPtr;
+    PFNGLXGETCURRENTDRAWABLEPROC getCurrentDrawablePtr;
+    PFNGLXWAITXPROC waitXPtr;
+    PFNGLXWAITGLPROC waitGLPtr;
+
+    // GLX 1.1
+    PFNGLXQUERYEXTENSIONSSTRINGPROC queryExtensionsStringPtr;
+
+    //GLX 1.3
+    PFNGLXGETFBCONFIGSPROC getFBConfigsPtr;
+    PFNGLXCHOOSEFBCONFIGPROC chooseFBConfigPtr;
+    PFNGLXGETFBCONFIGATTRIBPROC getFBConfigAttribPtr;
+    PFNGLXGETVISUALFROMFBCONFIGPROC getVisualFromFBConfigPtr;
+    PFNGLXCREATEWINDOWPROC createWindowPtr;
+    PFNGLXDESTROYWINDOWPROC destroyWindowPtr;
+    PFNGLXCREATEPBUFFERPROC createPbufferPtr;
+    PFNGLXDESTROYPBUFFERPROC destroyPbufferPtr;
+    PFNGLXQUERYDRAWABLEPROC queryDrawablePtr;
+
+    // GLX_ARB_create_context
+    PFNGLXCREATECONTEXTATTRIBSARBPROC createContextAttribsARBPtr;
+
+    // GLX_EXT_swap_control
+    PFNGLXSWAPINTERVALEXTPROC swapIntervalEXTPtr;
+
+    // GLX_MESA_swap_control
+    PFNGLXSWAPINTERVALMESAPROC swapIntervalMESAPtr;
+
+    // GLX_SGI_swap_control
+    PFNGLXSWAPINTERVALSGIPROC swapIntervalSGIPtr;
+};
+
+FunctionsGLX::FunctionsGLX()
+  : majorVersion(0),
+    minorVersion(0),
+    mXDisplay(nullptr),
+    mXScreen(-1),
+    mFnPtrs(new GLXFunctionTable())
+{
+}
+
+FunctionsGLX::~FunctionsGLX()
+{
+    delete mFnPtrs;
+    terminate();
+}
+
+bool FunctionsGLX::initialize(Display *xDisplay, int screen, std::string *errorString)
+{
+    terminate();
+    mXDisplay = xDisplay;
+    mXScreen = screen;
+
+#if !defined(ANGLE_LINK_GLX)
+    // Some OpenGL implementations can't handle having this library
+    // handle closed while there's any X window still open against
+    // which a GLXWindow was ever created.
+    if (!sLibHandle)
+    {
+        sLibHandle = dlopen(&quot;libGL.so.1&quot;, RTLD_NOW);
+        if (!sLibHandle)
+        {
+            *errorString = std::string(&quot;Could not dlopen libGL.so.1: &quot;) + dlerror();
+            return false;
+        }
+    }
+
+    getProc = reinterpret_cast&lt;PFNGETPROCPROC&gt;(dlsym(sLibHandle, &quot;glXGetProcAddress&quot;));
+    if (!getProc)
+    {
+        getProc = reinterpret_cast&lt;PFNGETPROCPROC&gt;(dlsym(sLibHandle, &quot;glXGetProcAddressARB&quot;));
+    }
+    if (!getProc)
+    {
+        *errorString = &quot;Could not retrieve glXGetProcAddress&quot;;
+        return false;
+    }
+#else
+    getProc = reinterpret_cast&lt;PFNGETPROCPROC&gt;(glXGetProcAddress);
+#endif
+
+#define GET_PROC_OR_ERROR(MEMBER, NAME) \
+    if (!GetProc(getProc, MEMBER, #NAME)) \
+    { \
+        *errorString = &quot;Could not load GLX entry point &quot; #NAME; \
+        return false; \
+    }
+#if !defined(ANGLE_LINK_GLX)
+#define GET_FNPTR_OR_ERROR(MEMBER, NAME) GET_PROC_OR_ERROR(MEMBER, NAME)
+#else
+#define GET_FNPTR_OR_ERROR(MEMBER, NAME) *MEMBER = NAME;
+#endif
+
+    // GLX 1.0
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;createContextPtr, glXCreateContext);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;destroyContextPtr, glXDestroyContext);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;makeCurrentPtr, glXMakeCurrent);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;swapBuffersPtr, glXSwapBuffers);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;queryExtensionPtr, glXQueryExtension);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;queryVersionPtr, glXQueryVersion);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;getCurrentContextPtr, glXGetCurrentContext);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;getCurrentDrawablePtr, glXGetCurrentDrawable);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;waitXPtr, glXWaitX);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;waitGLPtr, glXWaitGL);
+
+    // GLX 1.1
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;queryExtensionsStringPtr, glXQueryExtensionsString);
+
+    // Check we have a working GLX
+    {
+        int errorBase;
+        int eventBase;
+        if (!queryExtension(&amp;errorBase, &amp;eventBase))
+        {
+            *errorString = &quot;GLX is not present.&quot;;
+            return false;
+        }
+    }
+
+    // Check we have a supported version of GLX
+    if (!queryVersion(&amp;majorVersion, &amp;minorVersion))
+    {
+        *errorString = &quot;Could not query the GLX version.&quot;;
+        return false;
+    }
+    if (majorVersion != 1 || minorVersion &lt; 3)
+    {
+        *errorString = &quot;Unsupported GLX version (requires at least 1.3).&quot;;
+        return false;
+    }
+
+    const char *extensions = queryExtensionsString();
+    if (!extensions)
+    {
+        *errorString = &quot;glXQueryExtensionsString returned NULL&quot;;
+        return false;
+    }
+    angle::SplitStringAlongWhitespace(extensions, &amp;mExtensions);
+
+    // GLX 1.3
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;getFBConfigsPtr, glXGetFBConfigs);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;chooseFBConfigPtr, glXChooseFBConfig);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;getFBConfigAttribPtr, glXGetFBConfigAttrib);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;getVisualFromFBConfigPtr, glXGetVisualFromFBConfig);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;createWindowPtr, glXCreateWindow);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;destroyWindowPtr, glXDestroyWindow);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;createPbufferPtr, glXCreatePbuffer);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;destroyPbufferPtr, glXDestroyPbuffer);
+    GET_FNPTR_OR_ERROR(&amp;mFnPtrs-&gt;queryDrawablePtr, glXQueryDrawable);
+
+    // Extensions
+    if (hasExtension(&quot;GLX_ARB_create_context&quot;))
+    {
+        GET_PROC_OR_ERROR(&amp;mFnPtrs-&gt;createContextAttribsARBPtr, glXCreateContextAttribsARB);
+    }
+    if (hasExtension(&quot;GLX_EXT_swap_control&quot;))
+    {
+        GET_PROC_OR_ERROR(&amp;mFnPtrs-&gt;swapIntervalEXTPtr, glXSwapIntervalEXT);
+    }
+    if (hasExtension(&quot;GLX_MESA_swap_control&quot;))
+    {
+        GET_PROC_OR_ERROR(&amp;mFnPtrs-&gt;swapIntervalMESAPtr, glXSwapIntervalMESA);
+    }
+    if (hasExtension(&quot;GLX_SGI_swap_control&quot;))
+    {
+        GET_PROC_OR_ERROR(&amp;mFnPtrs-&gt;swapIntervalSGIPtr, glXSwapIntervalSGI);
+    }
+
+#undef GET_FNPTR_OR_ERROR
+#undef GET_PROC_OR_ERROR
+
+    *errorString = &quot;&quot;;
+    return true;
+}
+
+void FunctionsGLX::terminate()
+{
+}
+
+bool FunctionsGLX::hasExtension(const char *extension) const
+{
+    return std::find(mExtensions.begin(), mExtensions.end(), extension) != mExtensions.end();
+}
+
+Display *FunctionsGLX::getDisplay() const
+{
+    return mXDisplay;
+}
+
+int FunctionsGLX::getScreen() const
+{
+    return mXScreen;
+}
+
+// GLX functions
+
+// GLX 1.0
+glx::Context FunctionsGLX::createContext(XVisualInfo *visual, glx::Context share, bool direct) const
+{
+    GLXContext shareCtx = reinterpret_cast&lt;GLXContext&gt;(share);
+    GLXContext context = mFnPtrs-&gt;createContextPtr(mXDisplay, visual, shareCtx, direct);
+    return reinterpret_cast&lt;glx::Context&gt;(context);
+}
+void FunctionsGLX::destroyContext(glx::Context context) const
+{
+    GLXContext ctx = reinterpret_cast&lt;GLXContext&gt;(context);
+    mFnPtrs-&gt;destroyContextPtr(mXDisplay, ctx);
+}
+Bool FunctionsGLX::makeCurrent(glx::Drawable drawable, glx::Context context) const
+{
+    GLXContext ctx = reinterpret_cast&lt;GLXContext&gt;(context);
+    return mFnPtrs-&gt;makeCurrentPtr(mXDisplay, drawable, ctx);
+}
+void FunctionsGLX::swapBuffers(glx::Drawable drawable) const
+{
+    mFnPtrs-&gt;swapBuffersPtr(mXDisplay, drawable);
+}
+Bool FunctionsGLX::queryExtension(int *errorBase, int *event) const
+{
+    return mFnPtrs-&gt;queryExtensionPtr(mXDisplay, errorBase, event);
+}
+Bool FunctionsGLX::queryVersion(int *major, int *minor) const
+{
+    return mFnPtrs-&gt;queryVersionPtr(mXDisplay, major, minor);
+}
+glx::Context FunctionsGLX::getCurrentContext() const
+{
+    GLXContext context = mFnPtrs-&gt;getCurrentContextPtr();
+    return reinterpret_cast&lt;glx::Context&gt;(context);
+}
+glx::Drawable FunctionsGLX::getCurrentDrawable() const
+{
+    GLXDrawable drawable = mFnPtrs-&gt;getCurrentDrawablePtr();
+    return reinterpret_cast&lt;glx::Drawable&gt;(drawable);
+}
+void FunctionsGLX::waitX() const
+{
+    mFnPtrs-&gt;waitXPtr();
+}
+void FunctionsGLX::waitGL() const
+{
+    mFnPtrs-&gt;waitGLPtr();
+}
+
+// GLX 1.1
+const char *FunctionsGLX::queryExtensionsString() const
+{
+    return mFnPtrs-&gt;queryExtensionsStringPtr(mXDisplay, mXScreen);
+}
+
+// GLX 1.4
+glx::FBConfig *FunctionsGLX::getFBConfigs(int *nElements) const
+{
+    GLXFBConfig *configs = mFnPtrs-&gt;getFBConfigsPtr(mXDisplay, mXScreen, nElements);
+    return reinterpret_cast&lt;glx::FBConfig*&gt;(configs);
+}
+glx::FBConfig *FunctionsGLX::chooseFBConfig(const int *attribList, int *nElements) const
+{
+    GLXFBConfig *configs = mFnPtrs-&gt;chooseFBConfigPtr(mXDisplay, mXScreen, attribList, nElements);
+    return reinterpret_cast&lt;glx::FBConfig*&gt;(configs);
+}
+int FunctionsGLX::getFBConfigAttrib(glx::FBConfig config, int attribute, int *value) const
+{
+    GLXFBConfig cfg = reinterpret_cast&lt;GLXFBConfig&gt;(config);
+    return mFnPtrs-&gt;getFBConfigAttribPtr(mXDisplay, cfg, attribute, value);
+}
+XVisualInfo *FunctionsGLX::getVisualFromFBConfig(glx::FBConfig config) const
+{
+    GLXFBConfig cfg = reinterpret_cast&lt;GLXFBConfig&gt;(config);
+    return mFnPtrs-&gt;getVisualFromFBConfigPtr(mXDisplay, cfg);
+}
+GLXWindow FunctionsGLX::createWindow(glx::FBConfig config, Window window, const int *attribList) const
+{
+    GLXFBConfig cfg = reinterpret_cast&lt;GLXFBConfig&gt;(config);
+    return mFnPtrs-&gt;createWindowPtr(mXDisplay, cfg, window, attribList);
+}
+void FunctionsGLX::destroyWindow(glx::Window window) const
+{
+    mFnPtrs-&gt;destroyWindowPtr(mXDisplay, window);
+}
+glx::Pbuffer FunctionsGLX::createPbuffer(glx::FBConfig config, const int *attribList) const
+{
+    GLXFBConfig cfg = reinterpret_cast&lt;GLXFBConfig&gt;(config);
+    return mFnPtrs-&gt;createPbufferPtr(mXDisplay, cfg, attribList);
+}
+void FunctionsGLX::destroyPbuffer(glx::Pbuffer pbuffer) const
+{
+    mFnPtrs-&gt;destroyPbufferPtr(mXDisplay, pbuffer);
+}
+void FunctionsGLX::queryDrawable(glx::Drawable drawable, int attribute, unsigned int *value) const
+{
+    mFnPtrs-&gt;queryDrawablePtr(mXDisplay, drawable, attribute, value);
+}
+
+// GLX_ARB_create_context
+glx::Context FunctionsGLX::createContextAttribsARB(glx::FBConfig config, glx::Context shareContext, Bool direct, const int *attribList) const
+{
+    GLXContext shareCtx = reinterpret_cast&lt;GLXContext&gt;(shareContext);
+    GLXFBConfig cfg = reinterpret_cast&lt;GLXFBConfig&gt;(config);
+    GLXContext ctx = mFnPtrs-&gt;createContextAttribsARBPtr(mXDisplay, cfg, shareCtx, direct, attribList);
+    return reinterpret_cast&lt;glx::Context&gt;(ctx);
+}
+
+void FunctionsGLX::swapIntervalEXT(glx::Drawable drawable, int intervals) const
+{
+    mFnPtrs-&gt;swapIntervalEXTPtr(mXDisplay, drawable, intervals);
+}
+
+int FunctionsGLX::swapIntervalMESA(int intervals) const
+{
+    return mFnPtrs-&gt;swapIntervalMESAPtr(intervals);
+}
+
+int FunctionsGLX::swapIntervalSGI(int intervals) const
+{
+    return mFnPtrs-&gt;swapIntervalSGIPtr(intervals);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxFunctionsGLXh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FunctionsGLX.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FunctionsGLX.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/FunctionsGLX.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,95 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// FunctionsGLX.h: Defines the FunctionsGLX class to load functions and data from GLX
+
+#ifndef LIBANGLE_RENDERER_GL_GLX_FUNCTIONSGLX_H_
+#define LIBANGLE_RENDERER_GL_GLX_FUNCTIONSGLX_H_
+
+#include &lt;string&gt;
+#include &lt;vector&gt;
+
+#include &quot;libANGLE/renderer/gl/glx/platform_glx.h&quot;
+
+namespace rx
+{
+
+class FunctionsGLX
+{
+  public:
+    FunctionsGLX();
+    ~FunctionsGLX();
+
+    // Load data from GLX, can be called multiple times
+    bool initialize(Display *xDisplay, int screen, std::string *errorString);
+    void terminate();
+
+    bool hasExtension(const char *extension) const;
+    int majorVersion;
+    int minorVersion;
+
+    Display *getDisplay() const;
+    int getScreen() const;
+
+    PFNGETPROCPROC getProc;
+
+    // GLX 1.0
+    glx::Context createContext(XVisualInfo *visual, glx::Context share, bool direct) const;
+    void destroyContext(glx::Context context) const;
+    Bool makeCurrent(glx::Drawable drawable, glx::Context context) const;
+    void swapBuffers(glx::Drawable drawable) const;
+    Bool queryExtension(int *errorBase, int *event) const;
+    Bool queryVersion(int *major, int *minor) const;
+    glx::Context getCurrentContext() const;
+    glx::Drawable getCurrentDrawable() const;
+    void waitX() const;
+    void waitGL() const;
+
+    // GLX 1.1
+    const char *queryExtensionsString() const;
+
+    // GLX 1.3
+    glx::FBConfig *getFBConfigs(int *nElements) const;
+    glx::FBConfig *chooseFBConfig(const int *attribList, int *nElements) const;
+    int getFBConfigAttrib(glx::FBConfig config, int attribute, int *value) const;
+    XVisualInfo *getVisualFromFBConfig(glx::FBConfig config) const;
+    glx::Window createWindow(glx::FBConfig config, Window window, const int *attribList) const;
+    void destroyWindow(glx::Window window) const;
+    glx::Pbuffer createPbuffer(glx::FBConfig config, const int *attribList) const;
+    void destroyPbuffer(glx::Pbuffer pbuffer) const;
+    void queryDrawable(glx::Drawable drawable, int attribute, unsigned int *value) const;
+
+    // GLX_ARB_create_context
+    glx::Context createContextAttribsARB(glx::FBConfig config, glx::Context shareContext, Bool direct, const int *attribList) const;
+
+    // GLX_EXT_swap_control
+    void swapIntervalEXT(glx::Drawable drawable, int interval) const;
+
+    // GLX_MESA_swap_control
+    int swapIntervalMESA(int interval) const;
+
+    // GLX_SGI_swap_control
+    int swapIntervalSGI(int interval) const;
+
+  private:
+    // So as to isolate GLX from angle we do not include angleutils.h and cannot
+    // use angle::NonCopyable so we replicated it here instead.
+    FunctionsGLX(const FunctionsGLX&amp;) = delete;
+    void operator=(const FunctionsGLX&amp;) = delete;
+
+    struct GLXFunctionTable;
+
+    static void *sLibHandle;
+    Display *mXDisplay;
+    int mXScreen;
+
+    GLXFunctionTable *mFnPtrs;
+    std::vector&lt;std::string&gt; mExtensions;
+};
+
+}
+
+#endif // LIBANGLE_RENDERER_GL_GLX_FUNCTIONSGLX_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxPbufferSurfaceGLXcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,142 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// PbufferSurfaceGLX.cpp: GLX implementation of egl::Surface for PBuffers
+
+#include &quot;libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h&quot;
+
+#include &quot;common/debug.h&quot;
+#include &quot;libANGLE/renderer/gl/glx/DisplayGLX.h&quot;
+#include &quot;libANGLE/renderer/gl/glx/FunctionsGLX.h&quot;
+
+namespace rx
+{
+
+PbufferSurfaceGLX::PbufferSurfaceGLX(RendererGL *renderer,
+                                     EGLint width,
+                                     EGLint height,
+                                     bool largest,
+                                     const FunctionsGLX &amp;glx,
+                                     glx::Context context,
+                                     glx::FBConfig fbConfig)
+    : SurfaceGLX(renderer),
+      mWidth(width),
+      mHeight(height),
+      mLargest(largest),
+      mGLX(glx),
+      mContext(context),
+      mFBConfig(fbConfig),
+      mPbuffer(0)
+{
+}
+
+PbufferSurfaceGLX::~PbufferSurfaceGLX()
+{
+    if (mPbuffer)
+    {
+        mGLX.destroyPbuffer(mPbuffer);
+    }
+}
+
+egl::Error PbufferSurfaceGLX::initialize()
+{
+    // Avoid creating 0-sized PBuffers as it fails on the Intel Mesa driver
+    // as commented on https://bugs.freedesktop.org/show_bug.cgi?id=38869 so we
+    // use (w, 1) or (1, h) instead.
+    int width = std::max(1, static_cast&lt;int&gt;(mWidth));
+    int height = std::max(1, static_cast&lt;int&gt;(mHeight));
+
+    const int attribs[] =
+    {
+        GLX_PBUFFER_WIDTH, width,
+        GLX_PBUFFER_HEIGHT, height,
+        GLX_LARGEST_PBUFFER, mLargest,
+        None
+    };
+
+    mPbuffer = mGLX.createPbuffer(mFBConfig, attribs);
+    if (!mPbuffer)
+    {
+        return egl::Error(EGL_BAD_ALLOC, &quot;Failed to create a native GLX pbuffer.&quot;);
+    }
+
+    if (mLargest)
+    {
+        mGLX.queryDrawable(mPbuffer, GLX_WIDTH, &amp;mWidth);
+        mGLX.queryDrawable(mPbuffer, GLX_HEIGHT, &amp;mHeight);
+    }
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceGLX::makeCurrent()
+{
+    if (mGLX.makeCurrent(mPbuffer, mContext) != True)
+    {
+        return egl::Error(EGL_BAD_DISPLAY);
+    }
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceGLX::swap()
+{
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceGLX::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+{
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceGLX::querySurfacePointerANGLE(EGLint attribute, void **value)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceGLX::bindTexImage(gl::Texture *texture, EGLint buffer)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error PbufferSurfaceGLX::releaseTexImage(EGLint buffer)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+void PbufferSurfaceGLX::setSwapInterval(EGLint interval)
+{
+}
+
+EGLint PbufferSurfaceGLX::getWidth() const
+{
+    return mWidth;
+}
+
+EGLint PbufferSurfaceGLX::getHeight() const
+{
+    return mHeight;
+}
+
+EGLint PbufferSurfaceGLX::isPostSubBufferSupported() const
+{
+    UNIMPLEMENTED();
+    return EGL_FALSE;
+}
+
+EGLint PbufferSurfaceGLX::getSwapBehavior() const
+{
+    return EGL_BUFFER_PRESERVED;
+}
+
+egl::Error PbufferSurfaceGLX::checkForResize()
+{
+    // The size of pbuffers never change
+    return egl::Error(EGL_SUCCESS);
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxPbufferSurfaceGLXh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,63 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// PBufferSurfaceGLX.h: GLX implementation of egl::Surface for PBuffers
+
+#ifndef LIBANGLE_RENDERER_GL_GLX_PBUFFERSURFACEGLX_H_
+#define LIBANGLE_RENDERER_GL_GLX_PBUFFERSURFACEGLX_H_
+
+#include &quot;libANGLE/renderer/gl/glx/platform_glx.h&quot;
+#include &quot;libANGLE/renderer/gl/glx/SurfaceGLX.h&quot;
+
+namespace rx
+{
+
+class FunctionsGLX;
+
+class PbufferSurfaceGLX : public SurfaceGLX
+{
+  public:
+    PbufferSurfaceGLX(RendererGL *renderer,
+                      EGLint width,
+                      EGLint height,
+                      bool largest,
+                      const FunctionsGLX &amp;glx,
+                      glx::Context context,
+                      glx::FBConfig fbConfig);
+    ~PbufferSurfaceGLX() override;
+
+    egl::Error initialize() override;
+    egl::Error makeCurrent() override;
+
+    egl::Error swap() override;
+    egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
+    egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
+    egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
+    egl::Error releaseTexImage(EGLint buffer) override;
+    void setSwapInterval(EGLint interval) override;
+
+    EGLint getWidth() const override;
+    EGLint getHeight() const override;
+
+    EGLint isPostSubBufferSupported() const override;
+    EGLint getSwapBehavior() const override;
+
+    egl::Error checkForResize() override;
+
+  private:
+    unsigned mWidth;
+    unsigned mHeight;
+    bool mLargest;
+
+    const FunctionsGLX &amp;mGLX;
+    glx::Context mContext;
+    glx::FBConfig mFBConfig;
+    glx::Pbuffer mPbuffer;
+};
+
+}
+
+#endif // LIBANGLE_RENDERER_GL_GLX_PBUFFERSURFACEGLX_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxSurfaceGLXh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/SurfaceGLX.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/SurfaceGLX.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/SurfaceGLX.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,26 @@
</span><ins>+//
+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// SurfaceGLX.h: common interface for GLX surfaces
+
+#ifndef LIBANGLE_RENDERER_GL_GLX_SURFACEGLX_H_
+#define LIBANGLE_RENDERER_GL_GLX_SURFACEGLX_H_
+
+#include &quot;libANGLE/renderer/gl/SurfaceGL.h&quot;
+
+namespace rx
+{
+
+class SurfaceGLX : public SurfaceGL
+{
+  public:
+    SurfaceGLX(RendererGL *renderer) : SurfaceGL(renderer) {}
+
+    virtual egl::Error checkForResize() = 0;
+};
+}
+
+#endif  // LIBANGLE_RENDERER_GL_GLX_SURFACEGLX_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxWindowSurfaceGLXcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,243 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// WindowSurfaceGLX.cpp: GLX implementation of egl::Surface for windows
+
+#include &quot;libANGLE/renderer/gl/glx/WindowSurfaceGLX.h&quot;
+
+#include &quot;common/debug.h&quot;
+
+#include &quot;libANGLE/renderer/gl/glx/DisplayGLX.h&quot;
+#include &quot;libANGLE/renderer/gl/glx/FunctionsGLX.h&quot;
+
+namespace rx
+{
+
+static int IgnoreX11Errors(Display *, XErrorEvent *)
+{
+    return 0;
+}
+
+WindowSurfaceGLX::WindowSurfaceGLX(const FunctionsGLX &amp;glx,
+                                   DisplayGLX *glxDisplay,
+                                   RendererGL *renderer,
+                                   Window window,
+                                   Display *display,
+                                   glx::Context context,
+                                   glx::FBConfig fbConfig)
+    : SurfaceGLX(renderer),
+      mParent(window),
+      mWindow(0),
+      mDisplay(display),
+      mGLX(glx),
+      mGLXDisplay(glxDisplay),
+      mContext(context),
+      mFBConfig(fbConfig),
+      mGLXWindow(0)
+{
+}
+
+WindowSurfaceGLX::~WindowSurfaceGLX()
+{
+    if (mGLXWindow)
+    {
+        mGLX.destroyWindow(mGLXWindow);
+    }
+
+    if (mWindow)
+    {
+        // When destroying the window, it may happen that the window has already been
+        // destroyed by the application (this happens in Chromium). There is no way to
+        // atomically check that a window exists and to destroy it so instead we call
+        // XDestroyWindow, ignoring any errors.
+        auto oldErrorHandler = XSetErrorHandler(IgnoreX11Errors);
+        XDestroyWindow(mDisplay, mWindow);
+        XSync(mDisplay, False);
+        XSetErrorHandler(oldErrorHandler);
+    }
+
+    mGLXDisplay-&gt;syncXCommands();
+}
+
+egl::Error WindowSurfaceGLX::initialize()
+{
+    // Check that the window's visual ID is valid, as part of the AMGLE_x11_visual
+    // extension.
+    {
+        XWindowAttributes windowAttributes;
+        XGetWindowAttributes(mDisplay, mParent, &amp;windowAttributes);
+        unsigned long visualId = windowAttributes.visual-&gt;visualid;
+
+        if (!mGLXDisplay-&gt;isValidWindowVisualId(visualId))
+        {
+            return egl::Error(EGL_BAD_MATCH,
+                              &quot;The visual of native_window doesn't match the visual given with &quot;
+                              &quot;ANGLE_X11_VISUAL_ID&quot;);
+        }
+    }
+
+    // The visual of the X window, GLX window and GLX context must match,
+    // however we received a user-created window that can have any visual
+    // and wouldn't work with our GLX context. To work in all cases, we
+    // create a child window with the right visual that covers all of its
+    // parent.
+    XVisualInfo *visualInfo = mGLX.getVisualFromFBConfig(mFBConfig);
+    if (!visualInfo)
+    {
+        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to get the XVisualInfo for the child window.&quot;);
+    }
+    Visual* visual = visualInfo-&gt;visual;
+
+    if (!getWindowDimensions(mParent, &amp;mParentWidth, &amp;mParentHeight))
+    {
+        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to get the parent window's dimensions.&quot;);
+    }
+
+    // The depth, colormap and visual must match otherwise we get a X error
+    // so we specify the colormap attribute. Also we do not want the window
+    // to be taken into account for input so we specify the event and
+    // do-not-propagate masks to 0 (the defaults). Finally we specify the
+    // border pixel attribute so that we can use a different visual depth
+    // than our parent (seems like X uses that as a condition to render
+    // the subwindow in a different buffer)
+    XSetWindowAttributes attributes;
+    unsigned long attributeMask = CWColormap | CWBorderPixel;
+
+    Colormap colormap = XCreateColormap(mDisplay, mParent, visual, AllocNone);
+    if(!colormap)
+    {
+        XFree(visualInfo);
+        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to create the Colormap for the child window.&quot;);
+    }
+    attributes.colormap = colormap;
+    attributes.border_pixel = 0;
+
+    //TODO(cwallez) set up our own error handler to see if the call failed
+    mWindow = XCreateWindow(mDisplay, mParent, 0, 0, mParentWidth, mParentHeight,
+                            0, visualInfo-&gt;depth, InputOutput, visual, attributeMask, &amp;attributes);
+    mGLXWindow = mGLX.createWindow(mFBConfig, mWindow, nullptr);
+
+    XMapWindow(mDisplay, mWindow);
+    XFlush(mDisplay);
+
+    XFree(visualInfo);
+    XFreeColormap(mDisplay, colormap);
+
+    mGLXDisplay-&gt;syncXCommands();
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceGLX::makeCurrent()
+{
+    if (mGLX.makeCurrent(mGLXWindow, mContext) != True)
+    {
+        return egl::Error(EGL_BAD_DISPLAY);
+    }
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceGLX::swap()
+{
+    // We need to swap before resizing as some drivers clobber the back buffer
+    // when the window is resized.
+    mGLXDisplay-&gt;setSwapInterval(mGLXWindow, &amp;mSwapControl);
+    mGLX.swapBuffers(mGLXWindow);
+
+    egl::Error error = checkForResize();
+    if (error.isError())
+    {
+        return error;
+    }
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceGLX::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceGLX::querySurfacePointerANGLE(EGLint attribute, void **value)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceGLX::bindTexImage(gl::Texture *texture, EGLint buffer)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error WindowSurfaceGLX::releaseTexImage(EGLint buffer)
+{
+    UNIMPLEMENTED();
+    return egl::Error(EGL_SUCCESS);
+}
+
+void WindowSurfaceGLX::setSwapInterval(EGLint interval)
+{
+    mSwapControl.targetSwapInterval = interval;
+}
+
+EGLint WindowSurfaceGLX::getWidth() const
+{
+    // The size of the window is always the same as the cached size of its parent.
+    return mParentWidth;
+}
+
+EGLint WindowSurfaceGLX::getHeight() const
+{
+    // The size of the window is always the same as the cached size of its parent.
+    return mParentHeight;
+}
+
+EGLint WindowSurfaceGLX::isPostSubBufferSupported() const
+{
+    UNIMPLEMENTED();
+    return EGL_FALSE;
+}
+
+EGLint WindowSurfaceGLX::getSwapBehavior() const
+{
+    return EGL_BUFFER_PRESERVED;
+}
+
+egl::Error WindowSurfaceGLX::checkForResize()
+{
+    // TODO(cwallez) set up our own error handler to see if the call failed
+    unsigned int newParentWidth, newParentHeight;
+    if (!getWindowDimensions(mParent, &amp;newParentWidth, &amp;newParentHeight))
+    {
+        return egl::Error(EGL_BAD_CURRENT_SURFACE,
+                          &quot;Failed to retrieve the size of the parent window.&quot;);
+    }
+
+    if (mParentWidth != newParentWidth || mParentHeight != newParentHeight)
+    {
+        mParentWidth  = newParentWidth;
+        mParentHeight = newParentHeight;
+
+        mGLX.waitGL();
+        XResizeWindow(mDisplay, mWindow, mParentWidth, mParentHeight);
+        mGLX.waitX();
+        XSync(mDisplay, False);
+    }
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+bool WindowSurfaceGLX::getWindowDimensions(Window window, unsigned int *width, unsigned int *height) const
+{
+    Window root;
+    int x, y;
+    unsigned int border, depth;
+    return XGetGeometry(mDisplay, window, &amp;root, &amp;x, &amp;y, width, height, &amp;border, &amp;depth) != 0;
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxWindowSurfaceGLXh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,72 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// WindowSurfaceGLX.h: GLX implementation of egl::Surface for windows
+
+#ifndef LIBANGLE_RENDERER_GL_GLX_WINDOWSURFACEGLX_H_
+#define LIBANGLE_RENDERER_GL_GLX_WINDOWSURFACEGLX_H_
+
+#include &quot;libANGLE/renderer/gl/glx/DisplayGLX.h&quot;
+#include &quot;libANGLE/renderer/gl/glx/platform_glx.h&quot;
+#include &quot;libANGLE/renderer/gl/glx/SurfaceGLX.h&quot;
+
+namespace rx
+{
+
+class DisplayGLX;
+class FunctionsGLX;
+
+class WindowSurfaceGLX : public SurfaceGLX
+{
+  public:
+    WindowSurfaceGLX(const FunctionsGLX &amp;glx,
+                     DisplayGLX *glxDisplay,
+                     RendererGL *renderer,
+                     Window window,
+                     Display *display,
+                     glx::Context context,
+                     glx::FBConfig fbConfig);
+    ~WindowSurfaceGLX() override;
+
+    egl::Error initialize() override;
+    egl::Error makeCurrent() override;
+
+    egl::Error swap() override;
+    egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
+    egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
+    egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
+    egl::Error releaseTexImage(EGLint buffer) override;
+    void setSwapInterval(EGLint interval) override;
+
+    EGLint getWidth() const override;
+    EGLint getHeight() const override;
+
+    EGLint isPostSubBufferSupported() const override;
+    EGLint getSwapBehavior() const override;
+
+    egl::Error checkForResize() override;
+
+  private:
+    bool getWindowDimensions(Window window, unsigned int *width, unsigned int *height) const;
+
+    Window mParent;
+    unsigned int mParentWidth, mParentHeight;
+    Window mWindow;
+    Display *mDisplay;
+
+    const FunctionsGLX &amp;mGLX;
+    DisplayGLX *mGLXDisplay;
+
+    glx::Context mContext;
+    glx::FBConfig mFBConfig;
+    glx::Window mGLXWindow;
+
+    SwapControlData mSwapControl;
+};
+
+}
+
+#endif // LIBANGLE_RENDERER_GL_GLX_WINDOWSURFACEGLX_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxfunctionsglx_typedefsh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/functionsglx_typedefs.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/functionsglx_typedefs.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/functionsglx_typedefs.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,52 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// functionsglx_typedefs.h: Typedefs of GLX functions.
+
+#ifndef LIBANGLE_RENDERER_GL_GLX_FUNCTIONSGLXTYPEDEFS_H_
+#define LIBANGLE_RENDERER_GL_GLX_FUNCTIONSGLXTYPEDEFS_H_
+
+#include &quot;libANGLE/renderer/gl/glx/platform_glx.h&quot;
+
+namespace rx
+{
+
+// Only the functions of GLX 1.2 and earlier need to be typdefed; the other
+// functions are already typedefed in glx.h
+
+// GLX 1.0
+typedef XVisualInfo *(*PFNGLXCHOOSEVISUALPROC) (Display *dpy, int screen, int *attribList);
+typedef GLXContext (*PFNGLXCREATECONTEXTPROC) (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
+typedef void (*PFNGLXDESTROYCONTEXTPROC) (Display *dpy, GLXContext ctx);
+typedef Bool (*PFNGLXMAKECURRENTPROC) (Display *dpy, GLXDrawable drawable, GLXContext ctx);
+typedef void (*PFNGLXCOPYCONTEXTPROC) (Display *dpy, GLXContext src, GLXContext dst, unsigned long mask);
+typedef void (*PFNGLXSWAPBUFFERSPROC) (Display *dpy, GLXDrawable drawable);
+typedef GLXPixmap (*PFNGLXCREATEGLXPIXMAPPROC) (Display *dpy, XVisualInfo *visual, Pixmap pixmap);
+typedef void (*PFNGLXDESTROYGLXPIXMAPPROC) (Display *dpy, GLXPixmap pixmap);
+typedef Bool (*PFNGLXQUERYEXTENSIONPROC) (Display *dpy, int *errorb, int *event);
+typedef Bool (*PFNGLXQUERYVERSIONPROC) (Display *dpy, int *maj, int *min);
+typedef Bool (*PFNGLXISDIRECTPROC) (Display *dpy, GLXContext ctx);
+typedef int (*PFNGLXGETCONFIGPROC) (Display *dpy, XVisualInfo *visual, int attrib, int *value);
+typedef GLXContext (*PFNGLXGETCURRENTCONTEXTPROC) ();
+typedef GLXDrawable (*PFNGLXGETCURRENTDRAWABLEPROC) ();
+typedef GLXContext (*PFNGLXGETCURRENTCONTEXTPROC) ();
+typedef GLXDrawable (*PFNGLXGETCURRENTDRAWABLEPROC) ();
+typedef void (*PFNGLXWAITGLPROC) ();
+typedef void (*PFNGLXWAITXPROC) ();
+typedef void (*PFNGLXUSEXFONT) (Font font, int first, int count, int list);
+
+// GLX 1.1
+typedef const char *(*PFNGLXQUERYEXTENSIONSSTRINGPROC) (Display *dpy, int screen);
+typedef const char *(*PFNGLXQUERYSERVERSTRINGPROC) (Display *dpy, int screen, int name);
+typedef const char *(*PFNGLXGETCLIENTSTRINGPROC) (Display *dpy, int name);
+
+
+// GLX 1.2
+typedef Display *(*PFNGLXGETCURRENTDISPLAYPROC) ();
+
+}
+
+#endif // LIBANGLE_RENDERER_GL_GLX_FUNCTIONSGLXTYPEDEFS_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglglxplatform_glxh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/platform_glx.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/platform_glx.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/glx/platform_glx.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,184 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// platform_glx.h: Includes specific to GLX.
+
+#ifndef LIBANGLE_RENDERER_GL_GLX_PLATFORMGLX_H_
+#define LIBANGLE_RENDERER_GL_GLX_PLATFORMGLX_H_
+
+#if !defined(ANGLE_SKIP_GLX_DEFINES)
+// GLX 1.0
+#define GLX_USE_GL 1
+#define GLX_BUFFER_SIZE 2
+#define GLX_LEVEL 3
+#define GLX_RGBA 4
+#define GLX_DOUBLEBUFFER 5
+#define GLX_STEREO 6
+#define GLX_AUX_BUFFERS 7
+#define GLX_RED_SIZE 8
+#define GLX_GREEN_SIZE 9
+#define GLX_BLUE_SIZE 10
+#define GLX_ALPHA_SIZE 11
+#define GLX_DEPTH_SIZE 12
+#define GLX_STENCIL_SIZE 13
+#define GLX_ACCUM_RED_SIZE 14
+#define GLX_ACCUM_GREEN_SIZE 15
+#define GLX_ACCUM_BLUE_SIZE 16
+#define GLX_ACCUM_ALPHA_SIZE 17
+
+#define GLX_BAD_SCREEN 1
+#define GLX_BAD_ATTRIBUTE 2
+#define GLX_NO_EXTENSION 3
+#define GLX_BAD_VISUAL 4
+#define GLX_BAD_CONTEXT 5
+#define GLX_BAD_VALUE 6
+#define GLX_BAD_ENUM 7
+
+// GLX 1.1
+#define GLX_VENDOR 1
+#define GLX_VERSION 2
+#define GLX_EXTENSIONS 3
+
+// GLX 1.3
+#define GLX_CONFIG_CAVEAT 0x20
+#define GLX_DONT_CARE 0xFFFFFFFF
+#define GLX_X_VISUAL_TYPE 0x22
+#define GLX_TRANSPARENT_TYPE 0x23
+#define GLX_TRANSPARENT_INDEX_VALUE 0x24
+#define GLX_TRANSPARENT_RED_VALUE 0x25
+#define GLX_TRANSPARENT_GREEN_VALUE 0x26
+#define GLX_TRANSPARENT_BLUE_VALUE 0x27
+#define GLX_TRANSPARENT_ALPHA_VALUE 0x28
+#define GLX_WINDOW_BIT 0x00000001
+#define GLX_PIXMAP_BIT 0x00000002
+#define GLX_PBUFFER_BIT 0x00000004
+#define GLX_AUX_BUFFERS_BIT 0x00000010
+#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001
+#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002
+#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004
+#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008
+#define GLX_DEPTH_BUFFER_BIT 0x00000020
+#define GLX_STENCIL_BUFFER_BIT 0x00000040
+#define GLX_ACCUM_BUFFER_BIT 0x00000080
+#define GLX_NONE 0x8000
+#define GLX_SLOW_CONFIG 0x8001
+#define GLX_TRUE_COLOR 0x8002
+#define GLX_DIRECT_COLOR 0x8003
+#define GLX_PSEUDO_COLOR 0x8004
+#define GLX_STATIC_COLOR 0x8005
+#define GLX_GRAY_SCALE 0x8006
+#define GLX_STATIC_GRAY 0x8007
+#define GLX_TRANSPARENT_RGB 0x8008
+#define GLX_TRANSPARENT_INDEX 0x8009
+#define GLX_VISUAL_ID 0x800B
+#define GLX_SCREEN 0x800C
+#define GLX_NON_CONFORMANT_CONFIG 0x800D
+#define GLX_DRAWABLE_TYPE 0x8010
+#define GLX_RENDER_TYPE 0x8011
+#define GLX_X_RENDERABLE 0x8012
+#define GLX_FBCONFIG_ID 0x8013
+#define GLX_RGBA_TYPE 0x8014
+#define GLX_COLOR_INDEX_TYPE 0x8015
+#define GLX_MAX_PBUFFER_WIDTH 0x8016
+#define GLX_MAX_PBUFFER_HEIGHT 0x8017
+#define GLX_MAX_PBUFFER_PIXELS 0x8018
+#define GLX_PRESERVED_CONTENTS 0x801B
+#define GLX_LARGEST_PBUFFER 0x801C
+#define GLX_WIDTH 0x801D
+#define GLX_HEIGHT 0x801E
+#define GLX_EVENT_MASK 0x801F
+#define GLX_DAMAGED 0x8020
+#define GLX_SAVED 0x8021
+#define GLX_WINDOW 0x8022
+#define GLX_PBUFFER 0x8023
+#define GLX_PBUFFER_HEIGHT 0x8040
+#define GLX_PBUFFER_WIDTH 0x8041
+#define GLX_RGBA_BIT 0x00000001
+#define GLX_COLOR_INDEX_BIT 0x00000002
+#define GLX_PBUFFER_CLOBBER_MASK 0x08000000
+
+// GLX 1.4
+#define GLX_SAMPLE_BUFFERS 0x186a0
+#define GLX_SAMPLES 0x186a1
+
+// GLX_ARB_create_context
+#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001
+#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
+#define GLX_CONTEXT_FLAGS_ARB 0x2094
+
+// GLX_ARB_create_context_profile
+#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
+
+// GLX_EXT_create_context_es2_profile
+#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
+
+// GLX_EXT_texture_from_pixmap
+#define GLX_TEXTURE_1D_BIT_EXT 0x00000001
+#define GLX_TEXTURE_2D_BIT_EXT 0x00000002
+#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004
+#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0
+#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1
+#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2
+#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3
+#define GLX_Y_INVERTED_EXT 0x20D4
+#define GLX_TEXTURE_FORMAT_EXT 0x20D5
+#define GLX_TEXTURE_TARGET_EXT 0x20D6
+#define GLX_MIPMAP_TEXTURE_EXT 0x20D7
+#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8
+#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9
+#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA
+#define GLX_TEXTURE_1D_EXT 0x20DB
+#define GLX_TEXTURE_2D_EXT 0x20DC
+#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD
+#define GLX_FRONT_LEFT_EXT 0x20DE
+#define GLX_FRONT_RIGHT_EXT 0x20DF
+#define GLX_BACK_LEFT_EXT 0x20E0
+#define GLX_BACK_RIGHT_EXT 0x20E1
+#define GLX_FRONT_EXT 0x20DE
+#define GLX_BACK_EXT 0x20E0
+#define GLX_AUX0_EXT 0x20E2
+#define GLX_AUX1_EXT 0x20E3
+#define GLX_AUX2_EXT 0x20E4
+#define GLX_AUX3_EXT 0x20E5
+#define GLX_AUX4_EXT 0x20E6
+#define GLX_AUX5_EXT 0x20E7
+#define GLX_AUX6_EXT 0x20E8
+#define GLX_AUX7_EXT 0x20E9
+#define GLX_AUX8_EXT 0x20EA
+#define GLX_AUX9_EXT 0x20EB
+
+// GLX_EXT_swap_control
+#define GLX_SWAP_INTERVAL_EXT 0x20F1
+#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2
+#endif // !defined(ANGLE_SKIP_GLX_DEFINES)
+
+// GLX typedefs depend on the X headers
+#include &lt;X11/Xlib.h&gt;
+#include &lt;X11/Xresource.h&gt;
+#include &lt;X11/Xutil.h&gt;
+
+// GLX typedefs
+namespace glx
+{
+
+typedef void *Context;
+typedef void *FBConfig;
+typedef XID FBConfigID;
+typedef XID ContextID;
+typedef XID Window;
+typedef XID Pbuffer;
+typedef XID Pixmap;
+typedef XID Drawable;
+
+}
+
+typedef void* (*PFNGETPROCPROC) (const char *name);
+
+#endif // LIBANGLE_RENDERER_GL_GLX_PLATFORMGLX_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglrenderergl_utilscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><span class="cx"> 
</span><del>-// renderer11_utils.cpp: Conversion functions and other utility routines
</del><ins>+// renderergl_utils.cpp: Conversion functions and other utility routines
</ins><span class="cx"> // specific to the OpenGL renderer.
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/renderergl_utils.h&quot;
</span><span class="lines">@@ -14,24 +14,78 @@
</span><span class="cx"> #include &quot;libANGLE/Caps.h&quot;
</span><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/FunctionsGL.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/WorkaroundsGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/formatutilsgl.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;algorithm&gt;
</span><ins>+#include &lt;sstream&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><ins>+VendorID GetVendorID(const FunctionsGL *functions)
+{
+    std::string nativeVendorString(reinterpret_cast&lt;const char *&gt;(functions-&gt;getString(GL_VENDOR)));
+    if (nativeVendorString.find(&quot;Intel&quot;) != std::string::npos)
+    {
+        return VENDOR_ID_INTEL;
+    }
+    else if (nativeVendorString.find(&quot;NVIDIA&quot;) != std::string::npos)
+    {
+        return VENDOR_ID_NVIDIA;
+    }
+    else if (nativeVendorString.find(&quot;ATI&quot;) != std::string::npos ||
+             nativeVendorString.find(&quot;AMD&quot;) != std::string::npos)
+    {
+        return VENDOR_ID_AMD;
+    }
+    else
+    {
+        return VENDOR_ID_UNKNOWN;
+    }
+}
</ins><span class="cx"> 
</span><span class="cx"> namespace nativegl_gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+static bool MeetsRequirements(const FunctionsGL *functions, const nativegl::SupportRequirement &amp;requirements)
+{
+    for (const std::string &amp;extension : requirements.requiredExtensions)
+    {
+        if (!functions-&gt;hasExtension(extension))
+        {
+            return false;
+        }
+    }
+
+    if (functions-&gt;version &gt;= requirements.version)
+    {
+        return true;
+    }
+    else if (!requirements.versionExtensions.empty())
+    {
+        for (const std::string &amp;extension : requirements.versionExtensions)
+        {
+            if (!functions-&gt;hasExtension(extension))
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
</ins><span class="cx"> static gl::TextureCaps GenerateTextureFormatCaps(const FunctionsGL *functions, GLenum internalFormat)
</span><span class="cx"> {
</span><span class="cx">     gl::TextureCaps textureCaps;
</span><span class="cx"> 
</span><del>-    const nativegl::InternalFormat &amp;formatInfo = nativegl::GetInternalFormatInfo(internalFormat);
-    textureCaps.texturable = formatInfo.textureSupport(functions-&gt;majorVersion, functions-&gt;minorVersion, functions-&gt;extensions);
-    textureCaps.renderable = formatInfo.renderSupport(functions-&gt;majorVersion, functions-&gt;minorVersion, functions-&gt;extensions);
-    textureCaps.filterable = formatInfo.filterSupport(functions-&gt;majorVersion, functions-&gt;minorVersion, functions-&gt;extensions);
</del><ins>+    const nativegl::InternalFormat &amp;formatInfo = nativegl::GetInternalFormatInfo(internalFormat, functions-&gt;standard);
+    textureCaps.texturable = MeetsRequirements(functions, formatInfo.texture);
+    textureCaps.filterable = textureCaps.texturable &amp;&amp; MeetsRequirements(functions, formatInfo.filter);
+    textureCaps.renderable = MeetsRequirements(functions, formatInfo.framebufferAttachment);
</ins><span class="cx"> 
</span><span class="cx">     // glGetInternalformativ is not available until version 4.2 but may be available through the 3.0
</span><span class="cx">     // extension GL_ARB_internalformat_query
</span><span class="lines">@@ -43,7 +97,8 @@
</span><span class="cx">         if (numSamples &gt; 0)
</span><span class="cx">         {
</span><span class="cx">             std::vector&lt;GLint&gt; samples(numSamples);
</span><del>-            functions-&gt;getInternalformativ(GL_RENDERBUFFER, internalFormat, GL_SAMPLES, samples.size(), &amp;samples[0]);
</del><ins>+            functions-&gt;getInternalformativ(GL_RENDERBUFFER, internalFormat, GL_SAMPLES,
+                                           static_cast&lt;GLsizei&gt;(samples.size()), &amp;samples[0]);
</ins><span class="cx">             for (size_t sampleIndex = 0; sampleIndex &lt; samples.size(); sampleIndex++)
</span><span class="cx">             {
</span><span class="cx">                 textureCaps.sampleCounts.insert(samples[sampleIndex]);
</span><span class="lines">@@ -56,13 +111,63 @@
</span><span class="cx"> 
</span><span class="cx"> static GLint QuerySingleGLInt(const FunctionsGL *functions, GLenum name)
</span><span class="cx"> {
</span><del>-    GLint result;
</del><ins>+    GLint result = 0;
</ins><span class="cx">     functions-&gt;getIntegerv(name, &amp;result);
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static GLint QueryGLIntRange(const FunctionsGL *functions, GLenum name, size_t index)
+{
+    GLint result[2] = {};
+    functions-&gt;getIntegerv(name, result);
+    return result[index];
+}
+
+static GLint64 QuerySingleGLInt64(const FunctionsGL *functions, GLenum name)
+{
+    GLint64 result = 0;
+    functions-&gt;getInteger64v(name, &amp;result);
+    return result;
+}
+
+static GLfloat QuerySingleGLFloat(const FunctionsGL *functions, GLenum name)
+{
+    GLfloat result = 0.0f;
+    functions-&gt;getFloatv(name, &amp;result);
+    return result;
+}
+
+static GLfloat QueryGLFloatRange(const FunctionsGL *functions, GLenum name, size_t index)
+{
+    GLfloat result[2] = {};
+    functions-&gt;getFloatv(name, result);
+    return result[index];
+}
+
+static gl::TypePrecision QueryTypePrecision(const FunctionsGL *functions, GLenum shaderType, GLenum precisionType)
+{
+    gl::TypePrecision precision;
+    functions-&gt;getShaderPrecisionFormat(shaderType, precisionType, precision.range, &amp;precision.precision);
+    return precision;
+}
+
+static GLint QueryQueryValue(const FunctionsGL *functions, GLenum target, GLenum name)
+{
+    GLint result;
+    functions-&gt;getQueryiv(target, name, &amp;result);
+    return result;
+}
+
+static void LimitVersion(gl::Version *curVersion, const gl::Version &amp;maxVersion)
+{
+    if (*curVersion &gt;= maxVersion)
+    {
+        *curVersion = maxVersion;
+    }
+}
+
</ins><span class="cx"> void GenerateCaps(const FunctionsGL *functions, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap,
</span><del>-                  gl::Extensions *extensions)
</del><ins>+                  gl::Extensions *extensions, gl::Version *maxSupportedESVersion)
</ins><span class="cx"> {
</span><span class="cx">     // Texture format support checks
</span><span class="cx">     const gl::FormatSet &amp;allFormats = gl::GetAllSizedInternalFormats();
</span><span class="lines">@@ -77,87 +182,546 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Set some minimum GLES2 caps, TODO: query for real GL caps
</del><ins>+    // Start by assuming ES3 support and work down
+    *maxSupportedESVersion = gl::Version(3, 0);
</ins><span class="cx"> 
</span><span class="cx">     // Table 6.28, implementation dependent values
</span><del>-    caps-&gt;maxElementIndex = static_cast&lt;GLint64&gt;(std::numeric_limits&lt;unsigned int&gt;::max());
-    caps-&gt;max3DTextureSize = QuerySingleGLInt(functions, GL_MAX_3D_TEXTURE_SIZE);
-    caps-&gt;max2DTextureSize = QuerySingleGLInt(functions, GL_MAX_TEXTURE_SIZE);
-    caps-&gt;maxCubeMapTextureSize = QuerySingleGLInt(functions, GL_MAX_CUBE_MAP_TEXTURE_SIZE);
-    caps-&gt;maxArrayTextureLayers = QuerySingleGLInt(functions, GL_MAX_ARRAY_TEXTURE_LAYERS);
-    caps-&gt;maxLODBias = 2.0f;
-    caps-&gt;maxRenderbufferSize = QuerySingleGLInt(functions, GL_MAX_RENDERBUFFER_SIZE);
-    caps-&gt;maxDrawBuffers = QuerySingleGLInt(functions, GL_MAX_DRAW_BUFFERS);
-    caps-&gt;maxColorAttachments = QuerySingleGLInt(functions, GL_MAX_COLOR_ATTACHMENTS);
-    caps-&gt;maxViewportWidth = caps-&gt;max2DTextureSize;
-    caps-&gt;maxViewportHeight = caps-&gt;maxViewportWidth;
-    caps-&gt;minAliasedPointSize = 1.0f;
-    caps-&gt;maxAliasedPointSize = 1.0f;
-    caps-&gt;minAliasedLineWidth = 1.0f;
-    caps-&gt;maxAliasedLineWidth = 1.0f;
</del><ins>+    if (functions-&gt;isAtLeastGL(gl::Version(4, 3)) || functions-&gt;hasGLExtension(&quot;GL_ARB_ES3_compatibility&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxElementIndex = QuerySingleGLInt64(functions, GL_MAX_ELEMENT_INDEX);
+    }
+    else
+    {
+        // Doesn't affect ES3 support, can use a pre-defined limit
+        caps-&gt;maxElementIndex = static_cast&lt;GLint64&gt;(std::numeric_limits&lt;unsigned int&gt;::max());
+    }
</ins><span class="cx"> 
</span><ins>+    if (functions-&gt;isAtLeastGL(gl::Version(1, 2)) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_OES_texture_3D&quot;))
+    {
+        caps-&gt;max3DTextureSize = QuerySingleGLInt(functions, GL_MAX_3D_TEXTURE_SIZE);
+    }
+    else
+    {
+        // Can't support ES3 without 3D textures
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    caps-&gt;max2DTextureSize = QuerySingleGLInt(functions, GL_MAX_TEXTURE_SIZE); // GL 1.0 / ES 2.0
+    caps-&gt;maxCubeMapTextureSize = QuerySingleGLInt(functions, GL_MAX_CUBE_MAP_TEXTURE_SIZE); // GL 1.3 / ES 2.0
+
+    if (functions-&gt;isAtLeastGL(gl::Version(3, 0)) || functions-&gt;hasGLExtension(&quot;GL_EXT_texture_array&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxArrayTextureLayers = QuerySingleGLInt(functions, GL_MAX_ARRAY_TEXTURE_LAYERS);
+    }
+    else
+    {
+        // Can't support ES3 without array textures
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(1, 5)) || functions-&gt;hasGLExtension(&quot;GL_EXT_texture_lod_bias&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxLODBias = QuerySingleGLFloat(functions, GL_MAX_TEXTURE_LOD_BIAS);
+    }
+    else
+    {
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(3, 0)) || functions-&gt;hasGLExtension(&quot;GL_EXT_framebuffer_object&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(2, 0)))
+    {
+        caps-&gt;maxRenderbufferSize = QuerySingleGLInt(functions, GL_MAX_RENDERBUFFER_SIZE);
+        caps-&gt;maxColorAttachments = QuerySingleGLInt(functions, GL_MAX_COLOR_ATTACHMENTS);
+    }
+    else
+    {
+        // Can't support ES2 without framebuffers and renderbuffers
+        LimitVersion(maxSupportedESVersion, gl::Version(0, 0));
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(2, 0)) || functions-&gt;hasGLExtension(&quot;ARB_draw_buffers&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_EXT_draw_buffers&quot;))
+    {
+        caps-&gt;maxDrawBuffers = QuerySingleGLInt(functions, GL_MAX_DRAW_BUFFERS);
+    }
+    else
+    {
+        // Framebuffer is required to have at least one drawbuffer even if the extension is not
+        // supported
+        caps-&gt;maxDrawBuffers = 1;
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    caps-&gt;maxViewportWidth = QueryGLIntRange(functions, GL_MAX_VIEWPORT_DIMS, 0); // GL 1.0 / ES 2.0
+    caps-&gt;maxViewportHeight = QueryGLIntRange(functions, GL_MAX_VIEWPORT_DIMS, 1); // GL 1.0 / ES 2.0
+
+    if (functions-&gt;standard == STANDARD_GL_DESKTOP &amp;&amp;
+        (functions-&gt;profile &amp; GL_CONTEXT_CORE_PROFILE_BIT) != 0)
+    {
+        // Desktop GL core profile deprecated the GL_ALIASED_POINT_SIZE_RANGE query.  Use
+        // GL_POINT_SIZE_RANGE instead.
+        caps-&gt;minAliasedPointSize = QueryGLFloatRange(functions, GL_POINT_SIZE_RANGE, 0);
+        caps-&gt;maxAliasedPointSize = QueryGLFloatRange(functions, GL_POINT_SIZE_RANGE, 1);
+    }
+    else
+    {
+        caps-&gt;minAliasedPointSize = QueryGLFloatRange(functions, GL_ALIASED_POINT_SIZE_RANGE, 0);
+        caps-&gt;maxAliasedPointSize = QueryGLFloatRange(functions, GL_ALIASED_POINT_SIZE_RANGE, 1);
+    }
+
+    caps-&gt;minAliasedLineWidth = QueryGLFloatRange(functions, GL_ALIASED_LINE_WIDTH_RANGE, 0); // GL 1.2 / ES 2.0
+    caps-&gt;maxAliasedLineWidth = QueryGLFloatRange(functions, GL_ALIASED_LINE_WIDTH_RANGE, 1); // GL 1.2 / ES 2.0
+
</ins><span class="cx">     // Table 6.29, implementation dependent values (cont.)
</span><del>-    caps-&gt;maxElementsIndices = 0;
-    caps-&gt;maxElementsVertices = 0;
-    caps-&gt;vertexHighpFloat.setIEEEFloat();
-    caps-&gt;vertexMediumpFloat.setIEEEFloat();
-    caps-&gt;vertexLowpFloat.setIEEEFloat();
-    caps-&gt;fragmentHighpFloat.setIEEEFloat();
-    caps-&gt;fragmentMediumpFloat.setIEEEFloat();
-    caps-&gt;fragmentLowpFloat.setIEEEFloat();
-    caps-&gt;vertexHighpInt.setTwosComplementInt(32);
-    caps-&gt;vertexMediumpInt.setTwosComplementInt(32);
-    caps-&gt;vertexLowpInt.setTwosComplementInt(32);
-    caps-&gt;fragmentHighpInt.setTwosComplementInt(32);
-    caps-&gt;fragmentMediumpInt.setTwosComplementInt(32);
-    caps-&gt;fragmentLowpInt.setTwosComplementInt(32);
-    caps-&gt;maxServerWaitTimeout = 0;
</del><ins>+    if (functions-&gt;isAtLeastGL(gl::Version(1, 2)) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxElementsIndices = QuerySingleGLInt(functions, GL_MAX_ELEMENTS_INDICES);
+        caps-&gt;maxElementsVertices = QuerySingleGLInt(functions, GL_MAX_ELEMENTS_VERTICES);
+    }
+    else
+    {
+        // Doesn't impact supported version
+    }
</ins><span class="cx"> 
</span><ins>+    // glGetShaderPrecisionFormat is not available until desktop GL version 4.1 or GL_ARB_ES2_compatibility exists
+    if (functions-&gt;isAtLeastGL(gl::Version(4, 1)) || functions-&gt;hasGLExtension(&quot;GL_ARB_ES2_compatibility&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(2, 0)))
+    {
+        caps-&gt;vertexHighpFloat = QueryTypePrecision(functions, GL_VERTEX_SHADER, GL_HIGH_FLOAT);
+        caps-&gt;vertexMediumpFloat = QueryTypePrecision(functions, GL_VERTEX_SHADER, GL_MEDIUM_FLOAT);
+        caps-&gt;vertexLowpFloat = QueryTypePrecision(functions, GL_VERTEX_SHADER, GL_LOW_FLOAT);
+        caps-&gt;fragmentHighpFloat = QueryTypePrecision(functions, GL_FRAGMENT_SHADER, GL_HIGH_FLOAT);
+        caps-&gt;fragmentMediumpFloat = QueryTypePrecision(functions, GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT);
+        caps-&gt;fragmentLowpFloat = QueryTypePrecision(functions, GL_FRAGMENT_SHADER, GL_LOW_FLOAT);
+        caps-&gt;vertexHighpInt = QueryTypePrecision(functions, GL_VERTEX_SHADER, GL_HIGH_INT);
+        caps-&gt;vertexMediumpInt = QueryTypePrecision(functions, GL_VERTEX_SHADER, GL_MEDIUM_INT);
+        caps-&gt;vertexLowpInt = QueryTypePrecision(functions, GL_VERTEX_SHADER, GL_LOW_INT);
+        caps-&gt;fragmentHighpInt = QueryTypePrecision(functions, GL_FRAGMENT_SHADER, GL_HIGH_INT);
+        caps-&gt;fragmentMediumpInt = QueryTypePrecision(functions, GL_FRAGMENT_SHADER, GL_MEDIUM_INT);
+        caps-&gt;fragmentLowpInt = QueryTypePrecision(functions, GL_FRAGMENT_SHADER, GL_LOW_INT);
+    }
+    else
+    {
+        // Doesn't impact supported version, set some default values
+        caps-&gt;vertexHighpFloat.setIEEEFloat();
+        caps-&gt;vertexMediumpFloat.setIEEEFloat();
+        caps-&gt;vertexLowpFloat.setIEEEFloat();
+        caps-&gt;fragmentHighpFloat.setIEEEFloat();
+        caps-&gt;fragmentMediumpFloat.setIEEEFloat();
+        caps-&gt;fragmentLowpFloat.setIEEEFloat();
+        caps-&gt;vertexHighpInt.setTwosComplementInt(32);
+        caps-&gt;vertexMediumpInt.setTwosComplementInt(32);
+        caps-&gt;vertexLowpInt.setTwosComplementInt(32);
+        caps-&gt;fragmentHighpInt.setTwosComplementInt(32);
+        caps-&gt;fragmentMediumpInt.setTwosComplementInt(32);
+        caps-&gt;fragmentLowpInt.setTwosComplementInt(32);
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(3, 2)) || functions-&gt;hasGLExtension(&quot;GL_ARB_sync&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxServerWaitTimeout = QuerySingleGLInt64(functions, GL_MAX_SERVER_WAIT_TIMEOUT);
+    }
+    else
+    {
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
</ins><span class="cx">     // Table 6.31, implementation dependent vertex shader limits
</span><del>-    caps-&gt;maxVertexAttributes = 16;
-    caps-&gt;maxVertexUniformComponents = 1024;
-    caps-&gt;maxVertexUniformVectors = 256;
-    caps-&gt;maxVertexUniformBlocks = 12;
-    caps-&gt;maxVertexOutputComponents = 64;
-    caps-&gt;maxVertexTextureImageUnits = QuerySingleGLInt(functions, GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS);
</del><ins>+    if (functions-&gt;isAtLeastGL(gl::Version(2, 0)) ||
+        functions-&gt;isAtLeastGLES(gl::Version(2, 0)))
+    {
+        caps-&gt;maxVertexAttributes = QuerySingleGLInt(functions, GL_MAX_VERTEX_ATTRIBS);
+        caps-&gt;maxVertexUniformComponents = QuerySingleGLInt(functions, GL_MAX_VERTEX_UNIFORM_COMPONENTS);
+        caps-&gt;maxVertexTextureImageUnits = QuerySingleGLInt(functions, GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS);
+    }
+    else
+    {
+        // Can't support ES2 version without these caps
+        LimitVersion(maxSupportedESVersion, gl::Version(0, 0));
+    }
</ins><span class="cx"> 
</span><ins>+    if (functions-&gt;isAtLeastGL(gl::Version(4, 1)) || functions-&gt;hasGLExtension(&quot;GL_ARB_ES2_compatibility&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(2, 0)))
+    {
+        caps-&gt;maxVertexUniformVectors = QuerySingleGLInt(functions, GL_MAX_VERTEX_UNIFORM_VECTORS);
+    }
+    else
+    {
+        // Doesn't limit ES version, GL_MAX_VERTEX_UNIFORM_COMPONENTS / 4 is acceptable.
+        caps-&gt;maxVertexUniformVectors = caps-&gt;maxVertexUniformComponents / 4;
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(3, 1)) || functions-&gt;hasGLExtension(&quot;GL_ARB_uniform_buffer_object&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxVertexUniformBlocks = QuerySingleGLInt(functions, GL_MAX_VERTEX_UNIFORM_BLOCKS);
+    }
+    else
+    {
+        // Can't support ES3 without uniform blocks
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(3, 2)) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxVertexOutputComponents = QuerySingleGLInt(functions, GL_MAX_VERTEX_OUTPUT_COMPONENTS);
+    }
+    else
+    {
+        // There doesn't seem, to be a desktop extension to add this cap, maybe it could be given a safe limit
+        // instead of limiting the supported ES version.
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
</ins><span class="cx">     // Table 6.32, implementation dependent fragment shader limits
</span><del>-    caps-&gt;maxFragmentUniformComponents = 896;
-    caps-&gt;maxFragmentUniformVectors = 224;
-    caps-&gt;maxFragmentUniformBlocks = 12;
-    caps-&gt;maxFragmentInputComponents = 60;
-    caps-&gt;maxTextureImageUnits = QuerySingleGLInt(functions, GL_MAX_TEXTURE_IMAGE_UNITS);
-    caps-&gt;minProgramTexelOffset = -8;
-    caps-&gt;maxProgramTexelOffset = 7;
</del><ins>+    if (functions-&gt;isAtLeastGL(gl::Version(2, 0)) ||
+        functions-&gt;isAtLeastGLES(gl::Version(2, 0)))
+    {
+        caps-&gt;maxFragmentUniformComponents = QuerySingleGLInt(functions, GL_MAX_FRAGMENT_UNIFORM_COMPONENTS);
+        caps-&gt;maxTextureImageUnits = QuerySingleGLInt(functions, GL_MAX_TEXTURE_IMAGE_UNITS);
+    }
+    else
+    {
+        // Can't support ES2 version without these caps
+        LimitVersion(maxSupportedESVersion, gl::Version(0, 0));
+    }
</ins><span class="cx"> 
</span><ins>+    if (functions-&gt;isAtLeastGL(gl::Version(4, 1)) || functions-&gt;hasGLExtension(&quot;GL_ARB_ES2_compatibility&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(2, 0)))
+    {
+        caps-&gt;maxFragmentUniformVectors = QuerySingleGLInt(functions, GL_MAX_FRAGMENT_UNIFORM_VECTORS);
+    }
+    else
+    {
+        // Doesn't limit ES version, GL_MAX_FRAGMENT_UNIFORM_COMPONENTS / 4 is acceptable.
+        caps-&gt;maxFragmentUniformVectors = caps-&gt;maxFragmentUniformComponents / 4;
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(3, 1)) || functions-&gt;hasGLExtension(&quot;GL_ARB_uniform_buffer_object&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxFragmentUniformBlocks = QuerySingleGLInt(functions, GL_MAX_FRAGMENT_UNIFORM_BLOCKS);
+    }
+    else
+    {
+        // Can't support ES3 without uniform blocks
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(3, 2)) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxFragmentInputComponents = QuerySingleGLInt(functions, GL_MAX_FRAGMENT_INPUT_COMPONENTS);
+    }
+    else
+    {
+        // There doesn't seem, to be a desktop extension to add this cap, maybe it could be given a safe limit
+        // instead of limiting the supported ES version.
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(3, 0)) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;minProgramTexelOffset = QuerySingleGLInt(functions, GL_MIN_PROGRAM_TEXEL_OFFSET);
+        caps-&gt;maxProgramTexelOffset = QuerySingleGLInt(functions, GL_MAX_PROGRAM_TEXEL_OFFSET);
+    }
+    else
+    {
+        // Can't support ES3 without texel offset, could possibly be emulated in the shader
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
</ins><span class="cx">     // Table 6.33, implementation dependent aggregate shader limits
</span><del>-    caps-&gt;maxUniformBufferBindings = 24;
-    caps-&gt;maxUniformBlockSize = 16384;
-    caps-&gt;uniformBufferOffsetAlignment = 1;
-    caps-&gt;maxCombinedUniformBlocks = 24;
-    caps-&gt;maxCombinedVertexUniformComponents = (caps-&gt;maxVertexUniformBlocks * (caps-&gt;maxUniformBlockSize / 4)) + caps-&gt;maxVertexUniformComponents;
-    caps-&gt;maxCombinedFragmentUniformComponents = (caps-&gt;maxFragmentUniformBlocks * (caps-&gt;maxUniformBlockSize / 4)) + caps-&gt;maxFragmentUniformComponents;
-    caps-&gt;maxVaryingComponents = 60;
-    caps-&gt;maxVaryingVectors = 15;
</del><ins>+    if (functions-&gt;isAtLeastGL(gl::Version(3, 1)) || functions-&gt;hasGLExtension(&quot;GL_ARB_uniform_buffer_object&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxUniformBufferBindings = QuerySingleGLInt(functions, GL_MAX_UNIFORM_BUFFER_BINDINGS);
+        caps-&gt;maxUniformBlockSize = QuerySingleGLInt64(functions, GL_MAX_UNIFORM_BLOCK_SIZE);
+        caps-&gt;uniformBufferOffsetAlignment = QuerySingleGLInt(functions, GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT);
+        caps-&gt;maxCombinedUniformBlocks = caps-&gt;maxVertexUniformBlocks + caps-&gt;maxFragmentInputComponents;
+        caps-&gt;maxCombinedVertexUniformComponents = QuerySingleGLInt64(functions, GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS);
+        caps-&gt;maxCombinedFragmentUniformComponents = QuerySingleGLInt64(functions, GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS);
+    }
+    else
+    {
+        // Can't support ES3 without uniform blocks
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(3, 0)) ||
+        functions-&gt;hasGLExtension(&quot;GL_ARB_ES2_compatibility&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(2, 0)))
+    {
+        caps-&gt;maxVaryingComponents = QuerySingleGLInt(functions, GL_MAX_VARYING_COMPONENTS);
+    }
+    else if (functions-&gt;isAtLeastGL(gl::Version(2, 0)))
+    {
+        caps-&gt;maxVaryingComponents = QuerySingleGLInt(functions, GL_MAX_VARYING_FLOATS);
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+    else
+    {
+        LimitVersion(maxSupportedESVersion, gl::Version(0, 0));
+    }
+
+    if (functions-&gt;isAtLeastGL(gl::Version(4, 1)) || functions-&gt;hasGLExtension(&quot;GL_ARB_ES2_compatibility&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(2, 0)))
+    {
+        caps-&gt;maxVaryingVectors = QuerySingleGLInt(functions, GL_MAX_VARYING_VECTORS);
+    }
+    else
+    {
+        // Doesn't limit ES version, GL_MAX_VARYING_COMPONENTS / 4 is acceptable.
+        caps-&gt;maxVaryingVectors = caps-&gt;maxVaryingComponents / 4;
+    }
+
+    // Determine the max combined texture image units by adding the vertex and fragment limits.  If
+    // the real cap is queried, it would contain the limits for shader types that are not available to ES.
</ins><span class="cx">     caps-&gt;maxCombinedTextureImageUnits = caps-&gt;maxVertexTextureImageUnits + caps-&gt;maxTextureImageUnits;
</span><span class="cx"> 
</span><span class="cx">     // Table 6.34, implementation dependent transform feedback limits
</span><del>-    caps-&gt;maxTransformFeedbackInterleavedComponents = 64;
-    caps-&gt;maxTransformFeedbackSeparateAttributes = 4;
-    caps-&gt;maxTransformFeedbackSeparateComponents = 4;
</del><ins>+    if (functions-&gt;isAtLeastGL(gl::Version(4, 0)) ||
+        functions-&gt;hasGLExtension(&quot;GL_ARB_transform_feedback2&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        caps-&gt;maxTransformFeedbackInterleavedComponents = QuerySingleGLInt(functions, GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS);
+        caps-&gt;maxTransformFeedbackSeparateAttributes = QuerySingleGLInt(functions, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS);
+        caps-&gt;maxTransformFeedbackSeparateComponents = QuerySingleGLInt(functions, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS);
+    }
+    else
+    {
+        // Can't support ES3 without transform feedback
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
</ins><span class="cx"> 
</span><span class="cx">     // Table 6.35, Framebuffer Dependent Values
</span><del>-    caps-&gt;maxSamples = QuerySingleGLInt(functions, GL_MAX_SAMPLES);
</del><ins>+    if (functions-&gt;isAtLeastGL(gl::Version(3, 0)) || functions-&gt;hasGLExtension(&quot;GL_EXT_framebuffer_multisample&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_EXT_multisampled_render_to_texture&quot;))
+    {
+        caps-&gt;maxSamples = QuerySingleGLInt(functions, GL_MAX_SAMPLES);
+    }
+    else
+    {
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
</ins><span class="cx"> 
</span><ins>+    // Check if sampler objects are supported
+    if (!functions-&gt;isAtLeastGL(gl::Version(3, 3)) &amp;&amp;
+        !functions-&gt;hasGLExtension(&quot;GL_ARB_sampler_objects&quot;) &amp;&amp;
+        !functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        // Can't support ES3 without sampler objects
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    // Can't support ES3 without texture swizzling
+    if (!functions-&gt;isAtLeastGL(gl::Version(3, 3)) &amp;&amp;
+        !functions-&gt;hasGLExtension(&quot;GL_ARB_texture_swizzle&quot;) &amp;&amp;
+        !functions-&gt;hasGLExtension(&quot;GL_EXT_texture_swizzle&quot;) &amp;&amp;
+        !functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+
+        // Texture swizzling is required to work around the luminance texture format not being
+        // present in the core profile
+        if (functions-&gt;profile &amp; GL_CONTEXT_CORE_PROFILE_BIT)
+        {
+            LimitVersion(maxSupportedESVersion, gl::Version(0, 0));
+        }
+    }
+
+    // Can't support ES3 without the GLSL packing builtins. We have a workaround for all
+    // desktop OpenGL versions starting from 3.3 with the bit packing extension.
+    if (!functions-&gt;isAtLeastGL(gl::Version(4, 2)) &amp;&amp;
+        !(functions-&gt;isAtLeastGL(gl::Version(3, 2)) &amp;&amp;
+          functions-&gt;hasGLExtension(&quot;GL_ARB_shader_bit_encoding&quot;)) &amp;&amp;
+        !functions-&gt;hasGLExtension(&quot;GL_ARB_shading_language_packing&quot;) &amp;&amp;
+        !functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    // ES3 needs to support explicit layout location qualifiers, while it might be possible to
+    // fake them in our side, we currently don't support that.
+    if (!functions-&gt;isAtLeastGL(gl::Version(3, 3)) &amp;&amp;
+        !functions-&gt;hasGLExtension(&quot;GL_ARB_explicit_attrib_location&quot;) &amp;&amp;
+        !functions-&gt;isAtLeastGLES(gl::Version(3, 0)))
+    {
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
+    // TODO(geofflang): The gl-uniform-arrays WebGL conformance test struggles to complete on time
+    // if the max uniform vectors is too large.  Artificially limit the maximum until the test is
+    // updated.
+    caps-&gt;maxVertexUniformVectors = std::min(1024u, caps-&gt;maxVertexUniformVectors);
+    caps-&gt;maxVertexUniformComponents =
+        std::min(caps-&gt;maxVertexUniformVectors / 4, caps-&gt;maxVertexUniformComponents);
+    caps-&gt;maxFragmentUniformVectors = std::min(1024u, caps-&gt;maxFragmentUniformVectors);
+    caps-&gt;maxFragmentUniformComponents =
+        std::min(caps-&gt;maxFragmentUniformVectors / 4, caps-&gt;maxFragmentUniformComponents);
+
+    // If it is not possible to support reading buffer data back, a shadow copy of the buffers must
+    // be held. This disallows writing to buffers indirectly through transform feedback, thus
+    // disallowing ES3.
+    if (!CanMapBufferForRead(functions))
+    {
+        LimitVersion(maxSupportedESVersion, gl::Version(2, 0));
+    }
+
</ins><span class="cx">     // Extension support
</span><span class="cx">     extensions-&gt;setTextureExtensionSupport(*textureCapsMap);
</span><del>-    extensions-&gt;textureNPOT = true;
</del><ins>+    extensions-&gt;elementIndexUint = functions-&gt;standard == STANDARD_GL_DESKTOP ||
+                                   functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_OES_element_index_uint&quot;);
+    extensions-&gt;readFormatBGRA = functions-&gt;isAtLeastGL(gl::Version(1, 2)) || functions-&gt;hasGLExtension(&quot;GL_EXT_bgra&quot;) ||
+                                 functions-&gt;hasGLESExtension(&quot;GL_EXT_read_format_bgra&quot;);
+    extensions-&gt;mapBuffer = functions-&gt;isAtLeastGL(gl::Version(1, 5)) ||
+                            functions-&gt;hasGLESExtension(&quot;GL_OES_mapbuffer&quot;);
+    extensions-&gt;mapBufferRange = functions-&gt;isAtLeastGL(gl::Version(3, 0)) || functions-&gt;hasGLExtension(&quot;GL_ARB_map_buffer_range&quot;) ||
+                                 functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_EXT_map_buffer_range&quot;);
+    extensions-&gt;textureNPOT = functions-&gt;standard == STANDARD_GL_DESKTOP ||
+                              functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_OES_texture_npot&quot;);
+    extensions-&gt;drawBuffers = functions-&gt;isAtLeastGL(gl::Version(2, 0)) || functions-&gt;hasGLExtension(&quot;ARB_draw_buffers&quot;) ||
+                              functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_EXT_draw_buffers&quot;);
</ins><span class="cx">     extensions-&gt;textureStorage = true;
</span><del>-    extensions-&gt;fboRenderMipmap = true;
</del><ins>+    extensions-&gt;textureFilterAnisotropic = functions-&gt;hasGLExtension(&quot;GL_EXT_texture_filter_anisotropic&quot;) || functions-&gt;hasGLESExtension(&quot;GL_EXT_texture_filter_anisotropic&quot;);
+    extensions-&gt;occlusionQueryBoolean =
+        functions-&gt;isAtLeastGL(gl::Version(1, 5)) ||
+        functions-&gt;hasGLExtension(&quot;GL_ARB_occlusion_query2&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 0)) ||
+        functions-&gt;hasGLESExtension(&quot;GL_EXT_occlusion_query_boolean&quot;);
+    extensions-&gt;maxTextureAnisotropy = extensions-&gt;textureFilterAnisotropic ? QuerySingleGLFloat(functions, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0.0f;
+    extensions-&gt;fence = functions-&gt;hasGLExtension(&quot;GL_NV_fence&quot;) || functions-&gt;hasGLESExtension(&quot;GL_NV_fence&quot;);
+    extensions-&gt;blendMinMax = functions-&gt;isAtLeastGL(gl::Version(1, 5)) || functions-&gt;hasGLExtension(&quot;GL_EXT_blend_minmax&quot;) ||
+                              functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_EXT_blend_minmax&quot;);
+    extensions-&gt;framebufferBlit = (functions-&gt;blitFramebuffer != nullptr);
</ins><span class="cx">     extensions-&gt;framebufferMultisample = caps-&gt;maxSamples &gt; 0;
</span><del>-    extensions-&gt;fence = std::find(functions-&gt;extensions.begin(), functions-&gt;extensions.end(), &quot;GL_NV_fence&quot;) != functions-&gt;extensions.end();
</del><ins>+    extensions-&gt;standardDerivatives = functions-&gt;isAtLeastGL(gl::Version(2, 0)) || functions-&gt;hasGLExtension(&quot;GL_ARB_fragment_shader&quot;) ||
+                                      functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_OES_standard_derivatives&quot;);
+    extensions-&gt;shaderTextureLOD = functions-&gt;isAtLeastGL(gl::Version(3, 0)) || functions-&gt;hasGLExtension(&quot;GL_ARB_shader_texture_lod&quot;) ||
+                                   functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_EXT_shader_texture_lod&quot;);
+    extensions-&gt;fragDepth = functions-&gt;standard == STANDARD_GL_DESKTOP ||
+                            functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_EXT_frag_depth&quot;);
+    extensions-&gt;fboRenderMipmap = functions-&gt;isAtLeastGL(gl::Version(3, 0)) || functions-&gt;hasGLExtension(&quot;GL_EXT_framebuffer_object&quot;) ||
+                                  functions-&gt;isAtLeastGLES(gl::Version(3, 0)) || functions-&gt;hasGLESExtension(&quot;GL_OES_fbo_render_mipmap&quot;);
+    extensions-&gt;instancedArrays = functions-&gt;isAtLeastGL(gl::Version(3, 1)) ||
+                                  (functions-&gt;hasGLExtension(&quot;GL_ARB_instanced_arrays&quot;) &amp;&amp;
+                                   (functions-&gt;hasGLExtension(&quot;GL_ARB_draw_instanced&quot;) ||
+                                    functions-&gt;hasGLExtension(&quot;GL_EXT_draw_instanced&quot;))) ||
+                                  functions-&gt;isAtLeastGLES(gl::Version(3, 0)) ||
+                                  functions-&gt;hasGLESExtension(&quot;GL_EXT_instanced_arrays&quot;);
+    extensions-&gt;unpackSubimage = functions-&gt;standard == STANDARD_GL_DESKTOP ||
+                                 functions-&gt;isAtLeastGLES(gl::Version(3, 0)) ||
+                                 functions-&gt;hasGLESExtension(&quot;GL_EXT_unpack_subimage&quot;);
+    extensions-&gt;packSubimage = functions-&gt;standard == STANDARD_GL_DESKTOP ||
+                               functions-&gt;isAtLeastGLES(gl::Version(3, 0)) ||
+                               functions-&gt;hasGLESExtension(&quot;GL_NV_pack_subimage&quot;);
+    extensions-&gt;debugMarker =
+        functions-&gt;isAtLeastGL(gl::Version(4, 3)) || functions-&gt;hasGLExtension(&quot;GL_KHR_debug&quot;) ||
+        functions-&gt;isAtLeastGLES(gl::Version(3, 2)) || functions-&gt;hasGLESExtension(&quot;GL_KHR_debug&quot;);
+    if (functions-&gt;isAtLeastGL(gl::Version(3, 3)) ||
+        functions-&gt;hasGLExtension(&quot;GL_ARB_timer_query&quot;) ||
+        functions-&gt;hasGLESExtension(&quot;GL_EXT_disjoint_timer_query&quot;))
+    {
+        extensions-&gt;disjointTimerQuery = true;
+        extensions-&gt;queryCounterBitsTimeElapsed =
+            QueryQueryValue(functions, GL_TIME_ELAPSED, GL_QUERY_COUNTER_BITS);
+        extensions-&gt;queryCounterBitsTimestamp =
+            QueryQueryValue(functions, GL_TIMESTAMP, GL_QUERY_COUNTER_BITS);
+    }
+
+    // ANGLE emulates vertex array objects in its GL layer
+    extensions-&gt;vertexArrayObject = true;
+
+    extensions-&gt;noError = true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void GenerateWorkarounds(const FunctionsGL *functions, WorkaroundsGL *workarounds)
+{
+    VendorID vendor = GetVendorID(functions);
+
+    // Don't use 1-bit alpha formats on desktop GL with AMD or Intel drivers.
+    workarounds-&gt;avoid1BitAlphaTextureFormats =
+        functions-&gt;standard == STANDARD_GL_DESKTOP &amp;&amp;
+        (vendor == VENDOR_ID_AMD || vendor == VENDOR_ID_INTEL);
+
+    workarounds-&gt;rgba4IsNotSupportedForColorRendering =
+        functions-&gt;standard == STANDARD_GL_DESKTOP &amp;&amp; vendor == VENDOR_ID_INTEL;
+
+    workarounds-&gt;doesSRGBClearsOnLinearFramebufferAttachments =
+        functions-&gt;standard == STANDARD_GL_DESKTOP &amp;&amp;
+        (vendor == VENDOR_ID_INTEL || vendor == VENDOR_ID_AMD);
+
+#if defined(ANGLE_PLATFORM_APPLE)
+    workarounds-&gt;doWhileGLSLCausesGPUHang = true;
+#endif
+
+    workarounds-&gt;finishDoesNotCauseQueriesToBeAvailable =
+        functions-&gt;standard == STANDARD_GL_DESKTOP &amp;&amp; vendor == VENDOR_ID_NVIDIA;
+
+    // TODO(cwallez): Disable this workaround for MacOSX versions 10.9 or later.
+    workarounds-&gt;alwaysCallUseProgramAfterLink = true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span><ins>+
+bool CanMapBufferForRead(const FunctionsGL *functions)
+{
+    return (functions-&gt;mapBufferRange != nullptr) ||
+           (functions-&gt;mapBuffer != nullptr &amp;&amp; functions-&gt;standard == STANDARD_GL_DESKTOP);
+}
+
+uint8_t *MapBufferRangeWithFallback(const FunctionsGL *functions,
+                                    GLenum target,
+                                    size_t offset,
+                                    size_t length,
+                                    GLbitfield access)
+{
+    if (functions-&gt;mapBufferRange != nullptr)
+    {
+        return reinterpret_cast&lt;uint8_t *&gt;(
+            functions-&gt;mapBufferRange(target, offset, length, access));
+    }
+    else if (functions-&gt;mapBuffer != nullptr &amp;&amp;
+             (functions-&gt;standard == STANDARD_GL_DESKTOP || access == GL_MAP_WRITE_BIT))
+    {
+        // Only the read and write bits are supported
+        ASSERT((access &amp; (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) != 0);
+
+        GLenum accessEnum = 0;
+        if (access == (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT))
+        {
+            accessEnum = GL_READ_WRITE;
+        }
+        else if (access == GL_MAP_READ_BIT)
+        {
+            accessEnum = GL_READ_ONLY;
+        }
+        else if (access == GL_MAP_WRITE_BIT)
+        {
+            accessEnum = GL_WRITE_ONLY;
+        }
+        else
+        {
+            UNREACHABLE();
+            return nullptr;
+        }
+
+        return reinterpret_cast&lt;uint8_t *&gt;(functions-&gt;mapBuffer(target, accessEnum)) + offset;
+    }
+    else
+    {
+        // No options available
+        UNREACHABLE();
+        return nullptr;
+    }
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglrenderergl_utilsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -4,14 +4,16 @@
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><span class="cx"> 
</span><del>-// renderer11_utils.h: Conversion functions and other utility routines
</del><ins>+// renderergl_utils.h: Conversion functions and other utility routines
</ins><span class="cx"> // specific to the OpenGL renderer.
</span><span class="cx"> 
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_GL_RENDERERGLUTILS_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_GL_RENDERERGLUTILS_H_
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/angletypes.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/functionsgl_typedefs.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;string&gt;
</ins><span class="cx"> #include &lt;vector&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="lines">@@ -19,20 +21,32 @@
</span><span class="cx"> struct Caps;
</span><span class="cx"> class TextureCapsMap;
</span><span class="cx"> struct Extensions;
</span><ins>+struct Version;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> class FunctionsGL;
</span><ins>+struct WorkaroundsGL;
</ins><span class="cx"> 
</span><ins>+VendorID GetVendorID(const FunctionsGL *functions);
+std::string GetDriverVersion(const FunctionsGL *functions);
+
</ins><span class="cx"> namespace nativegl_gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> void GenerateCaps(const FunctionsGL *functions, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap,
</span><del>-                  gl::Extensions *extensions);
</del><ins>+                  gl::Extensions *extensions, gl::Version *maxSupportedESVersion);
</ins><span class="cx"> 
</span><ins>+void GenerateWorkarounds(const FunctionsGL *functions, WorkaroundsGL *workarounds);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool CanMapBufferForRead(const FunctionsGL *functions);
+uint8_t *MapBufferRangeWithFallback(const FunctionsGL *functions,
+                                    GLenum target,
+                                    size_t offset,
+                                    size_t length,
+                                    GLbitfield access);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_RENDERER_GL_RENDERERGLUTILS_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglDXGISwapChainWindowSurfaceWGLcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,550 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// DXGISwapChainWindowSurfaceWGL.cpp: WGL implementation of egl::Surface for windows using a DXGI
+// swapchain.
+
+#include &quot;libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h&quot;
+
+#include &quot;libANGLE/formatutils.h&quot;
+#include &quot;libANGLE/renderer/gl/FramebufferGL.h&quot;
+#include &quot;libANGLE/renderer/gl/TextureGL.h&quot;
+#include &quot;libANGLE/renderer/gl/RendererGL.h&quot;
+#include &quot;libANGLE/renderer/gl/StateManagerGL.h&quot;
+#include &quot;libANGLE/renderer/gl/wgl/DisplayWGL.h&quot;
+#include &quot;libANGLE/renderer/gl/wgl/FunctionsWGL.h&quot;
+
+#include &lt;EGL/eglext.h&gt;
+
+namespace rx
+{
+
+DXGISwapChainWindowSurfaceWGL::DXGISwapChainWindowSurfaceWGL(RendererGL *renderer,
+                                                             EGLNativeWindowType window,
+                                                             ID3D11Device *device,
+                                                             HANDLE deviceHandle,
+                                                             HGLRC wglContext,
+                                                             HDC deviceContext,
+                                                             const FunctionsGL *functionsGL,
+                                                             const FunctionsWGL *functionsWGL,
+                                                             EGLint orientation)
+    : SurfaceGL(renderer),
+      mWindow(window),
+      mStateManager(renderer-&gt;getStateManager()),
+      mWorkarounds(renderer-&gt;getWorkarounds()),
+      mFunctionsGL(functionsGL),
+      mFunctionsWGL(functionsWGL),
+      mDevice(device),
+      mDeviceHandle(deviceHandle),
+      mWGLDevice(deviceContext),
+      mWGLContext(wglContext),
+      mSwapChainFormat(DXGI_FORMAT_UNKNOWN),
+      mSwapChainFlags(0),
+      mDepthBufferFormat(GL_NONE),
+      mFirstSwap(true),
+      mSwapChain(nullptr),
+      mSwapChain1(nullptr),
+      mColorRenderbufferID(0),
+      mRenderbufferBufferHandle(nullptr),
+      mDepthRenderbufferID(0),
+      mFramebufferID(0),
+      mTextureID(0),
+      mTextureHandle(nullptr),
+      mWidth(0),
+      mHeight(0),
+      mSwapInterval(1),
+      mOrientation(orientation)
+{
+}
+
+DXGISwapChainWindowSurfaceWGL::~DXGISwapChainWindowSurfaceWGL()
+{
+    if (mRenderbufferBufferHandle != nullptr)
+    {
+        mFunctionsWGL-&gt;dxUnlockObjectsNV(mDeviceHandle, 1, &amp;mRenderbufferBufferHandle);
+        mFunctionsWGL-&gt;dxUnregisterObjectNV(mDeviceHandle, mRenderbufferBufferHandle);
+    }
+
+    if (mColorRenderbufferID != 0)
+    {
+        mStateManager-&gt;deleteRenderbuffer(mColorRenderbufferID);
+        mColorRenderbufferID = 0;
+    }
+
+    if (mDepthRenderbufferID != 0)
+    {
+        mStateManager-&gt;deleteRenderbuffer(mDepthRenderbufferID);
+        mDepthRenderbufferID = 0;
+    }
+
+    SafeRelease(mSwapChain);
+    SafeRelease(mSwapChain1);
+}
+
+egl::Error DXGISwapChainWindowSurfaceWGL::initialize()
+{
+    if (mOrientation != EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE)
+    {
+        // TODO(geofflang): Support the orientation extensions fully.  Currently only inverting Y is
+        // supported.  To support all orientations, an intermediate framebuffer will be needed with
+        // a blit before swap.
+        return egl::Error(EGL_BAD_ATTRIBUTE,
+                          &quot;DXGISwapChainWindowSurfaceWGL requires an orientation of &quot;
+                          &quot;EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE.&quot;);
+    }
+
+    RECT rect;
+    if (!GetClientRect(mWindow, &amp;rect))
+    {
+        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to query the window size.&quot;);
+    }
+    mWidth  = rect.right - rect.left;
+    mHeight = rect.bottom - rect.top;
+
+    mSwapChainFormat   = DXGI_FORMAT_R8G8B8A8_UNORM;
+    mSwapChainFlags    = 0;
+    mDepthBufferFormat = GL_DEPTH24_STENCIL8;
+
+    mFunctionsGL-&gt;genFramebuffers(1, &amp;mFramebufferID);
+    mFunctionsGL-&gt;genRenderbuffers(1, &amp;mColorRenderbufferID);
+    mFunctionsGL-&gt;genRenderbuffers(1, &amp;mDepthRenderbufferID);
+
+    return createSwapChain();
+}
+
+egl::Error DXGISwapChainWindowSurfaceWGL::makeCurrent()
+{
+    if (!mFunctionsWGL-&gt;makeCurrent(mWGLDevice, mWGLContext))
+    {
+        // TODO: What error type here?
+        return egl::Error(EGL_CONTEXT_LOST, &quot;Failed to make the WGL context current.&quot;);
+    }
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error DXGISwapChainWindowSurfaceWGL::swap()
+{
+    mFunctionsGL-&gt;flush();
+
+    egl::Error error = setObjectsLocked(false);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    HRESULT result = mSwapChain-&gt;Present(mSwapInterval, 0);
+    mFirstSwap     = false;
+
+    error = setObjectsLocked(true);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (FAILED(result))
+    {
+        return egl::Error(EGL_BAD_ALLOC, &quot;Failed to present swap chain, result: 0x%X&quot;, result);
+    }
+
+    return checkForResize();
+}
+
+egl::Error DXGISwapChainWindowSurfaceWGL::postSubBuffer(EGLint x,
+                                                        EGLint y,
+                                                        EGLint width,
+                                                        EGLint height)
+{
+    ASSERT(mSwapChain1 != nullptr);
+
+    mFunctionsGL-&gt;flush();
+
+    egl::Error error = setObjectsLocked(false);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    HRESULT result = S_OK;
+    if (mFirstSwap)
+    {
+        result     = mSwapChain1-&gt;Present(mSwapInterval, 0);
+        mFirstSwap = false;
+    }
+    else
+    {
+        RECT rect = {static_cast&lt;LONG&gt;(x), static_cast&lt;LONG&gt;(mHeight - y - height),
+                     static_cast&lt;LONG&gt;(x + width), static_cast&lt;LONG&gt;(mHeight - y)};
+        DXGI_PRESENT_PARAMETERS params = {1, &amp;rect, nullptr, nullptr};
+        result                         = mSwapChain1-&gt;Present1(mSwapInterval, 0, &amp;params);
+    }
+
+    error = setObjectsLocked(true);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (FAILED(result))
+    {
+        return egl::Error(EGL_BAD_ALLOC, &quot;Failed to present swap chain, result: 0x%X&quot;, result);
+    }
+
+    return checkForResize();
+}
+
+egl::Error DXGISwapChainWindowSurfaceWGL::querySurfacePointerANGLE(EGLint attribute, void **value)
+{
+    UNREACHABLE();
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error DXGISwapChainWindowSurfaceWGL::bindTexImage(gl::Texture *texture, EGLint buffer)
+{
+    ASSERT(mTextureHandle == nullptr);
+
+    const TextureGL *textureGL = GetImplAs&lt;TextureGL&gt;(texture);
+    GLuint textureID           = textureGL-&gt;getTextureID();
+
+    ID3D11Texture2D *colorBuffer = nullptr;
+    HRESULT result = mSwapChain-&gt;GetBuffer(0, __uuidof(ID3D11Texture2D),
+                                           reinterpret_cast&lt;void **&gt;(&amp;colorBuffer));
+    if (FAILED(result))
+    {
+        return egl::Error(EGL_BAD_ALLOC, &quot;Failed to query texture from swap chain, result: 0x%X&quot;,
+                          result);
+    }
+
+    mTextureHandle = mFunctionsWGL-&gt;dxRegisterObjectNV(mDeviceHandle, colorBuffer, textureID,
+                                                       GL_TEXTURE_2D, WGL_ACCESS_READ_WRITE_NV);
+    SafeRelease(colorBuffer);
+    if (mTextureHandle == nullptr)
+    {
+        return egl::Error(EGL_BAD_ALLOC, &quot;Failed to register D3D object, error: 0x%08x.&quot;,
+                          HRESULT_CODE(GetLastError()));
+    }
+
+    if (!mFunctionsWGL-&gt;dxLockObjectsNV(mDeviceHandle, 1, &amp;mTextureHandle))
+    {
+        mFunctionsWGL-&gt;dxUnregisterObjectNV(mDeviceHandle, mTextureHandle);
+        mTextureHandle = nullptr;
+
+        return egl::Error(EGL_BAD_ALLOC, &quot;Failed to lock D3D object, error: 0x%08x.&quot;,
+                          HRESULT_CODE(GetLastError()));
+    }
+
+    mTextureID = textureID;
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error DXGISwapChainWindowSurfaceWGL::releaseTexImage(EGLint buffer)
+{
+    ASSERT(mTextureHandle != nullptr);
+
+    if (!mFunctionsWGL-&gt;dxUnlockObjectsNV(mDeviceHandle, 1, &amp;mTextureHandle))
+    {
+        return egl::Error(EGL_BAD_ALLOC, &quot;Failed to unlock D3D object, error: 0x%08x.&quot;,
+                          HRESULT_CODE(GetLastError()));
+    }
+
+    if (!mFunctionsWGL-&gt;dxUnregisterObjectNV(mDeviceHandle, mTextureHandle))
+    {
+        return egl::Error(EGL_BAD_ALLOC, &quot;Failed to unregister D3D object, error: 0x%08x.&quot;,
+                          HRESULT_CODE(GetLastError()));
+    }
+
+    mTextureID     = 0;
+    mTextureHandle = nullptr;
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+void DXGISwapChainWindowSurfaceWGL::setSwapInterval(EGLint interval)
+{
+    mSwapInterval = interval;
+}
+
+EGLint DXGISwapChainWindowSurfaceWGL::getWidth() const
+{
+    return static_cast&lt;EGLint&gt;(mWidth);
+}
+
+EGLint DXGISwapChainWindowSurfaceWGL::getHeight() const
+{
+    return static_cast&lt;EGLint&gt;(mHeight);
+}
+
+EGLint DXGISwapChainWindowSurfaceWGL::isPostSubBufferSupported() const
+{
+    return mSwapChain1 != nullptr;
+}
+
+EGLint DXGISwapChainWindowSurfaceWGL::getSwapBehavior() const
+{
+    return EGL_BUFFER_DESTROYED;
+}
+
+FramebufferImpl *DXGISwapChainWindowSurfaceWGL::createDefaultFramebuffer(
+    const gl::Framebuffer::Data &amp;data)
+{
+    return new FramebufferGL(mFramebufferID, data, mFunctionsGL, mWorkarounds, mStateManager);
+}
+
+egl::Error DXGISwapChainWindowSurfaceWGL::setObjectsLocked(bool locked)
+{
+    if (mRenderbufferBufferHandle == nullptr)
+    {
+        ASSERT(mTextureHandle == nullptr);
+        return egl::Error(EGL_SUCCESS);
+    }
+
+    HANDLE resources[] = {
+        mRenderbufferBufferHandle, mTextureHandle,
+    };
+    GLint count = (mTextureHandle != nullptr) ? 2 : 1;
+
+    if (locked)
+    {
+        if (!mFunctionsWGL-&gt;dxLockObjectsNV(mDeviceHandle, count, resources))
+        {
+            return egl::Error(EGL_BAD_ALLOC, &quot;Failed to lock object, error: 0x%08x.&quot;,
+                              HRESULT_CODE(GetLastError()));
+        }
+    }
+    else
+    {
+        if (!mFunctionsWGL-&gt;dxUnlockObjectsNV(mDeviceHandle, count, resources))
+        {
+            return egl::Error(EGL_BAD_ALLOC, &quot;Failed to lock object, error: 0x%08x.&quot;,
+                              HRESULT_CODE(GetLastError()));
+        }
+    }
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error DXGISwapChainWindowSurfaceWGL::checkForResize()
+{
+    RECT rect;
+    if (!GetClientRect(mWindow, &amp;rect))
+    {
+        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to query the window size.&quot;);
+    }
+
+    size_t newWidth  = rect.right - rect.left;
+    size_t newHeight = rect.bottom - rect.top;
+    if (newWidth != mWidth || newHeight != mHeight)
+    {
+        mWidth  = newWidth;
+        mHeight = newHeight;
+
+        // TODO(geofflang): Handle resize by resizing the swap chain instead of re-creating it.
+        egl::Error error = createSwapChain();
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+
+    return egl::Error(EGL_SUCCESS);
+}
+
+static IDXGIFactory *GetDXGIFactoryFromDevice(ID3D11Device *device)
+{
+    IDXGIDevice *dxgiDevice = nullptr;
+    HRESULT result =
+        device-&gt;QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast&lt;void **&gt;(&amp;dxgiDevice));
+    if (FAILED(result))
+    {
+        return nullptr;
+    }
+
+    IDXGIAdapter *dxgiAdapter = nullptr;
+    result = dxgiDevice-&gt;GetParent(__uuidof(IDXGIAdapter), reinterpret_cast&lt;void **&gt;(&amp;dxgiAdapter));
+    SafeRelease(dxgiDevice);
+    if (FAILED(result))
+    {
+        return nullptr;
+    }
+
+    IDXGIFactory *dxgiFactory = nullptr;
+    result =
+        dxgiAdapter-&gt;GetParent(__uuidof(IDXGIFactory), reinterpret_cast&lt;void **&gt;(&amp;dxgiFactory));
+    SafeRelease(dxgiAdapter);
+    if (FAILED(result))
+    {
+        return nullptr;
+    }
+
+    return dxgiFactory;
+}
+
+egl::Error DXGISwapChainWindowSurfaceWGL::createSwapChain()
+{
+    egl::Error error = setObjectsLocked(false);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (mRenderbufferBufferHandle)
+    {
+        mFunctionsWGL-&gt;dxUnregisterObjectNV(mDeviceHandle, mRenderbufferBufferHandle);
+        mRenderbufferBufferHandle = nullptr;
+    }
+
+    // If this surface is bound to a texture, unregister it.
+    bool hadBoundSurface = (mTextureHandle != nullptr);
+    if (hadBoundSurface)
+    {
+        mFunctionsWGL-&gt;dxUnregisterObjectNV(mDeviceHandle, mTextureHandle);
+        mTextureHandle = nullptr;
+    }
+
+    IDXGIFactory *dxgiFactory = GetDXGIFactoryFromDevice(mDevice);
+    if (dxgiFactory == nullptr)
+    {
+        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to query the DXGIFactory.&quot;);
+    }
+
+    IDXGIFactory2 *dxgiFactory2 = nullptr;
+    HRESULT result = dxgiFactory-&gt;QueryInterface(__uuidof(IDXGIFactory2),
+                                                 reinterpret_cast&lt;void **&gt;(&amp;dxgiFactory2));
+    if (SUCCEEDED(result))
+    {
+        ASSERT(dxgiFactory2 != nullptr);
+
+        DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
+        swapChainDesc.BufferCount           = 1;
+        swapChainDesc.Format                = mSwapChainFormat;
+        swapChainDesc.Width                 = static_cast&lt;UINT&gt;(mWidth);
+        swapChainDesc.Height                = static_cast&lt;UINT&gt;(mHeight);
+        swapChainDesc.Format                = mSwapChainFormat;
+        swapChainDesc.Stereo                = FALSE;
+        swapChainDesc.SampleDesc.Count      = 1;
+        swapChainDesc.SampleDesc.Quality = 0;
+        swapChainDesc.BufferUsage =
+            DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_BACK_BUFFER;
+        swapChainDesc.BufferCount = 1;
+        swapChainDesc.Scaling     = DXGI_SCALING_STRETCH;
+        swapChainDesc.SwapEffect  = DXGI_SWAP_EFFECT_SEQUENTIAL;
+        swapChainDesc.AlphaMode   = DXGI_ALPHA_MODE_UNSPECIFIED;
+        swapChainDesc.Flags       = mSwapChainFlags;
+
+        result = dxgiFactory2-&gt;CreateSwapChainForHwnd(mDevice, mWindow, &amp;swapChainDesc, nullptr,
+                                                      nullptr, &amp;mSwapChain1);
+        SafeRelease(dxgiFactory2);
+        SafeRelease(dxgiFactory);
+        if (FAILED(result))
+        {
+            return egl::Error(EGL_BAD_ALLOC, &quot;Failed to create swap chain for window, result: 0x%X&quot;,
+                              result);
+        }
+
+        mSwapChain = mSwapChain1;
+        mSwapChain-&gt;AddRef();
+    }
+    else
+    {
+        DXGI_SWAP_CHAIN_DESC swapChainDesc               = {};
+        swapChainDesc.BufferCount                        = 1;
+        swapChainDesc.BufferDesc.Format                  = mSwapChainFormat;
+        swapChainDesc.BufferDesc.Width                   = static_cast&lt;UINT&gt;(mWidth);
+        swapChainDesc.BufferDesc.Height                  = static_cast&lt;UINT&gt;(mHeight);
+        swapChainDesc.BufferDesc.Scaling                 = DXGI_MODE_SCALING_UNSPECIFIED;
+        swapChainDesc.BufferDesc.ScanlineOrdering        = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
+        swapChainDesc.BufferDesc.RefreshRate.Numerator   = 0;
+        swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
+        swapChainDesc.BufferUsage =
+            DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_BACK_BUFFER;
+        swapChainDesc.Flags              = mSwapChainFlags;
+        swapChainDesc.OutputWindow       = mWindow;
+        swapChainDesc.SampleDesc.Count   = 1;
+        swapChainDesc.SampleDesc.Quality = 0;
+        swapChainDesc.Windowed           = TRUE;
+        swapChainDesc.SwapEffect         = DXGI_SWAP_EFFECT_DISCARD;
+
+        result = dxgiFactory-&gt;CreateSwapChain(mDevice, &amp;swapChainDesc, &amp;mSwapChain);
+        SafeRelease(dxgiFactory);
+        if (FAILED(result))
+        {
+            return egl::Error(EGL_BAD_ALLOC, &quot;Failed to create swap chain for window, result: 0x%X&quot;,
+                              result);
+        }
+    }
+
+    ID3D11Texture2D *colorBuffer = nullptr;
+    result = mSwapChain-&gt;GetBuffer(0, __uuidof(ID3D11Texture2D),
+                                   reinterpret_cast&lt;void **&gt;(&amp;colorBuffer));
+    if (FAILED(result))
+    {
+        return egl::Error(EGL_BAD_ALLOC, &quot;Failed to query texture from swap chain, result: 0x%X&quot;,
+                          result);
+    }
+
+    mFunctionsGL-&gt;genRenderbuffers(1, &amp;mColorRenderbufferID);
+    mStateManager-&gt;bindRenderbuffer(GL_RENDERBUFFER, mColorRenderbufferID);
+    mRenderbufferBufferHandle =
+        mFunctionsWGL-&gt;dxRegisterObjectNV(mDeviceHandle, colorBuffer, mColorRenderbufferID,
+                                          GL_RENDERBUFFER, WGL_ACCESS_READ_WRITE_NV);
+    SafeRelease(colorBuffer);
+    if (mRenderbufferBufferHandle == nullptr)
+    {
+        return egl::Error(EGL_BAD_ALLOC, &quot;Failed to register D3D object, error: 0x%X.&quot;,
+                          HRESULT_CODE(GetLastError()));
+    }
+
+    // Rebind the surface to the texture if needed.
+    if (hadBoundSurface)
+    {
+        mTextureHandle = mFunctionsWGL-&gt;dxRegisterObjectNV(mDeviceHandle, colorBuffer, mTextureID,
+                                                           GL_TEXTURE_2D, WGL_ACCESS_READ_WRITE_NV);
+        if (mTextureHandle == nullptr)
+        {
+            return egl::Error(EGL_BAD_ALLOC, &quot;Failed to register D3D object, error: 0x%X.&quot;,
+                              HRESULT_CODE(GetLastError()));
+        }
+    }
+
+    error = setObjectsLocked(true);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    ASSERT(mFramebufferID != 0);
+    mStateManager-&gt;bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
+    mFunctionsGL-&gt;framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+                                          mColorRenderbufferID);
+
+    if (mDepthBufferFormat != GL_NONE)
+    {
+        ASSERT(mDepthRenderbufferID != 0);
+        mStateManager-&gt;bindRenderbuffer(GL_RENDERBUFFER, mDepthRenderbufferID);
+        mFunctionsGL-&gt;renderbufferStorage(GL_RENDERBUFFER, mDepthBufferFormat,
+                                          static_cast&lt;GLsizei&gt;(mWidth),
+                                          static_cast&lt;GLsizei&gt;(mHeight));
+
+        const gl::InternalFormat &amp;depthStencilFormatInfo =
+            gl::GetInternalFormatInfo(mDepthBufferFormat);
+        if (depthStencilFormatInfo.depthBits &gt; 0)
+        {
+            mFunctionsGL-&gt;framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                                                  GL_RENDERBUFFER, mDepthRenderbufferID);
+        }
+        if (depthStencilFormatInfo.stencilBits &gt; 0)
+        {
+            mFunctionsGL-&gt;framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
+                                                  GL_RENDERBUFFER, mDepthRenderbufferID);
+        }
+    }
+
+    mFirstSwap = true;
+
+    return egl::Error(EGL_SUCCESS);
+}
+}  // namespace rx
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglDXGISwapChainWindowSurfaceWGLh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,104 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// DXGISwapChainWindowSurfaceWGL.h: WGL implementation of egl::Surface for windows using a DXGI
+// swapchain.
+
+#ifndef LIBANGLE_RENDERER_GL_WGL_DXGISWAPCHAINSURFACEWGL_H_
+#define LIBANGLE_RENDERER_GL_WGL_DXGISWAPCHAINSURFACEWGL_H_
+
+#include &quot;libANGLE/renderer/gl/SurfaceGL.h&quot;
+
+#include &lt;GL/wglext.h&gt;
+
+namespace rx
+{
+
+class FunctionsGL;
+class FunctionsWGL;
+class DisplayWGL;
+class StateManagerGL;
+struct WorkaroundsGL;
+
+class DXGISwapChainWindowSurfaceWGL : public SurfaceGL
+{
+  public:
+    DXGISwapChainWindowSurfaceWGL(RendererGL *renderer,
+                                  EGLNativeWindowType window,
+                                  ID3D11Device *device,
+                                  HANDLE deviceHandle,
+                                  HGLRC wglContext,
+                                  HDC deviceContext,
+                                  const FunctionsGL *functionsGL,
+                                  const FunctionsWGL *functionsWGL,
+                                  EGLint orientation);
+    ~DXGISwapChainWindowSurfaceWGL() override;
+
+    egl::Error initialize() override;
+    egl::Error makeCurrent() override;
+
+    egl::Error swap() override;
+    egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
+    egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
+    egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
+    egl::Error releaseTexImage(EGLint buffer) override;
+    void setSwapInterval(EGLint interval) override;
+
+    EGLint getWidth() const override;
+    EGLint getHeight() const override;
+
+    EGLint isPostSubBufferSupported() const override;
+    EGLint getSwapBehavior() const override;
+
+    FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &amp;data) override;
+
+  private:
+    egl::Error setObjectsLocked(bool locked);
+    egl::Error checkForResize();
+
+    egl::Error createSwapChain();
+
+    EGLNativeWindowType mWindow;
+
+    StateManagerGL *mStateManager;
+    const WorkaroundsGL &amp;mWorkarounds;
+    const FunctionsGL *mFunctionsGL;
+    const FunctionsWGL *mFunctionsWGL;
+
+    ID3D11Device *mDevice;
+    HANDLE mDeviceHandle;
+
+    HDC mWGLDevice;
+    HGLRC mWGLContext;
+
+    DXGI_FORMAT mSwapChainFormat;
+    UINT mSwapChainFlags;
+    GLenum mDepthBufferFormat;
+
+    bool mFirstSwap;
+    IDXGISwapChain *mSwapChain;
+    IDXGISwapChain1 *mSwapChain1;
+
+    GLuint mColorRenderbufferID;
+    HANDLE mRenderbufferBufferHandle;
+
+    GLuint mDepthRenderbufferID;
+
+    GLuint mFramebufferID;
+
+    GLuint mTextureID;
+    HANDLE mTextureHandle;
+
+    size_t mWidth;
+    size_t mHeight;
+
+    EGLint mSwapInterval;
+
+    EGLint mOrientation;
+};
+}  // namespace rx
+
+#endif  // LIBANGLE_RENDERER_GL_WGL_DXGISWAPCHAINSURFACEWGL_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglDisplayWGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,6 +13,7 @@
</span><span class="cx"> #include &quot;libANGLE/Display.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/renderergl_utils.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/FunctionsWGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h&quot;
</span><span class="lines">@@ -36,9 +37,7 @@
</span><span class="cx">         ASSERT(mGetProcAddressWGL);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    virtual ~FunctionsGLWindows()
-    {
-    }
</del><ins>+    ~FunctionsGLWindows() override {}
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     void *loadProcAddress(const std::string &amp;function) override
</span><span class="lines">@@ -65,6 +64,11 @@
</span><span class="cx">       mDeviceContext(nullptr),
</span><span class="cx">       mPixelFormat(0),
</span><span class="cx">       mWGLContext(nullptr),
</span><ins>+      mUseDXGISwapChains(false),
+      mDxgiModule(nullptr),
+      mD3d11Module(nullptr),
+      mD3D11DeviceHandle(nullptr),
+      mD3D11Device(nullptr),
</ins><span class="cx">       mDisplay(nullptr)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -73,26 +77,6 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static LRESULT CALLBACK IntermediateWindowProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
-{
-    switch (message)
-    {
-      case WM_ERASEBKGND:
-        // Prevent windows from erasing the background.
-        return 1;
-      case WM_PAINT:
-        // Do not paint anything.
-        PAINTSTRUCT paint;
-        if (BeginPaint(window, &amp;paint))
-        {
-            EndPaint(window, &amp;paint);
-        }
-        return 0;
-    }
-
-    return DefWindowProc(window, message, wParam, lParam);
-}
-
</del><span class="cx"> egl::Error DisplayWGL::initialize(egl::Display *display)
</span><span class="cx"> {
</span><span class="cx">     mDisplay = display;
</span><span class="lines">@@ -112,24 +96,26 @@
</span><span class="cx">     // Work around compile error from not defining &quot;UNICODE&quot; while Chromium does
</span><span class="cx">     const LPSTR idcArrow = MAKEINTRESOURCEA(32512);
</span><span class="cx"> 
</span><ins>+    std::string className = FormatString(&quot;ANGLE DisplayWGL 0x%0.8p Intermediate Window Class&quot;, mDisplay);
+
</ins><span class="cx">     WNDCLASSA intermediateClassDesc = { 0 };
</span><span class="cx">     intermediateClassDesc.style = CS_OWNDC;
</span><del>-    intermediateClassDesc.lpfnWndProc = IntermediateWindowProc;
</del><ins>+    intermediateClassDesc.lpfnWndProc = DefWindowProc;
</ins><span class="cx">     intermediateClassDesc.cbClsExtra = 0;
</span><span class="cx">     intermediateClassDesc.cbWndExtra = 0;
</span><del>-    intermediateClassDesc.hInstance = GetModuleHandle(NULL);
-    intermediateClassDesc.hIcon = NULL;
-    intermediateClassDesc.hCursor = LoadCursorA(NULL, idcArrow);
</del><ins>+    intermediateClassDesc.hInstance = GetModuleHandle(nullptr);
+    intermediateClassDesc.hIcon = nullptr;
+    intermediateClassDesc.hCursor = LoadCursorA(nullptr, idcArrow);
</ins><span class="cx">     intermediateClassDesc.hbrBackground = 0;
</span><del>-    intermediateClassDesc.lpszMenuName = NULL;
-    intermediateClassDesc.lpszClassName = &quot;ANGLE Intermediate Window&quot;;
</del><ins>+    intermediateClassDesc.lpszMenuName = nullptr;
+    intermediateClassDesc.lpszClassName = className.c_str();
</ins><span class="cx">     mWindowClass = RegisterClassA(&amp;intermediateClassDesc);
</span><span class="cx">     if (!mWindowClass)
</span><span class="cx">     {
</span><span class="cx">         return egl::Error(EGL_NOT_INITIALIZED, &quot;Failed to register intermediate OpenGL window class.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    HWND dummyWindow = CreateWindowExA(WS_EX_NOPARENTNOTIFY,
</del><ins>+    HWND dummyWindow = CreateWindowExA(0,
</ins><span class="cx">                                        reinterpret_cast&lt;const char *&gt;(mWindowClass),
</span><span class="cx">                                        &quot;ANGLE Dummy Window&quot;,
</span><span class="cx">                                        WS_OVERLAPPEDWINDOW,
</span><span class="lines">@@ -137,10 +123,10 @@
</span><span class="cx">                                        CW_USEDEFAULT,
</span><span class="cx">                                        CW_USEDEFAULT,
</span><span class="cx">                                        CW_USEDEFAULT,
</span><del>-                                       NULL,
-                                       NULL,
-                                       NULL,
-                                       NULL);
</del><ins>+                                       nullptr,
+                                       nullptr,
+                                       nullptr,
+                                       nullptr);
</ins><span class="cx">     if (!dummyWindow)
</span><span class="cx">     {
</span><span class="cx">         return egl::Error(EGL_NOT_INITIALIZED, &quot;Failed to create dummy OpenGL window.&quot;);
</span><span class="lines">@@ -188,16 +174,25 @@
</span><span class="cx">     mFunctionsWGL-&gt;initialize(mOpenGLModule, dummyDeviceContext);
</span><span class="cx"> 
</span><span class="cx">     // Destroy the dummy window and context
</span><del>-    mFunctionsWGL-&gt;makeCurrent(dummyDeviceContext, NULL);
</del><ins>+    mFunctionsWGL-&gt;makeCurrent(dummyDeviceContext, nullptr);
</ins><span class="cx">     mFunctionsWGL-&gt;deleteContext(dummyWGLContext);
</span><span class="cx">     ReleaseDC(dummyWindow, dummyDeviceContext);
</span><span class="cx">     DestroyWindow(dummyWindow);
</span><span class="cx"> 
</span><ins>+    const egl::AttributeMap &amp;displayAttributes = display-&gt;getAttributeMap();
+    EGLint requestedDisplayType = static_cast&lt;EGLint&gt;(displayAttributes.get(
+        EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE));
+    if (requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE &amp;&amp;
+        !mFunctionsWGL-&gt;hasExtension(&quot;WGL_EXT_create_context_es2_profile&quot;) &amp;&amp;
+        !mFunctionsWGL-&gt;hasExtension(&quot;WGL_EXT_create_context_es_profile&quot;))
+    {
+        return egl::Error(EGL_NOT_INITIALIZED,
+                          &quot;Cannot create an OpenGL ES platform on Windows without &quot;
+                          &quot;the WGL_EXT_create_context_es(2)_profile extension.&quot;);
+    }
+
</ins><span class="cx">     // Create the real intermediate context and windows
</span><del>-    HDC parentHDC = display-&gt;getNativeDisplayId();
-    HWND parentWindow = WindowFromDC(parentHDC);
-
-    mWindow = CreateWindowExA(WS_EX_NOPARENTNOTIFY,
</del><ins>+    mWindow = CreateWindowExA(0,
</ins><span class="cx">                               reinterpret_cast&lt;const char *&gt;(mWindowClass),
</span><span class="cx">                               &quot;ANGLE Intermediate Window&quot;,
</span><span class="cx">                               WS_OVERLAPPEDWINDOW,
</span><span class="lines">@@ -205,10 +200,10 @@
</span><span class="cx">                               CW_USEDEFAULT,
</span><span class="cx">                               CW_USEDEFAULT,
</span><span class="cx">                               CW_USEDEFAULT,
</span><del>-                              parentWindow,
-                              NULL,
-                              NULL,
-                              NULL);
</del><ins>+                              nullptr,
+                              nullptr,
+                              nullptr,
+                              nullptr);
</ins><span class="cx">     if (!mWindow)
</span><span class="cx">     {
</span><span class="cx">         return egl::Error(EGL_NOT_INITIALIZED, &quot;Failed to create intermediate OpenGL window.&quot;);
</span><span class="lines">@@ -220,9 +215,22 @@
</span><span class="cx">         return egl::Error(EGL_NOT_INITIALIZED, &quot;Failed to get the device context of the intermediate OpenGL window.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mPixelFormat = ChoosePixelFormat(mDeviceContext, &amp;pixelFormatDescriptor);
</del><ins>+    if (mFunctionsWGL-&gt;choosePixelFormatARB)
+    {
+        std::vector&lt;int&gt; attribs = wgl::GetDefaultPixelFormatAttributes(false);
+
+        UINT matchingFormats = 0;
+        mFunctionsWGL-&gt;choosePixelFormatARB(mDeviceContext, &amp;attribs[0], nullptr, 1u, &amp;mPixelFormat,
+                                            &amp;matchingFormats);
+    }
+
</ins><span class="cx">     if (mPixelFormat == 0)
</span><span class="cx">     {
</span><ins>+        mPixelFormat = ChoosePixelFormat(mDeviceContext, &amp;pixelFormatDescriptor);
+    }
+
+    if (mPixelFormat == 0)
+    {
</ins><span class="cx">         return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not find a compatible pixel format for the intermediate OpenGL window.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -238,37 +246,67 @@
</span><span class="cx">         // TODO: handle robustness
</span><span class="cx"> 
</span><span class="cx">         int mask = 0;
</span><del>-        // Request core profile, TODO: Don't request core if requested GL version is less than 3.0
-        mask |= WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
</del><span class="cx"> 
</span><del>-        std::vector&lt;int&gt; contextCreationAttibutes;
</del><ins>+        if (requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)
+        {
+            mask |= WGL_CONTEXT_ES_PROFILE_BIT_EXT;
+        }
+        else
+        {
+            // Request core profile
+            mask |= WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
+        }
</ins><span class="cx"> 
</span><del>-        // TODO: create a context version based on the requested version and validate the version numbers
-        contextCreationAttibutes.push_back(WGL_CONTEXT_MAJOR_VERSION_ARB);
-        contextCreationAttibutes.push_back(3);
</del><ins>+        std::vector&lt;int&gt; contextCreationAttributes;
</ins><span class="cx"> 
</span><del>-        contextCreationAttibutes.push_back(WGL_CONTEXT_MINOR_VERSION_ARB);
-        contextCreationAttibutes.push_back(1);
</del><ins>+        // Don't request a specific version unless the user wants one.  WGL will return the highest version
+        // that the driver supports if no version is requested.
+        EGLint requestedMajorVersion = static_cast&lt;EGLint&gt;(
+            displayAttributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE));
+        EGLint requestedMinorVersion = static_cast&lt;EGLint&gt;(
+            displayAttributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, EGL_DONT_CARE));
+        if (requestedMajorVersion != EGL_DONT_CARE &amp;&amp; requestedMinorVersion != EGL_DONT_CARE)
+        {
+            contextCreationAttributes.push_back(WGL_CONTEXT_MAJOR_VERSION_ARB);
+            contextCreationAttributes.push_back(requestedMajorVersion);
</ins><span class="cx"> 
</span><ins>+            contextCreationAttributes.push_back(WGL_CONTEXT_MINOR_VERSION_ARB);
+            contextCreationAttributes.push_back(requestedMinorVersion);
+        }
+        else
+        {
+            // the ES profile will give us ES version 1.1 unless a higher version is requested.
+            // Requesting version 2.0 will give us the highest compatible version available (2.0,
+            // 3.0, 3.1, etc).
+            if (requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE)
+            {
+                contextCreationAttributes.push_back(WGL_CONTEXT_MAJOR_VERSION_ARB);
+                contextCreationAttributes.push_back(2);
+
+                contextCreationAttributes.push_back(WGL_CONTEXT_MINOR_VERSION_ARB);
+                contextCreationAttributes.push_back(0);
+            }
+        }
+
</ins><span class="cx">         // Set the flag attributes
</span><span class="cx">         if (flags != 0)
</span><span class="cx">         {
</span><del>-            contextCreationAttibutes.push_back(WGL_CONTEXT_FLAGS_ARB);
-            contextCreationAttibutes.push_back(flags);
</del><ins>+            contextCreationAttributes.push_back(WGL_CONTEXT_FLAGS_ARB);
+            contextCreationAttributes.push_back(flags);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Set the mask attribute
</span><span class="cx">         if (mask != 0)
</span><span class="cx">         {
</span><del>-            contextCreationAttibutes.push_back(WGL_CONTEXT_PROFILE_MASK_ARB);
-            contextCreationAttibutes.push_back(mask);
</del><ins>+            contextCreationAttributes.push_back(WGL_CONTEXT_PROFILE_MASK_ARB);
+            contextCreationAttributes.push_back(mask);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Signal the end of the attributes
</span><del>-        contextCreationAttibutes.push_back(0);
-        contextCreationAttibutes.push_back(0);
</del><ins>+        contextCreationAttributes.push_back(0);
+        contextCreationAttributes.push_back(0);
</ins><span class="cx"> 
</span><del>-        mWGLContext = mFunctionsWGL-&gt;createContextAttribsARB(mDeviceContext, NULL, &amp;contextCreationAttibutes[0]);
</del><ins>+        mWGLContext = mFunctionsWGL-&gt;createContextAttribsARB(mDeviceContext, NULL, &amp;contextCreationAttributes[0]);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // If wglCreateContextAttribsARB is unavailable or failed, try the standard wglCreateContext
</span><span class="lines">@@ -291,6 +329,38 @@
</span><span class="cx">     mFunctionsGL = new FunctionsGLWindows(mOpenGLModule, mFunctionsWGL-&gt;getProcAddress);
</span><span class="cx">     mFunctionsGL-&gt;initialize();
</span><span class="cx"> 
</span><ins>+    // Intel OpenGL ES drivers are not currently supported due to bugs in the driver and ANGLE
+    VendorID vendor = GetVendorID(mFunctionsGL);
+    if (requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE &amp;&amp; vendor == VENDOR_ID_INTEL)
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Intel OpenGL ES drivers are not supported.&quot;);
+    }
+
+    // Create DXGI swap chains for windows that come from other processes.  Windows is unable to
+    // SetPixelFormat on windows from other processes when a sandbox is enabled.
+    HDC nativeDisplay = display-&gt;getNativeDisplayId();
+    HWND nativeWindow = WindowFromDC(nativeDisplay);
+    if (nativeWindow != nullptr)
+    {
+        DWORD currentProcessId = GetCurrentProcessId();
+        DWORD windowProcessId;
+        GetWindowThreadProcessId(nativeWindow, &amp;windowProcessId);
+        mUseDXGISwapChains = (currentProcessId != windowProcessId);
+    }
+    else
+    {
+        mUseDXGISwapChains = false;
+    }
+
+    if (mUseDXGISwapChains)
+    {
+        egl::Error error = initializeD3DDevice();
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+
</ins><span class="cx">     return DisplayGL::initialize(display);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -298,6 +368,8 @@
</span><span class="cx"> {
</span><span class="cx">     DisplayGL::terminate();
</span><span class="cx"> 
</span><ins>+    releaseD3DDevice(mD3D11DeviceHandle);
+
</ins><span class="cx">     mFunctionsWGL-&gt;makeCurrent(mDeviceContext, NULL);
</span><span class="cx">     mFunctionsWGL-&gt;deleteContext(mWGLContext);
</span><span class="cx">     mWGLContext = NULL;
</span><span class="lines">@@ -316,68 +388,69 @@
</span><span class="cx"> 
</span><span class="cx">     FreeLibrary(mOpenGLModule);
</span><span class="cx">     mOpenGLModule = nullptr;
</span><del>-}
</del><span class="cx"> 
</span><del>-egl::Error DisplayWGL::createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window,
-                                           const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface)
-{
-    WindowSurfaceWGL *surface = new WindowSurfaceWGL(window, mWindowClass, mPixelFormat, mWGLContext, mFunctionsWGL);
-    egl::Error error = surface-&gt;initialize();
-    if (error.isError())
</del><ins>+    SafeRelease(mD3D11Device);
+
+    if (mDxgiModule)
</ins><span class="cx">     {
</span><del>-        SafeDelete(surface);
-        return error;
</del><ins>+        FreeLibrary(mDxgiModule);
+        mDxgiModule = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    *outSurface = surface;
-    return egl::Error(EGL_SUCCESS);
</del><ins>+    if (mD3d11Module)
+    {
+        FreeLibrary(mD3d11Module);
+        mD3d11Module = nullptr;
+    }
+
+    ASSERT(mRegisteredD3DDevices.empty());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error DisplayWGL::createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &amp;attribs,
-                                            SurfaceImpl **outSurface)
</del><ins>+SurfaceImpl *DisplayWGL::createWindowSurface(const egl::Config *configuration,
+                                             EGLNativeWindowType window,
+                                             const egl::AttributeMap &amp;attribs)
</ins><span class="cx"> {
</span><del>-    EGLint width = attribs.get(EGL_WIDTH, 0);
-    EGLint height = attribs.get(EGL_HEIGHT, 0);
-    bool largest = (attribs.get(EGL_LARGEST_PBUFFER, EGL_FALSE) == EGL_TRUE);
-    EGLenum textureFormat = attribs.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
-    EGLenum textureTarget = attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
-
-    PbufferSurfaceWGL *surface = new PbufferSurfaceWGL(width, height, textureFormat, textureTarget, largest,
-                                                       mPixelFormat, mDeviceContext, mWGLContext, mFunctionsWGL);
-    egl::Error error = surface-&gt;initialize();
-    if (error.isError())
</del><ins>+    EGLint orientation = static_cast&lt;EGLint&gt;(attribs.get(EGL_SURFACE_ORIENTATION_ANGLE, 0));
+    if (mUseDXGISwapChains)
</ins><span class="cx">     {
</span><del>-        SafeDelete(surface);
-        return error;
</del><ins>+        return new DXGISwapChainWindowSurfaceWGL(this-&gt;getRenderer(), window, mD3D11Device,
+                                                 mD3D11DeviceHandle, mWGLContext, mDeviceContext,
+                                                 mFunctionsGL, mFunctionsWGL, orientation);
</ins><span class="cx">     }
</span><del>-
-    *outSurface = surface;
-    return egl::Error(EGL_SUCCESS);
</del><ins>+    else
+    {
+        return new WindowSurfaceWGL(this-&gt;getRenderer(), window, mPixelFormat, mWGLContext,
+                                    mFunctionsWGL, orientation);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error DisplayWGL::createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
-                                                     const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface)
</del><ins>+SurfaceImpl *DisplayWGL::createPbufferSurface(const egl::Config *configuration,
+                                              const egl::AttributeMap &amp;attribs)
</ins><span class="cx"> {
</span><del>-    UNIMPLEMENTED();
-    return egl::Error(EGL_BAD_DISPLAY);
</del><ins>+    EGLint width          = static_cast&lt;EGLint&gt;(attribs.get(EGL_WIDTH, 0));
+    EGLint height         = static_cast&lt;EGLint&gt;(attribs.get(EGL_HEIGHT, 0));
+    bool largest = (attribs.get(EGL_LARGEST_PBUFFER, EGL_FALSE) == EGL_TRUE);
+    EGLenum textureFormat = static_cast&lt;EGLenum&gt;(attribs.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE));
+    EGLenum textureTarget = static_cast&lt;EGLenum&gt;(attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE));
+
+    return new PbufferSurfaceWGL(this-&gt;getRenderer(), width, height, textureFormat, textureTarget,
+                                 largest, mPixelFormat, mDeviceContext, mWGLContext, mFunctionsWGL);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error DisplayWGL::createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap,
-                                           const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface)
</del><ins>+SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::Config *configuration,
+                                                       EGLClientBuffer shareHandle,
+                                                       const egl::AttributeMap &amp;attribs)
</ins><span class="cx"> {
</span><span class="cx">     UNIMPLEMENTED();
</span><del>-    return egl::Error(EGL_BAD_DISPLAY);
</del><ins>+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static int QueryWGLFormatAttrib(HDC dc, int format, int attribName, const FunctionsWGL *functions)
</del><ins>+SurfaceImpl *DisplayWGL::createPixmapSurface(const egl::Config *configuration,
+                                             NativePixmapType nativePixmap,
+                                             const egl::AttributeMap &amp;attribs)
</ins><span class="cx"> {
</span><del>-    int result = 0;
-    if (functions-&gt;getPixelFormatAttribivARB == nullptr ||
-        !functions-&gt;getPixelFormatAttribivARB(dc, format, 0, 1, &amp;attribName, &amp;result))
-    {
-        return 0;
-    }
-    return result;
</del><ins>+    UNIMPLEMENTED();
+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> egl::Error DisplayWGL::getDevice(DeviceImpl **device)
</span><span class="lines">@@ -399,9 +472,21 @@
</span><span class="cx">         maxSwapInterval = 8;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    const gl::Version &amp;maxVersion = getMaxSupportedESVersion();
+    ASSERT(maxVersion &gt;= gl::Version(2, 0));
+    bool supportsES3 = maxVersion &gt;= gl::Version(3, 0);
+
</ins><span class="cx">     PIXELFORMATDESCRIPTOR pixelFormatDescriptor;
</span><span class="cx">     DescribePixelFormat(mDeviceContext, mPixelFormat, sizeof(pixelFormatDescriptor), &amp;pixelFormatDescriptor);
</span><span class="cx"> 
</span><ins>+    auto getAttrib = [this](int attrib)
+    {
+        return wgl::QueryWGLFormatAttrib(mDeviceContext, mPixelFormat, attrib, mFunctionsWGL);
+    };
+
+    const EGLint optimalSurfaceOrientation =
+        mUseDXGISwapChains ? EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE : 0;
+
</ins><span class="cx">     egl::Config config;
</span><span class="cx">     config.renderTargetFormat = GL_RGBA8; // TODO: use the bit counts to determine the format
</span><span class="cx">     config.depthStencilFormat = GL_DEPTH24_STENCIL8; // TODO: use the bit counts to determine the format
</span><span class="lines">@@ -412,30 +497,33 @@
</span><span class="cx">     config.luminanceSize = 0;
</span><span class="cx">     config.alphaSize = pixelFormatDescriptor.cAlphaBits;
</span><span class="cx">     config.alphaMaskSize = 0;
</span><del>-    config.bindToTextureRGB = (QueryWGLFormatAttrib(mDeviceContext, mPixelFormat, WGL_BIND_TO_TEXTURE_RGB_ARB, mFunctionsWGL) == TRUE);
-    config.bindToTextureRGBA = (QueryWGLFormatAttrib(mDeviceContext, mPixelFormat, WGL_BIND_TO_TEXTURE_RGBA_ARB, mFunctionsWGL) == TRUE);
</del><ins>+    config.bindToTextureRGB   = (getAttrib(WGL_BIND_TO_TEXTURE_RGB_ARB) == TRUE);
+    config.bindToTextureRGBA  = (getAttrib(WGL_BIND_TO_TEXTURE_RGBA_ARB) == TRUE);
</ins><span class="cx">     config.colorBufferType = EGL_RGB_BUFFER;
</span><span class="cx">     config.configCaveat = EGL_NONE;
</span><del>-    config.configID = mPixelFormat;
-    config.conformant = EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT_KHR; // TODO: determine the GL version and what ES versions it supports
</del><ins>+    config.conformant = EGL_OPENGL_ES2_BIT | (supportsES3 ? EGL_OPENGL_ES3_BIT_KHR : 0);
</ins><span class="cx">     config.depthSize = pixelFormatDescriptor.cDepthBits;
</span><span class="cx">     config.level = 0;
</span><span class="cx">     config.matchNativePixmap = EGL_NONE;
</span><del>-    config.maxPBufferWidth = QueryWGLFormatAttrib(mDeviceContext, mPixelFormat, WGL_MAX_PBUFFER_WIDTH_ARB, mFunctionsWGL);
-    config.maxPBufferHeight = QueryWGLFormatAttrib(mDeviceContext, mPixelFormat, WGL_MAX_PBUFFER_HEIGHT_ARB, mFunctionsWGL);
-    config.maxPBufferPixels = QueryWGLFormatAttrib(mDeviceContext, mPixelFormat, WGL_MAX_PBUFFER_PIXELS_ARB, mFunctionsWGL);
</del><ins>+    config.maxPBufferWidth    = getAttrib(WGL_MAX_PBUFFER_WIDTH_ARB);
+    config.maxPBufferHeight   = getAttrib(WGL_MAX_PBUFFER_HEIGHT_ARB);
+    config.maxPBufferPixels   = getAttrib(WGL_MAX_PBUFFER_PIXELS_ARB);
</ins><span class="cx">     config.maxSwapInterval = maxSwapInterval;
</span><span class="cx">     config.minSwapInterval = minSwapInterval;
</span><span class="cx">     config.nativeRenderable = EGL_TRUE; // Direct rendering
</span><span class="cx">     config.nativeVisualID = 0;
</span><span class="cx">     config.nativeVisualType = EGL_NONE;
</span><del>-    config.renderableType = EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT_KHR; // TODO
</del><ins>+    config.renderableType = EGL_OPENGL_ES2_BIT | (supportsES3 ? EGL_OPENGL_ES3_BIT_KHR : 0);
</ins><span class="cx">     config.sampleBuffers = 0; // FIXME: enumerate multi-sampling
</span><span class="cx">     config.samples = 0;
</span><span class="cx">     config.stencilSize = pixelFormatDescriptor.cStencilBits;
</span><del>-    config.surfaceType = ((pixelFormatDescriptor.dwFlags &amp; PFD_DRAW_TO_WINDOW) ? EGL_WINDOW_BIT : 0) |
-                         ((QueryWGLFormatAttrib(mDeviceContext, mPixelFormat, WGL_DRAW_TO_PBUFFER_ARB, mFunctionsWGL) == TRUE) ? EGL_PBUFFER_BIT : 0) |
-                         EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
</del><ins>+    config.surfaceType =
+        ((pixelFormatDescriptor.dwFlags &amp; PFD_DRAW_TO_WINDOW) ? EGL_WINDOW_BIT : 0) |
+        ((getAttrib(WGL_DRAW_TO_PBUFFER_ARB) == TRUE) ? EGL_PBUFFER_BIT : 0) |
+        ((getAttrib(WGL_SWAP_METHOD_ARB) == WGL_SWAP_COPY_ARB) ? EGL_SWAP_BEHAVIOR_PRESERVED_BIT
+                                                               : 0);
+    config.optimalOrientation = optimalSurfaceOrientation;
+
</ins><span class="cx">     config.transparentType = EGL_NONE;
</span><span class="cx">     config.transparentRedValue = 0;
</span><span class="cx">     config.transparentGreenValue = 0;
</span><span class="lines">@@ -480,9 +568,60 @@
</span><span class="cx">     return mFunctionsGL;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+egl::Error DisplayWGL::initializeD3DDevice()
+{
+    if (mD3D11Device != nullptr)
+    {
+        return egl::Error(EGL_SUCCESS);
+    }
+
+    mDxgiModule = LoadLibrary(TEXT(&quot;dxgi.dll&quot;));
+    if (!mDxgiModule)
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Failed to load DXGI library.&quot;);
+    }
+
+    mD3d11Module = LoadLibrary(TEXT(&quot;d3d11.dll&quot;));
+    if (!mD3d11Module)
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Failed to load d3d11 library.&quot;);
+    }
+
+    PFN_D3D11_CREATE_DEVICE d3d11CreateDevice = nullptr;
+    d3d11CreateDevice = reinterpret_cast&lt;PFN_D3D11_CREATE_DEVICE&gt;(
+        GetProcAddress(mD3d11Module, &quot;D3D11CreateDevice&quot;));
+    if (d3d11CreateDevice == nullptr)
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not retrieve D3D11CreateDevice address.&quot;);
+    }
+
+    HRESULT result = d3d11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0,
+                                       D3D11_SDK_VERSION, &amp;mD3D11Device, nullptr, nullptr);
+    if (FAILED(result))
+    {
+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Could not create D3D11 device, error: 0x%X&quot;,
+                          result);
+    }
+
+    egl::Error error = registerD3DDevice(mD3D11Device, &amp;mD3D11DeviceHandle);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    return egl::Error(EGL_SUCCESS);
+}
+
</ins><span class="cx"> void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
</span><span class="cx"> {
</span><del>-    //UNIMPLEMENTED();
</del><ins>+    outExtensions-&gt;createContext = true;
+    outExtensions-&gt;createContextNoError = true;
+
+    // Only enable the surface orientation  and post sub buffer for DXGI swap chain surfaces, they
+    // prefer to swap with
+    // inverted Y.
+    outExtensions-&gt;postSubBuffer      = mUseDXGISwapChains;
+    outExtensions-&gt;surfaceOrientation = mUseDXGISwapChains;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DisplayWGL::generateCaps(egl::Caps *outCaps) const
</span><span class="lines">@@ -490,4 +629,71 @@
</span><span class="cx">     outCaps-&gt;textureNPOT = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+egl::Error DisplayWGL::waitClient() const
+{
+    // Unimplemented as this is not needed for WGL
+    return egl::Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><ins>+
+egl::Error DisplayWGL::waitNative(EGLint engine,
+                                  egl::Surface *drawSurface,
+                                  egl::Surface *readSurface) const
+{
+    // Unimplemented as this is not needed for WGL
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error DisplayWGL::getDriverVersion(std::string *version) const
+{
+    *version = &quot;&quot;;
+    return egl::Error(EGL_SUCCESS);
+}
+
+egl::Error DisplayWGL::registerD3DDevice(IUnknown *device, HANDLE *outHandle)
+{
+    ASSERT(device != nullptr);
+    ASSERT(outHandle != nullptr);
+
+    auto iter = mRegisteredD3DDevices.find(device);
+    if (iter != mRegisteredD3DDevices.end())
+    {
+        iter-&gt;second.refCount++;
+        *outHandle = iter-&gt;second.handle;
+        return egl::Error(EGL_SUCCESS);
+    }
+
+    HANDLE handle = mFunctionsWGL-&gt;dxOpenDeviceNV(device);
+    if (!handle)
+    {
+        return egl::Error(EGL_BAD_PARAMETER, &quot;Failed to open D3D device.&quot;);
+    }
+
+    device-&gt;AddRef();
+
+    D3DObjectHandle newDeviceInfo;
+    newDeviceInfo.handle          = handle;
+    newDeviceInfo.refCount        = 1;
+    mRegisteredD3DDevices[device] = newDeviceInfo;
+
+    *outHandle = handle;
+    return egl::Error(EGL_SUCCESS);
+}
+
+void DisplayWGL::releaseD3DDevice(HANDLE deviceHandle)
+{
+    for (auto iter = mRegisteredD3DDevices.begin(); iter != mRegisteredD3DDevices.end(); iter++)
+    {
+        if (iter-&gt;second.handle == deviceHandle)
+        {
+            iter-&gt;second.refCount--;
+            if (iter-&gt;second.refCount == 0)
+            {
+                mFunctionsWGL-&gt;dxCloseDeviceNV(iter-&gt;second.handle);
+                iter-&gt;first-&gt;Release();
+                mRegisteredD3DDevices.erase(iter);
+                break;
+            }
+        }
+    }
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglDisplayWGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -27,14 +27,18 @@
</span><span class="cx">     egl::Error initialize(egl::Display *display) override;
</span><span class="cx">     void terminate() override;
</span><span class="cx"> 
</span><del>-    egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &amp;attribs,
-                                   SurfaceImpl **outSurface) override;
-    egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &amp;attribs,
-                                    SurfaceImpl **outSurface) override;
-    egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
-                                             const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface) override;
-    egl::Error createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap,
-                                   const egl::AttributeMap &amp;attribs, SurfaceImpl **outSurface) override;
</del><ins>+    // Surface creation
+    SurfaceImpl *createWindowSurface(const egl::Config *configuration,
+                                     EGLNativeWindowType window,
+                                     const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
+                                      const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
+                                               EGLClientBuffer shareHandle,
+                                               const egl::AttributeMap &amp;attribs) override;
+    SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
+                                     NativePixmapType nativePixmap,
+                                     const egl::AttributeMap &amp;attribs) override;
</ins><span class="cx"> 
</span><span class="cx">     egl::ConfigSet generateConfigs() const override;
</span><span class="cx"> 
</span><span class="lines">@@ -48,9 +52,21 @@
</span><span class="cx"> 
</span><span class="cx">     std::string getVendorString() const override;
</span><span class="cx"> 
</span><ins>+    egl::Error waitClient() const override;
+    egl::Error waitNative(EGLint engine,
+                          egl::Surface *drawSurface,
+                          egl::Surface *readSurface) const override;
+
+    egl::Error getDriverVersion(std::string *version) const override;
+
+    egl::Error registerD3DDevice(IUnknown *device, HANDLE *outHandle);
+    void releaseD3DDevice(HANDLE handle);
+
</ins><span class="cx">   private:
</span><span class="cx">     const FunctionsGL *getFunctionsGL() const override;
</span><span class="cx"> 
</span><ins>+    egl::Error initializeD3DDevice();
+
</ins><span class="cx">     void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
</span><span class="cx">     void generateCaps(egl::Caps *outCaps) const override;
</span><span class="cx"> 
</span><span class="lines">@@ -65,6 +81,19 @@
</span><span class="cx">     int mPixelFormat;
</span><span class="cx">     HGLRC mWGLContext;
</span><span class="cx"> 
</span><ins>+    bool mUseDXGISwapChains;
+    HMODULE mDxgiModule;
+    HMODULE mD3d11Module;
+    HANDLE mD3D11DeviceHandle;
+    ID3D11Device *mD3D11Device;
+
+    struct D3DObjectHandle
+    {
+        HANDLE handle;
+        size_t refCount;
+    };
+    std::map&lt;IUnknown *, D3DObjectHandle&gt; mRegisteredD3DDevices;
+
</ins><span class="cx">     egl::Display *mDisplay;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglFunctionsWGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/FunctionsWGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,6 +8,10 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/FunctionsWGL.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;algorithm&gt;
+
+#include &quot;common/string_utils.h&quot;
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -30,12 +34,15 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename T&gt;
</span><del>-static void GetWGLExtensionProcAddress(HMODULE glModule, PFNWGLGETPROCADDRESSPROC getProcAddressWGL,
-                                       const std::string &amp;extensions, const std::string &amp;extensionName,
-                                       const std::string &amp;procName, T *outProcAddress)
</del><ins>+static void GetWGLExtensionProcAddress(HMODULE glModule,
+                                       PFNWGLGETPROCADDRESSPROC getProcAddressWGL,
+                                       const std::vector&lt;std::string&gt; &amp;extensions,
+                                       const std::string &amp;extensionName,
+                                       const std::string &amp;procName,
+                                       T *outProcAddress)
</ins><span class="cx"> {
</span><span class="cx">     T proc = nullptr;
</span><del>-    if (extensions.find(extensionName) != std::string::npos)
</del><ins>+    if (std::find(extensions.begin(), extensions.end(), extensionName) != extensions.end())
</ins><span class="cx">     {
</span><span class="cx">         GetWGLProcAddress(glModule, getProcAddressWGL, procName, &amp;proc);
</span><span class="cx">     }
</span><span class="lines">@@ -64,10 +71,12 @@
</span><span class="cx">       realizeLayerPalette(nullptr),
</span><span class="cx">       swapLayerBuffers(nullptr),
</span><span class="cx">       swapMultipleBuffers(nullptr),
</span><ins>+      getExtensionStringEXT(nullptr),
+      getExtensionStringARB(nullptr),
</ins><span class="cx">       createContextAttribsARB(nullptr),
</span><span class="cx">       getPixelFormatAttribivARB(nullptr),
</span><del>-      getExtensionStringEXT(nullptr),
-      getExtensionStringARB(nullptr),
</del><ins>+      getPixelFormatAttribfvARB(nullptr),
+      choosePixelFormatARB(nullptr),
</ins><span class="cx">       swapIntervalEXT(nullptr),
</span><span class="cx">       createPbufferARB(nullptr),
</span><span class="cx">       getPbufferDCARB(nullptr),
</span><span class="lines">@@ -76,7 +85,15 @@
</span><span class="cx">       queryPbufferARB(nullptr),
</span><span class="cx">       bindTexImageARB(nullptr),
</span><span class="cx">       releaseTexImageARB(nullptr),
</span><del>-      setPbufferAttribARB(nullptr)
</del><ins>+      setPbufferAttribARB(nullptr),
+      dxSetResourceShareHandleNV(nullptr),
+      dxOpenDeviceNV(nullptr),
+      dxCloseDeviceNV(nullptr),
+      dxRegisterObjectNV(nullptr),
+      dxUnregisterObjectNV(nullptr),
+      dxObjectAccessNV(nullptr),
+      dxLockObjectsNV(nullptr),
+      dxUnlockObjectsNV(nullptr)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -110,19 +127,28 @@
</span><span class="cx">     GetWGLProcAddress(glModule, getProcAddress, &quot;wglGetExtensionsStringEXT&quot;, &amp;getExtensionStringEXT);
</span><span class="cx">     GetWGLProcAddress(glModule, getProcAddress, &quot;wglGetExtensionsStringARB&quot;, &amp;getExtensionStringARB);
</span><span class="cx"> 
</span><del>-    std::string extensions = &quot;&quot;;
</del><ins>+    std::string extensionString = &quot;&quot;;
</ins><span class="cx">     if (getExtensionStringEXT)
</span><span class="cx">     {
</span><del>-        extensions = getExtensionStringEXT();
</del><ins>+        extensionString = getExtensionStringEXT();
</ins><span class="cx">     }
</span><span class="cx">     else if (getExtensionStringARB &amp;&amp; context)
</span><span class="cx">     {
</span><del>-        extensions = getExtensionStringARB(context);
</del><ins>+        extensionString = getExtensionStringARB(context);
</ins><span class="cx">     }
</span><ins>+    angle::SplitStringAlongWhitespace(extensionString, &amp;extensions);
</ins><span class="cx"> 
</span><span class="cx">     // Load the wgl extension functions by checking if the context supports the extension first
</span><ins>+
+    // WGL_ARB_create_context
</ins><span class="cx">     GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_ARB_create_context&quot;, &quot;wglCreateContextAttribsARB&quot;, &amp;createContextAttribsARB);
</span><ins>+
+    // WGL_ARB_pixel_format
</ins><span class="cx">     GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_ARB_pixel_format&quot;, &quot;wglGetPixelFormatAttribivARB&quot;, &amp;getPixelFormatAttribivARB);
</span><ins>+    GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_ARB_pixel_format&quot;, &quot;wglGetPixelFormatAttribfvARB&quot;, &amp;getPixelFormatAttribfvARB);
+    GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_ARB_pixel_format&quot;, &quot;wglChoosePixelFormatARB&quot;, &amp;choosePixelFormatARB);
+
+    // WGL_EXT_swap_control
</ins><span class="cx">     GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_EXT_swap_control&quot;, &quot;wglSwapIntervalEXT&quot;, &amp;swapIntervalEXT);
</span><span class="cx"> 
</span><span class="cx">     // WGL_ARB_pbuffer
</span><span class="lines">@@ -136,6 +162,20 @@
</span><span class="cx">     GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_ARB_render_texture&quot;, &quot;wglBindTexImageARB&quot;, &amp;bindTexImageARB);
</span><span class="cx">     GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_ARB_render_texture&quot;, &quot;wglReleaseTexImageARB&quot;, &amp;releaseTexImageARB);
</span><span class="cx">     GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_ARB_render_texture&quot;, &quot;wglSetPbufferAttribARB&quot;, &amp;setPbufferAttribARB);
</span><ins>+
+    // WGL_NV_DX_interop
+    GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_NV_DX_interop&quot;, &quot;wglDXSetResourceShareHandleNV&quot;, &amp;dxSetResourceShareHandleNV);
+    GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_NV_DX_interop&quot;, &quot;wglDXOpenDeviceNV&quot;, &amp;dxOpenDeviceNV);
+    GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_NV_DX_interop&quot;, &quot;wglDXCloseDeviceNV&quot;, &amp;dxCloseDeviceNV);
+    GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_NV_DX_interop&quot;, &quot;wglDXRegisterObjectNV&quot;, &amp;dxRegisterObjectNV);
+    GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_NV_DX_interop&quot;, &quot;wglDXUnregisterObjectNV&quot;, &amp;dxUnregisterObjectNV);
+    GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_NV_DX_interop&quot;, &quot;wglDXObjectAccessNV&quot;, &amp;dxObjectAccessNV);
+    GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_NV_DX_interop&quot;, &quot;wglDXLockObjectsNV&quot;, &amp;dxLockObjectsNV);
+    GetWGLExtensionProcAddress(glModule, getProcAddress, extensions, &quot;WGL_NV_DX_interop&quot;, &quot;wglDXUnlockObjectsNV&quot;, &amp;dxUnlockObjectsNV);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool FunctionsWGL::hasExtension(const std::string &amp;ext) const
+{
+    return std::find(extensions.begin(), extensions.end(), ext) != extensions.end();
</ins><span class="cx"> }
</span><ins>+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglFunctionsWGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/FunctionsWGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/FunctionsWGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/FunctionsWGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,6 +6,9 @@
</span><span class="cx"> 
</span><span class="cx"> // FunctionsWGL.h: Defines the FuntionsWGL class to contain loaded WGL functions
</span><span class="cx"> 
</span><ins>+#ifndef LIBANGLE_RENDERER_GL_WGL_FUNCTIONS_WGL
+#define LIBANGLE_RENDERER_GL_WGL_FUNCTIONS_WGL
+
</ins><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/functionswgl_typedefs.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -20,6 +23,10 @@
</span><span class="cx">     // Loads all available wgl functions, may be called multiple times
</span><span class="cx">     void initialize(HMODULE glModule, HDC context);
</span><span class="cx"> 
</span><ins>+    // Extension information
+    std::vector&lt;std::string&gt; extensions;
+    bool hasExtension(const std::string &amp;ext) const;
+
</ins><span class="cx">     // Base WGL functions
</span><span class="cx">     PFNWGLCOPYCONTEXTPROC copyContext;
</span><span class="cx">     PFNWGLCREATECONTEXTPROC createContext;
</span><span class="lines">@@ -42,11 +49,21 @@
</span><span class="cx">     PFNWGLSWAPLAYERBUFFERSPROC swapLayerBuffers;
</span><span class="cx">     PFNWGLSWAPMULTIPLEBUFFERSPROC swapMultipleBuffers;
</span><span class="cx"> 
</span><del>-    // Extension functions, may be NULL
</del><ins>+    // WGL_EXT_extensions_string
+    PFNWGLGETEXTENSIONSSTRINGEXTPROC getExtensionStringEXT;
+
+    // WGL_ARB_extensions_string
+    PFNWGLGETEXTENSIONSSTRINGARBPROC getExtensionStringARB;
+
+    // WGL_ARB_create_context
</ins><span class="cx">     PFNWGLCREATECONTEXTATTRIBSARBPROC createContextAttribsARB;
</span><ins>+
+    // WGL_ARB_pixel_format
</ins><span class="cx">     PFNWGLGETPIXELFORMATATTRIBIVARBPROC getPixelFormatAttribivARB;
</span><del>-    PFNWGLGETEXTENSIONSSTRINGEXTPROC getExtensionStringEXT;
-    PFNWGLGETEXTENSIONSSTRINGARBPROC getExtensionStringARB;
</del><ins>+    PFNWGLGETPIXELFORMATATTRIBFVARBPROC getPixelFormatAttribfvARB;
+    PFNWGLCHOOSEPIXELFORMATARBPROC choosePixelFormatARB;
+
+    // WGL_EXT_swap_control
</ins><span class="cx">     PFNWGLSWAPINTERVALEXTPROC swapIntervalEXT;
</span><span class="cx"> 
</span><span class="cx">     // WGL_ARB_pbuffer
</span><span class="lines">@@ -60,6 +77,18 @@
</span><span class="cx">     PFNWGLBINDTEXIMAGEARBPROC bindTexImageARB;
</span><span class="cx">     PFNWGLRELEASETEXIMAGEARBPROC releaseTexImageARB;
</span><span class="cx">     PFNWGLSETPBUFFERATTRIBARBPROC setPbufferAttribARB;
</span><ins>+
+    // WGL_NV_DX_interop
+    PFNWGLDXSETRESOURCESHAREHANDLENVPROC dxSetResourceShareHandleNV;
+    PFNWGLDXOPENDEVICENVPROC dxOpenDeviceNV;
+    PFNWGLDXCLOSEDEVICENVPROC dxCloseDeviceNV;
+    PFNWGLDXREGISTEROBJECTNVPROC dxRegisterObjectNV;
+    PFNWGLDXUNREGISTEROBJECTNVPROC dxUnregisterObjectNV;
+    PFNWGLDXOBJECTACCESSNVPROC dxObjectAccessNV;
+    PFNWGLDXLOCKOBJECTSNVPROC dxLockObjectsNV;
+    PFNWGLDXUNLOCKOBJECTSNVPROC dxUnlockObjectsNV;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span><ins>+
+#endif // LIBANGLE_RENDERER_GL_WGL_FUNCTIONS_WGL
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglPbufferSurfaceWGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,24 +9,32 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/RendererGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/FunctionsWGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/wgl_utils.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-PbufferSurfaceWGL::PbufferSurfaceWGL(EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget,
-                                     bool largest, int pixelFormat, HDC deviceContext, HGLRC wglContext,
</del><ins>+PbufferSurfaceWGL::PbufferSurfaceWGL(RendererGL *renderer,
+                                     EGLint width,
+                                     EGLint height,
+                                     EGLenum textureFormat,
+                                     EGLenum textureTarget,
+                                     bool largest,
+                                     int pixelFormat,
+                                     HDC deviceContext,
+                                     HGLRC wglContext,
</ins><span class="cx">                                      const FunctionsWGL *functions)
</span><del>-    : SurfaceGL(),
</del><ins>+    : SurfaceGL(renderer),
</ins><span class="cx">       mWidth(width),
</span><span class="cx">       mHeight(height),
</span><span class="cx">       mLargest(largest),
</span><span class="cx">       mTextureFormat(textureFormat),
</span><span class="cx">       mTextureTarget(textureTarget),
</span><span class="cx">       mPixelFormat(pixelFormat),
</span><ins>+      mShareWGLContext(wglContext),
</ins><span class="cx">       mParentDeviceContext(deviceContext),
</span><del>-      mShareWGLContext(wglContext),
</del><span class="cx">       mPbuffer(nullptr),
</span><span class="cx">       mPbufferDeviceContext(nullptr),
</span><span class="cx">       mFunctionsWGL(functions)
</span><span class="lines">@@ -138,7 +146,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error PbufferSurfaceWGL::bindTexImage(EGLint buffer)
</del><ins>+egl::Error PbufferSurfaceWGL::bindTexImage(gl::Texture *texture, EGLint buffer)
</ins><span class="cx"> {
</span><span class="cx">     if (!mFunctionsWGL-&gt;bindTexImageARB(mPbuffer, GetWGLBufferBindTarget(buffer)))
</span><span class="cx">     {
</span><span class="lines">@@ -179,4 +187,9 @@
</span><span class="cx">     return EGL_FALSE;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+EGLint PbufferSurfaceWGL::getSwapBehavior() const
+{
+    return EGL_BUFFER_PRESERVED;
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglPbufferSurfaceWGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,18 +21,25 @@
</span><span class="cx"> class PbufferSurfaceWGL : public SurfaceGL
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    PbufferSurfaceWGL(EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget,
-                      bool largest, int pixelFormat, HDC deviceContext, HGLRC wglContext,
</del><ins>+    PbufferSurfaceWGL(RendererGL *renderer,
+                      EGLint width,
+                      EGLint height,
+                      EGLenum textureFormat,
+                      EGLenum textureTarget,
+                      bool largest,
+                      int pixelFormat,
+                      HDC deviceContext,
+                      HGLRC wglContext,
</ins><span class="cx">                       const FunctionsWGL *functions);
</span><span class="cx">     ~PbufferSurfaceWGL() override;
</span><span class="cx"> 
</span><del>-    egl::Error initialize();
</del><ins>+    egl::Error initialize() override;
</ins><span class="cx">     egl::Error makeCurrent() override;
</span><span class="cx"> 
</span><span class="cx">     egl::Error swap() override;
</span><span class="cx">     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
</span><span class="cx">     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
</span><del>-    egl::Error bindTexImage(EGLint buffer) override;
</del><ins>+    egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
</ins><span class="cx">     egl::Error releaseTexImage(EGLint buffer) override;
</span><span class="cx">     void setSwapInterval(EGLint interval) override;
</span><span class="cx"> 
</span><span class="lines">@@ -40,6 +47,7 @@
</span><span class="cx">     EGLint getHeight() const override;
</span><span class="cx"> 
</span><span class="cx">     EGLint isPostSubBufferSupported() const override;
</span><ins>+    EGLint getSwapBehavior() const override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><span class="cx">     EGLint mWidth;
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglWindowSurfaceWGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,74 +9,80 @@
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><ins>+#include &quot;libANGLE/renderer/gl/RendererGL.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/FunctionsWGL.h&quot;
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/wgl_utils.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><del>-WindowSurfaceWGL::WindowSurfaceWGL(EGLNativeWindowType window, ATOM windowClass, int pixelFormat, HGLRC wglContext, const FunctionsWGL *functions)
-    : SurfaceGL(),
-      mWindowClass(windowClass),
</del><ins>+WindowSurfaceWGL::WindowSurfaceWGL(RendererGL *renderer,
+                                   EGLNativeWindowType window,
+                                   int pixelFormat,
+                                   HGLRC wglContext,
+                                   const FunctionsWGL *functions,
+                                   EGLint orientation)
+    : SurfaceGL(renderer),
</ins><span class="cx">       mPixelFormat(pixelFormat),
</span><del>-      mShareWGLContext(wglContext),
-      mParentWindow(window),
-      mChildWindow(nullptr),
-      mChildDeviceContext(nullptr),
-      mFunctionsWGL(functions)
</del><ins>+      mWGLContext(wglContext),
+      mWindow(window),
+      mDeviceContext(nullptr),
+      mFunctionsWGL(functions),
+      mSwapBehavior(0)
</ins><span class="cx"> {
</span><ins>+    // EGL_ANGLE_surface_orientation is not supported for regular WGL window surfaces
+    ASSERT(orientation == 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WindowSurfaceWGL::~WindowSurfaceWGL()
</span><span class="cx"> {
</span><del>-    mWindowClass = 0;
-    mPixelFormat = 0;
-    mShareWGLContext = nullptr;
-
-    ReleaseDC(mChildWindow, mChildDeviceContext);
-    mChildDeviceContext = nullptr;
-
-    DestroyWindow(mChildWindow);
-    mChildWindow = nullptr;
</del><ins>+    ReleaseDC(mWindow, mDeviceContext);
+    mDeviceContext = nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> egl::Error WindowSurfaceWGL::initialize()
</span><span class="cx"> {
</span><del>-    // Create a child window of the supplied window to draw to.
-    RECT rect;
-    if (!GetClientRect(mParentWindow, &amp;rect))
</del><ins>+    mDeviceContext = GetDC(mWindow);
+    if (!mDeviceContext)
</ins><span class="cx">     {
</span><del>-        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to get the size of the native window.&quot;);
</del><ins>+        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to get the device context from the native window, &quot;
+                                                 &quot;error: 0x%X.&quot;, GetLastError());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mChildWindow = CreateWindowExA(WS_EX_NOPARENTNOTIFY,
-                                   reinterpret_cast&lt;const char*&gt;(mWindowClass),
-                                   &quot;ANGLE Intermediate Surface Window&quot;,
-                                   WS_CHILDWINDOW | WS_DISABLED | WS_VISIBLE,
-                                   0,
-                                   0,
-                                   rect.right - rect.left,
-                                   rect.bottom - rect.top,
-                                   mParentWindow,
-                                   NULL,
-                                   NULL,
-                                   NULL);
-    if (!mChildWindow)
</del><ins>+    // Require that the pixel format for this window has not been set yet or is equal to the Display's pixel format.
+    int windowPixelFormat = GetPixelFormat(mDeviceContext);
+    if (windowPixelFormat == 0)
</ins><span class="cx">     {
</span><del>-        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to create a child window.&quot;);
-    }
</del><ins>+        PIXELFORMATDESCRIPTOR pixelFormatDescriptor = { 0 };
+        if (!DescribePixelFormat(mDeviceContext, mPixelFormat, sizeof(pixelFormatDescriptor), &amp;pixelFormatDescriptor))
+        {
+            return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to DescribePixelFormat, error: 0x%X.&quot;, GetLastError());
+        }
</ins><span class="cx"> 
</span><del>-    mChildDeviceContext = GetDC(mChildWindow);
-    if (!mChildDeviceContext)
</del><ins>+        if (!SetPixelFormat(mDeviceContext, mPixelFormat, &amp;pixelFormatDescriptor))
+        {
+            return egl::Error(EGL_NOT_INITIALIZED, &quot;Failed to set the pixel format on the device context, &quot;
+                                                   &quot;error: 0x%X.&quot;, GetLastError());
+        }
+    }
+    else if (windowPixelFormat != mPixelFormat)
</ins><span class="cx">     {
</span><del>-        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to get the device context of the child window.&quot;);
</del><ins>+        return egl::Error(EGL_NOT_INITIALIZED, &quot;Pixel format of the NativeWindow and NativeDisplayType must match.&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const PIXELFORMATDESCRIPTOR pixelFormatDescriptor = wgl::GetDefaultPixelFormatDescriptor();
-
-    if (!SetPixelFormat(mChildDeviceContext, mPixelFormat, &amp;pixelFormatDescriptor))
</del><ins>+    // Check for the swap behavior of this pixel format
+    switch (
+        wgl::QueryWGLFormatAttrib(mDeviceContext, mPixelFormat, WGL_SWAP_METHOD_ARB, mFunctionsWGL))
</ins><span class="cx">     {
</span><del>-        return egl::Error(EGL_BAD_NATIVE_WINDOW, &quot;Failed to set the pixel format on the child window.&quot;);
</del><ins>+        case WGL_SWAP_COPY_ARB:
+            mSwapBehavior = EGL_BUFFER_PRESERVED;
+            break;
+
+        case WGL_SWAP_EXCHANGE_ARB:
+        case WGL_SWAP_UNDEFINED_ARB:
+        default:
+            mSwapBehavior = EGL_BUFFER_DESTROYED;
+            break;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="lines">@@ -84,7 +90,7 @@
</span><span class="cx"> 
</span><span class="cx"> egl::Error WindowSurfaceWGL::makeCurrent()
</span><span class="cx"> {
</span><del>-    if (!mFunctionsWGL-&gt;makeCurrent(mChildDeviceContext, mShareWGLContext))
</del><ins>+    if (!mFunctionsWGL-&gt;makeCurrent(mDeviceContext, mWGLContext))
</ins><span class="cx">     {
</span><span class="cx">         // TODO: What error type here?
</span><span class="cx">         return egl::Error(EGL_CONTEXT_LOST, &quot;Failed to make the WGL context current.&quot;);
</span><span class="lines">@@ -95,23 +101,9 @@
</span><span class="cx"> 
</span><span class="cx"> egl::Error WindowSurfaceWGL::swap()
</span><span class="cx"> {
</span><del>-    // Resize the child window to the interior of the parent window.
-    RECT rect;
-    if (!GetClientRect(mParentWindow, &amp;rect))
</del><ins>+    if (!mFunctionsWGL-&gt;swapBuffers(mDeviceContext))
</ins><span class="cx">     {
</span><span class="cx">         // TODO: What error type here?
</span><del>-        return egl::Error(EGL_CONTEXT_LOST, &quot;Failed to get the size of the native window.&quot;);
-    }
-
-    if (!MoveWindow(mChildWindow, 0, 0, rect.right - rect.left, rect.bottom - rect.top, FALSE))
-    {
-        // TODO: What error type here?
-        return egl::Error(EGL_CONTEXT_LOST, &quot;Failed to move the child window.&quot;);
-    }
-
-    if (!mFunctionsWGL-&gt;swapBuffers(mChildDeviceContext))
-    {
-        // TODO: What error type here?
</del><span class="cx">         return egl::Error(EGL_CONTEXT_LOST, &quot;Failed to swap buffers on the child window.&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -130,7 +122,7 @@
</span><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-egl::Error WindowSurfaceWGL::bindTexImage(EGLint buffer)
</del><ins>+egl::Error WindowSurfaceWGL::bindTexImage(gl::Texture *texture, EGLint buffer)
</ins><span class="cx"> {
</span><span class="cx">     UNIMPLEMENTED();
</span><span class="cx">     return egl::Error(EGL_SUCCESS);
</span><span class="lines">@@ -153,7 +145,7 @@
</span><span class="cx"> EGLint WindowSurfaceWGL::getWidth() const
</span><span class="cx"> {
</span><span class="cx">     RECT rect;
</span><del>-    if (!GetClientRect(mParentWindow, &amp;rect))
</del><ins>+    if (!GetClientRect(mWindow, &amp;rect))
</ins><span class="cx">     {
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="lines">@@ -163,7 +155,7 @@
</span><span class="cx"> EGLint WindowSurfaceWGL::getHeight() const
</span><span class="cx"> {
</span><span class="cx">     RECT rect;
</span><del>-    if (!GetClientRect(mParentWindow, &amp;rect))
</del><ins>+    if (!GetClientRect(mWindow, &amp;rect))
</ins><span class="cx">     {
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="lines">@@ -177,4 +169,9 @@
</span><span class="cx">     return EGL_FALSE;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+EGLint WindowSurfaceWGL::getSwapBehavior() const
+{
+    return mSwapBehavior;
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglWindowSurfaceWGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -21,16 +21,21 @@
</span><span class="cx"> class WindowSurfaceWGL : public SurfaceGL
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    WindowSurfaceWGL(EGLNativeWindowType window, ATOM windowClass, int pixelFormat, HGLRC wglContext, const FunctionsWGL *functions);
</del><ins>+    WindowSurfaceWGL(RendererGL *renderer,
+                     EGLNativeWindowType window,
+                     int pixelFormat,
+                     HGLRC wglContext,
+                     const FunctionsWGL *functions,
+                     EGLint orientation);
</ins><span class="cx">     ~WindowSurfaceWGL() override;
</span><span class="cx"> 
</span><del>-    egl::Error initialize();
</del><ins>+    egl::Error initialize() override;
</ins><span class="cx">     egl::Error makeCurrent() override;
</span><span class="cx"> 
</span><span class="cx">     egl::Error swap() override;
</span><span class="cx">     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
</span><span class="cx">     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
</span><del>-    egl::Error bindTexImage(EGLint buffer) override;
</del><ins>+    egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
</ins><span class="cx">     egl::Error releaseTexImage(EGLint buffer) override;
</span><span class="cx">     void setSwapInterval(EGLint interval) override;
</span><span class="cx"> 
</span><span class="lines">@@ -38,18 +43,19 @@
</span><span class="cx">     EGLint getHeight() const override;
</span><span class="cx"> 
</span><span class="cx">     EGLint isPostSubBufferSupported() const override;
</span><ins>+    EGLint getSwapBehavior() const override;
</ins><span class="cx"> 
</span><span class="cx">   private:
</span><del>-    ATOM mWindowClass;
</del><span class="cx">     int mPixelFormat;
</span><span class="cx"> 
</span><del>-    HGLRC mShareWGLContext;
</del><ins>+    HGLRC mWGLContext;
</ins><span class="cx"> 
</span><del>-    HWND mParentWindow;
-    HWND mChildWindow;
-    HDC mChildDeviceContext;
</del><ins>+    HWND mWindow;
+    HDC mDeviceContext;
</ins><span class="cx"> 
</span><span class="cx">     const FunctionsWGL *mFunctionsWGL;
</span><ins>+
+    EGLint mSwapBehavior;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglwgl_utilscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/wgl_utils.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/wgl_utils.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/wgl_utils.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,6 +8,8 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/renderer/gl/wgl/wgl_utils.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/renderer/gl/wgl/FunctionsWGL.h&quot;
+
</ins><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -30,6 +32,54 @@
</span><span class="cx">     return pixelFormatDescriptor;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+std::vector&lt;int&gt; GetDefaultPixelFormatAttributes(bool preservedSwap)
+{
+    std::vector&lt;int&gt; attribs;
+    attribs.push_back(WGL_DRAW_TO_WINDOW_ARB);
+    attribs.push_back(TRUE);
+
+    attribs.push_back(WGL_ACCELERATION_ARB);
+    attribs.push_back(WGL_FULL_ACCELERATION_ARB);
+
+    attribs.push_back(WGL_SUPPORT_OPENGL_ARB);
+    attribs.push_back(TRUE);
+
+    attribs.push_back(WGL_DOUBLE_BUFFER_ARB);
+    attribs.push_back(TRUE);
+
+    attribs.push_back(WGL_PIXEL_TYPE_ARB);
+    attribs.push_back(WGL_TYPE_RGBA_ARB);
+
+    attribs.push_back(WGL_COLOR_BITS_ARB);
+    attribs.push_back(24);
+
+    attribs.push_back(WGL_ALPHA_BITS_ARB);
+    attribs.push_back(8);
+
+    attribs.push_back(WGL_DEPTH_BITS_ARB);
+    attribs.push_back(24);
+
+    attribs.push_back(WGL_STENCIL_BITS_ARB);
+    attribs.push_back(8);
+
+    attribs.push_back(WGL_SWAP_METHOD_ARB);
+    attribs.push_back(preservedSwap ? WGL_SWAP_COPY_ARB : WGL_SWAP_UNDEFINED_ARB);
+
+    attribs.push_back(0);
+
+    return attribs;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+int QueryWGLFormatAttrib(HDC dc, int format, int attribName, const FunctionsWGL *functions)
+{
+    int result = 0;
+    if (functions-&gt;getPixelFormatAttribivARB == nullptr ||
+        !functions-&gt;getPixelFormatAttribivARB(dc, format, 0, 1, &amp;attribName, &amp;result))
+    {
+        return 0;
+    }
+    return result;
</ins><span class="cx"> }
</span><ins>+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLErendererglwglwgl_utilsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/wgl_utils.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/wgl_utils.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/wgl_utils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,16 +9,22 @@
</span><span class="cx"> #ifndef LIBANGLE_RENDERER_GL_WGL_WGLUTILS_H_
</span><span class="cx"> #define LIBANGLE_RENDERER_GL_WGL_WGLUTILS_H_
</span><span class="cx"> 
</span><ins>+#include &lt;vector&gt;
+
</ins><span class="cx"> #include &quot;common/platform.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace rx
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+class FunctionsWGL;
+
</ins><span class="cx"> namespace wgl
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="cx"> PIXELFORMATDESCRIPTOR GetDefaultPixelFormatDescriptor();
</span><ins>+std::vector&lt;int&gt; GetDefaultPixelFormatAttributes(bool preservedSwap);
</ins><span class="cx"> 
</span><ins>+int QueryWGLFormatAttrib(HDC dc, int format, int attribName, const FunctionsWGL *functions);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEvalidationEGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> //
</span><del>-// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
</del><ins>+// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
</ins><span class="cx"> // Use of this source code is governed by a BSD-style license that can be
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><span class="lines">@@ -8,13 +8,122 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/validationEGL.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;common/utilities.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Config.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Context.h&quot;
</span><ins>+#include &quot;libANGLE/Device.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Display.h&quot;
</span><ins>+#include &quot;libANGLE/Image.h&quot;
+#include &quot;libANGLE/Stream.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;EGL/eglext.h&gt;
</span><span class="cx"> 
</span><ins>+namespace
+{
+size_t GetMaximumMipLevel(const gl::Context *context, GLenum target)
+{
+    const gl::Caps &amp;caps = context-&gt;getCaps();
+
+    size_t maxDimension = 0;
+    switch (target)
+    {
+        case GL_TEXTURE_2D:
+            maxDimension = caps.max2DTextureSize;
+            break;
+        case GL_TEXTURE_CUBE_MAP:
+            maxDimension = caps.maxCubeMapTextureSize;
+            break;
+        case GL_TEXTURE_3D:
+            maxDimension = caps.max3DTextureSize;
+            break;
+        case GL_TEXTURE_2D_ARRAY:
+            maxDimension = caps.max2DTextureSize;
+            break;
+        default:
+            UNREACHABLE();
+    }
+
+    return gl::log2(static_cast&lt;int&gt;(maxDimension));
+}
+
+bool TextureHasNonZeroMipLevelsSpecified(const gl::Context *context, const gl::Texture *texture)
+{
+    size_t maxMip = GetMaximumMipLevel(context, texture-&gt;getTarget());
+    for (size_t level = 1; level &lt; maxMip; level++)
+    {
+        if (texture-&gt;getTarget() == GL_TEXTURE_CUBE_MAP)
+        {
+            for (GLenum face = gl::FirstCubeMapTextureTarget; face &lt;= gl::LastCubeMapTextureTarget;
+                 face++)
+            {
+                if (texture-&gt;getInternalFormat(face, level) != GL_NONE)
+                {
+                    return true;
+                }
+            }
+        }
+        else
+        {
+            if (texture-&gt;getInternalFormat(texture-&gt;getTarget(), level) != GL_NONE)
+            {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+bool CubeTextureHasUnspecifiedLevel0Face(const gl::Texture *texture)
+{
+    ASSERT(texture-&gt;getTarget() == GL_TEXTURE_CUBE_MAP);
+    for (GLenum face = gl::FirstCubeMapTextureTarget; face &lt;= gl::LastCubeMapTextureTarget; face++)
+    {
+        if (texture-&gt;getInternalFormat(face, 0) == GL_NONE)
+        {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+egl::Error ValidateStreamAttribute(const EGLAttrib attribute,
+                                   const EGLAttrib value,
+                                   const egl::DisplayExtensions &amp;extensions)
+{
+    switch (attribute)
+    {
+        case EGL_STREAM_STATE_KHR:
+        case EGL_PRODUCER_FRAME_KHR:
+        case EGL_CONSUMER_FRAME_KHR:
+            return egl::Error(EGL_BAD_ACCESS, &quot;Attempt to initialize readonly parameter&quot;);
+        case EGL_CONSUMER_LATENCY_USEC_KHR:
+            // Technically not in spec but a latency &lt; 0 makes no sense so we check it
+            if (value &lt; 0)
+            {
+                return egl::Error(EGL_BAD_PARAMETER, &quot;Latency must be positive&quot;);
+            }
+            break;
+        case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
+            if (!extensions.streamConsumerGLTexture)
+            {
+                return egl::Error(EGL_BAD_ATTRIBUTE, &quot;Consumer GL extension not enabled&quot;);
+            }
+            // Again not in spec but it should be positive anyways
+            if (value &lt; 0)
+            {
+                return egl::Error(EGL_BAD_PARAMETER, &quot;Timeout must be positive&quot;);
+            }
+            break;
+        default:
+            return egl::Error(EGL_BAD_ATTRIBUTE, &quot;Invalid stream attribute&quot;);
+    }
+    return egl::Error(EGL_SUCCESS);
+}
+}  // namespace
+
</ins><span class="cx"> namespace egl
</span><span class="cx"> {
</span><span class="cx"> 
</span><span class="lines">@@ -22,12 +131,17 @@
</span><span class="cx"> {
</span><span class="cx">     if (display == EGL_NO_DISPLAY)
</span><span class="cx">     {
</span><del>-        return Error(EGL_BAD_DISPLAY);
</del><ins>+        return Error(EGL_BAD_DISPLAY, &quot;display is EGL_NO_DISPLAY.&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (!Display::isValidDisplay(display))
+    {
+        return Error(EGL_BAD_DISPLAY, &quot;display is not a valid display.&quot;);
+    }
+
</ins><span class="cx">     if (!display-&gt;isInitialized())
</span><span class="cx">     {
</span><del>-        return Error(EGL_NOT_INITIALIZED);
</del><ins>+        return Error(EGL_NOT_INITIALIZED, &quot;display is not initialized.&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return Error(EGL_SUCCESS);
</span><span class="lines">@@ -81,6 +195,44 @@
</span><span class="cx">     return Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Error ValidateImage(const Display *display, const Image *image)
+{
+    Error error = ValidateDisplay(display);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (!display-&gt;isValidImage(image))
+    {
+        return Error(EGL_BAD_PARAMETER, &quot;image is not valid.&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateStream(const Display *display, const Stream *stream)
+{
+    Error error = ValidateDisplay(display);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    const DisplayExtensions &amp;displayExtensions = display-&gt;getExtensions();
+    if (!displayExtensions.stream)
+    {
+        return Error(EGL_BAD_ACCESS, &quot;Stream extension not active&quot;);
+    }
+
+    if (stream == EGL_NO_STREAM_KHR || !display-&gt;isValidStream(stream))
+    {
+        return Error(EGL_BAD_STREAM_KHR, &quot;Invalid stream&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
</ins><span class="cx"> Error ValidateCreateContext(Display *display, Config *configuration, gl::Context *shareContext,
</span><span class="cx">                             const AttributeMap&amp; attributes)
</span><span class="cx"> {
</span><span class="lines">@@ -91,15 +243,15 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Get the requested client version (default is 1) and check it is 2 or 3.
</span><del>-    EGLint clientMajorVersion = 1;
-    EGLint clientMinorVersion = 0;
-    EGLint contextFlags = 0;
</del><ins>+    EGLAttrib clientMajorVersion = 1;
+    EGLAttrib clientMinorVersion = 0;
+    EGLAttrib contextFlags       = 0;
</ins><span class="cx">     bool resetNotification = false;
</span><span class="cx">     bool robustAccess = false;
</span><span class="cx">     for (AttributeMap::const_iterator attributeIter = attributes.begin(); attributeIter != attributes.end(); attributeIter++)
</span><span class="cx">     {
</span><del>-        EGLint attribute = attributeIter-&gt;first;
-        EGLint value = attributeIter-&gt;second;
</del><ins>+        EGLAttrib attribute = attributeIter-&gt;first;
+        EGLAttrib value     = attributeIter-&gt;second;
</ins><span class="cx"> 
</span><span class="cx">         switch (attribute)
</span><span class="cx">         {
</span><span class="lines">@@ -115,6 +267,9 @@
</span><span class="cx">             contextFlags = value;
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+          case EGL_CONTEXT_OPENGL_DEBUG:
+              break;
+
</ins><span class="cx">           case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
</span><span class="cx">             // Only valid for OpenGL (non-ES) contexts
</span><span class="cx">             return Error(EGL_BAD_ATTRIBUTE);
</span><span class="lines">@@ -150,6 +305,17 @@
</span><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+          case EGL_CONTEXT_OPENGL_NO_ERROR_KHR:
+              if (!display-&gt;getExtensions().createContextNoError)
+              {
+                  return Error(EGL_BAD_ATTRIBUTE, &quot;Invalid Context attribute.&quot;);
+              }
+              if (value != EGL_TRUE &amp;&amp; value != EGL_FALSE)
+              {
+                  return Error(EGL_BAD_ATTRIBUTE, &quot;Attribute must be EGL_TRUE or EGL_FALSE.&quot;);
+              }
+              break;
+
</ins><span class="cx">           default:
</span><span class="cx">             return Error(EGL_BAD_ATTRIBUTE);
</span><span class="cx">         }
</span><span class="lines">@@ -224,8 +390,8 @@
</span><span class="cx"> 
</span><span class="cx">     for (AttributeMap::const_iterator attributeIter = attributes.begin(); attributeIter != attributes.end(); attributeIter++)
</span><span class="cx">     {
</span><del>-        EGLint attribute = attributeIter-&gt;first;
-        EGLint value = attributeIter-&gt;second;
</del><ins>+        EGLAttrib attribute = attributeIter-&gt;first;
+        EGLAttrib value     = attributeIter-&gt;second;
</ins><span class="cx"> 
</span><span class="cx">         switch (attribute)
</span><span class="cx">         {
</span><span class="lines">@@ -248,6 +414,13 @@
</span><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+          case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
+              if (!displayExtensions.flexibleSurfaceCompatibility)
+              {
+                  return Error(EGL_BAD_ATTRIBUTE);
+              }
+              break;
+
</ins><span class="cx">           case EGL_WIDTH:
</span><span class="cx">           case EGL_HEIGHT:
</span><span class="cx">             if (!displayExtensions.windowFixedSize)
</span><span class="lines">@@ -267,12 +440,26 @@
</span><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+          case EGL_SURFACE_ORIENTATION_ANGLE:
+              if (!displayExtensions.surfaceOrientation)
+              {
+                  return Error(EGL_BAD_ATTRIBUTE, &quot;EGL_ANGLE_surface_orientation is not enabled.&quot;);
+              }
+              break;
+
</ins><span class="cx">           case EGL_VG_COLORSPACE:
</span><span class="cx">             return Error(EGL_BAD_MATCH);
</span><span class="cx"> 
</span><span class="cx">           case EGL_VG_ALPHA_FORMAT:
</span><span class="cx">             return Error(EGL_BAD_MATCH);
</span><span class="cx"> 
</span><ins>+          case EGL_DIRECT_COMPOSITION_ANGLE:
+              if (!displayExtensions.directComposition)
+              {
+                  return Error(EGL_BAD_ATTRIBUTE);
+              }
+              break;
+
</ins><span class="cx">           default:
</span><span class="cx">             return Error(EGL_BAD_ATTRIBUTE);
</span><span class="cx">         }
</span><span class="lines">@@ -293,11 +480,13 @@
</span><span class="cx">     {
</span><span class="cx">         return error;
</span><span class="cx">     }
</span><del>-    
</del><ins>+
+    const DisplayExtensions &amp;displayExtensions = display-&gt;getExtensions();
+
</ins><span class="cx">     for (AttributeMap::const_iterator attributeIter = attributes.begin(); attributeIter != attributes.end(); attributeIter++)
</span><span class="cx">     {
</span><del>-        EGLint attribute = attributeIter-&gt;first;
-        EGLint value = attributeIter-&gt;second;
</del><ins>+        EGLAttrib attribute = attributeIter-&gt;first;
+        EGLAttrib value     = attributeIter-&gt;second;
</ins><span class="cx"> 
</span><span class="cx">         switch (attribute)
</span><span class="cx">         {
</span><span class="lines">@@ -344,6 +533,16 @@
</span><span class="cx">           case EGL_VG_ALPHA_FORMAT:
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+          case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
+              if (!displayExtensions.flexibleSurfaceCompatibility)
+              {
+                  return Error(
+                      EGL_BAD_ATTRIBUTE,
+                      &quot;EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be used without &quot;
+                      &quot;EGL_ANGLE_flexible_surface_compatibility support.&quot;);
+              }
+              break;
+
</ins><span class="cx">           default:
</span><span class="cx">             return Error(EGL_BAD_ATTRIBUTE);
</span><span class="cx">         }
</span><span class="lines">@@ -356,8 +555,8 @@
</span><span class="cx"> 
</span><span class="cx">     const Caps &amp;caps = display-&gt;getCaps();
</span><span class="cx"> 
</span><del>-    EGLenum textureFormat = attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
-    EGLenum textureTarget = attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
</del><ins>+    EGLAttrib textureFormat = attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
+    EGLAttrib textureTarget = attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
</ins><span class="cx"> 
</span><span class="cx">     if ((textureFormat != EGL_NO_TEXTURE &amp;&amp; textureTarget == EGL_NO_TEXTURE) ||
</span><span class="cx">         (textureFormat == EGL_NO_TEXTURE &amp;&amp; textureTarget != EGL_NO_TEXTURE))
</span><span class="lines">@@ -371,8 +570,8 @@
</span><span class="cx">         return Error(EGL_BAD_ATTRIBUTE);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    EGLint width = attributes.get(EGL_WIDTH, 0);
-    EGLint height = attributes.get(EGL_HEIGHT, 0);
</del><ins>+    EGLint width  = static_cast&lt;EGLint&gt;(attributes.get(EGL_WIDTH, 0));
+    EGLint height = static_cast&lt;EGLint&gt;(attributes.get(EGL_HEIGHT, 0));
</ins><span class="cx">     if (textureFormat != EGL_NO_TEXTURE &amp;&amp; !caps.textureNPOT &amp;&amp; (!gl::isPow2(width) || !gl::isPow2(height)))
</span><span class="cx">     {
</span><span class="cx">         return Error(EGL_BAD_MATCH);
</span><span class="lines">@@ -411,8 +610,8 @@
</span><span class="cx"> 
</span><span class="cx">     for (AttributeMap::const_iterator attributeIter = attributes.begin(); attributeIter != attributes.end(); attributeIter++)
</span><span class="cx">     {
</span><del>-        EGLint attribute = attributeIter-&gt;first;
-        EGLint value = attributeIter-&gt;second;
</del><ins>+        EGLAttrib attribute = attributeIter-&gt;first;
+        EGLAttrib value     = attributeIter-&gt;second;
</ins><span class="cx"> 
</span><span class="cx">         switch (attribute)
</span><span class="cx">         {
</span><span class="lines">@@ -454,6 +653,16 @@
</span><span class="cx">           case EGL_MIPMAP_TEXTURE:
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+          case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
+              if (!displayExtensions.flexibleSurfaceCompatibility)
+              {
+                  return Error(
+                      EGL_BAD_ATTRIBUTE,
+                      &quot;EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be used without &quot;
+                      &quot;EGL_ANGLE_flexible_surface_compatibility support.&quot;);
+              }
+              break;
+
</ins><span class="cx">           default:
</span><span class="cx">             return Error(EGL_BAD_ATTRIBUTE);
</span><span class="cx">         }
</span><span class="lines">@@ -464,8 +673,8 @@
</span><span class="cx">         return Error(EGL_BAD_MATCH);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    EGLenum textureFormat = attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
-    EGLenum textureTarget = attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
</del><ins>+    EGLAttrib textureFormat = attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
+    EGLAttrib textureTarget = attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
</ins><span class="cx">     if ((textureFormat != EGL_NO_TEXTURE &amp;&amp; textureTarget == EGL_NO_TEXTURE) ||
</span><span class="cx">         (textureFormat == EGL_NO_TEXTURE &amp;&amp; textureTarget != EGL_NO_TEXTURE))
</span><span class="cx">     {
</span><span class="lines">@@ -480,8 +689,8 @@
</span><span class="cx"> 
</span><span class="cx">     if (buftype == EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE)
</span><span class="cx">     {
</span><del>-        EGLint width = attributes.get(EGL_WIDTH, 0);
-        EGLint height = attributes.get(EGL_HEIGHT, 0);
</del><ins>+        EGLint width  = static_cast&lt;EGLint&gt;(attributes.get(EGL_WIDTH, 0));
+        EGLint height = static_cast&lt;EGLint&gt;(attributes.get(EGL_HEIGHT, 0));
</ins><span class="cx"> 
</span><span class="cx">         if (width == 0 || height == 0)
</span><span class="cx">         {
</span><span class="lines">@@ -498,4 +707,829 @@
</span><span class="cx">     return Error(EGL_SUCCESS);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Error ValidateCompatibleConfigs(const Display *display,
+                                const Config *config1,
+                                const Surface *surface,
+                                const Config *config2,
+                                EGLint surfaceType)
+{
+
+    if (!surface-&gt;flexibleSurfaceCompatibilityRequested())
+    {
+        // Config compatibility is defined in section 2.2 of the EGL 1.5 spec
+
+        bool colorBufferCompat = config1-&gt;colorBufferType == config2-&gt;colorBufferType;
+        if (!colorBufferCompat)
+        {
+            return Error(EGL_BAD_MATCH, &quot;Color buffer types are not compatible.&quot;);
+        }
+
+        bool colorCompat =
+            config1-&gt;redSize == config2-&gt;redSize &amp;&amp; config1-&gt;greenSize == config2-&gt;greenSize &amp;&amp;
+            config1-&gt;blueSize == config2-&gt;blueSize &amp;&amp; config1-&gt;alphaSize == config2-&gt;alphaSize &amp;&amp;
+            config1-&gt;luminanceSize == config2-&gt;luminanceSize;
+        if (!colorCompat)
+        {
+            return Error(EGL_BAD_MATCH, &quot;Color buffer sizes are not compatible.&quot;);
+        }
+
+        bool dsCompat = config1-&gt;depthSize == config2-&gt;depthSize &amp;&amp;
+                        config1-&gt;stencilSize == config2-&gt;stencilSize;
+        if (!dsCompat)
+        {
+            return Error(EGL_BAD_MATCH, &quot;Depth-stencil buffer types are not compatible.&quot;);
+        }
+    }
+
+    bool surfaceTypeCompat = (config1-&gt;surfaceType &amp; config2-&gt;surfaceType &amp; surfaceType) != 0;
+    if (!surfaceTypeCompat)
+    {
+        return Error(EGL_BAD_MATCH, &quot;Surface types are not compatible.&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
</ins><span class="cx"> }
</span><ins>+
+Error ValidateCreateImageKHR(const Display *display,
+                             gl::Context *context,
+                             EGLenum target,
+                             EGLClientBuffer buffer,
+                             const AttributeMap &amp;attributes)
+{
+    Error error = ValidateContext(display, context);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    const DisplayExtensions &amp;displayExtensions = display-&gt;getExtensions();
+
+    if (!displayExtensions.imageBase &amp;&amp; !displayExtensions.image)
+    {
+        // It is out of spec what happens when calling an extension function when the extension is
+        // not available.
+        // EGL_BAD_DISPLAY seems like a reasonable error.
+        return Error(EGL_BAD_DISPLAY, &quot;EGL_KHR_image not supported.&quot;);
+    }
+
+    // TODO(geofflang): Complete validation from EGL_KHR_image_base:
+    // If the resource specified by &lt;dpy&gt;, &lt;ctx&gt;, &lt;target&gt;, &lt;buffer&gt; and &lt;attrib_list&gt; is itself an
+    // EGLImage sibling, the error EGL_BAD_ACCESS is generated.
+
+    for (AttributeMap::const_iterator attributeIter = attributes.begin();
+         attributeIter != attributes.end(); attributeIter++)
+    {
+        EGLAttrib attribute = attributeIter-&gt;first;
+        EGLAttrib value     = attributeIter-&gt;second;
+
+        switch (attribute)
+        {
+            case EGL_IMAGE_PRESERVED_KHR:
+                switch (value)
+                {
+                    case EGL_TRUE:
+                    case EGL_FALSE:
+                        break;
+
+                    default:
+                        return Error(EGL_BAD_PARAMETER,
+                                     &quot;EGL_IMAGE_PRESERVED_KHR must be EGL_TRUE or EGL_FALSE.&quot;);
+                }
+                break;
+
+            case EGL_GL_TEXTURE_LEVEL_KHR:
+                if (!displayExtensions.glTexture2DImage &amp;&amp;
+                    !displayExtensions.glTextureCubemapImage &amp;&amp; !displayExtensions.glTexture3DImage)
+                {
+                    return Error(EGL_BAD_PARAMETER,
+                                 &quot;EGL_GL_TEXTURE_LEVEL_KHR cannot be used without &quot;
+                                 &quot;KHR_gl_texture_*_image support.&quot;);
+                }
+
+                if (value &lt; 0)
+                {
+                    return Error(EGL_BAD_PARAMETER, &quot;EGL_GL_TEXTURE_LEVEL_KHR cannot be negative.&quot;);
+                }
+                break;
+
+            case EGL_GL_TEXTURE_ZOFFSET_KHR:
+                if (!displayExtensions.glTexture3DImage)
+                {
+                    return Error(EGL_BAD_PARAMETER,
+                                 &quot;EGL_GL_TEXTURE_ZOFFSET_KHR cannot be used without &quot;
+                                 &quot;KHR_gl_texture_3D_image support.&quot;);
+                }
+                break;
+
+            default:
+                return Error(EGL_BAD_PARAMETER, &quot;invalid attribute: 0x%X&quot;, attribute);
+        }
+    }
+
+    switch (target)
+    {
+        case EGL_GL_TEXTURE_2D_KHR:
+        {
+            if (!displayExtensions.glTexture2DImage)
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;KHR_gl_texture_2D_image not supported.&quot;);
+            }
+
+            if (buffer == 0)
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;buffer cannot reference a 2D texture with the name 0.&quot;);
+            }
+
+            const gl::Texture *texture =
+                context-&gt;getTexture(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
+            if (texture == nullptr || texture-&gt;getTarget() != GL_TEXTURE_2D)
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;target is not a 2D texture.&quot;);
+            }
+
+            if (texture-&gt;getBoundSurface() != nullptr)
+            {
+                return Error(EGL_BAD_ACCESS, &quot;texture has a surface bound to it.&quot;);
+            }
+
+            EGLAttrib level = attributes.get(EGL_GL_TEXTURE_LEVEL_KHR, 0);
+            if (texture-&gt;getWidth(GL_TEXTURE_2D, static_cast&lt;size_t&gt;(level)) == 0 ||
+                texture-&gt;getHeight(GL_TEXTURE_2D, static_cast&lt;size_t&gt;(level)) == 0)
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;target 2D texture does not have a valid size at specified level.&quot;);
+            }
+
+            if (level &gt; 0 &amp;&amp; (!texture-&gt;isMipmapComplete() ||
+                              static_cast&lt;size_t&gt;(level) &gt;= texture-&gt;getMipCompleteLevels()))
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;texture must be complete if level is non-zero.&quot;);
+            }
+
+            if (level == 0 &amp;&amp; !texture-&gt;isMipmapComplete() &amp;&amp;
+                TextureHasNonZeroMipLevelsSpecified(context, texture))
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;if level is zero and the texture is incomplete, it must have no mip &quot;
+                             &quot;levels specified except zero.&quot;);
+            }
+        }
+        break;
+
+        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:
+        case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:
+        {
+            if (!displayExtensions.glTextureCubemapImage)
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;KHR_gl_texture_cubemap_image not supported.&quot;);
+            }
+
+            if (buffer == 0)
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;buffer cannot reference a cubemap texture with the name 0.&quot;);
+            }
+
+            const gl::Texture *texture =
+                context-&gt;getTexture(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
+            if (texture == nullptr || texture-&gt;getTarget() != GL_TEXTURE_CUBE_MAP)
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;target is not a cubemap texture.&quot;);
+            }
+
+            if (texture-&gt;getBoundSurface() != nullptr)
+            {
+                return Error(EGL_BAD_ACCESS, &quot;texture has a surface bound to it.&quot;);
+            }
+
+            EGLAttrib level    = attributes.get(EGL_GL_TEXTURE_LEVEL_KHR, 0);
+            GLenum cubeMapFace = egl_gl::EGLCubeMapTargetToGLCubeMapTarget(target);
+            if (texture-&gt;getWidth(cubeMapFace, static_cast&lt;size_t&gt;(level)) == 0 ||
+                texture-&gt;getHeight(cubeMapFace, static_cast&lt;size_t&gt;(level)) == 0)
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;target cubemap texture does not have a valid size at specified level &quot;
+                             &quot;and face.&quot;);
+            }
+
+            if (level &gt; 0 &amp;&amp; (!texture-&gt;isMipmapComplete() ||
+                              static_cast&lt;size_t&gt;(level) &gt;= texture-&gt;getMipCompleteLevels()))
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;texture must be complete if level is non-zero.&quot;);
+            }
+
+            if (level == 0 &amp;&amp; !texture-&gt;isMipmapComplete() &amp;&amp;
+                TextureHasNonZeroMipLevelsSpecified(context, texture))
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;if level is zero and the texture is incomplete, it must have no mip &quot;
+                             &quot;levels specified except zero.&quot;);
+            }
+
+            if (level == 0 &amp;&amp; !texture-&gt;isMipmapComplete() &amp;&amp;
+                CubeTextureHasUnspecifiedLevel0Face(texture))
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;if level is zero and the texture is incomplete, it must have all of &quot;
+                             &quot;its faces specified at level zero.&quot;);
+            }
+        }
+        break;
+
+        case EGL_GL_TEXTURE_3D_KHR:
+        {
+            if (!displayExtensions.glTexture3DImage)
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;KHR_gl_texture_3D_image not supported.&quot;);
+            }
+
+            if (buffer == 0)
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;buffer cannot reference a 3D texture with the name 0.&quot;);
+            }
+
+            const gl::Texture *texture =
+                context-&gt;getTexture(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
+            if (texture == nullptr || texture-&gt;getTarget() != GL_TEXTURE_3D)
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;target is not a 3D texture.&quot;);
+            }
+
+            if (texture-&gt;getBoundSurface() != nullptr)
+            {
+                return Error(EGL_BAD_ACCESS, &quot;texture has a surface bound to it.&quot;);
+            }
+
+            EGLAttrib level   = attributes.get(EGL_GL_TEXTURE_LEVEL_KHR, 0);
+            EGLAttrib zOffset = attributes.get(EGL_GL_TEXTURE_ZOFFSET_KHR, 0);
+            if (texture-&gt;getWidth(GL_TEXTURE_3D, static_cast&lt;size_t&gt;(level)) == 0 ||
+                texture-&gt;getHeight(GL_TEXTURE_3D, static_cast&lt;size_t&gt;(level)) == 0 ||
+                texture-&gt;getDepth(GL_TEXTURE_3D, static_cast&lt;size_t&gt;(level)) == 0)
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;target 3D texture does not have a valid size at specified level.&quot;);
+            }
+
+            if (static_cast&lt;size_t&gt;(zOffset) &gt;=
+                texture-&gt;getDepth(GL_TEXTURE_3D, static_cast&lt;size_t&gt;(level)))
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;target 3D texture does not have enough layers for the specified Z &quot;
+                             &quot;offset at the specified level.&quot;);
+            }
+
+            if (level &gt; 0 &amp;&amp; (!texture-&gt;isMipmapComplete() ||
+                              static_cast&lt;size_t&gt;(level) &gt;= texture-&gt;getMipCompleteLevels()))
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;texture must be complete if level is non-zero.&quot;);
+            }
+
+            if (level == 0 &amp;&amp; !texture-&gt;isMipmapComplete() &amp;&amp;
+                TextureHasNonZeroMipLevelsSpecified(context, texture))
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;if level is zero and the texture is incomplete, it must have no mip &quot;
+                             &quot;levels specified except zero.&quot;);
+            }
+        }
+        break;
+
+        case EGL_GL_RENDERBUFFER_KHR:
+        {
+            if (!displayExtensions.glRenderbufferImage)
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;KHR_gl_renderbuffer_image not supported.&quot;);
+            }
+
+            if (attributes.contains(EGL_GL_TEXTURE_LEVEL_KHR))
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;EGL_GL_TEXTURE_LEVEL_KHR cannot be used in conjunction with a &quot;
+                             &quot;renderbuffer target.&quot;);
+            }
+
+            if (buffer == 0)
+            {
+                return Error(EGL_BAD_PARAMETER,
+                             &quot;buffer cannot reference a renderbuffer with the name 0.&quot;);
+            }
+
+            const gl::Renderbuffer *renderbuffer =
+                context-&gt;getRenderbuffer(egl_gl::EGLClientBufferToGLObjectHandle(buffer));
+            if (renderbuffer == nullptr)
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;target is not a renderbuffer.&quot;);
+            }
+
+            if (renderbuffer-&gt;getSamples() &gt; 0)
+            {
+                return Error(EGL_BAD_PARAMETER, &quot;target renderbuffer cannot be multisampled.&quot;);
+            }
+        }
+        break;
+
+        default:
+            return Error(EGL_BAD_PARAMETER, &quot;invalid target: 0x%X&quot;, target);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateDestroyImageKHR(const Display *display, const Image *image)
+{
+    Error error = ValidateImage(display, image);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (!display-&gt;getExtensions().imageBase &amp;&amp; !display-&gt;getExtensions().image)
+    {
+        // It is out of spec what happens when calling an extension function when the extension is
+        // not available.
+        // EGL_BAD_DISPLAY seems like a reasonable error.
+        return Error(EGL_BAD_DISPLAY);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateCreateDeviceANGLE(EGLint device_type,
+                                void *native_device,
+                                const EGLAttrib *attrib_list)
+{
+    const ClientExtensions &amp;clientExtensions = Display::getClientExtensions();
+    if (!clientExtensions.deviceCreation)
+    {
+        return Error(EGL_BAD_ACCESS, &quot;Device creation extension not active&quot;);
+    }
+
+    if (attrib_list != nullptr &amp;&amp; attrib_list[0] != EGL_NONE)
+    {
+        return Error(EGL_BAD_ATTRIBUTE, &quot;Invalid attrib_list parameter&quot;);
+    }
+
+    switch (device_type)
+    {
+        case EGL_D3D11_DEVICE_ANGLE:
+            if (!clientExtensions.deviceCreationD3D11)
+            {
+                return Error(EGL_BAD_ATTRIBUTE, &quot;D3D11 device creation extension not active&quot;);
+            }
+            break;
+        default:
+            return Error(EGL_BAD_ATTRIBUTE, &quot;Invalid device_type parameter&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateReleaseDeviceANGLE(Device *device)
+{
+    const ClientExtensions &amp;clientExtensions = Display::getClientExtensions();
+    if (!clientExtensions.deviceCreation)
+    {
+        return Error(EGL_BAD_ACCESS, &quot;Device creation extension not active&quot;);
+    }
+
+    if (device == EGL_NO_DEVICE_EXT || !Device::IsValidDevice(device))
+    {
+        return Error(EGL_BAD_DEVICE_EXT, &quot;Invalid device parameter&quot;);
+    }
+
+    Display *owningDisplay = device-&gt;getOwningDisplay();
+    if (owningDisplay != nullptr)
+    {
+        return Error(EGL_BAD_DEVICE_EXT, &quot;Device must have been created using eglCreateDevice&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateCreateStreamKHR(const Display *display, const AttributeMap &amp;attributes)
+{
+    Error error = ValidateDisplay(display);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    const DisplayExtensions &amp;displayExtensions = display-&gt;getExtensions();
+    if (!displayExtensions.stream)
+    {
+        return Error(EGL_BAD_ALLOC, &quot;Stream extension not active&quot;);
+    }
+
+    for (const auto &amp;attributeIter : attributes)
+    {
+        EGLAttrib attribute = attributeIter.first;
+        EGLAttrib value     = attributeIter.second;
+
+        error = ValidateStreamAttribute(attribute, value, displayExtensions);
+        if (error.isError())
+        {
+            return error;
+        }
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateDestroyStreamKHR(const Display *display, const Stream *stream)
+{
+    Error error = ValidateStream(display, stream);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateStreamAttribKHR(const Display *display,
+                              const Stream *stream,
+                              EGLint attribute,
+                              EGLint value)
+{
+    Error error = ValidateStream(display, stream);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (stream-&gt;getState() == EGL_STREAM_STATE_DISCONNECTED_KHR)
+    {
+        return Error(EGL_BAD_STATE_KHR, &quot;Bad stream state&quot;);
+    }
+
+    return ValidateStreamAttribute(attribute, value, display-&gt;getExtensions());
+}
+
+Error ValidateQueryStreamKHR(const Display *display,
+                             const Stream *stream,
+                             EGLenum attribute,
+                             EGLint *value)
+{
+    Error error = ValidateStream(display, stream);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    switch (attribute)
+    {
+        case EGL_STREAM_STATE_KHR:
+        case EGL_CONSUMER_LATENCY_USEC_KHR:
+            break;
+        case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
+            if (!display-&gt;getExtensions().streamConsumerGLTexture)
+            {
+                return Error(EGL_BAD_ATTRIBUTE, &quot;Consumer GLTexture extension not active&quot;);
+            }
+            break;
+        default:
+            return Error(EGL_BAD_ATTRIBUTE, &quot;Invalid attribute&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateQueryStreamu64KHR(const Display *display,
+                                const Stream *stream,
+                                EGLenum attribute,
+                                EGLuint64KHR *value)
+{
+    Error error = ValidateStream(display, stream);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    switch (attribute)
+    {
+        case EGL_CONSUMER_FRAME_KHR:
+        case EGL_PRODUCER_FRAME_KHR:
+            break;
+        default:
+            return Error(EGL_BAD_ATTRIBUTE, &quot;Invalid attribute&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateStreamConsumerGLTextureExternalKHR(const Display *display,
+                                                 gl::Context *context,
+                                                 const Stream *stream)
+{
+    Error error = ValidateDisplay(display);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    error = ValidateContext(display, context);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    const DisplayExtensions &amp;displayExtensions = display-&gt;getExtensions();
+    if (!displayExtensions.streamConsumerGLTexture)
+    {
+        return Error(EGL_BAD_ACCESS, &quot;Stream consumer extension not active&quot;);
+    }
+
+    if (stream == EGL_NO_STREAM_KHR || !display-&gt;isValidStream(stream))
+    {
+        return Error(EGL_BAD_STREAM_KHR, &quot;Invalid stream&quot;);
+    }
+
+    if (stream-&gt;getState() != EGL_STREAM_STATE_CREATED_KHR)
+    {
+        return Error(EGL_BAD_STATE_KHR, &quot;Invalid stream state&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateStreamConsumerAcquireKHR(const Display *display,
+                                       gl::Context *context,
+                                       const Stream *stream)
+{
+    Error error = ValidateDisplay(display);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    error = ValidateContext(display, context);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    const DisplayExtensions &amp;displayExtensions = display-&gt;getExtensions();
+    if (!displayExtensions.streamConsumerGLTexture)
+    {
+        return Error(EGL_BAD_ACCESS, &quot;Stream consumer extension not active&quot;);
+    }
+
+    if (stream == EGL_NO_STREAM_KHR || !display-&gt;isValidStream(stream))
+    {
+        return Error(EGL_BAD_STREAM_KHR, &quot;Invalid stream&quot;);
+    }
+
+    if (stream-&gt;getState() != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR &amp;&amp;
+        stream-&gt;getState() != EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR)
+    {
+        return Error(EGL_BAD_STATE_KHR, &quot;Invalid stream state&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateStreamConsumerReleaseKHR(const Display *display,
+                                       gl::Context *context,
+                                       const Stream *stream)
+{
+    Error error = ValidateDisplay(display);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    error = ValidateContext(display, context);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    const DisplayExtensions &amp;displayExtensions = display-&gt;getExtensions();
+    if (!displayExtensions.streamConsumerGLTexture)
+    {
+        return Error(EGL_BAD_ACCESS, &quot;Stream consumer extension not active&quot;);
+    }
+
+    if (stream == EGL_NO_STREAM_KHR || !display-&gt;isValidStream(stream))
+    {
+        return Error(EGL_BAD_STREAM_KHR, &quot;Invalid stream&quot;);
+    }
+
+    if (stream-&gt;getState() != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR &amp;&amp;
+        stream-&gt;getState() != EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR)
+    {
+        return Error(EGL_BAD_STATE_KHR, &quot;Invalid stream state&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateStreamConsumerGLTextureExternalAttribsNV(const Display *display,
+                                                       gl::Context *context,
+                                                       const Stream *stream,
+                                                       const AttributeMap &amp;attribs)
+{
+    Error error = ValidateDisplay(display);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    error = ValidateContext(display, context);
+    if (error.isError())
+    {
+        return Error(EGL_BAD_ACCESS, &quot;Invalid context&quot;);
+    }
+
+    const DisplayExtensions &amp;displayExtensions = display-&gt;getExtensions();
+    if (!displayExtensions.streamConsumerGLTexture)
+    {
+        return Error(EGL_BAD_ACCESS, &quot;Stream consumer extension not active&quot;);
+    }
+
+    if (stream == EGL_NO_STREAM_KHR || !display-&gt;isValidStream(stream))
+    {
+        return Error(EGL_BAD_STREAM_KHR, &quot;Invalid stream&quot;);
+    }
+
+    if (stream-&gt;getState() != EGL_STREAM_STATE_CREATED_KHR)
+    {
+        return Error(EGL_BAD_STATE_KHR, &quot;Invalid stream state&quot;);
+    }
+
+    EGLAttrib colorBufferType = EGL_RGB_BUFFER;
+    EGLAttrib planeCount      = -1;
+    EGLAttrib plane[3];
+    for (int i = 0; i &lt; 3; i++)
+    {
+        plane[i] = -1;
+    }
+    for (const auto &amp;attributeIter : attribs)
+    {
+        EGLAttrib attribute = attributeIter.first;
+        EGLAttrib value     = attributeIter.second;
+
+        switch (attribute)
+        {
+            case EGL_COLOR_BUFFER_TYPE:
+                if (value != EGL_RGB_BUFFER || value != EGL_YUV_BUFFER_EXT)
+                {
+                    return Error(EGL_BAD_PARAMETER, &quot;Invalid color buffer type&quot;);
+                }
+                colorBufferType = value;
+                break;
+            case EGL_YUV_NUMBER_OF_PLANES_EXT:
+                // planeCount = -1 is a tag for the default plane count so the value must be checked
+                // to be positive here to ensure future logic doesn't break on invalid negative
+                // inputs
+                if (value &lt; 0)
+                {
+                    return Error(EGL_BAD_MATCH, &quot;Invalid plane count&quot;);
+                }
+                planeCount = value;
+                break;
+            default:
+                if (attribute &gt;= EGL_YUV_PLANE0_TEXTURE_UNIT_NV &amp;&amp;
+                    attribute &lt;= EGL_YUV_PLANE2_TEXTURE_UNIT_NV)
+                {
+                    if (value &lt; 0)
+                    {
+                        return Error(EGL_BAD_ACCESS, &quot;Invalid texture unit&quot;);
+                    }
+                    plane[attribute - EGL_YUV_PLANE0_TEXTURE_UNIT_NV] = value;
+                }
+                else
+                {
+                    return Error(EGL_BAD_ATTRIBUTE, &quot;Invalid attribute&quot;);
+                }
+        }
+    }
+
+    if (colorBufferType == EGL_RGB_BUFFER)
+    {
+        if (planeCount &gt; 0)
+        {
+            return Error(EGL_BAD_MATCH, &quot;Plane count must be 0 for RGB buffer&quot;);
+        }
+        for (int i = 0; i &lt; 3; i++)
+        {
+            if (plane[i] != -1)
+            {
+                return Error(EGL_BAD_MATCH, &quot;Planes cannot be specified&quot;);
+            }
+        }
+    }
+    else
+    {
+        if (planeCount == -1)
+        {
+            planeCount = 2;
+        }
+        if (planeCount &lt; 1 || planeCount &gt; 3)
+        {
+            return Error(EGL_BAD_MATCH, &quot;Invalid YUV plane count&quot;);
+        }
+        for (EGLAttrib i = 0; i &lt; planeCount; i++)
+        {
+            if (plane[i] == -1)
+            {
+                return Error(EGL_BAD_MATCH, &quot;Not all planes specified&quot;);
+            }
+        }
+        for (EGLAttrib i = planeCount; i &lt; 3; i++)
+        {
+            if (plane[i] != -1)
+            {
+                return Error(EGL_BAD_MATCH, &quot;Invalid plane specified&quot;);
+            }
+        }
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateCreateStreamProducerD3DTextureNV12ANGLE(const Display *display,
+                                                      const Stream *stream,
+                                                      const AttributeMap &amp;attribs)
+{
+    const DisplayExtensions &amp;displayExtensions = display-&gt;getExtensions();
+    if (!displayExtensions.streamProducerD3DTextureNV12)
+    {
+        return Error(EGL_BAD_ACCESS, &quot;Stream producer extension not active&quot;);
+    }
+
+    Error error = ValidateStream(display, stream);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    if (!attribs.isEmpty())
+    {
+        return Error(EGL_BAD_ATTRIBUTE, &quot;Invalid attribute&quot;);
+    }
+
+    if (stream-&gt;getState() != EGL_STREAM_STATE_CONNECTING_KHR)
+    {
+        return Error(EGL_BAD_STATE_KHR, &quot;Stream not in connecting state&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+
+Error ValidateStreamPostD3DTextureNV12ANGLE(const Display *display,
+                                            const Stream *stream,
+                                            const void *texture,
+                                            const AttributeMap &amp;attribs)
+{
+    const DisplayExtensions &amp;displayExtensions = display-&gt;getExtensions();
+    if (!displayExtensions.streamProducerD3DTextureNV12)
+    {
+        return Error(EGL_BAD_ACCESS, &quot;Stream producer extension not active&quot;);
+    }
+
+    Error error = ValidateStream(display, stream);
+    if (error.isError())
+    {
+        return error;
+    }
+
+    for (auto &amp;attributeIter : attribs)
+    {
+        EGLAttrib attribute = attributeIter.first;
+        EGLAttrib value     = attributeIter.second;
+
+        switch (attribute)
+        {
+            case EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE:
+                if (value &lt; 0)
+                {
+                    return Error(EGL_BAD_PARAMETER, &quot;Invalid subresource index&quot;);
+                }
+                break;
+            default:
+                return Error(EGL_BAD_ATTRIBUTE, &quot;Invalid attribute&quot;);
+        }
+    }
+
+    if (stream-&gt;getState() != EGL_STREAM_STATE_EMPTY_KHR &amp;&amp;
+        stream-&gt;getState() != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR &amp;&amp;
+        stream-&gt;getState() != EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR)
+    {
+        return Error(EGL_BAD_STATE_KHR, &quot;Stream not fully configured&quot;);
+    }
+
+    if (texture == nullptr)
+    {
+        return Error(EGL_BAD_PARAMETER, &quot;Texture must not be null&quot;);
+    }
+
+    return Error(EGL_SUCCESS);
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEvalidationEGLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,6 +12,7 @@
</span><span class="cx"> #include &quot;libANGLE/Error.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;EGL/egl.h&gt;
</span><ins>+#include &lt;EGL/eglext.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="lines">@@ -23,7 +24,10 @@
</span><span class="cx"> 
</span><span class="cx"> class AttributeMap;
</span><span class="cx"> struct Config;
</span><ins>+class Device;
</ins><span class="cx"> class Display;
</span><ins>+class Image;
+class Stream;
</ins><span class="cx"> class Surface;
</span><span class="cx"> 
</span><span class="cx"> // Object validation
</span><span class="lines">@@ -31,6 +35,7 @@
</span><span class="cx"> Error ValidateSurface(const Display *display, Surface *surface);
</span><span class="cx"> Error ValidateConfig(const Display *display, const Config *config);
</span><span class="cx"> Error ValidateContext(const Display *display, gl::Context *context);
</span><ins>+Error ValidateImage(const Display *display, const Image *image);
</ins><span class="cx"> 
</span><span class="cx"> // Entry point validation
</span><span class="cx"> Error ValidateCreateContext(Display *display, Config *configuration, gl::Context *shareContext,
</span><span class="lines">@@ -43,7 +48,59 @@
</span><span class="cx"> Error ValidateCreatePbufferFromClientBuffer(Display *display, EGLenum buftype, EGLClientBuffer buffer,
</span><span class="cx">                                             Config *config, const AttributeMap&amp; attributes);
</span><span class="cx"> 
</span><ins>+Error ValidateCreateImageKHR(const Display *display,
+                             gl::Context *context,
+                             EGLenum target,
+                             EGLClientBuffer buffer,
+                             const AttributeMap &amp;attributes);
+Error ValidateDestroyImageKHR(const Display *display, const Image *image);
</ins><span class="cx"> 
</span><ins>+Error ValidateCreateDeviceANGLE(EGLint device_type,
+                                void *native_device,
+                                const EGLAttrib *attrib_list);
+Error ValidateReleaseDeviceANGLE(Device *device);
+
+Error ValidateCreateStreamKHR(const Display *display, const AttributeMap &amp;attributes);
+Error ValidateDestroyStreamKHR(const Display *display, const Stream *stream);
+Error ValidateStreamAttribKHR(const Display *display,
+                              const Stream *stream,
+                              EGLint attribute,
+                              EGLint value);
+Error ValidateQueryStreamKHR(const Display *display,
+                             const Stream *stream,
+                             EGLenum attribute,
+                             EGLint *value);
+Error ValidateQueryStreamu64KHR(const Display *display,
+                                const Stream *stream,
+                                EGLenum attribute,
+                                EGLuint64KHR *value);
+Error ValidateStreamConsumerGLTextureExternalKHR(const Display *display,
+                                                 gl::Context *context,
+                                                 const Stream *stream);
+Error ValidateStreamConsumerAcquireKHR(const Display *display,
+                                       gl::Context *context,
+                                       const Stream *stream);
+Error ValidateStreamConsumerReleaseKHR(const Display *display,
+                                       gl::Context *context,
+                                       const Stream *stream);
+Error ValidateStreamConsumerGLTextureExternalAttribsNV(const Display *display,
+                                                       gl::Context *context,
+                                                       const Stream *stream,
+                                                       const AttributeMap &amp;attribs);
+Error ValidateCreateStreamProducerD3DTextureNV12ANGLE(const Display *display,
+                                                      const Stream *stream,
+                                                      const AttributeMap &amp;attribs);
+Error ValidateStreamPostD3DTextureNV12ANGLE(const Display *display,
+                                            const Stream *stream,
+                                            const void *texture,
+                                            const AttributeMap &amp;attribs);
+
+// Other validation
+Error ValidateCompatibleConfigs(const Display *display,
+                                const Config *config1,
+                                const Surface *surface,
+                                const Config *config2,
+                                EGLint surfaceType);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // LIBANGLE_VALIDATIONEGL_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEvalidationEScpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,23 +10,94 @@
</span><span class="cx"> #include &quot;libANGLE/validationES2.h&quot;
</span><span class="cx"> #include &quot;libANGLE/validationES3.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Context.h&quot;
</span><ins>+#include &quot;libANGLE/Display.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Texture.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><span class="cx"> #include &quot;libANGLE/FramebufferAttachment.h&quot;
</span><span class="cx"> #include &quot;libANGLE/formatutils.h&quot;
</span><ins>+#include &quot;libANGLE/Image.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Query.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Program.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Uniform.h&quot;
</span><span class="cx"> #include &quot;libANGLE/TransformFeedback.h&quot;
</span><span class="cx"> #include &quot;libANGLE/VertexArray.h&quot;
</span><del>-#include &quot;libANGLE/renderer/BufferImpl.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;common/mathutil.h&quot;
</span><span class="cx"> #include &quot;common/utilities.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><ins>+const char *g_ExceedsMaxElementErrorMessage = &quot;Element value exceeds maximum element index.&quot;;
</ins><span class="cx"> 
</span><ins>+namespace
+{
+bool ValidateDrawAttribs(ValidationContext *context, GLint primcount, GLint maxVertex)
+{
+    const gl::State &amp;state     = context-&gt;getState();
+    const gl::Program *program = state.getProgram();
+
+    const VertexArray *vao     = state.getVertexArray();
+    const auto &amp;vertexAttribs  = vao-&gt;getVertexAttributes();
+    size_t maxEnabledAttrib = vao-&gt;getMaxEnabledAttribute();
+    for (size_t attributeIndex = 0; attributeIndex &lt; maxEnabledAttrib; ++attributeIndex)
+    {
+        const VertexAttribute &amp;attrib = vertexAttribs[attributeIndex];
+        if (program-&gt;isAttribLocationActive(attributeIndex) &amp;&amp; attrib.enabled)
+        {
+            gl::Buffer *buffer = attrib.buffer.get();
+
+            if (buffer)
+            {
+                GLint64 attribStride     = static_cast&lt;GLint64&gt;(ComputeVertexAttributeStride(attrib));
+                GLint64 maxVertexElement = 0;
+
+                if (attrib.divisor &gt; 0)
+                {
+                    maxVertexElement =
+                        static_cast&lt;GLint64&gt;(primcount) / static_cast&lt;GLint64&gt;(attrib.divisor);
+                }
+                else
+                {
+                    maxVertexElement = static_cast&lt;GLint64&gt;(maxVertex);
+                }
+
+                // If we're drawing zero vertices, we have enough data.
+                if (maxVertexElement &gt; 0)
+                {
+                    // Note: Last vertex element does not take the full stride!
+                    GLint64 attribSize =
+                        static_cast&lt;GLint64&gt;(ComputeVertexAttributeTypeSize(attrib));
+                    GLint64 attribDataSize = (maxVertexElement - 1) * attribStride + attribSize;
+                    GLint64 attribOffset   = static_cast&lt;GLint64&gt;(attrib.offset);
+
+                    // [OpenGL ES 3.0.2] section 2.9.4 page 40:
+                    // We can return INVALID_OPERATION if our vertex attribute does not have
+                    // enough backing data.
+                    if (attribDataSize + attribOffset &gt; buffer-&gt;getSize())
+                    {
+                        context-&gt;recordError(
+                            Error(GL_INVALID_OPERATION,
+                                  &quot;Vertex buffer is not big enough for the draw call&quot;));
+                        return false;
+                    }
+                }
+            }
+            else if (attrib.pointer == NULL)
+            {
+                // This is an application error that would normally result in a crash,
+                // but we catch it and return an error
+                context-&gt;recordError(Error(
+                    GL_INVALID_OPERATION, &quot;An enabled vertex array has no buffer and no pointer.&quot;));
+                return false;
+            }
+        }
+    }
+
+    return true;
+}
+
+}  // anonymous namespace
+
</ins><span class="cx"> bool ValidCap(const Context *context, GLenum cap)
</span><span class="cx"> {
</span><span class="cx">     switch (cap)
</span><span class="lines">@@ -41,15 +112,21 @@
</span><span class="cx">       case GL_BLEND:
</span><span class="cx">       case GL_DITHER:
</span><span class="cx">         return true;
</span><ins>+
</ins><span class="cx">       case GL_PRIMITIVE_RESTART_FIXED_INDEX:
</span><span class="cx">       case GL_RASTERIZER_DISCARD:
</span><span class="cx">         return (context-&gt;getClientVersion() &gt;= 3);
</span><ins>+
+      case GL_DEBUG_OUTPUT_SYNCHRONOUS:
+      case GL_DEBUG_OUTPUT:
+          return context-&gt;getExtensions().debug;
+
</ins><span class="cx">       default:
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidTextureTarget(const Context *context, GLenum target)
</del><ins>+bool ValidTextureTarget(const ValidationContext *context, GLenum target)
</ins><span class="cx"> {
</span><span class="cx">     switch (target)
</span><span class="cx">     {
</span><span class="lines">@@ -66,11 +143,37 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool ValidTexture2DTarget(const ValidationContext *context, GLenum target)
+{
+    switch (target)
+    {
+        case GL_TEXTURE_2D:
+        case GL_TEXTURE_CUBE_MAP:
+            return true;
+
+        default:
+            return false;
+    }
+}
+
+bool ValidTexture3DTarget(const ValidationContext *context, GLenum target)
+{
+    switch (target)
+    {
+        case GL_TEXTURE_3D:
+        case GL_TEXTURE_2D_ARRAY:
+            return (context-&gt;getClientVersion() &gt;= 3);
+
+        default:
+            return false;
+    }
+}
+
</ins><span class="cx"> // This function differs from ValidTextureTarget in that the target must be
</span><span class="cx"> // usable as the destination of a 2D operation-- so a cube face is valid, but
</span><span class="cx"> // GL_TEXTURE_CUBE_MAP is not.
</span><span class="cx"> // Note: duplicate of IsInternalTextureTarget
</span><del>-bool ValidTexture2DDestinationTarget(const Context *context, GLenum target)
</del><ins>+bool ValidTexture2DDestinationTarget(const ValidationContext *context, GLenum target)
</ins><span class="cx"> {
</span><span class="cx">     switch (target)
</span><span class="cx">     {
</span><span class="lines">@@ -82,9 +185,18 @@
</span><span class="cx">       case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
</span><span class="cx">       case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
</span><span class="cx">         return true;
</span><ins>+      default:
+          return false;
+    }
+}
+
+bool ValidTexture3DDestinationTarget(const ValidationContext *context, GLenum target)
+{
+    switch (target)
+    {
+      case GL_TEXTURE_3D:
</ins><span class="cx">       case GL_TEXTURE_2D_ARRAY:
</span><del>-      case GL_TEXTURE_3D:
-        return (context-&gt;getClientVersion() &gt;= 3);
</del><ins>+          return true;
</ins><span class="cx">       default:
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -114,7 +226,7 @@
</span><span class="cx"> 
</span><span class="cx">       case GL_PIXEL_PACK_BUFFER:
</span><span class="cx">       case GL_PIXEL_UNPACK_BUFFER:
</span><del>-        return context-&gt;getExtensions().pixelBufferObject;
</del><ins>+          return (context-&gt;getExtensions().pixelBufferObject || context-&gt;getClientVersion() &gt;= 3);
</ins><span class="cx"> 
</span><span class="cx">       case GL_COPY_READ_BUFFER:
</span><span class="cx">       case GL_COPY_WRITE_BUFFER:
</span><span class="lines">@@ -156,36 +268,52 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidMipLevel(const Context *context, GLenum target, GLint level)
</del><ins>+bool ValidMipLevel(const ValidationContext *context, GLenum target, GLint level)
</ins><span class="cx"> {
</span><ins>+    const auto &amp;caps    = context-&gt;getCaps();
</ins><span class="cx">     size_t maxDimension = 0;
</span><span class="cx">     switch (target)
</span><span class="cx">     {
</span><del>-      case GL_TEXTURE_2D:                  maxDimension = context-&gt;getCaps().max2DTextureSize;       break;
</del><ins>+        case GL_TEXTURE_2D:
+            maxDimension = caps.max2DTextureSize;
+            break;
</ins><span class="cx">       case GL_TEXTURE_CUBE_MAP:
</span><span class="cx">       case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
</span><span class="cx">       case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
</span><span class="cx">       case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
</span><span class="cx">       case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
</span><span class="cx">       case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
</span><del>-      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: maxDimension = context-&gt;getCaps().maxCubeMapTextureSize;  break;
-      case GL_TEXTURE_3D:                  maxDimension = context-&gt;getCaps().max3DTextureSize;       break;
-      case GL_TEXTURE_2D_ARRAY:            maxDimension = context-&gt;getCaps().max2DTextureSize;       break;
</del><ins>+      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
+          maxDimension = caps.maxCubeMapTextureSize;
+          break;
+      case GL_TEXTURE_3D:
+          maxDimension = caps.max3DTextureSize;
+          break;
+      case GL_TEXTURE_2D_ARRAY:
+          maxDimension = caps.max2DTextureSize;
+          break;
</ins><span class="cx">       default: UNREACHABLE();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return level &lt;= gl::log2(static_cast&lt;int&gt;(maxDimension));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidImageSize(const Context *context, GLenum target, GLint level,
-                    GLsizei width, GLsizei height, GLsizei depth)
</del><ins>+bool ValidImageSizeParameters(const Context *context,
+                              GLenum target,
+                              GLint level,
+                              GLsizei width,
+                              GLsizei height,
+                              GLsizei depth,
+                              bool isSubImage)
</ins><span class="cx"> {
</span><span class="cx">     if (level &lt; 0 || width &lt; 0 || height &lt; 0 || depth &lt; 0)
</span><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!context-&gt;getExtensions().textureNPOT &amp;&amp;
</del><ins>+    // TexSubImage parameters can be NPOT without textureNPOT extension,
+    // as long as the destination texture is POT.
+    if (!isSubImage &amp;&amp; !context-&gt;getExtensions().textureNPOT &amp;&amp;
</ins><span class="cx">         (level != 0 &amp;&amp; (!gl::isPow2(width) || !gl::isPow2(height) || !gl::isPow2(depth))))
</span><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="lines">@@ -199,20 +327,51 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidCompressedImageSize(const Context *context, GLenum internalFormat, GLsizei width, GLsizei height)
</del><ins>+bool CompressedTextureFormatRequiresExactSize(GLenum internalFormat)
</ins><span class="cx"> {
</span><ins>+    // List of compressed format that require that the texture size is smaller than or a multiple of
+    // the compressed block size.
+    switch (internalFormat)
+    {
+        case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+        case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+        case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
+        case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
+        case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
+            return true;
+
+        default:
+            return false;
+    }
+}
+
+bool ValidCompressedImageSize(const ValidationContext *context,
+                              GLenum internalFormat,
+                              GLsizei width,
+                              GLsizei height)
+{
</ins><span class="cx">     const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(internalFormat);
</span><span class="cx">     if (!formatInfo.compressed)
</span><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (width  &lt; 0 || (static_cast&lt;GLuint&gt;(width)  &gt; formatInfo.compressedBlockWidth  &amp;&amp; width  % formatInfo.compressedBlockWidth != 0) ||
-        height &lt; 0 || (static_cast&lt;GLuint&gt;(height) &gt; formatInfo.compressedBlockHeight &amp;&amp; height % formatInfo.compressedBlockHeight != 0))
</del><ins>+    if (width &lt; 0 || height &lt; 0)
</ins><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (CompressedTextureFormatRequiresExactSize(internalFormat))
+    {
+        if ((static_cast&lt;GLuint&gt;(width) &gt; formatInfo.compressedBlockWidth &amp;&amp;
+             width % formatInfo.compressedBlockWidth != 0) ||
+            (static_cast&lt;GLuint&gt;(height) &gt; formatInfo.compressedBlockHeight &amp;&amp;
+             height % formatInfo.compressedBlockHeight != 0))
+        {
+            return false;
+        }
+    }
+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -228,33 +387,57 @@
</span><span class="cx">         return true;
</span><span class="cx">       case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
</span><span class="cx">         return (context-&gt;getClientVersion() &gt;= 3);
</span><ins>+      case GL_TIME_ELAPSED_EXT:
+          return context-&gt;getExtensions().disjointTimerQuery;
</ins><span class="cx">       default:
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidProgram(Context *context, GLuint id)
</del><ins>+Program *GetValidProgram(Context *context, GLuint id)
</ins><span class="cx"> {
</span><span class="cx">     // ES3 spec (section 2.11.1) -- &quot;Commands that accept shader or program object names will generate the
</span><span class="cx">     // error INVALID_VALUE if the provided name is not the name of either a shader or program object and
</span><span class="cx">     // INVALID_OPERATION if the provided name identifies an object that is not the expected type.&quot;
</span><span class="cx"> 
</span><del>-    if (context-&gt;getProgram(id) != NULL)
</del><ins>+    Program *validProgram = context-&gt;getProgram(id);
+
+    if (!validProgram)
</ins><span class="cx">     {
</span><del>-        return true;
</del><ins>+        if (context-&gt;getShader(id))
+        {
+            context-&gt;recordError(
+                Error(GL_INVALID_OPERATION, &quot;Expected a program name, but found a shader name&quot;));
+        }
+        else
+        {
+            context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;Program name is not valid&quot;));
+        }
</ins><span class="cx">     }
</span><del>-    else if (context-&gt;getShader(id) != NULL)
</del><ins>+
+    return validProgram;
+}
+
+Shader *GetValidShader(Context *context, GLuint id)
+{
+    // See ValidProgram for spec details.
+
+    Shader *validShader = context-&gt;getShader(id);
+
+    if (!validShader)
</ins><span class="cx">     {
</span><del>-        // ID is the wrong type
-        context-&gt;recordError(Error(GL_INVALID_OPERATION));
-        return false;
</del><ins>+        if (context-&gt;getProgram(id))
+        {
+            context-&gt;recordError(
+                Error(GL_INVALID_OPERATION, &quot;Expected a shader name, but found a program name&quot;));
+        }
+        else
+        {
+            context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;Shader name is invalid&quot;));
+        }
</ins><span class="cx">     }
</span><del>-    else
-    {
-        // No shader/program object has this ID
-        context-&gt;recordError(Error(GL_INVALID_VALUE));
-        return false;
-    }
</del><ins>+
+    return validShader;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool ValidateAttachmentTarget(gl::Context *context, GLenum attachment)
</span><span class="lines">@@ -415,44 +598,23 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool IsPartialBlit(gl::Context *context, const gl::FramebufferAttachment *readBuffer, const gl::FramebufferAttachment *writeBuffer,
-                          GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
-                          GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1)
</del><ins>+bool ValidateBlitFramebufferParameters(gl::Context *context,
+                                       GLint srcX0,
+                                       GLint srcY0,
+                                       GLint srcX1,
+                                       GLint srcY1,
+                                       GLint dstX0,
+                                       GLint dstY0,
+                                       GLint dstX1,
+                                       GLint dstY1,
+                                       GLbitfield mask,
+                                       GLenum filter)
</ins><span class="cx"> {
</span><del>-    if (srcX0 != 0 || srcY0 != 0 || dstX0 != 0 || dstY0 != 0 ||
-        dstX1 != writeBuffer-&gt;getWidth() || dstY1 != writeBuffer-&gt;getHeight() ||
-        srcX1 != readBuffer-&gt;getWidth() || srcY1 != readBuffer-&gt;getHeight())
-    {
-        return true;
-    }
-    else if (context-&gt;getState().isScissorTestEnabled())
-    {
-        const Rectangle &amp;scissor = context-&gt;getState().getScissor();
-
-        return scissor.x &gt; 0 || scissor.y &gt; 0 ||
-               scissor.width &lt; writeBuffer-&gt;getWidth() ||
-               scissor.height &lt; writeBuffer-&gt;getHeight();
-    }
-    else
-    {
-        return false;
-    }
-}
-
-bool ValidateBlitFramebufferParameters(gl::Context *context, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
-                                       GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask,
-                                       GLenum filter, bool fromAngleExtension)
-{
</del><span class="cx">     switch (filter)
</span><span class="cx">     {
</span><span class="cx">       case GL_NEAREST:
</span><span class="cx">         break;
</span><span class="cx">       case GL_LINEAR:
</span><del>-        if (fromAngleExtension)
-        {
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return false;
-        }
</del><span class="cx">         break;
</span><span class="cx">       default:
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="lines">@@ -472,13 +634,6 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (fromAngleExtension &amp;&amp; (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0))
-    {
-        ERR(&quot;Scaling and flipping in BlitFramebufferANGLE not supported by this implementation.&quot;);
-        context-&gt;recordError(Error(GL_INVALID_OPERATION));
-        return false;
-    }
-
</del><span class="cx">     // ES3.0 spec, section 4.3.2 states that linear filtering is only available for the
</span><span class="cx">     // color buffer, leaving only nearest being unfiltered from above
</span><span class="cx">     if ((mask &amp; ~GL_COLOR_BUFFER_BIT) != 0 &amp;&amp; filter != GL_NEAREST)
</span><span class="lines">@@ -489,11 +644,6 @@
</span><span class="cx"> 
</span><span class="cx">     if (context-&gt;getState().getReadFramebuffer()-&gt;id() == context-&gt;getState().getDrawFramebuffer()-&gt;id())
</span><span class="cx">     {
</span><del>-        if (fromAngleExtension)
-        {
-            ERR(&quot;Blits with the same source and destination framebuffer are not supported by this &quot;
-                &quot;implementation.&quot;);
-        }
</del><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -531,37 +681,66 @@
</span><span class="cx">     {
</span><span class="cx">         const gl::FramebufferAttachment *readColorBuffer = readFramebuffer-&gt;getReadColorbuffer();
</span><span class="cx">         const gl::FramebufferAttachment *drawColorBuffer = drawFramebuffer-&gt;getFirstColorbuffer();
</span><ins>+        const Extensions &amp;extensions                     = context-&gt;getExtensions();
</ins><span class="cx"> 
</span><span class="cx">         if (readColorBuffer &amp;&amp; drawColorBuffer)
</span><span class="cx">         {
</span><span class="cx">             GLenum readInternalFormat = readColorBuffer-&gt;getInternalFormat();
</span><span class="cx">             const InternalFormat &amp;readFormatInfo = GetInternalFormatInfo(readInternalFormat);
</span><span class="cx"> 
</span><del>-            for (GLuint i = 0; i &lt; context-&gt;getCaps().maxColorAttachments; i++)
</del><ins>+            for (size_t drawbufferIdx = 0;
+                 drawbufferIdx &lt; drawFramebuffer-&gt;getDrawbufferStateCount(); ++drawbufferIdx)
</ins><span class="cx">             {
</span><del>-                if (drawFramebuffer-&gt;isEnabledColorAttachment(i))
</del><ins>+                const FramebufferAttachment *attachment =
+                    drawFramebuffer-&gt;getDrawBuffer(drawbufferIdx);
+                if (attachment)
</ins><span class="cx">                 {
</span><del>-                    GLenum drawInternalFormat = drawFramebuffer-&gt;getColorbuffer(i)-&gt;getInternalFormat();
</del><ins>+                    GLenum drawInternalFormat            = attachment-&gt;getInternalFormat();
</ins><span class="cx">                     const InternalFormat &amp;drawFormatInfo = GetInternalFormatInfo(drawInternalFormat);
</span><span class="cx"> 
</span><span class="cx">                     // The GL ES 3.0.2 spec (pg 193) states that:
</span><span class="cx">                     // 1) If the read buffer is fixed point format, the draw buffer must be as well
</span><span class="cx">                     // 2) If the read buffer is an unsigned integer format, the draw buffer must be as well
</span><span class="cx">                     // 3) If the read buffer is a signed integer format, the draw buffer must be as well
</span><del>-                    if ( (readFormatInfo.componentType == GL_UNSIGNED_NORMALIZED || readFormatInfo.componentType == GL_SIGNED_NORMALIZED) &amp;&amp;
-                        !(drawFormatInfo.componentType == GL_UNSIGNED_NORMALIZED || drawFormatInfo.componentType == GL_SIGNED_NORMALIZED))
</del><ins>+                    // Changes with EXT_color_buffer_float:
+                    // Case 1) is changed to fixed point OR floating point
+                    GLenum readComponentType = readFormatInfo.componentType;
+                    GLenum drawComponentType = drawFormatInfo.componentType;
+                    bool readFixedPoint = (readComponentType == GL_UNSIGNED_NORMALIZED ||
+                                           readComponentType == GL_SIGNED_NORMALIZED);
+                    bool drawFixedPoint = (drawComponentType == GL_UNSIGNED_NORMALIZED ||
+                                           drawComponentType == GL_SIGNED_NORMALIZED);
+
+                    if (extensions.colorBufferFloat)
</ins><span class="cx">                     {
</span><del>-                        context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><ins>+                        bool readFixedOrFloat = (readFixedPoint || readComponentType == GL_FLOAT);
+                        bool drawFixedOrFloat = (drawFixedPoint || drawComponentType == GL_FLOAT);
+
+                        if (readFixedOrFloat != drawFixedOrFloat)
+                        {
+                            context-&gt;recordError(Error(GL_INVALID_OPERATION,
+                                                       &quot;If the read buffer contains fixed-point or &quot;
+                                                       &quot;floating-point values, the draw buffer &quot;
+                                                       &quot;must as well.&quot;));
+                            return false;
+                        }
+                    }
+                    else if (readFixedPoint != drawFixedPoint)
+                    {
+                        context-&gt;recordError(Error(GL_INVALID_OPERATION,
+                                                   &quot;If the read buffer contains fixed-point &quot;
+                                                   &quot;values, the draw buffer must as well.&quot;));
</ins><span class="cx">                         return false;
</span><span class="cx">                     }
</span><span class="cx"> 
</span><del>-                    if (readFormatInfo.componentType == GL_UNSIGNED_INT &amp;&amp; drawFormatInfo.componentType != GL_UNSIGNED_INT)
</del><ins>+                    if (readComponentType == GL_UNSIGNED_INT &amp;&amp;
+                        drawComponentType != GL_UNSIGNED_INT)
</ins><span class="cx">                     {
</span><span class="cx">                         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">                         return false;
</span><span class="cx">                     }
</span><span class="cx"> 
</span><del>-                    if (readFormatInfo.componentType == GL_INT &amp;&amp; drawFormatInfo.componentType != GL_INT)
</del><ins>+                    if (readComponentType == GL_INT &amp;&amp; drawComponentType != GL_INT)
</ins><span class="cx">                     {
</span><span class="cx">                         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">                         return false;
</span><span class="lines">@@ -580,53 +759,6 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><del>-
-            if (fromAngleExtension)
-            {
-                const FramebufferAttachment *readColorAttachment = readFramebuffer-&gt;getReadColorbuffer();
-                if (!readColorAttachment ||
-                    (!(readColorAttachment-&gt;type() == GL_TEXTURE &amp;&amp; readColorAttachment-&gt;getTextureImageIndex().type == GL_TEXTURE_2D) &amp;&amp;
-                    readColorAttachment-&gt;type() != GL_RENDERBUFFER &amp;&amp;
-                    readColorAttachment-&gt;type() != GL_FRAMEBUFFER_DEFAULT))
-                {
-                    context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                    return false;
-                }
-
-                for (GLuint colorAttachment = 0; colorAttachment &lt; context-&gt;getCaps().maxColorAttachments; ++colorAttachment)
-                {
-                    if (drawFramebuffer-&gt;isEnabledColorAttachment(colorAttachment))
-                    {
-                        const FramebufferAttachment *attachment = drawFramebuffer-&gt;getColorbuffer(colorAttachment);
-                        ASSERT(attachment);
-
-                        if (!(attachment-&gt;type() == GL_TEXTURE &amp;&amp; attachment-&gt;getTextureImageIndex().type == GL_TEXTURE_2D) &amp;&amp;
-                            attachment-&gt;type() != GL_RENDERBUFFER &amp;&amp;
-                            attachment-&gt;type() != GL_FRAMEBUFFER_DEFAULT)
-                        {
-                            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                            return false;
-                        }
-
-                        // Return an error if the destination formats do not match
-                        if (attachment-&gt;getInternalFormat() != readColorBuffer-&gt;getInternalFormat())
-                        {
-                            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                            return false;
-                        }
-                    }
-                }
-
-                int readSamples = readFramebuffer-&gt;getSamples(context-&gt;getData());
-
-                if (readSamples != 0 &amp;&amp; IsPartialBlit(context, readColorBuffer, drawColorBuffer,
-                                                      srcX0, srcY0, srcX1, srcY1,
-                                                      dstX0, dstY0, dstX1, dstY1))
-                {
-                    context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                    return false;
-                }
-            }
</del><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -652,23 +784,6 @@
</span><span class="cx">                     context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">                     return false;
</span><span class="cx">                 }
</span><del>-
-                if (fromAngleExtension)
-                {
-                    if (IsPartialBlit(context, readBuffer, drawBuffer,
-                                      srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1))
-                    {
-                        ERR(&quot;Only whole-buffer depth and stencil blits are supported by this implementation.&quot;);
-                        context-&gt;recordError(Error(GL_INVALID_OPERATION)); // only whole-buffer copies are permitted
-                        return false;
-                    }
-
-                    if (readBuffer-&gt;getSamples() != 0 || drawBuffer-&gt;getSamples() != 0)
-                    {
-                        context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                        return false;
-                    }
-                }
</del><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -898,10 +1013,22 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateReadPixelsParameters(gl::Context *context, GLint x, GLint y, GLsizei width, GLsizei height,
-                                  GLenum format, GLenum type, GLsizei *bufSize, GLvoid *pixels)
</del><ins>+bool ValidateReadPixels(Context *context,
+                        GLint x,
+                        GLint y,
+                        GLsizei width,
+                        GLsizei height,
+                        GLenum format,
+                        GLenum type,
+                        GLvoid *pixels)
</ins><span class="cx"> {
</span><del>-    gl::Framebuffer *framebuffer = context-&gt;getState().getReadFramebuffer();
</del><ins>+    if (width &lt; 0 || height &lt; 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;width and height must be positive&quot;));
+        return false;
+    }
+
+    Framebuffer *framebuffer = context-&gt;getState().getReadFramebuffer();
</ins><span class="cx">     ASSERT(framebuffer);
</span><span class="cx"> 
</span><span class="cx">     if (framebuffer-&gt;checkStatus(context-&gt;getData()) != GL_FRAMEBUFFER_COMPLETE)
</span><span class="lines">@@ -938,35 +1065,77 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    return true;
+}
+
+bool ValidateReadnPixelsEXT(Context *context,
+                            GLint x,
+                            GLint y,
+                            GLsizei width,
+                            GLsizei height,
+                            GLenum format,
+                            GLenum type,
+                            GLsizei bufSize,
+                            GLvoid *pixels)
+{
+    if (bufSize &lt; 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;bufSize must be a positive number&quot;));
+        return false;
+    }
+
</ins><span class="cx">     GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);
</span><span class="cx">     const InternalFormat &amp;sizedFormatInfo = GetInternalFormatInfo(sizedInternalFormat);
</span><span class="cx"> 
</span><del>-    GLsizei outputPitch = sizedFormatInfo.computeRowPitch(type, width, context-&gt;getState().getPackAlignment(), 0);
</del><ins>+    GLsizei outputPitch =
+        sizedFormatInfo.computeRowPitch(type, width, context-&gt;getState().getPackAlignment(),
+                                        context-&gt;getState().getPackRowLength());
</ins><span class="cx">     // sized query sanity check
</span><del>-    if (bufSize)
</del><ins>+    int requiredSize = outputPitch * height;
+    if (requiredSize &gt; bufSize)
</ins><span class="cx">     {
</span><del>-        int requiredSize = outputPitch * height;
-        if (requiredSize &gt; *bufSize)
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return false;
-        }
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return true;
</del><ins>+    return ValidateReadPixels(context, x, y, width, height, format, type, pixels);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateBeginQuery(gl::Context *context, GLenum target, GLuint id)
</del><ins>+bool ValidateGenQueriesEXT(gl::Context *context, GLsizei n)
</ins><span class="cx"> {
</span><ins>+    if (!context-&gt;getExtensions().occlusionQueryBoolean &amp;&amp;
+        !context-&gt;getExtensions().disjointTimerQuery)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query extension not enabled&quot;));
+        return false;
+    }
+
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateDeleteQueriesEXT(gl::Context *context, GLsizei n)
+{
+    if (!context-&gt;getExtensions().occlusionQueryBoolean &amp;&amp;
+        !context-&gt;getExtensions().disjointTimerQuery)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query extension not enabled&quot;));
+        return false;
+    }
+
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateBeginQueryBase(gl::Context *context, GLenum target, GLuint id)
+{
</ins><span class="cx">     if (!ValidQueryType(context, target))
</span><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_ENUM));
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid query target&quot;));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (id == 0)
</span><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query id is 0&quot;));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -985,9 +1154,12 @@
</span><span class="cx">     //    b) There are no active queries for the requested target (and in the case
</span><span class="cx">     //       of GL_ANY_SAMPLES_PASSED_EXT and GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT,
</span><span class="cx">     //       no query may be active for either if glBeginQuery targets either.
</span><ins>+
+    // TODO(ewell): I think this needs to be changed for timer and occlusion queries to work at the
+    // same time
</ins><span class="cx">     if (context-&gt;getState().isQueryActive())
</span><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Other query is active&quot;));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -996,42 +1168,216 @@
</span><span class="cx">     // check that name was obtained with glGenQueries
</span><span class="cx">     if (!queryObject)
</span><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Invalid query id&quot;));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // check for type mismatch
</span><span class="cx">     if (queryObject-&gt;getType() != target)
</span><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query type does not match target&quot;));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateEndQuery(gl::Context *context, GLenum target)
</del><ins>+bool ValidateBeginQueryEXT(gl::Context *context, GLenum target, GLuint id)
</ins><span class="cx"> {
</span><ins>+    if (!context-&gt;getExtensions().occlusionQueryBoolean &amp;&amp;
+        !context-&gt;getExtensions().disjointTimerQuery)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query extension not enabled&quot;));
+        return false;
+    }
+
+    return ValidateBeginQueryBase(context, target, id);
+}
+
+bool ValidateEndQueryBase(gl::Context *context, GLenum target)
+{
</ins><span class="cx">     if (!ValidQueryType(context, target))
</span><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_ENUM));
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid query target&quot;));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     const Query *queryObject = context-&gt;getState().getActiveQuery(target);
</span><span class="cx"> 
</span><del>-    if (queryObject == NULL)
</del><ins>+    if (queryObject == nullptr)
</ins><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query target not active&quot;));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool ValidateUniformCommonBase(gl::Context *context, GLenum targetUniformType,
-                                      GLint location, GLsizei count, LinkedUniform **uniformOut)
</del><ins>+bool ValidateEndQueryEXT(gl::Context *context, GLenum target)
</ins><span class="cx"> {
</span><ins>+    if (!context-&gt;getExtensions().occlusionQueryBoolean &amp;&amp;
+        !context-&gt;getExtensions().disjointTimerQuery)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query extension not enabled&quot;));
+        return false;
+    }
+
+    return ValidateEndQueryBase(context, target);
+}
+
+bool ValidateQueryCounterEXT(Context *context, GLuint id, GLenum target)
+{
+    if (!context-&gt;getExtensions().disjointTimerQuery)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Disjoint timer query not enabled&quot;));
+        return false;
+    }
+
+    if (target != GL_TIMESTAMP_EXT)
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid query target&quot;));
+        return false;
+    }
+
+    Query *queryObject = context-&gt;getQuery(id, true, target);
+    if (queryObject == nullptr)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Invalid query id&quot;));
+        return false;
+    }
+
+    if (context-&gt;getState().isQueryActive(queryObject))
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query is active&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateGetQueryivBase(Context *context, GLenum target, GLenum pname)
+{
+    if (!ValidQueryType(context, target) &amp;&amp; target != GL_TIMESTAMP_EXT)
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid query type&quot;));
+        return false;
+    }
+
+    switch (pname)
+    {
+        case GL_CURRENT_QUERY_EXT:
+            if (target == GL_TIMESTAMP_EXT)
+            {
+                context-&gt;recordError(
+                    Error(GL_INVALID_ENUM, &quot;Cannot use current query for timestamp&quot;));
+                return false;
+            }
+            break;
+        case GL_QUERY_COUNTER_BITS_EXT:
+            if (!context-&gt;getExtensions().disjointTimerQuery ||
+                (target != GL_TIMESTAMP_EXT &amp;&amp; target != GL_TIME_ELAPSED_EXT))
+            {
+                context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid pname&quot;));
+                return false;
+            }
+            break;
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid pname&quot;));
+            return false;
+    }
+
+    return true;
+}
+
+bool ValidateGetQueryivEXT(Context *context, GLenum target, GLenum pname, GLint *params)
+{
+    if (!context-&gt;getExtensions().occlusionQueryBoolean &amp;&amp;
+        !context-&gt;getExtensions().disjointTimerQuery)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query extension not enabled&quot;));
+        return false;
+    }
+
+    return ValidateGetQueryivBase(context, target, pname);
+}
+
+bool ValidateGetQueryObjectValueBase(Context *context, GLuint id, GLenum pname)
+{
+    Query *queryObject = context-&gt;getQuery(id, false, GL_NONE);
+
+    if (!queryObject)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query does not exist&quot;));
+        return false;
+    }
+
+    if (context-&gt;getState().isQueryActive(queryObject))
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query currently active&quot;));
+        return false;
+    }
+
+    switch (pname)
+    {
+        case GL_QUERY_RESULT_EXT:
+        case GL_QUERY_RESULT_AVAILABLE_EXT:
+            break;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid pname enum&quot;));
+            return false;
+    }
+
+    return true;
+}
+
+bool ValidateGetQueryObjectivEXT(Context *context, GLuint id, GLenum pname, GLint *params)
+{
+    if (!context-&gt;getExtensions().disjointTimerQuery)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Timer query extension not enabled&quot;));
+        return false;
+    }
+    return ValidateGetQueryObjectValueBase(context, id, pname);
+}
+
+bool ValidateGetQueryObjectuivEXT(Context *context, GLuint id, GLenum pname, GLuint *params)
+{
+    if (!context-&gt;getExtensions().disjointTimerQuery &amp;&amp;
+        !context-&gt;getExtensions().occlusionQueryBoolean)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Query extension not enabled&quot;));
+        return false;
+    }
+    return ValidateGetQueryObjectValueBase(context, id, pname);
+}
+
+bool ValidateGetQueryObjecti64vEXT(Context *context, GLuint id, GLenum pname, GLint64 *params)
+{
+    if (!context-&gt;getExtensions().disjointTimerQuery)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Timer query extension not enabled&quot;));
+        return false;
+    }
+    return ValidateGetQueryObjectValueBase(context, id, pname);
+}
+
+bool ValidateGetQueryObjectui64vEXT(Context *context, GLuint id, GLenum pname, GLuint64 *params)
+{
+    if (!context-&gt;getExtensions().disjointTimerQuery)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Timer query extension not enabled&quot;));
+        return false;
+    }
+    return ValidateGetQueryObjectValueBase(context, id, pname);
+}
+
+static bool ValidateUniformCommonBase(gl::Context *context,
+                                      GLenum targetUniformType,
+                                      GLint location,
+                                      GLsizei count,
+                                      const LinkedUniform **uniformOut)
+{
</ins><span class="cx">     if (count &lt; 0)
</span><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_VALUE));
</span><span class="lines">@@ -1057,16 +1403,16 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    LinkedUniform *uniform = program-&gt;getUniformByLocation(location);
</del><ins>+    const LinkedUniform &amp;uniform = program-&gt;getUniformByLocation(location);
</ins><span class="cx"> 
</span><span class="cx">     // attempting to write an array to a non-array uniform is an INVALID_OPERATION
</span><del>-    if (uniform-&gt;elementCount() == 1 &amp;&amp; count &gt; 1)
</del><ins>+    if (!uniform.isArray() &amp;&amp; count &gt; 1)
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    *uniformOut = uniform;
</del><ins>+    *uniformOut = &amp;uniform;
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1079,7 +1425,7 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    LinkedUniform *uniform = NULL;
</del><ins>+    const LinkedUniform *uniform = nullptr;
</ins><span class="cx">     if (!ValidateUniformCommonBase(context, uniformType, location, count, &amp;uniform))
</span><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="lines">@@ -1114,7 +1460,7 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    LinkedUniform *uniform = NULL;
</del><ins>+    const LinkedUniform *uniform = nullptr;
</ins><span class="cx">     if (!ValidateUniformCommonBase(context, matrixType, location, count, &amp;uniform))
</span><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="lines">@@ -1156,12 +1502,15 @@
</span><span class="cx">       case GL_TEXTURE_BINDING_CUBE_MAP:
</span><span class="cx">       case GL_TEXTURE_BINDING_3D:
</span><span class="cx">       case GL_TEXTURE_BINDING_2D_ARRAY:
</span><del>-        if (context-&gt;getState().getActiveSampler() &gt;= caps.maxCombinedTextureImageUnits)
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return false;
-        }
</del><span class="cx">         break;
</span><ins>+      case GL_TEXTURE_BINDING_EXTERNAL_OES:
+          if (!context-&gt;getExtensions().eglStreamConsumerExternal)
+          {
+              context-&gt;recordError(
+                  Error(GL_INVALID_ENUM, &quot;NV_EGL_stream_consumer_external extension not enabled&quot;));
+              return false;
+          }
+          break;
</ins><span class="cx"> 
</span><span class="cx">       case GL_IMPLEMENTATION_COLOR_READ_TYPE:
</span><span class="cx">       case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
</span><span class="lines">@@ -1196,17 +1545,21 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateCopyTexImageParametersBase(gl::Context* context, GLenum target, GLint level, GLenum internalformat, bool isSubImage,
-                                        GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height,
-                                        GLint border, GLenum *textureFormatOut)
</del><ins>+bool ValidateCopyTexImageParametersBase(ValidationContext *context,
+                                        GLenum target,
+                                        GLint level,
+                                        GLenum internalformat,
+                                        bool isSubImage,
+                                        GLint xoffset,
+                                        GLint yoffset,
+                                        GLint zoffset,
+                                        GLint x,
+                                        GLint y,
+                                        GLsizei width,
+                                        GLsizei height,
+                                        GLint border,
+                                        GLenum *textureFormatOut)
</ins><span class="cx"> {
</span><del>-
-    if (!ValidTexture2DDestinationTarget(context, target))
-    {
-        context-&gt;recordError(Error(GL_INVALID_ENUM));
-        return false;
-    }
-
</del><span class="cx">     if (level &lt; 0 || xoffset &lt; 0 || yoffset &lt; 0 || zoffset &lt; 0 || width &lt; 0 || height &lt; 0)
</span><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_VALUE));
</span><span class="lines">@@ -1231,14 +1584,15 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::Framebuffer *framebuffer = context-&gt;getState().getReadFramebuffer();
</del><ins>+    const gl::Framebuffer *framebuffer = context-&gt;getState().getReadFramebuffer();
</ins><span class="cx">     if (framebuffer-&gt;checkStatus(context-&gt;getData()) != GL_FRAMEBUFFER_COMPLETE)
</span><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (context-&gt;getState().getReadFramebuffer()-&gt;id() != 0 &amp;&amp; framebuffer-&gt;getSamples(context-&gt;getData()) != 0)
</del><ins>+    const auto &amp;state = context-&gt;getState();
+    if (state.getReadFramebuffer()-&gt;id() != 0 &amp;&amp; framebuffer-&gt;getSamples(context-&gt;getData()) != 0)
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">         return false;
</span><span class="lines">@@ -1275,14 +1629,15 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::Texture *texture = context-&gt;getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
</del><ins>+    gl::Texture *texture =
+        state.getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
</ins><span class="cx">     if (!texture)
</span><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (texture-&gt;isImmutable() &amp;&amp; !isSubImage)
</del><ins>+    if (texture-&gt;getImmutableFormat() &amp;&amp; !isSubImage)
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">         return false;
</span><span class="lines">@@ -1338,7 +1693,10 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool ValidateDrawBase(Context *context, GLenum mode, GLsizei count, GLsizei maxVertex, GLsizei primcount)
</del><ins>+static bool ValidateDrawBase(ValidationContext *context,
+                             GLenum mode,
+                             GLsizei count,
+                             GLsizei primcount)
</ins><span class="cx"> {
</span><span class="cx">     switch (mode)
</span><span class="cx">     {
</span><span class="lines">@@ -1370,17 +1728,27 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const gl::DepthStencilState &amp;depthStencilState = state.getDepthStencilState();
-    if (depthStencilState.stencilWritemask != depthStencilState.stencilBackWritemask ||
-        state.getStencilRef() != state.getStencilBackRef() ||
-        depthStencilState.stencilMask != depthStencilState.stencilBackMask)
</del><ins>+    if (context-&gt;getLimitations().noSeparateStencilRefsAndMasks)
</ins><span class="cx">     {
</span><del>-        // Note: these separate values are not supported in WebGL, due to D3D's limitations.
-        // See Section 6.10 of the WebGL 1.0 spec
-        ERR(&quot;This ANGLE implementation does not support separate front/back stencil &quot;
-            &quot;writemasks, reference values, or stencil mask values.&quot;);
-        context-&gt;recordError(Error(GL_INVALID_OPERATION));
-        return false;
</del><ins>+        const Framebuffer *framebuffer             = context-&gt;getState().getDrawFramebuffer();
+        const FramebufferAttachment *stencilBuffer = framebuffer-&gt;getStencilbuffer();
+        GLuint stencilBits                         = stencilBuffer ? stencilBuffer-&gt;getStencilSize() : 0;
+        GLuint minimumRequiredStencilMask          = (1 &lt;&lt; stencilBits) - 1;
+        const DepthStencilState &amp;depthStencilState = state.getDepthStencilState();
+        if ((depthStencilState.stencilWritemask &amp; minimumRequiredStencilMask) !=
+                (depthStencilState.stencilBackWritemask &amp; minimumRequiredStencilMask) ||
+            state.getStencilRef() != state.getStencilBackRef() ||
+            (depthStencilState.stencilMask &amp; minimumRequiredStencilMask) !=
+                (depthStencilState.stencilBackMask &amp; minimumRequiredStencilMask))
+        {
+            // Note: these separate values are not supported in WebGL, due to D3D's limitations. See
+            // Section 6.10 of the WebGL 1.0 spec
+            ERR(
+                &quot;This ANGLE implementation does not support separate front/back stencil &quot;
+                &quot;writemasks, reference values, or stencil mask values.&quot;);
+            context-&gt;recordError(Error(GL_INVALID_OPERATION));
+            return false;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     const gl::Framebuffer *fbo = state.getDrawFramebuffer();
</span><span class="lines">@@ -1403,77 +1771,29 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Buffer validations
-    const VertexArray *vao = state.getVertexArray();
-    const auto &amp;vertexAttribs = vao-&gt;getVertexAttributes();
-    const int *semanticIndexes = program-&gt;getSemanticIndexes();
-    unsigned int maxEnabledAttrib = vao-&gt;getMaxEnabledAttribute();
-    for (size_t attributeIndex = 0; attributeIndex &lt; maxEnabledAttrib; ++attributeIndex)
-    {
-        const VertexAttribute &amp;attrib = vertexAttribs[attributeIndex];
-        bool attribActive = (semanticIndexes[attributeIndex] != -1);
-        if (attribActive &amp;&amp; attrib.enabled)
-        {
-            gl::Buffer *buffer = attrib.buffer.get();
-
-            if (buffer)
-            {
-                GLint64 attribStride = static_cast&lt;GLint64&gt;(ComputeVertexAttributeStride(attrib));
-                GLint64 maxVertexElement = 0;
-
-                if (attrib.divisor &gt; 0)
-                {
-                    maxVertexElement = static_cast&lt;GLint64&gt;(primcount) / static_cast&lt;GLint64&gt;(attrib.divisor);
-                }
-                else
-                {
-                    maxVertexElement = static_cast&lt;GLint64&gt;(maxVertex);
-                }
-
-                GLint64 attribDataSize = maxVertexElement * attribStride;
-
-                // [OpenGL ES 3.0.2] section 2.9.4 page 40:
-                // We can return INVALID_OPERATION if our vertex attribute does not have
-                // enough backing data.
-                if (attribDataSize &gt; buffer-&gt;getSize())
-                {
-                    context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                    return false;
-                }
-            }
-            else if (attrib.pointer == NULL)
-            {
-                // This is an application error that would normally result in a crash,
-                // but we catch it and return an error
-                context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;An enabled vertex array has no buffer and no pointer.&quot;));
-                return false;
-            }
-        }
-    }
-
</del><span class="cx">     // Uniform buffer validation
</span><span class="cx">     for (unsigned int uniformBlockIndex = 0; uniformBlockIndex &lt; program-&gt;getActiveUniformBlockCount(); uniformBlockIndex++)
</span><span class="cx">     {
</span><del>-        const gl::UniformBlock *uniformBlock = program-&gt;getUniformBlockByIndex(uniformBlockIndex);
</del><ins>+        const gl::UniformBlock &amp;uniformBlock = program-&gt;getUniformBlockByIndex(uniformBlockIndex);
</ins><span class="cx">         GLuint blockBinding = program-&gt;getUniformBlockBinding(uniformBlockIndex);
</span><del>-        const gl::Buffer *uniformBuffer = state.getIndexedUniformBuffer(blockBinding);
</del><ins>+        const OffsetBindingPointer&lt;Buffer&gt; &amp;uniformBuffer =
+            state.getIndexedUniformBuffer(blockBinding);
</ins><span class="cx"> 
</span><del>-        if (!uniformBuffer)
</del><ins>+        if (uniformBuffer.get() == nullptr)
</ins><span class="cx">         {
</span><span class="cx">             // undefined behaviour
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;It is undefined behaviour to have a used but unbound uniform buffer.&quot;));
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        size_t uniformBufferSize = state.getIndexedUniformBufferSize(blockBinding);
-
</del><ins>+        size_t uniformBufferSize = uniformBuffer.getSize();
</ins><span class="cx">         if (uniformBufferSize == 0)
</span><span class="cx">         {
</span><span class="cx">             // Bind the whole buffer.
</span><span class="cx">             uniformBufferSize = static_cast&lt;size_t&gt;(uniformBuffer-&gt;getSize());
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (uniformBufferSize &lt; uniformBlock-&gt;dataSize)
</del><ins>+        if (uniformBufferSize &lt; uniformBlock.dataSize)
</ins><span class="cx">         {
</span><span class="cx">             // undefined behaviour
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;It is undefined behaviour to use a uniform buffer that is too small.&quot;));
</span><span class="lines">@@ -1505,11 +1825,16 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!ValidateDrawBase(context, mode, count, count, primcount))
</del><ins>+    if (!ValidateDrawBase(context, mode, count, primcount))
</ins><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (!ValidateDrawAttribs(context, primcount, count))
+    {
+        return false;
+    }
+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1538,11 +1863,10 @@
</span><span class="cx">     gl::Program *program = state.getProgram();
</span><span class="cx"> 
</span><span class="cx">     const VertexArray *vao = state.getVertexArray();
</span><del>-    for (int attributeIndex = 0; attributeIndex &lt; MAX_VERTEX_ATTRIBS; attributeIndex++)
</del><ins>+    for (size_t attributeIndex = 0; attributeIndex &lt; MAX_VERTEX_ATTRIBS; attributeIndex++)
</ins><span class="cx">     {
</span><span class="cx">         const VertexAttribute &amp;attrib = vao-&gt;getVertexAttribute(attributeIndex);
</span><del>-        bool active = (program-&gt;getSemanticIndex(attributeIndex) != -1);
-        if (active &amp;&amp; attrib.divisor == 0)
</del><ins>+        if (program-&gt;isAttribLocationActive(attributeIndex) &amp;&amp; attrib.divisor == 0)
</ins><span class="cx">         {
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="lines">@@ -1563,8 +1887,13 @@
</span><span class="cx">     return ValidateDrawArraysInstanced(context, mode, first, count, primcount);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateDrawElements(Context *context, GLenum mode, GLsizei count, GLenum type,
-                          const GLvoid* indices, GLsizei primcount, rx::RangeUI *indexRangeOut)
</del><ins>+bool ValidateDrawElements(ValidationContext *context,
+                          GLenum mode,
+                          GLsizei count,
+                          GLenum type,
+                          const GLvoid *indices,
+                          GLsizei primcount,
+                          IndexRange *indexRangeOut)
</ins><span class="cx"> {
</span><span class="cx">     switch (type)
</span><span class="cx">     {
</span><span class="lines">@@ -1572,7 +1901,7 @@
</span><span class="cx">       case GL_UNSIGNED_SHORT:
</span><span class="cx">         break;
</span><span class="cx">       case GL_UNSIGNED_INT:
</span><del>-        if (!context-&gt;getExtensions().elementIndexUint)
</del><ins>+          if (context-&gt;getClientVersion() &lt; 3 &amp;&amp; !context-&gt;getExtensions().elementIndexUint)
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">             return false;
</span><span class="lines">@@ -1602,7 +1931,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     const gl::VertexArray *vao = state.getVertexArray();
</span><del>-    gl::Buffer *elementArrayBuffer = vao-&gt;getElementArrayBuffer();
</del><ins>+    gl::Buffer *elementArrayBuffer = vao-&gt;getElementArrayBuffer().get();
</ins><span class="cx">     if (!indices &amp;&amp; !elementArrayBuffer)
</span><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="lines">@@ -1638,45 +1967,56 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (!ValidateDrawBase(context, mode, count, primcount))
+    {
+        return false;
+    }
+
</ins><span class="cx">     // Use max index to validate if our vertex buffers are large enough for the pull.
</span><span class="cx">     // TODO: offer fast path, with disabled index validation.
</span><span class="cx">     // TODO: also disable index checking on back-ends that are robust to out-of-range accesses.
</span><span class="cx">     if (elementArrayBuffer)
</span><span class="cx">     {
</span><span class="cx">         uintptr_t offset = reinterpret_cast&lt;uintptr_t&gt;(indices);
</span><del>-        if (!elementArrayBuffer-&gt;getIndexRangeCache()-&gt;findRange(type, static_cast&lt;unsigned int&gt;(offset), count, indexRangeOut))
</del><ins>+        Error error =
+            elementArrayBuffer-&gt;getIndexRange(type, static_cast&lt;size_t&gt;(offset), count,
+                                              state.isPrimitiveRestartEnabled(), indexRangeOut);
+        if (error.isError())
</ins><span class="cx">         {
</span><del>-            rx::BufferImpl *bufferImpl = elementArrayBuffer-&gt;getImplementation();
-            const uint8_t *dataPointer = NULL;
-            Error error = bufferImpl-&gt;getData(&amp;dataPointer);
-            if (error.isError())
-            {
-                context-&gt;recordError(error);
-                return false;
-            }
-
-            const uint8_t *offsetPointer = dataPointer + offset;
-            *indexRangeOut = rx::IndexRangeCache::ComputeRange(type, offsetPointer, count);
-            elementArrayBuffer-&gt;getIndexRangeCache()-&gt;addRange(type, static_cast&lt;unsigned int&gt;(offset), count, *indexRangeOut);
</del><ins>+            context-&gt;recordError(error);
+            return false;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        *indexRangeOut = rx::IndexRangeCache::ComputeRange(type, indices, count);
</del><ins>+        *indexRangeOut = ComputeIndexRange(type, indices, count, state.isPrimitiveRestartEnabled());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!ValidateDrawBase(context, mode, count, static_cast&lt;GLsizei&gt;(indexRangeOut-&gt;end), primcount))
</del><ins>+    // If we use an index greater than our maximum supported index range, return an error.
+    // The ES3 spec does not specify behaviour here, it is undefined, but ANGLE should always
+    // return an error if possible here.
+    if (static_cast&lt;GLuint64&gt;(indexRangeOut-&gt;end) &gt;= context-&gt;getCaps().maxElementIndex)
</ins><span class="cx">     {
</span><ins>+        context-&gt;recordError(Error(GL_INVALID_OPERATION, g_ExceedsMaxElementErrorMessage));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return true;
</del><ins>+    if (!ValidateDrawAttribs(context, primcount, static_cast&lt;GLint&gt;(indexRangeOut-&gt;vertexCount())))
+    {
+        return false;
+    }
+
+    // No op if there are no real indices in the index data (all are primitive restart).
+    return (indexRangeOut-&gt;vertexIndexCount &gt; 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool ValidateDrawElementsInstanced(Context *context,
</span><del>-                                   GLenum mode, GLsizei count, GLenum type,
-                                   const GLvoid *indices, GLsizei primcount,
-                                   rx::RangeUI *indexRangeOut)
</del><ins>+                                   GLenum mode,
+                                   GLsizei count,
+                                   GLenum type,
+                                   const GLvoid *indices,
+                                   GLsizei primcount,
+                                   IndexRange *indexRangeOut)
</ins><span class="cx"> {
</span><span class="cx">     if (primcount &lt; 0)
</span><span class="cx">     {
</span><span class="lines">@@ -1693,8 +2033,13 @@
</span><span class="cx">     return (primcount &gt; 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateDrawElementsInstancedANGLE(Context *context, GLenum mode, GLsizei count, GLenum type,
-                                        const GLvoid *indices, GLsizei primcount, rx::RangeUI *indexRangeOut)
</del><ins>+bool ValidateDrawElementsInstancedANGLE(Context *context,
+                                        GLenum mode,
+                                        GLsizei count,
+                                        GLenum type,
+                                        const GLvoid *indices,
+                                        GLsizei primcount,
+                                        IndexRange *indexRangeOut)
</ins><span class="cx"> {
</span><span class="cx">     if (!ValidateDrawInstancedANGLE(context))
</span><span class="cx">     {
</span><span class="lines">@@ -1830,13 +2175,12 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!ValidProgram(context, program))
</del><ins>+    gl::Program *programObject = GetValidProgram(context, program);
+    if (!programObject)
</ins><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::Program *programObject = context-&gt;getProgram(program);
-
</del><span class="cx">     if (!programObject || !programObject-&gt;isLinked())
</span><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="lines">@@ -1873,8 +2217,8 @@
</span><span class="cx">     ASSERT(programObject);
</span><span class="cx"> 
</span><span class="cx">     // sized queries -- ensure the provided buffer is large enough
</span><del>-    LinkedUniform *uniform = programObject-&gt;getUniformByLocation(location);
-    size_t requiredBytes = VariableExternalSize(uniform-&gt;type);
</del><ins>+    const LinkedUniform &amp;uniform = programObject-&gt;getUniformByLocation(location);
+    size_t requiredBytes = VariableExternalSize(uniform.type);
</ins><span class="cx">     if (static_cast&lt;size_t&gt;(bufSize) &lt; requiredBytes)
</span><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="lines">@@ -1894,4 +2238,664 @@
</span><span class="cx">     return ValidateSizedGetUniform(context, program, location, bufSize);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool ValidateDiscardFramebufferBase(Context *context, GLenum target, GLsizei numAttachments,
+                                    const GLenum *attachments, bool defaultFramebuffer)
+{
+    if (numAttachments &lt; 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;numAttachments must not be less than zero&quot;));
+        return false;
+    }
+
+    for (GLsizei i = 0; i &lt; numAttachments; ++i)
+    {
+        if (attachments[i] &gt;= GL_COLOR_ATTACHMENT0 &amp;&amp; attachments[i] &lt;= GL_COLOR_ATTACHMENT31)
+        {
+            if (defaultFramebuffer)
+            {
+                context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid attachment when the default framebuffer is bound&quot;));
+                return false;
+            }
+
+            if (attachments[i] &gt;= GL_COLOR_ATTACHMENT0 + context-&gt;getCaps().maxColorAttachments)
+            {
+                context-&gt;recordError(Error(GL_INVALID_OPERATION,
+                                           &quot;Requested color attachment is greater than the maximum supported color attachments&quot;));
+                return false;
+            }
+        }
+        else
+        {
+            switch (attachments[i])
+            {
+              case GL_DEPTH_ATTACHMENT:
+              case GL_STENCIL_ATTACHMENT:
+              case GL_DEPTH_STENCIL_ATTACHMENT:
+                if (defaultFramebuffer)
+                {
+                    context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid attachment when the default framebuffer is bound&quot;));
+                    return false;
+                }
+                break;
+              case GL_COLOR:
+              case GL_DEPTH:
+              case GL_STENCIL:
+                if (!defaultFramebuffer)
+                {
+                    context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid attachment when the default framebuffer is not bound&quot;));
+                    return false;
+                }
+                break;
+              default:
+                context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid attachment&quot;));
+                return false;
+            }
+        }
+    }
+
+    return true;
</ins><span class="cx"> }
</span><ins>+
+bool ValidateInsertEventMarkerEXT(Context *context, GLsizei length, const char *marker)
+{
+    // Note that debug marker calls must not set error state
+
+    if (length &lt; 0)
+    {
+        return false;
+    }
+
+    if (marker == nullptr)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidatePushGroupMarkerEXT(Context *context, GLsizei length, const char *marker)
+{
+    // Note that debug marker calls must not set error state
+
+    if (length &lt; 0)
+    {
+        return false;
+    }
+
+    if (length &gt; 0 &amp;&amp; marker == nullptr)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateEGLImageTargetTexture2DOES(Context *context,
+                                        egl::Display *display,
+                                        GLenum target,
+                                        egl::Image *image)
+{
+    if (!context-&gt;getExtensions().eglImage &amp;&amp; !context-&gt;getExtensions().eglImageExternal)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    switch (target)
+    {
+        case GL_TEXTURE_2D:
+            break;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;invalid texture target.&quot;));
+            return false;
+    }
+
+    if (!display-&gt;isValidImage(image))
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;EGL image is not valid.&quot;));
+        return false;
+    }
+
+    if (image-&gt;getSamples() &gt; 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION,
+                                   &quot;cannot create a 2D texture from a multisampled EGL image.&quot;));
+        return false;
+    }
+
+    const TextureCaps &amp;textureCaps = context-&gt;getTextureCaps().get(image-&gt;getInternalFormat());
+    if (!textureCaps.texturable)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION,
+                                   &quot;EGL image internal format is not supported as a texture.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateEGLImageTargetRenderbufferStorageOES(Context *context,
+                                                  egl::Display *display,
+                                                  GLenum target,
+                                                  egl::Image *image)
+{
+    if (!context-&gt;getExtensions().eglImage)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    switch (target)
+    {
+        case GL_RENDERBUFFER:
+            break;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;invalid renderbuffer target.&quot;));
+            return false;
+    }
+
+    if (!display-&gt;isValidImage(image))
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;EGL image is not valid.&quot;));
+        return false;
+    }
+
+    const TextureCaps &amp;textureCaps = context-&gt;getTextureCaps().get(image-&gt;getInternalFormat());
+    if (!textureCaps.renderable)
+    {
+        context-&gt;recordError(Error(
+            GL_INVALID_OPERATION, &quot;EGL image internal format is not supported as a renderbuffer.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateBindVertexArrayBase(Context *context, GLuint array)
+{
+    if (!context-&gt;isVertexArrayGenerated(array))
+    {
+        // The default VAO should always exist
+        ASSERT(array != 0);
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateLinkProgram(Context *context, GLuint program)
+{
+    if (context-&gt;hasActiveTransformFeedback(program))
+    {
+        // ES 3.0.4 section 2.15 page 91
+        context-&gt;recordError(Error(GL_INVALID_OPERATION,
+                                   &quot;Cannot link program while program is associated with an active &quot;
+                                   &quot;transform feedback object.&quot;));
+        return false;
+    }
+    return true;
+}
+
+bool ValidateProgramBinaryBase(Context *context,
+                               GLuint program,
+                               GLenum binaryFormat,
+                               const void *binary,
+                               GLint length)
+{
+    Program *programObject = GetValidProgram(context, program);
+    if (programObject == nullptr)
+    {
+        return false;
+    }
+
+    const std::vector&lt;GLenum&gt; &amp;programBinaryFormats = context-&gt;getCaps().programBinaryFormats;
+    if (std::find(programBinaryFormats.begin(), programBinaryFormats.end(), binaryFormat) ==
+        programBinaryFormats.end())
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Program binary format is not valid.&quot;));
+        return false;
+    }
+
+    if (context-&gt;hasActiveTransformFeedback(program))
+    {
+        // ES 3.0.4 section 2.15 page 91
+        context-&gt;recordError(Error(GL_INVALID_OPERATION,
+                                   &quot;Cannot change program binary while program is associated with &quot;
+                                   &quot;an active transform feedback object.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateGetProgramBinaryBase(Context *context,
+                                  GLuint program,
+                                  GLsizei bufSize,
+                                  GLsizei *length,
+                                  GLenum *binaryFormat,
+                                  void *binary)
+{
+    Program *programObject = GetValidProgram(context, program);
+    if (programObject == nullptr)
+    {
+        return false;
+    }
+
+    if (!programObject-&gt;isLinked())
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Program is not linked.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateUseProgram(Context *context, GLuint program)
+{
+    if (program != 0)
+    {
+        Program *programObject = context-&gt;getProgram(program);
+        if (!programObject)
+        {
+            // ES 3.1.0 section 7.3 page 72
+            if (context-&gt;getShader(program))
+            {
+                context-&gt;recordError(
+                    Error(GL_INVALID_OPERATION,
+                          &quot;Attempted to use a single shader instead of a shader program.&quot;));
+                return false;
+            }
+            else
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;Program invalid.&quot;));
+                return false;
+            }
+        }
+        if (!programObject-&gt;isLinked())
+        {
+            context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Program not linked.&quot;));
+            return false;
+        }
+    }
+    if (context-&gt;getState().isTransformFeedbackActiveUnpaused())
+    {
+        // ES 3.0.4 section 2.15 page 91
+        context-&gt;recordError(
+            Error(GL_INVALID_OPERATION,
+                  &quot;Cannot change active program while transform feedback is unpaused.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateCopyTexImage2D(ValidationContext *context,
+                            GLenum target,
+                            GLint level,
+                            GLenum internalformat,
+                            GLint x,
+                            GLint y,
+                            GLsizei width,
+                            GLsizei height,
+                            GLint border)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        return ValidateES2CopyTexImageParameters(context, target, level, internalformat, false, 0,
+                                                 0, x, y, width, height, border);
+    }
+
+    ASSERT(context-&gt;getClientVersion() == 3);
+    return ValidateES3CopyTexImage2DParameters(context, target, level, internalformat, false, 0, 0,
+                                               0, x, y, width, height, border);
+}
+
+bool ValidateFramebufferRenderbuffer(Context *context,
+                                     GLenum target,
+                                     GLenum attachment,
+                                     GLenum renderbuffertarget,
+                                     GLuint renderbuffer)
+{
+    if (!ValidFramebufferTarget(target) ||
+        (renderbuffertarget != GL_RENDERBUFFER &amp;&amp; renderbuffer != 0))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM));
+        return false;
+    }
+
+    return ValidateFramebufferRenderbufferParameters(context, target, attachment,
+                                                     renderbuffertarget, renderbuffer);
+}
+
+bool ValidateDrawBuffersBase(ValidationContext *context, GLsizei n, const GLenum *bufs)
+{
+    // INVALID_VALUE is generated if n is negative or greater than value of MAX_DRAW_BUFFERS
+    if (n &lt; 0 || static_cast&lt;GLuint&gt;(n) &gt; context-&gt;getCaps().maxDrawBuffers)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_VALUE, &quot;n must be non-negative and no greater than MAX_DRAW_BUFFERS&quot;));
+        return false;
+    }
+
+    ASSERT(context-&gt;getState().getDrawFramebuffer());
+    GLuint frameBufferId      = context-&gt;getState().getDrawFramebuffer()-&gt;id();
+    GLuint maxColorAttachment = GL_COLOR_ATTACHMENT0_EXT + context-&gt;getCaps().maxColorAttachments;
+
+    // This should come first before the check for the default frame buffer
+    // because when we switch to ES3.1+, invalid enums will return INVALID_ENUM
+    // rather than INVALID_OPERATION
+    for (int colorAttachment = 0; colorAttachment &lt; n; colorAttachment++)
+    {
+        const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
+
+        if (bufs[colorAttachment] != GL_NONE &amp;&amp; bufs[colorAttachment] != GL_BACK &amp;&amp;
+            (bufs[colorAttachment] &lt; GL_COLOR_ATTACHMENT0 ||
+             bufs[colorAttachment] &gt; GL_COLOR_ATTACHMENT31))
+        {
+            // Value in bufs is not NONE, BACK, or GL_COLOR_ATTACHMENTi
+            // The 3.0.4 spec says to generate GL_INVALID_OPERATION here, but this
+            // was changed to GL_INVALID_ENUM in 3.1, which dEQP also expects.
+            // 3.1 is still a bit ambiguous about the error, but future specs are
+            // expected to clarify that GL_INVALID_ENUM is the correct error.
+            context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid buffer value&quot;));
+            return false;
+        }
+        else if (bufs[colorAttachment] &gt;= maxColorAttachment)
+        {
+            context-&gt;recordError(
+                Error(GL_INVALID_OPERATION, &quot;Buffer value is greater than MAX_DRAW_BUFFERS&quot;));
+            return false;
+        }
+        else if (bufs[colorAttachment] != GL_NONE &amp;&amp; bufs[colorAttachment] != attachment &amp;&amp;
+                 frameBufferId != 0)
+        {
+            // INVALID_OPERATION-GL is bound to buffer and ith argument
+            // is not COLOR_ATTACHMENTi or NONE
+            context-&gt;recordError(
+                Error(GL_INVALID_OPERATION, &quot;Ith value does not match COLOR_ATTACHMENTi or NONE&quot;));
+            return false;
+        }
+    }
+
+    // INVALID_OPERATION is generated if GL is bound to the default framebuffer
+    // and n is not 1 or bufs is bound to value other than BACK and NONE
+    if (frameBufferId == 0)
+    {
+        if (n != 1)
+        {
+            context-&gt;recordError(Error(GL_INVALID_OPERATION,
+                                       &quot;n must be 1 when GL is bound to the default framebuffer&quot;));
+            return false;
+        }
+
+        if (bufs[0] != GL_NONE &amp;&amp; bufs[0] != GL_BACK)
+        {
+            context-&gt;recordError(Error(
+                GL_INVALID_OPERATION,
+                &quot;Only NONE or BACK are valid values when drawing to the default framebuffer&quot;));
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool ValidateCopyTexSubImage2D(Context *context,
+                               GLenum target,
+                               GLint level,
+                               GLint xoffset,
+                               GLint yoffset,
+                               GLint x,
+                               GLint y,
+                               GLsizei width,
+                               GLsizei height)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        return ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset,
+                                                 yoffset, x, y, width, height, 0);
+    }
+
+    return ValidateES3CopyTexImage2DParameters(context, target, level, GL_NONE, true, xoffset,
+                                               yoffset, 0, x, y, width, height, 0);
+}
+
+bool ValidateGetBufferPointervBase(Context *context, GLenum target, GLenum pname, void **params)
+{
+    if (!ValidBufferTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Buffer target not valid: 0x%X&quot;, target));
+        return false;
+    }
+
+    if (pname != GL_BUFFER_MAP_POINTER)
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;pname not valid: 0x%X&quot;, pname));
+        return false;
+    }
+
+    Buffer *buffer = context-&gt;getState().getTargetBuffer(target);
+
+    // GLES 3.0 section 2.10.1: &quot;Attempts to attempts to modify or query buffer object state for a
+    // target bound to zero generate an INVALID_OPERATION error.&quot;
+    // GLES 3.1 section 6.6 explicitly specifies this error.
+    if (!buffer)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_OPERATION, &quot;Can not get pointer for reserved buffer name zero.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateUnmapBufferBase(Context *context, GLenum target)
+{
+    if (!ValidBufferTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid buffer target.&quot;));
+        return false;
+    }
+
+    Buffer *buffer = context-&gt;getState().getTargetBuffer(target);
+
+    if (buffer == nullptr || !buffer-&gt;isMapped())
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Buffer not mapped.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateMapBufferRangeBase(Context *context,
+                                GLenum target,
+                                GLintptr offset,
+                                GLsizeiptr length,
+                                GLbitfield access)
+{
+    if (!ValidBufferTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid buffer target.&quot;));
+        return false;
+    }
+
+    if (offset &lt; 0 || length &lt; 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;Invalid offset or length.&quot;));
+        return false;
+    }
+
+    Buffer *buffer = context-&gt;getState().getTargetBuffer(target);
+
+    if (!buffer)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Attempted to map buffer object zero.&quot;));
+        return false;
+    }
+
+    // Check for buffer overflow
+    size_t offsetSize = static_cast&lt;size_t&gt;(offset);
+    size_t lengthSize = static_cast&lt;size_t&gt;(length);
+
+    if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
+        offsetSize + lengthSize &gt; static_cast&lt;size_t&gt;(buffer-&gt;getSize()))
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_VALUE, &quot;Mapped range does not fit into buffer dimensions.&quot;));
+        return false;
+    }
+
+    // Check for invalid bits in the mask
+    GLbitfield allAccessBits = GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT |
+                               GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_FLUSH_EXPLICIT_BIT |
+                               GL_MAP_UNSYNCHRONIZED_BIT;
+
+    if (access &amp; ~(allAccessBits))
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;Invalid access bits: 0x%X.&quot;, access));
+        return false;
+    }
+
+    if (length == 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Buffer mapping length is zero.&quot;));
+        return false;
+    }
+
+    if (buffer-&gt;isMapped())
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Buffer is already mapped.&quot;));
+        return false;
+    }
+
+    // Check for invalid bit combinations
+    if ((access &amp; (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_OPERATION, &quot;Need to map buffer for either reading or writing.&quot;));
+        return false;
+    }
+
+    GLbitfield writeOnlyBits =
+        GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT;
+
+    if ((access &amp; GL_MAP_READ_BIT) != 0 &amp;&amp; (access &amp; writeOnlyBits) != 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION,
+                                   &quot;Invalid access bits when mapping buffer for reading: 0x%X.&quot;,
+                                   access));
+        return false;
+    }
+
+    if ((access &amp; GL_MAP_WRITE_BIT) == 0 &amp;&amp; (access &amp; GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
+    {
+        context-&gt;recordError(Error(
+            GL_INVALID_OPERATION,
+            &quot;The explicit flushing bit may only be set if the buffer is mapped for writing.&quot;));
+        return false;
+    }
+    return true;
+}
+
+bool ValidateFlushMappedBufferRangeBase(Context *context,
+                                        GLenum target,
+                                        GLintptr offset,
+                                        GLsizeiptr length)
+{
+    if (offset &lt; 0 || length &lt; 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;Invalid offset/length parameters.&quot;));
+        return false;
+    }
+
+    if (!ValidBufferTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid buffer target.&quot;));
+        return false;
+    }
+
+    Buffer *buffer = context-&gt;getState().getTargetBuffer(target);
+
+    if (buffer == nullptr)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Attempted to flush buffer object zero.&quot;));
+        return false;
+    }
+
+    if (!buffer-&gt;isMapped() || (buffer-&gt;getAccessFlags() &amp; GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
+    {
+        context-&gt;recordError(Error(
+            GL_INVALID_OPERATION, &quot;Attempted to flush a buffer not mapped for explicit flushing.&quot;));
+        return false;
+    }
+
+    // Check for buffer overflow
+    size_t offsetSize = static_cast&lt;size_t&gt;(offset);
+    size_t lengthSize = static_cast&lt;size_t&gt;(length);
+
+    if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
+        offsetSize + lengthSize &gt; static_cast&lt;size_t&gt;(buffer-&gt;getMapLength()))
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_VALUE, &quot;Flushed range does not fit into buffer mapping dimensions.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateGenBuffers(Context *context, GLint n, GLuint *)
+{
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateDeleteBuffers(Context *context, GLint n, const GLuint *)
+{
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateGenFramebuffers(Context *context, GLint n, GLuint *)
+{
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateDeleteFramebuffers(Context *context, GLint n, const GLuint *)
+{
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateGenRenderbuffers(Context *context, GLint n, GLuint *)
+{
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateDeleteRenderbuffers(Context *context, GLint n, const GLuint *)
+{
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateGenTextures(Context *context, GLint n, GLuint *)
+{
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateDeleteTextures(Context *context, GLint n, const GLuint *)
+{
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateGenOrDelete(Context *context, GLint n)
+{
+    if (n &lt; 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;n &lt; 0&quot;));
+        return false;
+    }
+    return true;
+}
+
+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEvalidationESh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -14,23 +14,52 @@
</span><span class="cx"> #include &lt;GLES2/gl2.h&gt;
</span><span class="cx"> #include &lt;GLES3/gl3.h&gt;
</span><span class="cx"> 
</span><ins>+namespace egl
+{
+class Display;
+class Image;
+}
+
</ins><span class="cx"> namespace gl
</span><span class="cx"> {
</span><del>-
</del><span class="cx"> class Context;
</span><ins>+class Program;
+class Shader;
+class ValidationContext;
</ins><span class="cx"> 
</span><span class="cx"> bool ValidCap(const Context *context, GLenum cap);
</span><del>-bool ValidTextureTarget(const Context *context, GLenum target);
-bool ValidTexture2DDestinationTarget(const Context *context, GLenum target);
</del><ins>+bool ValidTextureTarget(const ValidationContext *context, GLenum target);
+bool ValidTexture2DTarget(const ValidationContext *context, GLenum target);
+bool ValidTexture3DTarget(const ValidationContext *context, GLenum target);
+bool ValidTexture2DDestinationTarget(const ValidationContext *context, GLenum target);
+bool ValidTexture3DDestinationTarget(const ValidationContext *context, GLenum target);
</ins><span class="cx"> bool ValidFramebufferTarget(GLenum target);
</span><span class="cx"> bool ValidBufferTarget(const Context *context, GLenum target);
</span><span class="cx"> bool ValidBufferParameter(const Context *context, GLenum pname);
</span><del>-bool ValidMipLevel(const Context *context, GLenum target, GLint level);
-bool ValidImageSize(const Context *context, GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth);
-bool ValidCompressedImageSize(const Context *context, GLenum internalFormat, GLsizei width, GLsizei height);
</del><ins>+bool ValidMipLevel(const ValidationContext *context, GLenum target, GLint level);
+bool ValidImageSizeParameters(const Context *context,
+                              GLenum target,
+                              GLint level,
+                              GLsizei width,
+                              GLsizei height,
+                              GLsizei depth,
+                              bool isSubImage);
+bool ValidCompressedImageSize(const ValidationContext *context,
+                              GLenum internalFormat,
+                              GLsizei width,
+                              GLsizei height);
</ins><span class="cx"> bool ValidQueryType(const Context *context, GLenum queryType);
</span><del>-bool ValidProgram(Context *context, GLuint id);
</del><span class="cx"> 
</span><ins>+// Returns valid program if id is a valid program name
+// Errors INVALID_OPERATION if valid shader is given and returns NULL
+// Errors INVALID_VALUE otherwise and returns NULL
+Program *GetValidProgram(Context *context, GLuint id);
+
+// Returns valid shader if id is a valid shader name
+// Errors INVALID_OPERATION if valid program is given and returns NULL
+// Errors INVALID_VALUE otherwise and returns NULL
+Shader *GetValidShader(Context *context, GLuint id);
+
</ins><span class="cx"> bool ValidateAttachmentTarget(Context *context, GLenum attachment);
</span><span class="cx"> bool ValidateRenderbufferStorageParametersBase(Context *context, GLenum target, GLsizei samples,
</span><span class="cx">                                                GLenum internalformat, GLsizei width, GLsizei height);
</span><span class="lines">@@ -40,9 +69,17 @@
</span><span class="cx"> bool ValidateFramebufferRenderbufferParameters(Context *context, GLenum target, GLenum attachment,
</span><span class="cx">                                                GLenum renderbuffertarget, GLuint renderbuffer);
</span><span class="cx"> 
</span><del>-bool ValidateBlitFramebufferParameters(Context *context, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
-                                       GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask,
-                                       GLenum filter, bool fromAngleExtension);
</del><ins>+bool ValidateBlitFramebufferParameters(Context *context,
+                                       GLint srcX0,
+                                       GLint srcY0,
+                                       GLint srcX1,
+                                       GLint srcY1,
+                                       GLint dstX0,
+                                       GLint dstY0,
+                                       GLint dstX1,
+                                       GLint dstY1,
+                                       GLbitfield mask,
+                                       GLenum filter);
</ins><span class="cx"> 
</span><span class="cx"> bool ValidateGetVertexAttribParameters(Context *context, GLenum pname);
</span><span class="cx"> 
</span><span class="lines">@@ -50,11 +87,38 @@
</span><span class="cx"> 
</span><span class="cx"> bool ValidateSamplerObjectParameter(Context *context, GLenum pname);
</span><span class="cx"> 
</span><del>-bool ValidateReadPixelsParameters(Context *context, GLint x, GLint y, GLsizei width, GLsizei height,
-                                               GLenum format, GLenum type, GLsizei *bufSize, GLvoid *pixels);
</del><ins>+bool ValidateReadPixels(Context *context,
+                        GLint x,
+                        GLint y,
+                        GLsizei width,
+                        GLsizei height,
+                        GLenum format,
+                        GLenum type,
+                        GLvoid *pixels);
+bool ValidateReadnPixelsEXT(Context *context,
+                            GLint x,
+                            GLint y,
+                            GLsizei width,
+                            GLsizei height,
+                            GLenum format,
+                            GLenum type,
+                            GLsizei bufSize,
+                            GLvoid *pixels);
</ins><span class="cx"> 
</span><del>-bool ValidateBeginQuery(Context *context, GLenum target, GLuint id);
-bool ValidateEndQuery(Context *context, GLenum target);
</del><ins>+bool ValidateGenQueriesEXT(gl::Context *context, GLsizei n);
+bool ValidateDeleteQueriesEXT(gl::Context *context, GLsizei n);
+bool ValidateBeginQueryBase(Context *context, GLenum target, GLuint id);
+bool ValidateBeginQueryEXT(Context *context, GLenum target, GLuint id);
+bool ValidateEndQueryBase(Context *context, GLenum target);
+bool ValidateEndQueryEXT(Context *context, GLenum target);
+bool ValidateQueryCounterEXT(Context *context, GLuint id, GLenum target);
+bool ValidateGetQueryivBase(Context *context, GLenum target, GLenum pname);
+bool ValidateGetQueryivEXT(Context *context, GLenum target, GLenum pname, GLint *params);
+bool ValidateGetQueryObjectValueBase(Context *context, GLenum target, GLenum pname);
+bool ValidateGetQueryObjectivEXT(Context *context, GLuint id, GLenum pname, GLint *params);
+bool ValidateGetQueryObjectuivEXT(Context *context, GLuint id, GLenum pname, GLuint *params);
+bool ValidateGetQueryObjecti64vEXT(Context *context, GLuint id, GLenum pname, GLint64 *params);
+bool ValidateGetQueryObjectui64vEXT(Context *context, GLuint id, GLenum pname, GLuint64 *params);
</ins><span class="cx"> 
</span><span class="cx"> bool ValidateUniform(Context *context, GLenum uniformType, GLint location, GLsizei count);
</span><span class="cx"> bool ValidateUniformMatrix(Context *context, GLenum matrixType, GLint location, GLsizei count,
</span><span class="lines">@@ -62,26 +126,57 @@
</span><span class="cx"> 
</span><span class="cx"> bool ValidateStateQuery(Context *context, GLenum pname, GLenum *nativeType, unsigned int *numParams);
</span><span class="cx"> 
</span><del>-bool ValidateCopyTexImageParametersBase(Context* context, GLenum target, GLint level, GLenum internalformat, bool isSubImage,
-                                                     GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height,
-                                                     GLint border, GLenum *textureInternalFormatOut);
</del><ins>+bool ValidateCopyTexImageParametersBase(ValidationContext *context,
+                                        GLenum target,
+                                        GLint level,
+                                        GLenum internalformat,
+                                        bool isSubImage,
+                                        GLint xoffset,
+                                        GLint yoffset,
+                                        GLint zoffset,
+                                        GLint x,
+                                        GLint y,
+                                        GLsizei width,
+                                        GLsizei height,
+                                        GLint border,
+                                        GLenum *textureInternalFormatOut);
</ins><span class="cx"> 
</span><span class="cx"> bool ValidateDrawArrays(Context *context, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
</span><span class="cx"> bool ValidateDrawArraysInstanced(Context *context, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
</span><span class="cx"> bool ValidateDrawArraysInstancedANGLE(Context *context, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
</span><span class="cx"> 
</span><del>-bool ValidateDrawElements(Context *context, GLenum mode, GLsizei count, GLenum type,
-                          const GLvoid* indices, GLsizei primcount, rx::RangeUI *indexRangeOut);
</del><ins>+bool ValidateDrawElements(ValidationContext *context,
+                          GLenum mode,
+                          GLsizei count,
+                          GLenum type,
+                          const GLvoid *indices,
+                          GLsizei primcount,
+                          IndexRange *indexRangeOut);
</ins><span class="cx"> 
</span><del>-bool ValidateDrawElementsInstanced(Context *context, GLenum mode, GLsizei count, GLenum type,
-                                   const GLvoid *indices, GLsizei primcount, rx::RangeUI *indexRangeOut);
-bool ValidateDrawElementsInstancedANGLE(Context *context, GLenum mode, GLsizei count, GLenum type,
-                                        const GLvoid *indices, GLsizei primcount, rx::RangeUI *indexRangeOut);
</del><ins>+bool ValidateDrawElementsInstanced(Context *context,
+                                   GLenum mode,
+                                   GLsizei count,
+                                   GLenum type,
+                                   const GLvoid *indices,
+                                   GLsizei primcount,
+                                   IndexRange *indexRangeOut);
+bool ValidateDrawElementsInstancedANGLE(Context *context,
+                                        GLenum mode,
+                                        GLsizei count,
+                                        GLenum type,
+                                        const GLvoid *indices,
+                                        GLsizei primcount,
+                                        IndexRange *indexRangeOut);
</ins><span class="cx"> 
</span><span class="cx"> bool ValidateFramebufferTextureBase(Context *context, GLenum target, GLenum attachment,
</span><span class="cx">                                     GLuint texture, GLint level);
</span><span class="cx"> bool ValidateFramebufferTexture2D(Context *context, GLenum target, GLenum attachment,
</span><span class="cx">                                    GLenum textarget, GLuint texture, GLint level);
</span><ins>+bool ValidateFramebufferRenderbuffer(Context *context,
+                                     GLenum target,
+                                     GLenum attachment,
+                                     GLenum renderbuffertarget,
+                                     GLuint renderbuffer);
</ins><span class="cx"> 
</span><span class="cx"> bool ValidateGetUniformBase(Context *context, GLuint program, GLint location);
</span><span class="cx"> bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfloat* params);
</span><span class="lines">@@ -89,6 +184,82 @@
</span><span class="cx"> bool ValidateGetnUniformfvEXT(Context *context, GLuint program, GLint location, GLsizei bufSize, GLfloat* params);
</span><span class="cx"> bool ValidateGetnUniformivEXT(Context *context, GLuint program, GLint location, GLsizei bufSize, GLint* params);
</span><span class="cx"> 
</span><del>-}
</del><ins>+bool ValidateDiscardFramebufferBase(Context *context, GLenum target, GLsizei numAttachments,
+                                    const GLenum *attachments, bool defaultFramebuffer);
</ins><span class="cx"> 
</span><ins>+bool ValidateInsertEventMarkerEXT(Context *context, GLsizei length, const char *marker);
+bool ValidatePushGroupMarkerEXT(Context *context, GLsizei length, const char *marker);
+
+bool ValidateEGLImageTargetTexture2DOES(Context *context,
+                                        egl::Display *display,
+                                        GLenum target,
+                                        egl::Image *image);
+bool ValidateEGLImageTargetRenderbufferStorageOES(Context *context,
+                                                  egl::Display *display,
+                                                  GLenum target,
+                                                  egl::Image *image);
+
+bool ValidateBindVertexArrayBase(Context *context, GLuint array);
+
+bool ValidateLinkProgram(Context *context, GLuint program);
+bool ValidateProgramBinaryBase(Context *context,
+                               GLuint program,
+                               GLenum binaryFormat,
+                               const void *binary,
+                               GLint length);
+bool ValidateGetProgramBinaryBase(Context *context,
+                                  GLuint program,
+                                  GLsizei bufSize,
+                                  GLsizei *length,
+                                  GLenum *binaryFormat,
+                                  void *binary);
+bool ValidateUseProgram(Context *context, GLuint program);
+
+bool ValidateCopyTexImage2D(ValidationContext *context,
+                            GLenum target,
+                            GLint level,
+                            GLenum internalformat,
+                            GLint x,
+                            GLint y,
+                            GLsizei width,
+                            GLsizei height,
+                            GLint border);
+bool ValidateDrawBuffersBase(ValidationContext *context, GLsizei n, const GLenum *bufs);
+bool ValidateCopyTexSubImage2D(Context *context,
+                               GLenum target,
+                               GLint level,
+                               GLint xoffset,
+                               GLint yoffset,
+                               GLint x,
+                               GLint y,
+                               GLsizei width,
+                               GLsizei height);
+
+bool ValidateGetBufferPointervBase(Context *context, GLenum target, GLenum pname, void **params);
+bool ValidateUnmapBufferBase(Context *context, GLenum target);
+bool ValidateMapBufferRangeBase(Context *context,
+                                GLenum target,
+                                GLintptr offset,
+                                GLsizeiptr length,
+                                GLbitfield access);
+bool ValidateFlushMappedBufferRangeBase(Context *context,
+                                        GLenum target,
+                                        GLintptr offset,
+                                        GLsizeiptr length);
+
+bool ValidateGenBuffers(Context *context, GLint n, GLuint *buffers);
+bool ValidateDeleteBuffers(Context *context, GLint n, const GLuint *buffers);
+bool ValidateGenFramebuffers(Context *context, GLint n, GLuint *framebuffers);
+bool ValidateDeleteFramebuffers(Context *context, GLint n, const GLuint *framebuffers);
+bool ValidateGenRenderbuffers(Context *context, GLint n, GLuint *renderbuffers);
+bool ValidateDeleteRenderbuffers(Context *context, GLint n, const GLuint *renderbuffers);
+bool ValidateGenTextures(Context *context, GLint n, GLuint *textures);
+bool ValidateDeleteTextures(Context *context, GLint n, const GLuint *textures);
+
+bool ValidateGenOrDelete(Context *context, GLint n);
+
+// Error messages shared here for use in testing.
+extern const char *g_ExceedsMaxElementErrorMessage;
+}  // namespace gl
+
</ins><span class="cx"> #endif // LIBANGLE_VALIDATION_ES_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEvalidationES2cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,6 +8,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/validationES2.h&quot;
</span><span class="cx"> #include &quot;libANGLE/validationES.h&quot;
</span><ins>+#include &quot;libANGLE/validationES3.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Context.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Texture.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Framebuffer.h&quot;
</span><span class="lines">@@ -21,6 +22,42 @@
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+namespace
+{
+
+bool IsPartialBlit(gl::Context *context,
+                   const FramebufferAttachment *readBuffer,
+                   const FramebufferAttachment *writeBuffer,
+                   GLint srcX0,
+                   GLint srcY0,
+                   GLint srcX1,
+                   GLint srcY1,
+                   GLint dstX0,
+                   GLint dstY0,
+                   GLint dstX1,
+                   GLint dstY1)
+{
+    const Extents &amp;writeSize = writeBuffer-&gt;getSize();
+    const Extents &amp;readSize  = readBuffer-&gt;getSize();
+
+    if (srcX0 != 0 || srcY0 != 0 || dstX0 != 0 || dstY0 != 0 || dstX1 != writeSize.width ||
+        dstY1 != writeSize.height || srcX1 != readSize.width || srcY1 != readSize.height)
+    {
+        return true;
+    }
+
+    if (context-&gt;getState().isScissorTestEnabled())
+    {
+        const Rectangle &amp;scissor = context-&gt;getState().getScissor();
+        return scissor.x &gt; 0 || scissor.y &gt; 0 || scissor.width &lt; writeSize.width ||
+               scissor.height &lt; writeSize.height;
+    }
+
+    return false;
+}
+
+}  // anonymous namespace
+
</ins><span class="cx"> bool ValidateES2TexImageParameters(Context *context, GLenum target, GLint level, GLenum internalformat, bool isCompressed, bool isSubImage,
</span><span class="cx">                                    GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
</span><span class="cx">                                    GLint border, GLenum format, GLenum type, const GLvoid *pixels)
</span><span class="lines">@@ -31,7 +68,7 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!ValidImageSize(context, target, level, width, height, 1))
</del><ins>+    if (!ValidImageSizeParameters(context, target, level, width, height, 1, isSubImage))
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_VALUE));
</span><span class="cx">         return false;
</span><span class="lines">@@ -110,7 +147,7 @@
</span><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><del>-        if (texture-&gt;isImmutable())
</del><ins>+        if (texture-&gt;getImmutableFormat())
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">             return false;
</span><span class="lines">@@ -124,23 +161,10 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    GLenum actualInternalFormat = isSubImage ? texture-&gt;getInternalFormat(target, level) : internalformat;
-    const InternalFormat &amp;actualFormatInfo = GetInternalFormatInfo(actualInternalFormat);
-
-    if (isCompressed != actualFormatInfo.compressed)
-    {
-        context-&gt;recordError(Error(GL_INVALID_OPERATION));
-        return false;
-    }
-
</del><span class="cx">     if (isCompressed)
</span><span class="cx">     {
</span><del>-        if (!ValidCompressedImageSize(context, actualInternalFormat, width, height))
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return false;
-        }
-
</del><ins>+        GLenum actualInternalFormat =
+            isSubImage ? texture-&gt;getInternalFormat(target, level) : internalformat;
</ins><span class="cx">         switch (actualInternalFormat)
</span><span class="cx">         {
</span><span class="cx">           case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
</span><span class="lines">@@ -165,8 +189,29 @@
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx">             break;
</span><ins>+          case GL_ETC1_RGB8_OES:
+            if (!context-&gt;getExtensions().compressedETC1RGB8Texture)
+            {
+                context-&gt;recordError(Error(GL_INVALID_ENUM));
+                return false;
+            }
+            break;
+          case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
+              if (!context-&gt;getExtensions().lossyETCDecode)
+              {
+                  context-&gt;recordError(
+                      Error(GL_INVALID_ENUM, &quot;ANGLE_lossy_etc_decode extension is not supported&quot;));
+                  return false;
+              }
+              break;
</ins><span class="cx">           default:
</span><del>-            context-&gt;recordError(Error(GL_INVALID_ENUM));
</del><ins>+              context-&gt;recordError(Error(
+                  GL_INVALID_ENUM, &quot;internalformat is not a supported compressed internal format&quot;));
+              return false;
+        }
+        if (!ValidCompressedImageSize(context, actualInternalFormat, width, height))
+        {
+            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</ins><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -350,6 +395,33 @@
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx">             break;
</span><ins>+          case GL_ETC1_RGB8_OES:
+            if (context-&gt;getExtensions().compressedETC1RGB8Texture)
+            {
+                context-&gt;recordError(Error(GL_INVALID_OPERATION));
+                return false;
+            }
+            else
+            {
+                context-&gt;recordError(Error(GL_INVALID_ENUM));
+                return false;
+            }
+            break;
+          case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
+              if (context-&gt;getExtensions().lossyETCDecode)
+              {
+                  context-&gt;recordError(
+                      Error(GL_INVALID_OPERATION,
+                            &quot;ETC1_RGB8_LOSSY_DECODE_ANGLE can't work with this type.&quot;));
+                  return false;
+              }
+              else
+              {
+                  context-&gt;recordError(
+                      Error(GL_INVALID_ENUM, &quot;ANGLE_lossy_etc_decode extension is not supported.&quot;));
+                  return false;
+              }
+              break;
</ins><span class="cx">           case GL_DEPTH_COMPONENT:
</span><span class="cx">           case GL_DEPTH_STENCIL_OES:
</span><span class="cx">             if (!context-&gt;getExtensions().depthTextures)
</span><span class="lines">@@ -395,21 +467,34 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
-
-bool ValidateES2CopyTexImageParameters(Context* context, GLenum target, GLint level, GLenum internalformat, bool isSubImage,
-                                       GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height,
</del><ins>+bool ValidateES2CopyTexImageParameters(ValidationContext *context,
+                                       GLenum target,
+                                       GLint level,
+                                       GLenum internalformat,
+                                       bool isSubImage,
+                                       GLint xoffset,
+                                       GLint yoffset,
+                                       GLint x,
+                                       GLint y,
+                                       GLsizei width,
+                                       GLsizei height,
</ins><span class="cx">                                        GLint border)
</span><span class="cx"> {
</span><span class="cx">     GLenum textureInternalFormat = GL_NONE;
</span><span class="cx"> 
</span><ins>+    if (!ValidTexture2DDestinationTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid texture target&quot;));
+        return false;
+    }
+
</ins><span class="cx">     if (!ValidateCopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
</span><span class="cx">                                             xoffset, yoffset, 0, x, y, width, height, border, &amp;textureInternalFormat))
</span><span class="cx">     {
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::Framebuffer *framebuffer = context-&gt;getState().getReadFramebuffer();
</del><ins>+    const gl::Framebuffer *framebuffer = context-&gt;getState().getReadFramebuffer();
</ins><span class="cx">     GLenum colorbufferFormat = framebuffer-&gt;getReadColorbuffer()-&gt;getInternalFormat();
</span><span class="cx">     const auto &amp;internalFormatInfo = gl::GetInternalFormatInfo(textureInternalFormat);
</span><span class="cx">     GLenum textureFormat = internalFormatInfo.format;
</span><span class="lines">@@ -502,6 +587,8 @@
</span><span class="cx">           case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
</span><span class="cx">           case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
</span><span class="cx">           case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
</span><ins>+          case GL_ETC1_RGB8_OES:
+          case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
</ins><span class="cx">             context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">             return false;
</span><span class="cx">           case GL_DEPTH_COMPONENT:
</span><span class="lines">@@ -642,6 +729,32 @@
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx">             break;
</span><ins>+          case GL_ETC1_RGB8_OES:
+            if (context-&gt;getExtensions().compressedETC1RGB8Texture)
+            {
+                context-&gt;recordError(Error(GL_INVALID_OPERATION));
+                return false;
+            }
+            else
+            {
+                context-&gt;recordError(Error(GL_INVALID_ENUM));
+                return false;
+            }
+            break;
+          case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
+              if (context-&gt;getExtensions().lossyETCDecode)
+              {
+                  context-&gt;recordError(Error(GL_INVALID_OPERATION,
+                                             &quot;ETC1_RGB8_LOSSY_DECODE_ANGLE can't be copied to.&quot;));
+                  return false;
+              }
+              else
+              {
+                  context-&gt;recordError(
+                      Error(GL_INVALID_ENUM, &quot;ANGLE_lossy_etc_decode extension is not supported.&quot;));
+                  return false;
+              }
+              break;
</ins><span class="cx">           case GL_DEPTH_COMPONENT:
</span><span class="cx">           case GL_DEPTH_COMPONENT16:
</span><span class="cx">           case GL_DEPTH_COMPONENT32_OES:
</span><span class="lines">@@ -759,6 +872,21 @@
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx">         break;
</span><ins>+      case GL_ETC1_RGB8_OES:
+        if (!context-&gt;getExtensions().compressedETC1RGB8Texture)
+        {
+            context-&gt;recordError(Error(GL_INVALID_ENUM));
+            return false;
+        }
+        break;
+      case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
+          if (!context-&gt;getExtensions().lossyETCDecode)
+          {
+              context-&gt;recordError(
+                  Error(GL_INVALID_ENUM, &quot;ANGLE_lossy_etc_decode extension is not supported.&quot;));
+              return false;
+          }
+          break;
</ins><span class="cx">       case GL_RGBA32F_EXT:
</span><span class="cx">       case GL_RGB32F_EXT:
</span><span class="cx">       case GL_ALPHA32F_EXT:
</span><span class="lines">@@ -824,7 +952,7 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (texture-&gt;isImmutable())
</del><ins>+    if (texture-&gt;getImmutableFormat())
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">         return false;
</span><span class="lines">@@ -879,4 +1007,1008 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool ValidateDiscardFramebufferEXT(Context *context, GLenum target, GLsizei numAttachments,
+                                   const GLenum *attachments)
+{
+    if (!context-&gt;getExtensions().discardFramebuffer)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    bool defaultFramebuffer = false;
+
+    switch (target)
+    {
+      case GL_FRAMEBUFFER:
+        defaultFramebuffer = (context-&gt;getState().getTargetFramebuffer(GL_FRAMEBUFFER)-&gt;id() == 0);
+        break;
+      default:
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid framebuffer target&quot;));
+        return false;
+    }
+
+    return ValidateDiscardFramebufferBase(context, target, numAttachments, attachments, defaultFramebuffer);
</ins><span class="cx"> }
</span><ins>+
+bool ValidateBindVertexArrayOES(Context *context, GLuint array)
+{
+    if (!context-&gt;getExtensions().vertexArrayObject)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    return ValidateBindVertexArrayBase(context, array);
+}
+
+bool ValidateDeleteVertexArraysOES(Context *context, GLsizei n)
+{
+    if (!context-&gt;getExtensions().vertexArrayObject)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateGenVertexArraysOES(Context *context, GLsizei n)
+{
+    if (!context-&gt;getExtensions().vertexArrayObject)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateIsVertexArrayOES(Context *context)
+{
+    if (!context-&gt;getExtensions().vertexArrayObject)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateProgramBinaryOES(Context *context,
+                              GLuint program,
+                              GLenum binaryFormat,
+                              const void *binary,
+                              GLint length)
+{
+    if (!context-&gt;getExtensions().getProgramBinary)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    return ValidateProgramBinaryBase(context, program, binaryFormat, binary, length);
+}
+
+bool ValidateGetProgramBinaryOES(Context *context,
+                                 GLuint program,
+                                 GLsizei bufSize,
+                                 GLsizei *length,
+                                 GLenum *binaryFormat,
+                                 void *binary)
+{
+    if (!context-&gt;getExtensions().getProgramBinary)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    return ValidateGetProgramBinaryBase(context, program, bufSize, length, binaryFormat, binary);
+}
+
+static bool ValidDebugSource(GLenum source, bool mustBeThirdPartyOrApplication)
+{
+    switch (source)
+    {
+        case GL_DEBUG_SOURCE_API:
+        case GL_DEBUG_SOURCE_SHADER_COMPILER:
+        case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
+        case GL_DEBUG_SOURCE_OTHER:
+            // Only THIRD_PARTY and APPLICATION sources are allowed to be manually inserted
+            return !mustBeThirdPartyOrApplication;
+
+        case GL_DEBUG_SOURCE_THIRD_PARTY:
+        case GL_DEBUG_SOURCE_APPLICATION:
+            return true;
+
+        default:
+            return false;
+    }
+}
+
+static bool ValidDebugType(GLenum type)
+{
+    switch (type)
+    {
+        case GL_DEBUG_TYPE_ERROR:
+        case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
+        case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
+        case GL_DEBUG_TYPE_PERFORMANCE:
+        case GL_DEBUG_TYPE_PORTABILITY:
+        case GL_DEBUG_TYPE_OTHER:
+        case GL_DEBUG_TYPE_MARKER:
+        case GL_DEBUG_TYPE_PUSH_GROUP:
+        case GL_DEBUG_TYPE_POP_GROUP:
+            return true;
+
+        default:
+            return false;
+    }
+}
+
+static bool ValidDebugSeverity(GLenum severity)
+{
+    switch (severity)
+    {
+        case GL_DEBUG_SEVERITY_HIGH:
+        case GL_DEBUG_SEVERITY_MEDIUM:
+        case GL_DEBUG_SEVERITY_LOW:
+        case GL_DEBUG_SEVERITY_NOTIFICATION:
+            return true;
+
+        default:
+            return false;
+    }
+}
+
+bool ValidateDebugMessageControlKHR(Context *context,
+                                    GLenum source,
+                                    GLenum type,
+                                    GLenum severity,
+                                    GLsizei count,
+                                    const GLuint *ids,
+                                    GLboolean enabled)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    if (!ValidDebugSource(source, false) &amp;&amp; source != GL_DONT_CARE)
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid debug source.&quot;));
+        return false;
+    }
+
+    if (!ValidDebugType(type) &amp;&amp; type != GL_DONT_CARE)
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid debug type.&quot;));
+        return false;
+    }
+
+    if (!ValidDebugSeverity(severity) &amp;&amp; severity != GL_DONT_CARE)
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid debug severity.&quot;));
+        return false;
+    }
+
+    if (count &gt; 0)
+    {
+        if (source == GL_DONT_CARE || type == GL_DONT_CARE)
+        {
+            context-&gt;recordError(Error(
+                GL_INVALID_OPERATION,
+                &quot;If count is greater than zero, source and severity cannot be GL_DONT_CARE.&quot;));
+            return false;
+        }
+
+        if (severity != GL_DONT_CARE)
+        {
+            context-&gt;recordError(
+                Error(GL_INVALID_OPERATION,
+                      &quot;If count is greater than zero, severity must be GL_DONT_CARE.&quot;));
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool ValidateDebugMessageInsertKHR(Context *context,
+                                   GLenum source,
+                                   GLenum type,
+                                   GLuint id,
+                                   GLenum severity,
+                                   GLsizei length,
+                                   const GLchar *buf)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    if (!context-&gt;getState().getDebug().isOutputEnabled())
+    {
+        // If the DEBUG_OUTPUT state is disabled calls to DebugMessageInsert are discarded and do
+        // not generate an error.
+        return false;
+    }
+
+    if (!ValidDebugSeverity(severity))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid debug severity.&quot;));
+        return false;
+    }
+
+    if (!ValidDebugType(type))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid debug type.&quot;));
+        return false;
+    }
+
+    if (!ValidDebugSource(source, true))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid debug source.&quot;));
+        return false;
+    }
+
+    size_t messageLength = (length &lt; 0) ? strlen(buf) : length;
+    if (messageLength &gt; context-&gt;getExtensions().maxDebugMessageLength)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_VALUE, &quot;Message length is larger than GL_MAX_DEBUG_MESSAGE_LENGTH.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateDebugMessageCallbackKHR(Context *context,
+                                     GLDEBUGPROCKHR callback,
+                                     const void *userParam)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateGetDebugMessageLogKHR(Context *context,
+                                   GLuint count,
+                                   GLsizei bufSize,
+                                   GLenum *sources,
+                                   GLenum *types,
+                                   GLuint *ids,
+                                   GLenum *severities,
+                                   GLsizei *lengths,
+                                   GLchar *messageLog)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    if (bufSize &lt; 0 &amp;&amp; messageLog != nullptr)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_VALUE, &quot;bufSize must be positive if messageLog is not null.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidatePushDebugGroupKHR(Context *context,
+                               GLenum source,
+                               GLuint id,
+                               GLsizei length,
+                               const GLchar *message)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    if (!ValidDebugSource(source, true))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid debug source.&quot;));
+        return false;
+    }
+
+    size_t messageLength = (length &lt; 0) ? strlen(message) : length;
+    if (messageLength &gt; context-&gt;getExtensions().maxDebugMessageLength)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_VALUE, &quot;Message length is larger than GL_MAX_DEBUG_MESSAGE_LENGTH.&quot;));
+        return false;
+    }
+
+    size_t currentStackSize = context-&gt;getState().getDebug().getGroupStackDepth();
+    if (currentStackSize &gt;= context-&gt;getExtensions().maxDebugGroupStackDepth)
+    {
+        context-&gt;recordError(
+            Error(GL_STACK_OVERFLOW,
+                  &quot;Cannot push more than GL_MAX_DEBUG_GROUP_STACK_DEPTH debug groups.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidatePopDebugGroupKHR(Context *context)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    size_t currentStackSize = context-&gt;getState().getDebug().getGroupStackDepth();
+    if (currentStackSize &lt;= 1)
+    {
+        context-&gt;recordError(Error(GL_STACK_UNDERFLOW, &quot;Cannot pop the default debug group.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+static bool ValidateObjectIdentifierAndName(Context *context, GLenum identifier, GLuint name)
+{
+    switch (identifier)
+    {
+        case GL_BUFFER:
+            if (context-&gt;getBuffer(name) == nullptr)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;name is not a valid buffer.&quot;));
+                return false;
+            }
+            return true;
+
+        case GL_SHADER:
+            if (context-&gt;getShader(name) == nullptr)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;name is not a valid shader.&quot;));
+                return false;
+            }
+            return true;
+
+        case GL_PROGRAM:
+            if (context-&gt;getProgram(name) == nullptr)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;name is not a valid program.&quot;));
+                return false;
+            }
+            return true;
+
+        case GL_VERTEX_ARRAY:
+            if (context-&gt;getVertexArray(name) == nullptr)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;name is not a valid vertex array.&quot;));
+                return false;
+            }
+            return true;
+
+        case GL_QUERY:
+            if (context-&gt;getQuery(name) == nullptr)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;name is not a valid query.&quot;));
+                return false;
+            }
+            return true;
+
+        case GL_TRANSFORM_FEEDBACK:
+            if (context-&gt;getTransformFeedback(name) == nullptr)
+            {
+                context-&gt;recordError(
+                    Error(GL_INVALID_VALUE, &quot;name is not a valid transform feedback.&quot;));
+                return false;
+            }
+            return true;
+
+        case GL_SAMPLER:
+            if (context-&gt;getSampler(name) == nullptr)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;name is not a valid sampler.&quot;));
+                return false;
+            }
+            return true;
+
+        case GL_TEXTURE:
+            if (context-&gt;getTexture(name) == nullptr)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;name is not a valid texture.&quot;));
+                return false;
+            }
+            return true;
+
+        case GL_RENDERBUFFER:
+            if (context-&gt;getRenderbuffer(name) == nullptr)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;name is not a valid renderbuffer.&quot;));
+                return false;
+            }
+            return true;
+
+        case GL_FRAMEBUFFER:
+            if (context-&gt;getFramebuffer(name) == nullptr)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;name is not a valid framebuffer.&quot;));
+                return false;
+            }
+            return true;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid identifier.&quot;));
+            return false;
+    }
+
+    return true;
+}
+
+bool ValidateObjectLabelKHR(Context *context,
+                            GLenum identifier,
+                            GLuint name,
+                            GLsizei length,
+                            const GLchar *label)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    if (!ValidateObjectIdentifierAndName(context, identifier, name))
+    {
+        return false;
+    }
+
+    size_t labelLength = (length &lt; 0) ? strlen(label) : length;
+    if (labelLength &gt; context-&gt;getExtensions().maxLabelLength)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_VALUE, &quot;Label length is larger than GL_MAX_LABEL_LENGTH.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateGetObjectLabelKHR(Context *context,
+                               GLenum identifier,
+                               GLuint name,
+                               GLsizei bufSize,
+                               GLsizei *length,
+                               GLchar *label)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    if (bufSize &lt; 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;bufSize cannot be negative.&quot;));
+        return false;
+    }
+
+    if (!ValidateObjectIdentifierAndName(context, identifier, name))
+    {
+        return false;
+    }
+
+    // Can no-op if bufSize is zero.
+    return bufSize &gt; 0;
+}
+
+static bool ValidateObjectPtrName(Context *context, const void *ptr)
+{
+    if (context-&gt;getFenceSync(reinterpret_cast&lt;GLsync&gt;(const_cast&lt;void *&gt;(ptr))) == nullptr)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;name is not a valid sync.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateObjectPtrLabelKHR(Context *context,
+                               const void *ptr,
+                               GLsizei length,
+                               const GLchar *label)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    if (!ValidateObjectPtrName(context, ptr))
+    {
+        return false;
+    }
+
+    size_t labelLength = (length &lt; 0) ? strlen(label) : length;
+    if (labelLength &gt; context-&gt;getExtensions().maxLabelLength)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_VALUE, &quot;Label length is larger than GL_MAX_LABEL_LENGTH.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateGetObjectPtrLabelKHR(Context *context,
+                                  const void *ptr,
+                                  GLsizei bufSize,
+                                  GLsizei *length,
+                                  GLchar *label)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    if (bufSize &lt; 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;bufSize cannot be negative.&quot;));
+        return false;
+    }
+
+    if (!ValidateObjectPtrName(context, ptr))
+    {
+        return false;
+    }
+
+    // Can no-op if bufSize is zero.
+    return bufSize &gt; 0;
+}
+
+bool ValidateGetPointervKHR(Context *context, GLenum pname, void **params)
+{
+    if (!context-&gt;getExtensions().debug)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+        return false;
+    }
+
+    // TODO: represent this in Context::getQueryParameterInfo.
+    switch (pname)
+    {
+        case GL_DEBUG_CALLBACK_FUNCTION:
+        case GL_DEBUG_CALLBACK_USER_PARAM:
+            break;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid pname.&quot;));
+            return false;
+    }
+
+    return true;
+}
+
+bool ValidateBlitFramebufferANGLE(Context *context,
+                                  GLint srcX0,
+                                  GLint srcY0,
+                                  GLint srcX1,
+                                  GLint srcY1,
+                                  GLint dstX0,
+                                  GLint dstY0,
+                                  GLint dstX1,
+                                  GLint dstY1,
+                                  GLbitfield mask,
+                                  GLenum filter)
+{
+    if (!context-&gt;getExtensions().framebufferBlit)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Blit extension not available.&quot;));
+        return false;
+    }
+
+    if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
+    {
+        // TODO(jmadill): Determine if this should be available on other implementations.
+        context-&gt;recordError(Error(
+            GL_INVALID_OPERATION,
+            &quot;Scaling and flipping in BlitFramebufferANGLE not supported by this implementation.&quot;));
+        return false;
+    }
+
+    if (filter == GL_LINEAR)
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Linear blit not supported in this extension&quot;));
+        return false;
+    }
+
+    const Framebuffer *readFramebuffer = context-&gt;getState().getReadFramebuffer();
+    const Framebuffer *drawFramebuffer = context-&gt;getState().getDrawFramebuffer();
+
+    if (mask &amp; GL_COLOR_BUFFER_BIT)
+    {
+        const FramebufferAttachment *readColorAttachment = readFramebuffer-&gt;getReadColorbuffer();
+        const FramebufferAttachment *drawColorAttachment = drawFramebuffer-&gt;getFirstColorbuffer();
+
+        if (readColorAttachment &amp;&amp; drawColorAttachment)
+        {
+            if (!(readColorAttachment-&gt;type() == GL_TEXTURE &amp;&amp;
+                  readColorAttachment-&gt;getTextureImageIndex().type == GL_TEXTURE_2D) &amp;&amp;
+                readColorAttachment-&gt;type() != GL_RENDERBUFFER &amp;&amp;
+                readColorAttachment-&gt;type() != GL_FRAMEBUFFER_DEFAULT)
+            {
+                context-&gt;recordError(Error(GL_INVALID_OPERATION));
+                return false;
+            }
+
+            for (size_t drawbufferIdx = 0;
+                 drawbufferIdx &lt; drawFramebuffer-&gt;getDrawbufferStateCount(); ++drawbufferIdx)
+            {
+                const FramebufferAttachment *attachment =
+                    drawFramebuffer-&gt;getDrawBuffer(drawbufferIdx);
+                if (attachment)
+                {
+                    if (!(attachment-&gt;type() == GL_TEXTURE &amp;&amp;
+                          attachment-&gt;getTextureImageIndex().type == GL_TEXTURE_2D) &amp;&amp;
+                        attachment-&gt;type() != GL_RENDERBUFFER &amp;&amp;
+                        attachment-&gt;type() != GL_FRAMEBUFFER_DEFAULT)
+                    {
+                        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+                        return false;
+                    }
+
+                    // Return an error if the destination formats do not match
+                    if (attachment-&gt;getInternalFormat() != readColorAttachment-&gt;getInternalFormat())
+                    {
+                        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+                        return false;
+                    }
+                }
+            }
+
+            int readSamples = readFramebuffer-&gt;getSamples(context-&gt;getData());
+
+            if (readSamples != 0 &amp;&amp;
+                IsPartialBlit(context, readColorAttachment, drawColorAttachment, srcX0, srcY0,
+                              srcX1, srcY1, dstX0, dstY0, dstX1, dstY1))
+            {
+                context-&gt;recordError(Error(GL_INVALID_OPERATION));
+                return false;
+            }
+        }
+    }
+
+    GLenum masks[]       = {GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT};
+    GLenum attachments[] = {GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT};
+    for (size_t i = 0; i &lt; 2; i++)
+    {
+        if (mask &amp; masks[i])
+        {
+            const FramebufferAttachment *readBuffer =
+                readFramebuffer-&gt;getAttachment(attachments[i]);
+            const FramebufferAttachment *drawBuffer =
+                drawFramebuffer-&gt;getAttachment(attachments[i]);
+
+            if (readBuffer &amp;&amp; drawBuffer)
+            {
+                if (IsPartialBlit(context, readBuffer, drawBuffer, srcX0, srcY0, srcX1, srcY1,
+                                  dstX0, dstY0, dstX1, dstY1))
+                {
+                    // only whole-buffer copies are permitted
+                    ERR(
+                        &quot;Only whole-buffer depth and stencil blits are supported by this &quot;
+                        &quot;implementation.&quot;);
+                    context-&gt;recordError(Error(GL_INVALID_OPERATION));
+                    return false;
+                }
+
+                if (readBuffer-&gt;getSamples() != 0 || drawBuffer-&gt;getSamples() != 0)
+                {
+                    context-&gt;recordError(Error(GL_INVALID_OPERATION));
+                    return false;
+                }
+            }
+        }
+    }
+
+    return ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+                                             dstX1, dstY1, mask, filter);
+}
+
+bool ValidateClear(ValidationContext *context, GLbitfield mask)
+{
+    const Framebuffer *framebufferObject = context-&gt;getState().getDrawFramebuffer();
+    ASSERT(framebufferObject);
+
+    if (framebufferObject-&gt;checkStatus(context-&gt;getData()) != GL_FRAMEBUFFER_COMPLETE)
+    {
+        context-&gt;recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
+        return false;
+    }
+
+    if ((mask &amp; ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateDrawBuffersEXT(ValidationContext *context, GLsizei n, const GLenum *bufs)
+{
+    if (!context-&gt;getExtensions().drawBuffers)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not supported.&quot;));
+        return false;
+    }
+
+    return ValidateDrawBuffersBase(context, n, bufs);
+}
+
+bool ValidateTexImage2D(Context *context,
+                        GLenum target,
+                        GLint level,
+                        GLint internalformat,
+                        GLsizei width,
+                        GLsizei height,
+                        GLint border,
+                        GLenum format,
+                        GLenum type,
+                        const GLvoid *pixels)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        return ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
+                                             0, 0, width, height, border, format, type, pixels);
+    }
+
+    ASSERT(context-&gt;getClientVersion() &gt;= 3);
+    return ValidateES3TexImage2DParameters(context, target, level, internalformat, false, false, 0,
+                                           0, 0, width, height, 1, border, format, type, pixels);
+}
+
+bool ValidateTexSubImage2D(Context *context,
+                           GLenum target,
+                           GLint level,
+                           GLint xoffset,
+                           GLint yoffset,
+                           GLsizei width,
+                           GLsizei height,
+                           GLenum format,
+                           GLenum type,
+                           const GLvoid *pixels)
+{
+
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        return ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true, xoffset,
+                                             yoffset, width, height, 0, format, type, pixels);
+    }
+
+    ASSERT(context-&gt;getClientVersion() &gt;= 3);
+    return ValidateES3TexImage2DParameters(context, target, level, GL_NONE, false, true, xoffset,
+                                           yoffset, 0, width, height, 1, 0, format, type, pixels);
+}
+
+bool ValidateCompressedTexImage2D(Context *context,
+                                  GLenum target,
+                                  GLint level,
+                                  GLenum internalformat,
+                                  GLsizei width,
+                                  GLsizei height,
+                                  GLint border,
+                                  GLsizei imageSize,
+                                  const GLvoid *data)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        if (!ValidateES2TexImageParameters(context, target, level, internalformat, true, false, 0,
+                                           0, width, height, border, GL_NONE, GL_NONE, data))
+        {
+            return false;
+        }
+    }
+    else
+    {
+        ASSERT(context-&gt;getClientVersion() &gt;= 3);
+        if (!ValidateES3TexImage2DParameters(context, target, level, internalformat, true, false, 0,
+                                             0, 0, width, height, 1, border, GL_NONE, GL_NONE,
+                                             data))
+        {
+            return false;
+        }
+    }
+
+    const InternalFormat &amp;formatInfo = GetInternalFormatInfo(internalformat);
+    if (imageSize &lt; 0 ||
+        static_cast&lt;GLuint&gt;(imageSize) !=
+            formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateCompressedTexSubImage2D(Context *context,
+                                     GLenum target,
+                                     GLint level,
+                                     GLint xoffset,
+                                     GLint yoffset,
+                                     GLsizei width,
+                                     GLsizei height,
+                                     GLenum format,
+                                     GLsizei imageSize,
+                                     const GLvoid *data)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        if (!ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true, xoffset,
+                                           yoffset, width, height, 0, GL_NONE, GL_NONE, data))
+        {
+            return false;
+        }
+    }
+    else
+    {
+        ASSERT(context-&gt;getClientVersion() &gt;= 3);
+        if (!ValidateES3TexImage2DParameters(context, target, level, GL_NONE, true, true, xoffset,
+                                             yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE,
+                                             data))
+        {
+            return false;
+        }
+    }
+
+    const InternalFormat &amp;formatInfo = GetInternalFormatInfo(format);
+    if (imageSize &lt; 0 ||
+        static_cast&lt;GLuint&gt;(imageSize) !=
+            formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateGetBufferPointervOES(Context *context, GLenum target, GLenum pname, void **params)
+{
+    if (!context-&gt;getExtensions().mapBuffer)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Map buffer extension not available.&quot;));
+        return false;
+    }
+
+    return ValidateGetBufferPointervBase(context, target, pname, params);
+}
+
+bool ValidateMapBufferOES(Context *context, GLenum target, GLenum access)
+{
+    if (!context-&gt;getExtensions().mapBuffer)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Map buffer extension not available.&quot;));
+        return false;
+    }
+
+    if (!ValidBufferTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid buffer target.&quot;));
+        return false;
+    }
+
+    Buffer *buffer = context-&gt;getState().getTargetBuffer(target);
+
+    if (buffer == nullptr)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Attempted to map buffer object zero.&quot;));
+        return false;
+    }
+
+    if (access != GL_WRITE_ONLY_OES)
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Non-write buffer mapping not supported.&quot;));
+        return false;
+    }
+
+    if (buffer-&gt;isMapped())
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Buffer is already mapped.&quot;));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateUnmapBufferOES(Context *context, GLenum target)
+{
+    if (!context-&gt;getExtensions().mapBuffer)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Map buffer extension not available.&quot;));
+        return false;
+    }
+
+    return ValidateUnmapBufferBase(context, target);
+}
+
+bool ValidateMapBufferRangeEXT(Context *context,
+                               GLenum target,
+                               GLintptr offset,
+                               GLsizeiptr length,
+                               GLbitfield access)
+{
+    if (!context-&gt;getExtensions().mapBufferRange)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_OPERATION, &quot;Map buffer range extension not available.&quot;));
+        return false;
+    }
+
+    return ValidateMapBufferRangeBase(context, target, offset, length, access);
+}
+
+bool ValidateFlushMappedBufferRangeEXT(Context *context,
+                                       GLenum target,
+                                       GLintptr offset,
+                                       GLsizeiptr length)
+{
+    if (!context-&gt;getExtensions().mapBufferRange)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_OPERATION, &quot;Map buffer range extension not available.&quot;));
+        return false;
+    }
+
+    return ValidateFlushMappedBufferRangeBase(context, target, offset, length);
+}
+
+bool ValidateBindTexture(Context *context, GLenum target, GLuint texture)
+{
+    Texture *textureObject = context-&gt;getTexture(texture);
+    if (textureObject &amp;&amp; textureObject-&gt;getTarget() != target &amp;&amp; texture != 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Invalid texture&quot;));
+        return false;
+    }
+
+    switch (target)
+    {
+        case GL_TEXTURE_2D:
+        case GL_TEXTURE_CUBE_MAP:
+            break;
+
+        case GL_TEXTURE_3D:
+        case GL_TEXTURE_2D_ARRAY:
+            if (context-&gt;getClientVersion() &lt; 3)
+            {
+                context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;GLES 3.0 disabled&quot;));
+                return false;
+            }
+            break;
+        case GL_TEXTURE_EXTERNAL_OES:
+            if (!context-&gt;getExtensions().eglStreamConsumerExternal)
+            {
+                context-&gt;recordError(
+                    Error(GL_INVALID_ENUM, &quot;External texture extension not enabled&quot;));
+                return false;
+            }
+            break;
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid target&quot;));
+            return false;
+    }
+
+    return true;
+}
+
+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEvalidationES2h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,18 +10,29 @@
</span><span class="cx"> #define LIBANGLE_VALIDATION_ES2_H_
</span><span class="cx"> 
</span><span class="cx"> #include &lt;GLES2/gl2.h&gt;
</span><ins>+#include &lt;GLES2/gl2ext.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><del>-
</del><span class="cx"> class Context;
</span><ins>+class ValidationContext;
+class Texture;
</ins><span class="cx"> 
</span><span class="cx"> bool ValidateES2TexImageParameters(Context *context, GLenum target, GLint level, GLenum internalformat, bool isCompressed, bool isSubImage,
</span><span class="cx">                                    GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
</span><span class="cx">                                    GLint border, GLenum format, GLenum type, const GLvoid *pixels);
</span><span class="cx"> 
</span><del>-bool ValidateES2CopyTexImageParameters(Context* context, GLenum target, GLint level, GLenum internalformat, bool isSubImage,
-                                       GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height,
</del><ins>+bool ValidateES2CopyTexImageParameters(ValidationContext *context,
+                                       GLenum target,
+                                       GLint level,
+                                       GLenum internalformat,
+                                       bool isSubImage,
+                                       GLint xoffset,
+                                       GLint yoffset,
+                                       GLint x,
+                                       GLint y,
+                                       GLsizei width,
+                                       GLsizei height,
</ins><span class="cx">                                        GLint border);
</span><span class="cx"> 
</span><span class="cx"> bool ValidateES2TexStorageParameters(Context *context, GLenum target, GLsizei levels, GLenum internalformat,
</span><span class="lines">@@ -29,6 +40,149 @@
</span><span class="cx"> 
</span><span class="cx"> bool ValidES2ReadFormatType(Context *context, GLenum format, GLenum type);
</span><span class="cx"> 
</span><del>-}
</del><ins>+bool ValidateDiscardFramebufferEXT(Context *context, GLenum target, GLsizei numAttachments,
+                                   const GLenum *attachments);
</ins><span class="cx"> 
</span><ins>+bool ValidateDrawBuffersEXT(ValidationContext *context, GLsizei n, const GLenum *bufs);
+
+bool ValidateBindVertexArrayOES(Context *context, GLuint array);
+bool ValidateDeleteVertexArraysOES(Context *context, GLsizei n);
+bool ValidateGenVertexArraysOES(Context *context, GLsizei n);
+bool ValidateIsVertexArrayOES(Context *context);
+
+bool ValidateProgramBinaryOES(Context *context,
+                              GLuint program,
+                              GLenum binaryFormat,
+                              const void *binary,
+                              GLint length);
+bool ValidateGetProgramBinaryOES(Context *context,
+                                 GLuint program,
+                                 GLsizei bufSize,
+                                 GLsizei *length,
+                                 GLenum *binaryFormat,
+                                 void *binary);
+
+// GL_KHR_debug
+bool ValidateDebugMessageControlKHR(Context *context,
+                                    GLenum source,
+                                    GLenum type,
+                                    GLenum severity,
+                                    GLsizei count,
+                                    const GLuint *ids,
+                                    GLboolean enabled);
+bool ValidateDebugMessageInsertKHR(Context *context,
+                                   GLenum source,
+                                   GLenum type,
+                                   GLuint id,
+                                   GLenum severity,
+                                   GLsizei length,
+                                   const GLchar *buf);
+bool ValidateDebugMessageCallbackKHR(Context *context,
+                                     GLDEBUGPROCKHR callback,
+                                     const void *userParam);
+bool ValidateGetDebugMessageLogKHR(Context *context,
+                                   GLuint count,
+                                   GLsizei bufSize,
+                                   GLenum *sources,
+                                   GLenum *types,
+                                   GLuint *ids,
+                                   GLenum *severities,
+                                   GLsizei *lengths,
+                                   GLchar *messageLog);
+bool ValidatePushDebugGroupKHR(Context *context,
+                               GLenum source,
+                               GLuint id,
+                               GLsizei length,
+                               const GLchar *message);
+bool ValidatePopDebugGroupKHR(Context *context);
+bool ValidateObjectLabelKHR(Context *context,
+                            GLenum identifier,
+                            GLuint name,
+                            GLsizei length,
+                            const GLchar *label);
+bool ValidateGetObjectLabelKHR(Context *context,
+                               GLenum identifier,
+                               GLuint name,
+                               GLsizei bufSize,
+                               GLsizei *length,
+                               GLchar *label);
+bool ValidateObjectPtrLabelKHR(Context *context,
+                               const void *ptr,
+                               GLsizei length,
+                               const GLchar *label);
+bool ValidateGetObjectPtrLabelKHR(Context *context,
+                                  const void *ptr,
+                                  GLsizei bufSize,
+                                  GLsizei *length,
+                                  GLchar *label);
+bool ValidateGetPointervKHR(Context *context, GLenum pname, void **params);
+bool ValidateBlitFramebufferANGLE(Context *context,
+                                  GLint srcX0,
+                                  GLint srcY0,
+                                  GLint srcX1,
+                                  GLint srcY1,
+                                  GLint dstX0,
+                                  GLint dstY0,
+                                  GLint dstX1,
+                                  GLint dstY1,
+                                  GLbitfield mask,
+                                  GLenum filter);
+
+bool ValidateClear(ValidationContext *context, GLbitfield mask);
+bool ValidateTexImage2D(Context *context,
+                        GLenum target,
+                        GLint level,
+                        GLint internalformat,
+                        GLsizei width,
+                        GLsizei height,
+                        GLint border,
+                        GLenum format,
+                        GLenum type,
+                        const GLvoid *pixels);
+bool ValidateTexSubImage2D(Context *context,
+                           GLenum target,
+                           GLint level,
+                           GLint xoffset,
+                           GLint yoffset,
+                           GLsizei width,
+                           GLsizei height,
+                           GLenum format,
+                           GLenum type,
+                           const GLvoid *pixels);
+bool ValidateCompressedTexImage2D(Context *context,
+                                  GLenum target,
+                                  GLint level,
+                                  GLenum internalformat,
+                                  GLsizei width,
+                                  GLsizei height,
+                                  GLint border,
+                                  GLsizei imageSize,
+                                  const GLvoid *data);
+bool ValidateCompressedTexSubImage2D(Context *context,
+                                     GLenum target,
+                                     GLint level,
+                                     GLint xoffset,
+                                     GLint yoffset,
+                                     GLsizei width,
+                                     GLsizei height,
+                                     GLenum format,
+                                     GLsizei imageSize,
+                                     const GLvoid *data);
+bool ValidateBindTexture(Context *context, GLenum target, GLuint texture);
+
+bool ValidateGetBufferPointervOES(Context *context, GLenum target, GLenum pname, void **params);
+bool ValidateMapBufferOES(Context *context, GLenum target, GLenum access);
+bool ValidateUnmapBufferOES(Context *context, GLenum target);
+bool ValidateMapBufferRangeEXT(Context *context,
+                               GLenum target,
+                               GLintptr offset,
+                               GLsizeiptr length,
+                               GLbitfield access);
+bool ValidateFlushMappedBufferRangeEXT(Context *context,
+                                       GLenum target,
+                                       GLintptr offset,
+                                       GLsizeiptr length);
+
+}  // namespace gl
+
</ins><span class="cx"> #endif // LIBANGLE_VALIDATION_ES2_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEvalidationES3cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -131,6 +131,15 @@
</span><span class="cx">     InsertES3FormatCombo(&amp;set, GL_ALPHA,              GL_ALPHA,           GL_UNSIGNED_BYTE                 );
</span><span class="cx">     InsertES3FormatCombo(&amp;set, GL_SRGB_ALPHA_EXT,     GL_SRGB_ALPHA_EXT,  GL_UNSIGNED_BYTE                 );
</span><span class="cx">     InsertES3FormatCombo(&amp;set, GL_SRGB_EXT,           GL_SRGB_EXT,        GL_UNSIGNED_BYTE                 );
</span><ins>+    InsertES3FormatCombo(&amp;set, GL_RG,                 GL_RG,              GL_UNSIGNED_BYTE                 );
+    InsertES3FormatCombo(&amp;set, GL_RG,                 GL_RG,              GL_FLOAT                         );
+    InsertES3FormatCombo(&amp;set, GL_RG,                 GL_RG,              GL_HALF_FLOAT                    );
+    InsertES3FormatCombo(&amp;set, GL_RG,                 GL_RG,              GL_HALF_FLOAT_OES                );
+    InsertES3FormatCombo(&amp;set, GL_RED,                GL_RED,             GL_UNSIGNED_BYTE                 );
+    InsertES3FormatCombo(&amp;set, GL_RED,                GL_RED,             GL_FLOAT                         );
+    InsertES3FormatCombo(&amp;set, GL_RED,                GL_RED,             GL_HALF_FLOAT                    );
+    InsertES3FormatCombo(&amp;set, GL_RED,                GL_RED,             GL_HALF_FLOAT_OES                );
+    InsertES3FormatCombo(&amp;set, GL_DEPTH_STENCIL,      GL_DEPTH_STENCIL,   GL_UNSIGNED_INT_24_8             );
</ins><span class="cx"> 
</span><span class="cx">     // Depth stencil formats
</span><span class="cx">     InsertES3FormatCombo(&amp;set, GL_DEPTH_COMPONENT16,  GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT                );
</span><span class="lines">@@ -145,6 +154,8 @@
</span><span class="cx">     InsertES3FormatCombo(&amp;set, GL_SRGB8,              GL_SRGB_EXT,       GL_UNSIGNED_BYTE                  );
</span><span class="cx"> 
</span><span class="cx">     // From GL_OES_texture_float
</span><ins>+    InsertES3FormatCombo(&amp;set, GL_RGBA,               GL_RGBA,            GL_FLOAT                         );
+    InsertES3FormatCombo(&amp;set, GL_RGB,                GL_RGB,             GL_FLOAT                         );
</ins><span class="cx">     InsertES3FormatCombo(&amp;set, GL_LUMINANCE_ALPHA,    GL_LUMINANCE_ALPHA, GL_FLOAT                         );
</span><span class="cx">     InsertES3FormatCombo(&amp;set, GL_LUMINANCE,          GL_LUMINANCE,       GL_FLOAT                         );
</span><span class="cx">     InsertES3FormatCombo(&amp;set, GL_ALPHA,              GL_ALPHA,           GL_FLOAT                         );
</span><span class="lines">@@ -186,44 +197,19 @@
</span><span class="cx">     // From GL_ANGLE_depth_texture
</span><span class="cx">     InsertES3FormatCombo(&amp;set, GL_DEPTH_COMPONENT32_OES,  GL_DEPTH_COMPONENT, GL_UNSIGNED_INT_24_8_OES         );
</span><span class="cx"> 
</span><del>-    // Compressed formats
-    // From ES 3.0.1 spec, table 3.16
-    //                    | Internal format                             | Format                                      | Type           |
-    //                    |                                             |                                             |                |
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_R11_EAC,                        GL_COMPRESSED_R11_EAC,                        GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_R11_EAC,                        GL_COMPRESSED_R11_EAC,                        GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_SIGNED_R11_EAC,                 GL_COMPRESSED_SIGNED_R11_EAC,                 GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_RG11_EAC,                       GL_COMPRESSED_RG11_EAC,                       GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_SIGNED_RG11_EAC,                GL_COMPRESSED_SIGNED_RG11_EAC,                GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_RGB8_ETC2,                      GL_COMPRESSED_RGB8_ETC2,                      GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_SRGB8_ETC2,                     GL_COMPRESSED_SRGB8_ETC2,                     GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_RGBA8_ETC2_EAC,                 GL_COMPRESSED_RGBA8_ETC2_EAC,                 GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          GL_UNSIGNED_BYTE);
-
-
-    // From GL_EXT_texture_compression_dxt1
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,              GL_COMPRESSED_RGB_S3TC_DXT1_EXT,              GL_UNSIGNED_BYTE);
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,             GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,             GL_UNSIGNED_BYTE);
-
-    // From GL_ANGLE_texture_compression_dxt3
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,           GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,           GL_UNSIGNED_BYTE);
-
-    // From GL_ANGLE_texture_compression_dxt5
-    InsertES3FormatCombo(&amp;set, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,           GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,           GL_UNSIGNED_BYTE);
-
</del><span class="cx">     return set;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static bool ValidateTexImageFormatCombination(gl::Context *context, GLenum internalFormat, GLenum format, GLenum type)
</span><span class="cx"> {
</span><del>-    // Note: dEQP 2013.4 expects an INVALID_VALUE error for TexImage3D with an invalid
-    // internal format. (dEQP-GLES3.functional.negative_api.texture.teximage3d)
</del><ins>+    // For historical reasons, glTexImage2D and glTexImage3D pass in their internal format as a
+    // GLint instead of a GLenum. Therefor an invalid internal format gives a GL_INVALID_VALUE
+    // error instead of a GL_INVALID_ENUM error. As this validation function is only called in
+    // the validation codepaths for glTexImage2D/3D, we record a GL_INVALID_VALUE error.
</ins><span class="cx">     const gl::InternalFormat &amp;formatInfo = gl::GetInternalFormatInfo(internalFormat);
</span><span class="cx">     if (!formatInfo.textureSupport(context-&gt;getClientVersion(), context-&gt;getExtensions()))
</span><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_ENUM));
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_VALUE));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -276,18 +262,25 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateES3TexImageParameters(Context *context, GLenum target, GLint level, GLenum internalformat, bool isCompressed, bool isSubImage,
-                                   GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
-                                   GLint border, GLenum format, GLenum type, const GLvoid *pixels)
</del><ins>+bool ValidateES3TexImageParametersBase(Context *context,
+                                       GLenum target,
+                                       GLint level,
+                                       GLenum internalformat,
+                                       bool isCompressed,
+                                       bool isSubImage,
+                                       GLint xoffset,
+                                       GLint yoffset,
+                                       GLint zoffset,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLsizei depth,
+                                       GLint border,
+                                       GLenum format,
+                                       GLenum type,
+                                       const GLvoid *pixels)
</ins><span class="cx"> {
</span><del>-    if (!ValidTexture2DDestinationTarget(context, target))
-    {
-        context-&gt;recordError(Error(GL_INVALID_ENUM));
-        return false;
-    }
-
</del><span class="cx">     // Validate image size
</span><del>-    if (!ValidImageSize(context, target, level, width, height, depth))
</del><ins>+    if (!ValidImageSizeParameters(context, target, level, width, height, depth, isSubImage))
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_VALUE));
</span><span class="cx">         return false;
</span><span class="lines">@@ -354,7 +347,7 @@
</span><span class="cx">       case GL_TEXTURE_2D_ARRAY:
</span><span class="cx">         if (static_cast&lt;GLuint&gt;(width) &gt; (caps.max2DTextureSize &gt;&gt; level) ||
</span><span class="cx">             static_cast&lt;GLuint&gt;(height) &gt; (caps.max2DTextureSize &gt;&gt; level) ||
</span><del>-            static_cast&lt;GLuint&gt;(depth) &gt; (caps.maxArrayTextureLayers &gt;&gt; level))
</del><ins>+            static_cast&lt;GLuint&gt;(depth) &gt; caps.maxArrayTextureLayers)
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_VALUE));
</span><span class="cx">             return false;
</span><span class="lines">@@ -373,7 +366,7 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (texture-&gt;isImmutable() &amp;&amp; !isSubImage)
</del><ins>+    if (texture-&gt;getImmutableFormat() &amp;&amp; !isSubImage)
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">         return false;
</span><span class="lines">@@ -384,13 +377,20 @@
</span><span class="cx">     const gl::InternalFormat &amp;actualFormatInfo = gl::GetInternalFormatInfo(actualInternalFormat);
</span><span class="cx">     if (isCompressed)
</span><span class="cx">     {
</span><ins>+        if (!actualFormatInfo.compressed)
+        {
+            context-&gt;recordError(Error(
+                GL_INVALID_ENUM, &quot;internalformat is not a supported compressed internal format.&quot;));
+            return false;
+        }
+
</ins><span class="cx">         if (!ValidCompressedImageSize(context, actualInternalFormat, width, height))
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!actualFormatInfo.compressed)
</del><ins>+        if (!actualFormatInfo.textureSupport(context-&gt;getClientVersion(), context-&gt;getExtensions()))
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">             return false;
</span><span class="lines">@@ -511,6 +511,62 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool ValidateES3TexImage2DParameters(Context *context,
+                                     GLenum target,
+                                     GLint level,
+                                     GLenum internalformat,
+                                     bool isCompressed,
+                                     bool isSubImage,
+                                     GLint xoffset,
+                                     GLint yoffset,
+                                     GLint zoffset,
+                                     GLsizei width,
+                                     GLsizei height,
+                                     GLsizei depth,
+                                     GLint border,
+                                     GLenum format,
+                                     GLenum type,
+                                     const GLvoid *pixels)
+{
+    if (!ValidTexture2DDestinationTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM));
+        return false;
+    }
+
+    return ValidateES3TexImageParametersBase(context, target, level, internalformat, isCompressed,
+                                             isSubImage, xoffset, yoffset, zoffset, width, height,
+                                             depth, border, format, type, pixels);
+}
+
+bool ValidateES3TexImage3DParameters(Context *context,
+                                     GLenum target,
+                                     GLint level,
+                                     GLenum internalformat,
+                                     bool isCompressed,
+                                     bool isSubImage,
+                                     GLint xoffset,
+                                     GLint yoffset,
+                                     GLint zoffset,
+                                     GLsizei width,
+                                     GLsizei height,
+                                     GLsizei depth,
+                                     GLint border,
+                                     GLenum format,
+                                     GLenum type,
+                                     const GLvoid *pixels)
+{
+    if (!ValidTexture3DDestinationTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM));
+        return false;
+    }
+
+    return ValidateES3TexImageParametersBase(context, target, level, internalformat, isCompressed,
+                                             isSubImage, xoffset, yoffset, zoffset, width, height,
+                                             depth, border, format, type, pixels);
+}
+
</ins><span class="cx"> struct EffectiveInternalFormatInfo
</span><span class="cx"> {
</span><span class="cx">     GLenum mEffectiveFormat;
</span><span class="lines">@@ -795,9 +851,19 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateES3CopyTexImageParameters(Context *context, GLenum target, GLint level, GLenum internalformat,
-                                       bool isSubImage, GLint xoffset, GLint yoffset, GLint zoffset,
-                                       GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
</del><ins>+bool ValidateES3CopyTexImageParametersBase(ValidationContext *context,
+                                           GLenum target,
+                                           GLint level,
+                                           GLenum internalformat,
+                                           bool isSubImage,
+                                           GLint xoffset,
+                                           GLint yoffset,
+                                           GLint zoffset,
+                                           GLint x,
+                                           GLint y,
+                                           GLsizei width,
+                                           GLsizei height,
+                                           GLint border)
</ins><span class="cx"> {
</span><span class="cx">     GLenum textureInternalFormat;
</span><span class="cx">     if (!ValidateCopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
</span><span class="lines">@@ -807,7 +873,9 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    gl::Framebuffer *framebuffer = context-&gt;getState().getReadFramebuffer();
</del><ins>+    const auto &amp;state                  = context-&gt;getState();
+    const gl::Framebuffer *framebuffer = state.getReadFramebuffer();
+    GLuint readFramebufferID           = framebuffer-&gt;id();
</ins><span class="cx"> 
</span><span class="cx">     if (framebuffer-&gt;checkStatus(context-&gt;getData()) != GL_FRAMEBUFFER_COMPLETE)
</span><span class="cx">     {
</span><span class="lines">@@ -815,8 +883,7 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (context-&gt;getState().getReadFramebuffer()-&gt;id() != 0 &amp;&amp;
-        framebuffer-&gt;getSamples(context-&gt;getData()) != 0)
</del><ins>+    if (readFramebufferID != 0 &amp;&amp; framebuffer-&gt;getSamples(context-&gt;getData()) != 0)
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">         return false;
</span><span class="lines">@@ -828,7 +895,7 @@
</span><span class="cx">     if (isSubImage)
</span><span class="cx">     {
</span><span class="cx">         if (!IsValidES3CopyTexImageCombination(textureInternalFormat, colorbufferInternalFormat,
</span><del>-                                               context-&gt;getState().getReadFramebuffer()-&gt;id()))
</del><ins>+                                               readFramebufferID))
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">             return false;
</span><span class="lines">@@ -837,7 +904,7 @@
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         if (!gl::IsValidES3CopyTexImageCombination(internalformat, colorbufferInternalFormat,
</span><del>-                                                context-&gt;getState().getReadFramebuffer()-&gt;id()))
</del><ins>+                                                   readFramebufferID))
</ins><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">             return false;
</span><span class="lines">@@ -848,17 +915,78 @@
</span><span class="cx">     return (width &gt; 0 &amp;&amp; height &gt; 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei levels, GLenum internalformat,
-                                     GLsizei width, GLsizei height, GLsizei depth)
</del><ins>+bool ValidateES3CopyTexImage2DParameters(ValidationContext *context,
+                                         GLenum target,
+                                         GLint level,
+                                         GLenum internalformat,
+                                         bool isSubImage,
+                                         GLint xoffset,
+                                         GLint yoffset,
+                                         GLint zoffset,
+                                         GLint x,
+                                         GLint y,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLint border)
</ins><span class="cx"> {
</span><ins>+    if (!ValidTexture2DDestinationTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM));
+        return false;
+    }
+
+    return ValidateES3CopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
+                                                 xoffset, yoffset, zoffset, x, y, width, height,
+                                                 border);
+}
+
+bool ValidateES3CopyTexImage3DParameters(ValidationContext *context,
+                                         GLenum target,
+                                         GLint level,
+                                         GLenum internalformat,
+                                         bool isSubImage,
+                                         GLint xoffset,
+                                         GLint yoffset,
+                                         GLint zoffset,
+                                         GLint x,
+                                         GLint y,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLint border)
+{
+    if (!ValidTexture3DDestinationTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM));
+        return false;
+    }
+
+    return ValidateES3CopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
+                                                 xoffset, yoffset, zoffset, x, y, width, height,
+                                                 border);
+}
+
+bool ValidateES3TexStorageParametersBase(Context *context,
+                                         GLenum target,
+                                         GLsizei levels,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth)
+{
</ins><span class="cx">     if (width &lt; 1 || height &lt; 1 || depth &lt; 1 || levels &lt; 1)
</span><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_VALUE));
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (levels &gt; gl::log2(std::max(std::max(width, height), depth)) + 1)
</del><ins>+    GLsizei maxDim = std::max(width, height);
+    if (target != GL_TEXTURE_2D_ARRAY)
</ins><span class="cx">     {
</span><ins>+        maxDim = std::max(maxDim, depth);
+    }
+
+    if (levels &gt; gl::log2(maxDim) + 1)
+    {
</ins><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="lines">@@ -919,7 +1047,7 @@
</span><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">       default:
</span><del>-        context-&gt;recordError(Error(GL_INVALID_ENUM));
</del><ins>+          UNREACHABLE();
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -930,7 +1058,7 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (texture-&gt;isImmutable())
</del><ins>+    if (texture-&gt;getImmutableFormat())
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">         return false;
</span><span class="lines">@@ -952,6 +1080,86 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool ValidateES3TexStorage2DParameters(Context *context,
+                                       GLenum target,
+                                       GLsizei levels,
+                                       GLenum internalformat,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLsizei depth)
+{
+    if (!ValidTexture2DTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM));
+        return false;
+    }
+
+    return ValidateES3TexStorageParametersBase(context, target, levels, internalformat, width,
+                                               height, depth);
+}
+
+bool ValidateES3TexStorage3DParameters(Context *context,
+                                       GLenum target,
+                                       GLsizei levels,
+                                       GLenum internalformat,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLsizei depth)
+{
+    if (!ValidTexture3DTarget(context, target))
+    {
+        context-&gt;recordError(Error(GL_INVALID_ENUM));
+        return false;
+    }
+
+    return ValidateES3TexStorageParametersBase(context, target, levels, internalformat, width,
+                                               height, depth);
+}
+
+bool ValidateBeginQuery(gl::Context *context, GLenum target, GLuint id)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;GLES version &lt; 3.0&quot;));
+        return false;
+    }
+
+    return ValidateBeginQueryBase(context, target, id);
+}
+
+bool ValidateEndQuery(gl::Context *context, GLenum target)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;GLES version &lt; 3.0&quot;));
+        return false;
+    }
+
+    return ValidateEndQueryBase(context, target);
+}
+
+bool ValidateGetQueryiv(Context *context, GLenum target, GLenum pname, GLint *params)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;GLES version &lt; 3.0&quot;));
+        return false;
+    }
+
+    return ValidateGetQueryivBase(context, target, pname);
+}
+
+bool ValidateGetQueryObjectuiv(Context *context, GLuint id, GLenum pname, GLuint *params)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;GLES version &lt; 3.0&quot;));
+        return false;
+    }
+
+    return ValidateGetQueryObjectValueBase(context, id, pname);
+}
+
</ins><span class="cx"> bool ValidateFramebufferTextureLayer(Context *context, GLenum target, GLenum attachment,
</span><span class="cx">                                      GLuint texture, GLint level, GLint layer)
</span><span class="cx"> {
</span><span class="lines">@@ -1125,16 +1333,24 @@
</span><span class="cx">     const TextureCaps &amp;formatCaps = context-&gt;getTextureCaps().get(internalformat);
</span><span class="cx">     if (static_cast&lt;GLuint&gt;(samples) &gt; formatCaps.getMaxSamples())
</span><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><ins>+        context-&gt;recordError(
+            Error(GL_INVALID_OPERATION,
+                  &quot;Samples must not be greater than maximum supported value for the format.&quot;));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateInvalidateFramebufferParameters(Context *context, GLenum target, GLsizei numAttachments,
-                                             const GLenum* attachments)
</del><ins>+bool ValidateInvalidateFramebuffer(Context *context, GLenum target, GLsizei numAttachments,
+                                   const GLenum *attachments)
</ins><span class="cx"> {
</span><ins>+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Operation only supported on ES 3.0 and above&quot;));
+        return false;
+    }
+
</ins><span class="cx">     bool defaultFramebuffer = false;
</span><span class="cx"> 
</span><span class="cx">     switch (target)
</span><span class="lines">@@ -1147,73 +1363,64 @@
</span><span class="cx">         defaultFramebuffer = context-&gt;getState().getReadFramebuffer()-&gt;id() == 0;
</span><span class="cx">         break;
</span><span class="cx">       default:
</span><del>-          context-&gt;recordError(Error(GL_INVALID_ENUM));
-          return false;
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid framebuffer target&quot;));
+        return false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (int i = 0; i &lt; numAttachments; ++i)
</del><ins>+    return ValidateDiscardFramebufferBase(context, target, numAttachments, attachments, defaultFramebuffer);
+}
+
+bool ValidateClearBuffer(ValidationContext *context)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
</ins><span class="cx">     {
</span><del>-        if (attachments[i] &gt;= GL_COLOR_ATTACHMENT0 &amp;&amp; attachments[i] &lt;= GL_COLOR_ATTACHMENT15)
-        {
-            if (defaultFramebuffer)
-            {
-                context-&gt;recordError(Error(GL_INVALID_ENUM));
-                return false;
-            }
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
</ins><span class="cx"> 
</span><del>-            if (attachments[i] &gt;= GL_COLOR_ATTACHMENT0 + context-&gt;getCaps().maxColorAttachments)
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return false;
-            }
-        }
-        else
-        {
-            switch (attachments[i])
-            {
-              case GL_DEPTH_ATTACHMENT:
-              case GL_STENCIL_ATTACHMENT:
-              case GL_DEPTH_STENCIL_ATTACHMENT:
-                if (defaultFramebuffer)
-                {
-                    context-&gt;recordError(Error(GL_INVALID_ENUM));
-                    return false;
-                }
-                break;
-              case GL_COLOR:
-              case GL_DEPTH:
-              case GL_STENCIL:
-                if (!defaultFramebuffer)
-                {
-                    context-&gt;recordError(Error(GL_INVALID_ENUM));
-                    return false;
-                }
-                break;
-              default:
-                context-&gt;recordError(Error(GL_INVALID_ENUM));
-                return false;
-            }
-        }
</del><ins>+    const gl::Framebuffer *fbo = context-&gt;getState().getDrawFramebuffer();
+    if (!fbo || fbo-&gt;checkStatus(context-&gt;getData()) != GL_FRAMEBUFFER_COMPLETE)
+    {
+        context-&gt;recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
+        return false;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ValidateClearBuffer(Context *context)
</del><ins>+bool ValidateDrawRangeElements(Context *context,
+                               GLenum mode,
+                               GLuint start,
+                               GLuint end,
+                               GLsizei count,
+                               GLenum type,
+                               const GLvoid *indices,
+                               IndexRange *indexRange)
</ins><span class="cx"> {
</span><span class="cx">     if (context-&gt;getClientVersion() &lt; 3)
</span><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Context does not support GLES3.&quot;));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const gl::Framebuffer *fbo = context-&gt;getState().getDrawFramebuffer();
-    if (!fbo || fbo-&gt;checkStatus(context-&gt;getData()) != GL_FRAMEBUFFER_COMPLETE)
</del><ins>+    if (end &lt; start)
</ins><span class="cx">     {
</span><del>-        context-&gt;recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
</del><ins>+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;end &lt; start&quot;));
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (!ValidateDrawElements(context, mode, count, type, indices, 0, indexRange))
+    {
+        return false;
+    }
+
+    if (indexRange-&gt;end &gt; end || indexRange-&gt;start &lt; start)
+    {
+        // GL spec says that behavior in this case is undefined - generating an error is fine.
+        context-&gt;recordError(
+            Error(GL_INVALID_OPERATION, &quot;Indices are out of the start, end range.&quot;));
+        return false;
+    }
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1249,7 +1456,7 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (src != GL_BACK &amp;&amp; (src &lt; GL_COLOR_ATTACHMENT0 || src &gt; GL_COLOR_ATTACHMENT15))
</del><ins>+    if (src != GL_BACK &amp;&amp; (src &lt; GL_COLOR_ATTACHMENT0 || src &gt; GL_COLOR_ATTACHMENT31))
</ins><span class="cx">     {
</span><span class="cx">         context-&gt;recordError(gl::Error(GL_INVALID_ENUM, &quot;Unknown enum for 'src' in ReadBuffer&quot;));
</span><span class="cx">         return false;
</span><span class="lines">@@ -1279,4 +1486,578 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool ValidateCompressedTexImage3D(Context *context,
+                                  GLenum target,
+                                  GLint level,
+                                  GLenum internalformat,
+                                  GLsizei width,
+                                  GLsizei height,
+                                  GLsizei depth,
+                                  GLint border,
+                                  GLsizei imageSize,
+                                  const GLvoid *data)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    const InternalFormat &amp;formatInfo = GetInternalFormatInfo(internalformat);
+    if (imageSize &lt; 0 ||
+        static_cast&lt;GLuint&gt;(imageSize) !=
+            formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE));
+        return false;
+    }
+
+    // 3D texture target validation
+    if (target != GL_TEXTURE_3D &amp;&amp; target != GL_TEXTURE_2D_ARRAY)
+    {
+        context-&gt;recordError(
+            Error(GL_INVALID_ENUM, &quot;Must specify a valid 3D texture destination target&quot;));
+        return false;
+    }
+
+    // validateES3TexImageFormat sets the error code if there is an error
+    if (!ValidateES3TexImage3DParameters(context, target, level, internalformat, true, false, 0, 0,
+                                         0, width, height, depth, border, GL_NONE, GL_NONE, data))
+    {
+        return false;
+    }
+
+    return true;
</ins><span class="cx"> }
</span><ins>+
+bool ValidateBindVertexArray(Context *context, GLuint array)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    return ValidateBindVertexArrayBase(context, array);
+}
+
+bool ValidateIsVertexArray(Context *context)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    return true;
+}
+
+bool ValidateProgramBinary(Context *context,
+                           GLuint program,
+                           GLenum binaryFormat,
+                           const void *binary,
+                           GLint length)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    return ValidateProgramBinaryBase(context, program, binaryFormat, binary, length);
+}
+
+bool ValidateGetProgramBinary(Context *context,
+                              GLuint program,
+                              GLsizei bufSize,
+                              GLsizei *length,
+                              GLenum *binaryFormat,
+                              void *binary)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    return ValidateGetProgramBinaryBase(context, program, bufSize, length, binaryFormat, binary);
+}
+
+bool ValidateProgramParameteri(Context *context, GLuint program, GLenum pname, GLint value)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Context does not support GLES3.&quot;));
+        return false;
+    }
+
+    if (GetValidProgram(context, program) == nullptr)
+    {
+        return false;
+    }
+
+    switch (pname)
+    {
+        case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
+            if (value != GL_FALSE &amp;&amp; value != GL_TRUE)
+            {
+                context-&gt;recordError(Error(
+                    GL_INVALID_VALUE, &quot;Invalid value, expected GL_FALSE or GL_TRUE: %i&quot;, value));
+                return false;
+            }
+            break;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid pname: 0x%X&quot;, pname));
+            return false;
+    }
+
+    return true;
+}
+
+bool ValidateBlitFramebuffer(Context *context,
+                             GLint srcX0,
+                             GLint srcY0,
+                             GLint srcX1,
+                             GLint srcY1,
+                             GLint dstX0,
+                             GLint dstY0,
+                             GLint dstX1,
+                             GLint dstY1,
+                             GLbitfield mask,
+                             GLenum filter)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    return ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
+                                             dstX1, dstY1, mask, filter);
+}
+
+bool ValidateClearBufferiv(ValidationContext *context,
+                           GLenum buffer,
+                           GLint drawbuffer,
+                           const GLint *value)
+{
+    switch (buffer)
+    {
+        case GL_COLOR:
+            if (drawbuffer &lt; 0 ||
+                static_cast&lt;GLuint&gt;(drawbuffer) &gt;= context-&gt;getCaps().maxDrawBuffers)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE));
+                return false;
+            }
+            break;
+
+        case GL_STENCIL:
+            if (drawbuffer != 0)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE));
+                return false;
+            }
+            break;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM));
+            return false;
+    }
+
+    return ValidateClearBuffer(context);
+}
+
+bool ValidateClearBufferuiv(ValidationContext *context,
+                            GLenum buffer,
+                            GLint drawbuffer,
+                            const GLuint *value)
+{
+    switch (buffer)
+    {
+        case GL_COLOR:
+            if (drawbuffer &lt; 0 ||
+                static_cast&lt;GLuint&gt;(drawbuffer) &gt;= context-&gt;getCaps().maxDrawBuffers)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE));
+                return false;
+            }
+            break;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM));
+            return false;
+    }
+
+    return ValidateClearBuffer(context);
+}
+
+bool ValidateClearBufferfv(ValidationContext *context,
+                           GLenum buffer,
+                           GLint drawbuffer,
+                           const GLfloat *value)
+{
+    switch (buffer)
+    {
+        case GL_COLOR:
+            if (drawbuffer &lt; 0 ||
+                static_cast&lt;GLuint&gt;(drawbuffer) &gt;= context-&gt;getCaps().maxDrawBuffers)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE));
+                return false;
+            }
+            break;
+
+        case GL_DEPTH:
+            if (drawbuffer != 0)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE));
+                return false;
+            }
+            break;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM));
+            return false;
+    }
+
+    return ValidateClearBuffer(context);
+}
+
+bool ValidateClearBufferfi(ValidationContext *context,
+                           GLenum buffer,
+                           GLint drawbuffer,
+                           GLfloat depth,
+                           GLint stencil)
+{
+    switch (buffer)
+    {
+        case GL_DEPTH_STENCIL:
+            if (drawbuffer != 0)
+            {
+                context-&gt;recordError(Error(GL_INVALID_VALUE));
+                return false;
+            }
+            break;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM));
+            return false;
+    }
+
+    return ValidateClearBuffer(context);
+}
+
+bool ValidateDrawBuffers(ValidationContext *context, GLsizei n, const GLenum *bufs)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Context does not support GLES3.&quot;));
+        return false;
+    }
+
+    return ValidateDrawBuffersBase(context, n, bufs);
+}
+
+bool ValidateCopyTexSubImage3D(Context *context,
+                               GLenum target,
+                               GLint level,
+                               GLint xoffset,
+                               GLint yoffset,
+                               GLint zoffset,
+                               GLint x,
+                               GLint y,
+                               GLsizei width,
+                               GLsizei height)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    return ValidateES3CopyTexImage3DParameters(context, target, level, GL_NONE, true, xoffset,
+                                               yoffset, zoffset, x, y, width, height, 0);
+}
+
+bool ValidateTexImage3D(Context *context,
+                        GLenum target,
+                        GLint level,
+                        GLint internalformat,
+                        GLsizei width,
+                        GLsizei height,
+                        GLsizei depth,
+                        GLint border,
+                        GLenum format,
+                        GLenum type,
+                        const GLvoid *pixels)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    return ValidateES3TexImage3DParameters(context, target, level, internalformat, false, false, 0,
+                                           0, 0, width, height, depth, border, format, type,
+                                           pixels);
+}
+
+bool ValidateTexSubImage3D(Context *context,
+                           GLenum target,
+                           GLint level,
+                           GLint xoffset,
+                           GLint yoffset,
+                           GLint zoffset,
+                           GLsizei width,
+                           GLsizei height,
+                           GLsizei depth,
+                           GLenum format,
+                           GLenum type,
+                           const GLvoid *pixels)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    return ValidateES3TexImage3DParameters(context, target, level, GL_NONE, false, true, xoffset,
+                                           yoffset, zoffset, width, height, depth, 0, format, type,
+                                           pixels);
+}
+
+bool ValidateCompressedTexSubImage3D(Context *context,
+                                     GLenum target,
+                                     GLint level,
+                                     GLint xoffset,
+                                     GLint yoffset,
+                                     GLint zoffset,
+                                     GLsizei width,
+                                     GLsizei height,
+                                     GLsizei depth,
+                                     GLenum format,
+                                     GLsizei imageSize,
+                                     const GLvoid *data)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    const InternalFormat &amp;formatInfo = GetInternalFormatInfo(format);
+    if (imageSize &lt; 0 ||
+        static_cast&lt;GLuint&gt;(imageSize) !=
+            formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE));
+        return false;
+    }
+
+    if (!data)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE));
+        return false;
+    }
+
+    return ValidateES3TexImage3DParameters(context, target, level, GL_NONE, true, true, 0, 0, 0,
+                                           width, height, depth, 0, GL_NONE, GL_NONE, data);
+}
+
+bool ValidateGenQueries(Context *context, GLint n, GLuint *)
+{
+    return ValidateGenOrDeleteES3(context, n);
+}
+
+bool ValidateDeleteQueries(Context *context, GLint n, const GLuint *)
+{
+    return ValidateGenOrDeleteES3(context, n);
+}
+
+bool ValidateGenSamplers(Context *context, GLint count, GLuint *)
+{
+    return ValidateGenOrDeleteCountES3(context, count);
+}
+
+bool ValidateDeleteSamplers(Context *context, GLint count, const GLuint *)
+{
+    return ValidateGenOrDeleteCountES3(context, count);
+}
+
+bool ValidateGenTransformFeedbacks(Context *context, GLint n, GLuint *)
+{
+    return ValidateGenOrDeleteES3(context, n);
+}
+
+bool ValidateDeleteTransformFeedbacks(Context *context, GLint n, const GLuint *ids)
+{
+    if (!ValidateGenOrDeleteES3(context, n))
+    {
+        return false;
+    }
+    for (GLint i = 0; i &lt; n; ++i)
+    {
+        auto *transformFeedback = context-&gt;getTransformFeedback(ids[i]);
+        if (transformFeedback != nullptr &amp;&amp; transformFeedback-&gt;isActive())
+        {
+            // ES 3.0.4 section 2.15.1 page 86
+            context-&gt;recordError(
+                Error(GL_INVALID_OPERATION, &quot;Attempt to delete active transform feedback.&quot;));
+            return false;
+        }
+    }
+    return true;
+}
+
+bool ValidateGenVertexArrays(Context *context, GLint n, GLuint *)
+{
+    return ValidateGenOrDeleteES3(context, n);
+}
+
+bool ValidateDeleteVertexArrays(Context *context, GLint n, const GLuint *)
+{
+    return ValidateGenOrDeleteES3(context, n);
+}
+
+bool ValidateGenOrDeleteES3(Context *context, GLint n)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Context does not support GLES3.&quot;));
+        return false;
+    }
+    return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateGenOrDeleteCountES3(Context *context, GLint count)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Context does not support GLES3.&quot;));
+        return false;
+    }
+    if (count &lt; 0)
+    {
+        context-&gt;recordError(Error(GL_INVALID_VALUE, &quot;count &lt; 0&quot;));
+        return false;
+    }
+    return true;
+}
+
+bool ValidateBeginTransformFeedback(Context *context, GLenum primitiveMode)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Context does not support GLES3.&quot;));
+        return false;
+    }
+    switch (primitiveMode)
+    {
+        case GL_TRIANGLES:
+        case GL_LINES:
+        case GL_POINTS:
+            break;
+
+        default:
+            context-&gt;recordError(Error(GL_INVALID_ENUM, &quot;Invalid primitive mode.&quot;));
+            return false;
+    }
+
+    TransformFeedback *transformFeedback = context-&gt;getState().getCurrentTransformFeedback();
+    ASSERT(transformFeedback != nullptr);
+
+    if (transformFeedback-&gt;isActive())
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Transform feedback is already active.&quot;));
+        return false;
+    }
+    return true;
+}
+
+bool ValidateSamplerParameteri(Context *context, GLuint sampler, GLenum pname, GLint param)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Context does not support GLES3.&quot;));
+        return false;
+    }
+
+    if (!context-&gt;isSampler(sampler))
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    if (!ValidateSamplerObjectParameter(context, pname))
+    {
+        return false;
+    }
+
+    if (!ValidateTexParamParameters(context, pname, param))
+    {
+        return false;
+    }
+    return true;
+}
+
+bool ValidateSamplerParameterf(Context *context, GLuint sampler, GLenum pname, GLfloat param)
+{
+    // The only float parameters are MIN_LOD and MAX_LOD. For these any value is permissible, so
+    // ValidateSamplerParameteri can be used for validation here.
+    return ValidateSamplerParameteri(context, sampler, pname, static_cast&lt;GLint&gt;(param));
+}
+
+bool ValidateGetBufferPointerv(Context *context, GLenum target, GLenum pname, GLvoid **params)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Context does not support GLES3.&quot;));
+        return false;
+    }
+
+    return ValidateGetBufferPointervBase(context, target, pname, params);
+}
+
+bool ValidateUnmapBuffer(Context *context, GLenum target)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION));
+        return false;
+    }
+
+    return ValidateUnmapBufferBase(context, target);
+}
+
+bool ValidateMapBufferRange(Context *context,
+                            GLenum target,
+                            GLintptr offset,
+                            GLsizeiptr length,
+                            GLbitfield access)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Context does not support GLES3.&quot;));
+        return false;
+    }
+
+    return ValidateMapBufferRangeBase(context, target, offset, length, access);
+}
+
+bool ValidateFlushMappedBufferRange(Context *context,
+                                    GLenum target,
+                                    GLintptr offset,
+                                    GLsizeiptr length)
+{
+    if (context-&gt;getClientVersion() &lt; 3)
+    {
+        context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Context does not support GLES3.&quot;));
+        return false;
+    }
+
+    return ValidateFlushMappedBufferRangeBase(context, target, offset, length);
+}
+
+}  // namespace gl
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEvalidationES3h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -13,20 +13,143 @@
</span><span class="cx"> 
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><del>-
</del><span class="cx"> class Context;
</span><ins>+struct IndexRange;
+class ValidationContext;
</ins><span class="cx"> 
</span><del>-bool ValidateES3TexImageParameters(Context *context, GLenum target, GLint level, GLenum internalformat, bool isCompressed, bool isSubImage,
-                                   GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
-                                   GLint border, GLenum format, GLenum type, const GLvoid *pixels);
</del><ins>+bool ValidateES3TexImageParametersBase(ValidationContext *context,
+                                       GLenum target,
+                                       GLint level,
+                                       GLenum internalformat,
+                                       bool isCompressed,
+                                       bool isSubImage,
+                                       GLint xoffset,
+                                       GLint yoffset,
+                                       GLint zoffset,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLsizei depth,
+                                       GLint border,
+                                       GLenum format,
+                                       GLenum type,
+                                       const GLvoid *pixels);
</ins><span class="cx"> 
</span><del>-bool ValidateES3CopyTexImageParameters(Context *context, GLenum target, GLint level, GLenum internalformat,
-                                       bool isSubImage, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
-                                       GLsizei width, GLsizei height, GLint border);
</del><ins>+bool ValidateES3TexStorageParameters(Context *context,
+                                     GLenum target,
+                                     GLsizei levels,
+                                     GLenum internalformat,
+                                     GLsizei width,
+                                     GLsizei height,
+                                     GLsizei depth);
</ins><span class="cx"> 
</span><del>-bool ValidateES3TexStorageParameters(Context *context, GLenum target, GLsizei levels, GLenum internalformat,
-                                     GLsizei width, GLsizei height, GLsizei depth);
</del><ins>+bool ValidateES3TexImage2DParameters(Context *context,
+                                     GLenum target,
+                                     GLint level,
+                                     GLenum internalformat,
+                                     bool isCompressed,
+                                     bool isSubImage,
+                                     GLint xoffset,
+                                     GLint yoffset,
+                                     GLint zoffset,
+                                     GLsizei width,
+                                     GLsizei height,
+                                     GLsizei depth,
+                                     GLint border,
+                                     GLenum format,
+                                     GLenum type,
+                                     const GLvoid *pixels);
</ins><span class="cx"> 
</span><ins>+bool ValidateES3TexImage3DParameters(Context *context,
+                                     GLenum target,
+                                     GLint level,
+                                     GLenum internalformat,
+                                     bool isCompressed,
+                                     bool isSubImage,
+                                     GLint xoffset,
+                                     GLint yoffset,
+                                     GLint zoffset,
+                                     GLsizei width,
+                                     GLsizei height,
+                                     GLsizei depth,
+                                     GLint border,
+                                     GLenum format,
+                                     GLenum type,
+                                     const GLvoid *pixels);
+
+bool ValidateES3CopyTexImageParametersBase(ValidationContext *context,
+                                           GLenum target,
+                                           GLint level,
+                                           GLenum internalformat,
+                                           bool isSubImage,
+                                           GLint xoffset,
+                                           GLint yoffset,
+                                           GLint zoffset,
+                                           GLint x,
+                                           GLint y,
+                                           GLsizei width,
+                                           GLsizei height,
+                                           GLint border);
+
+bool ValidateES3CopyTexImage2DParameters(ValidationContext *context,
+                                         GLenum target,
+                                         GLint level,
+                                         GLenum internalformat,
+                                         bool isSubImage,
+                                         GLint xoffset,
+                                         GLint yoffset,
+                                         GLint zoffset,
+                                         GLint x,
+                                         GLint y,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLint border);
+
+bool ValidateES3CopyTexImage3DParameters(ValidationContext *context,
+                                         GLenum target,
+                                         GLint level,
+                                         GLenum internalformat,
+                                         bool isSubImage,
+                                         GLint xoffset,
+                                         GLint yoffset,
+                                         GLint zoffset,
+                                         GLint x,
+                                         GLint y,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLint border);
+
+bool ValidateES3TexStorageParametersBase(Context *context,
+                                         GLenum target,
+                                         GLsizei levels,
+                                         GLenum internalformat,
+                                         GLsizei width,
+                                         GLsizei height,
+                                         GLsizei depth);
+
+bool ValidateES3TexStorage2DParameters(Context *context,
+                                       GLenum target,
+                                       GLsizei levels,
+                                       GLenum internalformat,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLsizei depth);
+
+bool ValidateES3TexStorage3DParameters(Context *context,
+                                       GLenum target,
+                                       GLsizei levels,
+                                       GLenum internalformat,
+                                       GLsizei width,
+                                       GLsizei height,
+                                       GLsizei depth);
+
+bool ValidateBeginQuery(Context *context, GLenum target, GLuint id);
+
+bool ValidateEndQuery(Context *context, GLenum target);
+
+bool ValidateGetQueryiv(Context *context, GLenum target, GLenum pname, GLint *params);
+
+bool ValidateGetQueryObjectuiv(Context *context, GLuint id, GLenum pname, GLuint *params);
+
</ins><span class="cx"> bool ValidateFramebufferTextureLayer(Context *context, GLenum target, GLenum attachment,
</span><span class="cx">                                      GLuint texture, GLint level, GLint layer);
</span><span class="cx"> 
</span><span class="lines">@@ -35,15 +158,154 @@
</span><span class="cx"> bool ValidateES3RenderbufferStorageParameters(Context *context, GLenum target, GLsizei samples,
</span><span class="cx">                                               GLenum internalformat, GLsizei width, GLsizei height);
</span><span class="cx"> 
</span><del>-bool ValidateInvalidateFramebufferParameters(Context *context, GLenum target, GLsizei numAttachments,
-                                             const GLenum* attachments);
</del><ins>+bool ValidateInvalidateFramebuffer(Context *context, GLenum target, GLsizei numAttachments,
+                                   const GLenum *attachments);
</ins><span class="cx"> 
</span><del>-bool ValidateClearBuffer(Context *context);
</del><ins>+bool ValidateClearBuffer(ValidationContext *context);
</ins><span class="cx"> 
</span><ins>+bool ValidateDrawRangeElements(Context *context,
+                               GLenum mode,
+                               GLuint start,
+                               GLuint end,
+                               GLsizei count,
+                               GLenum type,
+                               const GLvoid *indices,
+                               IndexRange *indexRange);
+
</ins><span class="cx"> bool ValidateGetUniformuiv(Context *context, GLuint program, GLint location, GLuint* params);
</span><span class="cx"> 
</span><span class="cx"> bool ValidateReadBuffer(Context *context, GLenum mode);
</span><span class="cx"> 
</span><del>-}
</del><ins>+bool ValidateCompressedTexImage3D(Context *context,
+                                  GLenum target,
+                                  GLint level,
+                                  GLenum internalformat,
+                                  GLsizei width,
+                                  GLsizei height,
+                                  GLsizei depth,
+                                  GLint border,
+                                  GLsizei imageSize,
+                                  const GLvoid *data);
</ins><span class="cx"> 
</span><ins>+bool ValidateBindVertexArray(Context *context, GLuint array);
+bool ValidateIsVertexArray(Context *context);
+
+bool ValidateProgramBinary(Context *context,
+                           GLuint program,
+                           GLenum binaryFormat,
+                           const void *binary,
+                           GLint length);
+bool ValidateGetProgramBinary(Context *context,
+                              GLuint program,
+                              GLsizei bufSize,
+                              GLsizei *length,
+                              GLenum *binaryFormat,
+                              void *binary);
+bool ValidateProgramParameteri(Context *context, GLuint program, GLenum pname, GLint value);
+bool ValidateBlitFramebuffer(Context *context,
+                             GLint srcX0,
+                             GLint srcY0,
+                             GLint srcX1,
+                             GLint srcY1,
+                             GLint dstX0,
+                             GLint dstY0,
+                             GLint dstX1,
+                             GLint dstY1,
+                             GLbitfield mask,
+                             GLenum filter);
+bool ValidateClearBufferiv(ValidationContext *context,
+                           GLenum buffer,
+                           GLint drawbuffer,
+                           const GLint *value);
+bool ValidateClearBufferuiv(ValidationContext *context,
+                            GLenum buffer,
+                            GLint drawbuffer,
+                            const GLuint *value);
+bool ValidateClearBufferfv(ValidationContext *context,
+                           GLenum buffer,
+                           GLint drawbuffer,
+                           const GLfloat *value);
+bool ValidateClearBufferfi(ValidationContext *context,
+                           GLenum buffer,
+                           GLint drawbuffer,
+                           GLfloat depth,
+                           GLint stencil);
+bool ValidateDrawBuffers(ValidationContext *context, GLsizei n, const GLenum *bufs);
+bool ValidateCopyTexSubImage3D(Context *context,
+                               GLenum target,
+                               GLint level,
+                               GLint xoffset,
+                               GLint yoffset,
+                               GLint zoffset,
+                               GLint x,
+                               GLint y,
+                               GLsizei width,
+                               GLsizei height);
+bool ValidateTexImage3D(Context *context,
+                        GLenum target,
+                        GLint level,
+                        GLint internalformat,
+                        GLsizei width,
+                        GLsizei height,
+                        GLsizei depth,
+                        GLint border,
+                        GLenum format,
+                        GLenum type,
+                        const GLvoid *pixels);
+bool ValidateTexSubImage3D(Context *context,
+                           GLenum target,
+                           GLint level,
+                           GLint xoffset,
+                           GLint yoffset,
+                           GLint zoffset,
+                           GLsizei width,
+                           GLsizei height,
+                           GLsizei depth,
+                           GLenum format,
+                           GLenum type,
+                           const GLvoid *pixels);
+bool ValidateCompressedTexSubImage3D(Context *context,
+                                     GLenum target,
+                                     GLint level,
+                                     GLint xoffset,
+                                     GLint yoffset,
+                                     GLint zoffset,
+                                     GLsizei width,
+                                     GLsizei height,
+                                     GLsizei depth,
+                                     GLenum format,
+                                     GLsizei imageSize,
+                                     const GLvoid *data);
+
+bool ValidateGenQueries(Context *context, GLint n, GLuint *ids);
+bool ValidateDeleteQueries(Context *context, GLint n, const GLuint *ids);
+bool ValidateGenSamplers(Context *context, GLint count, GLuint *samplers);
+bool ValidateDeleteSamplers(Context *context, GLint count, const GLuint *samplers);
+bool ValidateGenTransformFeedbacks(Context *context, GLint n, GLuint *ids);
+bool ValidateDeleteTransformFeedbacks(Context *context, GLint n, const GLuint *ids);
+bool ValidateGenVertexArrays(Context *context, GLint n, GLuint *arrays);
+bool ValidateDeleteVertexArrays(Context *context, GLint n, const GLuint *arrays);
+
+bool ValidateGenOrDeleteES3(Context *context, GLint n);
+bool ValidateGenOrDeleteCountES3(Context *context, GLint count);
+
+bool ValidateBeginTransformFeedback(Context *context, GLenum primitiveMode);
+
+bool ValidateSamplerParameteri(Context *context, GLuint sampler, GLenum pname, GLint param);
+bool ValidateSamplerParameterf(Context *context, GLuint sampler, GLenum pname, GLfloat param);
+
+bool ValidateGetBufferPointerv(Context *context, GLenum target, GLenum pname, GLvoid **params);
+bool ValidateUnmapBuffer(Context *context, GLenum target);
+bool ValidateMapBufferRange(Context *context,
+                            GLenum target,
+                            GLintptr offset,
+                            GLsizeiptr length,
+                            GLbitfield access);
+bool ValidateFlushMappedBufferRange(Context *context,
+                                    GLenum target,
+                                    GLintptr offset,
+                                    GLsizeiptr length);
+
+}  // namespace gl
+
</ins><span class="cx"> #endif // LIBANGLE_VALIDATION_ES3_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibANGLEvalidationES_unittestcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES_unittest.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES_unittest.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/src/libANGLE/validationES_unittest.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,142 @@
</span><ins>+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// validationES unit tests:
+//   Unit tests for general ES validation functions.
+//
+
+#include &lt;gmock/gmock.h&gt;
+#include &lt;gtest/gtest.h&gt;
+
+#include &quot;libANGLE/Data.h&quot;
+#include &quot;libANGLE/renderer/FramebufferImpl_mock.h&quot;
+#include &quot;libANGLE/renderer/ProgramImpl_mock.h&quot;
+#include &quot;libANGLE/renderer/TextureImpl_mock.h&quot;
+#include &quot;libANGLE/validationES.h&quot;
+#include &quot;tests/angle_unittests_utils.h&quot;
+
+using namespace gl;
+using namespace rx;
+using testing::_;
+using testing::NiceMock;
+using testing::Return;
+
+namespace
+{
+
+class MockFactory : public NullFactory
+{
+  public:
+    MOCK_METHOD1(createFramebuffer, FramebufferImpl *(const gl::Framebuffer::Data &amp;));
+    MOCK_METHOD1(createProgram, ProgramImpl *(const gl::Program::Data &amp;));
+    MOCK_METHOD1(createVertexArray, VertexArrayImpl *(const gl::VertexArray::Data &amp;));
+};
+
+class MockValidationContext : public ValidationContext
+{
+  public:
+    MockValidationContext(GLint clientVersion,
+                          const State &amp;state,
+                          const Caps &amp;caps,
+                          const TextureCapsMap &amp;textureCaps,
+                          const Extensions &amp;extensions,
+                          const ResourceManager *resourceManager,
+                          const Limitations &amp;limitations,
+                          bool skipValidation);
+
+    MOCK_METHOD1(recordError, void(const Error &amp;));
+};
+
+MockValidationContext::MockValidationContext(GLint clientVersion,
+                                             const State &amp;state,
+                                             const Caps &amp;caps,
+                                             const TextureCapsMap &amp;textureCaps,
+                                             const Extensions &amp;extensions,
+                                             const ResourceManager *resourceManager,
+                                             const Limitations &amp;limitations,
+                                             bool skipValidation)
+    : ValidationContext(clientVersion,
+                        state,
+                        caps,
+                        textureCaps,
+                        extensions,
+                        resourceManager,
+                        limitations,
+                        skipValidation)
+{
+}
+
+// Test that ANGLE generates an INVALID_OPERATION when validating index data that uses a value
+// larger than MAX_ELEMENT_INDEX. Not specified in the GLES 3 spec, it's undefined behaviour,
+// but we want a test to ensure we maintain this behaviour.
+TEST(ValidationESTest, DrawElementsWithMaxIndexGivesError)
+{
+    auto framebufferImpl = MakeFramebufferMock();
+    auto programImpl     = MakeProgramMock();
+
+    // TODO(jmadill): Generalize some of this code so we can re-use it for other tests.
+    NiceMock&lt;MockFactory&gt; mockFactory;
+    EXPECT_CALL(mockFactory, createFramebuffer(_)).WillOnce(Return(framebufferImpl));
+    EXPECT_CALL(mockFactory, createProgram(_)).WillOnce(Return(programImpl));
+    EXPECT_CALL(mockFactory, createVertexArray(_)).WillOnce(Return(nullptr));
+
+    State state;
+    Caps caps;
+    TextureCapsMap textureCaps;
+    Extensions extensions;
+    Limitations limitations;
+
+    // Set some basic caps.
+    caps.maxElementIndex     = 100;
+    caps.maxDrawBuffers      = 1;
+    caps.maxColorAttachments = 1;
+    state.initialize(caps, extensions, 3, false);
+
+    NiceMock&lt;MockTextureImpl&gt; *textureImpl = new NiceMock&lt;MockTextureImpl&gt;();
+    EXPECT_CALL(*textureImpl, setStorage(_, _, _, _)).WillOnce(Return(Error(GL_NO_ERROR)));
+    EXPECT_CALL(*textureImpl, destructor()).Times(1).RetiresOnSaturation();
+
+    Texture *texture = new Texture(textureImpl, 0, GL_TEXTURE_2D);
+    texture-&gt;addRef();
+    texture-&gt;setStorage(GL_TEXTURE_2D, 1, GL_RGBA8, Extents(1, 1, 0));
+
+    VertexArray *vertexArray = new VertexArray(&amp;mockFactory, 0, 1);
+    Framebuffer *framebuffer = new Framebuffer(caps, &amp;mockFactory, 1);
+    framebuffer-&gt;setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_BACK, ImageIndex::Make2D(0), texture);
+
+    Program *program = new Program(&amp;mockFactory, nullptr, 1);
+
+    state.setVertexArrayBinding(vertexArray);
+    state.setDrawFramebufferBinding(framebuffer);
+    state.setProgram(program);
+
+    NiceMock&lt;MockValidationContext&gt; testContext(3, state, caps, textureCaps, extensions, nullptr,
+                                                limitations, false);
+
+    // Set the expectation for the validation error here.
+    Error expectedError(GL_INVALID_OPERATION, g_ExceedsMaxElementErrorMessage);
+    EXPECT_CALL(testContext, recordError(expectedError)).Times(1);
+
+    // Call once with maximum index, and once with an excessive index.
+    GLuint indexData[] = {0, 1, static_cast&lt;GLuint&gt;(caps.maxElementIndex - 1),
+                          3, 4, static_cast&lt;GLuint&gt;(caps.maxElementIndex)};
+    IndexRange indexRange;
+    EXPECT_TRUE(ValidateDrawElements(&amp;testContext, GL_TRIANGLES, 3, GL_UNSIGNED_INT, indexData, 1,
+                                     &amp;indexRange));
+    EXPECT_FALSE(ValidateDrawElements(&amp;testContext, GL_TRIANGLES, 6, GL_UNSIGNED_INT, indexData, 2,
+                                      &amp;indexRange));
+
+    texture-&gt;release();
+
+    state.setVertexArrayBinding(nullptr);
+    state.setDrawFramebufferBinding(nullptr);
+    state.setProgram(nullptr);
+
+    SafeDelete(vertexArray);
+    SafeDelete(framebuffer);
+    SafeDelete(program);
+}
+
+}  // anonymous namespace
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibEGLlibEGLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -257,9 +257,105 @@
</span><span class="cx">     return egl::QueryDeviceStringEXT(device, name);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy,
+                                          EGLContext ctx,
+                                          EGLenum target,
+                                          EGLClientBuffer buffer,
+                                          const EGLint *attrib_list)
+{
+    return egl::CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
+{
+    return egl::DestroyImageKHR(dpy, image);
+}
+
+EGLDeviceEXT EGLAPIENTRY eglCreateDeviceANGLE(EGLint device_type,
+                                              void *native_device,
+                                              const EGLAttrib *attrib_list)
+{
+    return egl::CreateDeviceANGLE(device_type, native_device, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglReleaseDeviceANGLE(EGLDeviceEXT device)
+{
+    return egl::ReleaseDeviceANGLE(device);
+}
+
</ins><span class="cx"> __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
</span><span class="cx"> {
</span><span class="cx">     return egl::GetProcAddress(procname);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list)
+{
+    return egl::CreateStreamKHR(dpy, attrib_list);
</ins><span class="cx"> }
</span><ins>+
+EGLBoolean EGLAPIENTRY eglDestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    return egl::DestroyStreamKHR(dpy, stream);
+}
+
+EGLBoolean EGLAPIENTRY eglStreamAttribKHR(EGLDisplay dpy,
+                                          EGLStreamKHR stream,
+                                          EGLenum attribute,
+                                          EGLint value)
+{
+    return egl::StreamAttribKHR(dpy, stream, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY eglQueryStreamKHR(EGLDisplay dpy,
+                                         EGLStreamKHR stream,
+                                         EGLenum attribute,
+                                         EGLint *value)
+{
+    return egl::QueryStreamKHR(dpy, stream, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR(EGLDisplay dpy,
+                                            EGLStreamKHR stream,
+                                            EGLenum attribute,
+                                            EGLuint64KHR *value)
+{
+    return egl::QueryStreamu64KHR(dpy, stream, attribute, value);
+}
+
+EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    return egl::StreamConsumerGLTextureExternalKHR(dpy, stream);
+}
+
+EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    return egl::StreamConsumerAcquireKHR(dpy, stream);
+}
+
+EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    return egl::StreamConsumerReleaseKHR(dpy, stream);
+}
+
+EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
+                                                                   EGLStreamKHR stream,
+                                                                   EGLAttrib *attrib_list)
+{
+    return egl::StreamConsumerGLTextureExternalAttribsNV(dpy, stream, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglCreateStreamProducerD3DTextureNV12ANGLE(EGLDisplay dpy,
+                                                                  EGLStreamKHR stream,
+                                                                  const EGLAttrib *attrib_list)
+{
+    return egl::CreateStreamProducerD3DTextureNV12ANGLE(dpy, stream, attrib_list);
+}
+
+EGLBoolean EGLAPIENTRY eglStreamPostD3DTextureNV12ANGLE(EGLDisplay dpy,
+                                                        EGLStreamKHR stream,
+                                                        void *texture,
+                                                        const EGLAttrib *attrib_list)
+{
+    return egl::StreamPostD3DTextureNV12ANGLE(dpy, stream, texture, attrib_list);
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibEGLlibEGLdef"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.def (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.def        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.def        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,56 +1,71 @@
</span><span class="cx"> LIBRARY libEGL
</span><span class="cx"> EXPORTS
</span><del>-    eglBindAPI                       @14
-    eglBindTexImage                  @20
-    eglChooseConfig                  @7
-    eglCopyBuffers                   @33
-    eglCreateContext                 @23
-    eglCreatePbufferFromClientBuffer @18
-    eglCreatePbufferSurface          @10
-    eglCreatePixmapSurface           @11
-    eglCreateWindowSurface           @9
-    eglDestroyContext                @24
-    eglDestroySurface                @12
-    eglGetConfigAttrib               @8
-    eglGetConfigs                    @6
-    eglGetCurrentContext             @26
-    eglGetCurrentDisplay             @28
-    eglGetCurrentSurface             @27
-    eglGetDisplay                    @2
-    eglGetError                      @1
-    eglGetProcAddress                @34
-    eglInitialize                    @3
-    eglMakeCurrent                   @25
-    eglQueryAPI                      @15
-    eglQueryContext                  @29
-    eglQueryString                   @5
-    eglQuerySurface                  @13
-    eglReleaseTexImage               @21
-    eglReleaseThread                 @17
-    eglSurfaceAttrib                 @19
-    eglSwapBuffers                   @32
-    eglSwapInterval                  @22
-    eglTerminate                     @4
-    eglWaitClient                    @16
-    eglWaitGL                        @30
-    eglWaitNative                    @31
</del><ins>+    eglBindAPI                                  @14
+    eglBindTexImage                             @20
+    eglChooseConfig                             @7
+    eglCopyBuffers                              @33
+    eglCreateContext                            @23
+    eglCreatePbufferFromClientBuffer            @18
+    eglCreatePbufferSurface                     @10
+    eglCreatePixmapSurface                      @11
+    eglCreateWindowSurface                      @9
+    eglDestroyContext                           @24
+    eglDestroySurface                           @12
+    eglGetConfigAttrib                          @8
+    eglGetConfigs                               @6
+    eglGetCurrentContext                        @26
+    eglGetCurrentDisplay                        @28
+    eglGetCurrentSurface                        @27
+    eglGetDisplay                               @2
+    eglGetError                                 @1
+    eglGetProcAddress                           @34
+    eglInitialize                               @3
+    eglMakeCurrent                              @25
+    eglQueryAPI                                 @15
+    eglQueryContext                             @29
+    eglQueryString                              @5
+    eglQuerySurface                             @13
+    eglReleaseTexImage                          @21
+    eglReleaseThread                            @17
+    eglSurfaceAttrib                            @19
+    eglSwapBuffers                              @32
+    eglSwapInterval                             @22
+    eglTerminate                                @4
+    eglWaitClient                               @16
+    eglWaitGL                                   @30
+    eglWaitNative                               @31
</ins><span class="cx"> 
</span><span class="cx">     ; Extensions
</span><del>-    eglGetPlatformDisplayEXT         @35
-    eglQuerySurfacePointerANGLE      @36
-    eglPostSubBufferNV               @37
-    eglQueryDisplayAttribEXT         @48
-    eglQueryDeviceAttribEXT          @49
-    eglQueryDeviceStringEXT          @50
</del><ins>+    eglGetPlatformDisplayEXT                    @35
+    eglQuerySurfacePointerANGLE                 @36
+    eglPostSubBufferNV                          @37
+    eglQueryDisplayAttribEXT                    @48
+    eglQueryDeviceAttribEXT                     @49
+    eglQueryDeviceStringEXT                     @50
+    eglCreateImageKHR                           @51
+    eglDestroyImageKHR                          @52
+    eglCreateDeviceANGLE                        @53
+    eglReleaseDeviceANGLE                       @54
+    eglCreateStreamKHR                          @55
+    eglDestroyStreamKHR                         @56
+    eglStreamAttribKHR                          @57
+    eglQueryStreamKHR                           @58
+    eglQueryStreamu64KHR                        @59
+    eglStreamConsumerGLTextureExternalKHR       @60
+    eglStreamConsumerAcquireKHR                 @61
+    eglStreamConsumerReleaseKHR                 @62
+    eglStreamConsumerGLTextureExternalAttribsNV @63
+    eglCreateStreamProducerD3DTextureNV12ANGLE  @64
+    eglStreamPostD3DTextureNV12ANGLE            @65
</ins><span class="cx"> 
</span><span class="cx">     ; 1.5 entry points
</span><del>-    eglCreateSync                    @38
-    eglDestroySync                   @39
-    eglClientWaitSync                @40
-    eglGetSyncAttrib                 @41
-    eglCreateImage                   @42
-    eglDestroyImage                  @43
-    eglGetPlatformDisplay            @44
-    eglCreatePlatformWindowSurface   @45
-    eglCreatePlatformPixmapSurface   @46
-    eglWaitSync                      @47
</del><ins>+    eglCreateSync                               @38
+    eglDestroySync                              @39
+    eglClientWaitSync                           @40
+    eglGetSyncAttrib                            @41
+    eglCreateImage                              @42
+    eglDestroyImage                             @43
+    eglGetPlatformDisplay                       @44
+    eglCreatePlatformWindowSurface              @45
+    eglCreatePlatformPixmapSurface              @46
+    eglWaitSync                                 @47
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibEGLlibEGLrc"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.rc (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.rc        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libEGL/libEGL.rc        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -54,8 +54,8 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> VS_VERSION_INFO VERSIONINFO
</span><del>- FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,0,0
- PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,0,0
</del><ins>+ FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
+ PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
</ins><span class="cx">  FILEFLAGSMASK 0x17L
</span><span class="cx"> #ifdef _DEBUG
</span><span class="cx">  FILEFLAGS 0x1L
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibEGLgypi"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libEGL.gypi (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libEGL.gypi        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libEGL.gypi        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -5,13 +5,24 @@
</span><span class="cx"> {
</span><span class="cx">     # Everything below this is duplicated in the GN build. If you change
</span><span class="cx">     # anything also change angle/BUILD.gn
</span><ins>+    'variables':
+    {
+        'angle_standalone%': 0,
+    },
</ins><span class="cx">     'targets':
</span><span class="cx">     [
</span><span class="cx">         {
</span><span class="cx">             'target_name': 'libEGL',
</span><del>-            'type': 'shared_library',
-            'dependencies': [ 'libGLESv2', ],
-            'includes': [ '../build/common_defines.gypi', ],
</del><ins>+            'type': '&lt;(angle_gl_library_type)',
+            'dependencies':
+            [
+                'libANGLE',
+                'libGLESv2',
+            ],
+            'includes':
+            [
+                '../build/common_defines.gypi',
+            ],
</ins><span class="cx">             'include_dirs':
</span><span class="cx">             [
</span><span class="cx">                 '.',
</span><span class="lines">@@ -21,32 +32,12 @@
</span><span class="cx">             [
</span><span class="cx">                 '&lt;@(libegl_sources)',
</span><span class="cx">             ],
</span><del>-            'defines':
-            [
-                'GL_APICALL=',
-                'GL_GLEXT_PROTOTYPES=',
-                'EGLAPI=',
-                'LIBEGL_IMPLEMENTATION',
-            ],
</del><span class="cx">             'conditions':
</span><span class="cx">             [
</span><span class="cx">                 ['angle_build_winrt==1',
</span><span class="cx">                 {
</span><del>-                    'msvs_enable_winrt' : '1',
</del><span class="cx">                     'msvs_requires_importlibrary' : 'true',
</span><del>-                    'msvs_settings':
-                    {
-                        'VCLinkerTool':
-                        {
-                            'EnableCOMDATFolding': '1',
-                            'OptimizeReferences': '1',
-                        }
-                    },
</del><span class="cx">                 }],
</span><del>-                ['angle_build_winphone==1',
-                {
-                    'msvs_enable_winphone' : '1',
-                }],
</del><span class="cx">             ],
</span><span class="cx">         },
</span><span class="cx">     ],
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_eglcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,8 +8,9 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libGLESv2/entry_points_egl.h&quot;
</span><span class="cx"> #include &quot;libGLESv2/entry_points_egl_ext.h&quot;
</span><ins>+#include &quot;libGLESv2/entry_points_gles_2_0.h&quot;
</ins><span class="cx"> #include &quot;libGLESv2/entry_points_gles_2_0_ext.h&quot;
</span><del>-#include &quot;libGLESv2/entry_points_gles_3_0_ext.h&quot;
</del><ins>+#include &quot;libGLESv2/entry_points_gles_3_0.h&quot;
</ins><span class="cx"> #include &quot;libGLESv2/global_state.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;libANGLE/Context.h&quot;
</span><span class="lines">@@ -40,7 +41,7 @@
</span><span class="cx"> {
</span><span class="cx">     EVENT(&quot;(EGLNativeDisplayType display_id = 0x%0.8p)&quot;, display_id);
</span><span class="cx"> 
</span><del>-    return Display::getDisplay(display_id, AttributeMap());
</del><ins>+    return Display::GetDisplayFromAttribs(reinterpret_cast&lt;void *&gt;(display_id), AttributeMap());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EGLBoolean EGLAPIENTRY Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
</span><span class="lines">@@ -48,14 +49,13 @@
</span><span class="cx">     EVENT(&quot;(EGLDisplay dpy = 0x%0.8p, EGLint *major = 0x%0.8p, EGLint *minor = 0x%0.8p)&quot;,
</span><span class="cx">           dpy, major, minor);
</span><span class="cx"> 
</span><del>-    if (dpy == EGL_NO_DISPLAY)
</del><ins>+    Display *display = static_cast&lt;Display *&gt;(dpy);
+    if (dpy == EGL_NO_DISPLAY || !Display::isValidDisplay(display))
</ins><span class="cx">     {
</span><span class="cx">         SetGlobalError(Error(EGL_BAD_DISPLAY));
</span><span class="cx">         return EGL_FALSE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    Display *display = static_cast&lt;Display*&gt;(dpy);
-
</del><span class="cx">     Error error = display-&gt;initialize();
</span><span class="cx">     if (error.isError())
</span><span class="cx">     {
</span><span class="lines">@@ -74,13 +74,13 @@
</span><span class="cx"> {
</span><span class="cx">     EVENT(&quot;(EGLDisplay dpy = 0x%0.8p)&quot;, dpy);
</span><span class="cx"> 
</span><del>-    if (dpy == EGL_NO_DISPLAY)
</del><ins>+    Display *display = static_cast&lt;Display *&gt;(dpy);
+    if (dpy == EGL_NO_DISPLAY || !Display::isValidDisplay(display))
</ins><span class="cx">     {
</span><span class="cx">         SetGlobalError(Error(EGL_BAD_DISPLAY));
</span><span class="cx">         return EGL_FALSE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    Display *display = static_cast&lt;Display*&gt;(dpy);
</del><span class="cx">     gl::Context *context = GetGlobalContext();
</span><span class="cx"> 
</span><span class="cx">     if (display-&gt;isValidContext(context))
</span><span class="lines">@@ -171,7 +171,7 @@
</span><span class="cx">             configs[i] = const_cast&lt;Config*&gt;(filteredConfigs[i]);
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    *num_config = filteredConfigs.size();
</del><ins>+    *num_config = static_cast&lt;EGLint&gt;(filteredConfigs.size());
</ins><span class="cx"> 
</span><span class="cx">     SetGlobalError(Error(EGL_SUCCESS));
</span><span class="cx">     return EGL_TRUE;
</span><span class="lines">@@ -198,7 +198,8 @@
</span><span class="cx">         return EGL_FALSE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    std::vector&lt;const Config*&gt; filteredConfigs = display-&gt;getConfigs(AttributeMap(attrib_list));
</del><ins>+    std::vector&lt;const Config *&gt; filteredConfigs =
+        display-&gt;getConfigs(AttributeMap::CreateFromIntArray(attrib_list));
</ins><span class="cx">     if (configs)
</span><span class="cx">     {
</span><span class="cx">         filteredConfigs.resize(std::min&lt;size_t&gt;(filteredConfigs.size(), config_size));
</span><span class="lines">@@ -207,7 +208,7 @@
</span><span class="cx">             configs[i] = const_cast&lt;Config*&gt;(filteredConfigs[i]);
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    *num_config = filteredConfigs.size();
</del><ins>+    *num_config = static_cast&lt;EGLint&gt;(filteredConfigs.size());
</ins><span class="cx"> 
</span><span class="cx">     SetGlobalError(Error(EGL_SUCCESS));
</span><span class="cx">     return EGL_TRUE;
</span><span class="lines">@@ -245,7 +246,7 @@
</span><span class="cx"> 
</span><span class="cx">     Display *display = static_cast&lt;Display*&gt;(dpy);
</span><span class="cx">     Config *configuration = static_cast&lt;Config*&gt;(config);
</span><del>-    AttributeMap attributes(attrib_list);
</del><ins>+    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
</ins><span class="cx"> 
</span><span class="cx">     Error error = ValidateCreateWindowSurface(display, configuration, win, attributes);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -272,7 +273,7 @@
</span><span class="cx"> 
</span><span class="cx">     Display *display = static_cast&lt;Display*&gt;(dpy);
</span><span class="cx">     Config *configuration = static_cast&lt;Config*&gt;(config);
</span><del>-    AttributeMap attributes(attrib_list);
</del><ins>+    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
</ins><span class="cx"> 
</span><span class="cx">     Error error = ValidateCreatePbufferSurface(display, configuration, attributes);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -426,6 +427,37 @@
</span><span class="cx">         }
</span><span class="cx">         *value = eglSurface-&gt;isFixedSize();
</span><span class="cx">         break;
</span><ins>+      case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
+          if (!display-&gt;getExtensions().flexibleSurfaceCompatibility)
+          {
+              SetGlobalError(
+                  Error(EGL_BAD_ATTRIBUTE,
+                        &quot;EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE cannot be used without &quot;
+                        &quot;EGL_ANGLE_flexible_surface_compatibility support.&quot;));
+              return EGL_FALSE;
+          }
+          *value = eglSurface-&gt;flexibleSurfaceCompatibilityRequested();
+          break;
+      case EGL_SURFACE_ORIENTATION_ANGLE:
+          if (!display-&gt;getExtensions().surfaceOrientation)
+          {
+              SetGlobalError(Error(EGL_BAD_ATTRIBUTE,
+                                   &quot;EGL_SURFACE_ORIENTATION_ANGLE cannot be queried without &quot;
+                                   &quot;EGL_ANGLE_surface_orientation support.&quot;));
+              return EGL_FALSE;
+          }
+          *value = eglSurface-&gt;getOrientation();
+          break;
+      case EGL_DIRECT_COMPOSITION_ANGLE:
+          if (!display-&gt;getExtensions().directComposition)
+          {
+              SetGlobalError(Error(EGL_BAD_ATTRIBUTE,
+                                   &quot;EGL_DIRECT_COMPOSITION_ANGLE cannot be used without &quot;
+                                   &quot;EGL_ANGLE_direct_composition support.&quot;));
+              return EGL_FALSE;
+          }
+          *value = eglSurface-&gt;directComposition();
+          break;
</ins><span class="cx">       default:
</span><span class="cx">         SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
</span><span class="cx">         return EGL_FALSE;
</span><span class="lines">@@ -443,7 +475,7 @@
</span><span class="cx">     Display *display = static_cast&lt;Display*&gt;(dpy);
</span><span class="cx">     Config *configuration = static_cast&lt;Config*&gt;(config);
</span><span class="cx">     gl::Context* sharedGLContext = static_cast&lt;gl::Context*&gt;(share_context);
</span><del>-    AttributeMap attributes(attrib_list);
</del><ins>+    AttributeMap attributes      = AttributeMap::CreateFromIntArray(attrib_list);
</ins><span class="cx"> 
</span><span class="cx">     Error error = ValidateCreateContext(display, configuration, sharedGLContext, attributes);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -504,23 +536,37 @@
</span><span class="cx">     Display *display = static_cast&lt;Display*&gt;(dpy);
</span><span class="cx">     gl::Context *context = static_cast&lt;gl::Context*&gt;(ctx);
</span><span class="cx"> 
</span><del>-    bool noContext = (ctx == EGL_NO_CONTEXT);
-    bool noSurface = (draw == EGL_NO_SURFACE || read == EGL_NO_SURFACE);
-    if (noContext != noSurface)
</del><ins>+    // If ctx is EGL_NO_CONTEXT and either draw or read are not EGL_NO_SURFACE, an EGL_BAD_MATCH
+    // error is generated.
+    if (ctx == EGL_NO_CONTEXT &amp;&amp; (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE))
</ins><span class="cx">     {
</span><span class="cx">         SetGlobalError(Error(EGL_BAD_MATCH));
</span><span class="cx">         return EGL_FALSE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (dpy == EGL_NO_DISPLAY)
</del><ins>+    if (ctx != EGL_NO_CONTEXT &amp;&amp; draw == EGL_NO_SURFACE &amp;&amp; read == EGL_NO_SURFACE)
</ins><span class="cx">     {
</span><ins>+        SetGlobalError(Error(EGL_BAD_MATCH));
+        return EGL_FALSE;
+    }
+
+    // If either of draw or read is a valid surface and the other is EGL_NO_SURFACE, an
+    // EGL_BAD_MATCH error is generated.
+    if ((read == EGL_NO_SURFACE) != (draw == EGL_NO_SURFACE))
+    {
+        SetGlobalError(Error(
+            EGL_BAD_MATCH, &quot;read and draw must both be valid surfaces, or both be EGL_NO_SURFACE&quot;));
+        return EGL_FALSE;
+    }
+
+    if (dpy == EGL_NO_DISPLAY || !Display::isValidDisplay(display))
+    {
</ins><span class="cx">         SetGlobalError(Error(EGL_BAD_DISPLAY, &quot;'dpy' not a valid EGLDisplay handle&quot;));
</span><span class="cx">         return EGL_FALSE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // EGL 1.5 spec: dpy can be uninitialized if all other parameters are null
</span><del>-    if (dpy != EGL_NO_DISPLAY &amp;&amp; !display-&gt;isInitialized() &amp;&amp;
-        (ctx != EGL_NO_CONTEXT || draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE))
</del><ins>+    if (!display-&gt;isInitialized() &amp;&amp; (ctx != EGL_NO_CONTEXT || draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE))
</ins><span class="cx">     {
</span><span class="cx">         SetGlobalError(Error(EGL_NOT_INITIALIZED, &quot;'dpy' not initialized&quot;));
</span><span class="cx">         return EGL_FALSE;
</span><span class="lines">@@ -536,7 +582,7 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (dpy != EGL_NO_DISPLAY &amp;&amp; display-&gt;isInitialized())
</del><ins>+    if (display-&gt;isInitialized())
</ins><span class="cx">     {
</span><span class="cx">         if (display-&gt;testDeviceLost())
</span><span class="cx">         {
</span><span class="lines">@@ -573,11 +619,42 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (readSurface)
+    {
+        Error readCompatError =
+            ValidateCompatibleConfigs(display, readSurface-&gt;getConfig(), readSurface,
+                                      context-&gt;getConfig(), readSurface-&gt;getType());
+        if (readCompatError.isError())
+        {
+            SetGlobalError(readCompatError);
+            return EGL_FALSE;
+        }
+    }
+
</ins><span class="cx">     if (draw != read)
</span><span class="cx">     {
</span><span class="cx">         UNIMPLEMENTED();   // FIXME
</span><ins>+
+        if (drawSurface)
+        {
+            Error drawCompatError =
+                ValidateCompatibleConfigs(display, drawSurface-&gt;getConfig(), drawSurface,
+                                          context-&gt;getConfig(), drawSurface-&gt;getType());
+            if (drawCompatError.isError())
+            {
+                SetGlobalError(drawCompatError);
+                return EGL_FALSE;
+            }
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    Error makeCurrentError = display-&gt;makeCurrent(drawSurface, readSurface, context);
+    if (makeCurrentError.isError())
+    {
+        SetGlobalError(makeCurrentError);
+        return EGL_FALSE;
+    }
+
</ins><span class="cx">     gl::Context *previousContext = GetGlobalContext();
</span><span class="cx"> 
</span><span class="cx">     SetGlobalDisplay(display);
</span><span class="lines">@@ -585,8 +662,6 @@
</span><span class="cx">     SetGlobalReadSurface(readSurface);
</span><span class="cx">     SetGlobalContext(context);
</span><span class="cx"> 
</span><del>-    display-&gt;makeCurrent(drawSurface, readSurface, context);
-
</del><span class="cx">     // Release the surface from the previously-current context, to allow
</span><span class="cx">     // destroyed surfaces to delete themselves.
</span><span class="cx">     if (previousContext != nullptr &amp;&amp; context != previousContext)
</span><span class="lines">@@ -647,7 +722,7 @@
</span><span class="cx">     switch (attribute)
</span><span class="cx">     {
</span><span class="cx">       case EGL_CONFIG_ID:
</span><del>-        *value = context-&gt;getConfigID();
</del><ins>+        *value = context-&gt;getConfig()-&gt;configID;
</ins><span class="cx">         break;
</span><span class="cx">       case EGL_CONTEXT_CLIENT_TYPE:
</span><span class="cx">         *value = context-&gt;getClientType();
</span><span class="lines">@@ -671,20 +746,56 @@
</span><span class="cx"> {
</span><span class="cx">     EVENT(&quot;()&quot;);
</span><span class="cx"> 
</span><del>-    UNIMPLEMENTED();   // FIXME
</del><ins>+    Display *display = GetGlobalDisplay();
</ins><span class="cx"> 
</span><ins>+    Error error = ValidateDisplay(display);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    // eglWaitGL like calling eglWaitClient with the OpenGL ES API bound. Since we only implement
+    // OpenGL ES we can do the call directly.
+    error = display-&gt;waitClient();
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
</ins><span class="cx">     SetGlobalError(Error(EGL_SUCCESS));
</span><del>-    return 0;
</del><ins>+    return EGL_TRUE;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EGLBoolean EGLAPIENTRY WaitNative(EGLint engine)
</span><span class="cx"> {
</span><span class="cx">     EVENT(&quot;(EGLint engine = %d)&quot;, engine);
</span><span class="cx"> 
</span><del>-    UNIMPLEMENTED();   // FIXME
</del><ins>+    Display *display = GetGlobalDisplay();
</ins><span class="cx"> 
</span><ins>+    Error error = ValidateDisplay(display);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    if (engine != EGL_CORE_NATIVE_ENGINE)
+    {
+        SetGlobalError(
+            Error(EGL_BAD_PARAMETER, &quot;the 'engine' parameter has an unrecognized value&quot;));
+    }
+
+    error = display-&gt;waitNative(engine, GetGlobalDrawSurface(), GetGlobalReadSurface());
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
</ins><span class="cx">     SetGlobalError(Error(EGL_SUCCESS));
</span><del>-    return 0;
</del><ins>+    return EGL_TRUE;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EGLBoolean EGLAPIENTRY SwapBuffers(EGLDisplay dpy, EGLSurface surface)
</span><span class="lines">@@ -795,13 +906,13 @@
</span><span class="cx">         gl::Texture *textureObject = context-&gt;getTargetTexture(GL_TEXTURE_2D);
</span><span class="cx">         ASSERT(textureObject != NULL);
</span><span class="cx"> 
</span><del>-        if (textureObject-&gt;isImmutable())
</del><ins>+        if (textureObject-&gt;getImmutableFormat())
</ins><span class="cx">         {
</span><span class="cx">             SetGlobalError(Error(EGL_BAD_MATCH));
</span><span class="cx">             return EGL_FALSE;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        egl::Error error = eglSurface-&gt;bindTexImage(textureObject, buffer);
</del><ins>+        error = eglSurface-&gt;bindTexImage(textureObject, buffer);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             SetGlobalError(error);
</span><span class="lines">@@ -870,7 +981,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (texture)
</span><span class="cx">     {
</span><del>-        egl::Error error = eglSurface-&gt;releaseTexImage(buffer);
</del><ins>+        error = eglSurface-&gt;releaseTexImage(buffer);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             SetGlobalError(error);
</span><span class="lines">@@ -955,7 +1066,7 @@
</span><span class="cx"> 
</span><span class="cx">     Display *display = static_cast&lt;Display*&gt;(dpy);
</span><span class="cx">     Config *configuration = static_cast&lt;Config*&gt;(config);
</span><del>-    AttributeMap attributes(attrib_list);
</del><ins>+    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
</ins><span class="cx"> 
</span><span class="cx">     Error error = ValidateCreatePbufferFromClientBuffer(display, buftype, buffer, configuration, attributes);
</span><span class="cx">     if (error.isError())
</span><span class="lines">@@ -989,10 +1100,24 @@
</span><span class="cx"> {
</span><span class="cx">     EVENT(&quot;()&quot;);
</span><span class="cx"> 
</span><del>-    UNIMPLEMENTED();   // FIXME
</del><ins>+    Display *display = GetGlobalDisplay();
</ins><span class="cx"> 
</span><ins>+    Error error = ValidateDisplay(display);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    error = display-&gt;waitClient();
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
</ins><span class="cx">     SetGlobalError(Error(EGL_SUCCESS));
</span><del>-    return 0;
</del><ins>+    return EGL_TRUE;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // EGL 1.4
</span><span class="lines">@@ -1096,65 +1221,458 @@
</span><span class="cx"> {
</span><span class="cx">     EVENT(&quot;(const char *procname = \&quot;%s\&quot;)&quot;, procname);
</span><span class="cx"> 
</span><del>-    struct Extension
</del><ins>+    typedef std::map&lt;std::string, __eglMustCastToProperFunctionPointerType&gt; ProcAddressMap;
+    auto generateProcAddressMap = []()
</ins><span class="cx">     {
</span><del>-        const char *name;
-        __eglMustCastToProperFunctionPointerType address;
-    };
</del><ins>+        ProcAddressMap map;
+#define INSERT_PROC_ADDRESS(ns, proc) \
+    map[#ns #proc] = reinterpret_cast&lt;__eglMustCastToProperFunctionPointerType&gt;(ns::proc)
</ins><span class="cx"> 
</span><del>-    static const Extension extensions[] =
-    {
-        { &quot;eglQueryDeviceAttribEXT&quot;, (__eglMustCastToProperFunctionPointerType)QueryDeviceAttribEXT },
-        { &quot;eglQueryDeviceStringEXT&quot;, (__eglMustCastToProperFunctionPointerType)QueryDeviceStringEXT },
-        { &quot;eglQueryDisplayAttribEXT&quot;, (__eglMustCastToProperFunctionPointerType)QueryDisplayAttribEXT },
-        { &quot;eglQuerySurfacePointerANGLE&quot;, (__eglMustCastToProperFunctionPointerType)QuerySurfacePointerANGLE },
-        { &quot;eglPostSubBufferNV&quot;, (__eglMustCastToProperFunctionPointerType)PostSubBufferNV },
-        { &quot;eglGetPlatformDisplayEXT&quot;, (__eglMustCastToProperFunctionPointerType)GetPlatformDisplayEXT },
-        { &quot;glBlitFramebufferANGLE&quot;, (__eglMustCastToProperFunctionPointerType)gl::BlitFramebufferANGLE },
-        { &quot;glRenderbufferStorageMultisampleANGLE&quot;, (__eglMustCastToProperFunctionPointerType)gl::RenderbufferStorageMultisampleANGLE },
-        { &quot;glDeleteFencesNV&quot;, (__eglMustCastToProperFunctionPointerType)gl::DeleteFencesNV },
-        { &quot;glGenFencesNV&quot;, (__eglMustCastToProperFunctionPointerType)gl::GenFencesNV },
-        { &quot;glIsFenceNV&quot;, (__eglMustCastToProperFunctionPointerType)gl::IsFenceNV },
-        { &quot;glTestFenceNV&quot;, (__eglMustCastToProperFunctionPointerType)gl::TestFenceNV },
-        { &quot;glGetFenceivNV&quot;, (__eglMustCastToProperFunctionPointerType)gl::GetFenceivNV },
-        { &quot;glFinishFenceNV&quot;, (__eglMustCastToProperFunctionPointerType)gl::FinishFenceNV },
-        { &quot;glSetFenceNV&quot;, (__eglMustCastToProperFunctionPointerType)gl::SetFenceNV },
-        { &quot;glGetTranslatedShaderSourceANGLE&quot;, (__eglMustCastToProperFunctionPointerType)gl::GetTranslatedShaderSourceANGLE },
-        { &quot;glTexStorage2DEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::TexStorage2DEXT },
-        { &quot;glGetGraphicsResetStatusEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::GetGraphicsResetStatusEXT },
-        { &quot;glReadnPixelsEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::ReadnPixelsEXT },
-        { &quot;glGetnUniformfvEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::GetnUniformfvEXT },
-        { &quot;glGetnUniformivEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::GetnUniformivEXT },
-        { &quot;glGenQueriesEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::GenQueriesEXT },
-        { &quot;glDeleteQueriesEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::DeleteQueriesEXT },
-        { &quot;glIsQueryEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::IsQueryEXT },
-        { &quot;glBeginQueryEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::BeginQueryEXT },
-        { &quot;glEndQueryEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::EndQueryEXT },
-        { &quot;glGetQueryivEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::GetQueryivEXT },
-        { &quot;glGetQueryObjectuivEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::GetQueryObjectuivEXT },
-        { &quot;glDrawBuffersEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::DrawBuffersEXT },
-        { &quot;glVertexAttribDivisorANGLE&quot;, (__eglMustCastToProperFunctionPointerType)gl::VertexAttribDivisorANGLE },
-        { &quot;glDrawArraysInstancedANGLE&quot;, (__eglMustCastToProperFunctionPointerType)gl::DrawArraysInstancedANGLE },
-        { &quot;glDrawElementsInstancedANGLE&quot;, (__eglMustCastToProperFunctionPointerType)gl::DrawElementsInstancedANGLE },
-        { &quot;glGetProgramBinaryOES&quot;, (__eglMustCastToProperFunctionPointerType)gl::GetProgramBinaryOES },
-        { &quot;glProgramBinaryOES&quot;, (__eglMustCastToProperFunctionPointerType)gl::ProgramBinaryOES },
-        { &quot;glGetBufferPointervOES&quot;, (__eglMustCastToProperFunctionPointerType)gl::GetBufferPointervOES },
-        { &quot;glMapBufferOES&quot;, (__eglMustCastToProperFunctionPointerType)gl::MapBufferOES },
-        { &quot;glUnmapBufferOES&quot;, (__eglMustCastToProperFunctionPointerType)gl::UnmapBufferOES },
-        { &quot;glMapBufferRangeEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::MapBufferRangeEXT },
-        { &quot;glFlushMappedBufferRangeEXT&quot;, (__eglMustCastToProperFunctionPointerType)gl::FlushMappedBufferRangeEXT },
-        { &quot;&quot;, NULL },
</del><ins>+        // GLES2 core
+        INSERT_PROC_ADDRESS(gl, ActiveTexture);
+        INSERT_PROC_ADDRESS(gl, AttachShader);
+        INSERT_PROC_ADDRESS(gl, BindAttribLocation);
+        INSERT_PROC_ADDRESS(gl, BindBuffer);
+        INSERT_PROC_ADDRESS(gl, BindFramebuffer);
+        INSERT_PROC_ADDRESS(gl, BindRenderbuffer);
+        INSERT_PROC_ADDRESS(gl, BindTexture);
+        INSERT_PROC_ADDRESS(gl, BlendColor);
+        INSERT_PROC_ADDRESS(gl, BlendEquation);
+        INSERT_PROC_ADDRESS(gl, BlendEquationSeparate);
+        INSERT_PROC_ADDRESS(gl, BlendFunc);
+        INSERT_PROC_ADDRESS(gl, BlendFuncSeparate);
+        INSERT_PROC_ADDRESS(gl, BufferData);
+        INSERT_PROC_ADDRESS(gl, BufferSubData);
+        INSERT_PROC_ADDRESS(gl, CheckFramebufferStatus);
+        INSERT_PROC_ADDRESS(gl, Clear);
+        INSERT_PROC_ADDRESS(gl, ClearColor);
+        INSERT_PROC_ADDRESS(gl, ClearDepthf);
+        INSERT_PROC_ADDRESS(gl, ClearStencil);
+        INSERT_PROC_ADDRESS(gl, ColorMask);
+        INSERT_PROC_ADDRESS(gl, CompileShader);
+        INSERT_PROC_ADDRESS(gl, CompressedTexImage2D);
+        INSERT_PROC_ADDRESS(gl, CompressedTexSubImage2D);
+        INSERT_PROC_ADDRESS(gl, CopyTexImage2D);
+        INSERT_PROC_ADDRESS(gl, CopyTexSubImage2D);
+        INSERT_PROC_ADDRESS(gl, CreateProgram);
+        INSERT_PROC_ADDRESS(gl, CreateShader);
+        INSERT_PROC_ADDRESS(gl, CullFace);
+        INSERT_PROC_ADDRESS(gl, DeleteBuffers);
+        INSERT_PROC_ADDRESS(gl, DeleteFramebuffers);
+        INSERT_PROC_ADDRESS(gl, DeleteProgram);
+        INSERT_PROC_ADDRESS(gl, DeleteRenderbuffers);
+        INSERT_PROC_ADDRESS(gl, DeleteShader);
+        INSERT_PROC_ADDRESS(gl, DeleteTextures);
+        INSERT_PROC_ADDRESS(gl, DepthFunc);
+        INSERT_PROC_ADDRESS(gl, DepthMask);
+        INSERT_PROC_ADDRESS(gl, DepthRangef);
+        INSERT_PROC_ADDRESS(gl, DetachShader);
+        INSERT_PROC_ADDRESS(gl, Disable);
+        INSERT_PROC_ADDRESS(gl, DisableVertexAttribArray);
+        INSERT_PROC_ADDRESS(gl, DrawArrays);
+        INSERT_PROC_ADDRESS(gl, DrawElements);
+        INSERT_PROC_ADDRESS(gl, Enable);
+        INSERT_PROC_ADDRESS(gl, EnableVertexAttribArray);
+        INSERT_PROC_ADDRESS(gl, Finish);
+        INSERT_PROC_ADDRESS(gl, Flush);
+        INSERT_PROC_ADDRESS(gl, FramebufferRenderbuffer);
+        INSERT_PROC_ADDRESS(gl, FramebufferTexture2D);
+        INSERT_PROC_ADDRESS(gl, FrontFace);
+        INSERT_PROC_ADDRESS(gl, GenBuffers);
+        INSERT_PROC_ADDRESS(gl, GenerateMipmap);
+        INSERT_PROC_ADDRESS(gl, GenFramebuffers);
+        INSERT_PROC_ADDRESS(gl, GenRenderbuffers);
+        INSERT_PROC_ADDRESS(gl, GenTextures);
+        INSERT_PROC_ADDRESS(gl, GetActiveAttrib);
+        INSERT_PROC_ADDRESS(gl, GetActiveUniform);
+        INSERT_PROC_ADDRESS(gl, GetAttachedShaders);
+        INSERT_PROC_ADDRESS(gl, GetAttribLocation);
+        INSERT_PROC_ADDRESS(gl, GetBooleanv);
+        INSERT_PROC_ADDRESS(gl, GetBufferParameteriv);
+        INSERT_PROC_ADDRESS(gl, GetError);
+        INSERT_PROC_ADDRESS(gl, GetFloatv);
+        INSERT_PROC_ADDRESS(gl, GetFramebufferAttachmentParameteriv);
+        INSERT_PROC_ADDRESS(gl, GetIntegerv);
+        INSERT_PROC_ADDRESS(gl, GetProgramiv);
+        INSERT_PROC_ADDRESS(gl, GetProgramInfoLog);
+        INSERT_PROC_ADDRESS(gl, GetRenderbufferParameteriv);
+        INSERT_PROC_ADDRESS(gl, GetShaderiv);
+        INSERT_PROC_ADDRESS(gl, GetShaderInfoLog);
+        INSERT_PROC_ADDRESS(gl, GetShaderPrecisionFormat);
+        INSERT_PROC_ADDRESS(gl, GetShaderSource);
+        INSERT_PROC_ADDRESS(gl, GetString);
+        INSERT_PROC_ADDRESS(gl, GetTexParameterfv);
+        INSERT_PROC_ADDRESS(gl, GetTexParameteriv);
+        INSERT_PROC_ADDRESS(gl, GetUniformfv);
+        INSERT_PROC_ADDRESS(gl, GetUniformiv);
+        INSERT_PROC_ADDRESS(gl, GetUniformLocation);
+        INSERT_PROC_ADDRESS(gl, GetVertexAttribfv);
+        INSERT_PROC_ADDRESS(gl, GetVertexAttribiv);
+        INSERT_PROC_ADDRESS(gl, GetVertexAttribPointerv);
+        INSERT_PROC_ADDRESS(gl, Hint);
+        INSERT_PROC_ADDRESS(gl, IsBuffer);
+        INSERT_PROC_ADDRESS(gl, IsEnabled);
+        INSERT_PROC_ADDRESS(gl, IsFramebuffer);
+        INSERT_PROC_ADDRESS(gl, IsProgram);
+        INSERT_PROC_ADDRESS(gl, IsRenderbuffer);
+        INSERT_PROC_ADDRESS(gl, IsShader);
+        INSERT_PROC_ADDRESS(gl, IsTexture);
+        INSERT_PROC_ADDRESS(gl, LineWidth);
+        INSERT_PROC_ADDRESS(gl, LinkProgram);
+        INSERT_PROC_ADDRESS(gl, PixelStorei);
+        INSERT_PROC_ADDRESS(gl, PolygonOffset);
+        INSERT_PROC_ADDRESS(gl, ReadPixels);
+        INSERT_PROC_ADDRESS(gl, ReleaseShaderCompiler);
+        INSERT_PROC_ADDRESS(gl, RenderbufferStorage);
+        INSERT_PROC_ADDRESS(gl, SampleCoverage);
+        INSERT_PROC_ADDRESS(gl, Scissor);
+        INSERT_PROC_ADDRESS(gl, ShaderBinary);
+        INSERT_PROC_ADDRESS(gl, ShaderSource);
+        INSERT_PROC_ADDRESS(gl, StencilFunc);
+        INSERT_PROC_ADDRESS(gl, StencilFuncSeparate);
+        INSERT_PROC_ADDRESS(gl, StencilMask);
+        INSERT_PROC_ADDRESS(gl, StencilMaskSeparate);
+        INSERT_PROC_ADDRESS(gl, StencilOp);
+        INSERT_PROC_ADDRESS(gl, StencilOpSeparate);
+        INSERT_PROC_ADDRESS(gl, TexImage2D);
+        INSERT_PROC_ADDRESS(gl, TexParameterf);
+        INSERT_PROC_ADDRESS(gl, TexParameterfv);
+        INSERT_PROC_ADDRESS(gl, TexParameteri);
+        INSERT_PROC_ADDRESS(gl, TexParameteriv);
+        INSERT_PROC_ADDRESS(gl, TexSubImage2D);
+        INSERT_PROC_ADDRESS(gl, Uniform1f);
+        INSERT_PROC_ADDRESS(gl, Uniform1fv);
+        INSERT_PROC_ADDRESS(gl, Uniform1i);
+        INSERT_PROC_ADDRESS(gl, Uniform1iv);
+        INSERT_PROC_ADDRESS(gl, Uniform2f);
+        INSERT_PROC_ADDRESS(gl, Uniform2fv);
+        INSERT_PROC_ADDRESS(gl, Uniform2i);
+        INSERT_PROC_ADDRESS(gl, Uniform2iv);
+        INSERT_PROC_ADDRESS(gl, Uniform3f);
+        INSERT_PROC_ADDRESS(gl, Uniform3fv);
+        INSERT_PROC_ADDRESS(gl, Uniform3i);
+        INSERT_PROC_ADDRESS(gl, Uniform3iv);
+        INSERT_PROC_ADDRESS(gl, Uniform4f);
+        INSERT_PROC_ADDRESS(gl, Uniform4fv);
+        INSERT_PROC_ADDRESS(gl, Uniform4i);
+        INSERT_PROC_ADDRESS(gl, Uniform4iv);
+        INSERT_PROC_ADDRESS(gl, UniformMatrix2fv);
+        INSERT_PROC_ADDRESS(gl, UniformMatrix3fv);
+        INSERT_PROC_ADDRESS(gl, UniformMatrix4fv);
+        INSERT_PROC_ADDRESS(gl, UseProgram);
+        INSERT_PROC_ADDRESS(gl, ValidateProgram);
+        INSERT_PROC_ADDRESS(gl, VertexAttrib1f);
+        INSERT_PROC_ADDRESS(gl, VertexAttrib1fv);
+        INSERT_PROC_ADDRESS(gl, VertexAttrib2f);
+        INSERT_PROC_ADDRESS(gl, VertexAttrib2fv);
+        INSERT_PROC_ADDRESS(gl, VertexAttrib3f);
+        INSERT_PROC_ADDRESS(gl, VertexAttrib3fv);
+        INSERT_PROC_ADDRESS(gl, VertexAttrib4f);
+        INSERT_PROC_ADDRESS(gl, VertexAttrib4fv);
+        INSERT_PROC_ADDRESS(gl, VertexAttribPointer);
+        INSERT_PROC_ADDRESS(gl, Viewport);
+
+        // GL_ANGLE_framebuffer_blit
+        INSERT_PROC_ADDRESS(gl, BlitFramebufferANGLE);
+
+        // GL_ANGLE_framebuffer_multisample
+        INSERT_PROC_ADDRESS(gl, RenderbufferStorageMultisampleANGLE);
+
+        // GL_EXT_discard_framebuffer
+        INSERT_PROC_ADDRESS(gl, DiscardFramebufferEXT);
+
+        // GL_NV_fence
+        INSERT_PROC_ADDRESS(gl, DeleteFencesNV);
+        INSERT_PROC_ADDRESS(gl, GenFencesNV);
+        INSERT_PROC_ADDRESS(gl, IsFenceNV);
+        INSERT_PROC_ADDRESS(gl, TestFenceNV);
+        INSERT_PROC_ADDRESS(gl, GetFenceivNV);
+        INSERT_PROC_ADDRESS(gl, FinishFenceNV);
+        INSERT_PROC_ADDRESS(gl, SetFenceNV);
+
+        // GL_ANGLE_translated_shader_source
+        INSERT_PROC_ADDRESS(gl, GetTranslatedShaderSourceANGLE);
+
+        // GL_EXT_texture_storage
+        INSERT_PROC_ADDRESS(gl, TexStorage2DEXT);
+
+        // GL_EXT_robustness
+        INSERT_PROC_ADDRESS(gl, GetGraphicsResetStatusEXT);
+        INSERT_PROC_ADDRESS(gl, ReadnPixelsEXT);
+        INSERT_PROC_ADDRESS(gl, GetnUniformfvEXT);
+        INSERT_PROC_ADDRESS(gl, GetnUniformivEXT);
+
+        // GL_EXT_occlusion_query_boolean
+        INSERT_PROC_ADDRESS(gl, GenQueriesEXT);
+        INSERT_PROC_ADDRESS(gl, DeleteQueriesEXT);
+        INSERT_PROC_ADDRESS(gl, IsQueryEXT);
+        INSERT_PROC_ADDRESS(gl, BeginQueryEXT);
+        INSERT_PROC_ADDRESS(gl, EndQueryEXT);
+        INSERT_PROC_ADDRESS(gl, GetQueryivEXT);
+        INSERT_PROC_ADDRESS(gl, GetQueryObjectuivEXT);
+
+        // GL_EXT_draw_buffers
+        INSERT_PROC_ADDRESS(gl, DrawBuffersEXT);
+
+        // GL_ANGLE_instanced_arrays
+        INSERT_PROC_ADDRESS(gl, DrawArraysInstancedANGLE);
+        INSERT_PROC_ADDRESS(gl, DrawElementsInstancedANGLE);
+        INSERT_PROC_ADDRESS(gl, VertexAttribDivisorANGLE);
+
+        // GL_OES_get_program_binary
+        INSERT_PROC_ADDRESS(gl, GetProgramBinaryOES);
+        INSERT_PROC_ADDRESS(gl, ProgramBinaryOES);
+
+        // GL_OES_mapbuffer
+        INSERT_PROC_ADDRESS(gl, MapBufferOES);
+        INSERT_PROC_ADDRESS(gl, UnmapBufferOES);
+        INSERT_PROC_ADDRESS(gl, GetBufferPointervOES);
+
+        // GL_EXT_map_buffer_range
+        INSERT_PROC_ADDRESS(gl, MapBufferRangeEXT);
+        INSERT_PROC_ADDRESS(gl, FlushMappedBufferRangeEXT);
+
+        // GL_EXT_debug_marker
+        INSERT_PROC_ADDRESS(gl, InsertEventMarkerEXT);
+        INSERT_PROC_ADDRESS(gl, PushGroupMarkerEXT);
+        INSERT_PROC_ADDRESS(gl, PopGroupMarkerEXT);
+
+        // GL_OES_EGL_image
+        INSERT_PROC_ADDRESS(gl, EGLImageTargetTexture2DOES);
+        INSERT_PROC_ADDRESS(gl, EGLImageTargetRenderbufferStorageOES);
+
+        // GL_OES_vertex_array_object
+        INSERT_PROC_ADDRESS(gl, BindVertexArrayOES);
+        INSERT_PROC_ADDRESS(gl, DeleteVertexArraysOES);
+        INSERT_PROC_ADDRESS(gl, GenVertexArraysOES);
+        INSERT_PROC_ADDRESS(gl, IsVertexArrayOES);
+
+        // GL_KHR_debug
+        INSERT_PROC_ADDRESS(gl, DebugMessageControlKHR);
+        INSERT_PROC_ADDRESS(gl, DebugMessageInsertKHR);
+        INSERT_PROC_ADDRESS(gl, DebugMessageCallbackKHR);
+        INSERT_PROC_ADDRESS(gl, GetDebugMessageLogKHR);
+        INSERT_PROC_ADDRESS(gl, PushDebugGroupKHR);
+        INSERT_PROC_ADDRESS(gl, PopDebugGroupKHR);
+        INSERT_PROC_ADDRESS(gl, ObjectLabelKHR);
+        INSERT_PROC_ADDRESS(gl, GetObjectLabelKHR);
+        INSERT_PROC_ADDRESS(gl, ObjectPtrLabelKHR);
+        INSERT_PROC_ADDRESS(gl, GetObjectPtrLabelKHR);
+        INSERT_PROC_ADDRESS(gl, GetPointervKHR);
+
+        // GLES3 core
+        INSERT_PROC_ADDRESS(gl, ReadBuffer);
+        INSERT_PROC_ADDRESS(gl, DrawRangeElements);
+        INSERT_PROC_ADDRESS(gl, TexImage3D);
+        INSERT_PROC_ADDRESS(gl, TexSubImage3D);
+        INSERT_PROC_ADDRESS(gl, CopyTexSubImage3D);
+        INSERT_PROC_ADDRESS(gl, CompressedTexImage3D);
+        INSERT_PROC_ADDRESS(gl, CompressedTexSubImage3D);
+        INSERT_PROC_ADDRESS(gl, GenQueries);
+        INSERT_PROC_ADDRESS(gl, DeleteQueries);
+        INSERT_PROC_ADDRESS(gl, IsQuery);
+        INSERT_PROC_ADDRESS(gl, BeginQuery);
+        INSERT_PROC_ADDRESS(gl, EndQuery);
+        INSERT_PROC_ADDRESS(gl, GetQueryiv);
+        INSERT_PROC_ADDRESS(gl, GetQueryObjectuiv);
+        INSERT_PROC_ADDRESS(gl, UnmapBuffer);
+        INSERT_PROC_ADDRESS(gl, GetBufferPointerv);
+        INSERT_PROC_ADDRESS(gl, DrawBuffers);
+        INSERT_PROC_ADDRESS(gl, UniformMatrix2x3fv);
+        INSERT_PROC_ADDRESS(gl, UniformMatrix3x2fv);
+        INSERT_PROC_ADDRESS(gl, UniformMatrix2x4fv);
+        INSERT_PROC_ADDRESS(gl, UniformMatrix4x2fv);
+        INSERT_PROC_ADDRESS(gl, UniformMatrix3x4fv);
+        INSERT_PROC_ADDRESS(gl, UniformMatrix4x3fv);
+        INSERT_PROC_ADDRESS(gl, BlitFramebuffer);
+        INSERT_PROC_ADDRESS(gl, RenderbufferStorageMultisample);
+        INSERT_PROC_ADDRESS(gl, FramebufferTextureLayer);
+        INSERT_PROC_ADDRESS(gl, MapBufferRange);
+        INSERT_PROC_ADDRESS(gl, FlushMappedBufferRange);
+        INSERT_PROC_ADDRESS(gl, BindVertexArray);
+        INSERT_PROC_ADDRESS(gl, DeleteVertexArrays);
+        INSERT_PROC_ADDRESS(gl, GenVertexArrays);
+        INSERT_PROC_ADDRESS(gl, IsVertexArray);
+        INSERT_PROC_ADDRESS(gl, GetIntegeri_v);
+        INSERT_PROC_ADDRESS(gl, BeginTransformFeedback);
+        INSERT_PROC_ADDRESS(gl, EndTransformFeedback);
+        INSERT_PROC_ADDRESS(gl, BindBufferRange);
+        INSERT_PROC_ADDRESS(gl, BindBufferBase);
+        INSERT_PROC_ADDRESS(gl, TransformFeedbackVaryings);
+        INSERT_PROC_ADDRESS(gl, GetTransformFeedbackVarying);
+        INSERT_PROC_ADDRESS(gl, VertexAttribIPointer);
+        INSERT_PROC_ADDRESS(gl, GetVertexAttribIiv);
+        INSERT_PROC_ADDRESS(gl, GetVertexAttribIuiv);
+        INSERT_PROC_ADDRESS(gl, VertexAttribI4i);
+        INSERT_PROC_ADDRESS(gl, VertexAttribI4ui);
+        INSERT_PROC_ADDRESS(gl, VertexAttribI4iv);
+        INSERT_PROC_ADDRESS(gl, VertexAttribI4uiv);
+        INSERT_PROC_ADDRESS(gl, GetUniformuiv);
+        INSERT_PROC_ADDRESS(gl, GetFragDataLocation);
+        INSERT_PROC_ADDRESS(gl, Uniform1ui);
+        INSERT_PROC_ADDRESS(gl, Uniform2ui);
+        INSERT_PROC_ADDRESS(gl, Uniform3ui);
+        INSERT_PROC_ADDRESS(gl, Uniform4ui);
+        INSERT_PROC_ADDRESS(gl, Uniform1uiv);
+        INSERT_PROC_ADDRESS(gl, Uniform2uiv);
+        INSERT_PROC_ADDRESS(gl, Uniform3uiv);
+        INSERT_PROC_ADDRESS(gl, Uniform4uiv);
+        INSERT_PROC_ADDRESS(gl, ClearBufferiv);
+        INSERT_PROC_ADDRESS(gl, ClearBufferuiv);
+        INSERT_PROC_ADDRESS(gl, ClearBufferfv);
+        INSERT_PROC_ADDRESS(gl, ClearBufferfi);
+        INSERT_PROC_ADDRESS(gl, GetStringi);
+        INSERT_PROC_ADDRESS(gl, CopyBufferSubData);
+        INSERT_PROC_ADDRESS(gl, GetUniformIndices);
+        INSERT_PROC_ADDRESS(gl, GetActiveUniformsiv);
+        INSERT_PROC_ADDRESS(gl, GetUniformBlockIndex);
+        INSERT_PROC_ADDRESS(gl, GetActiveUniformBlockiv);
+        INSERT_PROC_ADDRESS(gl, GetActiveUniformBlockName);
+        INSERT_PROC_ADDRESS(gl, UniformBlockBinding);
+        INSERT_PROC_ADDRESS(gl, DrawArraysInstanced);
+        INSERT_PROC_ADDRESS(gl, DrawElementsInstanced);
+        map[&quot;glFenceSync&quot;] =
+            reinterpret_cast&lt;__eglMustCastToProperFunctionPointerType&gt;(gl::FenceSync_);
+        INSERT_PROC_ADDRESS(gl, IsSync);
+        INSERT_PROC_ADDRESS(gl, DeleteSync);
+        INSERT_PROC_ADDRESS(gl, ClientWaitSync);
+        INSERT_PROC_ADDRESS(gl, WaitSync);
+        INSERT_PROC_ADDRESS(gl, GetInteger64v);
+        INSERT_PROC_ADDRESS(gl, GetSynciv);
+        INSERT_PROC_ADDRESS(gl, GetInteger64i_v);
+        INSERT_PROC_ADDRESS(gl, GetBufferParameteri64v);
+        INSERT_PROC_ADDRESS(gl, GenSamplers);
+        INSERT_PROC_ADDRESS(gl, DeleteSamplers);
+        INSERT_PROC_ADDRESS(gl, IsSampler);
+        INSERT_PROC_ADDRESS(gl, BindSampler);
+        INSERT_PROC_ADDRESS(gl, SamplerParameteri);
+        INSERT_PROC_ADDRESS(gl, SamplerParameteriv);
+        INSERT_PROC_ADDRESS(gl, SamplerParameterf);
+        INSERT_PROC_ADDRESS(gl, SamplerParameterfv);
+        INSERT_PROC_ADDRESS(gl, GetSamplerParameteriv);
+        INSERT_PROC_ADDRESS(gl, GetSamplerParameterfv);
+        INSERT_PROC_ADDRESS(gl, VertexAttribDivisor);
+        INSERT_PROC_ADDRESS(gl, BindTransformFeedback);
+        INSERT_PROC_ADDRESS(gl, DeleteTransformFeedbacks);
+        INSERT_PROC_ADDRESS(gl, GenTransformFeedbacks);
+        INSERT_PROC_ADDRESS(gl, IsTransformFeedback);
+        INSERT_PROC_ADDRESS(gl, PauseTransformFeedback);
+        INSERT_PROC_ADDRESS(gl, ResumeTransformFeedback);
+        INSERT_PROC_ADDRESS(gl, GetProgramBinary);
+        INSERT_PROC_ADDRESS(gl, ProgramBinary);
+        INSERT_PROC_ADDRESS(gl, ProgramParameteri);
+        INSERT_PROC_ADDRESS(gl, InvalidateFramebuffer);
+        INSERT_PROC_ADDRESS(gl, InvalidateSubFramebuffer);
+        INSERT_PROC_ADDRESS(gl, TexStorage2D);
+        INSERT_PROC_ADDRESS(gl, TexStorage3D);
+        INSERT_PROC_ADDRESS(gl, GetInternalformativ);
+
+        // EGL 1.0
+        INSERT_PROC_ADDRESS(egl, ChooseConfig);
+        INSERT_PROC_ADDRESS(egl, CopyBuffers);
+        INSERT_PROC_ADDRESS(egl, CreateContext);
+        INSERT_PROC_ADDRESS(egl, CreatePbufferSurface);
+        INSERT_PROC_ADDRESS(egl, CreatePixmapSurface);
+        INSERT_PROC_ADDRESS(egl, CreateWindowSurface);
+        INSERT_PROC_ADDRESS(egl, DestroyContext);
+        INSERT_PROC_ADDRESS(egl, DestroySurface);
+        INSERT_PROC_ADDRESS(egl, GetConfigAttrib);
+        INSERT_PROC_ADDRESS(egl, GetConfigs);
+        INSERT_PROC_ADDRESS(egl, GetCurrentDisplay);
+        INSERT_PROC_ADDRESS(egl, GetCurrentSurface);
+        INSERT_PROC_ADDRESS(egl, GetDisplay);
+        INSERT_PROC_ADDRESS(egl, GetError);
+        INSERT_PROC_ADDRESS(egl, GetProcAddress);
+        INSERT_PROC_ADDRESS(egl, Initialize);
+        INSERT_PROC_ADDRESS(egl, MakeCurrent);
+        INSERT_PROC_ADDRESS(egl, QueryContext);
+        INSERT_PROC_ADDRESS(egl, QueryString);
+        INSERT_PROC_ADDRESS(egl, QuerySurface);
+        INSERT_PROC_ADDRESS(egl, SwapBuffers);
+        INSERT_PROC_ADDRESS(egl, Terminate);
+        INSERT_PROC_ADDRESS(egl, WaitGL);
+        INSERT_PROC_ADDRESS(egl, WaitNative);
+
+        // EGL 1.1
+        INSERT_PROC_ADDRESS(egl, BindTexImage);
+        INSERT_PROC_ADDRESS(egl, ReleaseTexImage);
+        INSERT_PROC_ADDRESS(egl, SurfaceAttrib);
+        INSERT_PROC_ADDRESS(egl, SwapInterval);
+
+        // EGL 1.2
+        INSERT_PROC_ADDRESS(egl, BindAPI);
+        INSERT_PROC_ADDRESS(egl, QueryAPI);
+        INSERT_PROC_ADDRESS(egl, CreatePbufferFromClientBuffer);
+        INSERT_PROC_ADDRESS(egl, ReleaseThread);
+        INSERT_PROC_ADDRESS(egl, WaitClient);
+
+        // EGL 1.4
+        INSERT_PROC_ADDRESS(egl, GetCurrentContext);
+
+        // EGL 1.5
+        INSERT_PROC_ADDRESS(egl, CreateSync);
+        INSERT_PROC_ADDRESS(egl, DestroySync);
+        INSERT_PROC_ADDRESS(egl, ClientWaitSync);
+        INSERT_PROC_ADDRESS(egl, GetSyncAttrib);
+        INSERT_PROC_ADDRESS(egl, CreateImage);
+        INSERT_PROC_ADDRESS(egl, DestroyImage);
+        INSERT_PROC_ADDRESS(egl, GetPlatformDisplay);
+        INSERT_PROC_ADDRESS(egl, CreatePlatformWindowSurface);
+        INSERT_PROC_ADDRESS(egl, CreatePlatformPixmapSurface);
+        INSERT_PROC_ADDRESS(egl, WaitSync);
+
+        // EGL_ANGLE_query_surface_pointer
+        INSERT_PROC_ADDRESS(egl, QuerySurfacePointerANGLE);
+
+        // EGL_NV_post_sub_buffer
+        INSERT_PROC_ADDRESS(egl, PostSubBufferNV);
+
+        // EGL_EXT_platform_base
+        INSERT_PROC_ADDRESS(egl, GetPlatformDisplayEXT);
+
+        // EGL_EXT_device_query
+        INSERT_PROC_ADDRESS(egl, QueryDisplayAttribEXT);
+        INSERT_PROC_ADDRESS(egl, QueryDeviceAttribEXT);
+        INSERT_PROC_ADDRESS(egl, QueryDeviceStringEXT);
+
+        // EGL_KHR_image_base/EGL_KHR_image
+        INSERT_PROC_ADDRESS(egl, CreateImageKHR);
+        INSERT_PROC_ADDRESS(egl, DestroyImageKHR);
+
+        // EGL_EXT_device_creation
+        INSERT_PROC_ADDRESS(egl, CreateDeviceANGLE);
+        INSERT_PROC_ADDRESS(egl, ReleaseDeviceANGLE);
+
+        // EGL_KHR_stream
+        INSERT_PROC_ADDRESS(egl, CreateStreamKHR);
+        INSERT_PROC_ADDRESS(egl, DestroyStreamKHR);
+        INSERT_PROC_ADDRESS(egl, StreamAttribKHR);
+        INSERT_PROC_ADDRESS(egl, QueryStreamKHR);
+        INSERT_PROC_ADDRESS(egl, QueryStreamu64KHR);
+
+        // EGL_KHR_stream_consumer_gltexture
+        INSERT_PROC_ADDRESS(egl, StreamConsumerGLTextureExternalKHR);
+        INSERT_PROC_ADDRESS(egl, StreamConsumerAcquireKHR);
+        INSERT_PROC_ADDRESS(egl, StreamConsumerReleaseKHR);
+
+        // EGL_NV_stream_consumer_gltexture_yuv
+        INSERT_PROC_ADDRESS(egl, StreamConsumerGLTextureExternalAttribsNV);
+
+#undef INSERT_PROC_ADDRESS
+        return map;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><del>-    for (const Extension *extension = &amp;extensions[0]; extension-&gt;address != nullptr; extension++)
</del><ins>+    static const ProcAddressMap procAddressMap = generateProcAddressMap();
+
+    auto iter = procAddressMap.find(procname);
+    if (iter != procAddressMap.end())
</ins><span class="cx">     {
</span><del>-        if (strcmp(procname, extension-&gt;name) == 0)
-        {
-            return reinterpret_cast&lt;__eglMustCastToProperFunctionPointerType&gt;(extension-&gt;address);
-        }
</del><ins>+        return iter-&gt;second;
</ins><span class="cx">     }
</span><del>-
-    return NULL;
</del><ins>+    else
+    {
+        return nullptr;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_egl_extcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,9 +9,11 @@
</span><span class="cx"> #include &quot;libGLESv2/entry_points_egl_ext.h&quot;
</span><span class="cx"> #include &quot;libGLESv2/global_state.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;libANGLE/Context.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/Display.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Device.h&quot;
</span><span class="cx"> #include &quot;libANGLE/Surface.h&quot;
</span><ins>+#include &quot;libANGLE/Stream.h&quot;
</ins><span class="cx"> #include &quot;libANGLE/validationEGL.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;common/debug.h&quot;
</span><span class="lines">@@ -57,7 +59,13 @@
</span><span class="cx">             return EGL_FALSE;
</span><span class="cx">         }
</span><span class="cx">         break;
</span><del>-
</del><ins>+      case EGL_DXGI_KEYED_MUTEX_ANGLE:
+        if (!display-&gt;getExtensions().keyedMutex)
+        {
+            SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
+            return EGL_FALSE;
+        }
+        break;
</ins><span class="cx">       default:
</span><span class="cx">         SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
</span><span class="cx">         return EGL_FALSE;
</span><span class="lines">@@ -137,136 +145,210 @@
</span><span class="cx">             return EGL_NO_DISPLAY;
</span><span class="cx">         }
</span><span class="cx">         break;
</span><del>-
</del><ins>+      case EGL_PLATFORM_DEVICE_EXT:
+          if (!clientExtensions.platformDevice)
+          {
+              SetGlobalError(Error(EGL_BAD_PARAMETER, &quot;Platform Device extension is not active&quot;));
+              return EGL_NO_DISPLAY;
+          }
+          break;
</ins><span class="cx">       default:
</span><span class="cx">         SetGlobalError(Error(EGL_BAD_CONFIG));
</span><span class="cx">         return EGL_NO_DISPLAY;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    EGLint platformType = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;
-    EGLint deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
-    bool majorVersionSpecified = false;
-    bool minorVersionSpecified = false;
-    bool enableAutoTrimSpecified = false;
</del><ins>+    if (platform == EGL_PLATFORM_ANGLE_ANGLE)
+    {
+        EGLint platformType          = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;
+        EGLint deviceType            = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
+        bool majorVersionSpecified   = false;
+        bool minorVersionSpecified   = false;
+        bool enableAutoTrimSpecified = false;
+        bool deviceTypeSpecified     = false;
+        bool presentPathSpecified    = false;
</ins><span class="cx"> 
</span><del>-    if (attrib_list)
-    {
-        for (const EGLint *curAttrib = attrib_list; curAttrib[0] != EGL_NONE; curAttrib += 2)
</del><ins>+        if (attrib_list)
</ins><span class="cx">         {
</span><del>-            switch (curAttrib[0])
</del><ins>+            for (const EGLint *curAttrib = attrib_list; curAttrib[0] != EGL_NONE; curAttrib += 2)
</ins><span class="cx">             {
</span><del>-              case EGL_PLATFORM_ANGLE_TYPE_ANGLE:
-                switch (curAttrib[1])
</del><ins>+                switch (curAttrib[0])
</ins><span class="cx">                 {
</span><del>-                  case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
-                    break;
</del><ins>+                    case EGL_PLATFORM_ANGLE_TYPE_ANGLE:
+                        switch (curAttrib[1])
+                    {
+                        case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
+                            break;
</ins><span class="cx"> 
</span><del>-                  case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
-                  case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
-                    if (!clientExtensions.platformANGLED3D)
-                    {
</del><ins>+                        case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
+                        case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
+                            if (!clientExtensions.platformANGLED3D)
+                            {
+                                SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
+                                return EGL_NO_DISPLAY;
+                            }
+                            break;
+
+                        case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE:
+                        case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
+                            if (!clientExtensions.platformANGLEOpenGL)
+                            {
+                                SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
+                                return EGL_NO_DISPLAY;
+                            }
+                            break;
+
+                        default:
</ins><span class="cx">                         SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
</span><span class="cx">                         return EGL_NO_DISPLAY;
</span><span class="cx">                     }
</span><ins>+                    platformType = curAttrib[1];
</ins><span class="cx">                     break;
</span><span class="cx"> 
</span><del>-                  case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE:
-                  case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
-                    if (!clientExtensions.platformANGLEOpenGL)
</del><ins>+                    case EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE:
+                        if (curAttrib[1] != EGL_DONT_CARE)
+                        {
+                            majorVersionSpecified = true;
+                        }
+                        break;
+
+                    case EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE:
+                        if (curAttrib[1] != EGL_DONT_CARE)
+                        {
+                            minorVersionSpecified = true;
+                        }
+                        break;
+
+                    case EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE:
+                        switch (curAttrib[1])
</ins><span class="cx">                     {
</span><ins>+                        case EGL_TRUE:
+                        case EGL_FALSE:
+                            break;
+                        default:
</ins><span class="cx">                         SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
</span><span class="cx">                         return EGL_NO_DISPLAY;
</span><span class="cx">                     }
</span><ins>+                    enableAutoTrimSpecified = true;
</ins><span class="cx">                     break;
</span><span class="cx"> 
</span><del>-                  default:
-                    SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
-                    return EGL_NO_DISPLAY;
-                }
-                platformType = curAttrib[1];
-                break;
</del><ins>+                    case EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE:
+                        if (!clientExtensions.experimentalPresentPath)
+                        {
+                            SetGlobalError(
+                                Error(EGL_BAD_ATTRIBUTE,
+                                      &quot;EGL_ANGLE_experimental_present_path extension not active&quot;));
+                            return EGL_NO_DISPLAY;
+                        }
</ins><span class="cx"> 
</span><del>-              case EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE:
-                if (curAttrib[1] != EGL_DONT_CARE)
-                {
-                    majorVersionSpecified = true;
-                }
-                break;
</del><ins>+                        switch (curAttrib[1])
+                        {
+                            case EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE:
+                            case EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE:
+                                break;
+                            default:
+                                SetGlobalError(
+                                    Error(EGL_BAD_ATTRIBUTE,
+                                          &quot;Invalid value for EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE&quot;));
+                                return EGL_NO_DISPLAY;
+                        }
+                        presentPathSpecified = true;
+                        break;
</ins><span class="cx"> 
</span><del>-              case EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE:
-                if (curAttrib[1] != EGL_DONT_CARE)
-                {
-                    minorVersionSpecified = true;
-                }
-                break;
</del><ins>+                    case EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE:
+                        switch (curAttrib[1])
+                        {
+                            case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE:
+                            case EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE:
+                            case EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE:
+                                deviceTypeSpecified = true;
+                                break;
</ins><span class="cx"> 
</span><del>-              case EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE:
-                switch (curAttrib[1])
-                {
-                  case EGL_TRUE:
-                  case EGL_FALSE:
</del><ins>+                            case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE:
+                                // This is a hidden option, accepted by the OpenGL back-end.
+                                break;
+
+                            default:
+                                SetGlobalError(Error(EGL_BAD_ATTRIBUTE,
+                                                     &quot;Invalid value for &quot;
+                                                     &quot;EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE &quot;
+                                                     &quot;attrib&quot;));
+                                return EGL_NO_DISPLAY;
+                        }
+                        deviceType = curAttrib[1];
</ins><span class="cx">                     break;
</span><del>-                  default:
-                    SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
-                    return EGL_NO_DISPLAY;
-                }
-                enableAutoTrimSpecified = true;
-                break;
</del><span class="cx"> 
</span><del>-              case EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE:
-                if (!clientExtensions.platformANGLED3D)
-                {
-                    SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
-                    return EGL_NO_DISPLAY;
</del><ins>+                    default:
+                        break;
</ins><span class="cx">                 }
</span><ins>+            }
+        }
</ins><span class="cx"> 
</span><del>-                switch (curAttrib[1])
-                {
-                  case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE:
-                  case EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE:
-                  case EGL_PLATFORM_ANGLE_DEVICE_TYPE_REFERENCE_ANGLE:
-                  case EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE:
-                    break;
</del><ins>+        if (!majorVersionSpecified &amp;&amp; minorVersionSpecified)
+        {
+            SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
+            return EGL_NO_DISPLAY;
+        }
</ins><span class="cx"> 
</span><del>-                  default:
-                    SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
-                    return EGL_NO_DISPLAY;
-                }
-                deviceType = curAttrib[1];
-                break;
</del><ins>+        if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE &amp;&amp;
+            platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
+        {
+            SetGlobalError(
+                Error(EGL_BAD_ATTRIBUTE,
+                      &quot;EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE requires a device type of &quot;
+                      &quot;EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.&quot;));
+            return EGL_NO_DISPLAY;
+        }
</ins><span class="cx"> 
</span><del>-              default:
-                break;
-            }
</del><ins>+        if (enableAutoTrimSpecified &amp;&amp; platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
+        {
+            SetGlobalError(
+                Error(EGL_BAD_ATTRIBUTE,
+                      &quot;EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE requires a device type of &quot;
+                      &quot;EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.&quot;));
+            return EGL_NO_DISPLAY;
</ins><span class="cx">         }
</span><ins>+
+        if (presentPathSpecified &amp;&amp; platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
+        {
+            SetGlobalError(Error(EGL_BAD_ATTRIBUTE,
+                                 &quot;EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE requires a device type of &quot;
+                                 &quot;EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.&quot;));
+            return EGL_NO_DISPLAY;
+        }
+
+        if (deviceTypeSpecified &amp;&amp; platformType != EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE &amp;&amp;
+            platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
+        {
+            SetGlobalError(
+                Error(EGL_BAD_ATTRIBUTE,
+                      &quot;EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE requires a device type of &quot;
+                      &quot;EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE or EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE.&quot;));
+            return EGL_NO_DISPLAY;
+        }
+
+        SetGlobalError(Error(EGL_SUCCESS));
+        return Display::GetDisplayFromAttribs(native_display,
+                                              AttributeMap::CreateFromIntArray(attrib_list));
</ins><span class="cx">     }
</span><del>-
-    if (!majorVersionSpecified &amp;&amp; minorVersionSpecified)
</del><ins>+    else if (platform == EGL_PLATFORM_DEVICE_EXT)
</ins><span class="cx">     {
</span><del>-        SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
-        return EGL_NO_DISPLAY;
-    }
</del><ins>+        Device *eglDevice = reinterpret_cast&lt;Device *&gt;(native_display);
+        if (eglDevice == nullptr || !Device::IsValidDevice(eglDevice))
+        {
+            SetGlobalError(Error(EGL_BAD_ATTRIBUTE,
+                                 &quot;native_display should be a valid EGL device if platform equals &quot;
+                                 &quot;EGL_PLATFORM_DEVICE_EXT&quot;));
+            return EGL_NO_DISPLAY;
+        }
</ins><span class="cx"> 
</span><del>-    if (deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE &amp;&amp;
-        platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
-    {
-        SetGlobalError(Error(EGL_BAD_ATTRIBUTE, &quot;EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE requires a device type of &quot;
-                                                &quot;EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.&quot;));
-        return EGL_NO_DISPLAY;
</del><ins>+        SetGlobalError(Error(EGL_SUCCESS));
+        return Display::GetDisplayFromDevice(native_display);
</ins><span class="cx">     }
</span><del>-
-    if (enableAutoTrimSpecified &amp;&amp;
-        platformType != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
</del><ins>+    else
</ins><span class="cx">     {
</span><del>-        SetGlobalError(Error(EGL_BAD_ATTRIBUTE, &quot;EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE requires a device type of &quot;
-                                                &quot;EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE.&quot;));
</del><ins>+        UNREACHABLE();
</ins><span class="cx">         return EGL_NO_DISPLAY;
</span><span class="cx">     }
</span><del>-
-    SetGlobalError(Error(EGL_SUCCESS));
-
-    EGLNativeDisplayType displayId = static_cast&lt;EGLNativeDisplayType&gt;(native_display);
-    return Display::getDisplay(displayId, AttributeMap(attrib_list));
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // EGL_EXT_device_query
</span><span class="lines">@@ -276,34 +358,31 @@
</span><span class="cx">           device, attribute, value);
</span><span class="cx"> 
</span><span class="cx">     Device *dev = static_cast&lt;Device*&gt;(device);
</span><del>-    if (dev == EGL_NO_DEVICE_EXT)
</del><ins>+    if (dev == EGL_NO_DEVICE_EXT || !Device::IsValidDevice(dev))
</ins><span class="cx">     {
</span><span class="cx">         SetGlobalError(Error(EGL_BAD_ACCESS));
</span><span class="cx">         return EGL_FALSE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    Display *display = dev-&gt;getDisplay();
-    Error error(EGL_SUCCESS);
-
-    if (!display-&gt;getExtensions().deviceQuery)
</del><ins>+    // If the device was created by (and is owned by) a display, and that display doesn't support
+    // device querying, then this call should fail
+    Display *owningDisplay = dev-&gt;getOwningDisplay();
+    if (owningDisplay != nullptr &amp;&amp; !owningDisplay-&gt;getExtensions().deviceQuery)
</ins><span class="cx">     {
</span><del>-        SetGlobalError(Error(EGL_BAD_ACCESS));
</del><ins>+        SetGlobalError(Error(EGL_BAD_ACCESS,
+                             &quot;Device wasn't created using eglCreateDeviceANGLE, and the Display &quot;
+                             &quot;that created it doesn't support device querying&quot;));
</ins><span class="cx">         return EGL_FALSE;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    Error error(EGL_SUCCESS);
+
</ins><span class="cx">     // validate the attribute parameter
</span><span class="cx">     switch (attribute)
</span><span class="cx">     {
</span><span class="cx">       case EGL_D3D11_DEVICE_ANGLE:
</span><del>-        if (!dev-&gt;getExtensions().deviceD3D || dev-&gt;getType() != EGL_D3D11_DEVICE_ANGLE)
-        {
-            SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
-            return EGL_FALSE;
-        }
-        error = dev-&gt;getDevice(value);
-        break;
</del><span class="cx">       case EGL_D3D9_DEVICE_ANGLE:
</span><del>-        if (!dev-&gt;getExtensions().deviceD3D || dev-&gt;getType() != EGL_D3D9_DEVICE_ANGLE)
</del><ins>+        if (!dev-&gt;getExtensions().deviceD3D || dev-&gt;getType() != attribute)
</ins><span class="cx">         {
</span><span class="cx">             SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
</span><span class="cx">             return EGL_FALSE;
</span><span class="lines">@@ -326,7 +405,7 @@
</span><span class="cx">           device, name);
</span><span class="cx"> 
</span><span class="cx">     Device *dev = static_cast&lt;Device*&gt;(device);
</span><del>-    if (dev == EGL_NO_DEVICE_EXT)
</del><ins>+    if (dev == EGL_NO_DEVICE_EXT || !Device::IsValidDevice(dev))
</ins><span class="cx">     {
</span><span class="cx">         SetGlobalError(Error(EGL_BAD_DEVICE_EXT));
</span><span class="cx">         return nullptr;
</span><span class="lines">@@ -378,4 +457,379 @@
</span><span class="cx">     return (error.isError() ? EGL_FALSE : EGL_TRUE);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ANGLE_EXPORT EGLImageKHR EGLAPIENTRY CreateImageKHR(EGLDisplay dpy,
+                                                    EGLContext ctx,
+                                                    EGLenum target,
+                                                    EGLClientBuffer buffer,
+                                                    const EGLint *attrib_list)
+{
+    EVENT(
+        &quot;(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p, EGLenum target = 0x%X, &quot;
+        &quot;EGLClientBuffer buffer = 0x%0.8p, const EGLAttrib *attrib_list = 0x%0.8p)&quot;,
+        dpy, ctx, target, buffer, attrib_list);
+
+    Display *display     = static_cast&lt;Display *&gt;(dpy);
+    gl::Context *context = static_cast&lt;gl::Context *&gt;(ctx);
+    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
+
+    Error error = ValidateCreateImageKHR(display, context, target, buffer, attributes);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_NO_IMAGE;
+    }
+
+    Image *image = nullptr;
+    error = display-&gt;createImage(context, target, buffer, attributes, &amp;image);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_NO_IMAGE;
+    }
+
+    return static_cast&lt;EGLImage&gt;(image);
</ins><span class="cx"> }
</span><ins>+
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
+{
+    EVENT(&quot;(EGLDisplay dpy = 0x%0.8p, EGLImage image = 0x%0.8p)&quot;, dpy, image);
+
+    Display *display = static_cast&lt;Display *&gt;(dpy);
+    Image *img       = static_cast&lt;Image *&gt;(image);
+
+    Error error = ValidateDestroyImageKHR(display, img);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    display-&gt;destroyImage(img);
+
+    return EGL_TRUE;
+}
+
+ANGLE_EXPORT EGLDeviceEXT EGLAPIENTRY CreateDeviceANGLE(EGLint device_type,
+                                                        void *native_device,
+                                                        const EGLAttrib *attrib_list)
+{
+    EVENT(
+        &quot;(EGLint device_type = %d, void* native_device = 0x%0.8p, const EGLAttrib* attrib_list = &quot;
+        &quot;0x%0.8p)&quot;,
+        device_type, native_device, attrib_list);
+
+    Error error = ValidateCreateDeviceANGLE(device_type, native_device, attrib_list);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_NO_DEVICE_EXT;
+    }
+
+    Device *device = nullptr;
+    error = Device::CreateDevice(native_device, device_type, &amp;device);
+    if (error.isError())
+    {
+        ASSERT(device == nullptr);
+        SetGlobalError(error);
+        return EGL_NO_DEVICE_EXT;
+    }
+
+    return device;
+}
+
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY ReleaseDeviceANGLE(EGLDeviceEXT device)
+{
+    EVENT(&quot;(EGLDeviceEXT device = 0x%0.8p)&quot;, device);
+
+    Device *dev = static_cast&lt;Device *&gt;(device);
+
+    Error error = ValidateReleaseDeviceANGLE(dev);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    SafeDelete(dev);
+
+    return EGL_TRUE;
+}
+
+// EGL_KHR_stream
+EGLStreamKHR EGLAPIENTRY CreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list)
+{
+    EVENT(&quot;(EGLDisplay dpy = 0x%0.8p, const EGLAttrib* attrib_list = 0x%0.8p)&quot;, dpy, attrib_list);
+
+    Display *display = static_cast&lt;Display *&gt;(dpy);
+    AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
+
+    Error error = ValidateCreateStreamKHR(display, attributes);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_NO_STREAM_KHR;
+    }
+
+    Stream *stream;
+    error = display-&gt;createStream(attributes, &amp;stream);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_NO_STREAM_KHR;
+    }
+
+    SetGlobalError(error);
+    return static_cast&lt;EGLStreamKHR&gt;(stream);
+}
+
+EGLBoolean EGLAPIENTRY DestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    EVENT(&quot;(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR = 0x%0.8p)&quot;, dpy, stream);
+
+    Display *display     = static_cast&lt;Display *&gt;(dpy);
+    Stream *streamObject = static_cast&lt;Stream *&gt;(stream);
+
+    Error error = ValidateDestroyStreamKHR(display, streamObject);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    display-&gt;destroyStream(streamObject);
+    SetGlobalError(error);
+    return EGL_TRUE;
+}
+
+EGLBoolean EGLAPIENTRY StreamAttribKHR(EGLDisplay dpy,
+                                       EGLStreamKHR stream,
+                                       EGLenum attribute,
+                                       EGLint value)
+{
+    EVENT(
+        &quot;(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR stream = 0x%0.8p, EGLenum attribute = 0x%X, &quot;
+        &quot;EGLint value = 0x%X)&quot;,
+        dpy, stream, attribute, value);
+
+    Display *display     = static_cast&lt;Display *&gt;(dpy);
+    Stream *streamObject = static_cast&lt;Stream *&gt;(stream);
+
+    Error error = ValidateStreamAttribKHR(display, streamObject, attribute, value);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    switch (attribute)
+    {
+        case EGL_CONSUMER_LATENCY_USEC_KHR:
+            streamObject-&gt;setConsumerLatency(value);
+            break;
+        case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
+            streamObject-&gt;setConsumerAcquireTimeout(value);
+            break;
+        default:
+            UNREACHABLE();
+    }
+
+    SetGlobalError(error);
+    return EGL_TRUE;
+}
+
+EGLBoolean EGLAPIENTRY QueryStreamKHR(EGLDisplay dpy,
+                                      EGLStreamKHR stream,
+                                      EGLenum attribute,
+                                      EGLint *value)
+{
+    EVENT(
+        &quot;(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR stream = 0x%0.8p, EGLenum attribute = 0x%X, &quot;
+        &quot;EGLint value = 0x%0.8p)&quot;,
+        dpy, stream, attribute, value);
+
+    Display *display     = static_cast&lt;Display *&gt;(dpy);
+    Stream *streamObject = static_cast&lt;Stream *&gt;(stream);
+
+    Error error = ValidateQueryStreamKHR(display, streamObject, attribute, value);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    switch (attribute)
+    {
+        case EGL_STREAM_STATE_KHR:
+            *value = streamObject-&gt;getState();
+            break;
+        case EGL_CONSUMER_LATENCY_USEC_KHR:
+            *value = streamObject-&gt;getConsumerLatency();
+            break;
+        case EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR:
+            *value = streamObject-&gt;getConsumerAcquireTimeout();
+            break;
+        default:
+            UNREACHABLE();
+    }
+
+    SetGlobalError(error);
+    return EGL_TRUE;
+}
+
+EGLBoolean EGLAPIENTRY QueryStreamu64KHR(EGLDisplay dpy,
+                                         EGLStreamKHR stream,
+                                         EGLenum attribute,
+                                         EGLuint64KHR *value)
+{
+    EVENT(
+        &quot;(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR stream = 0x%0.8p, EGLenum attribute = 0x%X, &quot;
+        &quot;EGLuint64KHR value = 0x%0.8p)&quot;,
+        dpy, stream, attribute, value);
+
+    Display *display     = static_cast&lt;Display *&gt;(dpy);
+    Stream *streamObject = static_cast&lt;Stream *&gt;(stream);
+
+    Error error = ValidateQueryStreamu64KHR(display, streamObject, attribute, value);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    switch (attribute)
+    {
+        case EGL_PRODUCER_FRAME_KHR:
+            *value = streamObject-&gt;getProducerFrame();
+            break;
+        case EGL_CONSUMER_FRAME_KHR:
+            *value = streamObject-&gt;getConsumerFrame();
+            break;
+        default:
+            UNREACHABLE();
+    }
+
+    SetGlobalError(error);
+    return EGL_TRUE;
+}
+
+EGLBoolean EGLAPIENTRY StreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    EVENT(&quot;(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR = 0x%0.8p)&quot;, dpy, stream);
+    Display *display     = static_cast&lt;Display *&gt;(dpy);
+    Stream *streamObject = static_cast&lt;Stream *&gt;(stream);
+    gl::Context *context = gl::GetValidGlobalContext();
+
+    Error error = ValidateStreamConsumerGLTextureExternalKHR(display, context, streamObject);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+    SetGlobalError(error);
+    return EGL_FALSE;
+}
+
+EGLBoolean EGLAPIENTRY StreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    EVENT(&quot;(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR = 0x%0.8p)&quot;, dpy, stream);
+    Display *display     = static_cast&lt;Display *&gt;(dpy);
+    Stream *streamObject = static_cast&lt;Stream *&gt;(stream);
+    gl::Context *context = gl::GetValidGlobalContext();
+
+    Error error = ValidateStreamConsumerAcquireKHR(display, context, streamObject);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+    SetGlobalError(error);
+    return EGL_FALSE;
+}
+
+EGLBoolean EGLAPIENTRY StreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream)
+{
+    EVENT(&quot;(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR = 0x%0.8p)&quot;, dpy, stream);
+    Display *display     = static_cast&lt;Display *&gt;(dpy);
+    Stream *streamObject = static_cast&lt;Stream *&gt;(stream);
+    gl::Context *context = gl::GetValidGlobalContext();
+
+    Error error = ValidateStreamConsumerReleaseKHR(display, context, streamObject);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+    SetGlobalError(error);
+    return EGL_FALSE;
+}
+
+EGLBoolean EGLAPIENTRY StreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
+                                                                EGLStreamKHR stream,
+                                                                const EGLAttrib *attrib_list)
+{
+    EVENT(
+        &quot;(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR stream = 0x%0.8p, EGLAttrib attrib_list = 0x%0.8p&quot;,
+        dpy, stream, attrib_list);
+    Display *display        = static_cast&lt;Display *&gt;(dpy);
+    Stream *streamObject    = static_cast&lt;Stream *&gt;(stream);
+    gl::Context *context    = gl::GetValidGlobalContext();
+    AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
+
+    Error error = ValidateStreamConsumerGLTextureExternalAttribsNV(display, context, streamObject,
+                                                                   attributes);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+    SetGlobalError(error);
+    return EGL_FALSE;
+}
+
+EGLBoolean EGLAPIENTRY CreateStreamProducerD3DTextureNV12ANGLE(EGLDisplay dpy,
+                                                               EGLStreamKHR stream,
+                                                               const EGLAttrib *attrib_list)
+{
+    EVENT(
+        &quot;(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR stream = 0x%0.8p, EGLAttrib attrib_list = 0x%0.8p&quot;,
+        dpy, stream, attrib_list);
+    Display *display        = static_cast&lt;Display *&gt;(dpy);
+    Stream *streamObject    = static_cast&lt;Stream *&gt;(stream);
+    AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
+
+    Error error =
+        ValidateCreateStreamProducerD3DTextureNV12ANGLE(display, streamObject, attributes);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    SetGlobalError(error);
+    return EGL_FALSE;
+}
+
+EGLBoolean EGLAPIENTRY StreamPostD3DTextureNV12ANGLE(EGLDisplay dpy,
+                                                     EGLStreamKHR stream,
+                                                     void *texture,
+                                                     const EGLAttrib *attrib_list)
+{
+    EVENT(
+        &quot;(EGLDisplay dpy = 0x%0.8p, EGLStreamKHR stream = 0x%0.8p, void* texture = 0x%0.8p, &quot;
+        &quot;EGLAttrib attrib_list = 0x%0.8p&quot;,
+        dpy, stream, texture, attrib_list);
+    Display *display        = static_cast&lt;Display *&gt;(dpy);
+    Stream *streamObject    = static_cast&lt;Stream *&gt;(stream);
+    AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
+
+    Error error = ValidateStreamPostD3DTextureNV12ANGLE(display, streamObject, texture, attributes);
+    if (error.isError())
+    {
+        SetGlobalError(error);
+        return EGL_FALSE;
+    }
+
+    SetGlobalError(error);
+    return EGL_FALSE;
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_egl_exth"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -30,6 +30,55 @@
</span><span class="cx"> ANGLE_EXPORT EGLBoolean EGLAPIENTRY QueryDeviceAttribEXT(EGLDeviceEXT device, EGLint attribute, EGLAttrib *value);
</span><span class="cx"> ANGLE_EXPORT const char * EGLAPIENTRY QueryDeviceStringEXT(EGLDeviceEXT device, EGLint name);
</span><span class="cx"> 
</span><del>-}
</del><ins>+// EGL_KHR_image_base/EGL_KHR_image
+ANGLE_EXPORT EGLImageKHR EGLAPIENTRY CreateImageKHR(EGLDisplay dpy,
+                                                    EGLContext ctx,
+                                                    EGLenum target,
+                                                    EGLClientBuffer buffer,
+                                                    const EGLint *attrib_list);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
</ins><span class="cx"> 
</span><ins>+// EGL_EXT_device_creation
+ANGLE_EXPORT EGLDeviceEXT EGLAPIENTRY CreateDeviceANGLE(EGLint device_type,
+                                                        void *native_device,
+                                                        const EGLAttrib *attrib_list);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY ReleaseDeviceANGLE(EGLDeviceEXT device);
+
+// EGL_KHR_stream
+ANGLE_EXPORT EGLStreamKHR EGLAPIENTRY CreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY DestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY StreamAttribKHR(EGLDisplay dpy,
+                                                    EGLStreamKHR stream,
+                                                    EGLenum attribute,
+                                                    EGLint value);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY QueryStreamKHR(EGLDisplay dpy,
+                                                   EGLStreamKHR stream,
+                                                   EGLenum attribute,
+                                                   EGLint *value);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY QueryStreamu64KHR(EGLDisplay dpy,
+                                                      EGLStreamKHR stream,
+                                                      EGLenum attribute,
+                                                      EGLuint64KHR *value);
+
+// EGL_KHR_stream_consumer_gltexture
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY StreamConsumerGLTextureExternalKHR(EGLDisplay dpy,
+                                                                       EGLStreamKHR stream);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY StreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY StreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY
+StreamConsumerGLTextureExternalAttribsNV(EGLDisplay dpy,
+                                         EGLStreamKHR stream,
+                                         const EGLAttrib *attrib_list);
+
+// EGL_ANGLE_stream_producer_d3d_texture_nv12
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY
+CreateStreamProducerD3DTextureNV12ANGLE(EGLDisplay dpy,
+                                        EGLStreamKHR stream,
+                                        const EGLAttrib *attrib_list);
+ANGLE_EXPORT EGLBoolean EGLAPIENTRY StreamPostD3DTextureNV12ANGLE(EGLDisplay dpy,
+                                                                  EGLStreamKHR stream,
+                                                                  void *texture,
+                                                                  const EGLAttrib *attrib_list);
+}  // namespace egl
+
</ins><span class="cx"> #endif // LIBGLESV2_ENTRYPOINTSEGLEXT_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_gles_2_0cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -59,35 +59,16 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Program *programObject = context-&gt;getProgram(program);
-        Shader *shaderObject = context-&gt;getShader(shader);
-
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        Shader *shaderObject = GetValidShader(context, shader);
</ins><span class="cx">         if (!shaderObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getProgram(shader))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (!programObject-&gt;attachShader(shaderObject))
</span><span class="lines">@@ -111,20 +92,11 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (strncmp(name, &quot;gl_&quot;, 3) == 0)
</span><span class="lines">@@ -233,34 +205,11 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Texture *textureObject = context-&gt;getTexture(texture);
-
-        if (textureObject &amp;&amp; textureObject-&gt;getTarget() != target &amp;&amp; texture != 0)
</del><ins>+        if (!ValidateBindTexture(context, target, texture))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        switch (target)
-        {
-          case GL_TEXTURE_2D:
-          case GL_TEXTURE_CUBE_MAP:
-            break;
-
-          case GL_TEXTURE_3D:
-          case GL_TEXTURE_2D_ARRAY:
-            if (context-&gt;getClientVersion() &lt; 3)
-            {
-                context-&gt;recordError(Error(GL_INVALID_ENUM));
-                return;
-            }
-            break;
-
-          default:
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
-
</del><span class="cx">         context-&gt;bindTexture(target, texture);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -444,17 +393,25 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
-                                  dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
</del><ins>+        if (context-&gt;getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc)
+        {
+            bool constantColorUsed =
+                (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
+                 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
</ins><span class="cx"> 
</span><del>-        bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
-                                  dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
</del><ins>+            bool constantAlphaUsed =
+                (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
+                 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
</ins><span class="cx"> 
</span><del>-        if (constantColorUsed &amp;&amp; constantAlphaUsed)
-        {
-            ERR(&quot;Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL&quot;);
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
</del><ins>+            if (constantColorUsed &amp;&amp; constantAlphaUsed)
+            {
+                ERR(
+                    &quot;Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and &quot;
+                    &quot;GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR not supported by this &quot;
+                    &quot;implementation.&quot;);
+                context-&gt;recordError(Error(GL_INVALID_OPERATION));
+                return;
+            }
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         context-&gt;getState().setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
</span><span class="lines">@@ -613,27 +570,12 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Framebuffer *framebufferObject = context-&gt;getState().getDrawFramebuffer();
-        ASSERT(framebufferObject);
-
-        if (framebufferObject-&gt;checkStatus(context-&gt;getData()) != GL_FRAMEBUFFER_COMPLETE)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateClear(context, mask))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_FRAMEBUFFER_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if ((mask &amp; ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
-        Error error = framebufferObject-&gt;clear(context-&gt;getData(), mask);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;clear(mask);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -690,22 +632,11 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Shader *shaderObject = context-&gt;getShader(shader);
-
</del><ins>+        Shader *shaderObject = GetValidShader(context, shader);
</ins><span class="cx">         if (!shaderObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getProgram(shader))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><del>-
</del><span class="cx">         shaderObject-&gt;compile(context-&gt;getCompiler());
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -720,36 +651,15 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3 &amp;&amp;
-            !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
-                                           0, 0, width, height, border, GL_NONE, GL_NONE, data))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateCompressedTexImage2D(context, target, level, internalformat, width, height,
+                                          border, imageSize, data))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (context-&gt;getClientVersion() &gt;= 3 &amp;&amp;
-            !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
-                                           0, 0, 0, width, height, 1, border, GL_NONE, GL_NONE, data))
-        {
-            return;
-        }
-
-        const InternalFormat &amp;formatInfo = GetInternalFormatInfo(internalformat);
-        if (imageSize &lt; 0 || static_cast&lt;GLuint&gt;(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
-        Extents size(width, height, 1);
-        Texture *texture = context-&gt;getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-        Error error = texture-&gt;setCompressedImage(target, level, internalformat, size, context-&gt;getState().getUnpackState(), 
-                                                  reinterpret_cast&lt;const uint8_t *&gt;(data));
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;compressedTexImage2D(target, level, internalformat, width, height, border,
+                                      imageSize, data);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -764,37 +674,15 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3 &amp;&amp;
-            !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
-                                           xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateCompressedTexSubImage2D(context, target, level, xoffset, yoffset, width,
+                                             height, format, imageSize, data))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (context-&gt;getClientVersion() &gt;= 3 &amp;&amp;
-            !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
-                                           xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
-        {
-            return;
-        }
-
-        const InternalFormat &amp;formatInfo = GetInternalFormatInfo(format);
-        if (imageSize &lt; 0 || static_cast&lt;GLuint&gt;(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
-
-        Box area(xoffset, yoffset, 0, width, height, 1);
-        Texture *texture = context-&gt;getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-        Error error = texture-&gt;setCompressedSubImage(target, level, area, format, context-&gt;getState().getUnpackState(),
-                                                     reinterpret_cast&lt;const uint8_t *&gt;(data));
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format,
+                                         imageSize, data);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -807,30 +695,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3 &amp;&amp;
-            !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
-                                               0, 0, x, y, width, height, border))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateCopyTexImage2D(context, target, level, internalformat, x, y, width, height,
+                                    border))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><del>-
-        if (context-&gt;getClientVersion() &gt;= 3 &amp;&amp;
-            !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
-                                               0, 0, 0, x, y, width, height, border))
-        {
-            return;
-        }
-
-        Rectangle sourceArea(x, y, width, height);
-
-        const Framebuffer *framebuffer = context-&gt;getState().getReadFramebuffer();
-        Texture *texture = context-&gt;getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-        Error error = texture-&gt;copyImage(target, level, sourceArea, internalformat, framebuffer);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;copyTexImage2D(target, level, internalformat, x, y, width, height, border);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -843,31 +714,14 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3 &amp;&amp;
-            !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
-                                               xoffset, yoffset, x, y, width, height, 0))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateCopyTexSubImage2D(context, target, level, xoffset, yoffset, x, y, width,
+                                       height))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (context-&gt;getClientVersion() &gt;= 3 &amp;&amp;
-            !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
-                                               xoffset, yoffset, 0, x, y, width, height, 0))
-        {
-            return;
-        }
-
-        Offset destOffset(xoffset, yoffset, 0);
-        Rectangle sourceArea(x, y, width, height);
-
-        const Framebuffer *framebuffer = context-&gt;getState().getReadFramebuffer();
-        Texture *texture = context-&gt;getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-        Error error = texture-&gt;copySubImage(target, level, destOffset, sourceArea, framebuffer);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -936,9 +790,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDeleteBuffers(context, n, buffers))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -956,9 +809,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDeleteFramebuffers(context, n, framebuffers))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1009,9 +861,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDeleteRenderbuffers(context, n, renderbuffers))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1059,9 +910,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDeleteTextures(context, n, textures))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1131,38 +981,16 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Program *programObject = context-&gt;getProgram(program);
-        Shader *shaderObject = context-&gt;getShader(shader);
-
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            Shader *shaderByProgramHandle;
-            shaderByProgramHandle = context-&gt;getShader(program);
-            if (!shaderByProgramHandle)
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        Shader *shaderObject = GetValidShader(context, shader);
</ins><span class="cx">         if (!shaderObject)
</span><span class="cx">         {
</span><del>-            Program *programByShaderHandle = context-&gt;getProgram(shader);
-            if (!programByShaderHandle)
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (!programObject-&gt;detachShader(shaderObject))
</span><span class="lines">@@ -1219,7 +1047,7 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Error error = context-&gt;drawArrays(mode, first, count, 0);
</del><ins>+        Error error = context-&gt;drawArrays(mode, first, count);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(error);
</span><span class="lines">@@ -1236,13 +1064,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        rx::RangeUI indexRange;
</del><ins>+        IndexRange indexRange;
</ins><span class="cx">         if (!ValidateDrawElements(context, mode, count, type, indices, 0, &amp;indexRange))
</span><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Error error = context-&gt;drawElements(mode, count, type, indices, 0, indexRange);
</del><ins>+        Error error = context-&gt;drawElements(mode, count, type, indices, indexRange);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(error);
</span><span class="lines">@@ -1264,6 +1092,20 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        if (context-&gt;getLimitations().noSampleAlphaToCoverageSupport)
+        {
+            if (cap == GL_SAMPLE_ALPHA_TO_COVERAGE)
+            {
+                const char *errorMessage = &quot;Current renderer doesn't support alpha-to-coverage&quot;;
+                context-&gt;recordError(Error(GL_INVALID_OPERATION, errorMessage));
+
+                // We also output an error message to the debugger window if tracing is active, so that developers can see the error message.
+                ERR(&quot;%s&quot;, errorMessage);
+
+                return;
+            }
+        }
+
</ins><span class="cx">         context-&gt;getState().setEnableFeature(cap, true);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -1325,29 +1167,14 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER &amp;&amp; renderbuffer != 0))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateFramebufferRenderbuffer(context, target, attachment, renderbuffertarget,
+                                             renderbuffer))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_ENUM));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
-        {
-            return;
-        }
-
-        Framebuffer *framebuffer = context-&gt;getState().getTargetFramebuffer(target);
-        ASSERT(framebuffer);
-
-        if (renderbuffer != 0)
-        {
-            Renderbuffer *renderbufferObject = context-&gt;getRenderbuffer(renderbuffer);
-            framebuffer-&gt;setAttachment(GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(), renderbufferObject);
-        }
-        else
-        {
-            framebuffer-&gt;resetAttachment(attachment);
-        }
</del><ins>+        context-&gt;framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1359,36 +1186,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateFramebufferTexture2D(context, target, attachment, textarget, texture, level))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateFramebufferTexture2D(context, target, attachment, textarget, texture, level))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Framebuffer *framebuffer = context-&gt;getState().getTargetFramebuffer(target);
-        ASSERT(framebuffer);
-
-        if (texture != 0)
-        {
-            Texture *textureObj = context-&gt;getTexture(texture);
-
-            ImageIndex index = ImageIndex::MakeInvalid();
-
-            if (textarget == GL_TEXTURE_2D)
-            {
-                index = ImageIndex::Make2D(level);
-            }
-            else
-            {
-                ASSERT(IsCubeMapTextureTarget(textarget));
-                index = ImageIndex::MakeCube(textarget, level);
-            }
-
-            framebuffer-&gt;setAttachment(GL_TEXTURE, attachment, index, textureObj);
-        }
-        else
-        {
-            framebuffer-&gt;resetAttachment(attachment);
-        }
</del><ins>+        context-&gt;framebufferTexture2D(target, attachment, textarget, texture, level);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1419,9 +1223,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateGenBuffers(context, n, buffers))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1485,7 +1288,9 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Non-power of 2 ES2 check
</span><del>-        if (!context-&gt;getExtensions().textureNPOT &amp;&amp; (!isPow2(texture-&gt;getWidth(baseTarget, 0)) || !isPow2(texture-&gt;getHeight(baseTarget, 0))))
</del><ins>+        if (!context-&gt;getExtensions().textureNPOT &amp;&amp;
+            (!isPow2(static_cast&lt;int&gt;(texture-&gt;getWidth(baseTarget, 0))) ||
+             !isPow2(static_cast&lt;int&gt;(texture-&gt;getHeight(baseTarget, 0)))))
</ins><span class="cx">         {
</span><span class="cx">             ASSERT(context-&gt;getClientVersion() &lt;= 2 &amp;&amp; (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="lines">@@ -1515,9 +1320,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateGenFramebuffers(context, n, framebuffers))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1535,9 +1339,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateGenRenderbuffers(context, n, renderbuffers))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1555,9 +1358,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateGenTextures(context, n, textures))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1583,20 +1385,11 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (index &gt;= (GLuint)programObject-&gt;getActiveAttributeCount())
</span><span class="lines">@@ -1625,20 +1418,11 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (index &gt;= (GLuint)programObject-&gt;getActiveUniformCount())
</span><span class="lines">@@ -1665,20 +1449,11 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         return programObject-&gt;getAttachedShaders(maxcount, count, shaders);
</span><span class="lines">@@ -1692,20 +1467,11 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return -1;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return -1;
-            }
</del><ins>+            return -1;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (!programObject-&gt;isLinked())
</span><span class="lines">@@ -1960,7 +1726,7 @@
</span><span class="cx">                     break;
</span><span class="cx"> 
</span><span class="cx">                   case GL_DEPTH_STENCIL_ATTACHMENT:
</span><del>-                    if (framebuffer-&gt;hasValidDepthStencil())
</del><ins>+                    if (!framebuffer-&gt;hasValidDepthStencil())
</ins><span class="cx">                     {
</span><span class="cx">                         context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">                         return;
</span><span class="lines">@@ -2138,11 +1904,10 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -2155,6 +1920,7 @@
</span><span class="cx">               case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
</span><span class="cx">               case GL_TRANSFORM_FEEDBACK_VARYINGS:
</span><span class="cx">               case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
</span><ins>+              case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
</ins><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><span class="lines">@@ -2207,6 +1973,9 @@
</span><span class="cx">           case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
</span><span class="cx">             *params = programObject-&gt;getTransformFeedbackVaryingMaxLength();
</span><span class="cx">             break;
</span><ins>+          case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
+              *params = programObject-&gt;getBinaryRetrievableHint();
+              break;
</ins><span class="cx"> 
</span><span class="cx">           default:
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="lines">@@ -2229,11 +1998,9 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
-
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -2297,11 +2064,9 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Shader *shaderObject = context-&gt;getShader(shader);
-
</del><ins>+        Shader *shaderObject = GetValidShader(context, shader);
</ins><span class="cx">         if (!shaderObject)
</span><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -2323,7 +2088,7 @@
</span><span class="cx">             *params = shaderObject-&gt;getSourceLength();
</span><span class="cx">             return;
</span><span class="cx">           case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
</span><del>-            *params = shaderObject-&gt;getTranslatedSourceLength();
</del><ins>+            *params = shaderObject-&gt;getTranslatedSourceWithDebugInfoLength();
</ins><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">           default:
</span><span class="lines">@@ -2347,11 +2112,9 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Shader *shaderObject = context-&gt;getShader(shader);
-
</del><ins>+        Shader *shaderObject = GetValidShader(context, shader);
</ins><span class="cx">         if (!shaderObject)
</span><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -2447,11 +2210,9 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Shader *shaderObject = context-&gt;getShader(shader);
-
</del><ins>+        Shader *shaderObject = GetValidShader(context, shader);
</ins><span class="cx">         if (!shaderObject)
</span><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -2465,44 +2226,50 @@
</span><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx"> 
</span><del>-    switch (name)
</del><ins>+    if (context)
</ins><span class="cx">     {
</span><del>-      case GL_VENDOR:
-        return (GLubyte*)&quot;Google Inc.&quot;;
</del><ins>+        switch (name)
+        {
+            case GL_VENDOR:
+                return reinterpret_cast&lt;const GLubyte *&gt;(&quot;Google Inc.&quot;);
</ins><span class="cx"> 
</span><del>-      case GL_RENDERER:
-        return (GLubyte*)((context != NULL) ? context-&gt;getRendererString().c_str() : &quot;ANGLE&quot;);
</del><ins>+            case GL_RENDERER:
+                return reinterpret_cast&lt;const GLubyte *&gt;(context-&gt;getRendererString().c_str());
</ins><span class="cx"> 
</span><del>-      case GL_VERSION:
-        if (context-&gt;getClientVersion() == 2)
-        {
-            return (GLubyte*)&quot;OpenGL ES 2.0 (ANGLE &quot; ANGLE_VERSION_STRING &quot;)&quot;;
-        }
-        else
-        {
-            return (GLubyte*)&quot;OpenGL ES 3.0 (ANGLE &quot; ANGLE_VERSION_STRING &quot;)&quot;;
-        }
</del><ins>+            case GL_VERSION:
+                if (context-&gt;getClientVersion() == 2)
+                {
+                    return reinterpret_cast&lt;const GLubyte *&gt;(
+                        &quot;OpenGL ES 2.0 (ANGLE &quot; ANGLE_VERSION_STRING &quot;)&quot;);
+                }
+                else
+                {
+                    return reinterpret_cast&lt;const GLubyte *&gt;(
+                        &quot;OpenGL ES 3.0 (ANGLE &quot; ANGLE_VERSION_STRING &quot;)&quot;);
+                }
</ins><span class="cx"> 
</span><del>-      case GL_SHADING_LANGUAGE_VERSION:
-        if (context-&gt;getClientVersion() == 2)
-        {
-            return (GLubyte*)&quot;OpenGL ES GLSL ES 1.00 (ANGLE &quot; ANGLE_VERSION_STRING &quot;)&quot;;
-        }
-        else
-        {
-            return (GLubyte*)&quot;OpenGL ES GLSL ES 3.00 (ANGLE &quot; ANGLE_VERSION_STRING &quot;)&quot;;
-        }
</del><ins>+            case GL_SHADING_LANGUAGE_VERSION:
+                if (context-&gt;getClientVersion() == 2)
+                {
+                    return reinterpret_cast&lt;const GLubyte *&gt;(
+                        &quot;OpenGL ES GLSL ES 1.00 (ANGLE &quot; ANGLE_VERSION_STRING &quot;)&quot;);
+                }
+                else
+                {
+                    return reinterpret_cast&lt;const GLubyte *&gt;(
+                        &quot;OpenGL ES GLSL ES 3.00 (ANGLE &quot; ANGLE_VERSION_STRING &quot;)&quot;);
+                }
</ins><span class="cx"> 
</span><del>-      case GL_EXTENSIONS:
-        return (GLubyte*)((context != NULL) ? context-&gt;getExtensionString().c_str() : &quot;&quot;);
</del><ins>+            case GL_EXTENSIONS:
+                return reinterpret_cast&lt;const GLubyte *&gt;(context-&gt;getExtensionString().c_str());
</ins><span class="cx"> 
</span><del>-      default:
-        if (context)
-        {
</del><ins>+            default:
</ins><span class="cx">             context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><ins>+            return nullptr;
</ins><span class="cx">         }
</span><del>-        return NULL;
</del><span class="cx">     }
</span><ins>+
+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void GL_APIENTRY GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
</span><span class="lines">@@ -2529,16 +2296,16 @@
</span><span class="cx">         switch (pname)
</span><span class="cx">         {
</span><span class="cx">           case GL_TEXTURE_MAG_FILTER:
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().magFilter;
</del><ins>+              *params = (GLfloat)texture-&gt;getMagFilter();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_MIN_FILTER:
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().minFilter;
</del><ins>+              *params = (GLfloat)texture-&gt;getMinFilter();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_WRAP_S:
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().wrapS;
</del><ins>+              *params = (GLfloat)texture-&gt;getWrapS();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_WRAP_T:
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().wrapT;
</del><ins>+              *params = (GLfloat)texture-&gt;getWrapT();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_WRAP_R:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2546,11 +2313,11 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().wrapR;
</del><ins>+            *params = (GLfloat)texture-&gt;getWrapR();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_IMMUTABLE_FORMAT:
</span><span class="cx">             // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
</span><del>-            *params = (GLfloat)(texture-&gt;isImmutable() ? GL_TRUE : GL_FALSE);
</del><ins>+            *params = (GLfloat)(texture-&gt;getImmutableFormat() ? GL_TRUE : GL_FALSE);
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_IMMUTABLE_LEVELS:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2558,7 +2325,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLfloat)texture-&gt;immutableLevelCount();
</del><ins>+            *params = (GLfloat)texture-&gt;getImmutableLevels();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_USAGE_ANGLE:
</span><span class="cx">             *params = (GLfloat)texture-&gt;getUsage();
</span><span class="lines">@@ -2569,7 +2336,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().maxAnisotropy;
</del><ins>+            *params = (GLfloat)texture-&gt;getMaxAnisotropy();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_SWIZZLE_R:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2577,7 +2344,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().swizzleRed;
</del><ins>+            *params = (GLfloat)texture-&gt;getSwizzleRed();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_SWIZZLE_G:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2585,7 +2352,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().swizzleGreen;
</del><ins>+            *params = (GLfloat)texture-&gt;getSwizzleGreen();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_SWIZZLE_B:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2593,7 +2360,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().swizzleBlue;
</del><ins>+            *params = (GLfloat)texture-&gt;getSwizzleBlue();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_SWIZZLE_A:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2601,7 +2368,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().swizzleAlpha;
</del><ins>+            *params = (GLfloat)texture-&gt;getSwizzleAlpha();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_BASE_LEVEL:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2609,7 +2376,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().baseLevel;
</del><ins>+            *params = (GLfloat)texture-&gt;getBaseLevel();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_MAX_LEVEL:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2617,7 +2384,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLfloat)texture-&gt;getSamplerState().maxLevel;
</del><ins>+            *params = (GLfloat)texture-&gt;getMaxLevel();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_MIN_LOD:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2635,7 +2402,26 @@
</span><span class="cx">             }
</span><span class="cx">             *params = texture-&gt;getSamplerState().maxLod;
</span><span class="cx">             break;
</span><del>-
</del><ins>+          case GL_TEXTURE_COMPARE_MODE:
+            if (context-&gt;getClientVersion() &lt; 3)
+            {
+                context-&gt;recordError(
+                    Error(GL_INVALID_ENUM,
+                          &quot;GL_TEXTURE_COMPARE_MODE not available in ES versions &lt; 3.0&quot;));
+                return;
+            }
+            *params = static_cast&lt;GLfloat&gt;(texture-&gt;getCompareMode());
+            break;
+          case GL_TEXTURE_COMPARE_FUNC:
+            if (context-&gt;getClientVersion() &lt; 3)
+            {
+                context-&gt;recordError(
+                    Error(GL_INVALID_ENUM,
+                          &quot;GL_TEXTURE_COMPARE_FUNC not available in ES versions &lt; 3.0&quot;));
+                return;
+            }
+            *params = static_cast&lt;GLfloat&gt;(texture-&gt;getCompareFunc());
+            break;
</ins><span class="cx">           default:
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">             return;
</span><span class="lines">@@ -2688,7 +2474,7 @@
</span><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_IMMUTABLE_FORMAT:
</span><span class="cx">             // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
</span><del>-            *params = texture-&gt;isImmutable() ? GL_TRUE : GL_FALSE;
</del><ins>+            *params = texture-&gt;getImmutableFormat() ? GL_TRUE : GL_FALSE;
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_IMMUTABLE_LEVELS:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2696,7 +2482,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = static_cast&lt;GLint&gt;(texture-&gt;immutableLevelCount());
</del><ins>+            *params = static_cast&lt;GLint&gt;(texture-&gt;getImmutableLevels());
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_USAGE_ANGLE:
</span><span class="cx">             *params = texture-&gt;getUsage();
</span><span class="lines">@@ -2707,7 +2493,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLint)texture-&gt;getSamplerState().maxAnisotropy;
</del><ins>+            *params = (GLint)texture-&gt;getMaxAnisotropy();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_SWIZZLE_R:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2715,7 +2501,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = texture-&gt;getSamplerState().swizzleRed;
</del><ins>+            *params = texture-&gt;getSwizzleRed();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_SWIZZLE_G:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2723,7 +2509,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = texture-&gt;getSamplerState().swizzleGreen;
</del><ins>+            *params = texture-&gt;getSwizzleGreen();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_SWIZZLE_B:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2731,7 +2517,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = texture-&gt;getSamplerState().swizzleBlue;
</del><ins>+            *params = texture-&gt;getSwizzleBlue();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_SWIZZLE_A:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2739,7 +2525,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = texture-&gt;getSamplerState().swizzleAlpha;
</del><ins>+            *params = texture-&gt;getSwizzleAlpha();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_BASE_LEVEL:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2747,7 +2533,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = texture-&gt;getSamplerState().baseLevel;
</del><ins>+            *params = texture-&gt;getBaseLevel();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_MAX_LEVEL:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2755,7 +2541,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = texture-&gt;getSamplerState().maxLevel;
</del><ins>+            *params = texture-&gt;getMaxLevel();
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_MIN_LOD:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2763,7 +2549,7 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLint)texture-&gt;getSamplerState().minLod;
</del><ins>+            *params = iround&lt;GLint&gt;(texture-&gt;getMinLod());
</ins><span class="cx">             break;
</span><span class="cx">           case GL_TEXTURE_MAX_LOD:
</span><span class="cx">             if (context-&gt;getClientVersion() &lt; 3)
</span><span class="lines">@@ -2771,9 +2557,28 @@
</span><span class="cx">                 context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-            *params = (GLint)texture-&gt;getSamplerState().maxLod;
</del><ins>+            *params = iround&lt;GLint&gt;(texture-&gt;getMaxLod());
</ins><span class="cx">             break;
</span><del>-
</del><ins>+          case GL_TEXTURE_COMPARE_MODE:
+            if (context-&gt;getClientVersion() &lt; 3)
+            {
+                context-&gt;recordError(
+                    Error(GL_INVALID_ENUM,
+                          &quot;GL_TEXTURE_COMPARE_MODE not available in ES versions &lt; 3.0&quot;));
+                return;
+            }
+            *params = texture-&gt;getCompareMode();
+            break;
+          case GL_TEXTURE_COMPARE_FUNC:
+            if (context-&gt;getClientVersion() &lt; 3)
+            {
+                context-&gt;recordError(
+                    Error(GL_INVALID_ENUM,
+                          &quot;GL_TEXTURE_COMPARE_FUNC not available in ES versions &lt; 3.0&quot;));
+                return;
+            }
+            *params = texture-&gt;getCompareFunc();
+            break;
</ins><span class="cx">           default:
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_ENUM));
</span><span class="cx">             return;
</span><span class="lines">@@ -2831,20 +2636,11 @@
</span><span class="cx">             return -1;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return -1;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return -1;
-            }
</del><ins>+            return -1;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (!programObject-&gt;isLinked())
</span><span class="lines">@@ -3138,20 +2934,15 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateLinkProgram(context, program))
+        {
+            return;
+        }
</ins><span class="cx"> 
</span><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         Error error = programObject-&gt;link(context-&gt;getData());
</span><span class="lines">@@ -3176,14 +2967,28 @@
</span><span class="cx">             {
</span><span class="cx">               case GL_UNPACK_IMAGE_HEIGHT:
</span><span class="cx">               case GL_UNPACK_SKIP_IMAGES:
</span><ins>+                  context-&gt;recordError(Error(GL_INVALID_ENUM));
+                  return;
+
</ins><span class="cx">               case GL_UNPACK_ROW_LENGTH:
</span><span class="cx">               case GL_UNPACK_SKIP_ROWS:
</span><span class="cx">               case GL_UNPACK_SKIP_PIXELS:
</span><ins>+                  if (!context-&gt;getExtensions().unpackSubimage)
+                  {
+                      context-&gt;recordError(Error(GL_INVALID_ENUM));
+                      return;
+                  }
+                  break;
+
</ins><span class="cx">               case GL_PACK_ROW_LENGTH:
</span><span class="cx">               case GL_PACK_SKIP_ROWS:
</span><span class="cx">               case GL_PACK_SKIP_PIXELS:
</span><del>-                context-&gt;recordError(Error(GL_INVALID_ENUM));
-                return;
</del><ins>+                  if (!context-&gt;getExtensions().packSubimage)
+                  {
+                      context-&gt;recordError(Error(GL_INVALID_ENUM));
+                      return;
+                  }
+                  break;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -3222,43 +3027,43 @@
</span><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           case GL_UNPACK_ROW_LENGTH:
</span><del>-            ASSERT(context-&gt;getClientVersion() &gt;= 3);
</del><ins>+              ASSERT((context-&gt;getClientVersion() &gt;= 3) || context-&gt;getExtensions().unpackSubimage);
</ins><span class="cx">             state.setUnpackRowLength(param);
</span><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           case GL_UNPACK_IMAGE_HEIGHT:
</span><span class="cx">             ASSERT(context-&gt;getClientVersion() &gt;= 3);
</span><del>-            state.getUnpackState().imageHeight = param;
</del><ins>+            state.setUnpackImageHeight(param);
</ins><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           case GL_UNPACK_SKIP_IMAGES:
</span><del>-            ASSERT(context-&gt;getClientVersion() &gt;= 3);
-            state.getUnpackState().skipImages = param;
</del><ins>+              ASSERT(context-&gt;getClientVersion() &gt;= 3);
+              state.setUnpackSkipImages(param);
</ins><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           case GL_UNPACK_SKIP_ROWS:
</span><del>-            ASSERT(context-&gt;getClientVersion() &gt;= 3);
-            state.getUnpackState().skipRows = param;
</del><ins>+              ASSERT((context-&gt;getClientVersion() &gt;= 3) || context-&gt;getExtensions().unpackSubimage);
+              state.setUnpackSkipRows(param);
</ins><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           case GL_UNPACK_SKIP_PIXELS:
</span><del>-            ASSERT(context-&gt;getClientVersion() &gt;= 3);
-            state.getUnpackState().skipPixels = param;
</del><ins>+              ASSERT((context-&gt;getClientVersion() &gt;= 3) || context-&gt;getExtensions().unpackSubimage);
+              state.setUnpackSkipPixels(param);
</ins><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           case GL_PACK_ROW_LENGTH:
</span><del>-            ASSERT(context-&gt;getClientVersion() &gt;= 3);
-            state.getPackState().rowLength = param;
</del><ins>+              ASSERT((context-&gt;getClientVersion() &gt;= 3) || context-&gt;getExtensions().packSubimage);
+              state.setPackRowLength(param);
</ins><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           case GL_PACK_SKIP_ROWS:
</span><del>-            ASSERT(context-&gt;getClientVersion() &gt;= 3);
-            state.getPackState().skipRows = param;
</del><ins>+              ASSERT((context-&gt;getClientVersion() &gt;= 3) || context-&gt;getExtensions().packSubimage);
+              state.setPackSkipRows(param);
</ins><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           case GL_PACK_SKIP_PIXELS:
</span><del>-            ASSERT(context-&gt;getClientVersion() &gt;= 3);
-            state.getPackState().skipPixels = param;
</del><ins>+              ASSERT((context-&gt;getClientVersion() &gt;= 3) || context-&gt;getExtensions().packSubimage);
+              state.setPackSkipPixels(param);
</ins><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">           default:
</span><span class="lines">@@ -3289,28 +3094,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (width &lt; 0 || height &lt; 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateReadPixels(context, x, y, width, height, format, type, pixels))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateReadPixelsParameters(context, x, y, width, height,
-                                              format, type, NULL, pixels))
-        {
-            return;
-        }
-
-        Framebuffer *framebufferObject = context-&gt;getState().getReadFramebuffer();
-        ASSERT(framebufferObject);
-
-        Rectangle area(x, y, width, height);
-        Error error = framebufferObject-&gt;readPixels(context-&gt;getState(), area, format, type, pixels);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;readPixels(x, y, width, height, format, type, pixels);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3420,22 +3210,11 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Shader *shaderObject = context-&gt;getShader(shader);
-
</del><ins>+        Shader *shaderObject = GetValidShader(context, shader);
</ins><span class="cx">         if (!shaderObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getProgram(shader))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><del>-
</del><span class="cx">         shaderObject-&gt;setSource(count, string, length);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -3627,29 +3406,15 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3 &amp;&amp;
-            !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
-                                           0, 0, width, height, border, format, type, pixels))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateTexImage2D(context, target, level, internalformat, width, height, border,
+                                format, type, pixels))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (context-&gt;getClientVersion() &gt;= 3 &amp;&amp;
-            !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
-                                           0, 0, 0, width, height, 1, border, format, type, pixels))
-        {
-            return;
-        }
-
-        Extents size(width, height, 1);
-        Texture *texture = context-&gt;getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-        Error error = texture-&gt;setImage(target, level, internalformat, size, format, type, context-&gt;getState().getUnpackState(),
-                                        reinterpret_cast&lt;const uint8_t *&gt;(pixels));
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;texImage2D(target, level, internalformat, width, height, border, format, type,
+                            pixels);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3679,27 +3444,29 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        // clang-format off
</ins><span class="cx">         switch (pname)
</span><span class="cx">         {
</span><del>-          case GL_TEXTURE_WRAP_S:               texture-&gt;getSamplerState().wrapS = uiround&lt;GLenum&gt;(param);        break;
-          case GL_TEXTURE_WRAP_T:               texture-&gt;getSamplerState().wrapT = uiround&lt;GLenum&gt;(param);        break;
-          case GL_TEXTURE_WRAP_R:               texture-&gt;getSamplerState().wrapR = uiround&lt;GLenum&gt;(param);        break;
-          case GL_TEXTURE_MIN_FILTER:           texture-&gt;getSamplerState().minFilter = uiround&lt;GLenum&gt;(param);    break;
-          case GL_TEXTURE_MAG_FILTER:           texture-&gt;getSamplerState().magFilter = uiround&lt;GLenum&gt;(param);    break;
-          case GL_TEXTURE_USAGE_ANGLE:          texture-&gt;setUsage(uiround&lt;GLenum&gt;(param));                        break;
-          case GL_TEXTURE_MAX_ANISOTROPY_EXT:   texture-&gt;getSamplerState().maxAnisotropy = std::min(param, context-&gt;getExtensions().maxTextureAnisotropy); break;
-          case GL_TEXTURE_COMPARE_MODE:         texture-&gt;getSamplerState().compareMode = uiround&lt;GLenum&gt;(param);  break;
-          case GL_TEXTURE_COMPARE_FUNC:         texture-&gt;getSamplerState().compareFunc = uiround&lt;GLenum&gt;(param);  break;
-          case GL_TEXTURE_SWIZZLE_R:            texture-&gt;getSamplerState().swizzleRed = uiround&lt;GLenum&gt;(param);   break;
-          case GL_TEXTURE_SWIZZLE_G:            texture-&gt;getSamplerState().swizzleGreen = uiround&lt;GLenum&gt;(param); break;
-          case GL_TEXTURE_SWIZZLE_B:            texture-&gt;getSamplerState().swizzleBlue = uiround&lt;GLenum&gt;(param);  break;
-          case GL_TEXTURE_SWIZZLE_A:            texture-&gt;getSamplerState().swizzleAlpha = uiround&lt;GLenum&gt;(param); break;
-          case GL_TEXTURE_BASE_LEVEL:           texture-&gt;getSamplerState().baseLevel = iround&lt;GLint&gt;(param);      break;
-          case GL_TEXTURE_MAX_LEVEL:            texture-&gt;getSamplerState().maxLevel = iround&lt;GLint&gt;(param);       break;
-          case GL_TEXTURE_MIN_LOD:              texture-&gt;getSamplerState().minLod = param;                            break;
-          case GL_TEXTURE_MAX_LOD:              texture-&gt;getSamplerState().maxLod = param;                            break;
</del><ins>+          case GL_TEXTURE_WRAP_S:               texture-&gt;setWrapS(uiround&lt;GLenum&gt;(param));        break;
+          case GL_TEXTURE_WRAP_T:               texture-&gt;setWrapT(uiround&lt;GLenum&gt;(param));        break;
+          case GL_TEXTURE_WRAP_R:               texture-&gt;setWrapR(uiround&lt;GLenum&gt;(param));        break;
+          case GL_TEXTURE_MIN_FILTER:           texture-&gt;setMinFilter(uiround&lt;GLenum&gt;(param));    break;
+          case GL_TEXTURE_MAG_FILTER:           texture-&gt;setMagFilter(uiround&lt;GLenum&gt;(param));    break;
+          case GL_TEXTURE_USAGE_ANGLE:          texture-&gt;setUsage(uiround&lt;GLenum&gt;(param));        break;
+          case GL_TEXTURE_MAX_ANISOTROPY_EXT:   texture-&gt;setMaxAnisotropy(std::min(param, context-&gt;getExtensions().maxTextureAnisotropy)); break;
+          case GL_TEXTURE_COMPARE_MODE:         texture-&gt;setCompareMode(uiround&lt;GLenum&gt;(param));  break;
+          case GL_TEXTURE_COMPARE_FUNC:         texture-&gt;setCompareFunc(uiround&lt;GLenum&gt;(param));  break;
+          case GL_TEXTURE_SWIZZLE_R:            texture-&gt;setSwizzleRed(uiround&lt;GLenum&gt;(param));   break;
+          case GL_TEXTURE_SWIZZLE_G:            texture-&gt;setSwizzleGreen(uiround&lt;GLenum&gt;(param)); break;
+          case GL_TEXTURE_SWIZZLE_B:            texture-&gt;setSwizzleBlue(uiround&lt;GLenum&gt;(param));  break;
+          case GL_TEXTURE_SWIZZLE_A:            texture-&gt;setSwizzleAlpha(uiround&lt;GLenum&gt;(param)); break;
+          case GL_TEXTURE_BASE_LEVEL:           texture-&gt;setBaseLevel(uiround&lt;GLuint&gt;(param));    break;
+          case GL_TEXTURE_MAX_LEVEL:            texture-&gt;setMaxLevel(uiround&lt;GLuint&gt;(param));     break;
+          case GL_TEXTURE_MIN_LOD:              texture-&gt;setMinLod(param);                        break;
+          case GL_TEXTURE_MAX_LOD:              texture-&gt;setMaxLod(param);                        break;
</ins><span class="cx">           default: UNREACHABLE(); break;
</span><span class="cx">         }
</span><ins>+        // clang-format on
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3734,27 +3501,29 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        // clang-format off
</ins><span class="cx">         switch (pname)
</span><span class="cx">         {
</span><del>-          case GL_TEXTURE_WRAP_S:               texture-&gt;getSamplerState().wrapS = (GLenum)param;        break;
-          case GL_TEXTURE_WRAP_T:               texture-&gt;getSamplerState().wrapT = (GLenum)param;        break;
-          case GL_TEXTURE_WRAP_R:               texture-&gt;getSamplerState().wrapR = (GLenum)param;        break;
-          case GL_TEXTURE_MIN_FILTER:           texture-&gt;getSamplerState().minFilter = (GLenum)param;    break;
-          case GL_TEXTURE_MAG_FILTER:           texture-&gt;getSamplerState().magFilter = (GLenum)param;    break;
-          case GL_TEXTURE_USAGE_ANGLE:          texture-&gt;setUsage((GLenum)param);                        break;
-          case GL_TEXTURE_MAX_ANISOTROPY_EXT:   texture-&gt;getSamplerState().maxAnisotropy = std::min((float)param, context-&gt;getExtensions().maxTextureAnisotropy); break;
-          case GL_TEXTURE_COMPARE_MODE:         texture-&gt;getSamplerState().compareMode = (GLenum)param;  break;
-          case GL_TEXTURE_COMPARE_FUNC:         texture-&gt;getSamplerState().compareFunc = (GLenum)param;  break;
-          case GL_TEXTURE_SWIZZLE_R:            texture-&gt;getSamplerState().swizzleRed = (GLenum)param;   break;
-          case GL_TEXTURE_SWIZZLE_G:            texture-&gt;getSamplerState().swizzleGreen = (GLenum)param; break;
-          case GL_TEXTURE_SWIZZLE_B:            texture-&gt;getSamplerState().swizzleBlue = (GLenum)param;  break;
-          case GL_TEXTURE_SWIZZLE_A:            texture-&gt;getSamplerState().swizzleAlpha = (GLenum)param; break;
-          case GL_TEXTURE_BASE_LEVEL:           texture-&gt;getSamplerState().baseLevel = param;            break;
-          case GL_TEXTURE_MAX_LEVEL:            texture-&gt;getSamplerState().maxLevel = param;             break;
-          case GL_TEXTURE_MIN_LOD:              texture-&gt;getSamplerState().minLod = (GLfloat)param;      break;
-          case GL_TEXTURE_MAX_LOD:              texture-&gt;getSamplerState().maxLod = (GLfloat)param;      break;
</del><ins>+          case GL_TEXTURE_WRAP_S:               texture-&gt;setWrapS(static_cast&lt;GLenum&gt;(param));        break;
+          case GL_TEXTURE_WRAP_T:               texture-&gt;setWrapT(static_cast&lt;GLenum&gt;(param));        break;
+          case GL_TEXTURE_WRAP_R:               texture-&gt;setWrapR(static_cast&lt;GLenum&gt;(param));        break;
+          case GL_TEXTURE_MIN_FILTER:           texture-&gt;setMinFilter(static_cast&lt;GLenum&gt;(param));    break;
+          case GL_TEXTURE_MAG_FILTER:           texture-&gt;setMagFilter(static_cast&lt;GLenum&gt;(param));    break;
+          case GL_TEXTURE_USAGE_ANGLE:          texture-&gt;setUsage(static_cast&lt;GLenum&gt;(param));        break;
+          case GL_TEXTURE_MAX_ANISOTROPY_EXT:   texture-&gt;setMaxAnisotropy(std::min(static_cast&lt;GLfloat&gt;(param), context-&gt;getExtensions().maxTextureAnisotropy)); break;
+          case GL_TEXTURE_COMPARE_MODE:         texture-&gt;setCompareMode(static_cast&lt;GLenum&gt;(param));  break;
+          case GL_TEXTURE_COMPARE_FUNC:         texture-&gt;setCompareFunc(static_cast&lt;GLenum&gt;(param));  break;
+          case GL_TEXTURE_SWIZZLE_R:            texture-&gt;setSwizzleRed(static_cast&lt;GLenum&gt;(param));   break;
+          case GL_TEXTURE_SWIZZLE_G:            texture-&gt;setSwizzleGreen(static_cast&lt;GLenum&gt;(param)); break;
+          case GL_TEXTURE_SWIZZLE_B:            texture-&gt;setSwizzleBlue(static_cast&lt;GLenum&gt;(param));  break;
+          case GL_TEXTURE_SWIZZLE_A:            texture-&gt;setSwizzleAlpha(static_cast&lt;GLenum&gt;(param)); break;
+          case GL_TEXTURE_BASE_LEVEL:           texture-&gt;setBaseLevel(static_cast&lt;GLuint&gt;(param));    break;
+          case GL_TEXTURE_MAX_LEVEL:            texture-&gt;setMaxLevel(static_cast&lt;GLuint&gt;(param));     break;
+          case GL_TEXTURE_MIN_LOD:              texture-&gt;setMinLod(static_cast&lt;GLfloat&gt;(param));      break;
+          case GL_TEXTURE_MAX_LOD:              texture-&gt;setMaxLod(static_cast&lt;GLfloat&gt;(param));      break;
</ins><span class="cx">           default: UNREACHABLE(); break;
</span><span class="cx">         }
</span><ins>+        // clang-format on
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3774,35 +3543,15 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3 &amp;&amp;
-            !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
-                                           xoffset, yoffset, width, height, 0, format, type, pixels))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateTexSubImage2D(context, target, level, xoffset, yoffset, width, height, format,
+                                   type, pixels))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (context-&gt;getClientVersion() &gt;= 3 &amp;&amp;
-            !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
-                                           xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
-        {
-            return;
-        }
-
-        // Zero sized uploads are valid but no-ops
-        if (width == 0 || height == 0)
-        {
-            return;
-        }
-
-        Box area(xoffset, yoffset, 0, width, height, 1);
-        Texture *texture = context-&gt;getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-        Error error = texture-&gt;setSubImage(target, level, area, format, type, context-&gt;getState().getUnpackState(),
-                                           reinterpret_cast&lt;const uint8_t *&gt;(pixels));
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;texSubImage2D(target, level, xoffset, yoffset, width, height, format, type,
+                               pixels);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -4055,25 +3804,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Program *programObject = context-&gt;getProgram(program);
-
-        if (!programObject &amp;&amp; program != 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateUseProgram(context, program))
</ins><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
-        }
-
-        if (program != 0 &amp;&amp; !programObject-&gt;isLinked())
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -4088,20 +3820,11 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         programObject-&gt;validate(context-&gt;getCaps());
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_gles_2_0_extcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0_ext.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0_ext.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0_ext.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -27,6 +27,57 @@
</span><span class="cx"> namespace gl
</span><span class="cx"> {
</span><span class="cx"> 
</span><ins>+void GL_APIENTRY GenQueriesEXT(GLsizei n, GLuint *ids)
+{
+    EVENT(&quot;(GLsizei n = %d, GLuint* ids = 0x%0.8p)&quot;, n, ids);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateGenQueriesEXT(context, n))
+        {
+            return;
+        }
+
+        for (GLsizei i = 0; i &lt; n; i++)
+        {
+            ids[i] = context-&gt;createQuery();
+        }
+    }
+}
+
+void GL_APIENTRY DeleteQueriesEXT(GLsizei n, const GLuint *ids)
+{
+    EVENT(&quot;(GLsizei n = %d, const GLuint *ids = 0x%0.8p)&quot;, n, ids);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDeleteQueriesEXT(context, n))
+        {
+            return;
+        }
+
+        for (int i = 0; i &lt; n; i++)
+        {
+            context-&gt;deleteQuery(ids[i]);
+        }
+    }
+}
+
+GLboolean GL_APIENTRY IsQueryEXT(GLuint id)
+{
+    EVENT(&quot;(GLuint id = %d)&quot;, id);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        return (context-&gt;getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
+    }
+
+    return GL_FALSE;
+}
+
</ins><span class="cx"> void GL_APIENTRY BeginQueryEXT(GLenum target, GLuint id)
</span><span class="cx"> {
</span><span class="cx">     EVENT(&quot;(GLenum target = 0x%X, GLuint %d)&quot;, target, id);
</span><span class="lines">@@ -34,7 +85,7 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateBeginQuery(context, target, id))
</del><ins>+        if (!ValidateBeginQueryEXT(context, target, id))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="lines">@@ -48,59 +99,78 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY DeleteFencesNV(GLsizei n, const GLuint* fences)
</del><ins>+void GL_APIENTRY EndQueryEXT(GLenum target)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLsizei n = %d, const GLuint* fences = 0x%0.8p)&quot;, n, fences);
</del><ins>+    EVENT(&quot;GLenum target = 0x%X)&quot;, target);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0)
</del><ins>+        if (!ValidateEndQueryEXT(context, target))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        for (int i = 0; i &lt; n; i++)
</del><ins>+        Error error = context-&gt;endQuery(target);
+        if (error.isError())
</ins><span class="cx">         {
</span><del>-            context-&gt;deleteFenceNV(fences[i]);
</del><ins>+            context-&gt;recordError(error);
+            return;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY DeleteQueriesEXT(GLsizei n, const GLuint *ids)
</del><ins>+void GL_APIENTRY QueryCounterEXT(GLuint id, GLenum target)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLsizei n = %d, const GLuint *ids = 0x%0.8p)&quot;, n, ids);
</del><ins>+    EVENT(&quot;GLuint id = %d, GLenum target = 0x%X)&quot;, id, target);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0)
</del><ins>+        if (!ValidateQueryCounterEXT(context, id, target))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        for (int i = 0; i &lt; n; i++)
</del><ins>+        Error error = context-&gt;queryCounter(id, target);
+        if (error.isError())
</ins><span class="cx">         {
</span><del>-            context-&gt;deleteQuery(ids[i]);
</del><ins>+            context-&gt;recordError(error);
+            return;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY DrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
</del><ins>+void GL_APIENTRY GetQueryivEXT(GLenum target, GLenum pname, GLint *params)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)&quot;, mode, first, count, primcount);
</del><ins>+    EVENT(&quot;GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)&quot;, target, pname,
+          params);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateDrawArraysInstancedANGLE(context, mode, first, count, primcount))
</del><ins>+        if (!ValidateGetQueryivEXT(context, target, pname, params))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Error error = context-&gt;drawArrays(mode, first, count, primcount);
</del><ins>+        context-&gt;getQueryiv(target, pname, params);
+    }
+}
+
+void GL_APIENTRY GetQueryObjectivEXT(GLuint id, GLenum pname, GLint *params)
+{
+    EVENT(&quot;(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)&quot;, id, pname, params);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateGetQueryObjectivEXT(context, id, pname, params))
+        {
+            return;
+        }
+
+        Error error = context-&gt;getQueryObjectiv(id, pname, params);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(error);
</span><span class="lines">@@ -109,21 +179,19 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY DrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
</del><ins>+void GL_APIENTRY GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)&quot;,
-          mode, count, type, indices, primcount);
</del><ins>+    EVENT(&quot;(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)&quot;, id, pname, params);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        rx::RangeUI indexRange;
-        if (!ValidateDrawElementsInstancedANGLE(context, mode, count, type, indices, primcount, &amp;indexRange))
</del><ins>+        if (!ValidateGetQueryObjectuivEXT(context, id, pname, params))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Error error = context-&gt;drawElements(mode, count, type, indices, primcount, indexRange);
</del><ins>+        Error error = context-&gt;getQueryObjectuiv(id, pname, params);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(error);
</span><span class="lines">@@ -132,19 +200,19 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY EndQueryEXT(GLenum target)
</del><ins>+void GL_APIENTRY GetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64 *params)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;GLenum target = 0x%X)&quot;, target);
</del><ins>+    EVENT(&quot;(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.16p)&quot;, id, pname, params);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateEndQuery(context, target))
</del><ins>+        if (!ValidateGetQueryObjecti64vEXT(context, id, pname, params))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Error error = context-&gt;endQuery(target);
</del><ins>+        Error error = context-&gt;getQueryObjecti64v(id, pname, params);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(error);
</span><span class="lines">@@ -153,34 +221,30 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY FinishFenceNV(GLuint fence)
</del><ins>+void GL_APIENTRY GetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64 *params)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLuint fence = %d)&quot;, fence);
</del><ins>+    EVENT(&quot;(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.16p)&quot;, id, pname, params);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        FenceNV *fenceObject = context-&gt;getFenceNV(fence);
-
-        if (fenceObject == NULL)
</del><ins>+        if (!ValidateGetQueryObjectui64vEXT(context, id, pname, params))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (fenceObject-&gt;isSet() != GL_TRUE)
</del><ins>+        Error error = context-&gt;getQueryObjectui64v(id, pname, params);
+        if (error.isError())
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><ins>+            context-&gt;recordError(error);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><del>-
-        fenceObject-&gt;finish();
</del><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY GenFencesNV(GLsizei n, GLuint* fences)
</del><ins>+void GL_APIENTRY DeleteFencesNV(GLsizei n, const GLuint *fences)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLsizei n = %d, GLuint* fences = 0x%0.8p)&quot;, n, fences);
</del><ins>+    EVENT(&quot;(GLsizei n = %d, const GLuint* fences = 0x%0.8p)&quot;, n, fences);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="lines">@@ -193,27 +257,108 @@
</span><span class="cx"> 
</span><span class="cx">         for (int i = 0; i &lt; n; i++)
</span><span class="cx">         {
</span><del>-            fences[i] = context-&gt;createFenceNV();
</del><ins>+            context-&gt;deleteFenceNV(fences[i]);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY GenQueriesEXT(GLsizei n, GLuint* ids)
</del><ins>+void GL_APIENTRY DrawArraysInstancedANGLE(GLenum mode,
+                                          GLint first,
+                                          GLsizei count,
+                                          GLsizei primcount)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLsizei n = %d, GLuint* ids = 0x%0.8p)&quot;, n, ids);
</del><ins>+    EVENT(&quot;(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)&quot;,
+          mode, first, count, primcount);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><ins>+        if (!ValidateDrawArraysInstancedANGLE(context, mode, first, count, primcount))
+        {
+            return;
+        }
+
+        Error error = context-&gt;drawArraysInstanced(mode, first, count, primcount);
+        if (error.isError())
+        {
+            context-&gt;recordError(error);
+            return;
+        }
+    }
+}
+
+void GL_APIENTRY DrawElementsInstancedANGLE(GLenum mode,
+                                            GLsizei count,
+                                            GLenum type,
+                                            const GLvoid *indices,
+                                            GLsizei primcount)
+{
+    EVENT(
+        &quot;(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = &quot;
+        &quot;0x%0.8p, GLsizei primcount = %d)&quot;,
+        mode, count, type, indices, primcount);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        IndexRange indexRange;
+        if (!ValidateDrawElementsInstancedANGLE(context, mode, count, type, indices, primcount,
+                                                &amp;indexRange))
+        {
+            return;
+        }
+
+        Error error =
+            context-&gt;drawElementsInstanced(mode, count, type, indices, primcount, indexRange);
+        if (error.isError())
+        {
+            context-&gt;recordError(error);
+            return;
+        }
+    }
+}
+
+void GL_APIENTRY FinishFenceNV(GLuint fence)
+{
+    EVENT(&quot;(GLuint fence = %d)&quot;, fence);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        FenceNV *fenceObject = context-&gt;getFenceNV(fence);
+
+        if (fenceObject == NULL)
+        {
+            context-&gt;recordError(Error(GL_INVALID_OPERATION));
+            return;
+        }
+
+        if (fenceObject-&gt;isSet() != GL_TRUE)
+        {
+            context-&gt;recordError(Error(GL_INVALID_OPERATION));
+            return;
+        }
+
+        fenceObject-&gt;finish();
+    }
+}
+
+void GL_APIENTRY GenFencesNV(GLsizei n, GLuint *fences)
+{
+    EVENT(&quot;(GLsizei n = %d, GLuint* fences = 0x%0.8p)&quot;, n, fences);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
</ins><span class="cx">         if (n &lt; 0)
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_VALUE));
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        for (GLsizei i = 0; i &lt; n; i++)
</del><ins>+        for (int i = 0; i &lt; n; i++)
</ins><span class="cx">         {
</span><del>-            ids[i] = context-&gt;createQuery();
</del><ins>+            fences[i] = context-&gt;createFenceNV();
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -289,84 +434,6 @@
</span><span class="cx">     return GL_NO_ERROR;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY GetQueryivEXT(GLenum target, GLenum pname, GLint *params)
-{
-    EVENT(&quot;GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)&quot;, target, pname, params);
-
-    Context *context = GetValidGlobalContext();
-    if (context)
-    {
-        if (!ValidQueryType(context, target))
-        {
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
-
-        switch (pname)
-        {
-          case GL_CURRENT_QUERY_EXT:
-            params[0] = context-&gt;getState().getActiveQueryId(target);
-            break;
-
-          default:
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
-    }
-}
-
-void GL_APIENTRY GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
-{
-    EVENT(&quot;(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)&quot;, id, pname, params);
-
-    Context *context = GetValidGlobalContext();
-    if (context)
-    {
-        Query *queryObject = context-&gt;getQuery(id, false, GL_NONE);
-
-        if (!queryObject)
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
-
-        if (context-&gt;getState().getActiveQueryId(queryObject-&gt;getType()) == id)
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
-
-        switch(pname)
-        {
-          case GL_QUERY_RESULT_EXT:
-            {
-                Error error = queryObject-&gt;getResult(params);
-                if (error.isError())
-                {
-                    context-&gt;recordError(error);
-                    return;
-                }
-            }
-            break;
-
-          case GL_QUERY_RESULT_AVAILABLE_EXT:
-            {
-                Error error = queryObject-&gt;isResultAvailable(params);
-                if (error.isError())
-                {
-                    context-&gt;recordError(error);
-                    return;
-                }
-            }
-            break;
-
-          default:
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
-    }
-}
-
</del><span class="cx"> void GL_APIENTRY GetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
</span><span class="cx"> {
</span><span class="cx">     EVENT(&quot;(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)&quot;,
</span><span class="lines">@@ -389,7 +456,6 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // Only returns extra info if ANGLE_GENERATE_SHADER_DEBUG_INFO is defined
</del><span class="cx">         shaderObject-&gt;getTranslatedSourceWithDebugInfo(bufsize, length, source);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -456,19 +522,6 @@
</span><span class="cx">     return GL_FALSE;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLboolean GL_APIENTRY IsQueryEXT(GLuint id)
-{
-    EVENT(&quot;(GLuint id = %d)&quot;, id);
-
-    Context *context = GetValidGlobalContext();
-    if (context)
-    {
-        return (context-&gt;getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
-    }
-
-    return GL_FALSE;
-}
-
</del><span class="cx"> void GL_APIENTRY ReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
</span><span class="cx">                                 GLenum format, GLenum type, GLsizei bufSize,
</span><span class="cx">                                 GLvoid *data)
</span><span class="lines">@@ -480,28 +533,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (width &lt; 0 || height &lt; 0 || bufSize &lt; 0)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateReadnPixelsEXT(context, x, y, width, height, format, type, bufSize, data))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateReadPixelsParameters(context, x, y, width, height,
-                                              format, type, &amp;bufSize, data))
-        {
-            return;
-        }
-
-        Framebuffer *framebufferObject = context-&gt;getState().getReadFramebuffer();
-        ASSERT(framebufferObject);
-
-        Rectangle area(x, y, width, height);
-        Error error = framebufferObject-&gt;readPixels(context-&gt;getState(), area, format, type, data);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;readPixels(x, y, width, height, format, type, data);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -615,7 +653,8 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (context-&gt;getClientVersion() &gt;= 3 &amp;&amp;
</span><del>-            !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
</del><ins>+            !ValidateES3TexStorage2DParameters(context, target, levels, internalformat, width,
+                                               height, 1))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="lines">@@ -644,6 +683,21 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        if (context-&gt;getLimitations().attributeZeroRequiresZeroDivisorInEXT)
+        {
+            if (index == 0 &amp;&amp; divisor != 0)
+            {
+                const char *errorMessage = &quot;The current context doesn't support setting a non-zero divisor on the attribute with index zero. &quot;
+                                           &quot;Please reorder the attributes in your vertex shader so that attribute zero can have a zero divisor.&quot;;
+                context-&gt;recordError(Error(GL_INVALID_OPERATION, errorMessage));
+
+                // We also output an error message to the debugger window if tracing is active, so that developers can see the error message.
+                ERR(&quot;%s&quot;, errorMessage);
+
+                return;
+            }
+        }
+
</ins><span class="cx">         context-&gt;setVertexAttribDivisor(index, divisor);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -659,28 +713,32 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
-                                               dstX0, dstY0, dstX1, dstY1, mask, filter,
-                                               true))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateBlitFramebufferANGLE(context, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1,
+                                          dstY1, mask, filter))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Framebuffer *readFramebuffer = context-&gt;getState().getReadFramebuffer();
-        ASSERT(readFramebuffer);
</del><ins>+        context-&gt;blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask,
+                                 filter);
+    }
+}
</ins><span class="cx"> 
</span><del>-        Framebuffer *drawFramebuffer = context-&gt;getState().getDrawFramebuffer();
-        ASSERT(drawFramebuffer);
</del><ins>+void GL_APIENTRY DiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+    EVENT(&quot;(GLenum target = 0x%X, GLsizei numAttachments = %d, attachments = 0x%0.8p)&quot;, target, numAttachments, attachments);
</ins><span class="cx"> 
</span><del>-        Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
-        Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
-
-        Error error = drawFramebuffer-&gt;blit(context-&gt;getState(), srcArea, dstArea, mask, filter, readFramebuffer);
-        if (error.isError())
</del><ins>+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateDiscardFramebufferEXT(context, target, numAttachments, attachments))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(error);
</del><span class="cx">             return;
</span><span class="cx">         }
</span><ins>+
+        context-&gt;discardFramebuffer(target, numAttachments, attachments);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -703,14 +761,14 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        Program *programObject = context-&gt;getProgram(program);
-
-        if (!programObject || !programObject-&gt;isLinked())
</del><ins>+        if (!ValidateGetProgramBinaryOES(context, program, bufSize, length, binaryFormat, binary))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        Program *programObject = context-&gt;getProgram(program);
+        ASSERT(programObject != nullptr);
+
</ins><span class="cx">         Error error = programObject-&gt;saveBinary(binaryFormat, binary, bufSize, length);
</span><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="lines">@@ -728,19 +786,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        const std::vector&lt;GLenum&gt; &amp;programBinaryFormats = context-&gt;getCaps().programBinaryFormats;
-        if (std::find(programBinaryFormats.begin(), programBinaryFormats.end(), binaryFormat) == programBinaryFormats.end())
</del><ins>+        if (!ValidateProgramBinaryOES(context, program, binaryFormat, binary, length))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_ENUM));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         Program *programObject = context-&gt;getProgram(program);
</span><del>-        if (!programObject)
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
</del><ins>+        ASSERT(programObject != nullptr);
</ins><span class="cx"> 
</span><span class="cx">         Error error = programObject-&gt;loadBinary(binaryFormat, binary, length);
</span><span class="cx">         if (error.isError())
</span><span class="lines">@@ -758,302 +810,563 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (n &lt; 0 || static_cast&lt;GLuint&gt;(n) &gt; context-&gt;getCaps().maxDrawBuffers)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDrawBuffersEXT(context, n, bufs))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        ASSERT(context-&gt;getState().getDrawFramebuffer());
</del><ins>+        context-&gt;drawBuffers(n, bufs);
+    }
+}
</ins><span class="cx"> 
</span><del>-        if (context-&gt;getState().getDrawFramebuffer()-&gt;id() == 0)
</del><ins>+void GL_APIENTRY GetBufferPointervOES(GLenum target, GLenum pname, void** params)
+{
+    EVENT(&quot;(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)&quot;, target, pname, params);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateGetBufferPointervOES(context, target, pname, params))
</ins><span class="cx">         {
</span><del>-            if (n != 1)
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
</del><ins>+            return;
+        }
</ins><span class="cx"> 
</span><del>-            if (bufs[0] != GL_NONE &amp;&amp; bufs[0] != GL_BACK)
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
</del><ins>+        context-&gt;getBufferPointerv(target, pname, params);
+    }
+}
+
+void *GL_APIENTRY MapBufferOES(GLenum target, GLenum access)
+{
+    EVENT(&quot;(GLenum target = 0x%X, GLbitfield access = 0x%X)&quot;, target, access);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateMapBufferOES(context, target, access))
+        {
+            return nullptr;
</ins><span class="cx">         }
</span><del>-        else
</del><ins>+
+        return context-&gt;mapBuffer(target, access);
+    }
+
+    return nullptr;
+}
+
+GLboolean GL_APIENTRY UnmapBufferOES(GLenum target)
+{
+    EVENT(&quot;(GLenum target = 0x%X)&quot;, target);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateUnmapBufferOES(context, target))
</ins><span class="cx">         {
</span><del>-            for (int colorAttachment = 0; colorAttachment &lt; n; colorAttachment++)
-            {
-                const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
-                if (bufs[colorAttachment] != GL_NONE &amp;&amp; bufs[colorAttachment] != attachment)
-                {
-                    context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                    return;
-                }
-            }
</del><ins>+            return GL_FALSE;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Framebuffer *framebuffer = context-&gt;getState().getDrawFramebuffer();
-        ASSERT(framebuffer);
</del><ins>+        return context-&gt;unmapBuffer(target);
+    }
</ins><span class="cx"> 
</span><del>-        framebuffer-&gt;setDrawBuffers(n, bufs);
</del><ins>+    return GL_FALSE;
+}
+
+void *GL_APIENTRY MapBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+    EVENT(&quot;(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)&quot;,
+          target, offset, length, access);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateMapBufferRangeEXT(context, target, offset, length, access))
+        {
+            return nullptr;
+        }
+
+        return context-&gt;mapBufferRange(target, offset, length, access);
</ins><span class="cx">     }
</span><ins>+
+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY GetBufferPointervOES(GLenum target, GLenum pname, void** params)
</del><ins>+void GL_APIENTRY FlushMappedBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)&quot;, target, pname, params);
</del><ins>+    EVENT(&quot;(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)&quot;, target, offset, length);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidBufferTarget(context, target))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateFlushMappedBufferRangeEXT(context, target, offset, length))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_ENUM));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (pname != GL_BUFFER_MAP_POINTER)
</del><ins>+        context-&gt;flushMappedBufferRange(target, offset, length);
+    }
+}
+
+void GL_APIENTRY InsertEventMarkerEXT(GLsizei length, const char *marker)
+{
+    // Don't run an EVENT() macro on the EXT_debug_marker entry points.
+    // It can interfere with the debug events being set by the caller.
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!context-&gt;getExtensions().debugMarker)
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_ENUM));
</del><ins>+            // The debug marker calls should not set error state
+            // However, it seems reasonable to set an error state if the extension is not enabled
+            context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Buffer *buffer = context-&gt;getState().getTargetBuffer(target);
</del><ins>+        if (!ValidateInsertEventMarkerEXT(context, length, marker))
+        {
+            return;
+        }
</ins><span class="cx"> 
</span><del>-        if (!buffer || !buffer-&gt;isMapped())
</del><ins>+        context-&gt;insertEventMarker(length, marker);
+    }
+}
+
+void GL_APIENTRY PushGroupMarkerEXT(GLsizei length, const char *marker)
+{
+    // Don't run an EVENT() macro on the EXT_debug_marker entry points.
+    // It can interfere with the debug events being set by the caller.
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!context-&gt;getExtensions().debugMarker)
</ins><span class="cx">         {
</span><del>-            *params = NULL;
</del><ins>+            // The debug marker calls should not set error state
+            // However, it seems reasonable to set an error state if the extension is not enabled
+            context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+            return;
</ins><span class="cx">         }
</span><ins>+
+        if (!ValidatePushGroupMarkerEXT(context, length, marker))
+        {
+            return;
+        }
+
+        if (marker == nullptr)
+        {
+            // From the EXT_debug_marker spec,
+            // &quot;If &lt;marker&gt; is null then an empty string is pushed on the stack.&quot;
+            context-&gt;pushGroupMarker(length, &quot;&quot;);
+        }
</ins><span class="cx">         else
</span><span class="cx">         {
</span><del>-            *params = buffer-&gt;getMapPointer();
</del><ins>+            context-&gt;pushGroupMarker(length, marker);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void *GL_APIENTRY MapBufferOES(GLenum target, GLenum access)
</del><ins>+void GL_APIENTRY PopGroupMarkerEXT()
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLenum target = 0x%X, GLbitfield access = 0x%X)&quot;, target, access);
</del><ins>+    // Don't run an EVENT() macro on the EXT_debug_marker entry points.
+    // It can interfere with the debug events being set by the caller.
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidBufferTarget(context, target))
</del><ins>+        if (!context-&gt;getExtensions().debugMarker)
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return NULL;
</del><ins>+            // The debug marker calls should not set error state
+            // However, it seems reasonable to set an error state if the extension is not enabled
+            context-&gt;recordError(Error(GL_INVALID_OPERATION, &quot;Extension not enabled&quot;));
+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Buffer *buffer = context-&gt;getState().getTargetBuffer(target);
</del><ins>+        context-&gt;popGroupMarker();
+    }
+}
</ins><span class="cx"> 
</span><del>-        if (buffer == NULL)
</del><ins>+ANGLE_EXPORT void GL_APIENTRY EGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
+{
+    EVENT(&quot;(GLenum target = 0x%X, GLeglImageOES image = 0x%0.8p)&quot;, target, image);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        egl::Display *display   = egl::GetGlobalDisplay();
+        egl::Image *imageObject = reinterpret_cast&lt;egl::Image *&gt;(image);
+        if (!ValidateEGLImageTargetTexture2DOES(context, display, target, imageObject))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return NULL;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (access != GL_WRITE_ONLY_OES)
</del><ins>+        Texture *texture = context-&gt;getTargetTexture(target);
+        Error error = texture-&gt;setEGLImageTarget(target, imageObject);
+        if (error.isError())
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return NULL;
</del><ins>+            context-&gt;recordError(error);
+            return;
</ins><span class="cx">         }
</span><ins>+    }
+}
</ins><span class="cx"> 
</span><del>-        if (buffer-&gt;isMapped())
</del><ins>+ANGLE_EXPORT void GL_APIENTRY EGLImageTargetRenderbufferStorageOES(GLenum target,
+                                                                   GLeglImageOES image)
+{
+    EVENT(&quot;(GLenum target = 0x%X, GLeglImageOES image = 0x%0.8p)&quot;, target, image);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        egl::Display *display   = egl::GetGlobalDisplay();
+        egl::Image *imageObject = reinterpret_cast&lt;egl::Image *&gt;(image);
+        if (!ValidateEGLImageTargetRenderbufferStorageOES(context, display, target, imageObject))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return NULL;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Error error = buffer-&gt;map(access);
</del><ins>+        Renderbuffer *renderbuffer = context-&gt;getState().getCurrentRenderbuffer();
+        Error error = renderbuffer-&gt;setStorageEGLImageTarget(imageObject);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(error);
</span><del>-            return NULL;
</del><ins>+            return;
</ins><span class="cx">         }
</span><del>-
-        return buffer-&gt;getMapPointer();
</del><span class="cx">     }
</span><del>-
-    return NULL;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLboolean GL_APIENTRY UnmapBufferOES(GLenum target)
</del><ins>+void GL_APIENTRY BindVertexArrayOES(GLuint array)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLenum target = 0x%X)&quot;, target);
</del><ins>+    EVENT(&quot;(GLuint array = %u)&quot;, array);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidBufferTarget(context, target))
</del><ins>+        if (!ValidateBindVertexArrayOES(context, array))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return GL_FALSE;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Buffer *buffer = context-&gt;getState().getTargetBuffer(target);
</del><ins>+        context-&gt;bindVertexArray(array);
+    }
+}
</ins><span class="cx"> 
</span><del>-        if (buffer == NULL || !buffer-&gt;isMapped())
</del><ins>+void GL_APIENTRY DeleteVertexArraysOES(GLsizei n, const GLuint *arrays)
+{
+    EVENT(&quot;(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)&quot;, n, arrays);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateDeleteVertexArraysOES(context, n))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return GL_FALSE;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        GLboolean result;
-        Error error = buffer-&gt;unmap(&amp;result);
-        if (error.isError())
</del><ins>+        for (int arrayIndex = 0; arrayIndex &lt; n; arrayIndex++)
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(error);
-            return GL_FALSE;
</del><ins>+            if (arrays[arrayIndex] != 0)
+            {
+                context-&gt;deleteVertexArray(arrays[arrayIndex]);
+            }
</ins><span class="cx">         }
</span><del>-
-        return result;
</del><span class="cx">     }
</span><del>-
-    return GL_FALSE;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-void *GL_APIENTRY MapBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
</del><ins>+void GL_APIENTRY GenVertexArraysOES(GLsizei n, GLuint *arrays)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)&quot;,
-          target, offset, length, access);
</del><ins>+    EVENT(&quot;(GLsizei n = %d, GLuint* arrays = 0x%0.8p)&quot;, n, arrays);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidBufferTarget(context, target))
</del><ins>+        if (!ValidateGenVertexArraysOES(context, n))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return NULL;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (offset &lt; 0 || length &lt; 0)
</del><ins>+        for (int arrayIndex = 0; arrayIndex &lt; n; arrayIndex++)
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return NULL;
</del><ins>+            arrays[arrayIndex] = context-&gt;createVertexArray();
</ins><span class="cx">         }
</span><ins>+    }
+}
</ins><span class="cx"> 
</span><del>-        Buffer *buffer = context-&gt;getState().getTargetBuffer(target);
</del><ins>+GLboolean GL_APIENTRY IsVertexArrayOES(GLuint array)
+{
+    EVENT(&quot;(GLuint array = %u)&quot;, array);
</ins><span class="cx"> 
</span><del>-        if (buffer == NULL)
</del><ins>+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateIsVertexArrayOES(context))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return NULL;
</del><ins>+            return GL_FALSE;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // Check for buffer overflow
-        size_t offsetSize = static_cast&lt;size_t&gt;(offset);
-        size_t lengthSize = static_cast&lt;size_t&gt;(length);
-
-        if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
-            offsetSize + lengthSize &gt; static_cast&lt;size_t&gt;(buffer-&gt;getSize()))
</del><ins>+        if (array == 0)
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return NULL;
</del><ins>+            return GL_FALSE;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // Check for invalid bits in the mask
-        GLbitfield allAccessBits = GL_MAP_READ_BIT |
-                                   GL_MAP_WRITE_BIT |
-                                   GL_MAP_INVALIDATE_RANGE_BIT |
-                                   GL_MAP_INVALIDATE_BUFFER_BIT |
-                                   GL_MAP_FLUSH_EXPLICIT_BIT |
-                                   GL_MAP_UNSYNCHRONIZED_BIT;
</del><ins>+        VertexArray *vao = context-&gt;getVertexArray(array);
</ins><span class="cx"> 
</span><del>-        if (access &amp; ~(allAccessBits))
</del><ins>+        return (vao != nullptr ? GL_TRUE : GL_FALSE);
+    }
+
+    return GL_FALSE;
+}
+
+void GL_APIENTRY DebugMessageControlKHR(GLenum source,
+                                        GLenum type,
+                                        GLenum severity,
+                                        GLsizei count,
+                                        const GLuint *ids,
+                                        GLboolean enabled)
+{
+    EVENT(
+        &quot;(GLenum source = 0x%X, GLenum type = 0x%X, GLenum severity = 0x%X, GLsizei count = %d, &quot;
+        &quot;GLint *ids = 0x%0.8p, GLboolean enabled = %d)&quot;,
+        source, type, severity, count, ids, enabled);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateDebugMessageControlKHR(context, source, type, severity, count, ids, enabled))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return NULL;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (length == 0 || buffer-&gt;isMapped())
</del><ins>+        std::vector&lt;GLuint&gt; idVector(ids, ids + count);
+        context-&gt;getState().getDebug().setMessageControl(
+            source, type, severity, std::move(idVector), (enabled != GL_FALSE));
+    }
+}
+
+void GL_APIENTRY DebugMessageInsertKHR(GLenum source,
+                                       GLenum type,
+                                       GLuint id,
+                                       GLenum severity,
+                                       GLsizei length,
+                                       const GLchar *buf)
+{
+    EVENT(
+        &quot;(GLenum source = 0x%X, GLenum type = 0x%X, GLint id = %d, GLenum severity = 0x%X, GLsizei &quot;
+        &quot;length = %d, const GLchar *buf = 0x%0.8p)&quot;,
+        source, type, id, severity, length, buf);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateDebugMessageInsertKHR(context, source, type, id, severity, length, buf))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return NULL;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // Check for invalid bit combinations
-        if ((access &amp; (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
</del><ins>+        std::string msg(buf, (length &gt; 0) ? static_cast&lt;size_t&gt;(length) : strlen(buf));
+        context-&gt;getState().getDebug().insertMessage(source, type, id, severity, std::move(msg));
+    }
+}
+
+void GL_APIENTRY DebugMessageCallbackKHR(GLDEBUGPROCKHR callback, const void *userParam)
+{
+    EVENT(&quot;(GLDEBUGPROCKHR callback = 0x%0.8p, const void *userParam = 0x%0.8p)&quot;, callback,
+          userParam);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateDebugMessageCallbackKHR(context, callback, userParam))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return NULL;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
-                                   GL_MAP_INVALIDATE_BUFFER_BIT |
-                                   GL_MAP_UNSYNCHRONIZED_BIT;
</del><ins>+        context-&gt;getState().getDebug().setCallback(callback, userParam);
+    }
+}
</ins><span class="cx"> 
</span><del>-        if ((access &amp; GL_MAP_READ_BIT) != 0 &amp;&amp; (access &amp; writeOnlyBits) != 0)
</del><ins>+GLuint GL_APIENTRY GetDebugMessageLogKHR(GLuint count,
+                                         GLsizei bufSize,
+                                         GLenum *sources,
+                                         GLenum *types,
+                                         GLuint *ids,
+                                         GLenum *severities,
+                                         GLsizei *lengths,
+                                         GLchar *messageLog)
+{
+    EVENT(
+        &quot;(GLsizei count = %d, GLsizei bufSize = %d, GLenum *sources, GLenum *types = 0x%0.8p, &quot;
+        &quot;GLuint *ids = 0x%0.8p, GLenum *severities = 0x%0.8p, GLsizei *lengths = 0x%0.8p, GLchar &quot;
+        &quot;*messageLog = 0x%0.8p)&quot;,
+        count, bufSize, sources, types, ids, severities, lengths, messageLog);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateGetDebugMessageLogKHR(context, count, bufSize, sources, types, ids, severities,
+                                           lengths, messageLog))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return NULL;
</del><ins>+            return 0;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if ((access &amp; GL_MAP_WRITE_BIT) == 0 &amp;&amp; (access &amp; GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
</del><ins>+        return static_cast&lt;GLuint&gt;(context-&gt;getState().getDebug().getMessages(
+            count, bufSize, sources, types, ids, severities, lengths, messageLog));
+    }
+
+    return 0;
+}
+
+void GL_APIENTRY PushDebugGroupKHR(GLenum source, GLuint id, GLsizei length, const GLchar *message)
+{
+    EVENT(
+        &quot;(GLenum source = 0x%X, GLuint id = 0x%X, GLsizei length = %d, const GLchar *message = &quot;
+        &quot;0x%0.8p)&quot;,
+        source, id, length, message);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidatePushDebugGroupKHR(context, source, id, length, message))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return NULL;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Error error = buffer-&gt;mapRange(offset, length, access);
-        if (error.isError())
</del><ins>+        std::string msg(message, (length &gt; 0) ? static_cast&lt;size_t&gt;(length) : strlen(message));
+        context-&gt;getState().getDebug().pushGroup(source, id, std::move(msg));
+    }
+}
+
+void GL_APIENTRY PopDebugGroupKHR(void)
+{
+    EVENT(&quot;()&quot;);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidatePopDebugGroupKHR(context))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(error);
-            return NULL;
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        return buffer-&gt;getMapPointer();
</del><ins>+        context-&gt;getState().getDebug().popGroup();
</ins><span class="cx">     }
</span><del>-
-    return NULL;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-void GL_APIENTRY FlushMappedBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length)
</del><ins>+void GL_APIENTRY ObjectLabelKHR(GLenum identifier, GLuint name, GLsizei length, const GLchar *label)
</ins><span class="cx"> {
</span><del>-    EVENT(&quot;(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)&quot;, target, offset, length);
</del><ins>+    EVENT(
+        &quot;(GLenum identifier = 0x%X, GLuint name = %u, GLsizei length = %d, const GLchar *label = &quot;
+        &quot;0x%0.8p)&quot;,
+        identifier, name, length, label);
</ins><span class="cx"> 
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (offset &lt; 0 || length &lt; 0)
</del><ins>+        if (!ValidateObjectLabelKHR(context, identifier, name, length, label))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidBufferTarget(context, target))
</del><ins>+        LabeledObject *object = context-&gt;getLabeledObject(identifier, name);
+        ASSERT(object != nullptr);
+
+        std::string lbl(label, (length &gt; 0) ? static_cast&lt;size_t&gt;(length) : strlen(label));
+        object-&gt;setLabel(lbl);
+    }
+}
+
+void GL_APIENTRY
+GetObjectLabelKHR(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+    EVENT(
+        &quot;(GLenum identifier = 0x%X, GLuint name = %u, GLsizei bufSize = %d, GLsizei *length = &quot;
+        &quot;0x%0.8p, GLchar *label = 0x%0.8p)&quot;,
+        identifier, name, bufSize, length, label);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateGetObjectLabelKHR(context, identifier, name, bufSize, length, label))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_ENUM));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Buffer *buffer = context-&gt;getState().getTargetBuffer(target);
</del><ins>+        LabeledObject *object = context-&gt;getLabeledObject(identifier, name);
+        ASSERT(object != nullptr);
</ins><span class="cx"> 
</span><del>-        if (buffer == NULL)
</del><ins>+        const std::string &amp;objectLabel = object-&gt;getLabel();
+        size_t writeLength = std::min(static_cast&lt;size_t&gt;(bufSize) - 1, objectLabel.length());
+        std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
+        label[writeLength] = '\0';
+        *length            = static_cast&lt;GLsizei&gt;(writeLength);
+    }
+}
+
+void GL_APIENTRY ObjectPtrLabelKHR(const void *ptr, GLsizei length, const GLchar *label)
+{
+    EVENT(&quot;(const void *ptr = 0x%0.8p, GLsizei length = %d, const GLchar *label = 0x%0.8p)&quot;, ptr,
+          length, label);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateObjectPtrLabelKHR(context, ptr, length, label))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!buffer-&gt;isMapped() || (buffer-&gt;getAccessFlags() &amp; GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
</del><ins>+        LabeledObject *object = context-&gt;getLabeledObjectFromPtr(ptr);
+        ASSERT(object != nullptr);
+
+        std::string lbl(label, (length &gt; 0) ? static_cast&lt;size_t&gt;(length) : strlen(label));
+        object-&gt;setLabel(lbl);
+    }
+}
+
+void GL_APIENTRY GetObjectPtrLabelKHR(const void *ptr,
+                                      GLsizei bufSize,
+                                      GLsizei *length,
+                                      GLchar *label)
+{
+    EVENT(
+        &quot;(const void *ptr = 0x%0.8p, GLsizei bufSize = %d, GLsizei *length = 0x%0.8p, GLchar &quot;
+        &quot;*label = 0x%0.8p)&quot;,
+        ptr, bufSize, length, label);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateGetObjectPtrLabelKHR(context, ptr, bufSize, length, label))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // Check for buffer overflow
-        size_t offsetSize = static_cast&lt;size_t&gt;(offset);
-        size_t lengthSize = static_cast&lt;size_t&gt;(length);
</del><ins>+        LabeledObject *object = context-&gt;getLabeledObjectFromPtr(ptr);
+        ASSERT(object != nullptr);
</ins><span class="cx"> 
</span><del>-        if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
-            offsetSize + lengthSize &gt; static_cast&lt;size_t&gt;(buffer-&gt;getMapLength()))
</del><ins>+        const std::string &amp;objectLabel = object-&gt;getLabel();
+        size_t writeLength = std::min(static_cast&lt;size_t&gt;(bufSize) - 1, objectLabel.length());
+        std::copy(objectLabel.begin(), objectLabel.begin() + writeLength, label);
+        label[writeLength] = '\0';
+        *length            = static_cast&lt;GLsizei&gt;(writeLength);
+    }
+}
+
+void GL_APIENTRY GetPointervKHR(GLenum pname, void **params)
+{
+    EVENT(&quot;(GLenum pname = 0x%X, void **params = 0x%0.8p)&quot;, pname, params);
+
+    Context *context = GetValidGlobalContext();
+    if (context)
+    {
+        if (!ValidateGetPointervKHR(context, pname, params))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // We do not currently support a non-trivial implementation of FlushMappedBufferRange
</del><ins>+        context-&gt;getPointerv(pname, params);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><del>-
</del><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_gles_2_0_exth"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0_ext.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0_ext.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_2_0_ext.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -22,6 +22,9 @@
</span><span class="cx"> // GL_ANGLE_framebuffer_multisample
</span><span class="cx"> ANGLE_EXPORT void GL_APIENTRY RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
</span><span class="cx"> 
</span><ins>+// GL_EXT_discard_framebuffer
+ANGLE_EXPORT void GL_APIENTRY DiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum *attachments);
+
</ins><span class="cx"> // GL_NV_fence
</span><span class="cx"> ANGLE_EXPORT void GL_APIENTRY DeleteFencesNV(GLsizei n, const GLuint* fences);
</span><span class="cx"> ANGLE_EXPORT void GL_APIENTRY GenFencesNV(GLsizei n, GLuint* fences);
</span><span class="lines">@@ -52,6 +55,12 @@
</span><span class="cx"> ANGLE_EXPORT void GL_APIENTRY GetQueryivEXT(GLenum target, GLenum pname, GLint *params);
</span><span class="cx"> ANGLE_EXPORT void GL_APIENTRY GetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params);
</span><span class="cx"> 
</span><ins>+// GL_EXT_disjoint_timer_query
+ANGLE_EXPORT void GL_APIENTRY QueryCounterEXT(GLuint id, GLenum target);
+ANGLE_EXPORT void GL_APIENTRY GetQueryObjectivEXT(GLuint id, GLenum pname, GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64 *params);
+ANGLE_EXPORT void GL_APIENTRY GetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64 *params);
+
</ins><span class="cx"> // GL_EXT_draw_buffers
</span><span class="cx"> ANGLE_EXPORT void GL_APIENTRY DrawBuffersEXT(GLsizei n, const GLenum *bufs);
</span><span class="cx"> 
</span><span class="lines">@@ -73,6 +82,64 @@
</span><span class="cx"> ANGLE_EXPORT void *GL_APIENTRY MapBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
</span><span class="cx"> ANGLE_EXPORT void GL_APIENTRY FlushMappedBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length);
</span><span class="cx"> 
</span><ins>+// GL_EXT_debug_marker
+ANGLE_EXPORT void GL_APIENTRY InsertEventMarkerEXT(GLsizei length, const char *marker);
+ANGLE_EXPORT void GL_APIENTRY PushGroupMarkerEXT(GLsizei length, const char *marker);
+ANGLE_EXPORT void GL_APIENTRY PopGroupMarkerEXT();
+
+// GL_OES_EGL_image
+ANGLE_EXPORT void GL_APIENTRY EGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image);
+ANGLE_EXPORT void GL_APIENTRY EGLImageTargetRenderbufferStorageOES(GLenum target,
+                                                                   GLeglImageOES image);
+
+// GL_OES_vertex_array_object
+ANGLE_EXPORT void GL_APIENTRY BindVertexArrayOES(GLuint array);
+ANGLE_EXPORT void GL_APIENTRY DeleteVertexArraysOES(GLsizei n, const GLuint *arrays);
+ANGLE_EXPORT void GL_APIENTRY GenVertexArraysOES(GLsizei n, GLuint *arrays);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsVertexArrayOES(GLuint array);
+
+// GL_KHR_debug
+ANGLE_EXPORT void GL_APIENTRY DebugMessageControlKHR(GLenum source,
+                                                     GLenum type,
+                                                     GLenum severity,
+                                                     GLsizei count,
+                                                     const GLuint *ids,
+                                                     GLboolean enabled);
+ANGLE_EXPORT void GL_APIENTRY DebugMessageInsertKHR(GLenum source,
+                                                    GLenum type,
+                                                    GLuint id,
+                                                    GLenum severity,
+                                                    GLsizei length,
+                                                    const GLchar *buf);
+ANGLE_EXPORT void GL_APIENTRY DebugMessageCallbackKHR(GLDEBUGPROCKHR callback,
+                                                      const void *userParam);
+ANGLE_EXPORT GLuint GL_APIENTRY GetDebugMessageLogKHR(GLuint count,
+                                                      GLsizei bufSize,
+                                                      GLenum *sources,
+                                                      GLenum *types,
+                                                      GLuint *ids,
+                                                      GLenum *severities,
+                                                      GLsizei *lengths,
+                                                      GLchar *messageLog);
+ANGLE_EXPORT void GL_APIENTRY PushDebugGroupKHR(GLenum source,
+                                                GLuint id,
+                                                GLsizei length,
+                                                const GLchar *message);
+ANGLE_EXPORT void GL_APIENTRY PopDebugGroupKHR(void);
+ANGLE_EXPORT void GL_APIENTRY ObjectLabelKHR(GLenum identifier,
+                                             GLuint name,
+                                             GLsizei length,
+                                             const GLchar *label);
+ANGLE_EXPORT void GL_APIENTRY
+GetObjectLabelKHR(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+ANGLE_EXPORT void GL_APIENTRY ObjectPtrLabelKHR(const void *ptr,
+                                                GLsizei length,
+                                                const GLchar *label);
+ANGLE_EXPORT void GL_APIENTRY GetObjectPtrLabelKHR(const void *ptr,
+                                                   GLsizei bufSize,
+                                                   GLsizei *length,
+                                                   GLchar *label);
+ANGLE_EXPORT void GL_APIENTRY GetPointervKHR(GLenum pname, void **params);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // LIBGLESV2_ENTRYPOINTGLES20EXT_H_
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2entry_points_gles_3_0cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_3_0.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_3_0.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_3_0.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -35,13 +35,12 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateReadBuffer(context, mode))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateReadBuffer(context, mode))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Framebuffer *readFBO = context-&gt;getState().getReadFramebuffer();
-        readFBO-&gt;setReadBuffer(mode);
</del><ins>+        context-&gt;readBuffer(mode);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -53,29 +52,20 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        IndexRange indexRange;
+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateDrawRangeElements(context, mode, start, end, count, type, indices,
+                                       &amp;indexRange))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        rx::RangeUI indexRange;
-        if (!ValidateDrawElements(context, mode, count, type, indices, 0, &amp;indexRange))
-        {
-            return;
-        }
-        if (indexRange.end &gt; end || indexRange.start &lt; start)
-        {
-            // GL spec says that behavior in this case is undefined - generating an error is fine.
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
-
</del><span class="cx">         // As long as index validation is done, it doesn't matter whether the context receives a drawElements or
</span><span class="cx">         // a drawRangeElements call - the GL back-end is free to choose to call drawRangeElements based on the
</span><span class="cx">         // validated index range. If index validation is removed, adding drawRangeElements to the context interface
</span><span class="cx">         // should be reconsidered.
</span><del>-        Error error = context-&gt;drawElements(mode, count, type, indices, 0, indexRange);
</del><ins>+        Error error =
+            context-&gt;drawRangeElements(mode, start, end, count, type, indices, indexRange);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(error);
</span><span class="lines">@@ -94,28 +84,15 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateTexImage3D(context, target, level, internalformat, width, height, depth,
+                                border, format, type, pixels))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // validateES3TexImageFormat sets the error code if there is an error
-        if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
-                                           0, 0, 0, width, height, depth, border, format, type, pixels))
-        {
-            return;
-        }
-
-        Extents size(width, height, depth);
-        Texture *texture = context-&gt;getTargetTexture(target);
-        Error error = texture-&gt;setImage(target, level, internalformat, size, format, type, context-&gt;getState().getUnpackState(),
-                                        reinterpret_cast&lt;const uint8_t *&gt;(pixels));
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;texImage3D(target, level, internalformat, width, height, depth, border, format,
+                            type, pixels);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -129,35 +106,15 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateTexSubImage3D(context, target, level, xoffset, yoffset, zoffset, width, height,
+                                   depth, format, type, pixels))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // validateES3TexImageFormat sets the error code if there is an error
-        if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
-                                           xoffset, yoffset, zoffset, width, height, depth, 0,
-                                           format, type, pixels))
-        {
-            return;
-        }
-
-        // Zero sized uploads are valid but no-ops
-        if (width == 0 || height == 0 || depth == 0)
-        {
-            return;
-        }
-
-        Box area(xoffset, yoffset, zoffset, width, height, depth);
-        Texture *texture = context-&gt;getTargetTexture(target);
-        Error error = texture-&gt;setSubImage(target, level, area, format, type, context-&gt;getState().getUnpackState(),
-                                           reinterpret_cast&lt;const uint8_t *&gt;(pixels));
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth,
+                               format, type, pixels);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -170,29 +127,14 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateCopyTexSubImage3D(context, target, level, xoffset, yoffset, zoffset, x, y,
+                                       width, height))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
-                                               x, y, width, height, 0))
-        {
-            return;
-        }
-
-        Offset destOffset(xoffset, yoffset, zoffset);
-        Rectangle sourceArea(x, y, width, height);
-
-        const Framebuffer *framebuffer = context-&gt;getState().getReadFramebuffer();
-        Texture *texture = context-&gt;getTargetTexture(target);
-        Error error = texture-&gt;copySubImage(target, level, destOffset, sourceArea, framebuffer);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -206,35 +148,15 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateCompressedTexImage3D(context, target, level, internalformat, width, height,
+                                          depth, border, imageSize, data))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        const InternalFormat &amp;formatInfo = GetInternalFormatInfo(internalformat);
-        if (imageSize &lt; 0 || static_cast&lt;GLuint&gt;(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
-        // validateES3TexImageFormat sets the error code if there is an error
-        if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
-                                           0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
-        {
-            return;
-        }
-
-        Extents size(width, height, depth);
-        Texture *texture = context-&gt;getTargetTexture(target);
-        Error error = texture-&gt;setCompressedImage(target, level, internalformat, size, context-&gt;getState().getUnpackState(),
-                                                  reinterpret_cast&lt;const uint8_t *&gt;(data));
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;compressedTexImage3D(target, level, internalformat, width, height, depth, border,
+                                      imageSize, data);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -248,47 +170,15 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateCompressedTexSubImage3D(context, target, level, xoffset, yoffset, zoffset,
+                                             width, height, depth, format, imageSize, data))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        const InternalFormat &amp;formatInfo = GetInternalFormatInfo(format);
-        if (imageSize &lt; 0 || static_cast&lt;GLuint&gt;(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
-        if (!data)
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
-        // validateES3TexImageFormat sets the error code if there is an error
-        if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
-                                           0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
-        {
-            return;
-        }
-
-        // Zero sized uploads are valid but no-ops
-        if (width == 0 || height == 0)
-        {
-            return;
-        }
-
-        Box area(xoffset, yoffset, zoffset, width, height, depth);
-        Texture *texture = context-&gt;getTargetTexture(target);
-        Error error = texture-&gt;setCompressedSubImage(target, level, area, format, context-&gt;getState().getUnpackState(),
-                                                     reinterpret_cast&lt;const uint8_t *&gt;(data));
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height,
+                                         depth, format, imageSize, data);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -299,18 +189,11 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateGenQueries(context, n, ids))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (n &lt; 0)
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
</del><span class="cx">         for (GLsizei i = 0; i &lt; n; i++)
</span><span class="cx">         {
</span><span class="cx">             ids[i] = context-&gt;createQuery();
</span><span class="lines">@@ -325,20 +208,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDeleteQueries(context, n, ids))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (n &lt; 0)
</del><ins>+        for (int i = 0; i &lt; n; i++)
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
-        for (GLsizei i = 0; i &lt; n; i++)
-        {
</del><span class="cx">             context-&gt;deleteQuery(ids[i]);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -370,12 +246,6 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
-
</del><span class="cx">         if (!ValidateBeginQuery(context, target, id))
</span><span class="cx">         {
</span><span class="cx">             return;
</span><span class="lines">@@ -397,12 +267,6 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
-
</del><span class="cx">         if (!ValidateEndQuery(context, target))
</span><span class="cx">         {
</span><span class="cx">             return;
</span><span class="lines">@@ -424,28 +288,12 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!ValidateGetQueryiv(context, target, pname, params))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidQueryType(context, target))
-        {
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
-
-        switch (pname)
-        {
-          case GL_CURRENT_QUERY:
-            params[0] = static_cast&lt;GLint&gt;(context-&gt;getState().getActiveQueryId(target));
-            break;
-
-          default:
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
</del><ins>+        context-&gt;getQueryiv(target, pname, params);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -456,54 +304,17 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!ValidateGetQueryObjectuiv(context, id, pname, params))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Query *queryObject = context-&gt;getQuery(id, false, GL_NONE);
-
-        if (!queryObject)
</del><ins>+        Error error = context-&gt;getQueryObjectuiv(id, pname, params);
+        if (error.isError())
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><ins>+            context-&gt;recordError(error);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><del>-
-        if (context-&gt;getState().getActiveQueryId(queryObject-&gt;getType()) == id)
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
-
-        switch(pname)
-        {
-          case GL_QUERY_RESULT_EXT:
-            {
-                Error error = queryObject-&gt;getResult(params);
-                if (error.isError())
-                {
-                    context-&gt;recordError(error);
-                    return;
-                }
-            }
-            break;
-
-          case GL_QUERY_RESULT_AVAILABLE_EXT:
-            {
-                Error error = queryObject-&gt;isResultAvailable(params);
-                if (error.isError())
-                {
-                    context-&gt;recordError(error);
-                    return;
-                }
-            }
-            break;
-
-          default:
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
</del><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -514,13 +325,12 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateUnmapBuffer(context, target))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return GL_FALSE;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        return UnmapBufferOES(target);
</del><ins>+        return context-&gt;unmapBuffer(target);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return GL_FALSE;
</span><span class="lines">@@ -533,13 +343,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateGetBufferPointerv(context, target, pname, params))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        GetBufferPointervOES(target, pname, params);
</del><ins>+        context-&gt;getBufferPointerv(target, pname, params);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -548,13 +358,12 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDrawBuffers(context, n, bufs))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        DrawBuffersEXT(n, bufs);
</del><ins>+        context-&gt;drawBuffers(n, bufs);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -675,34 +484,15 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateBlitFramebuffer(context, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1,
+                                     dstY1, mask, filter))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
-                                               dstX0, dstY0, dstX1, dstY1, mask, filter,
-                                               false))
-        {
-            return;
-        }
-
-        Framebuffer *readFramebuffer = context-&gt;getState().getReadFramebuffer();
-        ASSERT(readFramebuffer);
-
-        Framebuffer *drawFramebuffer = context-&gt;getState().getDrawFramebuffer();
-        ASSERT(drawFramebuffer);
-
-        Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
-        Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
-
-        Error error = drawFramebuffer-&gt;blit(context-&gt;getState(), srcArea, dstArea, mask, filter, readFramebuffer);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask,
+                                 filter);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -738,37 +528,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateFramebufferTextureLayer(context, target, attachment, texture,
-                                             level, layer))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateFramebufferTextureLayer(context, target, attachment, texture, level, layer))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Framebuffer *framebuffer = context-&gt;getState().getTargetFramebuffer(target);
-        ASSERT(framebuffer);
-
-        if (texture != 0)
-        {
-            Texture *textureObject = context-&gt;getTexture(texture);
-
-            ImageIndex index = ImageIndex::MakeInvalid();
-
-            if (textureObject-&gt;getTarget() == GL_TEXTURE_3D)
-            {
-                index = ImageIndex::Make3D(level, layer);
-            }
-            else
-            {
-                ASSERT(textureObject-&gt;getTarget() == GL_TEXTURE_2D_ARRAY);
-                index = ImageIndex::Make2DArray(level, layer);
-            }
-
-            framebuffer-&gt;setAttachment(GL_TEXTURE, attachment, index, textureObject);
-        }
-        else
-        {
-            framebuffer-&gt;resetAttachment(attachment);
-        }
</del><ins>+        context-&gt;framebufferTextureLayer(target, attachment, texture, level, layer);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -780,16 +546,16 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateMapBufferRange(context, target, offset, length, access))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return NULL;
</del><ins>+            return nullptr;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><del>-        return MapBufferRangeEXT(target, offset, length, access);
</del><ins>+        return context-&gt;mapBufferRange(target, offset, length, access);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return NULL;
</del><ins>+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void GL_APIENTRY FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
</span><span class="lines">@@ -799,13 +565,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateFlushMappedBufferRange(context, target, offset, length))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        FlushMappedBufferRangeEXT(target, offset, length);
</del><ins>+        context-&gt;flushMappedBufferRange(target, offset, length);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -816,22 +582,11 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!ValidateBindVertexArray(context, array))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        VertexArray *vao = context-&gt;getVertexArray(array);
-
-        if (!vao)
-        {
-            // The default VAO should always exist
-            ASSERT(array != 0);
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
-
</del><span class="cx">         context-&gt;bindVertexArray(array);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -843,18 +598,11 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDeleteVertexArrays(context, n, arrays))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (n &lt; 0)
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
</del><span class="cx">         for (int arrayIndex = 0; arrayIndex &lt; n; arrayIndex++)
</span><span class="cx">         {
</span><span class="cx">             if (arrays[arrayIndex] != 0)
</span><span class="lines">@@ -872,18 +620,11 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateGenVertexArrays(context, n, arrays))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (n &lt; 0)
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
</del><span class="cx">         for (int arrayIndex = 0; arrayIndex &lt; n; arrayIndex++)
</span><span class="cx">         {
</span><span class="cx">             arrays[arrayIndex] = context-&gt;createVertexArray();
</span><span class="lines">@@ -898,9 +639,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!ValidateIsVertexArray(context))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return GL_FALSE;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -1005,41 +745,12 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateBeginTransformFeedback(context, primitiveMode))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        switch (primitiveMode)
-        {
-          case GL_TRIANGLES:
-          case GL_LINES:
-          case GL_POINTS:
-            break;
-
-          default:
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
-
-        TransformFeedback *transformFeedback = context-&gt;getState().getCurrentTransformFeedback();
-        ASSERT(transformFeedback != NULL);
-
-        if (transformFeedback-&gt;isActive())
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
-
-        if (transformFeedback-&gt;isPaused())
-        {
-            transformFeedback-&gt;resume();
-        }
-        else
-        {
-            transformFeedback-&gt;begin(primitiveMode);
-        }
</del><ins>+        context-&gt;beginTransformFeedback(primitiveMode);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1258,14 +969,12 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidProgram(context, program))
</del><ins>+        Program *programObject = GetValidProgram(context, program);
+        if (!programObject)
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
-        ASSERT(programObject);
-
</del><span class="cx">         programObject-&gt;setTransformFeedbackVaryings(count, varyings, bufferMode);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -1291,14 +1000,12 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidProgram(context, program))
</del><ins>+        Program *programObject = GetValidProgram(context, program);
+        if (!programObject)
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
-        ASSERT(programObject);
-
</del><span class="cx">         if (index &gt;= static_cast&lt;GLuint&gt;(programObject-&gt;getTransformFeedbackVaryingCount()))
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_VALUE));
</span><span class="lines">@@ -1714,43 +1421,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateClearBuffer(context))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateClearBufferiv(context, buffer, drawbuffer, value))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        switch (buffer)
-        {
-          case GL_COLOR:
-            if (drawbuffer &lt; 0 || static_cast&lt;GLuint&gt;(drawbuffer) &gt;= context-&gt;getCaps().maxDrawBuffers)
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
-            break;
-
-          case GL_STENCIL:
-            if (drawbuffer != 0)
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
-            break;
-
-          default:
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
-
-        Framebuffer *framebufferObject = context-&gt;getState().getDrawFramebuffer();
-        ASSERT(framebufferObject);
-
-        Error error = framebufferObject-&gt;clearBufferiv(context-&gt;getState(), buffer, drawbuffer, value);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;clearBufferiv(buffer, drawbuffer, value);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1762,35 +1439,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateClearBuffer(context))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateClearBufferuiv(context, buffer, drawbuffer, value))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        switch (buffer)
-        {
-          case GL_COLOR:
-            if (drawbuffer &lt; 0 || static_cast&lt;GLuint&gt;(drawbuffer) &gt;= context-&gt;getCaps().maxDrawBuffers)
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
-            break;
-
-          default:
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
-
-        Framebuffer *framebufferObject = context-&gt;getState().getDrawFramebuffer();
-        ASSERT(framebufferObject);
-
-        Error error = framebufferObject-&gt;clearBufferuiv(context-&gt;getState(), buffer, drawbuffer, value);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;clearBufferuiv(buffer, drawbuffer, value);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1802,43 +1457,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateClearBuffer(context))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateClearBufferfv(context, buffer, drawbuffer, value))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        switch (buffer)
-        {
-          case GL_COLOR:
-            if (drawbuffer &lt; 0 || static_cast&lt;GLuint&gt;(drawbuffer) &gt;= context-&gt;getCaps().maxDrawBuffers)
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
-            break;
-
-          case GL_DEPTH:
-            if (drawbuffer != 0)
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
-            break;
-
-          default:
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
-
-        Framebuffer *framebufferObject = context-&gt;getState().getDrawFramebuffer();
-        ASSERT(framebufferObject);
-
-        Error error = framebufferObject-&gt;clearBufferfv(context-&gt;getState(), buffer, drawbuffer, value);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;clearBufferfv(buffer, drawbuffer, value);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1850,35 +1475,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (!ValidateClearBuffer(context))
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateClearBufferfi(context, buffer, drawbuffer, depth, stencil))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        switch (buffer)
-        {
-          case GL_DEPTH_STENCIL:
-            if (drawbuffer != 0)
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
-            break;
-
-          default:
-            context-&gt;recordError(Error(GL_INVALID_ENUM));
-            return;
-        }
-
-        Framebuffer *framebufferObject = context-&gt;getState().getDrawFramebuffer();
-        ASSERT(framebufferObject);
-
-        Error error = framebufferObject-&gt;clearBufferfi(context-&gt;getState(), buffer, drawbuffer, depth, stencil);
-        if (error.isError())
-        {
-            context-&gt;recordError(error);
-            return;
-        }
</del><ins>+        context-&gt;clearBufferfi(buffer, drawbuffer, depth, stencil);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1996,20 +1599,11 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (!programObject-&gt;isLinked())
</span><span class="lines">@@ -2049,20 +1643,11 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         switch (pname)
</span><span class="lines">@@ -2120,20 +1705,10 @@
</span><span class="cx">             return GL_INVALID_INDEX;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
-
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return GL_INVALID_INDEX;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return GL_INVALID_INDEX;
-            }
</del><ins>+            return GL_INVALID_INDEX;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         return programObject-&gt;getUniformBlockIndex(uniformBlockName);
</span><span class="lines">@@ -2155,20 +1730,11 @@
</span><span class="cx">             context-&gt;recordError(Error(GL_INVALID_OPERATION));
</span><span class="cx">             return;
</span><span class="cx">         }
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (uniformBlockIndex &gt;= programObject-&gt;getActiveUniformBlockCount())
</span><span class="lines">@@ -2213,20 +1779,11 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (uniformBlockIndex &gt;= programObject-&gt;getActiveUniformBlockCount())
</span><span class="lines">@@ -2259,20 +1816,11 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Program *programObject = context-&gt;getProgram(program);
</del><ins>+        Program *programObject = GetValidProgram(context, program);
</ins><span class="cx"> 
</span><span class="cx">         if (!programObject)
</span><span class="cx">         {
</span><del>-            if (context-&gt;getShader(program))
-            {
-                context-&gt;recordError(Error(GL_INVALID_OPERATION));
-                return;
-            }
-            else
-            {
-                context-&gt;recordError(Error(GL_INVALID_VALUE));
-                return;
-            }
</del><ins>+            return;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // if never linked, there won't be any uniform blocks
</span><span class="lines">@@ -2305,7 +1853,7 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Error error = context-&gt;drawArrays(mode, first, count, instanceCount);
</del><ins>+        Error error = context-&gt;drawArraysInstanced(mode, first, count, instanceCount);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(error);
</span><span class="lines">@@ -2328,13 +1876,14 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        rx::RangeUI indexRange;
</del><ins>+        IndexRange indexRange;
</ins><span class="cx">         if (!ValidateDrawElementsInstanced(context, mode, count, type, indices, instanceCount, &amp;indexRange))
</span><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        Error error = context-&gt;drawElements(mode, count, type, indices, instanceCount, indexRange);
</del><ins>+        Error error =
+            context-&gt;drawElementsInstanced(mode, count, type, indices, instanceCount, indexRange);
</ins><span class="cx">         if (error.isError())
</span><span class="cx">         {
</span><span class="cx">             context-&gt;recordError(error);
</span><span class="lines">@@ -2738,18 +2287,11 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateGenSamplers(context, count, samplers))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (count &lt; 0)
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
</del><span class="cx">         for (int i = 0; i &lt; count; i++)
</span><span class="cx">         {
</span><span class="cx">             samplers[i] = context-&gt;createSampler();
</span><span class="lines">@@ -2764,18 +2306,11 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDeleteSamplers(context, count, samplers))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (count &lt; 0)
-        {
-            context-&gt;recordError(Error(GL_INVALID_VALUE));
-            return;
-        }
-
</del><span class="cx">         for (int i = 0; i &lt; count; i++)
</span><span class="cx">         {
</span><span class="cx">             context-&gt;deleteSampler(samplers[i]);
</span><span class="lines">@@ -2838,28 +2373,12 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateSamplerParameteri(context, sampler, pname, param))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateSamplerObjectParameter(context, pname))
-        {
-            return;
-        }
-
-        if (!ValidateTexParamParameters(context, pname, param))
-        {
-            return;
-        }
-
-        if (!context-&gt;isSampler(sampler))
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
-
</del><span class="cx">         context-&gt;samplerParameteri(sampler, pname, param);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -2876,28 +2395,12 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateSamplerParameterf(context, sampler, pname, param))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateSamplerObjectParameter(context, pname))
-        {
-            return;
-        }
-
-        if (!ValidateTexParamParameters(context, pname, static_cast&lt;GLint&gt;(param)))
-        {
-            return;
-        }
-
-        if (!context-&gt;isSampler(sampler))
-        {
-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
-            return;
-        }
-
</del><span class="cx">         context-&gt;samplerParameterf(sampler, pname, param);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -3012,9 +2515,11 @@
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
</span><del>-                if (context-&gt;getTransformFeedback(id) == NULL)
</del><ins>+                if (!context-&gt;isTransformFeedbackGenerated(id))
</ins><span class="cx">                 {
</span><del>-                    context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><ins>+                    context-&gt;recordError(
+                        Error(GL_INVALID_OPERATION,
+                              &quot;Cannot bind a transform feedback object that does not exist.&quot;));
</ins><span class="cx">                     return;
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="lines">@@ -3036,9 +2541,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateDeleteTransformFeedbacks(context, n, ids))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -3056,9 +2560,8 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp; !ValidateGenTransformFeedbacks(context, n, ids))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -3082,7 +2585,15 @@
</span><span class="cx">             return GL_FALSE;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        return ((context-&gt;getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
</del><ins>+        if (id == 0)
+        {
+            // The 3.0.4 spec [section 6.1.11] states that if ID is zero, IsTransformFeedback
+            // returns FALSE
+            return GL_FALSE;
+        }
+
+        const TransformFeedback *transformFeedback = context-&gt;getTransformFeedback(id);
+        return ((transformFeedback != nullptr) ? GL_TRUE : GL_FALSE);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return GL_FALSE;
</span><span class="lines">@@ -3150,14 +2661,20 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!ValidateGetProgramBinary(context, program, bufSize, length, binaryFormat, binary))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // TODO: Pipe through to the OES extension for now, needs proper validation
-        return GetProgramBinaryOES(program, bufSize, length, binaryFormat, binary);
</del><ins>+        Program *programObject = context-&gt;getProgram(program);
+        ASSERT(programObject != nullptr);
+
+        Error error = programObject-&gt;saveBinary(binaryFormat, binary, bufSize, length);
+        if (error.isError())
+        {
+            context-&gt;recordError(error);
+            return;
+        }
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3169,14 +2686,20 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!ValidateProgramBinary(context, program, binaryFormat, binary, length))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // TODO: Pipe through to the OES extension for now, needs proper validation
-        return ProgramBinaryOES(program, binaryFormat, binary, length);
</del><ins>+        Program *programObject = context-&gt;getProgram(program);
+        ASSERT(programObject != nullptr);
+
+        Error error = programObject-&gt;loadBinary(binaryFormat, binary, length);
+        if (error.isError())
+        {
+            context-&gt;recordError(error);
+            return;
+        }
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3188,14 +2711,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateProgramParameteri(context, program, pname, value))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // glProgramParameteri
-        UNIMPLEMENTED();
</del><ins>+        context-&gt;programParameteri(program, pname, value);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3207,29 +2729,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateInvalidateFramebuffer(context, target, numAttachments, attachments))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
-        {
-            return;
-        }
-
-        Framebuffer *framebuffer = context-&gt;getState().getTargetFramebuffer(target);
-        ASSERT(framebuffer);
-
-        if (framebuffer-&gt;checkStatus(context-&gt;getData()) == GL_FRAMEBUFFER_COMPLETE)
-        {
-            Error error = framebuffer-&gt;invalidate(numAttachments, attachments);
-            if (error.isError())
-            {
-                context-&gt;recordError(error);
-                return;
-            }
-        }
</del><ins>+        context-&gt;invalidateFramebuffer(target, numAttachments, attachments);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3242,30 +2748,13 @@
</span><span class="cx">     Context *context = GetValidGlobalContext();
</span><span class="cx">     if (context)
</span><span class="cx">     {
</span><del>-        if (context-&gt;getClientVersion() &lt; 3)
</del><ins>+        if (!context-&gt;skipValidation() &amp;&amp;
+            !ValidateInvalidateFramebuffer(context, target, numAttachments, attachments))
</ins><span class="cx">         {
</span><del>-            context-&gt;recordError(Error(GL_INVALID_OPERATION));
</del><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
-        {
-            return;
-        }
-
-        Framebuffer *framebuffer = context-&gt;getState().getTargetFramebuffer(target);
-        ASSERT(framebuffer);
-
-        if (framebuffer-&gt;checkStatus(context-&gt;getData()) == GL_FRAMEBUFFER_COMPLETE)
-        {
-            Rectangle area(x, y, width, height);
-            Error error = framebuffer-&gt;invalidateSub(numAttachments, attachments, area);
-            if (error.isError())
-            {
-                context-&gt;recordError(error);
-                return;
-            }
-        }
</del><ins>+        context-&gt;invalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3283,7 +2772,8 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
</del><ins>+        if (!ValidateES3TexStorage2DParameters(context, target, levels, internalformat, width,
+                                               height, 1))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="lines">@@ -3314,7 +2804,8 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
</del><ins>+        if (!ValidateES3TexStorage3DParameters(context, target, levels, internalformat, width,
+                                               height, depth))
</ins><span class="cx">         {
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="lines">@@ -3369,7 +2860,7 @@
</span><span class="cx">           case GL_NUM_SAMPLE_COUNTS:
</span><span class="cx">             if (bufSize != 0)
</span><span class="cx">             {
</span><del>-                *params = formatCaps.sampleCounts.size();
</del><ins>+                *params = static_cast&lt;GLint&gt;(formatCaps.sampleCounts.size());
</ins><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2global_statecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -55,13 +55,6 @@
</span><span class="cx">     return current;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DeallocateCurrent()
-{
-    Current *current = reinterpret_cast&lt;Current*&gt;(GetTLSValue(currentTLS));
-    SafeDelete(current);
-    SetTLSValue(currentTLS, NULL);
-}
-
</del><span class="cx"> Current *GetCurrentData()
</span><span class="cx"> {
</span><span class="cx">     // Create a TLS index if one has not been created for this DLL
</span><span class="lines">@@ -78,6 +71,14 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #ifdef ANGLE_PLATFORM_WINDOWS
</span><ins>+
+void DeallocateCurrent()
+{
+    Current *current = reinterpret_cast&lt;Current*&gt;(GetTLSValue(currentTLS));
+    SafeDelete(current);
+    SetTLSValue(currentTLS, NULL);
+}
+
</ins><span class="cx"> extern &quot;C&quot; BOOL WINAPI DllMain(HINSTANCE, DWORD reason, LPVOID)
</span><span class="cx"> {
</span><span class="cx">     switch (reason)
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2libGLESv2cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -9,7 +9,6 @@
</span><span class="cx"> #include &quot;libGLESv2/entry_points_gles_2_0.h&quot;
</span><span class="cx"> #include &quot;libGLESv2/entry_points_gles_2_0_ext.h&quot;
</span><span class="cx"> #include &quot;libGLESv2/entry_points_gles_3_0.h&quot;
</span><del>-#include &quot;libGLESv2/entry_points_gles_3_0_ext.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;common/event_tracer.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -1256,6 +1255,11 @@
</span><span class="cx">     return gl::RenderbufferStorageMultisampleANGLE(target, samples, internalformat, width, height);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void GL_APIENTRY glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+    return gl::DiscardFramebufferEXT(target, numAttachments, attachments);
+}
+
</ins><span class="cx"> void GL_APIENTRY glDeleteFencesNV(GLsizei n, const GLuint* fences)
</span><span class="cx"> {
</span><span class="cx">     return gl::DeleteFencesNV(n, fences);
</span><span class="lines">@@ -1346,16 +1350,36 @@
</span><span class="cx">     return gl::EndQueryEXT(target);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void GL_APIENTRY glQueryCounterEXT(GLuint id, GLenum target)
+{
+    return gl::QueryCounterEXT(id, target);
+}
+
</ins><span class="cx"> void GL_APIENTRY glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
</span><span class="cx"> {
</span><span class="cx">     return gl::GetQueryivEXT(target, pname, params);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void GL_APIENTRY glGetQueryObjectivEXT(GLuint id, GLenum pname, GLint *params)
+{
+    return gl::GetQueryObjectivEXT(id, pname, params);
+}
+
</ins><span class="cx"> void GL_APIENTRY glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
</span><span class="cx"> {
</span><span class="cx">     return gl::GetQueryObjectuivEXT(id, pname, params);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void GL_APIENTRY glGetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64 *params)
+{
+    return gl::GetQueryObjecti64vEXT(id, pname, params);
+}
+
+void GL_APIENTRY glGetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64 *params)
+{
+    return gl::GetQueryObjectui64vEXT(id, pname, params);
+}
+
</ins><span class="cx"> void GL_APIENTRY glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
</span><span class="cx"> {
</span><span class="cx">     return gl::DrawBuffersEXT(n, bufs);
</span><span class="lines">@@ -1411,4 +1435,131 @@
</span><span class="cx">     return gl::FlushMappedBufferRangeEXT(target, offset, length);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void GL_APIENTRY glInsertEventMarkerEXT(GLsizei length, const char *marker)
+{
+    return gl::InsertEventMarkerEXT(length, marker);
</ins><span class="cx"> }
</span><ins>+
+void GL_APIENTRY glPushGroupMarkerEXT(GLsizei length, const char *marker)
+{
+    return gl::PushGroupMarkerEXT(length, marker);
+}
+
+void GL_APIENTRY glPopGroupMarkerEXT()
+{
+    return gl::PopGroupMarkerEXT();
+}
+
+void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
+{
+    return gl::EGLImageTargetTexture2DOES(target, image);
+}
+
+void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
+{
+    return gl::EGLImageTargetRenderbufferStorageOES(target, image);
+}
+
+void GL_APIENTRY glBindVertexArrayOES(GLuint array)
+{
+    return gl::BindVertexArrayOES(array);
+}
+
+void GL_APIENTRY glDeleteVertexArraysOES(GLsizei n, const GLuint *arrays)
+{
+    return gl::DeleteVertexArraysOES(n, arrays);
+}
+
+void GL_APIENTRY glGenVertexArraysOES(GLsizei n, GLuint *arrays)
+{
+    return gl::GenVertexArraysOES(n, arrays);
+}
+
+GLboolean GL_APIENTRY glIsVertexArrayOES(GLuint array)
+{
+    return gl::IsVertexArrayOES(array);
+}
+
+void GL_APIENTRY glDebugMessageControlKHR(GLenum source,
+                                          GLenum type,
+                                          GLenum severity,
+                                          GLsizei count,
+                                          const GLuint *ids,
+                                          GLboolean enabled)
+{
+    return gl::DebugMessageControlKHR(source, type, severity, count, ids, enabled);
+}
+
+void GL_APIENTRY glDebugMessageInsertKHR(GLenum source,
+                                         GLenum type,
+                                         GLuint id,
+                                         GLenum severity,
+                                         GLsizei length,
+                                         const GLchar *buf)
+{
+    return gl::DebugMessageInsertKHR(source, type, id, severity, length, buf);
+}
+
+void GL_APIENTRY glDebugMessageCallbackKHR(GLDEBUGPROCKHR callback, const void *userParam)
+{
+    return gl::DebugMessageCallbackKHR(callback, userParam);
+}
+
+GLuint GL_APIENTRY glGetDebugMessageLogKHR(GLuint count,
+                                           GLsizei bufSize,
+                                           GLenum *sources,
+                                           GLenum *types,
+                                           GLuint *ids,
+                                           GLenum *severities,
+                                           GLsizei *lengths,
+                                           GLchar *messageLog)
+{
+    return gl::GetDebugMessageLogKHR(count, bufSize, sources, types, ids, severities, lengths,
+                                     messageLog);
+}
+
+void GL_APIENTRY glPushDebugGroupKHR(GLenum source,
+                                     GLuint id,
+                                     GLsizei length,
+                                     const GLchar *message)
+{
+    return gl::PushDebugGroupKHR(source, id, length, message);
+}
+
+void GL_APIENTRY glPopDebugGroupKHR(void)
+{
+    return gl::PopDebugGroupKHR();
+}
+
+void GL_APIENTRY glObjectLabelKHR(GLenum identifier,
+                                  GLuint name,
+                                  GLsizei length,
+                                  const GLchar *label)
+{
+    return gl::ObjectLabelKHR(identifier, name, length, label);
+}
+
+void GL_APIENTRY
+glGetObjectLabelKHR(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)
+{
+    return gl::GetObjectLabelKHR(identifier, name, bufSize, length, label);
+}
+
+void GL_APIENTRY glObjectPtrLabelKHR(const void *ptr, GLsizei length, const GLchar *label)
+{
+    return gl::ObjectPtrLabelKHR(ptr, length, label);
+}
+
+void GL_APIENTRY glGetObjectPtrLabelKHR(const void *ptr,
+                                        GLsizei bufSize,
+                                        GLsizei *length,
+                                        GLchar *label)
+{
+    return gl::GetObjectPtrLabelKHR(ptr, bufSize, length, label);
+}
+
+void GL_APIENTRY glGetPointervKHR(GLenum pname, void **params)
+{
+    return gl::GetPointervKHR(pname, params);
+}
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2libGLESv2def"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.def (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.def        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.def        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -177,6 +177,31 @@
</span><span class="cx">     glGetBufferPointervOES          @287
</span><span class="cx">     glMapBufferRangeEXT             @288
</span><span class="cx">     glFlushMappedBufferRangeEXT     @289
</span><ins>+    glDiscardFramebufferEXT         @293
+    glInsertEventMarkerEXT          @294
+    glPushGroupMarkerEXT            @295
+    glPopGroupMarkerEXT             @296
+    glEGLImageTargetTexture2DOES    @297
+    glEGLImageTargetRenderbufferStorageOES @298
+    glBindVertexArrayOES            @299
+    glDeleteVertexArraysOES         @300
+    glGenVertexArraysOES            @301
+    glIsVertexArrayOES              @302
+    glDebugMessageControlKHR        @303
+    glDebugMessageInsertKHR         @304
+    glDebugMessageCallbackKHR       @305
+    glGetDebugMessageLogKHR         @306
+    glPushDebugGroupKHR             @307
+    glPopDebugGroupKHR              @308
+    glObjectLabelKHR                @309
+    glGetObjectLabelKHR             @310
+    glObjectPtrLabelKHR             @311
+    glGetObjectPtrLabelKHR          @312
+    glGetPointervKHR                @313
+    glQueryCounterEXT               @314
+    glGetQueryObjectivEXT           @315
+    glGetQueryObjecti64vEXT         @316
+    glGetQueryObjectui64vEXT        @317
</ins><span class="cx"> 
</span><span class="cx">     ; GLES 3.0 Functions
</span><span class="cx">     glReadBuffer                    @180
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2libGLESv2rc"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.rc (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.rc        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.rc        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -54,8 +54,8 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> VS_VERSION_INFO VERSIONINFO
</span><del>- FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,0,0
- PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,0,0
</del><ins>+ FILEVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
+ PRODUCTVERSION ANGLE_MAJOR_VERSION,ANGLE_MINOR_VERSION,ANGLE_REVISION,0
</ins><span class="cx">  FILEFLAGSMASK 0x17L
</span><span class="cx"> #ifdef _DEBUG
</span><span class="cx">  FILEFLAGS 0x1L
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrclibGLESv2gypi"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/libGLESv2.gypi (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/libGLESv2.gypi        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/libGLESv2.gypi        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -5,9 +5,13 @@
</span><span class="cx"> {
</span><span class="cx">     'variables':
</span><span class="cx">     {
</span><ins>+        'angle_standalone%': 0,
+
</ins><span class="cx">         # These file lists are shared with the GN build.
</span><span class="cx">         'libangle_common_sources':
</span><span class="cx">         [
</span><ins>+            'common/BitSetIterator.h',
+            'common/Float16ToFloat32.cpp',
</ins><span class="cx">             'common/MemoryBuffer.cpp',
</span><span class="cx">             'common/MemoryBuffer.h',
</span><span class="cx">             'common/Optional.h',
</span><span class="lines">@@ -17,7 +21,10 @@
</span><span class="cx">             'common/debug.h',
</span><span class="cx">             'common/mathutil.cpp',
</span><span class="cx">             'common/mathutil.h',
</span><ins>+            'common/matrix_utils.h',
</ins><span class="cx">             'common/platform.h',
</span><ins>+            'common/string_utils.cpp',
+            'common/string_utils.h',
</ins><span class="cx">             'common/tls.cpp',
</span><span class="cx">             'common/tls.h',
</span><span class="cx">             'common/utilities.cpp',
</span><span class="lines">@@ -35,8 +42,9 @@
</span><span class="cx">             '../include/GLES2/gl2ext.h',
</span><span class="cx">             '../include/GLES2/gl2platform.h',
</span><span class="cx">             '../include/GLES3/gl3.h',
</span><del>-            '../include/GLES3/gl3ext.h',
</del><span class="cx">             '../include/GLES3/gl3platform.h',
</span><ins>+            '../include/GLES3/gl31.h',
+            '../include/GLES3/gl32.h',
</ins><span class="cx">             '../include/GLSLANG/ShaderLang.h',
</span><span class="cx">             '../include/GLSLANG/ShaderVars.h',
</span><span class="cx">             '../include/KHR/khrplatform.h',
</span><span class="lines">@@ -62,6 +70,8 @@
</span><span class="cx">             'libANGLE/Context.h',
</span><span class="cx">             'libANGLE/Data.cpp',
</span><span class="cx">             'libANGLE/Data.h',
</span><ins>+            'libANGLE/Debug.cpp',
+            'libANGLE/Debug.h',
</ins><span class="cx">             'libANGLE/Device.cpp',
</span><span class="cx">             'libANGLE/Device.h',
</span><span class="cx">             'libANGLE/Display.cpp',
</span><span class="lines">@@ -71,21 +81,23 @@
</span><span class="cx">             'libANGLE/Error.inl',
</span><span class="cx">             'libANGLE/Fence.cpp',
</span><span class="cx">             'libANGLE/Fence.h',
</span><del>-            'libANGLE/Float16ToFloat32.cpp',
</del><span class="cx">             'libANGLE/Framebuffer.cpp',
</span><span class="cx">             'libANGLE/Framebuffer.h',
</span><span class="cx">             'libANGLE/FramebufferAttachment.cpp',
</span><span class="cx">             'libANGLE/FramebufferAttachment.h',
</span><span class="cx">             'libANGLE/HandleAllocator.cpp',
</span><span class="cx">             'libANGLE/HandleAllocator.h',
</span><ins>+            'libANGLE/Image.h',
+            'libANGLE/Image.cpp',
</ins><span class="cx">             'libANGLE/ImageIndex.h',
</span><span class="cx">             'libANGLE/ImageIndex.cpp',
</span><ins>+            'libANGLE/IndexRangeCache.cpp',
+            'libANGLE/IndexRangeCache.h',
</ins><span class="cx">             'libANGLE/Platform.cpp',
</span><span class="cx">             'libANGLE/Program.cpp',
</span><span class="cx">             'libANGLE/Program.h',
</span><span class="cx">             'libANGLE/Query.cpp',
</span><span class="cx">             'libANGLE/Query.h',
</span><del>-            'libANGLE/RefCountObject.cpp',
</del><span class="cx">             'libANGLE/RefCountObject.h',
</span><span class="cx">             'libANGLE/Renderbuffer.cpp',
</span><span class="cx">             'libANGLE/Renderbuffer.h',
</span><span class="lines">@@ -97,6 +109,8 @@
</span><span class="cx">             'libANGLE/Shader.h',
</span><span class="cx">             'libANGLE/State.cpp',
</span><span class="cx">             'libANGLE/State.h',
</span><ins>+            'libANGLE/Stream.cpp',
+            'libANGLE/Stream.h',
</ins><span class="cx">             'libANGLE/Surface.cpp',
</span><span class="cx">             'libANGLE/Surface.h',
</span><span class="cx">             'libANGLE/Texture.cpp',
</span><span class="lines">@@ -105,12 +119,16 @@
</span><span class="cx">             'libANGLE/TransformFeedback.h',
</span><span class="cx">             'libANGLE/Uniform.cpp',
</span><span class="cx">             'libANGLE/Uniform.h',
</span><ins>+            'libANGLE/Version.h',
+            'libANGLE/Version.inl',
</ins><span class="cx">             'libANGLE/VertexArray.cpp',
</span><span class="cx">             'libANGLE/VertexArray.h',
</span><span class="cx">             'libANGLE/VertexAttribute.cpp',
</span><span class="cx">             'libANGLE/VertexAttribute.h',
</span><ins>+            'libANGLE/VertexAttribute.inl',
</ins><span class="cx">             'libANGLE/angletypes.cpp',
</span><span class="cx">             'libANGLE/angletypes.h',
</span><ins>+            'libANGLE/angletypes.inl',
</ins><span class="cx">             'libANGLE/features.h',
</span><span class="cx">             'libANGLE/formatutils.cpp',
</span><span class="cx">             'libANGLE/formatutils.h',
</span><span class="lines">@@ -126,23 +144,21 @@
</span><span class="cx">             'libANGLE/renderer/FenceNVImpl.h',
</span><span class="cx">             'libANGLE/renderer/FenceSyncImpl.h',
</span><span class="cx">             'libANGLE/renderer/FramebufferImpl.h',
</span><ins>+            'libANGLE/renderer/ImageImpl.h',
</ins><span class="cx">             'libANGLE/renderer/ImplFactory.h',
</span><del>-            'libANGLE/renderer/IndexRangeCache.cpp',
-            'libANGLE/renderer/IndexRangeCache.h',
-            'libANGLE/renderer/ProgramImpl.cpp',
</del><span class="cx">             'libANGLE/renderer/ProgramImpl.h',
</span><span class="cx">             'libANGLE/renderer/QueryImpl.h',
</span><span class="cx">             'libANGLE/renderer/RenderbufferImpl.h',
</span><del>-            'libANGLE/renderer/RenderbufferImpl.cpp',
</del><span class="cx">             'libANGLE/renderer/Renderer.cpp',
</span><span class="cx">             'libANGLE/renderer/Renderer.h',
</span><ins>+            'libANGLE/renderer/SamplerImpl.h',
</ins><span class="cx">             'libANGLE/renderer/ShaderImpl.h',
</span><ins>+            'libANGLE/renderer/StreamImpl.h',
</ins><span class="cx">             'libANGLE/renderer/SurfaceImpl.cpp',
</span><span class="cx">             'libANGLE/renderer/SurfaceImpl.h',
</span><span class="cx">             'libANGLE/renderer/TextureImpl.h',
</span><span class="cx">             'libANGLE/renderer/TransformFeedbackImpl.h',
</span><span class="cx">             'libANGLE/renderer/VertexArrayImpl.h',
</span><del>-            'libANGLE/renderer/Workarounds.h',
</del><span class="cx">             'libANGLE/validationEGL.cpp',
</span><span class="cx">             'libANGLE/validationEGL.h',
</span><span class="cx">             'libANGLE/validationES.cpp',
</span><span class="lines">@@ -169,6 +185,8 @@
</span><span class="cx">             'libANGLE/renderer/d3d/DisplayD3D.h',
</span><span class="cx">             'libANGLE/renderer/d3d/DynamicHLSL.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/DynamicHLSL.h',
</span><ins>+            'libANGLE/renderer/d3d/EGLImageD3D.cpp',
+            'libANGLE/renderer/d3d/EGLImageD3D.h',
</ins><span class="cx">             'libANGLE/renderer/d3d/formatutilsD3D.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/formatutilsD3D.h',
</span><span class="cx">             'libANGLE/renderer/d3d/FramebufferD3D.cpp',
</span><span class="lines">@@ -188,6 +206,8 @@
</span><span class="cx">             'libANGLE/renderer/d3d/loadimage.h',
</span><span class="cx">             'libANGLE/renderer/d3d/loadimage.inl',
</span><span class="cx">             'libANGLE/renderer/d3d/loadimageSSE2.cpp',
</span><ins>+            'libANGLE/renderer/d3d/loadimage_etc.cpp',
+            'libANGLE/renderer/d3d/loadimage_etc.h',
</ins><span class="cx">             'libANGLE/renderer/d3d/ProgramD3D.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/ProgramD3D.h',
</span><span class="cx">             'libANGLE/renderer/d3d/RenderbufferD3D.cpp',
</span><span class="lines">@@ -196,6 +216,7 @@
</span><span class="cx">             'libANGLE/renderer/d3d/RendererD3D.h',
</span><span class="cx">             'libANGLE/renderer/d3d/RenderTargetD3D.h',
</span><span class="cx">             'libANGLE/renderer/d3d/RenderTargetD3D.cpp',
</span><ins>+            'libANGLE/renderer/d3d/SamplerD3D.h',
</ins><span class="cx">             'libANGLE/renderer/d3d/ShaderD3D.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/ShaderD3D.h',
</span><span class="cx">             'libANGLE/renderer/d3d/ShaderExecutableD3D.cpp',
</span><span class="lines">@@ -205,14 +226,16 @@
</span><span class="cx">             'libANGLE/renderer/d3d/SwapChainD3D.h',
</span><span class="cx">             'libANGLE/renderer/d3d/TextureD3D.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/TextureD3D.h',
</span><del>-            'libANGLE/renderer/d3d/TextureStorage.cpp',
</del><span class="cx">             'libANGLE/renderer/d3d/TextureStorage.h',
</span><span class="cx">             'libANGLE/renderer/d3d/TransformFeedbackD3D.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/TransformFeedbackD3D.h',
</span><ins>+            'libANGLE/renderer/d3d/VaryingPacking.cpp',
+            'libANGLE/renderer/d3d/VaryingPacking.h',
</ins><span class="cx">             'libANGLE/renderer/d3d/VertexBuffer.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/VertexBuffer.h',
</span><span class="cx">             'libANGLE/renderer/d3d/VertexDataManager.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/VertexDataManager.h',
</span><ins>+            'libANGLE/renderer/d3d/WorkaroundsD3D.h',
</ins><span class="cx">         ],
</span><span class="cx">         'libangle_d3d9_sources':
</span><span class="cx">         [
</span><span class="lines">@@ -248,6 +271,8 @@
</span><span class="cx">             'libANGLE/renderer/d3d/d3d9/shaders/compiled/luminanceps.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d9/shaders/compiled/passthroughps.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d9/shaders/compiled/standardvs.h',
</span><ins>+            'libANGLE/renderer/d3d/d3d9/StateManager9.cpp',
+            'libANGLE/renderer/d3d/d3d9/StateManager9.h',
</ins><span class="cx">             'libANGLE/renderer/d3d/d3d9/SwapChain9.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d9/SwapChain9.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d9/TextureStorage9.cpp',
</span><span class="lines">@@ -271,6 +296,8 @@
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/copyvertex.inl',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h',
</span><ins>+            'libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp',
+            'libANGLE/renderer/d3d/d3d11/dxgi_support_table.h',
</ins><span class="cx">             'libANGLE/renderer/d3d/d3d11/Fence11.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/Fence11.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/formatutils11.cpp',
</span><span class="lines">@@ -283,6 +310,8 @@
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/IndexBuffer11.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/InputLayoutCache.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/InputLayoutCache.h',
</span><ins>+            'libANGLE/renderer/d3d/d3d11/load_functions_table.h',
+            'libANGLE/renderer/d3d/d3d11/load_functions_table_autogen.cpp',
</ins><span class="cx">             'libANGLE/renderer/d3d/d3d11/NativeWindow.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/PixelTransfer11.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/PixelTransfer11.h',
</span><span class="lines">@@ -350,12 +379,20 @@
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2darrayps.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui2dps.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/shaders/compiled/swizzleui3dps.h',
</span><ins>+            'libANGLE/renderer/d3d/d3d11/StateManager11.cpp',
+            'libANGLE/renderer/d3d/d3d11/StateManager11.h',
+            'libANGLE/renderer/d3d/d3d11/Stream11.cpp',
+            'libANGLE/renderer/d3d/d3d11/Stream11.h',
</ins><span class="cx">             'libANGLE/renderer/d3d/d3d11/SwapChain11.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/SwapChain11.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/TextureStorage11.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/Trim11.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/Trim11.h',
</span><ins>+            'libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp',
+            'libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.h',
+            'libANGLE/renderer/d3d/d3d11/texture_format_table.h',
+            'libANGLE/renderer/d3d/d3d11/VertexArray11.cpp',
</ins><span class="cx">             'libANGLE/renderer/d3d/d3d11/VertexArray11.h',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/VertexBuffer11.cpp',
</span><span class="cx">             'libANGLE/renderer/d3d/d3d11/VertexBuffer11.h',
</span><span class="lines">@@ -377,6 +414,8 @@
</span><span class="cx">         ],
</span><span class="cx">         'libangle_gl_sources':
</span><span class="cx">         [
</span><ins>+            'libANGLE/renderer/gl/BlitGL.cpp',
+            'libANGLE/renderer/gl/BlitGL.h',
</ins><span class="cx">             'libANGLE/renderer/gl/BufferGL.cpp',
</span><span class="cx">             'libANGLE/renderer/gl/BufferGL.h',
</span><span class="cx">             'libANGLE/renderer/gl/CompilerGL.cpp',
</span><span class="lines">@@ -399,6 +438,8 @@
</span><span class="cx">             'libANGLE/renderer/gl/RenderbufferGL.h',
</span><span class="cx">             'libANGLE/renderer/gl/RendererGL.cpp',
</span><span class="cx">             'libANGLE/renderer/gl/RendererGL.h',
</span><ins>+            'libANGLE/renderer/gl/SamplerGL.cpp',
+            'libANGLE/renderer/gl/SamplerGL.h',
</ins><span class="cx">             'libANGLE/renderer/gl/ShaderGL.cpp',
</span><span class="cx">             'libANGLE/renderer/gl/ShaderGL.h',
</span><span class="cx">             'libANGLE/renderer/gl/StateManagerGL.cpp',
</span><span class="lines">@@ -411,6 +452,7 @@
</span><span class="cx">             'libANGLE/renderer/gl/TransformFeedbackGL.h',
</span><span class="cx">             'libANGLE/renderer/gl/VertexArrayGL.cpp',
</span><span class="cx">             'libANGLE/renderer/gl/VertexArrayGL.h',
</span><ins>+            'libANGLE/renderer/gl/WorkaroundsGL.h',
</ins><span class="cx">             'libANGLE/renderer/gl/formatutilsgl.cpp',
</span><span class="cx">             'libANGLE/renderer/gl/formatutilsgl.h',
</span><span class="cx">             'libANGLE/renderer/gl/functionsgl_enums.h',
</span><span class="lines">@@ -422,6 +464,8 @@
</span><span class="cx">         [
</span><span class="cx">             'libANGLE/renderer/gl/wgl/DisplayWGL.cpp',
</span><span class="cx">             'libANGLE/renderer/gl/wgl/DisplayWGL.h',
</span><ins>+            'libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp',
+            'libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h',
</ins><span class="cx">             'libANGLE/renderer/gl/wgl/FunctionsWGL.cpp',
</span><span class="cx">             'libANGLE/renderer/gl/wgl/FunctionsWGL.h',
</span><span class="cx">             'libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp',
</span><span class="lines">@@ -433,6 +477,29 @@
</span><span class="cx">             'libANGLE/renderer/gl/wgl/wgl_utils.h',
</span><span class="cx">             'third_party/khronos/GL/wglext.h',
</span><span class="cx">         ],
</span><ins>+        'libangle_gl_glx_sources':
+        [
+            'libANGLE/renderer/gl/glx/DisplayGLX.cpp',
+            'libANGLE/renderer/gl/glx/DisplayGLX.h',
+            'libANGLE/renderer/gl/glx/FunctionsGLX.cpp',
+            'libANGLE/renderer/gl/glx/FunctionsGLX.h',
+            'libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp',
+            'libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h',
+            'libANGLE/renderer/gl/glx/SurfaceGLX.h',
+            'libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp',
+            'libANGLE/renderer/gl/glx/WindowSurfaceGLX.h',
+            'libANGLE/renderer/gl/glx/functionsglx_typedefs.h',
+            'libANGLE/renderer/gl/glx/platform_glx.h',
+        ],
+        'libangle_gl_cgl_sources':
+        [
+            'libANGLE/renderer/gl/cgl/DisplayCGL.mm',
+            'libANGLE/renderer/gl/cgl/DisplayCGL.h',
+            'libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm',
+            'libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h',
+            'libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm',
+            'libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h',
+        ],
</ins><span class="cx">         'libglesv2_sources':
</span><span class="cx">         [
</span><span class="cx">             'common/angleutils.h',
</span><span class="lines">@@ -447,8 +514,6 @@
</span><span class="cx">             'libGLESv2/entry_points_gles_2_0_ext.h',
</span><span class="cx">             'libGLESv2/entry_points_gles_3_0.cpp',
</span><span class="cx">             'libGLESv2/entry_points_gles_3_0.h',
</span><del>-            'libGLESv2/entry_points_gles_3_0_ext.cpp',
-            'libGLESv2/entry_points_gles_3_0_ext.h',
</del><span class="cx">             'libGLESv2/global_state.cpp',
</span><span class="cx">             'libGLESv2/global_state.h',
</span><span class="cx">             'libGLESv2/libGLESv2.cpp',
</span><span class="lines">@@ -491,10 +556,6 @@
</span><span class="cx">             ],
</span><span class="cx">             'defines':
</span><span class="cx">             [
</span><del>-                'GL_APICALL=',
-                'GL_GLEXT_PROTOTYPES=',
-                'EGLAPI=',
-                'ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ &quot;d3dcompiler_47.dll&quot;, &quot;d3dcompiler_46.dll&quot;, &quot;d3dcompiler_43.dll&quot; }',
</del><span class="cx">                 'LIBANGLE_IMPLEMENTATION',
</span><span class="cx">             ],
</span><span class="cx">             'direct_dependent_settings':
</span><span class="lines">@@ -506,13 +567,31 @@
</span><span class="cx">                 ],
</span><span class="cx">                 'defines':
</span><span class="cx">                 [
</span><del>-                    'GL_APICALL=',
-                    'GL_GLEXT_PROTOTYPES=',
-                    'EGLAPI=',
</del><ins>+                    'GL_GLEXT_PROTOTYPES',
</ins><span class="cx">                     'ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ &quot;d3dcompiler_47.dll&quot;, &quot;d3dcompiler_46.dll&quot;, &quot;d3dcompiler_43.dll&quot; }',
</span><span class="cx">                 ],
</span><span class="cx">                 'conditions':
</span><span class="cx">                 [
</span><ins>+                    ['OS==&quot;win&quot;', {
+                        'defines':
+                        [
+                            'GL_APICALL=',
+                            'EGLAPI=',
+                        ],
+                    }, {
+                        'defines':
+                        [
+                            'GL_APICALL=__attribute__((visibility(&quot;default&quot;)))',
+                            'EGLAPI=__attribute__((visibility(&quot;default&quot;)))',
+                        ],
+                    }],
+                    ['OS == &quot;mac&quot;',
+                    {
+                        'xcode_settings':
+                        {
+                            'DYLIB_INSTALL_NAME_BASE': '@rpath',
+                        },
+                    }],
</ins><span class="cx">                     ['angle_enable_d3d9==1',
</span><span class="cx">                     {
</span><span class="cx">                         'defines':
</span><span class="lines">@@ -533,6 +612,16 @@
</span><span class="cx">                         [
</span><span class="cx">                             'ANGLE_ENABLE_OPENGL',
</span><span class="cx">                         ],
</span><ins>+                        'conditions':
+                        [
+                            ['angle_use_glx==1',
+                            {
+                                'defines':
+                                [
+                                    'ANGLE_USE_X11',
+                                ],
+                            }],
+                        ],
</ins><span class="cx">                     }],
</span><span class="cx">                 ],
</span><span class="cx">             },
</span><span class="lines">@@ -643,6 +732,66 @@
</span><span class="cx">                                 '&lt;@(libangle_gl_wgl_sources)',
</span><span class="cx">                             ],
</span><span class="cx">                         }],
</span><ins>+                        ['angle_use_glx==1',
+                        {
+                            'defines':
+                            [
+                                'ANGLE_USE_X11',
+                            ],
+                            'dependencies':
+                            [
+                                '&lt;(angle_path)/src/third_party/libXNVCtrl/libXNVCtrl.gyp:libXNVCtrl',
+                            ],
+                            'sources':
+                            [
+                                '&lt;@(libangle_gl_glx_sources)',
+                            ],
+                            'link_settings': {
+                                'ldflags': [
+                                    '&lt;!@(&lt;(pkg-config) --libs-only-L --libs-only-other x11 xi xext)',
+                                ],
+                                'libraries': [
+                                    '&lt;!@(&lt;(pkg-config) --libs-only-l x11 xi xext) -ldl',
+                                ],
+                            },
+                        }],
+                        ['angle_link_glx==1',
+                        {
+                            'link_settings':
+                            {
+                                'libraries':
+                                [
+                                    '-lGL',
+                                ],
+                            },
+                            'defines':
+                            [
+                                'ANGLE_LINK_GLX',
+                            ],
+                        }],
+                        ['OS==&quot;mac&quot;',
+                        {
+                            'sources':
+                            [
+                                '&lt;@(libangle_gl_cgl_sources)',
+                            ],
+                            'link_settings':
+                            {
+                                'libraries':
+                                [
+                                    '$(SDKROOT)/System/Library/Frameworks/OpenGL.framework',
+                                    '$(SDKROOT)/System/Library/Frameworks/IOSurface.framework',
+                                    '$(SDKROOT)/System/Library/Frameworks/Cocoa.framework',
+                                    '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework',
+                                ],
+                            },
+                            'all_dependent_settings':
+                            {
+                                'xcode_settings': {
+                                    'LD_RUNPATH_SEARCH_PATHS': ['@executable_path/.'],
+                                },
+                            }
+                        }],
</ins><span class="cx">                     ],
</span><span class="cx">                 }],
</span><span class="cx">                 ['angle_build_winrt==0 and OS==&quot;win&quot;',
</span><span class="lines">@@ -654,45 +803,14 @@
</span><span class="cx">                 }],
</span><span class="cx">                 ['angle_build_winrt==1',
</span><span class="cx">                 {
</span><del>-                    'defines':
-                    [
-                        'NTDDI_VERSION=NTDDI_WINBLUE',
-                    ],
-                    'msvs_enable_winrt' : '1',
</del><span class="cx">                     'msvs_requires_importlibrary' : 'true',
</span><del>-                    'msvs_settings':
-                    {
-                        'VCLinkerTool':
-                        {
-                            'EnableCOMDATFolding': '1',
-                            'OptimizeReferences': '1',
-                        }
-                    },
</del><span class="cx">                 }],
</span><del>-                ['angle_build_winphone==1',
-                {
-                    'msvs_enable_winphone' : '1',
-                }],
-                ['OS==&quot;win&quot;',
-                {
-                    'configurations':
-                    {
-                        'Debug_Base':
-                        {
-                            'defines':
-                            [
-                                'ANGLE_ENABLE_DEBUG_ANNOTATIONS',
-                                'ANGLE_GENERATE_SHADER_DEBUG_INFO'
-                            ],
-                        },
-                    },
-                }],
</del><span class="cx">             ],
</span><span class="cx">         },
</span><span class="cx">         {
</span><span class="cx">             'target_name': 'libGLESv2',
</span><del>-            'type': 'shared_library',
-            'dependencies': [ 'libANGLE' ],
</del><ins>+            'type': '&lt;(angle_gl_library_type)',
+            'dependencies': [ 'libANGLE', 'angle_common' ],
</ins><span class="cx">             'includes': [ '../build/common_defines.gypi', ],
</span><span class="cx">             'sources':
</span><span class="cx">             [
</span><span class="lines">@@ -700,25 +818,13 @@
</span><span class="cx">             ],
</span><span class="cx">             'defines':
</span><span class="cx">             [
</span><del>-                'GL_APICALL=',
-                'GL_GLEXT_PROTOTYPES=',
-                'EGLAPI=',
</del><span class="cx">                 'LIBGLESV2_IMPLEMENTATION',
</span><span class="cx">             ],
</span><span class="cx">             'conditions':
</span><span class="cx">             [
</span><span class="cx">                 ['angle_build_winrt==1',
</span><span class="cx">                 {
</span><del>-                    'msvs_enable_winrt' : '1',
</del><span class="cx">                     'msvs_requires_importlibrary' : 'true',
</span><del>-                    'msvs_settings':
-                    {
-                        'VCLinkerTool':
-                        {
-                            'EnableCOMDATFolding': '1',
-                            'OptimizeReferences': '1',
-                        }
-                    },
</del><span class="cx">                 }],
</span><span class="cx">                 ['angle_build_winphone==1',
</span><span class="cx">                 {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrcthird_partycompilerArrayBoundsClampercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/third_party/compiler/ArrayBoundsClamper.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/third_party/compiler/ArrayBoundsClamper.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/third_party/compiler/ArrayBoundsClamper.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -43,11 +43,12 @@
</span><span class="cx"> class ArrayBoundsClamperMarker : public TIntermTraverser {
</span><span class="cx"> public:
</span><span class="cx">     ArrayBoundsClamperMarker()
</span><del>-        : mNeedsClamp(false)
</del><ins>+        : TIntermTraverser(true, false, false),
+          mNeedsClamp(false)
</ins><span class="cx">    {
</span><span class="cx">    }
</span><span class="cx"> 
</span><del>-   virtual bool visitBinary(Visit visit, TIntermBinary* node)
</del><ins>+    bool visitBinary(Visit visit, TIntermBinary *node) override
</ins><span class="cx">    {
</span><span class="cx">        if (node-&gt;getOp() == EOpIndexIndirect)
</span><span class="cx">        {
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrcthird_partymurmurhashMurmurHash3cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/third_party/murmurhash/MurmurHash3.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/third_party/murmurhash/MurmurHash3.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/third_party/murmurhash/MurmurHash3.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -16,22 +16,20 @@
</span><span class="cx"> 
</span><span class="cx"> #if defined(_MSC_VER)
</span><span class="cx"> 
</span><del>-#define FORCE_INLINE        __forceinline
</del><ins>+#define FORCE_INLINE __forceinline
</ins><span class="cx"> 
</span><span class="cx"> #include &lt;stdlib.h&gt;
</span><span class="cx"> 
</span><del>-#define ROTL32(x,y)        _rotl(x,y)
-#define ROTL64(x,y)        _rotl64(x,y)
</del><ins>+#define ROTL32(x,y) _rotl(x,y)
+#define ROTL64(x,y) _rotl64(x,y)
</ins><span class="cx"> 
</span><span class="cx"> #define BIG_CONSTANT(x) (x)
</span><span class="cx"> 
</span><span class="cx"> // Other compilers
</span><span class="cx"> 
</span><del>-#else        // defined(_MSC_VER)
</del><ins>+#else // defined(_MSC_VER)
</ins><span class="cx"> 
</span><del>-// Ignore GCC force inline warnings
-#pragma GCC diagnostic ignored &quot;-Wattributes&quot;
-#define        FORCE_INLINE __attribute__((always_inline))
</del><ins>+#define FORCE_INLINE inline __attribute__((always_inline))
</ins><span class="cx"> 
</span><span class="cx"> inline uint32_t rotl32 ( uint32_t x, int8_t r )
</span><span class="cx"> {
</span><span class="lines">@@ -43,8 +41,8 @@
</span><span class="cx">   return (x &lt;&lt; r) | (x &gt;&gt; (64 - r));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#define        ROTL32(x,y)        rotl32(x,y)
-#define ROTL64(x,y)        rotl64(x,y)
</del><ins>+#define ROTL32(x,y) rotl32(x,y)
+#define ROTL64(x,y) rotl64(x,y)
</ins><span class="cx"> 
</span><span class="cx"> #define BIG_CONSTANT(x) (x##LLU)
</span><span class="cx"> 
</span><span class="lines">@@ -54,12 +52,12 @@
</span><span class="cx"> // Block read - if your platform needs to do endian-swapping or can only
</span><span class="cx"> // handle aligned reads, do the conversion here
</span><span class="cx"> 
</span><del>-FORCE_INLINE uint32_t getblock ( const uint32_t * p, int i )
</del><ins>+FORCE_INLINE uint32_t getblock32 ( const uint32_t * p, int i )
</ins><span class="cx"> {
</span><span class="cx">   return p[i];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FORCE_INLINE uint64_t getblock ( const uint64_t * p, int i )
</del><ins>+FORCE_INLINE uint64_t getblock64 ( const uint64_t * p, int i )
</ins><span class="cx"> {
</span><span class="cx">   return p[i];
</span><span class="cx"> }
</span><span class="lines">@@ -67,7 +65,7 @@
</span><span class="cx"> //-----------------------------------------------------------------------------
</span><span class="cx"> // Finalization mix - force all bits of a hash block to avalanche
</span><span class="cx"> 
</span><del>-FORCE_INLINE uint32_t fmix ( uint32_t h )
</del><ins>+FORCE_INLINE uint32_t fmix32 ( uint32_t h )
</ins><span class="cx"> {
</span><span class="cx">   h ^= h &gt;&gt; 16;
</span><span class="cx">   h *= 0x85ebca6b;
</span><span class="lines">@@ -80,7 +78,7 @@
</span><span class="cx"> 
</span><span class="cx"> //----------
</span><span class="cx"> 
</span><del>-FORCE_INLINE uint64_t fmix ( uint64_t k )
</del><ins>+FORCE_INLINE uint64_t fmix64 ( uint64_t k )
</ins><span class="cx"> {
</span><span class="cx">   k ^= k &gt;&gt; 33;
</span><span class="cx">   k *= BIG_CONSTANT(0xff51afd7ed558ccd);
</span><span class="lines">@@ -111,7 +109,7 @@
</span><span class="cx"> 
</span><span class="cx">   for(int i = -nblocks; i; i++)
</span><span class="cx">   {
</span><del>-    uint32_t k1 = getblock(blocks,i);
</del><ins>+    uint32_t k1 = getblock32(blocks,i);
</ins><span class="cx"> 
</span><span class="cx">     k1 *= c1;
</span><span class="cx">     k1 = ROTL32(k1,15);
</span><span class="lines">@@ -142,7 +140,7 @@
</span><span class="cx"> 
</span><span class="cx">   h1 ^= len;
</span><span class="cx"> 
</span><del>-  h1 = fmix(h1);
</del><ins>+  h1 = fmix32(h1);
</ins><span class="cx"> 
</span><span class="cx">   *(uint32_t*)out = h1;
</span><span class="cx"> } 
</span><span class="lines">@@ -172,10 +170,10 @@
</span><span class="cx"> 
</span><span class="cx">   for(int i = -nblocks; i; i++)
</span><span class="cx">   {
</span><del>-    uint32_t k1 = getblock(blocks,i*4+0);
-    uint32_t k2 = getblock(blocks,i*4+1);
-    uint32_t k3 = getblock(blocks,i*4+2);
-    uint32_t k4 = getblock(blocks,i*4+3);
</del><ins>+    uint32_t k1 = getblock32(blocks,i*4+0);
+    uint32_t k2 = getblock32(blocks,i*4+1);
+    uint32_t k3 = getblock32(blocks,i*4+2);
+    uint32_t k4 = getblock32(blocks,i*4+3);
</ins><span class="cx"> 
</span><span class="cx">     k1 *= c1; k1  = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
</span><span class="cx"> 
</span><span class="lines">@@ -238,10 +236,10 @@
</span><span class="cx">   h1 += h2; h1 += h3; h1 += h4;
</span><span class="cx">   h2 += h1; h3 += h1; h4 += h1;
</span><span class="cx"> 
</span><del>-  h1 = fmix(h1);
-  h2 = fmix(h2);
-  h3 = fmix(h3);
-  h4 = fmix(h4);
</del><ins>+  h1 = fmix32(h1);
+  h2 = fmix32(h2);
+  h3 = fmix32(h3);
+  h4 = fmix32(h4);
</ins><span class="cx"> 
</span><span class="cx">   h1 += h2; h1 += h3; h1 += h4;
</span><span class="cx">   h2 += h1; h3 += h1; h4 += h1;
</span><span class="lines">@@ -273,8 +271,8 @@
</span><span class="cx"> 
</span><span class="cx">   for(int i = 0; i &lt; nblocks; i++)
</span><span class="cx">   {
</span><del>-    uint64_t k1 = getblock(blocks,i*2+0);
-    uint64_t k2 = getblock(blocks,i*2+1);
</del><ins>+    uint64_t k1 = getblock64(blocks,i*2+0);
+    uint64_t k2 = getblock64(blocks,i*2+1);
</ins><span class="cx"> 
</span><span class="cx">     k1 *= c1; k1  = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
</span><span class="cx"> 
</span><span class="lines">@@ -295,23 +293,23 @@
</span><span class="cx"> 
</span><span class="cx">   switch(len &amp; 15)
</span><span class="cx">   {
</span><del>-  case 15: k2 ^= uint64_t(tail[14]) &lt;&lt; 48;
-  case 14: k2 ^= uint64_t(tail[13]) &lt;&lt; 40;
-  case 13: k2 ^= uint64_t(tail[12]) &lt;&lt; 32;
-  case 12: k2 ^= uint64_t(tail[11]) &lt;&lt; 24;
-  case 11: k2 ^= uint64_t(tail[10]) &lt;&lt; 16;
-  case 10: k2 ^= uint64_t(tail[ 9]) &lt;&lt; 8;
-  case  9: k2 ^= uint64_t(tail[ 8]) &lt;&lt; 0;
</del><ins>+  case 15: k2 ^= ((uint64_t)tail[14]) &lt;&lt; 48;
+  case 14: k2 ^= ((uint64_t)tail[13]) &lt;&lt; 40;
+  case 13: k2 ^= ((uint64_t)tail[12]) &lt;&lt; 32;
+  case 12: k2 ^= ((uint64_t)tail[11]) &lt;&lt; 24;
+  case 11: k2 ^= ((uint64_t)tail[10]) &lt;&lt; 16;
+  case 10: k2 ^= ((uint64_t)tail[ 9]) &lt;&lt; 8;
+  case  9: k2 ^= ((uint64_t)tail[ 8]) &lt;&lt; 0;
</ins><span class="cx">            k2 *= c2; k2  = ROTL64(k2,33); k2 *= c1; h2 ^= k2;
</span><span class="cx"> 
</span><del>-  case  8: k1 ^= uint64_t(tail[ 7]) &lt;&lt; 56;
-  case  7: k1 ^= uint64_t(tail[ 6]) &lt;&lt; 48;
-  case  6: k1 ^= uint64_t(tail[ 5]) &lt;&lt; 40;
-  case  5: k1 ^= uint64_t(tail[ 4]) &lt;&lt; 32;
-  case  4: k1 ^= uint64_t(tail[ 3]) &lt;&lt; 24;
-  case  3: k1 ^= uint64_t(tail[ 2]) &lt;&lt; 16;
-  case  2: k1 ^= uint64_t(tail[ 1]) &lt;&lt; 8;
-  case  1: k1 ^= uint64_t(tail[ 0]) &lt;&lt; 0;
</del><ins>+  case  8: k1 ^= ((uint64_t)tail[ 7]) &lt;&lt; 56;
+  case  7: k1 ^= ((uint64_t)tail[ 6]) &lt;&lt; 48;
+  case  6: k1 ^= ((uint64_t)tail[ 5]) &lt;&lt; 40;
+  case  5: k1 ^= ((uint64_t)tail[ 4]) &lt;&lt; 32;
+  case  4: k1 ^= ((uint64_t)tail[ 3]) &lt;&lt; 24;
+  case  3: k1 ^= ((uint64_t)tail[ 2]) &lt;&lt; 16;
+  case  2: k1 ^= ((uint64_t)tail[ 1]) &lt;&lt; 8;
+  case  1: k1 ^= ((uint64_t)tail[ 0]) &lt;&lt; 0;
</ins><span class="cx">            k1 *= c1; k1  = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
</span><span class="cx">   };
</span><span class="cx"> 
</span><span class="lines">@@ -323,8 +321,8 @@
</span><span class="cx">   h1 += h2;
</span><span class="cx">   h2 += h1;
</span><span class="cx"> 
</span><del>-  h1 = fmix(h1);
-  h2 = fmix(h2);
</del><ins>+  h1 = fmix64(h1);
+  h2 = fmix64(h2);
</ins><span class="cx"> 
</span><span class="cx">   h1 += h2;
</span><span class="cx">   h2 += h1;
</span><span class="lines">@@ -334,3 +332,4 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> //-----------------------------------------------------------------------------
</span><ins>+
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEsrcthird_partymurmurhashMurmurHash3h"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/src/third_party/murmurhash/MurmurHash3.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/src/third_party/murmurhash/MurmurHash3.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/src/third_party/murmurhash/MurmurHash3.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -8,8 +8,22 @@
</span><span class="cx"> //-----------------------------------------------------------------------------
</span><span class="cx"> // Platform-specific functions and macros
</span><span class="cx"> 
</span><ins>+// Microsoft Visual Studio
+
+#if defined(_MSC_VER) &amp;&amp; (_MSC_VER &lt; 1600)
+
+typedef unsigned char uint8_t;
+typedef unsigned int uint32_t;
+typedef unsigned __int64 uint64_t;
+
+// Other compilers
+
+#else // defined(_MSC_VER)
+
</ins><span class="cx"> #include &lt;stdint.h&gt;
</span><span class="cx"> 
</span><ins>+#endif // !defined(_MSC_VER)
+
</ins><span class="cx"> //-----------------------------------------------------------------------------
</span><span class="cx"> 
</span><span class="cx"> void MurmurHash3_x86_32  ( const void * key, int len, uint32_t seed, void * out );
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilEGLWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/util/EGLWindow.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/EGLWindow.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/util/EGLWindow.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -10,19 +10,14 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;EGLWindow.h&quot;
</span><span class="cx"> #include &quot;OSWindow.h&quot;
</span><ins>+#include &quot;common/debug.h&quot;
</ins><span class="cx"> 
</span><del>-#ifdef _WIN32
-#include &quot;win32/Win32Timer.h&quot;
-#include &quot;win32/Win32Window.h&quot;
-#else
-#error unsupported OS.
-#endif
-
</del><span class="cx"> EGLPlatformParameters::EGLPlatformParameters()
</span><span class="cx">     : renderer(EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE),
</span><span class="cx">       majorVersion(EGL_DONT_CARE),
</span><span class="cx">       minorVersion(EGL_DONT_CARE),
</span><del>-      deviceType(EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE)
</del><ins>+      deviceType(EGL_DONT_CARE),
+      presentPath(EGL_DONT_CARE)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -30,27 +25,82 @@
</span><span class="cx">     : renderer(renderer),
</span><span class="cx">       majorVersion(EGL_DONT_CARE),
</span><span class="cx">       minorVersion(EGL_DONT_CARE),
</span><del>-      deviceType(EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE)
</del><ins>+      deviceType(EGL_DONT_CARE),
+      presentPath(EGL_DONT_CARE)
</ins><span class="cx"> {
</span><ins>+    if (renderer == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE ||
+        renderer == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
+    {
+        deviceType = EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-EGLPlatformParameters::EGLPlatformParameters(EGLint renderer, EGLint majorVersion, EGLint minorVersion, EGLint useWarp)
</del><ins>+EGLPlatformParameters::EGLPlatformParameters(EGLint renderer,
+                                             EGLint majorVersion,
+                                             EGLint minorVersion,
+                                             EGLint useWarp)
</ins><span class="cx">     : renderer(renderer),
</span><span class="cx">       majorVersion(majorVersion),
</span><span class="cx">       minorVersion(minorVersion),
</span><del>-      deviceType(useWarp)
</del><ins>+      deviceType(useWarp),
+      presentPath(EGL_DONT_CARE)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+EGLPlatformParameters::EGLPlatformParameters(EGLint renderer,
+                                             EGLint majorVersion,
+                                             EGLint minorVersion,
+                                             EGLint useWarp,
+                                             EGLint presentPath)
+    : renderer(renderer),
+      majorVersion(majorVersion),
+      minorVersion(minorVersion),
+      deviceType(useWarp),
+      presentPath(presentPath)
+{
+}
</ins><span class="cx"> 
</span><del>-EGLWindow::EGLWindow(size_t width, size_t height, EGLint glesMajorVersion, const EGLPlatformParameters &amp;platform)
-    : mSurface(EGL_NO_SURFACE),
</del><ins>+bool operator&lt;(const EGLPlatformParameters &amp;a, const EGLPlatformParameters &amp;b)
+{
+    if (a.renderer != b.renderer)
+    {
+        return a.renderer &lt; b.renderer;
+    }
+
+    if (a.majorVersion != b.majorVersion)
+    {
+        return a.majorVersion &lt; b.majorVersion;
+    }
+
+    if (a.minorVersion != b.minorVersion)
+    {
+        return a.minorVersion &lt; b.minorVersion;
+    }
+
+    if (a.deviceType != b.deviceType)
+    {
+        return a.deviceType &lt; b.deviceType;
+    }
+
+    return a.presentPath &lt; b.presentPath;
+}
+
+bool operator==(const EGLPlatformParameters &amp;a, const EGLPlatformParameters &amp;b)
+{
+    return (a.renderer == b.renderer) &amp;&amp; (a.majorVersion == b.majorVersion) &amp;&amp;
+           (a.minorVersion == b.minorVersion) &amp;&amp; (a.deviceType == b.deviceType) &amp;&amp;
+           (a.presentPath == b.presentPath);
+}
+
+EGLWindow::EGLWindow(EGLint glesMajorVersion,
+                     EGLint glesMinorVersion,
+                     const EGLPlatformParameters &amp;platform)
+    : mDisplay(EGL_NO_DISPLAY),
+      mSurface(EGL_NO_SURFACE),
</ins><span class="cx">       mContext(EGL_NO_CONTEXT),
</span><del>-      mDisplay(EGL_NO_DISPLAY),
-      mClientVersion(glesMajorVersion),
</del><ins>+      mClientMajorVersion(glesMajorVersion),
+      mClientMinorVersion(glesMinorVersion),
</ins><span class="cx">       mPlatform(platform),
</span><del>-      mWidth(width),
-      mHeight(height),
</del><span class="cx">       mRedBits(-1),
</span><span class="cx">       mGreenBits(-1),
</span><span class="cx">       mBlueBits(-1),
</span><span class="lines">@@ -58,6 +108,8 @@
</span><span class="cx">       mDepthBits(-1),
</span><span class="cx">       mStencilBits(-1),
</span><span class="cx">       mMultisample(false),
</span><ins>+      mDebug(false),
+      mNoError(false),
</ins><span class="cx">       mSwapInterval(-1)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -100,16 +152,38 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const EGLint displayAttributes[] =
</del><ins>+    std::vector&lt;EGLint&gt; displayAttributes;
+    displayAttributes.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE);
+    displayAttributes.push_back(mPlatform.renderer);
+    displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE);
+    displayAttributes.push_back(mPlatform.majorVersion);
+    displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE);
+    displayAttributes.push_back(mPlatform.minorVersion);
+
+    if (mPlatform.deviceType != EGL_DONT_CARE)
</ins><span class="cx">     {
</span><del>-        EGL_PLATFORM_ANGLE_TYPE_ANGLE,              mPlatform.renderer,
-        EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, mPlatform.majorVersion,
-        EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, mPlatform.minorVersion,
-        EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE,       mPlatform.deviceType,
-        EGL_NONE,
-    };
</del><ins>+        displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+        displayAttributes.push_back(mPlatform.deviceType);
+    }
</ins><span class="cx"> 
</span><del>-    mDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, osWindow-&gt;getNativeDisplay(), displayAttributes);
</del><ins>+    if (mPlatform.presentPath != EGL_DONT_CARE)
+    {
+        const char *extensionString =
+            static_cast&lt;const char *&gt;(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS));
+        if (strstr(extensionString, &quot;EGL_ANGLE_experimental_present_path&quot;) == nullptr)
+        {
+            destroyGL();
+            return false;
+        }
+
+        displayAttributes.push_back(EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE);
+        displayAttributes.push_back(mPlatform.presentPath);
+    }
+    displayAttributes.push_back(EGL_NONE);
+
+    mDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,
+                                        reinterpret_cast&lt;void *&gt;(osWindow-&gt;getNativeDisplay()),
+                                        &amp;displayAttributes[0]);
</ins><span class="cx">     if (mDisplay == EGL_NO_DISPLAY)
</span><span class="cx">     {
</span><span class="cx">         destroyGL();
</span><span class="lines">@@ -117,12 +191,22 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     EGLint majorVersion, minorVersion;
</span><del>-    if (!eglInitialize(mDisplay, &amp;majorVersion, &amp;minorVersion))
</del><ins>+    if (eglInitialize(mDisplay, &amp;majorVersion, &amp;minorVersion) == EGL_FALSE)
</ins><span class="cx">     {
</span><span class="cx">         destroyGL();
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    const char *displayExtensions = eglQueryString(mDisplay, EGL_EXTENSIONS);
+
+    // EGL_KHR_create_context is required to request a non-ES2 context.
+    bool hasKHRCreateContext = strstr(displayExtensions, &quot;EGL_KHR_create_context&quot;) != nullptr;
+    if (majorVersion != 2 &amp;&amp; minorVersion != 0 &amp;&amp; !hasKHRCreateContext)
+    {
+        destroyGL();
+        return false;
+    }
+
</ins><span class="cx">     eglBindAPI(EGL_OPENGL_ES_API);
</span><span class="cx">     if (eglGetError() != EGL_SUCCESS)
</span><span class="cx">     {
</span><span class="lines">@@ -152,40 +236,49 @@
</span><span class="cx">     eglGetConfigAttrib(mDisplay, mConfig, EGL_RED_SIZE, &amp;mRedBits);
</span><span class="cx">     eglGetConfigAttrib(mDisplay, mConfig, EGL_GREEN_SIZE, &amp;mGreenBits);
</span><span class="cx">     eglGetConfigAttrib(mDisplay, mConfig, EGL_BLUE_SIZE, &amp;mBlueBits);
</span><del>-    eglGetConfigAttrib(mDisplay, mConfig, EGL_ALPHA_SIZE, &amp;mBlueBits);
</del><ins>+    eglGetConfigAttrib(mDisplay, mConfig, EGL_ALPHA_SIZE, &amp;mAlphaBits);
</ins><span class="cx">     eglGetConfigAttrib(mDisplay, mConfig, EGL_DEPTH_SIZE, &amp;mDepthBits);
</span><span class="cx">     eglGetConfigAttrib(mDisplay, mConfig, EGL_STENCIL_SIZE, &amp;mStencilBits);
</span><span class="cx"> 
</span><span class="cx">     std::vector&lt;EGLint&gt; surfaceAttributes;
</span><del>-    if (strstr(eglQueryString(mDisplay, EGL_EXTENSIONS), &quot;EGL_NV_post_sub_buffer&quot;) != nullptr)
</del><ins>+    if (strstr(displayExtensions, &quot;EGL_NV_post_sub_buffer&quot;) != nullptr)
</ins><span class="cx">     {
</span><span class="cx">         surfaceAttributes.push_back(EGL_POST_SUB_BUFFER_SUPPORTED_NV);
</span><span class="cx">         surfaceAttributes.push_back(EGL_TRUE);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     surfaceAttributes.push_back(EGL_NONE);
</span><del>-    surfaceAttributes.push_back(EGL_NONE);
</del><span class="cx"> 
</span><span class="cx">     mSurface = eglCreateWindowSurface(mDisplay, mConfig, osWindow-&gt;getNativeWindow(), &amp;surfaceAttributes[0]);
</span><del>-    if (mSurface == EGL_NO_SURFACE)
-    {
-        eglGetError(); // Clear error and try again
-        mSurface = eglCreateWindowSurface(mDisplay, mConfig, NULL, NULL);
-    }
-
</del><span class="cx">     if (eglGetError() != EGL_SUCCESS)
</span><span class="cx">     {
</span><span class="cx">         destroyGL();
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><ins>+    ASSERT(mSurface != EGL_NO_SURFACE);
</ins><span class="cx"> 
</span><del>-    EGLint contextAttibutes[] =
</del><ins>+    std::vector&lt;EGLint&gt; contextAttributes;
+    if (hasKHRCreateContext)
</ins><span class="cx">     {
</span><del>-        EGL_CONTEXT_CLIENT_VERSION, mClientVersion,
-        EGL_NONE
-    };
</del><ins>+        contextAttributes.push_back(EGL_CONTEXT_MAJOR_VERSION_KHR);
+        contextAttributes.push_back(mClientMajorVersion);
</ins><span class="cx"> 
</span><del>-    mContext = eglCreateContext(mDisplay, mConfig, NULL, contextAttibutes);
</del><ins>+        contextAttributes.push_back(EGL_CONTEXT_MINOR_VERSION_KHR);
+        contextAttributes.push_back(mClientMinorVersion);
+
+        contextAttributes.push_back(EGL_CONTEXT_OPENGL_DEBUG);
+        contextAttributes.push_back(mDebug ? EGL_TRUE : EGL_FALSE);
+
+        // TODO(jmadill): Check for the extension string.
+        // bool hasKHRCreateContextNoError = strstr(displayExtensions,
+        // &quot;EGL_KHR_create_context_no_error&quot;) != nullptr;
+
+        contextAttributes.push_back(EGL_CONTEXT_OPENGL_NO_ERROR_KHR);
+        contextAttributes.push_back(mNoError ? EGL_TRUE : EGL_FALSE);
+    }
+    contextAttributes.push_back(EGL_NONE);
+
+    mContext = eglCreateContext(mDisplay, mConfig, nullptr, &amp;contextAttributes[0]);
</ins><span class="cx">     if (eglGetError() != EGL_SUCCESS)
</span><span class="cx">     {
</span><span class="cx">         destroyGL();
</span><span class="lines">@@ -237,3 +330,36 @@
</span><span class="cx">            mContext != EGL_NO_CONTEXT &amp;&amp;
</span><span class="cx">            mDisplay != EGL_NO_DISPLAY;
</span><span class="cx"> }
</span><ins>+
+// Find an EGLConfig that is an exact match for the specified attributes. EGL_FALSE is returned if
+// the EGLConfig is found.  This indicates that the EGLConfig is not supported.
+EGLBoolean EGLWindow::FindEGLConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *config)
+{
+    EGLint numConfigs = 0;
+    eglGetConfigs(dpy, nullptr, 0, &amp;numConfigs);
+    std::vector&lt;EGLConfig&gt; allConfigs(numConfigs);
+    eglGetConfigs(dpy, allConfigs.data(), static_cast&lt;EGLint&gt;(allConfigs.size()), &amp;numConfigs);
+
+    for (size_t i = 0; i &lt; allConfigs.size(); i++)
+    {
+        bool matchFound = true;
+        for (const EGLint *curAttrib = attrib_list; curAttrib[0] != EGL_NONE; curAttrib += 2)
+        {
+            EGLint actualValue = EGL_DONT_CARE;
+            eglGetConfigAttrib(dpy, allConfigs[i], curAttrib[0], &amp;actualValue);
+            if (curAttrib[1] != actualValue)
+            {
+                matchFound = false;
+                break;
+            }
+        }
+
+        if (matchFound)
+        {
+            *config = allConfigs[i];
+            return EGL_TRUE;
+        }
+    }
+
+    return EGL_FALSE;
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilEGLWindowh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/util/EGLWindow.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/EGLWindow.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/util/EGLWindow.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,20 +7,17 @@
</span><span class="cx"> #ifndef UTIL_EGLWINDOW_H_
</span><span class="cx"> #define UTIL_EGLWINDOW_H_
</span><span class="cx"> 
</span><del>-#define GL_GLEXT_PROTOTYPES
</del><ins>+#include &lt;list&gt;
+#include &lt;memory&gt;
+#include &lt;stdint.h&gt;
+#include &lt;string&gt;
</ins><span class="cx"> 
</span><del>-#include &lt;GLES3/gl3.h&gt;
-#include &lt;GLES3/gl3ext.h&gt;
</del><span class="cx"> #include &lt;GLES2/gl2.h&gt;
</span><span class="cx"> #include &lt;GLES2/gl2ext.h&gt;
</span><ins>+#include &lt;GLES3/gl3.h&gt;
</ins><span class="cx"> #include &lt;EGL/egl.h&gt;
</span><span class="cx"> #include &lt;EGL/eglext.h&gt;
</span><span class="cx"> 
</span><del>-#include &lt;string&gt;
-#include &lt;list&gt;
-#include &lt;cstdint&gt;
-#include &lt;memory&gt;
-
</del><span class="cx"> #include &quot;common/angleutils.h&quot;
</span><span class="cx"> 
</span><span class="cx"> class OSWindow;
</span><span class="lines">@@ -37,22 +34,30 @@
</span><span class="cx">     EGLint majorVersion;
</span><span class="cx">     EGLint minorVersion;
</span><span class="cx">     EGLint deviceType;
</span><ins>+    EGLint presentPath;
</ins><span class="cx"> 
</span><span class="cx">     EGLPlatformParameters();
</span><span class="cx">     explicit EGLPlatformParameters(EGLint renderer);
</span><span class="cx">     EGLPlatformParameters(EGLint renderer, EGLint majorVersion, EGLint minorVersion, EGLint deviceType);
</span><ins>+    EGLPlatformParameters(EGLint renderer,
+                          EGLint majorVersion,
+                          EGLint minorVersion,
+                          EGLint deviceType,
+                          EGLint presentPath);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+bool operator&lt;(const EGLPlatformParameters &amp;a, const EGLPlatformParameters &amp;b);
+bool operator==(const EGLPlatformParameters &amp;a, const EGLPlatformParameters &amp;b);
+
</ins><span class="cx"> class EGLWindow : angle::NonCopyable
</span><span class="cx"> {
</span><span class="cx">   public:
</span><del>-    EGLWindow(size_t width, size_t height, EGLint glesMajorVersion, const EGLPlatformParameters &amp;platform);
</del><ins>+    EGLWindow(EGLint glesMajorVersion,
+              EGLint glesMinorVersion,
+              const EGLPlatformParameters &amp;platform);
</ins><span class="cx"> 
</span><span class="cx">     ~EGLWindow();
</span><span class="cx"> 
</span><del>-    void setClientVersion(EGLint glesMajorVersion) { mClientVersion = glesMajorVersion; }
-    void setWidth(size_t width) { mWidth = width; }
-    void setHeight(size_t height) { mHeight = height; }
</del><span class="cx">     void setConfigRedBits(int bits) { mRedBits = bits; }
</span><span class="cx">     void setConfigGreenBits(int bits) { mGreenBits = bits; }
</span><span class="cx">     void setConfigBlueBits(int bits) { mBlueBits = bits; }
</span><span class="lines">@@ -60,18 +65,21 @@
</span><span class="cx">     void setConfigDepthBits(int bits) { mDepthBits = bits; }
</span><span class="cx">     void setConfigStencilBits(int bits) { mStencilBits = bits; }
</span><span class="cx">     void setMultisample(bool multisample) { mMultisample = multisample; }
</span><ins>+    void setDebugEnabled(bool debug) { mDebug = debug; }
+    void setNoErrorEnabled(bool noError) { mNoError = noError; }
</ins><span class="cx">     void setSwapInterval(EGLint swapInterval) { mSwapInterval = swapInterval; }
</span><span class="cx"> 
</span><ins>+    static EGLBoolean FindEGLConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *config);
+
</ins><span class="cx">     void swap();
</span><span class="cx"> 
</span><del>-    EGLint getClientVersion() const { return mClientVersion; }
</del><ins>+    EGLint getClientMajorVersion() const { return mClientMajorVersion; }
+    EGLint getClientMinorVersion() const { return mClientMinorVersion; }
</ins><span class="cx">     const EGLPlatformParameters &amp;getPlatform() const { return mPlatform; }
</span><span class="cx">     EGLConfig getConfig() const;
</span><span class="cx">     EGLDisplay getDisplay() const;
</span><span class="cx">     EGLSurface getSurface() const;
</span><span class="cx">     EGLContext getContext() const;
</span><del>-    size_t getWidth() const { return mWidth; }
-    size_t getHeight() const { return mHeight; }
</del><span class="cx">     int getConfigRedBits() const { return mRedBits; }
</span><span class="cx">     int getConfigGreenBits() const { return mGreenBits; }
</span><span class="cx">     int getConfigBlueBits() const { return mBlueBits; }
</span><span class="lines">@@ -79,6 +87,7 @@
</span><span class="cx">     int getConfigDepthBits() const { return mDepthBits; }
</span><span class="cx">     int getConfigStencilBits() const { return mStencilBits; }
</span><span class="cx">     bool isMultisample() const { return mMultisample; }
</span><ins>+    bool isDebugEnabled() const { return mDebug; }
</ins><span class="cx">     EGLint getSwapInterval() const { return mSwapInterval; }
</span><span class="cx"> 
</span><span class="cx">     bool initializeGL(OSWindow *osWindow);
</span><span class="lines">@@ -91,10 +100,9 @@
</span><span class="cx">     EGLSurface mSurface;
</span><span class="cx">     EGLContext mContext;
</span><span class="cx"> 
</span><del>-    EGLint mClientVersion;
</del><ins>+    EGLint mClientMajorVersion;
+    EGLint mClientMinorVersion;
</ins><span class="cx">     EGLPlatformParameters mPlatform;
</span><del>-    size_t mWidth;
-    size_t mHeight;
</del><span class="cx">     int mRedBits;
</span><span class="cx">     int mGreenBits;
</span><span class="cx">     int mBlueBits;
</span><span class="lines">@@ -102,6 +110,8 @@
</span><span class="cx">     int mDepthBits;
</span><span class="cx">     int mStencilBits;
</span><span class="cx">     bool mMultisample;
</span><ins>+    bool mDebug;
+    bool mNoError;
</ins><span class="cx">     EGLint mSwapInterval;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilMatrixcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/util/Matrix.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/Matrix.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/util/Matrix.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,302 @@
</span><ins>+//
+// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Matrix:
+//   Helper class for doing matrix math.
+//
+
+#include &quot;Matrix.h&quot;
+
+#define _USE_MATH_DEFINES
+#include &lt;math.h&gt;
+#include &lt;cstddef&gt;
+
+Matrix4::Matrix4()
+{
+    data[0]  = 1.0f;
+    data[4]  = 0.0f;
+    data[8]  = 0.0f;
+    data[12] = 0.0f;
+    data[1]  = 0.0f;
+    data[5]  = 1.0f;
+    data[9]  = 0.0f;
+    data[13] = 0.0f;
+    data[2]  = 0.0f;
+    data[6]  = 0.0f;
+    data[10] = 1.0f;
+    data[14] = 0.0f;
+    data[3]  = 0.0f;
+    data[7]  = 0.0f;
+    data[11] = 0.0f;
+    data[15] = 1.0f;
+}
+
+Matrix4::Matrix4(float m00,
+                 float m01,
+                 float m02,
+                 float m03,
+                 float m10,
+                 float m11,
+                 float m12,
+                 float m13,
+                 float m20,
+                 float m21,
+                 float m22,
+                 float m23,
+                 float m30,
+                 float m31,
+                 float m32,
+                 float m33)
+{
+    data[0]  = m00;
+    data[4]  = m01;
+    data[8]  = m02;
+    data[12] = m03;
+    data[1]  = m10;
+    data[5]  = m11;
+    data[9]  = m12;
+    data[13] = m13;
+    data[2]  = m20;
+    data[6]  = m21;
+    data[10] = m22;
+    data[14] = m23;
+    data[3]  = m30;
+    data[7]  = m31;
+    data[11] = m32;
+    data[15] = m33;
+}
+
+Matrix4 Matrix4::identity()
+{
+    return Matrix4(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+                   0.0f, 0.0f, 1.0f);
+}
+
+Matrix4 Matrix4::rotate(float angle, const Vector3 &amp;p)
+{
+    Vector3 u   = Vector3::normalize(p);
+    float theta = static_cast&lt;float&gt;(angle * (M_PI / 180.0f));
+    float cos_t = cosf(theta);
+    float sin_t = sinf(theta);
+
+    return Matrix4(
+        cos_t + (u.x * u.x * (1.0f - cos_t)), (u.x * u.y * (1.0f - cos_t)) - (u.z * sin_t),
+        (u.x * u.z * (1.0f - cos_t)) + (u.y * sin_t), 0.0f,
+        (u.y * u.x * (1.0f - cos_t)) + (u.z * sin_t), cos_t + (u.y * u.y * (1.0f - cos_t)),
+        (u.y * u.z * (1.0f - cos_t)) - (u.x * sin_t), 0.0f,
+        (u.z * u.x * (1.0f - cos_t)) - (u.y * sin_t), (u.z * u.y * (1.0f - cos_t)) + (u.x * sin_t),
+        cos_t + (u.z * u.z * (1.0f - cos_t)), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);
+}
+
+Matrix4 Matrix4::translate(const Vector3 &amp;t)
+{
+    return Matrix4(1.0f, 0.0f, 0.0f, t.x, 0.0f, 1.0f, 0.0f, t.y, 0.0f, 0.0f, 1.0f, t.z, 0.0f, 0.0f,
+                   0.0f, 1.0f);
+}
+
+Matrix4 Matrix4::scale(const Vector3 &amp;s)
+{
+    return Matrix4(s.x, 0.0f, 0.0f, 0.0f, 0.0f, s.y, 0.0f, 0.0f, 0.0f, 0.0f, s.z, 0.0f, 0.0f, 0.0f,
+                   0.0f, 1.0f);
+}
+
+Matrix4 Matrix4::frustum(float l, float r, float b, float t, float n, float f)
+{
+    return Matrix4((2.0f * n) / (r - l), 0.0f, (r + l) / (r - l), 0.0f, 0.0f, (2.0f * n) / (t - b),
+                   (t + b) / (t - b), 0.0f, 0.0f, 0.0f, -(f + n) / (f - n),
+                   -(2.0f * f * n) / (f - n), 0.0f, 0.0f, -1.0f, 0.0f);
+}
+
+Matrix4 Matrix4::perspective(float fovY, float aspectRatio, float nearZ, float farZ)
+{
+    const float frustumHeight = tanf(static_cast&lt;float&gt;(fovY / 360.0f * M_PI)) * nearZ;
+    const float frustumWidth = frustumHeight * aspectRatio;
+    return frustum(-frustumWidth, frustumWidth, -frustumHeight, frustumHeight, nearZ, farZ);
+}
+
+Matrix4 Matrix4::ortho(float l, float r, float b, float t, float n, float f)
+{
+    return Matrix4(2.0f / (r - l), 0.0f, 0.0f, -(r + l) / (r - l), 0.0f, 2.0f / (t - b), 0.0f,
+                   -(t + b) / (t - b), 0.0f, 0.0f, -2.0f / (f - n), -(f + n) / (f - n), 0.0f, 0.0f,
+                   0.0f, 1.0f);
+}
+
+Matrix4 Matrix4::rollPitchYaw(float roll, float pitch, float yaw)
+{
+    return rotate(yaw, Vector3(0, 0, 1)) * rotate(pitch, Vector3(0, 1, 0)) *
+           rotate(roll, Vector3(1, 0, 0));
+}
+
+Matrix4 Matrix4::invert(const Matrix4 &amp;mat)
+{
+    Matrix4 inverted(
+        mat.data[5] * mat.data[10] * mat.data[15] - mat.data[5] * mat.data[11] * mat.data[14] -
+            mat.data[9] * mat.data[6] * mat.data[15] + mat.data[9] * mat.data[7] * mat.data[14] +
+            mat.data[13] * mat.data[6] * mat.data[11] - mat.data[13] * mat.data[7] * mat.data[10],
+        -mat.data[4] * mat.data[10] * mat.data[15] + mat.data[4] * mat.data[11] * mat.data[14] +
+            mat.data[8] * mat.data[6] * mat.data[15] - mat.data[8] * mat.data[7] * mat.data[14] -
+            mat.data[12] * mat.data[6] * mat.data[11] + mat.data[12] * mat.data[7] * mat.data[10],
+        mat.data[4] * mat.data[9] * mat.data[15] - mat.data[4] * mat.data[11] * mat.data[13] -
+            mat.data[8] * mat.data[5] * mat.data[15] + mat.data[8] * mat.data[7] * mat.data[13] +
+            mat.data[12] * mat.data[5] * mat.data[11] - mat.data[12] * mat.data[7] * mat.data[9],
+        -mat.data[4] * mat.data[9] * mat.data[14] + mat.data[4] * mat.data[10] * mat.data[13] +
+            mat.data[8] * mat.data[5] * mat.data[14] - mat.data[8] * mat.data[6] * mat.data[13] -
+            mat.data[12] * mat.data[5] * mat.data[10] + mat.data[12] * mat.data[6] * mat.data[9],
+        -mat.data[1] * mat.data[10] * mat.data[15] + mat.data[1] * mat.data[11] * mat.data[14] +
+            mat.data[9] * mat.data[2] * mat.data[15] - mat.data[9] * mat.data[3] * mat.data[14] -
+            mat.data[13] * mat.data[2] * mat.data[11] + mat.data[13] * mat.data[3] * mat.data[10],
+        mat.data[0] * mat.data[10] * mat.data[15] - mat.data[0] * mat.data[11] * mat.data[14] -
+            mat.data[8] * mat.data[2] * mat.data[15] + mat.data[8] * mat.data[3] * mat.data[14] +
+            mat.data[12] * mat.data[2] * mat.data[11] - mat.data[12] * mat.data[3] * mat.data[10],
+        -mat.data[0] * mat.data[9] * mat.data[15] + mat.data[0] * mat.data[11] * mat.data[13] +
+            mat.data[8] * mat.data[1] * mat.data[15] - mat.data[8] * mat.data[3] * mat.data[13] -
+            mat.data[12] * mat.data[1] * mat.data[11] + mat.data[12] * mat.data[3] * mat.data[9],
+        mat.data[0] * mat.data[9] * mat.data[14] - mat.data[0] * mat.data[10] * mat.data[13] -
+            mat.data[8] * mat.data[1] * mat.data[14] + mat.data[8] * mat.data[2] * mat.data[13] +
+            mat.data[12] * mat.data[1] * mat.data[10] - mat.data[12] * mat.data[2] * mat.data[9],
+        mat.data[1] * mat.data[6] * mat.data[15] - mat.data[1] * mat.data[7] * mat.data[14] -
+            mat.data[5] * mat.data[2] * mat.data[15] + mat.data[5] * mat.data[3] * mat.data[14] +
+            mat.data[13] * mat.data[2] * mat.data[7] - mat.data[13] * mat.data[3] * mat.data[6],
+        -mat.data[0] * mat.data[6] * mat.data[15] + mat.data[0] * mat.data[7] * mat.data[14] +
+            mat.data[4] * mat.data[2] * mat.data[15] - mat.data[4] * mat.data[3] * mat.data[14] -
+            mat.data[12] * mat.data[2] * mat.data[7] + mat.data[12] * mat.data[3] * mat.data[6],
+        mat.data[0] * mat.data[5] * mat.data[15] - mat.data[0] * mat.data[7] * mat.data[13] -
+            mat.data[4] * mat.data[1] * mat.data[15] + mat.data[4] * mat.data[3] * mat.data[13] +
+            mat.data[12] * mat.data[1] * mat.data[7] - mat.data[12] * mat.data[3] * mat.data[5],
+        -mat.data[0] * mat.data[5] * mat.data[14] + mat.data[0] * mat.data[6] * mat.data[13] +
+            mat.data[4] * mat.data[1] * mat.data[14] - mat.data[4] * mat.data[2] * mat.data[13] -
+            mat.data[12] * mat.data[1] * mat.data[6] + mat.data[12] * mat.data[2] * mat.data[5],
+        -mat.data[1] * mat.data[6] * mat.data[11] + mat.data[1] * mat.data[7] * mat.data[10] +
+            mat.data[5] * mat.data[2] * mat.data[11] - mat.data[5] * mat.data[3] * mat.data[10] -
+            mat.data[9] * mat.data[2] * mat.data[7] + mat.data[9] * mat.data[3] * mat.data[6],
+        mat.data[0] * mat.data[6] * mat.data[11] - mat.data[0] * mat.data[7] * mat.data[10] -
+            mat.data[4] * mat.data[2] * mat.data[11] + mat.data[4] * mat.data[3] * mat.data[10] +
+            mat.data[8] * mat.data[2] * mat.data[7] - mat.data[8] * mat.data[3] * mat.data[6],
+        -mat.data[0] * mat.data[5] * mat.data[11] + mat.data[0] * mat.data[7] * mat.data[9] +
+            mat.data[4] * mat.data[1] * mat.data[11] - mat.data[4] * mat.data[3] * mat.data[9] -
+            mat.data[8] * mat.data[1] * mat.data[7] + mat.data[8] * mat.data[3] * mat.data[5],
+        mat.data[0] * mat.data[5] * mat.data[10] - mat.data[0] * mat.data[6] * mat.data[9] -
+            mat.data[4] * mat.data[1] * mat.data[10] + mat.data[4] * mat.data[2] * mat.data[9] +
+            mat.data[8] * mat.data[1] * mat.data[6] - mat.data[8] * mat.data[2] * mat.data[5]);
+
+    float determinant = mat.data[0] * inverted.data[0] + mat.data[1] * inverted.data[4] +
+                        mat.data[2] * inverted.data[8] + mat.data[3] * inverted.data[12];
+
+    if (determinant != 0.0f)
+    {
+        inverted *= 1.0f / determinant;
+    }
+    else
+    {
+        inverted = identity();
+    }
+
+    return inverted;
+}
+
+Matrix4 Matrix4::transpose(const Matrix4 &amp;mat)
+{
+    return Matrix4(mat.data[0], mat.data[1], mat.data[2], mat.data[3], mat.data[4], mat.data[5],
+                   mat.data[6], mat.data[7], mat.data[8], mat.data[9], mat.data[10], mat.data[11],
+                   mat.data[12], mat.data[13], mat.data[14], mat.data[15]);
+}
+
+Vector3 Matrix4::transform(const Matrix4 &amp;mat, const Vector3 &amp;pt)
+{
+    Vector4 transformed = Vector4::normalize(mat * Vector4(pt.x, pt.y, pt.z, 1.0f));
+    return Vector3(transformed.x, transformed.y, transformed.z);
+}
+
+Vector3 Matrix4::transform(const Matrix4 &amp;mat, const Vector4 &amp;pt)
+{
+    Vector4 transformed = Vector4::normalize(mat * pt);
+    return Vector3(transformed.x, transformed.y, transformed.z);
+}
+
+Matrix4 operator*(const Matrix4 &amp;a, const Matrix4 &amp;b)
+{
+    return Matrix4(a.data[0] * b.data[0] + a.data[4] * b.data[1] + a.data[8] * b.data[2] +
+                       a.data[12] * b.data[3],
+                   a.data[0] * b.data[4] + a.data[4] * b.data[5] + a.data[8] * b.data[6] +
+                       a.data[12] * b.data[7],
+                   a.data[0] * b.data[8] + a.data[4] * b.data[9] + a.data[8] * b.data[10] +
+                       a.data[12] * b.data[11],
+                   a.data[0] * b.data[12] + a.data[4] * b.data[13] + a.data[8] * b.data[14] +
+                       a.data[12] * b.data[15],
+                   a.data[1] * b.data[0] + a.data[5] * b.data[1] + a.data[9] * b.data[2] +
+                       a.data[13] * b.data[3],
+                   a.data[1] * b.data[4] + a.data[5] * b.data[5] + a.data[9] * b.data[6] +
+                       a.data[13] * b.data[7],
+                   a.data[1] * b.data[8] + a.data[5] * b.data[9] + a.data[9] * b.data[10] +
+                       a.data[13] * b.data[11],
+                   a.data[1] * b.data[12] + a.data[5] * b.data[13] + a.data[9] * b.data[14] +
+                       a.data[13] * b.data[15],
+                   a.data[2] * b.data[0] + a.data[6] * b.data[1] + a.data[10] * b.data[2] +
+                       a.data[14] * b.data[3],
+                   a.data[2] * b.data[4] + a.data[6] * b.data[5] + a.data[10] * b.data[6] +
+                       a.data[14] * b.data[7],
+                   a.data[2] * b.data[8] + a.data[6] * b.data[9] + a.data[10] * b.data[10] +
+                       a.data[14] * b.data[11],
+                   a.data[2] * b.data[12] + a.data[6] * b.data[13] + a.data[10] * b.data[14] +
+                       a.data[14] * b.data[15],
+                   a.data[3] * b.data[0] + a.data[7] * b.data[1] + a.data[11] * b.data[2] +
+                       a.data[15] * b.data[3],
+                   a.data[3] * b.data[4] + a.data[7] * b.data[5] + a.data[11] * b.data[6] +
+                       a.data[15] * b.data[7],
+                   a.data[3] * b.data[8] + a.data[7] * b.data[9] + a.data[11] * b.data[10] +
+                       a.data[15] * b.data[11],
+                   a.data[3] * b.data[12] + a.data[7] * b.data[13] + a.data[11] * b.data[14] +
+                       a.data[15] * b.data[15]);
+}
+
+Matrix4 &amp;operator*=(Matrix4 &amp;a, const Matrix4 &amp;b)
+{
+    a = a * b;
+    return a;
+}
+
+Matrix4 operator*(const Matrix4 &amp;a, float b)
+{
+    Matrix4 ret(a);
+    for (size_t i = 0; i &lt; 16; i++)
+    {
+        ret.data[i] *= b;
+    }
+    return ret;
+}
+
+Matrix4 &amp;operator*=(Matrix4 &amp;a, float b)
+{
+    for (size_t i = 0; i &lt; 16; i++)
+    {
+        a.data[i] *= b;
+    }
+    return a;
+}
+
+Vector4 operator*(const Matrix4 &amp;a, const Vector4 &amp;b)
+{
+    return Vector4(a.data[0] * b.x + a.data[4] * b.y + a.data[8] * b.z + a.data[12] * b.w,
+                   a.data[1] * b.x + a.data[5] * b.y + a.data[9] * b.z + a.data[13] * b.w,
+                   a.data[2] * b.x + a.data[6] * b.y + a.data[10] * b.z + a.data[14] * b.w,
+                   a.data[3] * b.x + a.data[7] * b.y + a.data[11] * b.z + a.data[15] * b.w);
+}
+
+bool operator==(const Matrix4 &amp;a, const Matrix4 &amp;b)
+{
+    for (size_t i = 0; i &lt; 16; i++)
+    {
+        if (a.data[i] != b.data[i])
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool operator!=(const Matrix4 &amp;a, const Matrix4 &amp;b)
+{
+    return !(a == b);
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilMatrixh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/util/Matrix.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/Matrix.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/util/Matrix.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+//
+// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Matrix:
+//   Helper class for doing matrix math.
+//
+
+#ifndef UTIL_MATRIX_H
+#define UTIL_MATRIX_H
+
+#include &quot;Vector.h&quot;
+
+struct Matrix4
+{
+    float data[16];
+
+    Matrix4();
+    Matrix4(float m00,
+            float m01,
+            float m02,
+            float m03,
+            float m10,
+            float m11,
+            float m12,
+            float m13,
+            float m20,
+            float m21,
+            float m22,
+            float m23,
+            float m30,
+            float m31,
+            float m32,
+            float m33);
+
+    static Matrix4 identity();
+    static Matrix4 rotate(float angle, const Vector3 &amp;p);
+    static Matrix4 translate(const Vector3 &amp;t);
+    static Matrix4 scale(const Vector3 &amp;s);
+    static Matrix4 frustum(float l, float r, float b, float t, float n, float f);
+    static Matrix4 perspective(float fov, float aspectRatio, float n, float f);
+    static Matrix4 ortho(float l, float r, float b, float t, float n, float f);
+    static Matrix4 rollPitchYaw(float roll, float pitch, float yaw);
+
+    static Matrix4 invert(const Matrix4 &amp;mat);
+    static Matrix4 transpose(const Matrix4 &amp;mat);
+    static Vector3 transform(const Matrix4 &amp;mat, const Vector3 &amp;pt);
+    static Vector3 transform(const Matrix4 &amp;mat, const Vector4 &amp;pt);
+};
+
+Matrix4 operator*(const Matrix4 &amp;a, const Matrix4 &amp;b);
+Matrix4 &amp;operator*=(Matrix4 &amp;a, const Matrix4 &amp;b);
+Matrix4 operator*(const Matrix4 &amp;a, float b);
+Matrix4 &amp;operator*=(Matrix4 &amp;a, float b);
+Vector4 operator*(const Matrix4 &amp;a, const Vector4 &amp;b);
+
+bool operator==(const Matrix4 &amp;a, const Matrix4 &amp;b);
+bool operator!=(const Matrix4 &amp;a, const Matrix4 &amp;b);
+
+#endif  // UTIL_MATRIX_H
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilOSPixmaph"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/util/OSPixmap.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/OSPixmap.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/util/OSPixmap.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+//
+// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// OSPixmap.h: Definition of an abstract pixmap class
+
+#ifndef SAMPLE_UTIL_PIXMAP_H_
+#define SAMPLE_UTIL_PIXMAP_H_
+
+#include &lt;stdlib.h&gt;
+
+#include &lt;EGL/egl.h&gt;
+#include &lt;EGL/eglext.h&gt;
+
+#include &quot;Event.h&quot;
+
+class OSPixmap
+{
+  public:
+    OSPixmap() {}
+    virtual ~OSPixmap() {}
+
+    virtual bool initialize(EGLNativeDisplayType display, size_t width, size_t height, int depth) = 0;
+
+    virtual EGLNativePixmapType getNativePixmap() const = 0;
+};
+
+OSPixmap *CreateOSPixmap();
+
+#endif // SAMPLE_UTIL_PIXMAP_H_
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilOSWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/util/OSWindow.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/OSWindow.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/util/OSWindow.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -6,6 +6,240 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;OSWindow.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;iostream&gt;
+#include &lt;sstream&gt;
+
+#include &quot;common/debug.h&quot;
+
+#ifndef DEBUG_EVENTS
+#define DEBUG_EVENTS 0
+#endif
+
+#if DEBUG_EVENTS
+static const char *MouseButtonName(MouseButton button)
+{
+    switch (button)
+    {
+      case MOUSEBUTTON_UNKNOWN:
+        return &quot;Unknown&quot;;
+      case MOUSEBUTTON_LEFT:
+        return &quot;Left&quot;;
+      case MOUSEBUTTON_RIGHT:
+        return &quot;Right&quot;;
+      case MOUSEBUTTON_MIDDLE:
+        return &quot;Middle&quot;;
+      case MOUSEBUTTON_BUTTON4:
+        return &quot;Button4&quot;;
+      case MOUSEBUTTON_BUTTON5:
+        return &quot;Button5&quot;;
+      default:
+        UNREACHABLE();
+        return nullptr;
+    }
+}
+
+static const char *KeyName(Key key)
+{
+    switch (key)
+    {
+      case KEY_UNKNOWN:   return &quot;Unknown&quot;;
+      case KEY_A:         return &quot;A&quot;;
+      case KEY_B:         return &quot;B&quot;;
+      case KEY_C:         return &quot;C&quot;;
+      case KEY_D:         return &quot;D&quot;;
+      case KEY_E:         return &quot;E&quot;;
+      case KEY_F:         return &quot;F&quot;;
+      case KEY_G:         return &quot;G&quot;;
+      case KEY_H:         return &quot;H&quot;;
+      case KEY_I:         return &quot;I&quot;;
+      case KEY_J:         return &quot;J&quot;;
+      case KEY_K:         return &quot;K&quot;;
+      case KEY_L:         return &quot;L&quot;;
+      case KEY_M:         return &quot;M&quot;;
+      case KEY_N:         return &quot;N&quot;;
+      case KEY_O:         return &quot;O&quot;;
+      case KEY_P:         return &quot;P&quot;;
+      case KEY_Q:         return &quot;Q&quot;;
+      case KEY_R:         return &quot;R&quot;;
+      case KEY_S:         return &quot;S&quot;;
+      case KEY_T:         return &quot;T&quot;;
+      case KEY_U:         return &quot;U&quot;;
+      case KEY_V:         return &quot;V&quot;;
+      case KEY_W:         return &quot;W&quot;;
+      case KEY_X:         return &quot;X&quot;;
+      case KEY_Y:         return &quot;Y&quot;;
+      case KEY_Z:         return &quot;Z&quot;;
+      case KEY_NUM0:      return &quot;Num0&quot;;
+      case KEY_NUM1:      return &quot;Num1&quot;;
+      case KEY_NUM2:      return &quot;Num2&quot;;
+      case KEY_NUM3:      return &quot;Num3&quot;;
+      case KEY_NUM4:      return &quot;Num4&quot;;
+      case KEY_NUM5:      return &quot;Num5&quot;;
+      case KEY_NUM6:      return &quot;Num6&quot;;
+      case KEY_NUM7:      return &quot;Num7&quot;;
+      case KEY_NUM8:      return &quot;Num8&quot;;
+      case KEY_NUM9:      return &quot;Num9&quot;;
+      case KEY_ESCAPE:    return &quot;Escape&quot;;
+      case KEY_LCONTROL:  return &quot;Left Control&quot;;
+      case KEY_LSHIFT:    return &quot;Left Shift&quot;;
+      case KEY_LALT:      return &quot;Left Alt&quot;;
+      case KEY_LSYSTEM:   return &quot;Left System&quot;;
+      case KEY_RCONTROL:  return &quot;Right Control&quot;;
+      case KEY_RSHIFT:    return &quot;Right Shift&quot;;
+      case KEY_RALT:      return &quot;Right Alt&quot;;
+      case KEY_RSYSTEM:   return &quot;Right System&quot;;
+      case KEY_MENU:      return &quot;Menu&quot;;
+      case KEY_LBRACKET:  return &quot;Left Bracket&quot;;
+      case KEY_RBRACKET:  return &quot;Right Bracket&quot;;
+      case KEY_SEMICOLON: return &quot;Semicolon&quot;;
+      case KEY_COMMA:     return &quot;Comma&quot;;
+      case KEY_PERIOD:    return &quot;Period&quot;;
+      case KEY_QUOTE:     return &quot;Quote&quot;;
+      case KEY_SLASH:     return &quot;Slash&quot;;
+      case KEY_BACKSLASH: return &quot;Backslash&quot;;
+      case KEY_TILDE:     return &quot;Tilde&quot;;
+      case KEY_EQUAL:     return &quot;Equal&quot;;
+      case KEY_DASH:      return &quot;Dash&quot;;
+      case KEY_SPACE:     return &quot;Space&quot;;
+      case KEY_RETURN:    return &quot;Return&quot;;
+      case KEY_BACK:      return &quot;Back&quot;;
+      case KEY_TAB:       return &quot;Tab&quot;;
+      case KEY_PAGEUP:    return &quot;Page Up&quot;;
+      case KEY_PAGEDOWN:  return &quot;Page Down&quot;;
+      case KEY_END:       return &quot;End&quot;;
+      case KEY_HOME:      return &quot;Home&quot;;
+      case KEY_INSERT:    return &quot;Insert&quot;;
+      case KEY_DELETE:    return &quot;Delete&quot;;
+      case KEY_ADD:       return &quot;Add&quot;;
+      case KEY_SUBTRACT:  return &quot;Substract&quot;;
+      case KEY_MULTIPLY:  return &quot;Multiply&quot;;
+      case KEY_DIVIDE:    return &quot;Divide&quot;;
+      case KEY_LEFT:      return &quot;Left&quot;;
+      case KEY_RIGHT:     return &quot;Right&quot;;
+      case KEY_UP:        return &quot;Up&quot;;
+      case KEY_DOWN:      return &quot;Down&quot;;
+      case KEY_NUMPAD0:   return &quot;Numpad 0&quot;;
+      case KEY_NUMPAD1:   return &quot;Numpad 1&quot;;
+      case KEY_NUMPAD2:   return &quot;Numpad 2&quot;;
+      case KEY_NUMPAD3:   return &quot;Numpad 3&quot;;
+      case KEY_NUMPAD4:   return &quot;Numpad 4&quot;;
+      case KEY_NUMPAD5:   return &quot;Numpad 5&quot;;
+      case KEY_NUMPAD6:   return &quot;Numpad 6&quot;;
+      case KEY_NUMPAD7:   return &quot;Numpad 7&quot;;
+      case KEY_NUMPAD8:   return &quot;Numpad 8&quot;;
+      case KEY_NUMPAD9:   return &quot;Numpad 9&quot;;
+      case KEY_F1:        return &quot;F1&quot;;
+      case KEY_F2:        return &quot;F2&quot;;
+      case KEY_F3:        return &quot;F3&quot;;
+      case KEY_F4:        return &quot;F4&quot;;
+      case KEY_F5:        return &quot;F5&quot;;
+      case KEY_F6:        return &quot;F6&quot;;
+      case KEY_F7:        return &quot;F7&quot;;
+      case KEY_F8:        return &quot;F8&quot;;
+      case KEY_F9:        return &quot;F9&quot;;
+      case KEY_F10:       return &quot;F10&quot;;
+      case KEY_F11:       return &quot;F11&quot;;
+      case KEY_F12:       return &quot;F12&quot;;
+      case KEY_F13:       return &quot;F13&quot;;
+      case KEY_F14:       return &quot;F14&quot;;
+      case KEY_F15:       return &quot;F15&quot;;
+      case KEY_PAUSE:     return &quot;Pause&quot;;
+      default:            return &quot;Unknown Key&quot;;
+    }
+}
+
+static std::string KeyState(const Event::KeyEvent &amp;event)
+{
+    if (event.Shift || event.Control || event.Alt || event.System)
+    {
+        std::ostringstream buffer;
+        buffer &lt;&lt; &quot; [&quot;;
+
+        if (event.Shift)
+        {
+            buffer &lt;&lt; &quot;Shift&quot;;
+        }
+        if (event.Control)
+        {
+            buffer &lt;&lt; &quot;Control&quot;;
+        }
+        if (event.Alt)
+        {
+            buffer &lt;&lt; &quot;Alt&quot;;
+        }
+        if (event.System)
+        {
+            buffer &lt;&lt; &quot;System&quot;;
+        }
+
+        buffer &lt;&lt; &quot;]&quot;;
+        return buffer.str();
+    }
+    return &quot;&quot;;
+}
+
+static void PrintEvent(const Event&amp; event)
+{
+    switch (event.Type)
+    {
+      case Event::EVENT_CLOSED:
+        std::cout &lt;&lt; &quot;Event: Window Closed&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_MOVED:
+        std::cout &lt;&lt; &quot;Event: Window Moved (&quot; &lt;&lt; event.Move.X
+                  &lt;&lt; &quot;, &quot; &lt;&lt; event.Move.Y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_RESIZED:
+        std::cout &lt;&lt; &quot;Event: Window Resized (&quot; &lt;&lt; event.Size.Width
+                  &lt;&lt; &quot;, &quot; &lt;&lt; event.Size.Height &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_LOST_FOCUS:
+        std::cout &lt;&lt; &quot;Event: Window Lost Focus&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_GAINED_FOCUS:
+        std::cout &lt;&lt; &quot;Event: Window Gained Focus&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_TEXT_ENTERED:
+        // TODO(cwallez) show the character
+        std::cout &lt;&lt; &quot;Event: Text Entered&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_KEY_PRESSED:
+        std::cout &lt;&lt; &quot;Event: Key Pressed (&quot; &lt;&lt; KeyName(event.Key.Code) &lt;&lt; KeyState(event.Key) &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_KEY_RELEASED:
+        std::cout &lt;&lt; &quot;Event: Key Released (&quot; &lt;&lt; KeyName(event.Key.Code) &lt;&lt; KeyState(event.Key) &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_MOUSE_WHEEL_MOVED:
+        std::cout &lt;&lt; &quot;Event: Mouse Wheel (&quot; &lt;&lt; event.MouseWheel.Delta &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_MOUSE_BUTTON_PRESSED:
+        std::cout &lt;&lt; &quot;Event: Mouse Button Pressed &quot; &lt;&lt; MouseButtonName(event.MouseButton.Button) &lt;&lt;
+                  &quot; at (&quot; &lt;&lt; event.MouseButton.X &lt;&lt; &quot;, &quot; &lt;&lt; event.MouseButton.Y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_MOUSE_BUTTON_RELEASED:
+        std::cout &lt;&lt; &quot;Event: Mouse Button Released &quot; &lt;&lt; MouseButtonName(event.MouseButton.Button) &lt;&lt;
+                  &quot; at (&quot; &lt;&lt; event.MouseButton.X &lt;&lt; &quot;, &quot; &lt;&lt; event.MouseButton.Y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_MOUSE_MOVED:
+        std::cout &lt;&lt; &quot;Event: Mouse Moved (&quot; &lt;&lt; event.MouseMove.X
+                  &lt;&lt; &quot;, &quot; &lt;&lt; event.MouseMove.Y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_MOUSE_ENTERED:
+        std::cout &lt;&lt; &quot;Event: Mouse Entered Window&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_MOUSE_LEFT:
+        std::cout &lt;&lt; &quot;Event: Mouse Left Window&quot; &lt;&lt; std::endl;
+        break;
+      case Event::EVENT_TEST:
+        std::cout &lt;&lt; &quot;Event: Test&quot; &lt;&lt; std::endl;
+        break;
+      default:
+        UNREACHABLE();
+        break;
+    }
+}
+#endif
+
</ins><span class="cx"> OSWindow::OSWindow()
</span><span class="cx">     : mX(0),
</span><span class="cx">       mY(0),
</span><span class="lines">@@ -68,6 +302,10 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     mEvents.push_back(event);
</span><ins>+
+#if DEBUG_EVENTS
+    PrintEvent(event);
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool OSWindow::didTestEventFire()
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilOSWindowh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/util/OSWindow.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/OSWindow.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/util/OSWindow.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,13 +7,15 @@
</span><span class="cx"> #ifndef SAMPLE_UTIL_WINDOW_H
</span><span class="cx"> #define SAMPLE_UTIL_WINDOW_H
</span><span class="cx"> 
</span><del>-#include &quot;Event.h&quot;
</del><ins>+#include &lt;list&gt;
+#include &lt;stdint.h&gt;
+#include &lt;string&gt;
</ins><span class="cx"> 
</span><span class="cx"> #include &lt;EGL/egl.h&gt;
</span><span class="cx"> #include &lt;EGL/eglext.h&gt;
</span><del>-#include &lt;list&gt;
-#include &lt;string&gt;
</del><span class="cx"> 
</span><ins>+#include &quot;Event.h&quot;
+
</ins><span class="cx"> class OSWindow
</span><span class="cx"> {
</span><span class="cx">   public:
</span><span class="lines">@@ -28,6 +30,12 @@
</span><span class="cx">     int getWidth() const;
</span><span class="cx">     int getHeight() const;
</span><span class="cx"> 
</span><ins>+    // Takes a screenshot of the window, returning the result as a mWidth * mHeight * 4
+    // normalized unsigned byte BGRA array. Note that it will be used to test the window
+    // manager's behavior so it needs to take an actual screenshot of the screen and not
+    // just grab the pixels of the window. Returns if it was successful.
+    virtual bool takeScreenshot(uint8_t *pixelData) { return false; }
+
</ins><span class="cx">     virtual EGLNativeWindowType getNativeWindow() const = 0;
</span><span class="cx">     virtual EGLNativeDisplayType getNativeDisplay() const = 0;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilVectorcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/util/Vector.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/Vector.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/util/Vector.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,170 @@
</span><ins>+//
+// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Vector:
+//   Vector class for linear math.
+//
+
+#include &quot;Vector.h&quot;
+
+#include &lt;math.h&gt;
+
+Vector2::Vector2() : x(0.0), y(0.0)
+{
+}
+
+Vector2::Vector2(float x, float y) : x(x), y(y)
+{
+}
+
+bool Vector2::operator==(const Vector2 &amp;vec) const
+{
+    return x == vec.x &amp;&amp; y == vec.y;
+}
+
+bool Vector2::operator!=(const Vector2 &amp;vec) const
+{
+    return !(*this == vec);
+}
+
+std::ostream &amp;operator&lt;&lt;(std::ostream &amp;stream, const Vector2 &amp;vec)
+{
+    stream &lt;&lt; &quot;(&quot; &lt;&lt; vec.x &lt;&lt; &quot;,&quot; &lt;&lt; vec.y &lt;&lt; &quot;)&quot;;
+    return stream;
+}
+
+float Vector2::length(const Vector2 &amp;vec)
+{
+    float lenSquared = lengthSquared(vec);
+    return (lenSquared != 0.0f) ? sqrtf(lenSquared) : 0.0f;
+}
+
+float Vector2::lengthSquared(const Vector2 &amp;vec)
+{
+    return vec.x * vec.x + vec.y * vec.y;
+}
+
+Vector2 Vector2::normalize(const Vector2 &amp;vec)
+{
+    Vector2 ret(0.0f, 0.0f);
+    float len = length(vec);
+    if (len != 0.0f)
+    {
+        float invLen = 1.0f / len;
+        ret.x        = vec.x * invLen;
+        ret.y        = vec.y * invLen;
+    }
+    return ret;
+}
+
+Vector3::Vector3() : x(0.0), y(0.0), z(0.0)
+{
+}
+
+Vector3::Vector3(float x, float y, float z) : x(x), y(y), z(z)
+{
+}
+
+float Vector3::length(const Vector3 &amp;vec)
+{
+    float lenSquared = lengthSquared(vec);
+    return (lenSquared != 0.0f) ? sqrtf(lenSquared) : 0.0f;
+}
+
+float Vector3::lengthSquared(const Vector3 &amp;vec)
+{
+    return vec.x * vec.x + vec.y * vec.y + vec.z * vec.z;
+}
+
+Vector3 Vector3::normalize(const Vector3 &amp;vec)
+{
+    Vector3 ret(0.0f, 0.0f, 0.0f);
+    float len = length(vec);
+    if (len != 0.0f)
+    {
+        float invLen = 1.0f / len;
+        ret.x        = vec.x * invLen;
+        ret.y        = vec.y * invLen;
+        ret.z        = vec.z * invLen;
+    }
+    return ret;
+}
+
+float Vector3::dot(const Vector3 &amp;a, const Vector3 &amp;b)
+{
+    return a.x * b.x + a.y * b.y + a.z * b.z;
+}
+
+Vector3 Vector3::cross(const Vector3 &amp;a, const Vector3 &amp;b)
+{
+    return Vector3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
+}
+
+Vector3 operator*(const Vector3 &amp;a, const Vector3 &amp;b)
+{
+    return Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
+}
+
+Vector3 operator*(const Vector3 &amp;a, const float &amp;b)
+{
+    return Vector3(a.x * b, a.y * b, a.z * b);
+}
+
+Vector3 operator/(const Vector3 &amp;a, const Vector3 &amp;b)
+{
+    return Vector3(a.x / b.x, a.y / b.y, a.z / b.z);
+}
+
+Vector3 operator/(const Vector3 &amp;a, const float &amp;b)
+{
+    return Vector3(a.x / b, a.y / b, a.z / b);
+}
+
+Vector3 operator+(const Vector3 &amp;a, const Vector3 &amp;b)
+{
+    return Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
+}
+
+Vector3 operator-(const Vector3 &amp;a, const Vector3 &amp;b)
+{
+    return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
+}
+
+Vector4::Vector4() : x(0.0f), y(0.0f), z(0.0f), w(0.0f)
+{
+}
+
+Vector4::Vector4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w)
+{
+}
+
+float Vector4::length(const Vector4 &amp;vec)
+{
+    float lenSquared = lengthSquared(vec);
+    return (lenSquared != 0.0f) ? sqrtf(lenSquared) : 0.0f;
+}
+
+float Vector4::lengthSquared(const Vector4 &amp;vec)
+{
+    return vec.x * vec.x + vec.y * vec.y + vec.z * vec.z + vec.w * vec.w;
+}
+
+Vector4 Vector4::normalize(const Vector4 &amp;vec)
+{
+    Vector4 ret(0.0f, 0.0f, 0.0f, 1.0f);
+    if (vec.w != 0.0f)
+    {
+        float invLen = 1.0f / vec.w;
+        ret.x        = vec.x * invLen;
+        ret.y        = vec.y * invLen;
+        ret.z        = vec.z * invLen;
+    }
+    return ret;
+}
+
+float Vector4::dot(const Vector4 &amp;a, const Vector4 &amp;b)
+{
+    return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilVectorh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/util/Vector.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/Vector.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/util/Vector.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,80 @@
</span><ins>+//
+// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Vector:
+//   Vector class for linear math.
+//
+
+#ifndef UTIL_VECTOR_H
+#define UTIL_VECTOR_H
+
+#include &lt;ostream&gt;
+
+struct Vector2
+{
+    Vector2();
+    Vector2(float x, float y);
+
+    bool operator==(const Vector2 &amp;vec) const;
+    bool operator!=(const Vector2 &amp;vec) const;
+
+    static float length(const Vector2 &amp;vec);
+    static float lengthSquared(const Vector2 &amp;vec);
+
+    static Vector2 normalize(const Vector2 &amp;vec);
+
+    float *data() { return &amp;x; }
+    const float *data() const { return &amp;x; }
+
+    float x, y;
+};
+
+std::ostream &amp;operator&lt;&lt;(std::ostream &amp;stream, const Vector2 &amp;vec);
+
+struct Vector3
+{
+    Vector3();
+    Vector3(float x, float y, float z);
+
+    static float length(const Vector3 &amp;vec);
+    static float lengthSquared(const Vector3 &amp;vec);
+
+    static Vector3 normalize(const Vector3 &amp;vec);
+
+    static float dot(const Vector3 &amp;a, const Vector3 &amp;b);
+    static Vector3 cross(const Vector3 &amp;a, const Vector3 &amp;b);
+
+    float *data() { return &amp;x; }
+    const float *data() const { return &amp;x; }
+
+    float x, y, z;
+};
+
+Vector3 operator*(const Vector3 &amp;a, const Vector3 &amp;b);
+Vector3 operator*(const Vector3 &amp;a, const float &amp;b);
+Vector3 operator/(const Vector3 &amp;a, const Vector3 &amp;b);
+Vector3 operator/(const Vector3 &amp;a, const float &amp;b);
+Vector3 operator+(const Vector3 &amp;a, const Vector3 &amp;b);
+Vector3 operator-(const Vector3 &amp;a, const Vector3 &amp;b);
+
+struct Vector4
+{
+    Vector4();
+    Vector4(float x, float y, float z, float w);
+
+    static float length(const Vector4 &amp;vec);
+    static float lengthSquared(const Vector4 &amp;vec);
+
+    static Vector4 normalize(const Vector4 &amp;vec);
+
+    static float dot(const Vector4 &amp;a, const Vector4 &amp;b);
+
+    float *data() { return &amp;x; }
+    const float *data() const { return &amp;x; }
+
+    float x, y, z, w;
+};
+
+#endif  // UTIL_VECTOR_H
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilgeometry_utilscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/util/geometry_utils.cpp (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/geometry_utils.cpp                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/util/geometry_utils.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,173 @@
</span><ins>+//
+// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// geometry_utils:
+//   Helper library for generating certain sets of geometry.
+//
+
+#include &quot;geometry_utils.h&quot;
+
+#define _USE_MATH_DEFINES
+#include &lt;math.h&gt;
+
+void CreateSphereGeometry(size_t sliceCount, float radius, SphereGeometry *result)
+{
+    size_t parellelCount = sliceCount / 2;
+    size_t vertexCount   = (parellelCount + 1) * (sliceCount + 1);
+    size_t indexCount    = parellelCount * sliceCount * 6;
+    float angleStep      = static_cast&lt;float&gt;(2.0f * M_PI) / sliceCount;
+
+    result-&gt;positions.resize(vertexCount);
+    result-&gt;normals.resize(vertexCount);
+    for (size_t i = 0; i &lt; parellelCount + 1; i++)
+    {
+        for (size_t j = 0; j &lt; sliceCount + 1; j++)
+        {
+            Vector3 direction(sinf(angleStep * i) * sinf(angleStep * j), cosf(angleStep * i),
+                              sinf(angleStep * i) * cosf(angleStep * j));
+
+            size_t vertexIdx             = i * (sliceCount + 1) + j;
+            result-&gt;positions[vertexIdx] = direction * radius;
+            result-&gt;normals[vertexIdx]   = direction;
+        }
+    }
+
+    result-&gt;indices.clear();
+    result-&gt;indices.reserve(indexCount);
+    for (size_t i = 0; i &lt; parellelCount; i++)
+    {
+        for (size_t j = 0; j &lt; sliceCount; j++)
+        {
+            result-&gt;indices.push_back(static_cast&lt;unsigned short&gt;(i * (sliceCount + 1) + j));
+            result-&gt;indices.push_back(static_cast&lt;unsigned short&gt;((i + 1) * (sliceCount + 1) + j));
+            result-&gt;indices.push_back(
+                static_cast&lt;unsigned short&gt;((i + 1) * (sliceCount + 1) + (j + 1)));
+
+            result-&gt;indices.push_back(static_cast&lt;unsigned short&gt;(i * (sliceCount + 1) + j));
+            result-&gt;indices.push_back(
+                static_cast&lt;unsigned short&gt;((i + 1) * (sliceCount + 1) + (j + 1)));
+            result-&gt;indices.push_back(static_cast&lt;unsigned short&gt;(i * (sliceCount + 1) + (j + 1)));
+        }
+    }
+}
+
+void GenerateCubeGeometry(float radius, CubeGeometry *result)
+{
+    result-&gt;positions.resize(24);
+    result-&gt;positions[0]  = Vector3(-radius, -radius, -radius);
+    result-&gt;positions[1]  = Vector3(-radius, -radius, radius);
+    result-&gt;positions[2]  = Vector3(radius, -radius, radius);
+    result-&gt;positions[3]  = Vector3(radius, -radius, -radius);
+    result-&gt;positions[4]  = Vector3(-radius, radius, -radius);
+    result-&gt;positions[5]  = Vector3(-radius, radius, radius);
+    result-&gt;positions[6]  = Vector3(radius, radius, radius);
+    result-&gt;positions[7]  = Vector3(radius, radius, -radius);
+    result-&gt;positions[8]  = Vector3(-radius, -radius, -radius);
+    result-&gt;positions[9]  = Vector3(-radius, radius, -radius);
+    result-&gt;positions[10] = Vector3(radius, radius, -radius);
+    result-&gt;positions[11] = Vector3(radius, -radius, -radius);
+    result-&gt;positions[12] = Vector3(-radius, -radius, radius);
+    result-&gt;positions[13] = Vector3(-radius, radius, radius);
+    result-&gt;positions[14] = Vector3(radius, radius, radius);
+    result-&gt;positions[15] = Vector3(radius, -radius, radius);
+    result-&gt;positions[16] = Vector3(-radius, -radius, -radius);
+    result-&gt;positions[17] = Vector3(-radius, -radius, radius);
+    result-&gt;positions[18] = Vector3(-radius, radius, radius);
+    result-&gt;positions[19] = Vector3(-radius, radius, -radius);
+    result-&gt;positions[20] = Vector3(radius, -radius, -radius);
+    result-&gt;positions[21] = Vector3(radius, -radius, radius);
+    result-&gt;positions[22] = Vector3(radius, radius, radius);
+    result-&gt;positions[23] = Vector3(radius, radius, -radius);
+
+    result-&gt;normals.resize(24);
+    result-&gt;normals[0]  = Vector3(0.0f, -1.0f, 0.0f);
+    result-&gt;normals[1]  = Vector3(0.0f, -1.0f, 0.0f);
+    result-&gt;normals[2]  = Vector3(0.0f, -1.0f, 0.0f);
+    result-&gt;normals[3]  = Vector3(0.0f, -1.0f, 0.0f);
+    result-&gt;normals[4]  = Vector3(0.0f, 1.0f, 0.0f);
+    result-&gt;normals[5]  = Vector3(0.0f, 1.0f, 0.0f);
+    result-&gt;normals[6]  = Vector3(0.0f, 1.0f, 0.0f);
+    result-&gt;normals[7]  = Vector3(0.0f, 1.0f, 0.0f);
+    result-&gt;normals[8]  = Vector3(0.0f, 0.0f, -1.0f);
+    result-&gt;normals[9]  = Vector3(0.0f, 0.0f, -1.0f);
+    result-&gt;normals[10] = Vector3(0.0f, 0.0f, -1.0f);
+    result-&gt;normals[11] = Vector3(0.0f, 0.0f, -1.0f);
+    result-&gt;normals[12] = Vector3(0.0f, 0.0f, 1.0f);
+    result-&gt;normals[13] = Vector3(0.0f, 0.0f, 1.0f);
+    result-&gt;normals[14] = Vector3(0.0f, 0.0f, 1.0f);
+    result-&gt;normals[15] = Vector3(0.0f, 0.0f, 1.0f);
+    result-&gt;normals[16] = Vector3(-1.0f, 0.0f, 0.0f);
+    result-&gt;normals[17] = Vector3(-1.0f, 0.0f, 0.0f);
+    result-&gt;normals[18] = Vector3(-1.0f, 0.0f, 0.0f);
+    result-&gt;normals[19] = Vector3(-1.0f, 0.0f, 0.0f);
+    result-&gt;normals[20] = Vector3(1.0f, 0.0f, 0.0f);
+    result-&gt;normals[21] = Vector3(1.0f, 0.0f, 0.0f);
+    result-&gt;normals[22] = Vector3(1.0f, 0.0f, 0.0f);
+    result-&gt;normals[23] = Vector3(1.0f, 0.0f, 0.0f);
+
+    result-&gt;texcoords.resize(24);
+    result-&gt;texcoords[0]  = Vector2(0.0f, 0.0f);
+    result-&gt;texcoords[1]  = Vector2(0.0f, 1.0f);
+    result-&gt;texcoords[2]  = Vector2(1.0f, 1.0f);
+    result-&gt;texcoords[3]  = Vector2(1.0f, 0.0f);
+    result-&gt;texcoords[4]  = Vector2(1.0f, 0.0f);
+    result-&gt;texcoords[5]  = Vector2(1.0f, 1.0f);
+    result-&gt;texcoords[6]  = Vector2(0.0f, 1.0f);
+    result-&gt;texcoords[7]  = Vector2(0.0f, 0.0f);
+    result-&gt;texcoords[8]  = Vector2(0.0f, 0.0f);
+    result-&gt;texcoords[9]  = Vector2(0.0f, 1.0f);
+    result-&gt;texcoords[10] = Vector2(1.0f, 1.0f);
+    result-&gt;texcoords[11] = Vector2(1.0f, 0.0f);
+    result-&gt;texcoords[12] = Vector2(0.0f, 0.0f);
+    result-&gt;texcoords[13] = Vector2(0.0f, 1.0f);
+    result-&gt;texcoords[14] = Vector2(1.0f, 1.0f);
+    result-&gt;texcoords[15] = Vector2(1.0f, 0.0f);
+    result-&gt;texcoords[16] = Vector2(0.0f, 0.0f);
+    result-&gt;texcoords[17] = Vector2(0.0f, 1.0f);
+    result-&gt;texcoords[18] = Vector2(1.0f, 1.0f);
+    result-&gt;texcoords[19] = Vector2(1.0f, 0.0f);
+    result-&gt;texcoords[20] = Vector2(0.0f, 0.0f);
+    result-&gt;texcoords[21] = Vector2(0.0f, 1.0f);
+    result-&gt;texcoords[22] = Vector2(1.0f, 1.0f);
+    result-&gt;texcoords[23] = Vector2(1.0f, 0.0f);
+
+    result-&gt;indices.resize(36);
+    result-&gt;indices[0]  = 0;
+    result-&gt;indices[1]  = 2;
+    result-&gt;indices[2]  = 1;
+    result-&gt;indices[3]  = 0;
+    result-&gt;indices[4]  = 3;
+    result-&gt;indices[5]  = 2;
+    result-&gt;indices[6]  = 4;
+    result-&gt;indices[7]  = 5;
+    result-&gt;indices[8]  = 6;
+    result-&gt;indices[9]  = 4;
+    result-&gt;indices[10] = 6;
+    result-&gt;indices[11] = 7;
+    result-&gt;indices[12] = 8;
+    result-&gt;indices[13] = 9;
+    result-&gt;indices[14] = 10;
+    result-&gt;indices[15] = 8;
+    result-&gt;indices[16] = 10;
+    result-&gt;indices[17] = 11;
+    result-&gt;indices[18] = 12;
+    result-&gt;indices[19] = 15;
+    result-&gt;indices[20] = 14;
+    result-&gt;indices[21] = 12;
+    result-&gt;indices[22] = 14;
+    result-&gt;indices[23] = 13;
+    result-&gt;indices[24] = 16;
+    result-&gt;indices[25] = 17;
+    result-&gt;indices[26] = 18;
+    result-&gt;indices[27] = 16;
+    result-&gt;indices[28] = 18;
+    result-&gt;indices[29] = 19;
+    result-&gt;indices[30] = 20;
+    result-&gt;indices[31] = 23;
+    result-&gt;indices[32] = 22;
+    result-&gt;indices[33] = 20;
+    result-&gt;indices[34] = 22;
+    result-&gt;indices[35] = 21;
+}
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilgeometry_utilsh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/util/geometry_utils.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/geometry_utils.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/util/geometry_utils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+//
+// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// geometry_utils:
+//   Helper library for generating certain sets of geometry.
+//
+
+#ifndef UTIL_GEOMETRY_UTILS_H
+#define UTIL_GEOMETRY_UTILS_H
+
+#include &lt;cstddef&gt;
+#include &lt;vector&gt;
+#include &lt;GLES2/gl2.h&gt;
+
+#include &quot;Vector.h&quot;
+
+struct SphereGeometry
+{
+    std::vector&lt;Vector3&gt; positions;
+    std::vector&lt;Vector3&gt; normals;
+    std::vector&lt;GLushort&gt; indices;
+};
+
+void CreateSphereGeometry(size_t sliceCount, float radius, SphereGeometry *result);
+
+struct CubeGeometry
+{
+    std::vector&lt;Vector3&gt; positions;
+    std::vector&lt;Vector3&gt; normals;
+    std::vector&lt;Vector2&gt; texcoords;
+    std::vector&lt;GLushort&gt; indices;
+};
+
+void GenerateCubeGeometry(float radius, CubeGeometry *result);
+
+#endif  // UTIL_GEOMETRY_UTILS_H
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilrandom_utilscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/util/random_utils.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/random_utils.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/util/random_utils.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -3,20 +3,73 @@
</span><span class="cx"> // Use of this source code is governed by a BSD-style license that can be
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><ins>+// random_utils:
+//   Helper functions for random number generation.
+//
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;random_utils.h&quot;
</span><del>-#include &lt;time.h&gt;
</del><ins>+
+#include &lt;chrono&gt;
+
</ins><span class="cx"> #include &lt;cstdlib&gt;
</span><span class="cx"> 
</span><del>-float RandomBetween(float min, float max)
</del><ins>+namespace angle
</ins><span class="cx"> {
</span><del>-    static bool randInitialized = false;
-    if (!randInitialized)
-    {
-        srand(static_cast&lt;unsigned int&gt;(time(NULL)));
-        randInitialized = true;
-    }
</del><span class="cx"> 
</span><del>-    const size_t divisor = 10000;
-    return min + ((rand() % divisor) / static_cast&lt;float&gt;(divisor)) * (max - min);
</del><ins>+// Seed from clock
+RNG::RNG()
+{
+    long long timeSeed = std::chrono::system_clock::now().time_since_epoch().count();
+    mGenerator.seed(static_cast&lt;unsigned int&gt;(timeSeed));
</ins><span class="cx"> }
</span><ins>+
+// Seed from fixed number.
+RNG::RNG(unsigned int seed) : mGenerator(seed)
+{
+}
+
+RNG::~RNG()
+{
+}
+
+void RNG::reseed(unsigned int newSeed)
+{
+    mGenerator.seed(newSeed);
+}
+
+int RNG::randomInt()
+{
+    std::uniform_int_distribution&lt;int&gt; intDistribution;
+    return intDistribution(mGenerator);
+}
+
+int RNG::randomIntBetween(int min, int max)
+{
+    std::uniform_int_distribution&lt;int&gt; intDistribution(min, max);
+    return intDistribution(mGenerator);
+}
+
+unsigned int RNG::randomUInt()
+{
+    std::uniform_int_distribution&lt;unsigned int&gt; uintDistribution;
+    return uintDistribution(mGenerator);
+}
+
+float RNG::randomFloat()
+{
+    std::uniform_real_distribution&lt;float&gt; floatDistribution;
+    return floatDistribution(mGenerator);
+}
+
+float RNG::randomFloatBetween(float min, float max)
+{
+    std::uniform_real_distribution&lt;float&gt; floatDistribution(min, max);
+    return floatDistribution(mGenerator);
+}
+
+float RNG::randomNegativeOneToOne()
+{
+    return randomFloatBetween(-1.0f, 1.0f);
+}
+
+}  // namespace angle
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilrandom_utilsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/util/random_utils.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/random_utils.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/util/random_utils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -3,10 +3,41 @@
</span><span class="cx"> // Use of this source code is governed by a BSD-style license that can be
</span><span class="cx"> // found in the LICENSE file.
</span><span class="cx"> //
</span><ins>+// random_utils:
+//   Helper functions for random number generation.
+//
</ins><span class="cx"> 
</span><span class="cx"> #ifndef UTIL_RANDOM_UTILS_H
</span><span class="cx"> #define UTIL_RANDOM_UTILS_H
</span><span class="cx"> 
</span><del>-float RandomBetween(float min, float max);
</del><ins>+// TODO(jmadill): Rework this if Chromium decides to ban &lt;random&gt;
+#include &lt;random&gt;
</ins><span class="cx"> 
</span><ins>+namespace angle
+{
+
+class RNG
+{
+  public:
+    // Seed from clock
+    RNG();
+    // Seed from fixed number.
+    RNG(unsigned int seed);
+    ~RNG();
+
+    void reseed(unsigned int newSeed);
+
+    int randomInt();
+    int randomIntBetween(int min, int max);
+    unsigned int randomUInt();
+    float randomFloat();
+    float randomFloatBetween(float min, float max);
+    float randomNegativeOneToOne();
+
+  private:
+    std::default_random_engine mGenerator;
+};
+
+}  // namespace angle
+
</ins><span class="cx"> #endif // UTIL_RANDOM_UTILS_H
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilshader_utilscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/util/shader_utils.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/shader_utils.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/util/shader_utils.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -12,7 +12,7 @@
</span><span class="cx"> 
</span><span class="cx"> static std::string ReadFileToString(const std::string &amp;source)
</span><span class="cx"> {
</span><del>-    std::ifstream stream(source);
</del><ins>+    std::ifstream stream(source.c_str());
</ins><span class="cx">     if (!stream)
</span><span class="cx">     {
</span><span class="cx">         std::cerr &lt;&lt; &quot;Failed to load shader file: &quot; &lt;&lt; source;
</span><span class="lines">@@ -46,11 +46,19 @@
</span><span class="cx">         GLint infoLogLength;
</span><span class="cx">         glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &amp;infoLogLength);
</span><span class="cx"> 
</span><del>-        std::vector&lt;GLchar&gt; infoLog(infoLogLength);
-        glGetShaderInfoLog(shader, infoLog.size(), NULL, &amp;infoLog[0]);
</del><ins>+        // Info log length includes the null terminator, so 1 means that the info log is an empty
+        // string.
+        if (infoLogLength &gt; 1)
+        {
+            std::vector&lt;GLchar&gt; infoLog(infoLogLength);
+            glGetShaderInfoLog(shader, static_cast&lt;GLsizei&gt;(infoLog.size()), NULL, &amp;infoLog[0]);
+            std::cerr &lt;&lt; &quot;shader compilation failed: &quot; &lt;&lt; &amp;infoLog[0];
+        }
+        else
+        {
+            std::cerr &lt;&lt; &quot;shader compilation failed. &lt;Empty log message&gt;&quot;;
+        }
</ins><span class="cx"> 
</span><del>-        std::cerr &lt;&lt; &quot;shader compilation failed: &quot; &lt;&lt; &amp;infoLog[0];
-
</del><span class="cx">         glDeleteShader(shader);
</span><span class="cx">         shader = 0;
</span><span class="cx">     }
</span><span class="lines">@@ -69,7 +77,11 @@
</span><span class="cx">     return CompileShader(type, source);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLuint CompileProgram(const std::string &amp;vsSource, const std::string &amp;fsSource)
</del><ins>+GLuint CompileProgramWithTransformFeedback(
+    const std::string &amp;vsSource,
+    const std::string &amp;fsSource,
+    const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings,
+    GLenum bufferMode)
</ins><span class="cx"> {
</span><span class="cx">     GLuint program = glCreateProgram();
</span><span class="cx"> 
</span><span class="lines">@@ -90,6 +102,19 @@
</span><span class="cx">     glAttachShader(program, fs);
</span><span class="cx">     glDeleteShader(fs);
</span><span class="cx"> 
</span><ins>+    if (transformFeedbackVaryings.size() &gt; 0)
+    {
+        std::vector&lt;const char *&gt; constCharTFVaryings;
+
+        for (const std::string &amp;transformFeedbackVarying : transformFeedbackVaryings)
+        {
+            constCharTFVaryings.push_back(transformFeedbackVarying.c_str());
+        }
+
+        glTransformFeedbackVaryings(program, static_cast&lt;GLsizei&gt;(transformFeedbackVaryings.size()),
+                                    &amp;constCharTFVaryings[0], bufferMode);
+    }
+
</ins><span class="cx">     glLinkProgram(program);
</span><span class="cx"> 
</span><span class="cx">     GLint linkStatus;
</span><span class="lines">@@ -100,10 +125,19 @@
</span><span class="cx">         GLint infoLogLength;
</span><span class="cx">         glGetProgramiv(program, GL_INFO_LOG_LENGTH, &amp;infoLogLength);
</span><span class="cx"> 
</span><del>-        std::vector&lt;GLchar&gt; infoLog(infoLogLength);
-        glGetProgramInfoLog(program, infoLog.size(), NULL, &amp;infoLog[0]);
</del><ins>+        // Info log length includes the null terminator, so 1 means that the info log is an empty
+        // string.
+        if (infoLogLength &gt; 1)
+        {
+            std::vector&lt;GLchar&gt; infoLog(infoLogLength);
+            glGetProgramInfoLog(program, static_cast&lt;GLsizei&gt;(infoLog.size()), nullptr, &amp;infoLog[0]);
</ins><span class="cx"> 
</span><del>-        std::cerr &lt;&lt; &quot;program link failed: &quot; &lt;&lt; &amp;infoLog[0];
</del><ins>+            std::cerr &lt;&lt; &quot;program link failed: &quot; &lt;&lt; &amp;infoLog[0];
+        }
+        else
+        {
+            std::cerr &lt;&lt; &quot;program link failed. &lt;Empty log message&gt;&quot;;
+        }
</ins><span class="cx"> 
</span><span class="cx">         glDeleteProgram(program);
</span><span class="cx">         return 0;
</span><span class="lines">@@ -112,6 +146,12 @@
</span><span class="cx">     return program;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+GLuint CompileProgram(const std::string &amp;vsSource, const std::string &amp;fsSource)
+{
+    std::vector&lt;std::string&gt; emptyVector;
+    return CompileProgramWithTransformFeedback(vsSource, fsSource, emptyVector, GL_NONE);
+}
+
</ins><span class="cx"> GLuint CompileProgramFromFiles(const std::string &amp;vsPath, const std::string &amp;fsPath)
</span><span class="cx"> {
</span><span class="cx">     std::string vsSource = ReadFileToString(vsPath);
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilshader_utilsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/util/shader_utils.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/shader_utils.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/util/shader_utils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -7,22 +7,25 @@
</span><span class="cx"> #ifndef SAMPLE_UTIL_SHADER_UTILS_H
</span><span class="cx"> #define SAMPLE_UTIL_SHADER_UTILS_H
</span><span class="cx"> 
</span><del>-#define GL_GLEXT_PROTOTYPES
-
</del><span class="cx"> #include &lt;GLES3/gl3.h&gt;
</span><del>-#include &lt;GLES3/gl3ext.h&gt;
</del><span class="cx"> #include &lt;GLES2/gl2.h&gt;
</span><span class="cx"> #include &lt;GLES2/gl2ext.h&gt;
</span><span class="cx"> #include &lt;EGL/egl.h&gt;
</span><span class="cx"> #include &lt;EGL/eglext.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;string&gt;
</span><ins>+#include &lt;vector&gt;
</ins><span class="cx"> 
</span><span class="cx"> #define SHADER_SOURCE(...) #__VA_ARGS__
</span><span class="cx"> 
</span><span class="cx"> GLuint CompileShader(GLenum type, const std::string &amp;source);
</span><span class="cx"> GLuint CompileShaderFromFile(GLenum type, const std::string &amp;sourcePath);
</span><span class="cx"> 
</span><ins>+GLuint CompileProgramWithTransformFeedback(
+    const std::string &amp;vsSource,
+    const std::string &amp;fsSource,
+    const std::vector&lt;std::string&gt; &amp;transformFeedbackVaryings,
+    GLenum bufferMode);
</ins><span class="cx"> GLuint CompileProgram(const std::string &amp;vsSource, const std::string &amp;fsSource);
</span><span class="cx"> GLuint CompileProgramFromFiles(const std::string &amp;vsPath, const std::string &amp;fsPath);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilsystem_utilsh"></a>
<div class="addfile"><h4>Added: trunk/Source/ThirdParty/ANGLE/util/system_utils.h (0 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/system_utils.h                                (rev 0)
+++ trunk/Source/ThirdParty/ANGLE/util/system_utils.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+//
+// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// system_utils.h: declaration of OS-specific utility functions
+
+#ifndef SAMPLE_UTIL_PATH_UTILS_H
+#define SAMPLE_UTIL_PATH_UTILS_H
+
+#include &lt;string&gt;
+
+namespace angle
+{
+
+std::string GetExecutablePath();
+std::string GetExecutableDirectory();
+
+// Cross platform equivalent of the Windows Sleep function
+void Sleep(unsigned int milliseconds);
+
+void SetLowPriorityProcess();
+
+// Write a debug message, either to a standard output or Debug window.
+void WriteDebugMessage(const char *format, ...);
+
+} // namespace angle
+
+#endif // SAMPLE_UTIL_PATH_UTILS_H
</ins></span></pre></div>
<a id="trunkSourceThirdPartyANGLEutilutilgyp"></a>
<div class="modfile"><h4>Modified: trunk/Source/ThirdParty/ANGLE/util/util.gyp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/ThirdParty/ANGLE/util/util.gyp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/ThirdParty/ANGLE/util/util.gyp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -3,65 +3,181 @@
</span><span class="cx"> # found in the LICENSE file.
</span><span class="cx"> 
</span><span class="cx"> {
</span><del>-    'conditions':
</del><ins>+    # Everything below  this is duplicated in the GN build, except Mac support.
+    # If you change anything also change angle/BUILD.gn
+    'variables':
+    {
+        'util_sources':
+        [
+            'com_utils.h',
+            'keyboard.h',
+            'geometry_utils.cpp',
+            'geometry_utils.h',
+            'mouse.h',
+            'random_utils.cpp',
+            'random_utils.h',
+            'shader_utils.cpp',
+            'shader_utils.h',
+            'system_utils.h',
+            'Event.h',
+            'EGLWindow.cpp',
+            'EGLWindow.h',
+            'Matrix.cpp',
+            'Matrix.h',
+            'OSPixmap.h',
+            'OSWindow.cpp',
+            'OSWindow.h',
+            'Timer.h',
+            'Vector.cpp',
+            'Vector.h',
+        ],
+        'util_win32_sources':
+        [
+            'windows/win32/Win32_system_utils.cpp',
+            'windows/win32/Win32Pixmap.cpp',
+            'windows/win32/Win32Pixmap.h',
+            'windows/win32/Win32Window.cpp',
+            'windows/win32/Win32Window.h',
+            'windows/Windows_system_utils.cpp',
+            'windows/WindowsTimer.cpp',
+            'windows/WindowsTimer.h',
+        ],
+        'util_winrt_sources':
+        [
+            'windows/winrt/WinRT_system_utils.cpp',
+            'windows/winrt/WinRTPixmap.cpp',
+            'windows/winrt/WinRTWindow.cpp',
+            'windows/winrt/WinRTWindow.h',
+            'windows/Windows_system_utils.cpp',
+            'windows/WindowsTimer.cpp',
+            'windows/WindowsTimer.h',
+        ],
+        'util_linux_sources':
+        [
+            'linux/Linux_system_utils.cpp',
+            'linux/LinuxTimer.cpp',
+            'linux/LinuxTimer.h',
+            'posix/Posix_system_utils.cpp',
+        ],
+        'util_x11_sources':
+        [
+            'x11/X11Pixmap.cpp',
+            'x11/X11Pixmap.h',
+            'x11/X11Window.cpp',
+            'x11/X11Window.h',
+        ],
+        'util_osx_sources':
+        [
+            'osx/OSX_system_utils.cpp',
+            'osx/OSXTimer.cpp',
+            'osx/OSXTimer.h',
+            'osx/OSXPixmap.mm',
+            'osx/OSXPixmap.h',
+            'osx/OSXWindow.mm',
+            'osx/OSXWindow.h',
+            'posix/Posix_system_utils.cpp',
+        ],
+    },
+    'targets':
</ins><span class="cx">     [
</span><del>-        ['OS==&quot;win&quot;',
</del><span class="cx">         {
</span><del>-            'targets':
</del><ins>+            'target_name': 'angle_util',
+            'type': 'static_library',
+            'includes': [ '../build/common_defines.gypi', ],
+            'dependencies':
</ins><span class="cx">             [
</span><ins>+                '&lt;(angle_path)/src/angle.gyp:angle_common',
+                '&lt;(angle_path)/src/angle.gyp:libEGL',
+                '&lt;(angle_path)/src/angle.gyp:libGLESv2',
+            ],
+            'export_dependent_settings':
+            [
+                '&lt;(angle_path)/src/angle.gyp:angle_common',
+            ],
+            'include_dirs':
+            [
+                '&lt;(angle_path)/include',
+                '&lt;(angle_path)/util',
+            ],
+            'sources':
+            [
+                '&lt;@(util_sources)',
+            ],
+            'defines':
+            [
+                'GL_GLEXT_PROTOTYPES',
+                'EGL_EGLEXT_PROTOTYPES',
+            ],
+            'direct_dependent_settings':
+            {
+                'include_dirs':
+                [
+                    '&lt;(angle_path)/include',
+                    '&lt;(angle_path)/util',
+                ],
+                'defines':
+                [
+                    'GL_GLEXT_PROTOTYPES',
+                    'EGL_EGLEXT_PROTOTYPES',
+                ],
+            },
+            'conditions':
+            [
+                ['OS==&quot;win&quot; and angle_build_winrt==0',
</ins><span class="cx">                 {
</span><del>-                    'target_name': 'angle_util',
-                    'type': 'static_library',
-                    'includes': [ '../build/common_defines.gypi', ],
-                    'dependencies':
</del><ins>+                    'sources':
</ins><span class="cx">                     [
</span><del>-                        '&lt;(angle_path)/src/angle.gyp:angle_common',
-                        '&lt;(angle_path)/src/angle.gyp:libEGL',
-                        '&lt;(angle_path)/src/angle.gyp:libGLESv2',
</del><ins>+                        '&lt;@(util_win32_sources)',
</ins><span class="cx">                     ],
</span><del>-                    'export_dependent_settings':
</del><ins>+                }],
+                ['OS==&quot;win&quot; and angle_build_winrt==1',
+                {
+                    'sources':
</ins><span class="cx">                     [
</span><del>-                        '&lt;(angle_path)/src/angle.gyp:angle_common',
</del><ins>+                        '&lt;@(util_winrt_sources)',
</ins><span class="cx">                     ],
</span><del>-                    'include_dirs':
</del><ins>+                }],
+                ['OS==&quot;linux&quot;',
+                {
+                    'sources':
</ins><span class="cx">                     [
</span><del>-                        '&lt;(angle_path)/include',
-                        '&lt;(angle_path)/util',
</del><ins>+                        '&lt;@(util_linux_sources)',
</ins><span class="cx">                     ],
</span><ins>+                }],
+                ['use_x11==1',
+                {
</ins><span class="cx">                     'sources':
</span><span class="cx">                     [
</span><del>-                        'com_utils.h',
-                        'keyboard.h',
-                        'mouse.h',
-                        'path_utils.h',
-                        'random_utils.cpp',
-                        'random_utils.h',
-                        'shader_utils.cpp',
-                        'shader_utils.h',
-                        'testfixturetypes.h',
-                        'EGLWindow.cpp',
-                        'EGLWindow.h',
-                        'Event.h',
-                        'OSWindow.cpp',
-                        'OSWindow.h',
-                        'Timer.h',
-                        'win32/Win32_path_utils.cpp',
-                        'win32/Win32Timer.cpp',
-                        'win32/Win32Timer.h',
-                        'win32/Win32Window.cpp',
-                        'win32/Win32Window.h',
</del><ins>+                        '&lt;@(util_x11_sources)',
</ins><span class="cx">                     ],
</span><del>-                    'msvs_disabled_warnings': [ 4201 ],
-                    'direct_dependent_settings':
</del><ins>+                    'link_settings':
</ins><span class="cx">                     {
</span><del>-                        'include_dirs':
</del><ins>+                        'ldflags':
</ins><span class="cx">                         [
</span><del>-                            '&lt;(angle_path)/include',
-                            '&lt;(angle_path)/util',
</del><ins>+                            '&lt;!@(&lt;(pkg-config) --libs-only-L --libs-only-other x11 xi)',
</ins><span class="cx">                         ],
</span><ins>+                        'libraries':
+                        [
+                            '&lt;!@(&lt;(pkg-config) --libs-only-l x11 xi)',
+                        ],
</ins><span class="cx">                     },
</span><del>-                },
</del><ins>+                }],
+                ['OS==&quot;mac&quot;',
+                {
+                    'sources':
+                    [
+                        '&lt;@(util_osx_sources)',
+                    ],
+                    'link_settings':
+                    {
+                        'libraries':
+                        [
+                            '$(SDKROOT)/System/Library/Frameworks/AppKit.framework',
+                            '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework',
+                        ],
+                    },
+                }],
</ins><span class="cx">             ],
</span><del>-        }],
</del><ins>+        },
</ins><span class="cx">     ],
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/WebCore/CMakeLists.txt        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -3225,6 +3225,7 @@
</span><span class="cx">     )
</span><span class="cx"> 
</span><span class="cx">     list(APPEND ANGLESupport_SOURCES
</span><ins>+        ${THIRDPARTY_DIR}/ANGLE/src/common/Float16ToFloat32.cpp
</ins><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/common/angleutils.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/common/debug.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/common/event_tracer.cpp
</span><span class="lines">@@ -3240,9 +3241,11 @@
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/BuiltInFunctionEmulator.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/BuiltInFunctionEmulatorHLSL.cpp
</span><ins>+        ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/Cache.cpp
</ins><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/CallDAG.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/CodeGen.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/Compiler.cpp
</span><ins>+        ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/DeferGlobalInitializers.cpp
</ins><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/Diagnostics.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/DirectiveHandler.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/EmulatePrecision.cpp
</span><span class="lines">@@ -3265,13 +3268,13 @@
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/OutputGLSL.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/OutputGLSLBase.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/OutputHLSL.cpp
</span><del>-        ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/parseConst.cpp
</del><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/ParseContext.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/PoolAlloc.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/PruneEmptyDeclarations.cpp
</span><del>-        ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/QualifierAlive.cpp
</del><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/RegenerateStructNames.cpp
</span><ins>+        ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/RemovePow.cpp
</ins><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/RemoveSwitchFallThrough.cpp
</span><ins>+        ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/RewriteDoWhile.cpp
</ins><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/RewriteElseBlocks.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/ScalarizeVecAndMatConstructorArgs.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/SearchSymbol.cpp
</span><span class="lines">@@ -3279,7 +3282,6 @@
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/SeparateDeclarations.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/ShaderLang.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/ShaderVars.cpp
</span><del>-        ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/SimplifyArrayAssignment.cpp
</del><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/StructureHLSL.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/SymbolTable.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/TranslatorESSL.cpp
</span><span class="lines">@@ -3287,11 +3289,12 @@
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/TranslatorHLSL.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/Types.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/UnfoldShortCircuitAST.cpp
</span><del>-        ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/UnfoldShortCircuit.cpp
</del><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/UniformHLSL.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/util.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/UtilsHLSL.cpp
</span><ins>+        ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/ValidateGlobalInitializer.cpp
</ins><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/ValidateLimitations.cpp
</span><ins>+        ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/ValidateMaxParameters.cpp
</ins><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/ValidateOutputs.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/ValidateSwitch.cpp
</span><span class="cx">         ${THIRDPARTY_DIR}/ANGLE/src/compiler/translator/VariableInfo.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/WebCore/ChangeLog        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-04-19  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Update ANGLE
+        https://bugs.webkit.org/show_bug.cgi?id=156755
+
+        Reviewed by Dean Jackson.
+
+        * CMakeLists.txt:
+        * platform/graphics/ANGLEWebKitBridge.h:
+        (WebCore::ANGLEWebKitBridge::getResources):
+        * platform/graphics/cairo/GraphicsContext3DCairo.cpp:
+        (WebCore::GraphicsContext3D::GraphicsContext3D):
+        Continue to compile successfully with new ANGLE.
+
</ins><span class="cx"> 2016-04-19  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Mark more classes as WTF_MAKE_FAST_ALLOCATED
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsANGLEWebKitBridgeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ANGLEWebKitBridge.h (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ANGLEWebKitBridge.h        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/WebCore/platform/graphics/ANGLEWebKitBridge.h        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -81,7 +81,7 @@
</span><span class="cx"> class ANGLEWebKitBridge {
</span><span class="cx"> public:
</span><span class="cx"> 
</span><del>-    ANGLEWebKitBridge(ShShaderOutput = SH_GLSL_OUTPUT, ShShaderSpec = SH_WEBGL_SPEC);
</del><ins>+    ANGLEWebKitBridge(ShShaderOutput = SH_GLSL_COMPATIBILITY_OUTPUT, ShShaderSpec = SH_WEBGL_SPEC);
</ins><span class="cx">     ~ANGLEWebKitBridge();
</span><span class="cx">     
</span><span class="cx">     ShBuiltInResources getResources() { return m_resources; }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscairoGraphicsContext3DCairocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp (199737 => 199738)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp        2016-04-19 19:35:34 UTC (rev 199737)
+++ trunk/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp        2016-04-19 19:46:21 UTC (rev 199738)
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx"> GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attributes, HostWindow*, GraphicsContext3D::RenderStyle renderStyle)
</span><span class="cx">     : m_currentWidth(0)
</span><span class="cx">     , m_currentHeight(0)
</span><del>-    , m_compiler(isGLES2Compliant() ? SH_ESSL_OUTPUT : SH_GLSL_OUTPUT)
</del><ins>+    , m_compiler(isGLES2Compliant() ? SH_ESSL_OUTPUT : SH_GLSL_COMPATIBILITY_OUTPUT)
</ins><span class="cx">     , m_attrs(attributes)
</span><span class="cx">     , m_texture(0)
</span><span class="cx">     , m_compositorTexture(0)
</span></span></pre>
</div>
</div>

</body>
</html>