Commit 60015ff6 by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Redo RewriteStructSamplers

This transformation is split into two. The first transformation solely takes out the samplers out of structs, and potentially generates array of array of samplers. A second transformation is added that takes any array of array of opaque uniforms and flattens it. A follow up change will simplify RewriteAtomicCounters which also handles array of arrays (which is no longer possible), and removes dependency on shaderStorageBufferArrayDynamicIndexing. Bug: angleproject:2703 Bug: angleproject:3881 Bug: angleproject:4071 Bug: angleproject:4211 Change-Id: I352bb2bbe65ac49f4d7d753c0ba3160fa3cc925a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2628138 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 9f09435b
...@@ -305,9 +305,7 @@ const ShCompileOptions SH_TAKE_VIDEO_TEXTURE_AS_EXTERNAL_OES = UINT64_C(1) << 45 ...@@ -305,9 +305,7 @@ const ShCompileOptions SH_TAKE_VIDEO_TEXTURE_AS_EXTERNAL_OES = UINT64_C(1) << 45
// If requested, validates the AST after every transformation. Useful for debugging. // If requested, validates the AST after every transformation. Useful for debugging.
const ShCompileOptions SH_VALIDATE_AST = UINT64_C(1) << 46; const ShCompileOptions SH_VALIDATE_AST = UINT64_C(1) << 46;
// Use old version of RewriteStructSamplers, which doesn't produce as many // Bit 47 is available
// sampler arrays in parameters. This causes a few tests to pass on Android.
const ShCompileOptions SH_USE_OLD_REWRITE_STRUCT_SAMPLERS = UINT64_C(1) << 47;
// This flag works around a inconsistent behavior in Mac AMD driver where gl_VertexID doesn't // This flag works around a inconsistent behavior in Mac AMD driver where gl_VertexID doesn't
// include base vertex value. It replaces gl_VertexID with (gl_VertexID + angle_BaseVertex) // include base vertex value. It replaces gl_VertexID with (gl_VertexID + angle_BaseVertex)
......
...@@ -255,14 +255,6 @@ struct FeaturesVk : FeatureSetBase ...@@ -255,14 +255,6 @@ struct FeaturesVk : FeatureSetBase
"Seamful cube map emulation misbehaves on some drivers, so it's disallowed", &members, "Seamful cube map emulation misbehaves on some drivers, so it's disallowed", &members,
"http://anglebug.com/3243"}; "http://anglebug.com/3243"};
// Qualcomm and SwiftShader shader compiler doesn't support sampler arrays as parameters, so
// revert to old RewriteStructSamplers behavior, which produces fewer.
Feature forceOldRewriteStructSamplers = {
"forceOldRewriteStructSamplers", FeatureCategory::VulkanWorkarounds,
"Some shader compilers don't support sampler arrays as parameters, so revert to old "
"RewriteStructSamplers behavior, which produces fewer.",
&members, "http://anglebug.com/2703"};
// Vulkan considers vertex attribute accesses to count up to the last multiple of the stride. // Vulkan considers vertex attribute accesses to count up to the last multiple of the stride.
// This additional access supports AMD's robust buffer access implementation. // This additional access supports AMD's robust buffer access implementation.
// AMDVLK in particular will return incorrect values when the vertex access extends into the // AMDVLK in particular will return incorrect values when the vertex access extends into the
......
...@@ -321,6 +321,8 @@ angle_translator_lib_vulkan_sources = [ ...@@ -321,6 +321,8 @@ angle_translator_lib_vulkan_sources = [
"src/compiler/translator/tree_ops/vulkan/RemoveAtomicCounterBuiltins.h", "src/compiler/translator/tree_ops/vulkan/RemoveAtomicCounterBuiltins.h",
"src/compiler/translator/tree_ops/vulkan/RemoveInactiveInterfaceVariables.cpp", "src/compiler/translator/tree_ops/vulkan/RemoveInactiveInterfaceVariables.cpp",
"src/compiler/translator/tree_ops/vulkan/RemoveInactiveInterfaceVariables.h", "src/compiler/translator/tree_ops/vulkan/RemoveInactiveInterfaceVariables.h",
"src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.cpp",
"src/compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.h",
"src/compiler/translator/tree_ops/vulkan/RewriteAtomicCounters.cpp", "src/compiler/translator/tree_ops/vulkan/RewriteAtomicCounters.cpp",
"src/compiler/translator/tree_ops/vulkan/RewriteAtomicCounters.h", "src/compiler/translator/tree_ops/vulkan/RewriteAtomicCounters.h",
"src/compiler/translator/tree_ops/vulkan/RewriteCubeMapSamplersAs2DArray.cpp", "src/compiler/translator/tree_ops/vulkan/RewriteCubeMapSamplersAs2DArray.cpp",
...@@ -331,7 +333,6 @@ angle_translator_lib_vulkan_sources = [ ...@@ -331,7 +333,6 @@ angle_translator_lib_vulkan_sources = [
"src/compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.h", "src/compiler/translator/tree_ops/vulkan/RewriteInterpolateAtOffset.h",
"src/compiler/translator/tree_ops/vulkan/RewriteStructSamplers.cpp", "src/compiler/translator/tree_ops/vulkan/RewriteStructSamplers.cpp",
"src/compiler/translator/tree_ops/vulkan/RewriteStructSamplers.h", "src/compiler/translator/tree_ops/vulkan/RewriteStructSamplers.h",
"src/compiler/translator/tree_ops/vulkan/RewriteStructSamplersOld.cpp",
] ]
if (is_android) { if (is_android) {
angle_translator_sources += [ angle_translator_sources += [
......
...@@ -56,10 +56,9 @@ constexpr ShCompileOptions kGLSLMacOnlyOptions = ...@@ -56,10 +56,9 @@ constexpr ShCompileOptions kGLSLMacOnlyOptions =
// Options supported by Vulkan GLSL only // Options supported by Vulkan GLSL only
constexpr ShCompileOptions kVulkanGLSLOnlyOptions = constexpr ShCompileOptions kVulkanGLSLOnlyOptions =
SH_ADD_PRE_ROTATION | SH_USE_OLD_REWRITE_STRUCT_SAMPLERS | SH_ADD_PRE_ROTATION | SH_EMULATE_SEAMFUL_CUBE_MAP_SAMPLING |
SH_EMULATE_SEAMFUL_CUBE_MAP_SAMPLING | SH_ADD_BRESENHAM_LINE_RASTER_EMULATION | SH_ADD_BRESENHAM_LINE_RASTER_EMULATION | SH_EARLY_FRAGMENT_TESTS_OPTIMIZATION |
SH_EARLY_FRAGMENT_TESTS_OPTIMIZATION | SH_USE_SPECIALIZATION_CONSTANT | SH_USE_SPECIALIZATION_CONSTANT | SH_ADD_VULKAN_XFB_EMULATION_SUPPORT_CODE;
SH_ADD_VULKAN_XFB_EMULATION_SUPPORT_CODE;
// Options supported by HLSL output only // Options supported by HLSL output only
constexpr ShCompileOptions kHLSLOnlyOptions = SH_EXPAND_SELECT_HLSL_INTEGER_POW_EXPRESSIONS | constexpr ShCompileOptions kHLSLOnlyOptions = SH_EXPAND_SELECT_HLSL_INTEGER_POW_EXPRESSIONS |
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "compiler/translator/tree_ops/vulkan/NameEmbeddedUniformStructs.h" #include "compiler/translator/tree_ops/vulkan/NameEmbeddedUniformStructs.h"
#include "compiler/translator/tree_ops/vulkan/RemoveAtomicCounterBuiltins.h" #include "compiler/translator/tree_ops/vulkan/RemoveAtomicCounterBuiltins.h"
#include "compiler/translator/tree_ops/vulkan/RemoveInactiveInterfaceVariables.h" #include "compiler/translator/tree_ops/vulkan/RemoveInactiveInterfaceVariables.h"
#include "compiler/translator/tree_ops/vulkan/RewriteArrayOfArrayOfOpaqueUniforms.h"
#include "compiler/translator/tree_ops/vulkan/RewriteAtomicCounters.h" #include "compiler/translator/tree_ops/vulkan/RewriteAtomicCounters.h"
#include "compiler/translator/tree_ops/vulkan/RewriteCubeMapSamplersAs2DArray.h" #include "compiler/translator/tree_ops/vulkan/RewriteCubeMapSamplersAs2DArray.h"
#include "compiler/translator/tree_ops/vulkan/RewriteDfdy.h" #include "compiler/translator/tree_ops/vulkan/RewriteDfdy.h"
...@@ -812,21 +813,9 @@ bool TranslatorVulkan::translateImpl(TIntermBlock *root, ...@@ -812,21 +813,9 @@ bool TranslatorVulkan::translateImpl(TIntermBlock *root,
return false; return false;
} }
bool rewriteStructSamplersResult;
int removedUniformsCount; int removedUniformsCount;
if (compileOptions & SH_USE_OLD_REWRITE_STRUCT_SAMPLERS) if (!RewriteStructSamplers(this, root, &getSymbolTable(), &removedUniformsCount))
{
rewriteStructSamplersResult =
RewriteStructSamplersOld(this, root, &getSymbolTable(), &removedUniformsCount);
}
else
{
rewriteStructSamplersResult =
RewriteStructSamplers(this, root, &getSymbolTable(), &removedUniformsCount);
}
if (!rewriteStructSamplersResult)
{ {
return false; return false;
} }
...@@ -841,6 +830,15 @@ bool TranslatorVulkan::translateImpl(TIntermBlock *root, ...@@ -841,6 +830,15 @@ bool TranslatorVulkan::translateImpl(TIntermBlock *root,
} }
} }
// Replace array of array of opaque uniforms with a flattened array. This is run after
// MonomorphizeUnsupportedFunctionsInVulkanGLSL and RewriteStructSamplers so that it's not
// possible for an array of array of opaque type to be partially subscripted and passed to a
// function.
if (!RewriteArrayOfArrayOfOpaqueUniforms(this, root, &getSymbolTable()))
{
return false;
}
// Rewrite samplerCubes as sampler2DArrays. This must be done after rewriting struct samplers // Rewrite samplerCubes as sampler2DArrays. This must be done after rewriting struct samplers
// as it doesn't expect that. // as it doesn't expect that.
if (compileOptions & SH_EMULATE_SEAMFUL_CUBE_MAP_SAMPLING) if (compileOptions & SH_EMULATE_SEAMFUL_CUBE_MAP_SAMPLING)
......
...@@ -42,6 +42,8 @@ class RemoveArrayLengthTraverser : public TIntermTraverser ...@@ -42,6 +42,8 @@ class RemoveArrayLengthTraverser : public TIntermTraverser
bool foundArrayLength() const { return mFoundArrayLength; } bool foundArrayLength() const { return mFoundArrayLength; }
private: private:
void insertSideEffectsInParentBlock(TIntermTyped *node);
bool mFoundArrayLength; bool mFoundArrayLength;
}; };
...@@ -51,12 +53,7 @@ bool RemoveArrayLengthTraverser::visitUnary(Visit visit, TIntermUnary *node) ...@@ -51,12 +53,7 @@ bool RemoveArrayLengthTraverser::visitUnary(Visit visit, TIntermUnary *node)
if (node->getOp() == EOpArrayLength && !node->getOperand()->getType().isUnsizedArray()) if (node->getOp() == EOpArrayLength && !node->getOperand()->getType().isUnsizedArray())
{ {
mFoundArrayLength = true; mFoundArrayLength = true;
if (!node->getOperand()->hasSideEffects()) insertSideEffectsInParentBlock(node->getOperand());
{
queueReplacement(node->fold(nullptr), OriginalNode::IS_DROPPED);
return false;
}
insertStatementInParentBlock(node->getOperand()->deepCopy());
TConstantUnion *constArray = new TConstantUnion[1]; TConstantUnion *constArray = new TConstantUnion[1];
constArray->setIConst(node->getOperand()->getOutermostArraySize()); constArray->setIConst(node->getOperand()->getOutermostArraySize());
queueReplacement(new TIntermConstantUnion(constArray, node->getType()), queueReplacement(new TIntermConstantUnion(constArray, node->getType()),
...@@ -66,6 +63,28 @@ bool RemoveArrayLengthTraverser::visitUnary(Visit visit, TIntermUnary *node) ...@@ -66,6 +63,28 @@ bool RemoveArrayLengthTraverser::visitUnary(Visit visit, TIntermUnary *node)
return true; return true;
} }
void RemoveArrayLengthTraverser::insertSideEffectsInParentBlock(TIntermTyped *node)
{
// If the node is an index type, traverse it and add the indices as side effects. If at the end
// an expression without side effect is encountered, such as an opaque uniform or a lone symbol,
// don't generate a statement for it.
if (!node->hasSideEffects())
{
return;
}
TIntermBinary *asBinary = node->getAsBinaryNode();
if (asBinary && !asBinary->isAssignment())
{
insertSideEffectsInParentBlock(asBinary->getLeft());
insertSideEffectsInParentBlock(asBinary->getRight());
}
else
{
insertStatementInParentBlock(node);
}
}
} // anonymous namespace } // anonymous namespace
bool RemoveArrayLengthMethod(TCompiler *compiler, TIntermBlock *root) bool RemoveArrayLengthMethod(TCompiler *compiler, TIntermBlock *root)
......
//
// Copyright 2021 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.
//
// RewriteArrayOfArrayOfOpaqueUniforms: Flatten array of array of opaque uniforms. Requires
// MonomorphizeUnsupportedFunctionsInVulkanGLSL and RewriteStructSamplers to have been run.
#ifndef COMPILER_TRANSLATOR_TREEOPS_VULKAN_REWRITEARRAYOFARRAYOFOPAQUEUNIFORMS_H_
#define COMPILER_TRANSLATOR_TREEOPS_VULKAN_REWRITEARRAYOFARRAYOFOPAQUEUNIFORMS_H_
#include "common/angleutils.h"
namespace sh
{
class TCompiler;
class TIntermBlock;
class TSymbolTable;
ANGLE_NO_DISCARD bool RewriteArrayOfArrayOfOpaqueUniforms(TCompiler *compiler,
TIntermBlock *root,
TSymbolTable *symbolTable);
} // namespace sh
#endif // COMPILER_TRANSLATOR_TREEOPS_VULKAN_REWRITEARRAYOFARRAYOFOPAQUEUNIFORMS_H_
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
// //
// RewriteStructSamplers: Extract structs from samplers. // RewriteStructSamplers: Extract structs from samplers.
// //
// This traverser is designed to strip out samplers from structs. It moves them into // This traverser is designed to strip out samplers from structs. It moves them into separate
// separate uniform sampler declarations. This allows the struct to be stored in the // uniform sampler declarations. This allows the struct to be stored in the default uniform block.
// default uniform block. It also requires that we rewrite any functions that take the // This transformation requires MonomorphizeUnsupportedFunctionsInVulkanGLSL to have been run so it
// struct as an argument. The struct is split into two arguments. // wouldn't need to deal with functions that are passed such structs.
// //
// For example: // For example:
// struct S { sampler2D samp; int i; }; // struct S { sampler2D samp; int i; };
...@@ -33,10 +33,6 @@ ANGLE_NO_DISCARD bool RewriteStructSamplers(TCompiler *compiler, ...@@ -33,10 +33,6 @@ ANGLE_NO_DISCARD bool RewriteStructSamplers(TCompiler *compiler,
TIntermBlock *root, TIntermBlock *root,
TSymbolTable *symbolTable, TSymbolTable *symbolTable,
int *removedUniformsCountOut); int *removedUniformsCountOut);
ANGLE_NO_DISCARD bool RewriteStructSamplersOld(TCompiler *compier,
TIntermBlock *root,
TSymbolTable *symbolTable,
int *removedUniformsCountOut);
} // namespace sh } // namespace sh
#endif // COMPILER_TRANSLATOR_TREEOPS_VULKAN_REWRITESTRUCTSAMPLERS_H_ #endif // COMPILER_TRANSLATOR_TREEOPS_VULKAN_REWRITESTRUCTSAMPLERS_H_
...@@ -138,22 +138,10 @@ void GlslangWarmup() ...@@ -138,22 +138,10 @@ void GlslangWarmup()
// array (except for the innermost dimension). When assigning decorations (set/binding/etc), only // array (except for the innermost dimension). When assigning decorations (set/binding/etc), only
// the indices corresponding to the first element of the array should be specified. This function // the indices corresponding to the first element of the array should be specified. This function
// is used to skip the other indices. // is used to skip the other indices.
// bool UniformNameIsIndexZero(const std::string &name)
// If useOldRewriteStructSamplers, there are multiple samplers extracted out of struct arrays
// though, so the above only applies to the sampler array defined in the struct.
bool UniformNameIsIndexZero(const std::string &name, bool excludeCheckForOwningStructArrays)
{ {
size_t lastBracketClose = 0; size_t lastBracketClose = 0;
if (excludeCheckForOwningStructArrays)
{
size_t lastDot = name.find_last_of('.');
if (lastDot != std::string::npos)
{
lastBracketClose = lastDot;
}
}
while (true) while (true)
{ {
size_t openBracket = name.find('[', lastBracketClose); size_t openBracket = name.find('[', lastBracketClose);
...@@ -998,18 +986,15 @@ void AssignTextureBindings(const GlslangSourceOptions &options, ...@@ -998,18 +986,15 @@ void AssignTextureBindings(const GlslangSourceOptions &options,
{ {
const gl::LinkedUniform &samplerUniform = uniforms[uniformIndex]; const gl::LinkedUniform &samplerUniform = uniforms[uniformIndex];
if (!options.useOldRewriteStructSamplers && if (gl::SamplerNameContainsNonZeroArrayElement(samplerUniform.name))
gl::SamplerNameContainsNonZeroArrayElement(samplerUniform.name))
{ {
continue; continue;
} }
if (UniformNameIsIndexZero(samplerUniform.name, options.useOldRewriteStructSamplers)) if (UniformNameIsIndexZero(samplerUniform.name))
{ {
// Samplers in structs are extracted and renamed. // Samplers in structs are extracted and renamed.
const std::string samplerName = options.useOldRewriteStructSamplers const std::string samplerName = GlslangGetMappedSamplerName(samplerUniform.name);
? GetMappedSamplerNameOld(samplerUniform.name)
: GlslangGetMappedSamplerName(samplerUniform.name);
// TODO: http://anglebug.com/4523: All uniforms should be active // TODO: http://anglebug.com/4523: All uniforms should be active
if (programExecutable.hasLinkedShaderStage(shaderType) && if (programExecutable.hasLinkedShaderStage(shaderType) &&
...@@ -3774,7 +3759,7 @@ bool GetImageNameWithoutIndices(std::string *name) ...@@ -3774,7 +3759,7 @@ bool GetImageNameWithoutIndices(std::string *name)
return true; return true;
} }
if (!UniformNameIsIndexZero(*name, false)) if (!UniformNameIsIndexZero(*name))
{ {
return false; return false;
} }
...@@ -3784,25 +3769,6 @@ bool GetImageNameWithoutIndices(std::string *name) ...@@ -3784,25 +3769,6 @@ bool GetImageNameWithoutIndices(std::string *name)
return true; return true;
} }
std::string GetMappedSamplerNameOld(const std::string &originalName)
{
std::string samplerName = gl::ParseResourceName(originalName, nullptr);
// Samplers in structs are extracted.
std::replace(samplerName.begin(), samplerName.end(), '.', '_');
// Samplers in arrays of structs are also extracted.
std::replace(samplerName.begin(), samplerName.end(), '[', '_');
samplerName.erase(std::remove(samplerName.begin(), samplerName.end(), ']'), samplerName.end());
if (MappedSamplerNameNeedsUserDefinedPrefix(originalName))
{
samplerName = sh::kUserDefinedNamePrefix + samplerName;
}
return samplerName;
}
std::string GlslangGetMappedSamplerName(const std::string &originalName) std::string GlslangGetMappedSamplerName(const std::string &originalName)
{ {
std::string samplerName = originalName; std::string samplerName = originalName;
......
...@@ -47,7 +47,6 @@ struct GlslangProgramInterfaceInfo ...@@ -47,7 +47,6 @@ struct GlslangProgramInterfaceInfo
struct GlslangSourceOptions struct GlslangSourceOptions
{ {
bool useOldRewriteStructSamplers = false;
bool supportsTransformFeedbackExtension = false; bool supportsTransformFeedbackExtension = false;
bool emulateTransformFeedback = false; bool emulateTransformFeedback = false;
bool emulateBresenhamLines = false; bool emulateBresenhamLines = false;
...@@ -159,7 +158,6 @@ void GlslangRelease(); ...@@ -159,7 +158,6 @@ void GlslangRelease();
bool GetImageNameWithoutIndices(std::string *name); bool GetImageNameWithoutIndices(std::string *name);
// Get the mapped sampler name after the source is transformed by GlslangGetShaderSource() // Get the mapped sampler name after the source is transformed by GlslangGetShaderSource()
std::string GetMappedSamplerNameOld(const std::string &originalName);
std::string GlslangGetMappedSamplerName(const std::string &originalName); std::string GlslangGetMappedSamplerName(const std::string &originalName);
std::string GetXfbBufferName(const uint32_t bufferIndex); std::string GetXfbBufferName(const uint32_t bufferIndex);
......
...@@ -392,7 +392,6 @@ ContextVk::ContextVk(const gl::State &state, gl::ErrorSet *errorSet, RendererVk ...@@ -392,7 +392,6 @@ ContextVk::ContextVk(const gl::State &state, gl::ErrorSet *errorSet, RendererVk
mFlipYForCurrentSurface(false), mFlipYForCurrentSurface(false),
mIsAnyHostVisibleBufferWritten(false), mIsAnyHostVisibleBufferWritten(false),
mEmulateSeamfulCubeMapSampling(false), mEmulateSeamfulCubeMapSampling(false),
mUseOldRewriteStructSamplers(false),
mOutsideRenderPassCommands(nullptr), mOutsideRenderPassCommands(nullptr),
mRenderPassCommands(nullptr), mRenderPassCommands(nullptr),
mGpuEventsEnabled(false), mGpuEventsEnabled(false),
...@@ -655,8 +654,6 @@ angle::Result ContextVk::initialize() ...@@ -655,8 +654,6 @@ angle::Result ContextVk::initialize()
mEmulateSeamfulCubeMapSampling = shouldEmulateSeamfulCubeMapSampling(); mEmulateSeamfulCubeMapSampling = shouldEmulateSeamfulCubeMapSampling();
mUseOldRewriteStructSamplers = shouldUseOldRewriteStructSamplers();
// Assign initial command buffers from queue // Assign initial command buffers from queue
mOutsideRenderPassCommands = mRenderer->getCommandBufferHelper(false); mOutsideRenderPassCommands = mRenderer->getCommandBufferHelper(false);
mRenderPassCommands = mRenderer->getCommandBufferHelper(true); mRenderPassCommands = mRenderer->getCommandBufferHelper(true);
...@@ -4580,11 +4577,6 @@ bool ContextVk::shouldEmulateSeamfulCubeMapSampling() const ...@@ -4580,11 +4577,6 @@ bool ContextVk::shouldEmulateSeamfulCubeMapSampling() const
return true; return true;
} }
bool ContextVk::shouldUseOldRewriteStructSamplers() const
{
return mRenderer->getFeatures().forceOldRewriteStructSamplers.enabled;
}
angle::Result ContextVk::onBufferReleaseToExternal(const vk::BufferHelper &buffer) angle::Result ContextVk::onBufferReleaseToExternal(const vk::BufferHelper &buffer)
{ {
if (mRenderPassCommands->usesBuffer(buffer)) if (mRenderPassCommands->usesBuffer(buffer))
......
...@@ -421,8 +421,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText ...@@ -421,8 +421,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText
bool emulateSeamfulCubeMapSampling() const { return mEmulateSeamfulCubeMapSampling; } bool emulateSeamfulCubeMapSampling() const { return mEmulateSeamfulCubeMapSampling; }
bool useOldRewriteStructSamplers() const { return mUseOldRewriteStructSamplers; }
const gl::Debug &getDebug() const { return mState.getDebug(); } const gl::Debug &getDebug() const { return mState.getDebug(); }
const gl::OverlayType *getOverlay() const { return mState.getOverlay(); } const gl::OverlayType *getOverlay() const { return mState.getOverlay(); }
...@@ -832,7 +830,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText ...@@ -832,7 +830,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText
void flushGpuEvents(double nextSyncGpuTimestampS, double nextSyncCpuTimestampS); void flushGpuEvents(double nextSyncGpuTimestampS, double nextSyncCpuTimestampS);
void handleDeviceLost(); void handleDeviceLost();
bool shouldEmulateSeamfulCubeMapSampling() const; bool shouldEmulateSeamfulCubeMapSampling() const;
bool shouldUseOldRewriteStructSamplers() const;
void clearAllGarbage(); void clearAllGarbage();
bool hasRecordedCommands(); bool hasRecordedCommands();
void dumpCommandStreamDiagnostics(); void dumpCommandStreamDiagnostics();
...@@ -952,10 +949,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText ...@@ -952,10 +949,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText
// Whether this context should do seamful cube map sampling emulation. // Whether this context should do seamful cube map sampling emulation.
bool mEmulateSeamfulCubeMapSampling; bool mEmulateSeamfulCubeMapSampling;
// Whether this context should use the old version of the
// RewriteStructSamplers pass.
bool mUseOldRewriteStructSamplers;
angle::PackedEnumMap<PipelineType, DriverUniformsDescriptorSet> mDriverUniforms; angle::PackedEnumMap<PipelineType, DriverUniformsDescriptorSet> mDriverUniforms;
// This cache should also probably include the texture index (shader location) and array // This cache should also probably include the texture index (shader location) and array
......
...@@ -28,7 +28,6 @@ GlslangSourceOptions GlslangWrapperVk::CreateSourceOptions(const angle::Features ...@@ -28,7 +28,6 @@ GlslangSourceOptions GlslangWrapperVk::CreateSourceOptions(const angle::Features
{ {
GlslangSourceOptions options; GlslangSourceOptions options;
options.useOldRewriteStructSamplers = features.forceOldRewriteStructSamplers.enabled;
options.supportsTransformFeedbackExtension = options.supportsTransformFeedbackExtension =
features.supportsTransformFeedbackExtension.enabled; features.supportsTransformFeedbackExtension.enabled;
options.emulateTransformFeedback = features.emulateTransformFeedback.enabled; options.emulateTransformFeedback = features.emulateTransformFeedback.enabled;
......
...@@ -486,7 +486,6 @@ void ProgramExecutableVk::addAtomicCounterBufferDescriptorSetDesc( ...@@ -486,7 +486,6 @@ void ProgramExecutableVk::addAtomicCounterBufferDescriptorSetDesc(
} }
void ProgramExecutableVk::addImageDescriptorSetDesc(const gl::ProgramExecutable &executable, void ProgramExecutableVk::addImageDescriptorSetDesc(const gl::ProgramExecutable &executable,
bool useOldRewriteStructSamplers,
vk::DescriptorSetLayoutDesc *descOut) vk::DescriptorSetLayoutDesc *descOut)
{ {
const std::vector<gl::ImageBinding> &imageBindings = executable.getImageBindings(); const std::vector<gl::ImageBinding> &imageBindings = executable.getImageBindings();
...@@ -498,18 +497,14 @@ void ProgramExecutableVk::addImageDescriptorSetDesc(const gl::ProgramExecutable ...@@ -498,18 +497,14 @@ void ProgramExecutableVk::addImageDescriptorSetDesc(const gl::ProgramExecutable
uint32_t uniformIndex = executable.getUniformIndexFromImageIndex(imageIndex); uint32_t uniformIndex = executable.getUniformIndexFromImageIndex(imageIndex);
const gl::LinkedUniform &imageUniform = uniforms[uniformIndex]; const gl::LinkedUniform &imageUniform = uniforms[uniformIndex];
std::string imageName = useOldRewriteStructSamplers std::string imageName = GlslangGetMappedSamplerName(imageUniform.name);
? GetMappedSamplerNameOld(imageUniform.name)
: GlslangGetMappedSamplerName(imageUniform.name);
// The front-end always binds array image units sequentially. // The front-end always binds array image units sequentially.
uint32_t arraySize = static_cast<uint32_t>(imageBinding.boundImageUnits.size()); uint32_t arraySize = static_cast<uint32_t>(imageBinding.boundImageUnits.size());
if (!useOldRewriteStructSamplers) // 2D arrays are split into multiple 1D arrays when generating LinkedUniforms. Since they
{ // are flattened into one array, ignore the nonzero elements and expand the array to the
// 2D arrays are split into multiple 1D arrays when generating // total array size.
// LinkedUniforms. Since they are flattened into one array, ignore the
// nonzero elements and expand the array to the total array size.
if (gl::SamplerNameContainsNonZeroArrayElement(imageUniform.name)) if (gl::SamplerNameContainsNonZeroArrayElement(imageUniform.name))
{ {
continue; continue;
...@@ -519,7 +514,6 @@ void ProgramExecutableVk::addImageDescriptorSetDesc(const gl::ProgramExecutable ...@@ -519,7 +514,6 @@ void ProgramExecutableVk::addImageDescriptorSetDesc(const gl::ProgramExecutable
{ {
arraySize *= outerArraySize; arraySize *= outerArraySize;
} }
}
for (const gl::ShaderType shaderType : executable.getLinkedShaderStages()) for (const gl::ShaderType shaderType : executable.getLinkedShaderStages())
{ {
...@@ -542,7 +536,6 @@ void ProgramExecutableVk::addImageDescriptorSetDesc(const gl::ProgramExecutable ...@@ -542,7 +536,6 @@ void ProgramExecutableVk::addImageDescriptorSetDesc(const gl::ProgramExecutable
void ProgramExecutableVk::addTextureDescriptorSetDesc( void ProgramExecutableVk::addTextureDescriptorSetDesc(
const gl::ProgramState &programState, const gl::ProgramState &programState,
bool useOldRewriteStructSamplers,
const gl::ActiveTextureArray<vk::TextureUnit> *activeTextures, const gl::ActiveTextureArray<vk::TextureUnit> *activeTextures,
vk::DescriptorSetLayoutDesc *descOut) vk::DescriptorSetLayoutDesc *descOut)
{ {
...@@ -556,18 +549,14 @@ void ProgramExecutableVk::addTextureDescriptorSetDesc( ...@@ -556,18 +549,14 @@ void ProgramExecutableVk::addTextureDescriptorSetDesc(
uint32_t uniformIndex = programState.getUniformIndexFromSamplerIndex(textureIndex); uint32_t uniformIndex = programState.getUniformIndexFromSamplerIndex(textureIndex);
const gl::LinkedUniform &samplerUniform = uniforms[uniformIndex]; const gl::LinkedUniform &samplerUniform = uniforms[uniformIndex];
const std::string samplerName = useOldRewriteStructSamplers const std::string samplerName = GlslangGetMappedSamplerName(samplerUniform.name);
? GetMappedSamplerNameOld(samplerUniform.name)
: GlslangGetMappedSamplerName(samplerUniform.name);
// The front-end always binds array sampler units sequentially. // The front-end always binds array sampler units sequentially.
uint32_t arraySize = static_cast<uint32_t>(samplerBinding.boundTextureUnits.size()); uint32_t arraySize = static_cast<uint32_t>(samplerBinding.boundTextureUnits.size());
if (!useOldRewriteStructSamplers) // 2D arrays are split into multiple 1D arrays when generating LinkedUniforms. Since they
{ // are flattened into one array, ignore the nonzero elements and expand the array to the
// 2D arrays are split into multiple 1D arrays when generating // total array size.
// LinkedUniforms. Since they are flattened into one array, ignore the
// nonzero elements and expand the array to the total array size.
if (gl::SamplerNameContainsNonZeroArrayElement(samplerUniform.name)) if (gl::SamplerNameContainsNonZeroArrayElement(samplerUniform.name))
{ {
continue; continue;
...@@ -577,7 +566,6 @@ void ProgramExecutableVk::addTextureDescriptorSetDesc( ...@@ -577,7 +566,6 @@ void ProgramExecutableVk::addTextureDescriptorSetDesc(
{ {
arraySize *= outerArraySize; arraySize *= outerArraySize;
} }
}
for (const gl::ShaderType shaderType : programState.getExecutable().getLinkedShaderStages()) for (const gl::ShaderType shaderType : programState.getExecutable().getLinkedShaderStages())
{ {
...@@ -857,8 +845,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout( ...@@ -857,8 +845,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout(
{ {
const gl::ProgramState *programState = programStates[shaderType]; const gl::ProgramState *programState = programStates[shaderType];
ASSERT(programState); ASSERT(programState);
addImageDescriptorSetDesc(programState->getExecutable(), addImageDescriptorSetDesc(programState->getExecutable(), &resourcesSetDesc);
contextVk->useOldRewriteStructSamplers(), &resourcesSetDesc);
} }
ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout( ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout(
...@@ -872,8 +859,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout( ...@@ -872,8 +859,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout(
{ {
const gl::ProgramState *programState = programStates[shaderType]; const gl::ProgramState *programState = programStates[shaderType];
ASSERT(programState); ASSERT(programState);
addTextureDescriptorSetDesc(*programState, contextVk->useOldRewriteStructSamplers(), addTextureDescriptorSetDesc(*programState, activeTextures, &texturesSetDesc);
activeTextures, &texturesSetDesc);
} }
ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout( ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout(
...@@ -1221,7 +1207,6 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet( ...@@ -1221,7 +1207,6 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet(
const gl::ActiveTextureArray<TextureVk *> &activeImages = contextVk->getActiveImages(); const gl::ActiveTextureArray<TextureVk *> &activeImages = contextVk->getActiveImages();
bool useOldRewriteStructSamplers = contextVk->useOldRewriteStructSamplers();
angle::HashMap<std::string, uint32_t> mappedImageNameToArrayOffset; angle::HashMap<std::string, uint32_t> mappedImageNameToArrayOffset;
// Write images. // Write images.
...@@ -1245,28 +1230,17 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet( ...@@ -1245,28 +1230,17 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet(
} }
ASSERT(descriptorSet != VK_NULL_HANDLE); ASSERT(descriptorSet != VK_NULL_HANDLE);
std::string mappedImageName; std::string mappedImageName = GlslangGetMappedSamplerName(imageUniform.name);
if (!useOldRewriteStructSamplers)
{
mappedImageName = GlslangGetMappedSamplerName(imageUniform.name);
}
else
{
mappedImageName = imageUniform.mappedName;
}
GetImageNameWithoutIndices(&mappedImageName); GetImageNameWithoutIndices(&mappedImageName);
uint32_t arrayOffset = 0; uint32_t arrayOffset = 0;
uint32_t arraySize = static_cast<uint32_t>(imageBinding.boundImageUnits.size()); uint32_t arraySize = static_cast<uint32_t>(imageBinding.boundImageUnits.size());
if (!useOldRewriteStructSamplers)
{
arrayOffset = mappedImageNameToArrayOffset[mappedImageName]; arrayOffset = mappedImageNameToArrayOffset[mappedImageName];
// Front-end generates array elements in order, so we can just increment // Front-end generates array elements in order, so we can just increment the offset each
// the offset each time we process a nested array. // time we process a nested array.
mappedImageNameToArrayOffset[mappedImageName] += arraySize; mappedImageNameToArrayOffset[mappedImageName] += arraySize;
}
VkWriteDescriptorSet *writeInfos = contextVk->allocWriteDescriptorSets(arraySize); VkWriteDescriptorSet *writeInfos = contextVk->allocWriteDescriptorSets(arraySize);
...@@ -1324,9 +1298,7 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet( ...@@ -1324,9 +1298,7 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet(
imageInfos[arrayElement].imageView = imageView->getHandle(); imageInfos[arrayElement].imageView = imageView->getHandle();
imageInfos[arrayElement].imageLayout = image->getCurrentLayout(); imageInfos[arrayElement].imageLayout = image->getCurrentLayout();
const std::string imageName = useOldRewriteStructSamplers const std::string imageName = GlslangGetMappedSamplerName(imageUniform.name);
? GetMappedSamplerNameOld(imageUniform.name)
: GlslangGetMappedSamplerName(imageUniform.name);
const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, imageName); const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, imageName);
writeInfos[arrayElement].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writeInfos[arrayElement].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
...@@ -1463,7 +1435,6 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex ...@@ -1463,7 +1435,6 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex
const gl::ActiveTextureArray<vk::TextureUnit> &activeTextures = contextVk->getActiveTextures(); const gl::ActiveTextureArray<vk::TextureUnit> &activeTextures = contextVk->getActiveTextures();
bool emulateSeamfulCubeMapSampling = contextVk->emulateSeamfulCubeMapSampling(); bool emulateSeamfulCubeMapSampling = contextVk->emulateSeamfulCubeMapSampling();
bool useOldRewriteStructSamplers = contextVk->useOldRewriteStructSamplers();
gl::ShaderMap<const gl::ProgramState *> programStates; gl::ShaderMap<const gl::ProgramState *> programStates;
fillProgramStateMap(contextVk, &programStates); fillProgramStateMap(contextVk, &programStates);
...@@ -1509,13 +1480,10 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex ...@@ -1509,13 +1480,10 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex
uint32_t arrayOffset = 0; uint32_t arrayOffset = 0;
uint32_t arraySize = static_cast<uint32_t>(samplerBinding.boundTextureUnits.size()); uint32_t arraySize = static_cast<uint32_t>(samplerBinding.boundTextureUnits.size());
if (!useOldRewriteStructSamplers)
{
arrayOffset = mappedSamplerNameToArrayOffset[mappedSamplerName]; arrayOffset = mappedSamplerNameToArrayOffset[mappedSamplerName];
// Front-end generates array elements in order, so we can just increment // Front-end generates array elements in order, so we can just increment the offset each
// the offset each time we process a nested array. // time we process a nested array.
mappedSamplerNameToArrayOffset[mappedSamplerName] += arraySize; mappedSamplerNameToArrayOffset[mappedSamplerName] += arraySize;
}
VkWriteDescriptorSet *writeInfos = contextVk->allocWriteDescriptorSets(arraySize); VkWriteDescriptorSet *writeInfos = contextVk->allocWriteDescriptorSets(arraySize);
...@@ -1582,10 +1550,7 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex ...@@ -1582,10 +1550,7 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex
{ {
imageInfos[arrayElement].sampler = textureVk->getSampler().get().getHandle(); imageInfos[arrayElement].sampler = textureVk->getSampler().get().getHandle();
} }
const std::string samplerName = const std::string samplerName = GlslangGetMappedSamplerName(samplerUniform.name);
contextVk->getRenderer()->getFeatures().forceOldRewriteStructSamplers.enabled
? GetMappedSamplerNameOld(samplerUniform.name)
: GlslangGetMappedSamplerName(samplerUniform.name);
const ShaderInterfaceVariableInfo &info = const ShaderInterfaceVariableInfo &info =
mVariableInfoMap.get(shaderType, samplerName); mVariableInfoMap.get(shaderType, samplerName);
......
...@@ -199,10 +199,8 @@ class ProgramExecutableVk ...@@ -199,10 +199,8 @@ class ProgramExecutableVk
const gl::ShaderType shaderType, const gl::ShaderType shaderType,
vk::DescriptorSetLayoutDesc *descOut); vk::DescriptorSetLayoutDesc *descOut);
void addImageDescriptorSetDesc(const gl::ProgramExecutable &executable, void addImageDescriptorSetDesc(const gl::ProgramExecutable &executable,
bool useOldRewriteStructSamplers,
vk::DescriptorSetLayoutDesc *descOut); vk::DescriptorSetLayoutDesc *descOut);
void addTextureDescriptorSetDesc(const gl::ProgramState &programState, void addTextureDescriptorSetDesc(const gl::ProgramState &programState,
bool useOldRewriteStructSamplers,
const gl::ActiveTextureArray<vk::TextureUnit> *activeTextures, const gl::ActiveTextureArray<vk::TextureUnit> *activeTextures,
vk::DescriptorSetLayoutDesc *descOut); vk::DescriptorSetLayoutDesc *descOut);
......
...@@ -1377,7 +1377,6 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF ...@@ -1377,7 +1377,6 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
// Used to support EXT_gpu_shader5: // Used to support EXT_gpu_shader5:
enabledFeatures.features.shaderUniformBufferArrayDynamicIndexing = enabledFeatures.features.shaderUniformBufferArrayDynamicIndexing =
mPhysicalDeviceFeatures.shaderUniformBufferArrayDynamicIndexing; mPhysicalDeviceFeatures.shaderUniformBufferArrayDynamicIndexing;
// Used to support EXT_gpu_shader5 and sampler array of array emulation:
enabledFeatures.features.shaderSampledImageArrayDynamicIndexing = enabledFeatures.features.shaderSampledImageArrayDynamicIndexing =
mPhysicalDeviceFeatures.shaderSampledImageArrayDynamicIndexing; mPhysicalDeviceFeatures.shaderSampledImageArrayDynamicIndexing;
// Used to support atomic counter emulation: // Used to support atomic counter emulation:
...@@ -1946,10 +1945,6 @@ void RendererVk::initFeatures(DisplayVk *displayVk, ...@@ -1946,10 +1945,6 @@ void RendererVk::initFeatures(DisplayVk *displayVk,
ANGLE_FEATURE_CONDITION(&mFeatures, bindEmptyForUnusedDescriptorSets, ANGLE_FEATURE_CONDITION(&mFeatures, bindEmptyForUnusedDescriptorSets,
IsAndroid() && isQualcomm); IsAndroid() && isQualcomm);
ANGLE_FEATURE_CONDITION(
&mFeatures, forceOldRewriteStructSamplers,
!mPhysicalDeviceFeatures.shaderSampledImageArrayDynamicIndexing || isQualcomm);
ANGLE_FEATURE_CONDITION(&mFeatures, perFrameWindowSizeQuery, ANGLE_FEATURE_CONDITION(&mFeatures, perFrameWindowSizeQuery,
isIntel || (IsWindows() && isAMD) || IsFuchsia()); isIntel || (IsWindows() && isAMD) || IsFuchsia());
......
...@@ -58,11 +58,6 @@ std::shared_ptr<WaitableCompileEvent> ShaderVk::compile(const gl::Context *conte ...@@ -58,11 +58,6 @@ std::shared_ptr<WaitableCompileEvent> ShaderVk::compile(const gl::Context *conte
compileOptions |= SH_EMULATE_SEAMFUL_CUBE_MAP_SAMPLING; compileOptions |= SH_EMULATE_SEAMFUL_CUBE_MAP_SAMPLING;
} }
if (contextVk->useOldRewriteStructSamplers())
{
compileOptions |= SH_USE_OLD_REWRITE_STRUCT_SAMPLERS;
}
if (!contextVk->getFeatures().enablePrecisionQualifiers.enabled) if (!contextVk->getFeatures().enablePrecisionQualifiers.enabled)
{ {
compileOptions |= SH_IGNORE_PRECISION_QUALIFIERS; compileOptions |= SH_IGNORE_PRECISION_QUALIFIERS;
......
...@@ -169,10 +169,6 @@ ...@@ -169,10 +169,6 @@
// Not failing in last official run, but failed recently: // Not failing in last official run, but failed recently:
4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.* = FAIL 4110 SWIFTSHADER : dEQP-GLES31.functional.shaders.helper_invocation.* = FAIL
// Vulkan Android doesn't support array of array of opaque uniforms. Emulation is not yet done for images
3881 VULKAN ANDROID : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.image_2d = SKIP
3881 VULKAN ANDROID : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.iimage_2d_array = SKIP
//// ////
//// General Vulkan expectations //// General Vulkan expectations
//// ////
...@@ -228,16 +224,17 @@ ...@@ -228,16 +224,17 @@
// Seem to trigger LowMemoryKiller when run in a certain sequence // Seem to trigger LowMemoryKiller when run in a certain sequence
5185 VULKAN ANDROID : dEQP-GLES31.functional.atomic_counter.* = SKIP 5185 VULKAN ANDROID : dEQP-GLES31.functional.atomic_counter.* = SKIP
// Arrays of opaque types as function parameters (possibly related to issue 3882) // Arrays of atomic counters not supported on Android (lacking Vulkan feature)
2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_vertex = FAIL 3881 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_vertex = FAIL
2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_fragment = FAIL 3881 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_fragment = FAIL
2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_compute = FAIL 3881 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_literal_compute = FAIL
2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_vertex = FAIL 3881 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_vertex = FAIL
2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_fragment = FAIL 3881 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_fragment = FAIL
2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_compute = FAIL 3881 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.const_expression_compute = FAIL
2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.*uniform_vertex = FAIL
2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.*uniform_fragment = FAIL 3881 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.*uniform_vertex = FAIL
2703 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.*uniform_compute = FAIL 3881 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.*uniform_fragment = FAIL
3881 VULKAN ANDROID : dEQP-GLES31.functional.shaders.opaque_type_indexing.atomic_counter.*uniform_compute = FAIL
// SSBO synchronization: // SSBO synchronization:
4097 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_alias_overwrite = FAIL 4097 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.synchronization.in_invocation.ssbo_alias_overwrite = FAIL
...@@ -255,10 +252,6 @@ ...@@ -255,10 +252,6 @@
// Need to support non-color when staging image updates // Need to support non-color when staging image updates
4080 ANDROID VULKAN : dEQP-GLES31.functional.stencil_texturing.misc.base_level = SKIP 4080 ANDROID VULKAN : dEQP-GLES31.functional.stencil_texturing.misc.base_level = SKIP
// Android uses "old" sampler rewrite that doesn't support array of arrays
2703 VULKAN ANDROID : dEQP-GLES31.functional.program_interface_query.uniform.location.default_block.array.array.*sampler* = SKIP
2703 VULKAN ANDROID : dEQP-GLES31.functional.uniform_location.nested_array.*sampler2D* = SKIP
// Fail on tests that use an unsupported extension! // Fail on tests that use an unsupported extension!
4371 VULKAN ANDROID : dEQP-GLES31.functional.shaders.implicit_conversions.es31.arithmetic.input_before_literal.add.int_to_vec3_vertex = FAIL 4371 VULKAN ANDROID : dEQP-GLES31.functional.shaders.implicit_conversions.es31.arithmetic.input_before_literal.add.int_to_vec3_vertex = FAIL
4371 VULKAN ANDROID : dEQP-GLES31.functional.shaders.implicit_conversions.es31.arithmetic.input_before_literal.add.int_to_uvec3_vertex = FAIL 4371 VULKAN ANDROID : dEQP-GLES31.functional.shaders.implicit_conversions.es31.arithmetic.input_before_literal.add.int_to_uvec3_vertex = FAIL
......
...@@ -103,9 +103,6 @@ ...@@ -103,9 +103,6 @@
// Fails to link the shader program on Pixel2 and Pixel2 XL // Fails to link the shader program on Pixel2 and Pixel2 XL
3588 VULKAN PIXEL2ORXL : KHR-GLES31.core.sample_variables.mask.rgba8.samples_*.mask_* = FAIL 3588 VULKAN PIXEL2ORXL : KHR-GLES31.core.sample_variables.mask.rgba8.samples_*.mask_* = FAIL
// Android uses "old" sampler rewrite that doesn't support array of arrays
2703 VULKAN ANDROID : KHR-GLES31.core.arrays_of_arrays.* = SKIP
// Failing on Android with SwiftShader // Failing on Android with SwiftShader
4300 SWIFTSHADER ANDROID : KHR-GLES31.core.shader_integer_mix.mix-bvec4 = FAIL 4300 SWIFTSHADER ANDROID : KHR-GLES31.core.shader_integer_mix.mix-bvec4 = FAIL
4300 SWIFTSHADER ANDROID : KHR-GLES31.core.shader_integer_mix.mix-ivec4 = FAIL 4300 SWIFTSHADER ANDROID : KHR-GLES31.core.shader_integer_mix.mix-ivec4 = FAIL
......
...@@ -55,8 +55,8 @@ ...@@ -55,8 +55,8 @@
// Android failures // Android failures
// Dynamic indexing features not supported on Qualcomm // Dynamic indexing features not supported on Qualcomm
2703 VULKAN ANDROID : KHR-GLES32.core.gpu_shader5.atomic_counters_array_indexing = FAIL 5435 VULKAN ANDROID : KHR-GLES32.core.gpu_shader5.atomic_counters_array_indexing = FAIL
2703 VULKAN ANDROID : KHR-GLES32.core.gpu_shader5.images_array_indexing = FAIL 5435 VULKAN ANDROID : KHR-GLES32.core.gpu_shader5.images_array_indexing = FAIL
// Texture buffer failures // Texture buffer failures
5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_active_uniform_validation_compute_shader = FAIL 5392 VULKAN ANDROID : KHR-GLES32.core.texture_buffer.texture_buffer_active_uniform_validation_compute_shader = FAIL
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment