Re-landing after fixing D3D9 specific issues.
HLSL doesn't support dynamic indexing of matrices and vectors, so replace
that with helper functions that unroll dynamic indexing into switch/case
and static indexing.
Both the indexed vector/matrix expression and the index may have side
effects, and these will be evaluated correctly. If necessary, index
expressions that have side effects will be written to a temporary
variable that will replace the index.
Besides dEQP tests, this change is tested by a WebGL 2 conformance test.
In the case that a dynamic index is out-of-range, the base ESSL 3.00 spec
allows undefined behavior. KHR_robust_buffer_access_behavior adds the
requirement that program termination should not occur and that
out-of-range reads must return either a value from the active program's
memory or zero, and out-of-range writes should only affect the active
program's memory or do nothing. This patch clamps out-of-range indices so
that either the first or last item of the matrix/vector is accessed.
The code is not transformed in case the it fits within the limited subset
of ESSL 1.00 given in Appendix A of the spec. If the code isn't within
the restricted subset, even ESSL 1.00 shaders may require this
workaround.
BUG=angleproject:1116
TEST=dEQP-GLES3.functional.shaders.indexing.* (all pass after change)
WebGL 2 conformance tests (glsl3/vector-dynamic-indexing.html)
Change-Id: I66a5e5a8d7f4267da0045f1cc2ba6b0dc7eb3f5d
Reviewed-on: https://chromium-review.googlesource.com/296671Reviewed-by:
Jamie Madill <jmadill@chromium.org>
Tryjob-Request: Jamie Madill <jmadill@chromium.org>
Tested-by:
Jamie Madill <jmadill@chromium.org>
Reviewed-by:
Zhenyao Mo <zmo@chromium.org>
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| depgraph | Loading commit data... | |
| timing | Loading commit data... | |
| 64bit-lexer-safety.patch | Loading commit data... | |
| ASTMetadataHLSL.cpp | Loading commit data... | |
| ASTMetadataHLSL.h | Loading commit data... | |
| ArrayReturnValueToOutParameter.cpp | Loading commit data... | |
| ArrayReturnValueToOutParameter.h | Loading commit data... | |
| BaseTypes.h | Loading commit data... | |
| BuiltInFunctionEmulator.cpp | Loading commit data... | |
| BuiltInFunctionEmulator.h | Loading commit data... | |
| BuiltInFunctionEmulatorGLSL.cpp | Loading commit data... | |
| BuiltInFunctionEmulatorGLSL.h | Loading commit data... | |
| BuiltInFunctionEmulatorHLSL.cpp | Loading commit data... | |
| BuiltInFunctionEmulatorHLSL.h | Loading commit data... | |
| Cache.cpp | Loading commit data... | |
| Cache.h | Loading commit data... | |
| CallDAG.cpp | Loading commit data... | |
| CallDAG.h | Loading commit data... | |
| CodeGen.cpp | Loading commit data... | |
| Common.h | Loading commit data... | |
| Compiler.cpp | Loading commit data... | |
| Compiler.h | Loading commit data... | |
| ConstantUnion.h | Loading commit data... | |
| Diagnostics.cpp | Loading commit data... | |
| Diagnostics.h | Loading commit data... | |
| DirectiveHandler.cpp | Loading commit data... | |
| DirectiveHandler.h | Loading commit data... | |
| EmulatePrecision.cpp | Loading commit data... | |
| EmulatePrecision.h | Loading commit data... | |
| ExtensionBehavior.h | Loading commit data... | |
| FlagStd140Structs.cpp | Loading commit data... | |
| FlagStd140Structs.h | Loading commit data... | |
| ForLoopUnroll.cpp | Loading commit data... | |
| ForLoopUnroll.h | Loading commit data... | |
| HashNames.h | Loading commit data... | |
| InfoSink.cpp | Loading commit data... | |
| InfoSink.h | Loading commit data... | |
| Initialize.cpp | Loading commit data... | |
| Initialize.h | Loading commit data... | |
| InitializeDll.cpp | Loading commit data... | |
| InitializeDll.h | Loading commit data... | |
| InitializeGlobals.h | Loading commit data... | |
| InitializeParseContext.cpp | Loading commit data... | |
| InitializeParseContext.h | Loading commit data... | |
| InitializeVariables.cpp | Loading commit data... | |
| InitializeVariables.h | Loading commit data... | |
| IntermNode.cpp | Loading commit data... | |
| IntermNode.h | Loading commit data... | |
| IntermTraverse.cpp | Loading commit data... | |
| Intermediate.cpp | Loading commit data... | |
| Intermediate.h | Loading commit data... | |
| LoopInfo.cpp | Loading commit data... | |
| LoopInfo.h | Loading commit data... | |
| MMap.h | Loading commit data... | |
| NodeSearch.h | Loading commit data... | |
| Operator.cpp | Loading commit data... | |
| Operator.h | Loading commit data... | |
| OutputESSL.cpp | Loading commit data... | |
| OutputESSL.h | Loading commit data... | |
| OutputGLSL.cpp | Loading commit data... | |
| OutputGLSL.h | Loading commit data... | |
| OutputGLSLBase.cpp | Loading commit data... | |
| OutputGLSLBase.h | Loading commit data... | |
| OutputHLSL.cpp | Loading commit data... | |
| OutputHLSL.h | Loading commit data... | |
| ParseContext.cpp | Loading commit data... | |
| ParseContext.h | Loading commit data... | |
| PoolAlloc.cpp | Loading commit data... | |
| PoolAlloc.h | Loading commit data... | |
| Pragma.h | Loading commit data... | |
| PruneEmptyDeclarations.cpp | Loading commit data... | |
| PruneEmptyDeclarations.h | Loading commit data... | |
| RecordConstantPrecision.cpp | Loading commit data... | |
| RecordConstantPrecision.h | Loading commit data... | |
| RegenerateStructNames.cpp | Loading commit data... | |
| RegenerateStructNames.h | Loading commit data... | |
| RemoveDynamicIndexing.cpp | Loading commit data... | |
| RemoveDynamicIndexing.h | Loading commit data... | |
| RemovePow.cpp | Loading commit data... | |
| RemovePow.h | Loading commit data... | |
| RemoveSwitchFallThrough.cpp | Loading commit data... | |
| RemoveSwitchFallThrough.h | Loading commit data... | |
| RenameFunction.h | Loading commit data... | |
| RewriteElseBlocks.cpp | Loading commit data... | |
| RewriteElseBlocks.h | Loading commit data... | |
| ScalarizeVecAndMatConstructorArgs.cpp | Loading commit data... | |
| ScalarizeVecAndMatConstructorArgs.h | Loading commit data... | |
| SearchSymbol.cpp | Loading commit data... | |
| SearchSymbol.h | Loading commit data... | |
| SeparateArrayInitialization.cpp | Loading commit data... | |
| SeparateArrayInitialization.h | Loading commit data... | |
| SeparateDeclarations.cpp | Loading commit data... | |
| SeparateDeclarations.h | Loading commit data... | |
| SeparateExpressionsReturningArrays.cpp | Loading commit data... | |
| SeparateExpressionsReturningArrays.h | Loading commit data... | |
| ShaderLang.cpp | Loading commit data... | |
| ShaderVars.cpp | Loading commit data... | |
| StructureHLSL.cpp | Loading commit data... | |
| StructureHLSL.h | Loading commit data... | |
| SymbolTable.cpp | Loading commit data... | |
| SymbolTable.h | Loading commit data... | |
| TranslatorESSL.cpp | Loading commit data... | |
| TranslatorESSL.h | Loading commit data... | |
| TranslatorGLSL.cpp | Loading commit data... | |
| TranslatorGLSL.h | Loading commit data... | |
| TranslatorHLSL.cpp | Loading commit data... | |
| TranslatorHLSL.h | Loading commit data... | |
| Types.cpp | Loading commit data... | |
| Types.h | Loading commit data... | |
| UnfoldShortCircuitAST.cpp | Loading commit data... | |
| UnfoldShortCircuitAST.h | Loading commit data... | |
| UnfoldShortCircuitToIf.cpp | Loading commit data... | |
| UnfoldShortCircuitToIf.h | Loading commit data... | |
| UniformHLSL.cpp | Loading commit data... | |
| UniformHLSL.h | Loading commit data... | |
| UtilsHLSL.cpp | Loading commit data... | |
| UtilsHLSL.h | Loading commit data... | |
| ValidateGlobalInitializer.cpp | Loading commit data... | |
| ValidateGlobalInitializer.h | Loading commit data... | |
| ValidateLimitations.cpp | Loading commit data... | |
| ValidateLimitations.h | Loading commit data... | |
| ValidateOutputs.cpp | Loading commit data... | |
| ValidateOutputs.h | Loading commit data... | |
| ValidateSwitch.cpp | Loading commit data... | |
| ValidateSwitch.h | Loading commit data... | |
| VariableInfo.cpp | Loading commit data... | |
| VariableInfo.h | Loading commit data... | |
| VariablePacker.cpp | Loading commit data... | |
| VariablePacker.h | Loading commit data... | |
| VersionGLSL.cpp | Loading commit data... | |
| VersionGLSL.h | Loading commit data... | |
| blocklayout.cpp | Loading commit data... | |
| blocklayout.h | Loading commit data... | |
| blocklayoutHLSL.cpp | Loading commit data... | |
| blocklayoutHLSL.h | Loading commit data... | |
| generate_parser.sh | Loading commit data... | |
| glslang.h | Loading commit data... | |
| glslang.l | Loading commit data... | |
| glslang.y | Loading commit data... | |
| glslang_lex.cpp | Loading commit data... | |
| glslang_tab.cpp | Loading commit data... | |
| glslang_tab.h | Loading commit data... | |
| intermOut.cpp | Loading commit data... | |
| length_limits.h | Loading commit data... | |
| parseConst.cpp | Loading commit data... | |
| util.cpp | Loading commit data... | |
| util.h | Loading commit data... |