Commit 8a401051 by Mohan Maiya Committed by Commit Bot

Vulkan: Support OES_sample_variables extension

Enable OES_sample_variables extension on Vulkan backend. Add support for built-in variables, uniform state and constants - gl_SampleId, gl_SamplePosition, gl_SampleMask, gl_SampleMaskIn - gl_NumSamples - gl_MaxSamples Bug: angleproject:3588 Tests: dEQP-GLES31.functional.shaders.sample_variables.* KHR-GLES31.core.sample_variables.* Change-Id: Idf37c7b4ccb0331dbda7acd6389ff4e1022ba959 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2477907 Commit-Queue: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 353770e1
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
// Version number for shader translation API. // Version number for shader translation API.
// It is incremented every time the API changes. // It is incremented every time the API changes.
#define ANGLE_SH_VERSION 243 #define ANGLE_SH_VERSION 244
enum ShShaderSpec enum ShShaderSpec
{ {
...@@ -417,6 +417,7 @@ struct ShBuiltInResources ...@@ -417,6 +417,7 @@ struct ShBuiltInResources
int EXT_tessellation_shader; int EXT_tessellation_shader;
int OES_texture_buffer; int OES_texture_buffer;
int EXT_texture_buffer; int EXT_texture_buffer;
int OES_sample_variables;
// Set to 1 to enable replacing GL_EXT_draw_buffers #extension directives // Set to 1 to enable replacing GL_EXT_draw_buffers #extension directives
// with GL_NV_draw_buffers in ESSL output. This flag can be used to emulate // with GL_NV_draw_buffers in ESSL output. This flag can be used to emulate
...@@ -474,6 +475,10 @@ struct ShBuiltInResources ...@@ -474,6 +475,10 @@ struct ShBuiltInResources
// maximum number of available image units // maximum number of available image units
int MaxImageUnits; int MaxImageUnits;
// OES_sample_variables constant
// maximum number of available samples
int MaxSamples;
// maximum number of image uniforms in a vertex shader // maximum number of image uniforms in a vertex shader
int MaxVertexImageUniforms; int MaxVertexImageUniforms;
......
...@@ -248,6 +248,7 @@ int main(int argc, char *argv[]) ...@@ -248,6 +248,7 @@ int main(int argc, char *argv[])
compileOptions |= SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER; compileOptions |= SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER;
break; break;
case 'y': resources.EXT_YUV_target = 1; break; case 'y': resources.EXT_YUV_target = 1; break;
case 's': resources.OES_sample_variables = 1; break;
default: failCode = EFailUsage; default: failCode = EFailUsage;
} }
// clang-format on // clang-format on
...@@ -413,7 +414,8 @@ void usage() ...@@ -413,7 +414,8 @@ void usage()
" -x=n : enable NV_shader_framebuffer_fetch\n" " -x=n : enable NV_shader_framebuffer_fetch\n"
" -x=a : enable ARM_shader_framebuffer_fetch\n" " -x=a : enable ARM_shader_framebuffer_fetch\n"
" -x=m : enable OVR_multiview\n" " -x=m : enable OVR_multiview\n"
" -x=y : enable YUV_target\n"); " -x=y : enable YUV_target\n"
" -x=s : enable OES_sample_variables\n");
// clang-format on // clang-format on
} }
......
{ {
"src/compiler/translator/ImmutableString_ESSL_autogen.cpp": "src/compiler/translator/ImmutableString_ESSL_autogen.cpp":
"46459d27139556c8c4fa14feeadaa0a6", "5025e7c320251e6a26d90821fcc772e8",
"src/compiler/translator/ImmutableString_autogen.cpp": "src/compiler/translator/ImmutableString_autogen.cpp":
"c8e653229bd508549dd81c9c4756d29b", "cef9deaeda180601c944321790132dc9",
"src/compiler/translator/ParseContext_ESSL_autogen.h": "src/compiler/translator/ParseContext_ESSL_autogen.h":
"bfff449e4ba23c94c097c1a4dbd39237", "4b152c08a8780d6984718f84c6b6a679",
"src/compiler/translator/ParseContext_complete_autogen.h": "src/compiler/translator/ParseContext_complete_autogen.h":
"2db8d7d0efd13afdd4b971c89f785f7e", "2db8d7d0efd13afdd4b971c89f785f7e",
"src/compiler/translator/SymbolTable_ESSL_autogen.cpp": "src/compiler/translator/SymbolTable_ESSL_autogen.cpp":
"3fe6b792e76ea6108bae57965bf7f5de", "b7fde97581b6a3fa1cb95b429d2aafdc",
"src/compiler/translator/SymbolTable_autogen.cpp": "src/compiler/translator/SymbolTable_autogen.cpp":
"e8567c8e7f8c5232b5b4ff161ae63acb", "aea6b8a5b0e8a55e0a517edcae520905",
"src/compiler/translator/SymbolTable_autogen.h": "src/compiler/translator/SymbolTable_autogen.h":
"592ee5224086ff7d95d0e1fa9974200f", "91e1a9486d6a44fd4207a6afd48696cc",
"src/compiler/translator/builtin_function_declarations.txt": "src/compiler/translator/builtin_function_declarations.txt":
"29ab2d428cf0079127d22eda430deb36", "29ab2d428cf0079127d22eda430deb36",
"src/compiler/translator/builtin_variables.json": "src/compiler/translator/builtin_variables.json":
"d63656e26cc617ae758a09b22292d5db", "105ae21385f1ea600069a5fa7861a7f5",
"src/compiler/translator/gen_builtin_symbols.py": "src/compiler/translator/gen_builtin_symbols.py":
"12f20fb93de0634ca9de5532185e0244", "12f20fb93de0634ca9de5532185e0244",
"src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h": "src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h":
"a3929b92556b526b9f56641ce7924dd1", "e147336998cb27bacf6c387511a0037a",
"src/compiler/translator/tree_util/BuiltIn_complete_autogen.h": "src/compiler/translator/tree_util/BuiltIn_complete_autogen.h":
"6e3cccb7a80cf0ab7cb4518fcad71ea7", "a3f295b6530a351e166e1cff8ee8fed2",
"src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp": "src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp":
"7f4107b1d0c9cac77b37e87e6d26b9fe", "f4ad9e8fc0339692a5968332f6ee1af2",
"src/tests/compiler_tests/ImmutableString_test_autogen.cpp": "src/tests/compiler_tests/ImmutableString_test_autogen.cpp":
"d7f8b88e3d31d7e5b405053bfcc83d9e" "4f7e284bdbe6fce78e60fc957a987ab3"
} }
\ No newline at end of file
...@@ -989,6 +989,13 @@ enum TQualifier ...@@ -989,6 +989,13 @@ enum TQualifier
EvqCentroidIn, // Implies smooth EvqCentroidIn, // Implies smooth
EvqSampleIn, EvqSampleIn,
// GLSL ES 3.0 extension OES_sample_variables
EvqSampleID,
EvqSamplePosition,
EvqSampleMaskIn,
EvqSampleMask,
EvqNumSamples,
// GLSL ES 3.1 compute shader special variables // GLSL ES 3.1 compute shader special variables
EvqShared, EvqShared,
EvqComputeIn, EvqComputeIn,
...@@ -1356,6 +1363,11 @@ inline const char *getQualifierString(TQualifier q) ...@@ -1356,6 +1363,11 @@ inline const char *getQualifierString(TQualifier q)
case EvqSample: return "sample"; case EvqSample: return "sample";
case EvqSampleIn: return "sample in"; case EvqSampleIn: return "sample in";
case EvqSampleOut: return "sample out"; case EvqSampleOut: return "sample out";
case EvqSampleID: return "SampleID";
case EvqSamplePosition: return "SamplePosition";
case EvqSampleMaskIn: return "SampleMaskIn";
case EvqSampleMask: return "SampleMask";
case EvqNumSamples: return "NumSamples";
default: UNREACHABLE(); return "unknown qualifier"; default: UNREACHABLE(); return "unknown qualifier";
} }
// clang-format on // clang-format on
......
...@@ -170,6 +170,7 @@ class CollectVariablesTraverser : public TIntermTraverser ...@@ -170,6 +170,7 @@ class CollectVariablesTraverser : public TIntermTraverser
// Shader uniforms // Shader uniforms
bool mDepthRangeAdded; bool mDepthRangeAdded;
bool mNumSamplesAdded;
// Compute Shader builtins // Compute Shader builtins
bool mNumWorkGroupsAdded; bool mNumWorkGroupsAdded;
...@@ -202,6 +203,10 @@ class CollectVariablesTraverser : public TIntermTraverser ...@@ -202,6 +203,10 @@ class CollectVariablesTraverser : public TIntermTraverser
bool mFragDepthAdded; bool mFragDepthAdded;
bool mSecondaryFragColorEXTAdded; bool mSecondaryFragColorEXTAdded;
bool mSecondaryFragDataEXTAdded; bool mSecondaryFragDataEXTAdded;
bool mSampleIDAdded;
bool mSamplePositionAdded;
bool mSampleMaskAdded;
bool mSampleMaskInAdded;
// Geometry Shader builtins // Geometry Shader builtins
bool mPerVertexInAdded; bool mPerVertexInAdded;
...@@ -246,6 +251,7 @@ CollectVariablesTraverser::CollectVariablesTraverser( ...@@ -246,6 +251,7 @@ CollectVariablesTraverser::CollectVariablesTraverser(
mShaderStorageBlocks(shaderStorageBlocks), mShaderStorageBlocks(shaderStorageBlocks),
mInBlocks(inBlocks), mInBlocks(inBlocks),
mDepthRangeAdded(false), mDepthRangeAdded(false),
mNumSamplesAdded(false),
mNumWorkGroupsAdded(false), mNumWorkGroupsAdded(false),
mWorkGroupIDAdded(false), mWorkGroupIDAdded(false),
mLocalInvocationIDAdded(false), mLocalInvocationIDAdded(false),
...@@ -270,6 +276,10 @@ CollectVariablesTraverser::CollectVariablesTraverser( ...@@ -270,6 +276,10 @@ CollectVariablesTraverser::CollectVariablesTraverser(
mFragDepthAdded(false), mFragDepthAdded(false),
mSecondaryFragColorEXTAdded(false), mSecondaryFragColorEXTAdded(false),
mSecondaryFragDataEXTAdded(false), mSecondaryFragDataEXTAdded(false),
mSampleIDAdded(false),
mSamplePositionAdded(false),
mSampleMaskAdded(false),
mSampleMaskInAdded(false),
mPerVertexInAdded(false), mPerVertexInAdded(false),
mPrimitiveIDInAdded(false), mPrimitiveIDInAdded(false),
mInvocationIDAdded(false), mInvocationIDAdded(false),
...@@ -449,6 +459,25 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) ...@@ -449,6 +459,25 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol)
mDepthRangeAdded = true; mDepthRangeAdded = true;
} }
} }
else if (symbolName == "gl_NumSamples")
{
ASSERT(qualifier == EvqUniform);
if (!mNumSamplesAdded)
{
ShaderVariable info;
const char kName[] = "gl_NumSamples";
info.name = kName;
info.mappedName = kName;
info.type = GL_INT;
info.precision = GL_LOW_INT;
info.staticUse = true;
info.active = true;
mUniforms->push_back(info);
mNumSamplesAdded = true;
}
}
else else
{ {
switch (qualifier) switch (qualifier)
...@@ -614,6 +643,18 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol) ...@@ -614,6 +643,18 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol)
case EvqClipDistance: case EvqClipDistance:
recordBuiltInVaryingUsed(symbol->variable(), &mClipDistanceAdded, mOutputVaryings); recordBuiltInVaryingUsed(symbol->variable(), &mClipDistanceAdded, mOutputVaryings);
return; return;
case EvqSampleID:
recordBuiltInVaryingUsed(symbol->variable(), &mSampleIDAdded, mInputVaryings);
return;
case EvqSamplePosition:
recordBuiltInVaryingUsed(symbol->variable(), &mSamplePositionAdded, mInputVaryings);
return;
case EvqSampleMaskIn:
recordBuiltInVaryingUsed(symbol->variable(), &mSampleMaskInAdded, mInputVaryings);
return;
case EvqSampleMask:
recordBuiltInFragmentOutputUsed(symbol->variable(), &mSampleMaskAdded);
return;
default: default:
break; break;
} }
......
...@@ -1105,9 +1105,11 @@ void TCompiler::setResourceString() ...@@ -1105,9 +1105,11 @@ void TCompiler::setResourceString()
<< ":OES_shader_image_atomic:" << mResources.OES_shader_image_atomic << ":OES_shader_image_atomic:" << mResources.OES_shader_image_atomic
<< ":OES_texture_buffer:" << mResources.OES_texture_buffer << ":OES_texture_buffer:" << mResources.OES_texture_buffer
<< ":EXT_texture_buffer:" << mResources.EXT_texture_buffer << ":EXT_texture_buffer:" << mResources.EXT_texture_buffer
<< ":OES_sample_variables:" << mResources.OES_sample_variables
<< ":MinProgramTextureGatherOffset:" << mResources.MinProgramTextureGatherOffset << ":MinProgramTextureGatherOffset:" << mResources.MinProgramTextureGatherOffset
<< ":MaxProgramTextureGatherOffset:" << mResources.MaxProgramTextureGatherOffset << ":MaxProgramTextureGatherOffset:" << mResources.MaxProgramTextureGatherOffset
<< ":MaxImageUnits:" << mResources.MaxImageUnits << ":MaxImageUnits:" << mResources.MaxImageUnits
<< ":MaxSamples:" << mResources.MaxSamples
<< ":MaxVertexImageUniforms:" << mResources.MaxVertexImageUniforms << ":MaxVertexImageUniforms:" << mResources.MaxVertexImageUniforms
<< ":MaxFragmentImageUniforms:" << mResources.MaxFragmentImageUniforms << ":MaxFragmentImageUniforms:" << mResources.MaxFragmentImageUniforms
<< ":MaxComputeImageUniforms:" << mResources.MaxComputeImageUniforms << ":MaxComputeImageUniforms:" << mResources.MaxComputeImageUniforms
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
OP(NV_shader_noperspective_interpolation) \ OP(NV_shader_noperspective_interpolation) \
OP(OES_EGL_image_external) \ OP(OES_EGL_image_external) \
OP(OES_EGL_image_external_essl3) \ OP(OES_EGL_image_external_essl3) \
OP(OES_sample_variables) \
OP(OES_shader_multisample_interpolation) \ OP(OES_shader_multisample_interpolation) \
OP(OES_shader_image_atomic) \ OP(OES_shader_image_atomic) \
OP(OES_standard_derivatives) \ OP(OES_standard_derivatives) \
......
...@@ -43,6 +43,7 @@ enum class TExtension : uint8_t ...@@ -43,6 +43,7 @@ enum class TExtension : uint8_t
NV_shader_noperspective_interpolation, NV_shader_noperspective_interpolation,
OES_EGL_image_external, OES_EGL_image_external,
OES_EGL_image_external_essl3, OES_EGL_image_external_essl3,
OES_sample_variables,
OES_shader_multisample_interpolation, OES_shader_multisample_interpolation,
OES_shader_image_atomic, OES_shader_image_atomic,
OES_standard_derivatives, OES_standard_derivatives,
......
...@@ -149,6 +149,10 @@ void InitExtensionBehavior(const ShBuiltInResources &resources, TExtensionBehavi ...@@ -149,6 +149,10 @@ void InitExtensionBehavior(const ShBuiltInResources &resources, TExtensionBehavi
{ {
extBehavior[TExtension::EXT_texture_buffer] = EBhUndefined; extBehavior[TExtension::EXT_texture_buffer] = EBhUndefined;
} }
if (resources.OES_sample_variables)
{
extBehavior[TExtension::OES_sample_variables] = EBhUndefined;
}
} }
void ResetExtensionBehavior(const ShBuiltInResources &resources, void ResetExtensionBehavior(const ShBuiltInResources &resources,
......
...@@ -620,6 +620,15 @@ bool TParseContext::checkCanBeLValue(const TSourceLoc &line, const char *op, TIn ...@@ -620,6 +620,15 @@ bool TParseContext::checkCanBeLValue(const TSourceLoc &line, const char *op, TIn
message = "can't modify gl_Layer in a fragment shader"; message = "can't modify gl_Layer in a fragment shader";
} }
break; break;
case EvqSampleID:
message = "can't modify gl_SampleID";
break;
case EvqSampleMaskIn:
message = "can't modify gl_SampleMaskIn";
break;
case EvqSamplePosition:
message = "can't modify gl_SamplePosition";
break;
default: default:
// //
// Type that can't be written to? // Type that can't be written to?
......
...@@ -21,77 +21,77 @@ namespace BuiltInGroup ...@@ -21,77 +21,77 @@ namespace BuiltInGroup
bool isTextureOffsetNoBias(const TFunction *func) bool isTextureOffsetNoBias(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3718 && id <= 3787; return id >= 3724 && id <= 3793;
} }
bool isTextureOffsetBias(const TFunction *func) bool isTextureOffsetBias(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3788 && id <= 3807; return id >= 3794 && id <= 3813;
} }
bool isTextureGatherOffsetsComp(const TFunction *func) bool isTextureGatherOffsetsComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3845 && id <= 3857; return id >= 3851 && id <= 3863;
} }
bool isTextureGatherOffsetsNoComp(const TFunction *func) bool isTextureGatherOffsetsNoComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3858 && id <= 3873; return id >= 3864 && id <= 3879;
} }
bool isTextureGatherOffsets(const TFunction *func) bool isTextureGatherOffsets(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3845 && id <= 3873; return id >= 3851 && id <= 3879;
} }
bool isTextureGatherOffsetComp(const TFunction *func) bool isTextureGatherOffsetComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3874 && id <= 3879; return id >= 3880 && id <= 3885;
} }
bool isTextureGatherOffsetNoComp(const TFunction *func) bool isTextureGatherOffsetNoComp(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3880 && id <= 3887; return id >= 3886 && id <= 3893;
} }
bool isTextureGatherOffset(const TFunction *func) bool isTextureGatherOffset(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3874 && id <= 3887; return id >= 3880 && id <= 3893;
} }
bool isTextureGather(const TFunction *func) bool isTextureGather(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3821 && id <= 3887; return id >= 3827 && id <= 3893;
} }
bool isInterpolationFS(const TFunction *func) bool isInterpolationFS(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3900 && id <= 3923; return id >= 3906 && id <= 3929;
} }
bool isAtomicMemory(const TFunction *func) bool isAtomicMemory(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3928 && id <= 3945; return id >= 3934 && id <= 3951;
} }
bool isImageLoad(const TFunction *func) bool isImageLoad(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3982 && id <= 3999; return id >= 3988 && id <= 4005;
} }
bool isImageAtomic(const TFunction *func) bool isImageAtomic(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 4000 && id <= 4575; return id >= 4006 && id <= 4581;
} }
bool isImageStore(const TFunction *func) bool isImageStore(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 4576 && id <= 4593; return id >= 4582 && id <= 4599;
} }
bool isImage(const TFunction *func) bool isImage(const TFunction *func)
{ {
int id = func->uniqueId().get(); int id = func->uniqueId().get();
return id >= 3946 && id <= 4593; return id >= 3952 && id <= 4599;
} }
} // namespace BuiltInGroup } // namespace BuiltInGroup
......
...@@ -185,6 +185,7 @@ void InitBuiltInResources(ShBuiltInResources *resources) ...@@ -185,6 +185,7 @@ void InitBuiltInResources(ShBuiltInResources *resources)
resources->EXT_tessellation_shader = 0; resources->EXT_tessellation_shader = 0;
resources->OES_texture_buffer = 0; resources->OES_texture_buffer = 0;
resources->EXT_texture_buffer = 0; resources->EXT_texture_buffer = 0;
resources->OES_sample_variables = 0;
resources->MaxClipDistances = 0; resources->MaxClipDistances = 0;
...@@ -290,6 +291,8 @@ void InitBuiltInResources(ShBuiltInResources *resources) ...@@ -290,6 +291,8 @@ void InitBuiltInResources(ShBuiltInResources *resources)
resources->MaxTessEvaluationAtomicCounterBuffers = 0; resources->MaxTessEvaluationAtomicCounterBuffers = 0;
resources->SubPixelBits = 8; resources->SubPixelBits = 8;
resources->MaxSamples = 4;
} }
// //
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -81,11 +81,14 @@ class TSymbolTableBase ...@@ -81,11 +81,14 @@ class TSymbolTableBase
TSymbol *m_gl_MaxTessEvaluationImageUniforms = nullptr; TSymbol *m_gl_MaxTessEvaluationImageUniforms = nullptr;
TSymbol *m_gl_MaxTessEvaluationAtomicCounters = nullptr; TSymbol *m_gl_MaxTessEvaluationAtomicCounters = nullptr;
TSymbol *m_gl_MaxTessEvaluationAtomicCounterBuffers = nullptr; TSymbol *m_gl_MaxTessEvaluationAtomicCounterBuffers = nullptr;
TSymbol *m_gl_MaxSamples = nullptr;
TSymbol *m_gl_FragData = nullptr; TSymbol *m_gl_FragData = nullptr;
TSymbol *m_gl_SecondaryFragDataEXT = nullptr; TSymbol *m_gl_SecondaryFragDataEXT = nullptr;
TSymbol *m_gl_FragDepthEXT = nullptr; TSymbol *m_gl_FragDepthEXT = nullptr;
TSymbol *m_gl_LastFragData = nullptr; TSymbol *m_gl_LastFragData = nullptr;
TSymbol *m_gl_LastFragDataNV = nullptr; TSymbol *m_gl_LastFragDataNV = nullptr;
TSymbol *m_gl_SampleMaskIn = nullptr;
TSymbol *m_gl_SampleMask = nullptr;
TSymbol *m_gl_ClipDistance = nullptr; TSymbol *m_gl_ClipDistance = nullptr;
TSymbol *m_gl_MaxClipDistances = nullptr; TSymbol *m_gl_MaxClipDistances = nullptr;
TSymbol *m_gl_PerVertex = nullptr; TSymbol *m_gl_PerVertex = nullptr;
......
...@@ -921,6 +921,16 @@ bool TranslatorVulkan::translateImpl(TIntermBlock *root, ...@@ -921,6 +921,16 @@ bool TranslatorVulkan::translateImpl(TIntermBlock *root,
return false; return false;
} }
{
const TVariable *numSamplesVar = static_cast<const TVariable *>(
getSymbolTable().findBuiltIn(ImmutableString("gl_NumSamples"), getShaderVersion()));
TIntermBinary *numSamples = driverUniforms->getNumSamplesRef();
if (!ReplaceVariableWithTyped(this, root, numSamplesVar, numSamples))
{
return false;
}
}
EmitEarlyFragmentTestsGLSL(*this, sink); EmitEarlyFragmentTestsGLSL(*this, sink);
} }
else if (getShaderType() == GL_VERTEX_SHADER) else if (getShaderType() == GL_VERTEX_SHADER)
......
...@@ -62,6 +62,21 @@ ...@@ -62,6 +62,21 @@
"essl_level":"COMMON_BUILTINS", "essl_level":"COMMON_BUILTINS",
"initDynamicType":"TType *{type_name} = new TType(gl_DepthRangeParameters, false); {type_name}->setQualifier(EvqUniform);" "initDynamicType":"TType *{type_name} = new TType(gl_DepthRangeParameters, false); {type_name}->setQualifier(EvqUniform);"
} }
},
"subgroups":{
"OESSampleVariables":{
"variables":{
"gl_NumSamples":{
"essl_level":"ESSL3_BUILTINS",
"essl_extension":"OES_sample_variables",
"type":{
"basic":"Int",
"precision":"Low",
"qualifier":"Uniform"
}
}
}
}
} }
}, },
"Constants":{ "Constants":{
...@@ -646,6 +661,20 @@ ...@@ -646,6 +661,20 @@
"value":"resources" "value":"resources"
} }
} }
},
"OESSampleVariables":{
"variables":{
"gl_MaxSamples":{
"essl_level":"ESSL3_BUILTINS",
"type":{
"basic":"Int",
"precision":"Medium",
"qualifier":"Const"
},
"essl_extension":"OES_sample_variables",
"value":"resources"
}
}
} }
} }
}, },
...@@ -799,6 +828,39 @@ ...@@ -799,6 +828,39 @@
} }
} }
} }
},
"OESSampleVariables":{
"variables":{
"gl_SampleID":{
"essl_level":"ESSL3_BUILTINS",
"essl_extension":"OES_sample_variables",
"type":{
"basic":"Int",
"precision":"Low",
"qualifier":"SampleID"
}
},
"gl_SamplePosition":{
"essl_level":"ESSL3_BUILTINS",
"essl_extension":"OES_sample_variables",
"type":{
"basic":"Float",
"precision":"Medium",
"primarySize":2,
"qualifier":"SamplePosition"
}
},
"gl_SampleMaskIn":{
"essl_level":"ESSL3_BUILTINS",
"essl_extension":"OES_sample_variables",
"initDynamicType":"TType *{type_name} = new TType(EbtInt, EbpHigh, EvqSampleMaskIn, 1); {type_name}->makeArray((resources.MaxSamples+31)/32);"
},
"gl_SampleMask":{
"essl_level":"ESSL3_BUILTINS",
"essl_extension":"OES_sample_variables",
"initDynamicType":"TType *{type_name} = new TType(EbtInt, EbpHigh, EvqSampleMask, 1); {type_name}->makeArray((resources.MaxSamples+31)/32);"
}
}
} }
} }
}, },
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -36,12 +36,13 @@ constexpr const char kAcbBufferOffsets[] = "acbBufferOffsets"; ...@@ -36,12 +36,13 @@ constexpr const char kAcbBufferOffsets[] = "acbBufferOffsets";
constexpr const char kDepthRange[] = "depthRange"; constexpr const char kDepthRange[] = "depthRange";
constexpr const char kPreRotation[] = "preRotation"; constexpr const char kPreRotation[] = "preRotation";
constexpr const char kFragRotation[] = "fragRotation"; constexpr const char kFragRotation[] = "fragRotation";
constexpr const char kNumSamples[] = "numSamples";
constexpr size_t kNumGraphicsDriverUniforms = 12; constexpr size_t kNumGraphicsDriverUniforms = 13;
constexpr std::array<const char *, kNumGraphicsDriverUniforms> kGraphicsDriverUniformNames = { constexpr std::array<const char *, kNumGraphicsDriverUniforms> kGraphicsDriverUniformNames = {
{kViewport, kHalfRenderArea, kFlipXY, kNegFlipXY, kClipDistancesEnabled, kXfbActiveUnpaused, {kViewport, kHalfRenderArea, kFlipXY, kNegFlipXY, kClipDistancesEnabled, kXfbActiveUnpaused,
kXfbVerticesPerDraw, kXfbBufferOffsets, kAcbBufferOffsets, kDepthRange, kPreRotation, kXfbVerticesPerDraw, kNumSamples, kXfbBufferOffsets, kAcbBufferOffsets, kDepthRange,
kFragRotation}}; kPreRotation, kFragRotation}};
constexpr size_t kNumComputeDriverUniforms = 1; constexpr size_t kNumComputeDriverUniforms = 1;
constexpr std::array<const char *, kNumComputeDriverUniforms> kComputeDriverUniformNames = { constexpr std::array<const char *, kNumComputeDriverUniforms> kComputeDriverUniformNames = {
...@@ -88,7 +89,8 @@ TFieldList *DriverUniform::createUniformFields(TSymbolTable *symbolTable) const ...@@ -88,7 +89,8 @@ TFieldList *DriverUniform::createUniformFields(TSymbolTable *symbolTable) const
new TType(EbtUInt), // uint clipDistancesEnabled; // 32 bits for 32 clip distances max new TType(EbtUInt), // uint clipDistancesEnabled; // 32 bits for 32 clip distances max
new TType(EbtUInt), new TType(EbtUInt),
new TType(EbtUInt), new TType(EbtUInt),
// NOTE: There's a vec3 gap here that can be used in the future new TType(EbtInt),
// NOTE: There's a vec2 gap here that can be used in the future
new TType(EbtInt, 4), new TType(EbtInt, 4),
new TType(EbtUInt, 4), new TType(EbtUInt, 4),
createEmulatedDepthRangeType(symbolTable), createEmulatedDepthRangeType(symbolTable),
...@@ -234,4 +236,9 @@ TIntermBinary *DriverUniform::getDepthRangeReservedFieldRef() const ...@@ -234,4 +236,9 @@ TIntermBinary *DriverUniform::getDepthRangeReservedFieldRef() const
return new TIntermBinary(EOpIndexDirectStruct, depthRange, CreateIndexNode(3)); return new TIntermBinary(EOpIndexDirectStruct, depthRange, CreateIndexNode(3));
} }
TIntermBinary *DriverUniform::getNumSamplesRef() const
{
return createDriverUniformRef(kNumSamples);
}
} // namespace sh } // namespace sh
...@@ -43,6 +43,7 @@ class DriverUniform ...@@ -43,6 +43,7 @@ class DriverUniform
TIntermSwizzle *getNegFlipYRef() const; TIntermSwizzle *getNegFlipYRef() const;
TIntermBinary *getDepthRangeRef() const; TIntermBinary *getDepthRangeRef() const;
TIntermBinary *getDepthRangeReservedFieldRef() const; TIntermBinary *getDepthRangeReservedFieldRef() const;
TIntermBinary *getNumSamplesRef() const;
protected: protected:
TIntermBinary *createDriverUniformRef(const char *fieldName) const; TIntermBinary *createDriverUniformRef(const char *fieldName) const;
......
...@@ -1040,6 +1040,7 @@ const ExtensionInfoMap &GetExtensionInfoMap() ...@@ -1040,6 +1040,7 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_OES_sample_shading"] = enableableExtension(&Extensions::sampleShadingOES); map["GL_OES_sample_shading"] = enableableExtension(&Extensions::sampleShadingOES);
map["GL_OES_shader_multisample_interpolation"] = enableableExtension(&Extensions::multisampleInterpolationOES); map["GL_OES_shader_multisample_interpolation"] = enableableExtension(&Extensions::multisampleInterpolationOES);
map["GL_OES_shader_image_atomic"] = enableableExtension(&Extensions::shaderImageAtomicOES); map["GL_OES_shader_image_atomic"] = enableableExtension(&Extensions::shaderImageAtomicOES);
map["GL_OES_sample_variables"] = enableableExtension(&Extensions::sampleVariablesOES);
map["GL_NV_robustness_video_memory_purge"] = esOnlyExtension(&Extensions::robustnessVideoMemoryPurgeNV); map["GL_NV_robustness_video_memory_purge"] = esOnlyExtension(&Extensions::robustnessVideoMemoryPurgeNV);
map["GL_ANGLE_get_tex_level_parameter"] = enableableExtension(&Extensions::getTexLevelParameterANGLE); map["GL_ANGLE_get_tex_level_parameter"] = enableableExtension(&Extensions::getTexLevelParameterANGLE);
map["GL_EXT_copy_image"] = enableableExtension(&Extensions::copyImageEXT); map["GL_EXT_copy_image"] = enableableExtension(&Extensions::copyImageEXT);
......
...@@ -666,6 +666,9 @@ struct Extensions ...@@ -666,6 +666,9 @@ struct Extensions
// GL_OES_shader_image_atomic // GL_OES_shader_image_atomic
bool shaderImageAtomicOES = false; bool shaderImageAtomicOES = false;
// GL_OES_sample_variables
bool sampleVariablesOES = false;
// GL_NV_robustness_video_memory_purge // GL_NV_robustness_video_memory_purge
bool robustnessVideoMemoryPurgeNV = false; bool robustnessVideoMemoryPurgeNV = false;
......
...@@ -162,6 +162,10 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const State &state, egl::Disp ...@@ -162,6 +162,10 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const State &state, egl::Disp
// APPLE_clip_distance/EXT_clip_cull_distance // APPLE_clip_distance/EXT_clip_cull_distance
mResources.MaxClipDistances = caps.maxClipDistances; mResources.MaxClipDistances = caps.maxClipDistances;
// OES_sample_variables
mResources.OES_sample_variables = extensions.sampleVariablesOES;
mResources.MaxSamples = caps.maxSamples;
// GLSL ES 3.1 constants // GLSL ES 3.1 constants
mResources.MaxProgramTextureGatherOffset = caps.maxProgramTextureGatherOffset; mResources.MaxProgramTextureGatherOffset = caps.maxProgramTextureGatherOffset;
mResources.MinProgramTextureGatherOffset = caps.minProgramTextureGatherOffset; mResources.MinProgramTextureGatherOffset = caps.minProgramTextureGatherOffset;
......
...@@ -100,6 +100,7 @@ void GetBuiltInResourcesFromCaps(const gl::Caps &caps, TBuiltInResource *outBuil ...@@ -100,6 +100,7 @@ void GetBuiltInResourcesFromCaps(const gl::Caps &caps, TBuiltInResource *outBuil
outBuiltInResources->maxVertexOutputComponents = caps.maxVertexOutputComponents; outBuiltInResources->maxVertexOutputComponents = caps.maxVertexOutputComponents;
outBuiltInResources->maxVertexUniformVectors = caps.maxVertexUniformVectors; outBuiltInResources->maxVertexUniformVectors = caps.maxVertexUniformVectors;
outBuiltInResources->maxClipDistances = caps.maxClipDistances; outBuiltInResources->maxClipDistances = caps.maxClipDistances;
outBuiltInResources->maxSamples = caps.maxSamples;
} }
// Run at startup to warm up glslang's internals to avoid hitches on first shader compile. // Run at startup to warm up glslang's internals to avoid hitches on first shader compile.
......
...@@ -70,7 +70,11 @@ struct GraphicsDriverUniforms ...@@ -70,7 +70,11 @@ struct GraphicsDriverUniforms
uint32_t xfbActiveUnpaused; uint32_t xfbActiveUnpaused;
uint32_t xfbVerticesPerDraw; uint32_t xfbVerticesPerDraw;
std::array<int32_t, 3> padding;
// Used to replace gl_NumSamples. Because gl_NumSamples cannot be recognized in SPIR-V.
int32_t numSamples;
std::array<int32_t, 2> padding;
std::array<int32_t, 4> xfbBufferOffsets; std::array<int32_t, 4> xfbBufferOffsets;
...@@ -3658,6 +3662,7 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co ...@@ -3658,6 +3662,7 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co
float depthRangeNear = mState.getNearPlane(); float depthRangeNear = mState.getNearPlane();
float depthRangeFar = mState.getFarPlane(); float depthRangeFar = mState.getFarPlane();
float depthRangeDiff = depthRangeFar - depthRangeNear; float depthRangeDiff = depthRangeFar - depthRangeNear;
int32_t numSamples = mDrawFramebuffer->getSamples();
// Copy and flush to the device. // Copy and flush to the device.
GraphicsDriverUniforms *driverUniforms = reinterpret_cast<GraphicsDriverUniforms *>(ptr); GraphicsDriverUniforms *driverUniforms = reinterpret_cast<GraphicsDriverUniforms *>(ptr);
...@@ -3670,6 +3675,7 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co ...@@ -3670,6 +3675,7 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co
mState.getEnabledClipDistances().bits(), mState.getEnabledClipDistances().bits(),
xfbActiveUnpaused, xfbActiveUnpaused,
mXfbVertexCountPerInstance, mXfbVertexCountPerInstance,
numSamples,
{}, {},
{}, {},
{}, {},
......
...@@ -1368,6 +1368,9 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF ...@@ -1368,6 +1368,9 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
enabledFeatures.features.inheritedQueries = mPhysicalDeviceFeatures.inheritedQueries; enabledFeatures.features.inheritedQueries = mPhysicalDeviceFeatures.inheritedQueries;
} }
// Used to support OES_sample_variables
enabledFeatures.features.sampleRateShading = mPhysicalDeviceFeatures.sampleRateShading;
// Setup device initialization struct // Setup device initialization struct
VkDeviceCreateInfo createInfo = {}; VkDeviceCreateInfo createInfo = {};
......
...@@ -452,6 +452,14 @@ void RendererVk::ensureCapsInitialized() const ...@@ -452,6 +452,14 @@ void RendererVk::ensureCapsInitialized() const
// OES_shader_multisample_interpolation requires OES_sample_variables, disable for now // OES_shader_multisample_interpolation requires OES_sample_variables, disable for now
mNativeExtensions.multisampleInterpolationOES = false; mNativeExtensions.multisampleInterpolationOES = false;
// From the SPIR-V spec at 3.21. BuiltIn, SampleId and SamplePosition needs
// SampleRateShading. https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html
// To replace non-constant index to constant 0 index, this extension assumes that ANGLE only
// supports the number of samples less than or equal to 32.
constexpr unsigned int kNotSupportedSampleCounts = VK_SAMPLE_COUNT_64_BIT;
mNativeExtensions.sampleVariablesOES =
supportSampleRateShading && (vk_gl::GetMaxSampleCount(kNotSupportedSampleCounts) == 0);
// Atomic image operations in the vertex and fragment shaders require the // Atomic image operations in the vertex and fragment shaders require the
// vertexPipelineStoresAndAtomics and fragmentStoresAndAtomics Vulkan features respectively. // vertexPipelineStoresAndAtomics and fragmentStoresAndAtomics Vulkan features respectively.
// If either of these features is not present, the number of image uniforms for that stage is // If either of these features is not present, the number of image uniforms for that stage is
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -11,3 +11,11 @@ ...@@ -11,3 +11,11 @@
3589 VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.centroid_qualifier.default_framebuffer = FAIL 3589 VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.centroid_qualifier.default_framebuffer = FAIL
3589 VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.sample_qualifier.default_framebuffer = FAIL 3589 VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.sample_qualifier.default_framebuffer = FAIL
3589 VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.array_element.default_framebuffer = FAIL 3589 VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.array_element.default_framebuffer = FAIL
// Cannot ignore multisampling-related operations when the target is a single-sampled target:
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.discard_half_per_*.default_framebuffer = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.inverse_per_*.default_framebuffer = FAIL
// Cannot ignore SampleShadingEnable when the target is a single-sampled target:
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples.default_framebuffer = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.default_framebuffer = FAIL
\ No newline at end of file
...@@ -186,6 +186,44 @@ ...@@ -186,6 +186,44 @@
// Cannot create 2D (array) view of 3D texture. // Cannot create 2D (array) view of 3D texture.
3886 VULKAN : dEQP-GLES31.functional.image_load_store.3d.*layer = FAIL 3886 VULKAN : dEQP-GLES31.functional.image_load_store.3d.*layer = FAIL
// Cannot support a non-const indexing for gl_SampleMask or gl_SampleMaskIn variables:
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.discard_half_per_*.multisample_*_1 = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.discard_half_per_*.multisample_*_2 = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.discard_half_per_*.multisample_*_4 = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.discard_half_per_*.multisample_*_8 = FAIL
// Cannot ignore multisampling-related operations when the target is a single-sampled target:
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.discard_half_per_*.default_framebuffer = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.discard_half_per_*.singlesample_texture = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.discard_half_per_*.singlesample_rbo = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.inverse_per_*.default_framebuffer = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.inverse_per_*.singlesample_texture = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.inverse_per_*.singlesample_rbo = FAIL
// Cannot ignore SampleShadingEnable when the target is a single-sampled target:
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples.default_framebuffer = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples.singlesample_texture = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples.singlesample_rbo = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bits_unique_per_two_samples.singlesample_texture = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.*_per_two_samples.default_framebuffer = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.*_per_two_samples.singlesample_texture = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_mask.*_per_two_samples.singlesample_rbo = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.default_framebuffer = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.singlesample_texture = FAIL
3588 VULKAN : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.singlesample_rbo = FAIL
////
//// AMD Vulkan expectations
////
// Cannot support the per-sample shading when gl_SampleID or gl_SamplePosition:
3588 VULKAN AMD : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit*_per_sample.multisample_*_1 = FAIL
3588 VULKAN AMD : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit*_per_sample.multisample_*_2 = FAIL
3588 VULKAN AMD : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit*_per_sample.multisample_*_4 = FAIL
3588 VULKAN AMD : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit*_per_sample.multisample_*_8 = FAIL
3588 VULKAN AMD : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples.multisample_*_4 = FAIL
3588 VULKAN AMD : dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples.multisample_*_8 = FAIL
//// ////
//// Android (i.e. Pixel*) Vulkan expectations //// Android (i.e. Pixel*) Vulkan expectations
//// ////
...@@ -297,3 +335,8 @@ ...@@ -297,3 +335,8 @@
// Skip on Pixel2 to reduce the bots test time so that it won't timeout // Skip on Pixel2 to reduce the bots test time so that it won't timeout
172936025 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.*.* = SKIP 172936025 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.*.* = SKIP
172936025 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.compressed.viewclass_astc*.*.* = SKIP 172936025 VULKAN PIXEL2ORXL : dEQP-GLES31.functional.copy_image.compressed.viewclass_astc*.*.* = SKIP
// Cannot support a seperate set of fragment shader input when per-sample shading:
3588 VULKAN ANDROID : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_*_1 = FAIL
3588 VULKAN ANDROID : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_*_2 = FAIL
3588 VULKAN ANDROID : dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_*_4 = FAIL
...@@ -59,6 +59,18 @@ ...@@ -59,6 +59,18 @@
4723 VULKAN NVIDIA : KHR-GLES31.core.shader_image_size.advanced-nonMS-vs-uint = SKIP 4723 VULKAN NVIDIA : KHR-GLES31.core.shader_image_size.advanced-nonMS-vs-uint = SKIP
4723 VULKAN NVIDIA : KHR-GLES31.core.program_interface_query.transform-feedback-types = SKIP 4723 VULKAN NVIDIA : KHR-GLES31.core.program_interface_query.transform-feedback-types = SKIP
// Cannot support incomplete multisample texture:
3588 VULKAN : KHR-GLES31.core.sample_variables*samples_0* = SKIP
// These test are failed, but the fault about incomplete multisample texture, these tests need to be SKIP.
// Incompatible between incomplete texture and sampler format (isampler2D or usampler2D):
3588 VULKAN : KHR-GLES31.core.sample_variables.mask.rgba8*i.* = SKIP
// Cannot support a non-const indexing for gl_SampleMask or gl_SampleMaskIn variables:
3588 VULKAN : KHR-GLES31.core.sample_variables.verification.extension = FAIL
3588 VULKAN : KHR-GLES31.core.sample_variables.mask.rgba8.samples_* = FAIL
3588 VULKAN : KHR-GLES31.core.sample_variables.mask.rgba32f.samples_* = FAIL
//// ////
//// Desktop Vulkan expectations //// Desktop Vulkan expectations
//// ////
......
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