diff --git a/include/platform/FeaturesGL_autogen.h b/include/platform/FeaturesGL_autogen.h index 87068b260..5376f3400 100644 --- a/include/platform/FeaturesGL_autogen.h +++ b/include/platform/FeaturesGL_autogen.h @@ -469,17 +469,27 @@ struct FeaturesGL : FeatureSetBase FeatureInfo supportsFragmentShaderInterlockNV = { "supportsFragmentShaderInterlockNV", FeatureCategory::OpenGLFeatures, - "GL context supports NV_fragment_shader_interlock extension", &members, + "Backend GL context supports NV_fragment_shader_interlock extension", &members, "http://anglebug.com/7279"}; FeatureInfo supportsFragmentShaderOrderingINTEL = { "supportsFragmentShaderOrderingINTEL", FeatureCategory::OpenGLFeatures, - "GL context supports GL_INTEL_fragment_shader_ordering extension", &members, + "Backend GL context supports GL_INTEL_fragment_shader_ordering extension", &members, "http://anglebug.com/7279"}; FeatureInfo supportsFragmentShaderInterlockARB = { "supportsFragmentShaderInterlockARB", FeatureCategory::OpenGLFeatures, - "GL context supports ARB_fragment_shader_interlock extension", &members, + "Backend GL context supports ARB_fragment_shader_interlock extension", &members, + "http://anglebug.com/7279"}; + + FeatureInfo supportsShaderFramebufferFetchEXT = { + "supportsShaderFramebufferFetchEXT", FeatureCategory::OpenGLFeatures, + "Backend GL context supports EXT_shader_framebuffer_fetch extension", &members, + "http://anglebug.com/7279"}; + + FeatureInfo supportsShaderFramebufferFetchNonCoherentEXT = { + "supportsShaderFramebufferFetchNonCoherentEXT", FeatureCategory::OpenGLFeatures, + "Backend GL context supports EXT_shader_framebuffer_fetch_non_coherent extension", &members, "http://anglebug.com/7279"}; }; diff --git a/include/platform/gl_features.json b/include/platform/gl_features.json index 8a682e8d4..6be5e6f75 100644 --- a/include/platform/gl_features.json +++ b/include/platform/gl_features.json @@ -648,7 +648,7 @@ "name": "supports_fragment_shader_interlock_NV", "category": "Features", "description": [ - "GL context supports NV_fragment_shader_interlock extension" + "Backend GL context supports NV_fragment_shader_interlock extension" ], "issue": "http://anglebug.com/7279" }, @@ -656,7 +656,7 @@ "name": "supports_fragment_shader_ordering_INTEL", "category": "Features", "description": [ - "GL context supports GL_INTEL_fragment_shader_ordering extension" + "Backend GL context supports GL_INTEL_fragment_shader_ordering extension" ], "issue": "http://anglebug.com/7279" }, @@ -664,7 +664,23 @@ "name": "supports_fragment_shader_interlock_ARB", "category": "Features", "description": [ - "GL context supports ARB_fragment_shader_interlock extension" + "Backend GL context supports ARB_fragment_shader_interlock extension" + ], + "issue": "http://anglebug.com/7279" + }, + { + "name": "supports_shader_framebuffer_fetch_EXT", + "category": "Features", + "description": [ + "Backend GL context supports EXT_shader_framebuffer_fetch extension" + ], + "issue": "http://anglebug.com/7279" + }, + { + "name": "supports_shader_framebuffer_fetch_non_coherent_EXT", + "category": "Features", + "description": [ + "Backend GL context supports EXT_shader_framebuffer_fetch_non_coherent extension" ], "issue": "http://anglebug.com/7279" } diff --git a/scripts/code_generation_hashes/ANGLE_features.json b/scripts/code_generation_hashes/ANGLE_features.json index edca8f543..f3cfb9167 100644 --- a/scripts/code_generation_hashes/ANGLE_features.json +++ b/scripts/code_generation_hashes/ANGLE_features.json @@ -2,7 +2,7 @@ "include/platform/FeaturesD3D_autogen.h": "9923fb44d0a6f31948d0c8f46ee1d9e2", "include/platform/FeaturesGL_autogen.h": - "b559f25f72ed9e103c39ef7e130ca58c", + "c192145f3939d4d0bf85a39649e0c14e", "include/platform/FeaturesMtl_autogen.h": "80c0f3379882d1f67e523a3a1530cd79", "include/platform/FeaturesVk_autogen.h": @@ -16,13 +16,13 @@ "include/platform/gen_features.py": "062989f7a8f3ff3b383f98fc8908dc33", "include/platform/gl_features.json": - "3fb9baa3748a8dd383cf189f1bc12d30", + "a50e9bd2fa9eb0685d9b1c118a21ad2c", "include/platform/mtl_features.json": "9833c17145ba2223da2e607a9340afda", "include/platform/vk_features.json": "288eb5ed66ea3758e0da7cd7ec1a0003", "util/angle_features_autogen.cpp": - "4913cb55fae7e72202fb43b5cff3a859", + "3e83b8a5de05708d1e6d42c5dd703744", "util/angle_features_autogen.h": - "a63db55999dfad8e96b8542bc7ce57bc" + "1654d31500bb6275b14253e733c7528b" } \ No newline at end of file diff --git a/scripts/code_generation_hashes/OpenGL_dispatch_table.json b/scripts/code_generation_hashes/OpenGL_dispatch_table.json index a983b1f1f..18e678fc7 100644 --- a/scripts/code_generation_hashes/OpenGL_dispatch_table.json +++ b/scripts/code_generation_hashes/OpenGL_dispatch_table.json @@ -2,17 +2,17 @@ "src/libANGLE/renderer/angle_format.py": "2f8fa768088e22b0963bbdf842d3e725", "src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp": - "a41b6954cf2e24ced156bc7c562f70dd", + "cdf6ad533825dda35be8bce54d6b8099", "src/libANGLE/renderer/gl/DispatchTableGL_autogen.h": - "3115c293d6612d10498a1063b8cebe1a", + "ec3d0795432ba5e1f5b5ca8d7f15ac8a", "src/libANGLE/renderer/gl/generate_gl_dispatch_table.py": "2fb7f3906b4966b192c629228bc3e961", "src/libANGLE/renderer/gl/gl_bindings_data.json": - "6aa7c139ca0717d08e46bf86e1bf85a2", + "b554149ac0698c1375631497289d470a", "src/libANGLE/renderer/gl/null_functions.cpp": - "3b385088fba2411f4159cad33bb949ee", + "877385b1ca96db7ca4273a4e786049b9", "src/libANGLE/renderer/gl/null_functions.h": - "e9d36d68a9dcb9ed8c855c3bd93b70e0", + "c5b478a8cf19536e886f50e559831105", "third_party/OpenGL-Registry/src/xml/gl.xml": "17dca5504997d75c0ea66759be34a594" } \ No newline at end of file diff --git a/src/compiler/translator/OutputGLSLBase.cpp b/src/compiler/translator/OutputGLSLBase.cpp index 57735a509..0c31d7809 100644 --- a/src/compiler/translator/OutputGLSLBase.cpp +++ b/src/compiler/translator/OutputGLSLBase.cpp @@ -170,23 +170,23 @@ std::string TOutputGLSLBase::getCommonLayoutQualifiers(TIntermSymbol *variable) const TType &type = variable->getType(); const TLayoutQualifier &layoutQualifier = type.getLayoutQualifier(); - if (type.getQualifier() == EvqFragmentOut || type.getQualifier() == EvqVertexIn || - IsVarying(type.getQualifier())) + if (type.getQualifier() == EvqFragmentOut || type.getQualifier() == EvqFragmentInOut) { - if (type.getQualifier() == EvqFragmentOut && layoutQualifier.index >= 0) + if (layoutQualifier.index >= 0) { out << listItemPrefix << "index = " << layoutQualifier.index; } - } - - if (type.getQualifier() == EvqFragmentOut) - { - if (layoutQualifier.yuv == true) + if (layoutQualifier.yuv) { out << listItemPrefix << "yuv"; } } + if (type.getQualifier() == EvqFragmentInOut && layoutQualifier.noncoherent) + { + out << listItemPrefix << "noncoherent"; + } + if (IsImage(type.getBasicType())) { if (layoutQualifier.imageInternalFormat != EiifUnspecified) @@ -261,8 +261,8 @@ void TOutputGLSLBase::writeLayoutQualifier(TIntermSymbol *variable) CommaSeparatedListItemPrefixGenerator listItemPrefix; - if (type.getQualifier() == EvqFragmentOut || type.getQualifier() == EvqVertexIn || - IsVarying(type.getQualifier())) + if (type.getQualifier() == EvqFragmentOut || type.getQualifier() == EvqFragmentInOut || + type.getQualifier() == EvqVertexIn || IsVarying(type.getQualifier())) { if (layoutQualifier.location >= 0) { @@ -361,17 +361,21 @@ const char *TOutputGLSLBase::mapQualifierToString(TQualifier qualifier) } } - // Handle qualifiers that produce different output based on shader type. switch (qualifier) { + // gl_ClipDistance / gl_CullDistance require different qualifiers based on shader type. case EvqClipDistance: case EvqCullDistance: return mShaderType == GL_FRAGMENT_SHADER ? "in" : "out"; - default: - break; - } - return sh::getQualifierString(qualifier); + // gl_LastFragColor / gl_LastFragData have no qualifiers. + case EvqLastFragData: + case EvqLastFragColor: + return nullptr; + + default: + return sh::getQualifierString(qualifier); + } } namespace @@ -1400,14 +1404,26 @@ bool NeedsToWriteLayoutQualifier(const TType &type) const TLayoutQualifier &layoutQualifier = type.getLayoutQualifier(); - if ((type.getQualifier() == EvqFragmentOut || type.getQualifier() == EvqVertexIn || - IsVarying(type.getQualifier())) && + if ((type.getQualifier() == EvqFragmentOut || type.getQualifier() == EvqFragmentInOut || + type.getQualifier() == EvqVertexIn || IsVarying(type.getQualifier())) && layoutQualifier.location >= 0) { return true; } - if (type.getQualifier() == EvqFragmentOut && layoutQualifier.yuv == true) + if (type.getQualifier() == EvqFragmentOut || type.getQualifier() == EvqFragmentInOut) + { + if (layoutQualifier.index >= 0) + { + return true; + } + if (layoutQualifier.yuv) + { + return true; + } + } + + if (type.getQualifier() == EvqFragmentInOut && layoutQualifier.noncoherent) { return true; } diff --git a/src/compiler/translator/TranslatorESSL.cpp b/src/compiler/translator/TranslatorESSL.cpp index 2246dc0b2..97b4faaa6 100644 --- a/src/compiler/translator/TranslatorESSL.cpp +++ b/src/compiler/translator/TranslatorESSL.cpp @@ -178,6 +178,18 @@ void TranslatorESSL::writeExtensionBehavior(const ShCompileOptions &compileOptio // TODO(anglebug.com/7279): future impl that uses EXT_shader_framebuffer_fetch. continue; } + else if (iter->first == TExtension::EXT_shader_framebuffer_fetch) + { + sink << "#extension GL_EXT_shader_framebuffer_fetch : " + << GetBehaviorString(iter->second) << "\n"; + continue; + } + else if (iter->first == TExtension::EXT_shader_framebuffer_fetch_non_coherent) + { + sink << "#extension GL_EXT_shader_framebuffer_fetch_non_coherent : " + << GetBehaviorString(iter->second) << "\n"; + continue; + } else if (iter->first == TExtension::WEBGL_video_texture) { // Don't emit anything. This extension is emulated diff --git a/src/libANGLE/ErrorStrings.h b/src/libANGLE/ErrorStrings.h index 622edcf25..df352b811 100644 --- a/src/libANGLE/ErrorStrings.h +++ b/src/libANGLE/ErrorStrings.h @@ -148,6 +148,7 @@ MSG kFixedNotInWebGL = "GL_FIXED is not supported in WebGL."; MSG kFormatNotRenderable = "Internal format is not renderable."; MSG kFragDataBindingIndexOutOfRange = "Fragment output color index must be zero or one."; MSG kFragmentInputTypeNotFloatingPoint = "Fragment input type is not a floating point scalar or vector."; +MSG kFramebufferFetchNonCoherentExtensionNotEnabled = "GL_EXT_shader_framebuffer_fetch_non_coherent not enabled."; MSG kFramebufferIncomplete = "Framebuffer is incomplete."; MSG kFramebufferIncompleteAttachment = "Attachment type must be compatible with attachment object."; MSG kFramebufferIncompleteAttachmentDepthGreaterThanMaxLayers = "Framebuffer is incomplete: Attachment depth is greater than MAX_FRAMEBUFFER_LAYERS."; diff --git a/src/libANGLE/renderer/gl/ContextGL.cpp b/src/libANGLE/renderer/gl/ContextGL.cpp index 4979a6ff4..a41a18e34 100644 --- a/src/libANGLE/renderer/gl/ContextGL.cpp +++ b/src/libANGLE/renderer/gl/ContextGL.cpp @@ -982,6 +982,11 @@ angle::Result ContextGL::memoryBarrierByRegion(const gl::Context *context, GLbit return mRenderer->memoryBarrierByRegion(barriers); } +void ContextGL::framebufferFetchBarrier() +{ + mRenderer->framebufferFetchBarrier(); +} + void ContextGL::setMaxShaderCompilerThreads(GLuint count) { mRenderer->setMaxShaderCompilerThreads(count); diff --git a/src/libANGLE/renderer/gl/ContextGL.h b/src/libANGLE/renderer/gl/ContextGL.h index 6916662f7..9b15aaa22 100644 --- a/src/libANGLE/renderer/gl/ContextGL.h +++ b/src/libANGLE/renderer/gl/ContextGL.h @@ -273,6 +273,8 @@ class ContextGL : public ContextImpl angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override; angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override; + void framebufferFetchBarrier() override; + void setMaxShaderCompilerThreads(GLuint count) override; void invalidateTexture(gl::TextureType target) override; diff --git a/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp index acfc840cc..0fc638a77 100644 --- a/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp +++ b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp @@ -2793,6 +2793,11 @@ void DispatchTableGL::initProcsSharedExtensions(const std::set &ext ASSIGN("glValidateProgramPipelineEXT", validateProgramPipeline); } + if (extensions.count("GL_EXT_shader_framebuffer_fetch_non_coherent") != 0) + { + ASSIGN("glFramebufferFetchBarrierEXT", framebufferFetchBarrierEXT); + } + if (extensions.count("GL_EXT_texture_storage") != 0) { ASSIGN("glTexStorage1DEXT", texStorage1D); @@ -5599,6 +5604,11 @@ void DispatchTableGL::initProcsSharedExtensionsNULL(const std::set validateProgramPipeline = &glValidateProgramPipelineNULL; } + if (extensions.count("GL_EXT_shader_framebuffer_fetch_non_coherent") != 0) + { + framebufferFetchBarrierEXT = &glFramebufferFetchBarrierEXTNULL; + } + if (extensions.count("GL_EXT_texture_storage") != 0) { texStorage1D = &glTexStorage1DNULL; diff --git a/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h index ddd633ea8..730729614 100644 --- a/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h +++ b/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h @@ -790,6 +790,9 @@ class DispatchTableGL : angle::NonCopyable PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC importSemaphoreWin32HandleEXT = nullptr; PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC importSemaphoreWin32NameEXT = nullptr; + // GL_EXT_shader_framebuffer_fetch_non_coherent + PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC framebufferFetchBarrierEXT = nullptr; + // GL_EXT_texture_buffer PFNGLTEXBUFFEREXTPROC texBufferEXT = nullptr; PFNGLTEXBUFFERRANGEEXTPROC texBufferRangeEXT = nullptr; diff --git a/src/libANGLE/renderer/gl/RendererGL.cpp b/src/libANGLE/renderer/gl/RendererGL.cpp index 6b60a06e0..70cea0127 100644 --- a/src/libANGLE/renderer/gl/RendererGL.cpp +++ b/src/libANGLE/renderer/gl/RendererGL.cpp @@ -385,6 +385,12 @@ angle::Result RendererGL::memoryBarrierByRegion(GLbitfield barriers) return angle::Result::Continue; } +void RendererGL::framebufferFetchBarrier() +{ + mFunctions->framebufferFetchBarrierEXT(); + mWorkDoneSinceLastFlush = true; +} + bool RendererGL::bindWorkerContext(std::string *infoLog) { if (mFeatures.disableWorkerContexts.enabled) diff --git a/src/libANGLE/renderer/gl/RendererGL.h b/src/libANGLE/renderer/gl/RendererGL.h index d2a4ed970..d2a70fef4 100644 --- a/src/libANGLE/renderer/gl/RendererGL.h +++ b/src/libANGLE/renderer/gl/RendererGL.h @@ -123,6 +123,8 @@ class RendererGL : angle::NonCopyable angle::Result memoryBarrier(GLbitfield barriers); angle::Result memoryBarrierByRegion(GLbitfield barriers); + void framebufferFetchBarrier(); + bool bindWorkerContext(std::string *infoLog); void unbindWorkerContext(); // Checks if the driver has the KHR_parallel_shader_compile or ARB_parallel_shader_compile diff --git a/src/libANGLE/renderer/gl/functionsgl_typedefs.h b/src/libANGLE/renderer/gl/functionsgl_typedefs.h index 22ef0cc4d..b0c5abd2f 100644 --- a/src/libANGLE/renderer/gl/functionsgl_typedefs.h +++ b/src/libANGLE/renderer/gl/functionsgl_typedefs.h @@ -1985,6 +1985,9 @@ typedef void(INTERNAL_GL_APIENTRY *PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC)( GLint level, GLsizei samples); +// GL_EXT_shader_framebuffer_fetch_non_coherent +typedef void(INTERNAL_GL_APIENTRY *PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC)(); + } // namespace rx #endif // LIBANGLE_RENDERER_GL_FUNCTIONSGLTYPEDEFS_H_ diff --git a/src/libANGLE/renderer/gl/gl_bindings_data.json b/src/libANGLE/renderer/gl/gl_bindings_data.json index aecd0a276..df5f1dc5f 100644 --- a/src/libANGLE/renderer/gl/gl_bindings_data.json +++ b/src/libANGLE/renderer/gl/gl_bindings_data.json @@ -866,5 +866,10 @@ [ "RenderbufferStorageMultisampleEXT", "FramebufferTexture2DMultisampleEXT" + ], + + "GL_EXT_shader_framebuffer_fetch_non_coherent": + [ + "FramebufferFetchBarrierEXT" ] } diff --git a/src/libANGLE/renderer/gl/null_functions.cpp b/src/libANGLE/renderer/gl/null_functions.cpp index 793fc5c70..0413b9c0e 100644 --- a/src/libANGLE/renderer/gl/null_functions.cpp +++ b/src/libANGLE/renderer/gl/null_functions.cpp @@ -810,6 +810,8 @@ void INTERNAL_GL_APIENTRY glFlushMappedNamedBufferRangeNULL(GLuint buffer, GLsizeiptr length) {} +void INTERNAL_GL_APIENTRY glFramebufferFetchBarrierEXTNULL() {} + void INTERNAL_GL_APIENTRY glFramebufferParameteriNULL(GLenum target, GLenum pname, GLint param) {} void INTERNAL_GL_APIENTRY glFramebufferRenderbufferNULL(GLenum target, diff --git a/src/libANGLE/renderer/gl/null_functions.h b/src/libANGLE/renderer/gl/null_functions.h index d5e56ea70..3a3448507 100644 --- a/src/libANGLE/renderer/gl/null_functions.h +++ b/src/libANGLE/renderer/gl/null_functions.h @@ -549,6 +549,7 @@ void INTERNAL_GL_APIENTRY glFlushMappedBufferRangeNULL(GLenum target, void INTERNAL_GL_APIENTRY glFlushMappedNamedBufferRangeNULL(GLuint buffer, GLintptr offset, GLsizeiptr length); +void INTERNAL_GL_APIENTRY glFramebufferFetchBarrierEXTNULL(); void INTERNAL_GL_APIENTRY glFramebufferParameteriNULL(GLenum target, GLenum pname, GLint param); void INTERNAL_GL_APIENTRY glFramebufferRenderbufferNULL(GLenum target, GLenum attachment, diff --git a/src/libANGLE/renderer/gl/renderergl_utils.cpp b/src/libANGLE/renderer/gl/renderergl_utils.cpp index 24be34736..c64007971 100644 --- a/src/libANGLE/renderer/gl/renderergl_utils.cpp +++ b/src/libANGLE/renderer/gl/renderergl_utils.cpp @@ -1599,6 +1599,18 @@ void GenerateCaps(const FunctionsGL *functions, features.supportsFragmentShaderInterlockARB.enabled; } + // EXT_shader_framebuffer_fetch. + if (features.supportsShaderFramebufferFetchEXT.enabled) + { + extensions->shaderFramebufferFetchEXT = true; + } + + // EXT_shader_framebuffer_fetch_non_coherent. + if (features.supportsShaderFramebufferFetchNonCoherentEXT.enabled) + { + extensions->shaderFramebufferFetchNonCoherentEXT = true; + } + extensions->copyTextureCHROMIUM = true; extensions->syncQueryCHROMIUM = SyncQueryGL::IsSupported(functions); @@ -2353,6 +2365,15 @@ void InitializeFeatures(const FunctionsGL *functions, angle::FeaturesGL *feature ANGLE_FEATURE_CONDITION(features, supportsFragmentShaderInterlockARB, functions->isAtLeastGL(gl::Version(4, 5)) && functions->hasGLExtension("GL_ARB_fragment_shader_interlock")); + + // EXT_shader_framebuffer_fetch + ANGLE_FEATURE_CONDITION(features, supportsShaderFramebufferFetchEXT, + functions->hasGLESExtension("GL_EXT_shader_framebuffer_fetch")); + + // EXT_shader_framebuffer_fetch_non_coherent + ANGLE_FEATURE_CONDITION( + features, supportsShaderFramebufferFetchNonCoherentEXT, + functions->hasGLESExtension("EXT_shader_framebuffer_fetch_non_coherent")); } void InitializeFrontendFeatures(const FunctionsGL *functions, angle::FrontendFeatures *features) diff --git a/src/libANGLE/validationESEXT.cpp b/src/libANGLE/validationESEXT.cpp index 552904117..c70820641 100644 --- a/src/libANGLE/validationESEXT.cpp +++ b/src/libANGLE/validationESEXT.cpp @@ -2043,6 +2043,12 @@ bool ValidatePixelLocalStorageBarrierANGLE(const Context *context, angle::EntryP bool ValidateFramebufferFetchBarrierEXT(const Context *context, angle::EntryPoint entryPoint) { + if (!context->getExtensions().shaderFramebufferFetchNonCoherentEXT) + { + context->validationError(entryPoint, GL_INVALID_OPERATION, + kFramebufferFetchNonCoherentExtensionNotEnabled); + return false; + } return true; } diff --git a/src/tests/angle_end2end_tests_expectations.txt b/src/tests/angle_end2end_tests_expectations.txt index e542d90d6..1377e1643 100644 --- a/src/tests/angle_end2end_tests_expectations.txt +++ b/src/tests/angle_end2end_tests_expectations.txt @@ -429,6 +429,8 @@ 7414 PIXEL4ORXL GLES : MultithreadingTestES3.ThreadB*BeforeThreadASync* = SKIP 7414 PIXEL4ORXL GLES : MultithreadingTestES3.ThreadCWaitBeforeThreadBSyncFinish/* = SKIP 7414 PIXEL4ORXL GLES : EGLMultiContextTest.ThreadB*BeforeThreadASync* = SKIP +7703 PIXEL4ORXL GLES : FramebufferFetchES31.ProgramPipeline* = SKIP +7703 PIXEL4ORXL GLES : FramebufferFetchES31.DrawNonFetchDrawFetchInStorageBuffer* = SKIP 3423 PIXEL4ORXL VULKAN : ClearTestES3.MaskedClearBufferBug/* = SKIP 3423 PIXEL4ORXL VULKAN : DrawBuffersWebGL2Test.TwoProgramsWithDifferentOutputsAndClear/* = SKIP diff --git a/util/angle_features_autogen.cpp b/util/angle_features_autogen.cpp index 6f1aa1ecc..8060d8f89 100644 --- a/util/angle_features_autogen.cpp +++ b/util/angle_features_autogen.cpp @@ -279,8 +279,11 @@ constexpr PackedEnumMap kFeatureNames = {{ {Feature::SupportsRenderPassStoreOpNone, "supportsRenderPassStoreOpNone"}, {Feature::SupportsShaderFloat16, "supportsShaderFloat16"}, {Feature::SupportsShaderFramebufferFetch, "supportsShaderFramebufferFetch"}, + {Feature::SupportsShaderFramebufferFetchEXT, "supportsShaderFramebufferFetchEXT"}, {Feature::SupportsShaderFramebufferFetchNonCoherent, "supportsShaderFramebufferFetchNonCoherent"}, + {Feature::SupportsShaderFramebufferFetchNonCoherentEXT, + "supportsShaderFramebufferFetchNonCoherentEXT"}, {Feature::SupportsShaderStencilExport, "supportsShaderStencilExport"}, {Feature::SupportsSharedPresentableImageExtension, "supportsSharedPresentableImageExtension"}, {Feature::SupportsSurfaceCapabilities2Extension, "supportsSurfaceCapabilities2Extension"}, diff --git a/util/angle_features_autogen.h b/util/angle_features_autogen.h index 4d038a944..d3f324000 100644 --- a/util/angle_features_autogen.h +++ b/util/angle_features_autogen.h @@ -262,7 +262,9 @@ enum class Feature SupportsRenderPassStoreOpNone, SupportsShaderFloat16, SupportsShaderFramebufferFetch, + SupportsShaderFramebufferFetchEXT, SupportsShaderFramebufferFetchNonCoherent, + SupportsShaderFramebufferFetchNonCoherentEXT, SupportsShaderStencilExport, SupportsSharedPresentableImageExtension, SupportsSurfaceCapabilities2Extension,