Android OpenGL ES 3.0 not supported?

Hello guys,
I had a quick glance at the Diligent Engine this afternoon. It seems to be working fine on MacOS, Win32, Android etc.
I have a small problem on Android, though. One of my devices supports OpenGL ES 3.1 and everthing works just fine. But I have another device that only supports OpenGL ES 3.0, and the demos will just crash since the engine fails to create an OpenGL ES context.
As far as I could look into the sources, it seems that you are actually targetting OpenGL ES 3.1+ features on Android. Since the docs indicate that you support OpenGLES3.0+ on Android, I'm a bit confused here.
Is there any I should do to have your engine working on my OpenGL ES 3.0 device?
Thank you for your help!

Hello!
OpenGLES3.0 should work on Android because the samples (these which don't lack capabilities) work fine on iOS, and iOS only supports ES3.0. But, yeah, the GLES version is actually hardcoded on Android to 3.1:
https://github.com/DiligentGraphics/DiligentCore/blob/master/Graphics/GraphicsEngineOpenGL/src/GLContextAndroid.cpp#L135
Do you know if there is a robust way to figure out what the latest GLES version is supported by the device? As a workaround I guess we can try to create 3.1 context first and 3.0 if 3.1 fails.

Yey. Thanks for the quick answer!
Personally, what I do on Android with the GLSurface view is that I try to create the highest possible OpenGL context (e.g: OpenGL ES 3.2). If that fails, I fallback to a lower version (e.g: OpenGL ES 3.1) and so on until I reach the lowest possible acceptable version (in our case: OpenGL ES 3.0). Maybe there's a better way I am not aware of neither.
Anyway, after I did a quick hardcoded test with an OpenGL ES 3.0 context, I had other issues.
First one was in GLSLSourceBuilder.cpp where you define some constants / default précisions on types that are OpenGL ES 3.1 specific, or that require some extensions that may not be available on all core OpenGL ES 3.0 devices.
Second issue is related to some assertion failure in ShaderGLImpl.cpp. I didn't have time to dig more than yet, but maybe you'll quickly figure out what's going wrong, or what I missed.
In my organisation, we are specifically targetting mobile devices that support at least OpenGL ES 3.0. If your engine properly supports that OpenGL ES version, we may seriously consider switching to your engine 🤞

OK, will take a look. As I mentioned, the engine works fine in ES3.0 mode on iOS, so there are no reasons it wouldn't run on Android.

Yes, maybe it's just a mixup with some #ifdef PLATFORM_ANDROID somewhere. Let me know if I can be of any help. Thanks for everything!

The engine should work fine on GLES3.0 Android devices now. One thing though: the engine relies on ARB_separate_shader_objects extension. 3 days ago the extension celebrated its 9-year anniversary, so hopefully it is widely available these days.
The engine can run without separate shaders, but resource binding functionality will be severely limited. All samples & tutorials assume separate shaders are available and will not run if the device does not support the extension.

Thank you very much! I'll check it out on Monday when I get back to the office.
 What limitations does it bring in your engine w/o the separable shader programs extension available?

Diligent implements shader resource binding model that is optimized for next-generation APIs. If separate shaders are not available, most of this API will not work and the only way to bind resources is to bind resources directly to the pipeline state object through IPipelineState::BindShaderResources() method.

Hi :)
It seems that I still have some shaders compiling issues on my old testing device. Apparently, the GLSL compiler doesn't like the precision highp statements on samplerCubeShadow, samplerCubeShadow, sampler2DShadow, sampler2DArrayShadow and samplerCubeArrayShadow.
The weird thing — if I'm correct — is that  these types are part of the OpenGL ES 3.0 SL specification. I'll attach the Tutorial03_Texturing's log file below in case you figure something out.
As a final note, it seems that my testing device won't support the ARB_separate_shader_objects extension. Please, pardon my insistence, but is there any possible workaround in the engine to fake a shader resource binding model w/o the ARB_separate_shader_objects so that we can keep the application code the same?
Anyway, thank you very much for all you great work!
02-18 11:21:26.969 27384-27384/? E/Zygote: v2
02-18 11:21:26.969 27384-27384/? I/libpersona: KNOX_SDCARD checking this for 10122
02-18 11:21:26.969 27384-27384/? I/libpersona: KNOX_SDCARD not a persona
02-18 11:21:26.969 27384-27384/? I/SELinux: Function: selinux_compare_spd_ram , priority [2] , priority version is VE=SEPF_SM-G361F_5.1.1_0045
02-18 11:21:26.969 27384-27384/? E/SELinux: [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL
02-18 11:21:26.969 27384-27384/? I/art: Late-enabling -Xcheck:jni
02-18 11:21:26.979 27384-27384/? D/TimaKeyStoreProvider: in addTimaSignatureService
02-18 11:21:26.979 27384-27384/? D/TimaKeyStoreProvider: TimaSignature is unavailable
02-18 11:21:26.979 27384-27384/? D/ActivityThread: Added TimaKesytore provider
02-18 11:21:26.989 27384-27384/? I/SAMP: ActivityThread() - SAMP_ENABLE : true
02-18 11:21:26.989 27384-27391/? I/art: Debugger is no longer active
02-18 11:21:27.009 27384-27384/? D/ContextImpl: ContextImpl running for user UserHandle{0} 0
02-18 11:21:27.019 27384-27384/? D/ContextImpl: ContextImpl running for user UserHandle{0} 0
02-18 11:21:27.019 27384-27384/? W/ResourcesManager: getTopLevelResources: null for user  0
02-18 11:21:27.029 27384-27384/? W/ActivityThread: Application com.diligentengine.tutorial03_texturing.Tutorial03Application is waiting for the debugger on port 8100...
02-18 11:21:27.029 27384-27384/? I/System.out: Sending WAIT chunk
02-18 11:21:28.209 27384-27391/com.diligentengine.tutorial03_texturing.Tutorial03Application I/art: Debugger is active
02-18 11:21:28.229 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: Debugger has connected
02-18 11:21:28.229 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: waiting for debugger to settle...
02-18 11:21:28.429 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: waiting for debugger to settle...
02-18 11:21:28.629 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: waiting for debugger to settle...
02-18 11:21:28.829 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: waiting for debugger to settle...
02-18 11:21:29.039 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: waiting for debugger to settle...
02-18 11:21:29.239 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: waiting for debugger to settle...
02-18 11:21:29.439 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: waiting for debugger to settle...
02-18 11:21:29.629 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: waiting for debugger to settle...
02-18 11:21:29.829 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: waiting for debugger to settle...
02-18 11:21:30.039 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: waiting for debugger to settle...
02-18 11:21:30.239 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/System.out: debugger has settled (1468)
02-18 11:21:30.239 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application D/ContextImpl: ContextImpl running for user UserHandle{0} 0
02-18 11:21:30.249 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application W/native-activity: onCreate
02-18 11:21:30.249 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ResourcesManager: getTopLevelResources: null for user  0
02-18 11:21:30.249 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application D/DisplayManager: DisplayManager()
02-18 11:21:30.269 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application W/linker: libGraphicsEngineOpenGL.so: unused DT entry: type 0x6ffffffe arg 0x25fcc
02-18 11:21:30.269 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application W/linker: libGraphicsEngineOpenGL.so: unused DT entry: type 0x6fffffff arg 0x3
02-18 11:21:30.279 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/native-activity: Loaded GraphicsEngineOpenGL library.
02-18 11:21:30.279 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application D/ContextImpl: ContextImpl running for user UserHandle{0} 0
02-18 11:21:30.279 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ResourcesManager: getTopLevelResources: null for user  0
02-18 11:21:30.299 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application D/PhoneWindow: *FMB* installDecor mIsFloating : false
02-18 11:21:30.299 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application D/PhoneWindow: *FMB* installDecor flags : 8454400
02-18 11:21:30.299 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/obb/com.diligentengine.tutorial03_texturing.Tutorial03Application
02-18 11:21:30.309 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/data/com.diligentengine.tutorial03_texturing.Tutorial03Application/files
02-18 11:21:30.309 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application W/linker: libTutorial03_Texturing.so: unused DT entry: type 0x6ffffffe arg 0x3ba4
02-18 11:21:30.309 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application W/linker: libTutorial03_Texturing.so: unused DT entry: type 0x6fffffff arg 0x3
02-18 11:21:30.309 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: Creating: 0xab3b1a58
02-18 11:21:30.309 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: Config: mcc=0 mnc=0 lang=fr cnt=FR orien=1 touch=3 dens=240 keys=1 nav=1 keysHid=3 navHid=0 sdk=22 size=2 long=2 modetype=1 modenight=1
02-18 11:21:30.309 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: Start: 0xab3b1a58
02-18 11:21:30.319 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: activityState=10
02-18 11:21:30.319 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: Resume: 0xab3b1a58
02-18 11:21:30.319 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: activityState=11
02-18 11:21:30.329 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application D/DisplayManager: DisplayManager()
02-18 11:21:30.329 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: InputQueueCreated: 0xab3b1a58 -- 0xab3adf48
02-18 11:21:30.329 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: APP_CMD_INPUT_CHANGED
02-18 11:21:30.329 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: Attaching input queue to looper
02-18 11:21:30.339 27384-27416/com.diligentengine.tutorial03_texturing.Tutorial03Application D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
02-18 11:21:30.339 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application D/PhoneWindow: *FMB* isFloatingMenuEnabled mFloatingMenuBtn : null
02-18 11:21:30.339 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application D/PhoneWindow: *FMB* isFloatingMenuEnabled return false
02-18 11:21:30.349 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: NativeWindowCreated: 0xab3b1a58 -- 0xab3c69b0
02-18 11:21:30.349 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: APP_CMD_INIT_WINDOW
02-18 11:21:30.349 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application D/ViewSystem: ViewRootImpl >> surfaceCreated
02-18 11:21:30.349 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: User-defined allocator is not provided. Using default allocator.
02-18 11:21:30.359 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application D/ViewSystem: ViewRootImpl >> surfaceChanged W=480, H=800)
02-18 11:21:30.369 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: Chosen EGL config: 8 bit color, 24 bit depth
02-18 11:21:30.369 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application D/GC: <tid=27415> Warning: OES3.2 is not supported.
02-18 11:21:30.369 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application D/v_gal: [tid=27415] gcmONERROR: status=-1(gcvSTATUS_INVALID_ARGUMENT) @ eglCreateContext(1318)
02-18 11:21:30.369 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application D/GC: <tid=27415> Warning: OES3.1 is not supported.
02-18 11:21:30.369 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application D/v_gal: [tid=27415] gcmONERROR: status=-1(gcvSTATUS_INVALID_ARGUMENT) @ eglCreateContext(1318)
02-18 11:21:30.369 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application D/GC: <tid=27415> OES30 ===> GC Version   : GC version rls_5011p6_GC5.5.14
02-18 11:21:30.389 27384-27416/com.diligentengine.tutorial03_texturing.Tutorial03Application I/OpenGLRenderer: Initialized EGL, version 1.4
02-18 11:21:30.389 27384-27416/com.diligentengine.tutorial03_texturing.Tutorial03Application D/GC: <tid=27416> OES20 ===> GC Version   : GC version rls_5011p6_GC5.5.14
02-18 11:21:30.389 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: Created OpenGLES Context 3.0
02-18 11:21:30.389 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: GL Version: OpenGL ES 3.0
02-18 11:21:30.399 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application E/Diligent Engine: Diligent Engine: ERROR: Failed to enable SRGB framebuffers
02-18 11:21:30.399 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: Supported extensions:
    GL_EXT_debug_marker GL_OES_vertex_type_10_10_10_2 GL_OES_vertex_half_float GL_OES_element_index_uint GL_OES_mapbuffer GL_OES_vertex_array_object GL_OES_compressed_ETC1_RGB8_texture GL_OES_compressed_paletted_texture GL_OES_texture_npot GL_OES_rgb8_rgba8 GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_OES_depth24 GL_OES_depth32 GL_OES_packed_depth_stencil GL_OES_fbo_render_mipmap GL_OES_get_program_binary GL_OES_fragment_precision_high GL_OES_standard_derivatives GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_required_internalformat GL_OES_surfaceless_context GL_EXT_texture_type_2_10_10_10_REV GL_EXT_texture_filter_anisotropic GL_EXT_texture_compression_dxt1 GL_EXT_texture_format_BGRA8888 GL_EXT_texture_compression_s3tc GL_EXT_read_format_bgra GL_EXT_multi_draw_arrays GL_EXT_frag_depth GL_EXT_discard_framebuffer GL_EXT_blend_minmax GL_EXT_robustness GL_EXT_unpack_subimage GL_VIV_direct_texture GL_MRVL_linear_texture
02-18 11:21:30.399 27384-27416/com.diligentengine.tutorial03_texturing.Tutorial03Application D/OpenGLRenderer: Enabling debug mode 0
02-18 11:21:30.419 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application D/v_gal: [tid=27415] gcmONERROR: status=-2001(gcvSTATUS_COMPILER_FE_PARSER_ERROR) @ gcCompileShader(452)
02-18 11:21:30.419 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application D/v_gal: [tid=27415] gcmONERROR: status=-2001(gcvSTATUS_COMPILER_FE_PARSER_ERROR) @ __glChipCompileShader(4385)
02-18 11:21:30.419 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: Failed shader full source:

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    #version 300 es
    #ifndef GL_ES
    #  define GL_ES 1
    #endif
    #define PLATFORM_ANDROID 1
    precision highp float;
    precision highp int;
    precision highp sampler2D;
    precision highp sampler3D;
    precision highp samplerCube;
    precision highp samplerCubeShadow;
    precision highp sampler2DShadow;
    precision highp sampler2DArray;
    precision highp sampler2DArrayShadow;
    precision highp isampler2D;
    precision highp isampler3D;
    precision highp isamplerCube;
    precision highp isampler2DArray;
    precision highp usampler2D;
    precision highp usampler3D;
    precision highp usamplerCube;
    precision highp usampler2DArray;
    layout(std140) uniform;
    #define VERTEX_SHADER
    #ifndef GL_ES
    out gl_PerVertex
    {
    	vec4 gl_Position;
    };
    #endif
    void main()
    {
       vec4 Bounds = vec4(-1.0, -1.0, 1.0, 1.0);
       vec2 PosXY[4];
02-18 11:21:30.419 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application A/Diligent Engine: Diligent Engine: CRITICAL ERROR in ShaderGLImpl() (ShaderGLImpl.cpp, 113): Failed to compile shader file "TexRegionRender : Vertex shader"
    InfoLog:
    (11:0) : error : invalid type field for default precision statement
    (12:0) : error : invalid type field for default precision statement
02-18 11:21:30.419 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application E/Diligent Engine: Diligent Engine: ERROR in CreateDeviceObject() (RenderDeviceBase.h, 462): Failed to create shader object "TexRegionRender : Vertex shader"
02-18 11:21:30.439 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application D/v_gal: [tid=27415] gcmONERROR: status=-2001(gcvSTATUS_COMPILER_FE_PARSER_ERROR) @ gcCompileShader(452)
02-18 11:21:30.439 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application D/v_gal: [tid=27415] gcmONERROR: status=-2001(gcvSTATUS_COMPILER_FE_PARSER_ERROR) @ __glChipCompileShader(4385)
02-18 11:21:30.439 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: Failed shader full source:

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    #version 300 es
    #ifndef GL_ES
    #  define GL_ES 1
    #endif
    #define PLATFORM_ANDROID 1
    precision highp float;
    precision highp int;
    precision highp sampler2D;
    precision highp sampler3D;
    precision highp samplerCube;
    precision highp samplerCubeShadow;
    precision highp sampler2DShadow;
    precision highp sampler2DArray;
    precision highp sampler2DArrayShadow;
    precision highp isampler2D;
    precision highp isampler3D;
    precision highp isamplerCube;
    precision highp isampler2DArray;
    precision highp usampler2D;
    precision highp usampler3D;
    precision highp usamplerCube;
    precision highp usampler2DArray;
    layout(std140) uniform;
    #define FRAGMENT_SHADER
    uniform sampler2D gSourceTex;
    layout( location = 0 ) out vec4 Out;
    uniform cbConstants
    {
        ivec4 Constants;
    };
    void main()
    {
        Out = texelFetch( gSourceTex, ivec2(gl_FragCoord.xy) + Constants.xy, Constants.w );
    }

    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
02-18 11:21:30.439 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application A/Diligent Engine: Diligent Engine: CRITICAL ERROR in ShaderGLImpl() (ShaderGLImpl.cpp, 113): Failed to compile shader file "TexRegionRender : Pixel shader sampler2D"
    InfoLog:
    (11:0) : error : invalid type field for default precision statement
    (12:0) : error : invalid type field for default precision statement
    (33:0) : error : undefined identifier: 'Constants'
    (33:0) : error : undefined identifier: 'Constants'
02-18 11:21:30.439 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application E/Diligent Engine: Diligent Engine: ERROR in CreateDeviceObject() (RenderDeviceBase.h, 462): Failed to create shader object "TexRegionRender : Pixel shader sampler2D"
02-18 11:21:30.439 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application E/Diligent Engine: Diligent Engine: ERROR: Failed to link shader program:
    No validate shaders are attached in program
02-18 11:21:30.439 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application E/Diligent Engine: Diligent Engine: ERROR: Debug assertion failed in LinkGLProgram(), file PipelineStateGLImpl.cpp, line 88:
    glLinkProgram failed
02-18 11:21:30.439 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application A/libc: Fatal signal 5 (SIGTRAP), code -6 in tid 27415 (Thread-2027)
02-18 11:21:30.469 27384-27384/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@2880cdf0 time:240256806
02-18 11:21:30.779 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application E/libEGL: called unimplemented OpenGL ES API
02-18 11:21:30.779 27384-27415/com.diligentengine.tutorial03_texturing.Tutorial03Application A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 27415 (Thread-2027)

Yeah, the spec says (4.5.3): "Any floating point, integer or sampler declaration can have the type preceded by one of these precision qualifiers...". Could be just yet another GLES spec non-conformant device in Android world.
Try this branch to see if it works (we don't really have any ES3.0 devices to verify):
https://github.com/DiligentGraphics/DiligentEngine/tree/no_separate_shaders
I am planning to implement some API changes that should make things easier: right now static shader resources are bound through shader object. This will go into pipeline state object instead, which also will work when separate shaders are not supported.

Hi :)
As far as I could test, it seems that — for a change — some Android devices are definitely not specs compliant. My testing device is supposed to support s3tc texture compression, but will fail to pass the RenderDeviceGLImpl::FlagSupportedTexFormats tests.
I managed to do a quick & dirty workaround this by disabling some extensions (hardcoded). But I guess a better approach could be providing the application some way to blacklist some extensions when creating the device context. Here's the diff from your branch:
---
 Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp
index b681708f..172c479e 100644
--- a/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp
+++ b/Graphics/GraphicsEngineOpenGL/src/RenderDeviceGLImpl.cpp
@@ -345,9 +345,9 @@ void RenderDeviceGLImpl::FlagSupportedTexFormats()
     bool bGL33OrAbove = DeviceCaps.DevType == DeviceType::OpenGL&&
                         (DeviceCaps.MajorVersion >= 4 || (DeviceCaps.MajorVersion == 3&&  DeviceCaps.MinorVersion >= 3) );

-    bool bRGTC = CheckExtension( "GL_ARB_texture_compression_rgtc" );
-    bool bBPTC = CheckExtension( "GL_ARB_texture_compression_bptc" );
-    bool bS3TC = CheckExtension( "GL_EXT_texture_compression_s3tc" );
+    bool bRGTC = CheckExtension( "GL_ARB_texture_compression_rgtc" ) && false;
+    bool bBPTC = CheckExtension( "GL_ARB_texture_compression_bptc" ) && false;
+    bool bS3TC = CheckExtension( "GL_EXT_texture_compression_s3tc" ) && false;
     bool bTexNorm16 = CheckExtension( "GL_EXT_texture_norm16" ); // Only for ES3.1+

 #define FLAG_FORMAT(Fmt, IsSupported)\
--
2.19.0
}

After I fixed the first problem, I had another one with the GLSL compiler complaining about layout(location = X) qualifiers for the VS/PS output/input variables. Apparently, it's against the specs to have these qualifiers for in/out variables as per sections <IP_ADDRESS>  and <IP_ADDRESS>). I managed to do a quick workaround by modifying the HLSL2GLSLConverterImpl class, but maybe there's a better way. Here's the diff from your branch:
---
 .../src/HLSL2GLSLConverterImpl.cpp            | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/Graphics/HLSL2GLSLConverterLib/src/HLSL2GLSLConverterImpl.cpp b/Graphics/HLSL2GLSLConverterLib/src/HLSL2GLSLConverterImpl.cpp
index 118b0edf..e9dd9a47 100644
--- a/Graphics/HLSL2GLSLConverterLib/src/HLSL2GLSLConverterImpl.cpp
+++ b/Graphics/HLSL2GLSLConverterLib/src/HLSL2GLSLConverterImpl.cpp
@@ -2845,9 +2845,16 @@ void InitVariable(const String& Name, const String &InitValue, std::stringstream
     OutSS << "    " << Name <<" = " << InitValue << ";\n";
 }

-void DefineInterfaceVar( int location, const char *inout, const String& ParamType, const String& ParamName, std::stringstream &OutSS )
+void DefineInterfaceVar( int location, const char *inout, const String& ParamType, const String& ParamName, std::stringstream &OutSS, bool LayoutPrefix = true )
 {
-    OutSS << "layout(location = " << location << ") " << inout << ' ' << ParamType << ' ' << ParamName << ";\n";
+    if (LayoutPrefix)
+    {
+        OutSS << "layout(location = " << location << ") " << inout << ' ' << ParamType << ' ' << ParamName << ";\n";
+    }
+    else
+    {
+        OutSS << inout << ' ' << ParamType << ' ' << ParamName << ";\n";
+    }
 }

 String HLSL2GLSLConverterImpl::ConversionStream::BuildParameterName(const std::vector<const ShaderParameterInfo*>& MemberStack, Char Separator, const Char* Prefix, const Char *SubstituteInstName, const Char *Index )
@@ -2969,8 +2976,8 @@ void HLSL2GLSLConverterImpl::ConversionStream::ProcessFragmentShaderArguments(st
                         PrologueSS << "    " << Getter << '(' << FullParamName << ");\n";
                     else
                     {
-                        auto InputVarName = BuildParameterName(MemberStack, '_', "_in_");
-                        DefineInterfaceVar(InLocation++, RequiresFlatQualifier(Param.Type) ? "flat in" : "in", Param.Type, InputVarName, InterfaceVarsSS );
+                        auto InputVarName = BuildParameterName(MemberStack, '_', "_vsout_", "main");
+                        DefineInterfaceVar(InLocation++, RequiresFlatQualifier(Param.Type) ? "flat in" : "in", Param.Type, InputVarName, InterfaceVarsSS, false );
                         InitVariable(FullParamName, InputVarName, PrologueSS );
                     }
                 }
@@ -3008,7 +3015,7 @@ void HLSL2GLSLConverterImpl::ConversionStream::ProcessFragmentShaderArguments(st
                         if( RTIndex >= 0 && RTIndex < MaxRenderTargets )
                         {
                             String OutVarName = BuildParameterName(MemberStack, '_', "_psout_");
-                            DefineInterfaceVar(RTIndex, "out", Param.Type, OutVarName, GlobalVarsSS );
+                            DefineInterfaceVar(RTIndex, "out", Param.Type, OutVarName, GlobalVarsSS, false );
                             ReturnHandlerSS << OutVarName << " = " << FullParamName << ";\\\n";
                         }
                         else
@@ -3087,7 +3094,7 @@ void HLSL2GLSLConverterImpl::ConversionStream::ProcessVertexShaderArguments( std
                     else
                     {
                         auto OutputVarName =  BuildParameterName(MemberStack, '_', "_vsout_");
-                        DefineInterfaceVar( OutLocation++, RequiresFlatQualifier(Param.Type) ? "flat out" : "out", Param.Type, OutputVarName, InterfaceVarsSS );
+                        DefineInterfaceVar( OutLocation++, RequiresFlatQualifier(Param.Type) ? "flat out" : "out", Param.Type, OutputVarName, InterfaceVarsSS, false );
                         ReturnHandlerSS << OutputVarName << " = " << FullParamName << ";\\\n";
                     }
                 }
--
2.19.0
}

I also had to fix a few shaders from the samples:
---
 External/TwBarLib/src/Shaders/LineRectCstColorVS.glsl    | 2 +-
 External/TwBarLib/src/Shaders/LineRectPS.glsl            | 4 ++--
 External/TwBarLib/src/Shaders/LineRectVS.glsl            | 2 +-
 External/TwBarLib/src/Shaders/TextCstColorVS.glsl        | 4 ++--
 External/TwBarLib/src/Shaders/TextPS.glsl                | 7 +++----
 External/TwBarLib/src/Shaders/TextVS.glsl                | 4 ++--
 External/TwBarLib/src/ShadersInc/LineRectCstColorVS_GL.h | 2 +-
 External/TwBarLib/src/ShadersInc/LineRectPS_GL.h         | 4 ++--
 External/TwBarLib/src/ShadersInc/LineRectVS_GL.h         | 2 +-
 External/TwBarLib/src/ShadersInc/TextCstColorVS_GL.h     | 4 ++--
 External/TwBarLib/src/ShadersInc/TextPS_GL.h             | 7 +++----
 External/TwBarLib/src/ShadersInc/TextVS_GL.h             | 4 ++--
 Samples/AntTweakBar/assets/shaders/MainPS_GL.glsl        | 4 ++--
 Samples/AntTweakBar/assets/shaders/MainVS_GL.glsl        | 2 +-
 14 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/External/TwBarLib/src/Shaders/LineRectCstColorVS.glsl b/External/TwBarLib/src/Shaders/LineRectCstColorVS.glsl
index e010f1e..0f2cbf6 100644
--- a/External/TwBarLib/src/Shaders/LineRectCstColorVS.glsl
+++ b/External/TwBarLib/src/Shaders/LineRectCstColorVS.glsl
@@ -29,7 +29,7 @@ out gl_PerVertex
 };
 #endif

-layout(location = 1) out vec4 Color;
+out vec4 Color;

 void main()
 {
diff --git a/External/TwBarLib/src/Shaders/LineRectPS.glsl b/External/TwBarLib/src/Shaders/LineRectPS.glsl
index d9d0701..ba43ac0 100644
--- a/External/TwBarLib/src/Shaders/LineRectPS.glsl
+++ b/External/TwBarLib/src/Shaders/LineRectPS.glsl
@@ -7,9 +7,9 @@
 //  ---------------------------------------------------------------------------

-layout(location = 1) in vec4 Color;
+in vec4 Color;

-layout(location = 0) out vec4 out_Color;
+out vec4 out_Color;

 void main()
 {
diff --git a/External/TwBarLib/src/Shaders/LineRectVS.glsl b/External/TwBarLib/src/Shaders/LineRectVS.glsl
index f9d2952..aa206f2 100644
--- a/External/TwBarLib/src/Shaders/LineRectVS.glsl
+++ b/External/TwBarLib/src/Shaders/LineRectVS.glsl
@@ -30,7 +30,7 @@ out gl_PerVertex
 };
 #endif

-layout(location = 1) out vec4 Color;
+out vec4 Color;

 void main()
 {
diff --git a/External/TwBarLib/src/Shaders/TextCstColorVS.glsl b/External/TwBarLib/src/Shaders/TextCstColorVS.glsl
index 1aabbdd..2aea854 100644
--- a/External/TwBarLib/src/Shaders/TextCstColorVS.glsl
+++ b/External/TwBarLib/src/Shaders/TextCstColorVS.glsl
@@ -17,8 +17,8 @@ layout( location = 0 ) in vec4 in_pos;
 layout( location = 1 ) in vec4 in_color;
 layout( location = 2 ) in vec2 in_tex;

-layout(location = 1) out vec4 Color;
-layout(location = 2) out vec2 Tex;
+out vec4 Color;
+out vec2 Tex;

 //To use any built-in input or output in the gl_PerVertex and
 //gl_PerFragment blocks in separable program objects, shader code must
diff --git a/External/TwBarLib/src/Shaders/TextPS.glsl b/External/TwBarLib/src/Shaders/TextPS.glsl
index 7f63683..991ca8f 100644
--- a/External/TwBarLib/src/Shaders/TextPS.glsl
+++ b/External/TwBarLib/src/Shaders/TextPS.glsl
@@ -8,10 +8,9 @@

 uniform sampler2D g_Font;

-layout(location = 1) in vec4 Color;
-layout(location = 2) in vec2 Tex;
-
-layout(location = 0) out vec4 out_Color;
+in vec4 Color;
+in vec2 Tex;
+out vec4 out_Color;

 void main()
 {
diff --git a/External/TwBarLib/src/Shaders/TextVS.glsl b/External/TwBarLib/src/Shaders/TextVS.glsl
index 8033382..528f455 100644
--- a/External/TwBarLib/src/Shaders/TextVS.glsl
+++ b/External/TwBarLib/src/Shaders/TextVS.glsl
@@ -18,8 +18,8 @@ layout( location = 0 ) in vec4 in_pos;
 layout( location = 1 ) in vec4 in_color;
 layout( location = 2 ) in vec2 in_tex;

-layout(location = 1) out vec4 Color;
-layout(location = 2) out vec2 Tex;
+out vec4 Color;
+out vec2 Tex;

 //To use any built-in input or output in the gl_PerVertex and
 //gl_PerFragment blocks in separable program objects, shader code must
diff --git a/External/TwBarLib/src/ShadersInc/LineRectCstColorVS_GL.h b/External/TwBarLib/src/ShadersInc/LineRectCstColorVS_GL.h
index 58bcf08..20beb4d 100644
--- a/External/TwBarLib/src/ShadersInc/LineRectCstColorVS_GL.h
+++ b/External/TwBarLib/src/ShadersInc/LineRectCstColorVS_GL.h
@@ -29,7 +29,7 @@
 "};\n"
 "#endif\n"
 "\n"
-"layout(location = 1) out vec4 Color;\n"
+"out vec4 Color;\n"
 "\n"
 "void main() \n"
 "{\n"
diff --git a/External/TwBarLib/src/ShadersInc/LineRectPS_GL.h b/External/TwBarLib/src/ShadersInc/LineRectPS_GL.h
index 675f4a1..4badc13 100644
--- a/External/TwBarLib/src/ShadersInc/LineRectPS_GL.h
+++ b/External/TwBarLib/src/ShadersInc/LineRectPS_GL.h
@@ -7,9 +7,9 @@
 "//  ---------------------------------------------------------------------------\n"
 "\n"
 " \n"
-"layout(location = 1) in vec4 Color;\n"
+"in vec4 Color;\n"
 "\n"
-"layout(location = 0) out vec4 out_Color;\n"
+"out vec4 out_Color;\n"
 "\n"
 "void main()\n"
 "{ \n"
diff --git a/External/TwBarLib/src/ShadersInc/LineRectVS_GL.h b/External/TwBarLib/src/ShadersInc/LineRectVS_GL.h
index cca1ee2..6496cca 100644
--- a/External/TwBarLib/src/ShadersInc/LineRectVS_GL.h
+++ b/External/TwBarLib/src/ShadersInc/LineRectVS_GL.h
@@ -30,7 +30,7 @@
 "};\n"
 "#endif\n"
 "\n"
-"layout(location = 1) out vec4 Color;\n"
+"out vec4 Color;\n"
 "\n"
 "void main() \n"
 "{\n"
diff --git a/External/TwBarLib/src/ShadersInc/TextCstColorVS_GL.h b/External/TwBarLib/src/ShadersInc/TextCstColorVS_GL.h
index 2966e19..441ee0e 100644
--- a/External/TwBarLib/src/ShadersInc/TextCstColorVS_GL.h
+++ b/External/TwBarLib/src/ShadersInc/TextCstColorVS_GL.h
@@ -17,8 +17,8 @@
 "layout( location = 1 ) in vec4 in_color;\n"
 "layout( location = 2 ) in vec2 in_tex;\n"
 "\n"
-"layout(location = 1) out vec4 Color;\n"
-"layout(location = 2) out vec2 Tex;\n"
+"out vec4 Color;\n"
+"out vec2 Tex;\n"
 "\n"
 "//To use any built-in input or output in the gl_PerVertex and\n"
 "//gl_PerFragment blocks in separable program objects, shader code must\n"
diff --git a/External/TwBarLib/src/ShadersInc/TextPS_GL.h b/External/TwBarLib/src/ShadersInc/TextPS_GL.h
index a9255f2..5133aff 100644
--- a/External/TwBarLib/src/ShadersInc/TextPS_GL.h
+++ b/External/TwBarLib/src/ShadersInc/TextPS_GL.h
@@ -8,10 +8,9 @@
 "\n"
 "uniform sampler2D g_Font;\n"
 "\n"
-"layout(location = 1) in vec4 Color;\n"
-"layout(location = 2) in vec2 Tex;\n"
-"\n"
-"layout(location = 0) out vec4 out_Color;\n"
+"in vec4 Color;\n"
+"in vec2 Tex;\n"
+"out vec4 out_Color;\n"
 "\n"
 "void main()\n"
 "{ \n"
diff --git a/External/TwBarLib/src/ShadersInc/TextVS_GL.h b/External/TwBarLib/src/ShadersInc/TextVS_GL.h
index e53fcfd..6bff78d 100644
--- a/External/TwBarLib/src/ShadersInc/TextVS_GL.h
+++ b/External/TwBarLib/src/ShadersInc/TextVS_GL.h
@@ -18,8 +18,8 @@
 "layout( location = 1 ) in vec4 in_color;\n"
 "layout( location = 2 ) in vec2 in_tex;\n"
 "\n"
-"layout(location = 1) out vec4 Color;\n"
-"layout(location = 2) out vec2 Tex;\n"
+"out vec4 Color;\n"
+"out vec2 Tex;\n"
 "\n"
 "//To use any built-in input or output in the gl_PerVertex and\n"
 "//gl_PerFragment blocks in separable program objects, shader code must\n"
diff --git a/Samples/AntTweakBar/assets/shaders/MainPS_GL.glsl b/Samples/AntTweakBar/assets/shaders/MainPS_GL.glsl
index f41f4c5..4069258 100644
--- a/Samples/AntTweakBar/assets/shaders/MainPS_GL.glsl
+++ b/Samples/AntTweakBar/assets/shaders/MainPS_GL.glsl
@@ -1,6 +1,6 @@

-layout(location = 0) in  vec4 in_Color;
-layout(location = 0) out vec4 out_Color;
+in  vec4 in_Color;
+out vec4 out_Color;

 void main()
 {
diff --git a/Samples/AntTweakBar/assets/shaders/MainVS_GL.glsl b/Samples/AntTweakBar/assets/shaders/MainVS_GL.glsl
index c8e3706..147f1a4 100644
--- a/Samples/AntTweakBar/assets/shaders/MainVS_GL.glsl
+++ b/Samples/AntTweakBar/assets/shaders/MainVS_GL.glsl
@@ -24,7 +24,7 @@ out gl_PerVertex
 };
 #endif

-layout(location = 0) out vec4 out_Color;
+out vec4 out_Color;

 vec4 mul( in vec4 v, in mat4 m )
 {
--
2.19.0

Since I have to leave the office now, I'm attaching the crash log file I have now, maybe you'll have a clue.
02-18 21:59:20.972 18904-18904/? E/Zygote: v2
02-18 21:59:20.972 18904-18904/? I/libpersona: KNOX_SDCARD checking this for 10122
02-18 21:59:20.972 18904-18904/? I/libpersona: KNOX_SDCARD not a persona
02-18 21:59:20.972 18904-18904/? I/SELinux: Function: selinux_compare_spd_ram , priority [2] , priority version is VE=SEPF_SM-G361F_5.1.1_0045
02-18 21:59:20.972 18904-18904/? E/SELinux: [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL
02-18 21:59:20.972 18904-18904/? I/art: Late-enabling -Xcheck:jni
02-18 21:59:20.992 18904-18904/? D/TimaKeyStoreProvider: in addTimaSignatureService
02-18 21:59:21.002 18904-18904/? D/TimaKeyStoreProvider: TimaSignature is unavailable
02-18 21:59:21.002 18904-18904/? I/SAMP: ActivityThread() - SAMP_ENABLE : true
02-18 21:59:21.002 18904-18904/? D/ActivityThread: Added TimaKesytore provider
02-18 21:59:21.032 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/ContextImpl: ContextImpl running for user UserHandle{0} 0
02-18 21:59:21.042 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/ContextImpl: ContextImpl running for user UserHandle{0} 0
02-18 21:59:21.042 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ResourcesManager: getTopLevelResources: null for user  0
02-18 21:59:21.052 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/ContextImpl: ContextImpl running for user UserHandle{0} 0
02-18 21:59:21.052 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application W/native-activity: onCreate
02-18 21:59:21.052 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ResourcesManager: getTopLevelResources: null for user  0
02-18 21:59:21.062 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/DisplayManager: DisplayManager()
02-18 21:59:21.082 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application W/linker: libGraphicsEngineOpenGL.so: unused DT entry: type 0x6ffffffe arg 0x25fcc
02-18 21:59:21.082 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application W/linker: libGraphicsEngineOpenGL.so: unused DT entry: type 0x6fffffff arg 0x3
02-18 21:59:21.082 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application I/native-activity: Loaded GraphicsEngineOpenGL library.
02-18 21:59:21.082 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/ContextImpl: ContextImpl running for user UserHandle{0} 0
02-18 21:59:21.082 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ResourcesManager: getTopLevelResources: null for user  0
02-18 21:59:21.102 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/PhoneWindow: *FMB* installDecor mIsFloating : false
02-18 21:59:21.102 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/PhoneWindow: *FMB* installDecor flags : 8454400
02-18 21:59:21.112 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/obb/com.diligentengine.tutorial03_texturing.Tutorial03Application
02-18 21:59:21.112 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/data/com.diligentengine.tutorial03_texturing.Tutorial03Application/files
02-18 21:59:21.112 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application W/linker: libTutorial03_Texturing.so: unused DT entry: type 0x6ffffffe arg 0x3ba4
02-18 21:59:21.112 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application W/linker: libTutorial03_Texturing.so: unused DT entry: type 0x6fffffff arg 0x3
02-18 21:59:21.112 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: Creating: 0xab1b7f18
02-18 21:59:21.122 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: Config: mcc=0 mnc=0 lang=fr cnt=FR orien=1 touch=3 dens=240 keys=1 nav=1 keysHid=3 navHid=0 sdk=22 size=2 long=2 modetype=1 modenight=1
02-18 21:59:21.122 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: Start: 0xab1b7f18
02-18 21:59:21.122 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: activityState=10
02-18 21:59:21.122 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: Resume: 0xab1b7f18
02-18 21:59:21.122 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: activityState=11
02-18 21:59:21.132 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/DisplayManager: DisplayManager()
02-18 21:59:21.132 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: InputQueueCreated: 0xab1b7f18 -- 0xab1c0e28
02-18 21:59:21.132 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: APP_CMD_INPUT_CHANGED
02-18 21:59:21.132 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: Attaching input queue to looper
02-18 21:59:21.142 18904-18921/com.diligentengine.tutorial03_texturing.Tutorial03Application D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
02-18 21:59:21.142 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/PhoneWindow: *FMB* isFloatingMenuEnabled mFloatingMenuBtn : null
02-18 21:59:21.142 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/PhoneWindow: *FMB* isFloatingMenuEnabled return false
02-18 21:59:21.152 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: NativeWindowCreated: 0xab1b7f18 -- 0xab1cc9b0
02-18 21:59:21.152 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: APP_CMD_INIT_WINDOW
02-18 21:59:21.152 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: User-defined allocator is not provided. Using default allocator.
02-18 21:59:21.152 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/ViewSystem: ViewRootImpl >> surfaceCreated
02-18 21:59:21.152 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application D/ViewSystem: ViewRootImpl >> surfaceChanged W=480, H=800)
02-18 21:59:21.172 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: Chosen EGL config: 8 bit color, 24 bit depth
02-18 21:59:21.172 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application D/GC: <tid=18920> Warning: OES3.2 is not supported.
02-18 21:59:21.172 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application D/v_gal: [tid=18920] gcmONERROR: status=-1(gcvSTATUS_INVALID_ARGUMENT) @ eglCreateContext(1318)
02-18 21:59:21.172 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application D/GC: <tid=18920> Warning: OES3.1 is not supported.
02-18 21:59:21.172 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application D/v_gal: [tid=18920] gcmONERROR: status=-1(gcvSTATUS_INVALID_ARGUMENT) @ eglCreateContext(1318)
02-18 21:59:21.172 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application D/GC: <tid=18920> OES30 ===> GC Version   : GC version rls_5011p6_GC5.5.14
02-18 21:59:21.182 18904-18921/com.diligentengine.tutorial03_texturing.Tutorial03Application I/OpenGLRenderer: Initialized EGL, version 1.4
02-18 21:59:21.182 18904-18921/com.diligentengine.tutorial03_texturing.Tutorial03Application D/GC: <tid=18921> OES20 ===> GC Version   : GC version rls_5011p6_GC5.5.14
02-18 21:59:21.192 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: Created OpenGLES Context 3.0
02-18 21:59:21.192 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: GL Version: OpenGL ES 3.0
02-18 21:59:21.202 18904-18921/com.diligentengine.tutorial03_texturing.Tutorial03Application D/OpenGLRenderer: Enabling debug mode 0
02-18 21:59:21.202 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application E/Diligent Engine: Diligent Engine: ERROR: Failed to enable SRGB framebuffers
02-18 21:59:21.202 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: Supported extensions:
    GL_EXT_debug_marker GL_OES_vertex_type_10_10_10_2 GL_OES_vertex_half_float GL_OES_element_index_uint GL_OES_mapbuffer GL_OES_vertex_array_object GL_OES_compressed_ETC1_RGB8_texture GL_OES_compressed_paletted_texture GL_OES_texture_npot GL_OES_rgb8_rgba8 GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_OES_depth24 GL_OES_depth32 GL_OES_packed_depth_stencil GL_OES_fbo_render_mipmap GL_OES_get_program_binary GL_OES_fragment_precision_high GL_OES_standard_derivatives GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_required_internalformat GL_OES_surfaceless_context GL_EXT_texture_type_2_10_10_10_REV GL_EXT_texture_filter_anisotropic GL_EXT_texture_compression_dxt1 GL_EXT_texture_format_BGRA8888 GL_EXT_texture_compression_s3tc GL_EXT_read_format_bgra GL_EXT_multi_draw_arrays GL_EXT_frag_depth GL_EXT_discard_framebuffer GL_EXT_blend_minmax GL_EXT_robustness GL_EXT_unpack_subimage GL_VIV_direct_texture GL_MRVL_linear_texture
02-18 21:59:21.242 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application E/libEGL: called unimplemented OpenGL ES API
02-18 21:59:21.282 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application V/threaded_app: WindowFocusChanged: 0xab1b7f18 -- 1
02-18 21:59:21.292 18904-18904/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@938684b time:276126071
02-18 21:59:21.412 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application I/Diligent Engine: Diligent Engine: Info: GPU Vendor: vivante corporation
02-18 21:59:21.432 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application W/Diligent Engine: Diligent Engine: Warning: IShader::BindResources() effectively does nothing when separable programs are not supported by the device. Use IDeviceContext::BindShaderResources() instead.
02-18 21:59:21.492 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application E/Diligent Engine: Diligent Engine: ERROR: GL_CLAMP_TO_BORDER filtering mode is not supported. Defaulting to GL_CLAMP_TO_EDGE.
02-18 21:59:21.492 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application E/Diligent Engine: Diligent Engine: ERROR: GL_CLAMP_TO_BORDER filtering mode is not supported. Defaulting to GL_CLAMP_TO_EDGE.
02-18 21:59:21.492 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application E/Diligent Engine: Diligent Engine: ERROR: GL_CLAMP_TO_BORDER filtering mode is not supported. Defaulting to GL_CLAMP_TO_EDGE.
02-18 21:59:21.522 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/data/com.diligentengine.tutorial03_texturing.Tutorial03Application/files
02-18 21:59:21.532 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/data/com.diligentengine.tutorial03_texturing.Tutorial03Application/files
02-18 21:59:21.532 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/data/com.diligentengine.tutorial03_texturing.Tutorial03Application/files
02-18 21:59:21.742 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/data/com.diligentengine.tutorial03_texturing.Tutorial03Application/files
02-18 21:59:21.752 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/data/com.diligentengine.tutorial03_texturing.Tutorial03Application/files
02-18 21:59:21.752 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/data/com.diligentengine.tutorial03_texturing.Tutorial03Application/files
02-18 21:59:22.072 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/data/com.diligentengine.tutorial03_texturing.Tutorial03Application/files
02-18 21:59:22.082 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application W/ContextImpl: Failed to ensure directory: /storage/extSdCard/Android/data/com.diligentengine.tutorial03_texturing.Tutorial03Application/files
02-18 21:59:22.842 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application E/libEGL: called unimplemented OpenGL ES API
02-18 21:59:22.842 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application E/Diligent Engine: Diligent Engine: ERROR: Debug assertion failed in Create(), file GLObjectWrapper.h, line 77:
    Failed to initialize GL object
02-18 21:59:22.842 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application A/libc: Fatal signal 5 (SIGTRAP), code -6 in tid 18920 (Thread-3102)
02-18 21:59:23.152 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application A/Diligent Engine: Diligent Engine: CRITICAL ERROR in GLObjWrapper() (GLObjectWrapper.h, 44): Failed to create piepline GL object
02-18 21:59:23.152 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application A/libc: /Volumes/Android/buildbot/src/android/ndk-release-r17/external/libcxx/../../external/libcxxabi/src/abort_message.cpp:73: abort_message: assertion "terminating with uncaught exception of type std::runtime_error: Failed to create piepline GL object" failed
02-18 21:59:23.152 18904-18920/com.diligentengine.tutorial03_texturing.Tutorial03Application A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 18920 (Thread-3102)

Best regards

Gosh, in/out locations are not supported either... Shader converter can still produce working glsl code, but source HLSL will require more care. Specifically, input semantics will be ignored, and shader input/output matching will solely rely on exact name matching and order. The converter used to work this way, but it was less convenient, and it was impossible to handle certain shader combinations (such as VS-GS-FS). Since GS is not available in ES3.0 anyway, this should not be a problem. Shader converter can be fixed to resort to old mode in case of ES3.0.
Speaking about the crash, it looks like it is attempting to create a program pipeline, which it shouldn't. Will take a look.

This should hopefully fix the crash:
https://github.com/DiligentGraphics/DiligentCore/commit/65185af8ee76be8b753f5689dacd87dd74300c75

I guess we should remove in/out locations in case we have a GLES 3.0 context, but I don't know if the converter is aware of the current GL context version. I'll test your last commit when I get back to the office.

Ah. We're seeing the light at the end of the tunnel. Combining the hacks of yesterday and your latest commit, it works!!!  Now big question mark is how we can get rid of my hacks. Almost there!

Tested the following examples after I did some adaptation as you did in Tutorial03_Texturing:

Tutorial01_HelloTriangle (pass w/o changes)
Tutorial02_Cube (pass w/ changes)
Tutorial03_Texturing (pass w/ changes)
Tutorial04_Instancing  (pass w/ changes)
Tutorial05_TextureArray (runs /w changes but rendering is broken — maybe some problem with mipmap levels)

I will also need to do additional tests later today with another OpenGL ES 3.1 compliant device to make sure we didn't break some things up.
Eventually, I'm also trying to work out a small render target example. So far, it seems that I'm doing something wrong since my sample is running at < 1 fps on my testing device. I simply draw 2 textured cubes using one render target. I'll keep in touch when I have more information about that.

Can you double check one thing: you removed location qualifier for fragment shader outputs, but I think the spec says it is OK, so this should work: layout(location = 0) out vec4 out_Color;
Also, what exactly was the problem with GL_ARB_texture_compression_rgtc and other two extensions? Did the system report them as available while in fact they were not?

For the in/out locations, the specs say Fragment shaders cannot have input layout qualifiers. and Vertex shaders cannot have output layout qualifiers. but indeed says that Fragment shaders allow output layout qualifiers only on the interface qualifier out. . So I'll check that out.
For the GL_ARB_texture_compression_*, the system reports them as available, but they seem not to be. AFAIK, some projects like Mapbox used to blacklist some devices/manufacturers because of such bugs.
I have a question by the way. I have a small test scene with 1 shader and 2 textured cubes. I want to draw the two cubes with the same shader, and switch textures for each one of them. When using SRB (i.e: with separable programs extension available), it's OK. But w/o the separable programs extension, I guess I need to bind the shader resources into the pipeline before I draw each cube right? Here's a pseudo-code snippet of what I'm trying to do:
void XXX::Render()
{
    ...

    for (cnst auto &cube : m_cubes) {
        uint32_t offset = 0;
        IBuffer *pBuffers[] = { m_pVertexBuffer };
        m_pImmediateContext->SetVertexBuffers(0, 1, pBuffers, &offset, RESOURCE_STATE_TRANSITION_MODE_TRANSITION, SET_VERTEX_BUFFERS_FLAG_RESET);
        m_pImmediateContext->SetIndexBuffer(m_pIndexBuffer, 0, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
        m_pImmediateContext->SetPipelineState(m_pPipelineState);
        if (!SeparateProgSupported)
        {
            RefCntAutoPtr<IResourceMapping> pResMapping;
            ResourceMappingEntry Resources[] =
            {
                { "Constants", m_pUniformBuffer },
                { "texture0", cube.pTextureView },
                {}
            };
            m_pDevice->CreateResourceMapping(ResourceMappingDesc{Resources}, &pResMapping);
            m_pPipelineState->BindShaderResources(pResMapping, BIND_SHADER_RESOURCES_UPDATE_ALL | BIND_SHADER_RESOURCES_VERIFY_ALL_RESOLVED);
        }

        {
            MapHelper<float4x4> constants(m_pImmediateContext, m_pUniformBuffer, MAP_WRITE, MAP_FLAG_DISCARD);
            *constants = transposeMatrix(cube.modelViewProjectionMatrix);
        }

        ...

        m_pImmediateContext->CommitShaderResources(m_pShaderResourceBinding01, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);

        DrawAttribs draw;
        draw.IsIndexed = true;
        draw.IndexType = VT_UINT32;
        draw.NumIndices = 36;
        draw.Flags = DRAW_FLAG_VERIFY_STATES;
        m_pImmediateContext->Draw(draw);
    }

    ...
}

Since I get an engine error saying Diligent Engine: ERROR: Updating binding for static variable "texture0" is invalid and may result in an undefined behavior, I guess I'm not doing it the right way.

I tested to revert back with out locations for fragment shader. Everything seems OK.

The way this should work is this: you create two SRBs for your two cubes and bind them, or label the variable as dynamic and change it in the SRB. There is no real reason this should not work when separate shaders are not supported (static variables that are bound directly to shaders will not work, but this should not be an issue). Will need to check if this works now.
I started rolling out some changes to properly support GLES3.0:
https://github.com/DiligentGraphics/DiligentCore/commit/11f630a8835ffd2909c6b54ad66c3ca88c786883
https://github.com/DiligentGraphics/DiligentSamples/commit/2977fbd5d47f2475d349ede1c732d2ac77413dfe
BTW, honestly I am not 100% sure how converted shaders in Tutorials work without location qualifiers. The way the shaders are currently written produces different input/ouput variable names in converted GLSL. As far as I remember, shader interface linking tries to match input/output names exactly when locations are not given. Maybe the implementation on your device simply matches variables by types in the order of declaration. It will be important to be more careful about shader variable names to make sure they match.
Anyway, shader compilation would've been a major blocker. As long as you managed to make Tutorials work, all problems with resource binding are definitely solvable.
Do you know if there is a way to check if location qualifiers are supported? iPhones for instance run GLES3.0, but they support location qualifiers, so I would want to enable them even on ES3.0 devices that support them.

Also, this change should fix the problem with extensions. The code is deliberately double checking that the format is indeed supported by trying to create a small test texture. It was not supposed to crash though if the test fails, but rather label the format as unsupported, which it does now.

I'll test all of that when I'm back to the office :) For the tutorials, I didn't convert all of them just yet, but it should be alright.
By the way, do you have some contributing guidelines somewhere? I was considering adding a "render target" tutorial based on the RT test I mentioned earlier.

First, I confirm that the extensions problem is now properly fixed 👍 as you can see blow:
02-20 14:36:27.209 3332-3358/com.diligentengine.tutorial03_texturing.Tutorial03Application W/Diligent Engine: Diligent Engine: Warning: Failed to allocate storage for a test 8x8 TEX_FORMAT_BC1_TYPELESS texture. This likely indicates that the format is not supported despite being reported so by the device.
02-20 14:36:27.209 3332-3358/com.diligentengine.tutorial03_texturing.Tutorial03Application W/Diligent Engine: Diligent Engine: Warning: Failed to allocate storage for a test 8x8 TEX_FORMAT_BC1_UNORM texture. This likely indicates that the format is not supported despite being reported so by the device.
02-20 14:36:27.209 3332-3358/com.diligentengine.tutorial03_texturing.Tutorial03Application W/Diligent Engine: Diligent Engine: Warning: Failed to allocate storage for a test 8x8 TEX_FORMAT_BC1_UNORM_SRGB texture. This likely indicates that the format is not supported despite being reported so by the device.
02-20 14:36:27.209 3332-3358/com.diligentengine.tutorial03_texturing.Tutorial03Application W/Diligent Engine: Diligent Engine: Warning: Failed to allocate storage for a test 8x8 TEX_FORMAT_BC2_TYPELESS texture. This likely indicates that the format is not supported despite being reported so by the device.
02-20 14:36:27.209 3332-3358/com.diligentengine.tutorial03_texturing.Tutorial03Application W/Diligent Engine: Diligent Engine: Warning: Failed to allocate storage for a test 8x8 TEX_FORMAT_BC2_UNORM texture. This likely indicates that the format is not supported despite being reported so by the device.
02-20 14:36:27.209 3332-3358/com.diligentengine.tutorial03_texturing.Tutorial03Application W/Diligent Engine: Diligent Engine: Warning: Failed to allocate storage for a test 8x8 TEX_FORMAT_BC2_UNORM_SRGB texture. This likely indicates that the format is not supported despite being reported so by the device.
02-20 14:36:27.209 3332-3358/com.diligentengine.tutorial03_texturing.Tutorial03Application W/Diligent Engine: Diligent Engine: Warning: Failed to allocate storage for a test 8x8 TEX_FORMAT_BC3_TYPELESS texture. This likely indicates that the format is not supported despite being reported so by the device.
02-20 14:36:27.209 3332-3358/com.diligentengine.tutorial03_texturing.Tutorial03Application W/Diligent Engine: Diligent Engine: Warning: Failed to allocate storage for a test 8x8 TEX_FORMAT_BC3_UNORM texture. This likely indicates that the format is not supported despite being reported so by the device.
02-20 14:36:27.209 3332-3358/com.diligentengine.tutorial03_texturing.Tutorial03Application W/Diligent Engine: Diligent Engine: Warning: Failed to allocate storage for a test 8x8 TEX_FORMAT_BC3_UNORM_SRGB texture. This likely indicates that the format is not supported despite being reported so by the device.

Next episode coming soon...

So here's the next episode as promised. Beware, it's going to be a huge one :) I went back to the master branch, then I cherry-picked some commits to find out what we really need to do next.
As usual, I'll let you figure how what's the best way to take into account the feedback below.
Tested devices
I tested the changes described below on all these devices:

Samsung Galaxy Core Prime — OpenGL ES 3.0 w/o EXT_separate_shader_objects
Samsung Galaxy S7 — OpenGL ES 3.2
Nokia 7 Plus — OpenGL ES 3.2
iPhone 6s — OpenGL ES 3.0 with EXT_separate_shader_objects
iPhone 7+ — OpenGL ES 3.0 with EXT_separate_shader_objects
MacOS High Sierra 10.13.6  — OpenGL 4.1

DiligentCore
Commit hierarchy

master https://github.com/DiligentGraphics/DiligentCore/commit/baa883fe0e18431ffede146201e911bc6da7469e
no_separate_shaders_test https://github.com/DiligentGraphics/DiligentCore/commit/7d2a61ee54995b26d867865a8eac8dc62c976723
no_separate_shaders_test https://github.com/DiligentGraphics/DiligentCore/commit/aaef599714b0309b5d391f345466c82d24c3a876
no_separate_shaders_test https://github.com/DiligentGraphics/DiligentCore/commit/65185af8ee76be8b753f5689dacd87dd74300c75

Patches
In GLSLSourceBuilder.cpp, the gl_Position redeclaration apparently causes issues with the GLSL compiler (despite the specs state that we should redeclare it :/). Also, the line #extension GL_EXT_separate_shader_objects : enable\n should not be appended if the extension became part of the core specifications. Eventually, the UseInOutLocationQualifiers property of the conversion attribs should be set to false if we have an OpenGL ES 3.0 context.
@@ -72,7 +72,7 @@ String BuildGLSLSourceString(const ShaderCreationAttribs& CreationAttribs,
     versionss << "#version " << deviceCaps.MajorVersion << deviceCaps.MinorVersion << "0 es\n";
     GLSLSource.append(versionss.str());

-    if (deviceCaps.bSeparableProgramSupported)
+    if (deviceCaps.bSeparableProgramSupported && deviceCaps.MajorVersion == 3 && deviceCaps.MinorVersion == 0)
         GLSLSource.append("#extension GL_EXT_separate_shader_objects : enable\n");

     if (deviceCaps.TexCaps.bCubemapArraysSupported)
@@ -163,7 +163,7 @@ String BuildGLSLSourceString(const ShaderCreationAttribs& CreationAttribs,
     }

     // Built-in variable 'gl_Position' must be redeclared before use, with separate shader objects.
-    if (deviceCaps.bSeparableProgramSupported && ShaderType == SHADER_TYPE_VERTEX)
+    if (deviceCaps.bSeparableProgramSupported && ShaderType == SHADER_TYPE_VERTEX && deviceCaps.MajorVersion == 3 && deviceCaps.MinorVersion == 0)
         GLSLSource.append("out vec4 gl_Position;\n");

 #elif
@@ -257,6 +257,7 @@ String BuildGLSLSourceString(const ShaderCreationAttribs& CreationAttribs,
         Attribs.IncludeDefinitions = true;
         Attribs.InputFileName = CreationAttribs.FilePath;
         Attribs.SamplerSuffix = CreationAttribs.CombinedSamplerSuffix;
+        Attribs.UseInOutLocationQualifiers = (deviceCaps.MajorVersion == 3 && deviceCaps.MinorVersion == 0) ? false : true;
         auto ConvertedSource = Converter.Convert(Attribs);

         GLSLSource.append(ConvertedSource);

In HLSL2GLSLConverterImpl.cpp, since the in/out variable names weren't the same between the vertex and the fragment processing stages, the program linking would complain about Missing varying.
@@ -2973,7 +2973,8 @@ void HLSL2GLSLConverterImpl::ConversionStream::ProcessFragmentShaderArguments(st
                         PrologueSS << "    " << Getter << '(' << FullParamName << ");\n";
                     else
                     {
-                        auto InputVarName = BuildParameterName(MemberStack, '_', m_bUseInOutLocationQualifiers ? "_in_" : "_");
+                        auto InputVarName = BuildParameterName(MemberStack, '_', m_bUseInOutLocationQualifiers ? "_in_" : "_", m_bUseInOutLocationQualifiers ? "" : "main");
                         DefineInterfaceVar(m_bUseInOutLocationQualifiers ? InLocation++ : -1,
                                            RequiresFlatQualifier(Param.Type) ? "flat in" : "in",
                                            Param.Type, InputVarName, InterfaceVarsSS );

DiligentSamples
Commit hierarchy

master https://github.com/DiligentGraphics/DiligentCore/commit/2977fbd5d47f2475d349ede1c732d2ac77413dfe
no_separate_shaders_test https://github.com/DiligentGraphics/DiligentCore/commit/c9551e24ff78c4662f2f65e3a0dc4b3bb9a122cd

Patches
In External/TwBarLib/src/Shaders/*.glsl, the condition compilation should check if GL_ES is defined, not just its value since GL_ES may be undefined on desktop platforms
--- a/External/TwBarLib/src/Shaders/LineRectCstColorVS.glsl
+++ b/External/TwBarLib/src/Shaders/LineRectCstColorVS.glsl
@@ -29,7 +29,7 @@ out gl_PerVertex
 };
 #endif

-#if (GL_ES && __VERSION__ <= 300)
+#if (defined(GL_ES) && __VERSION__ <= 300)
     // GLES3.0 only supports layout location qualifiers for VS inputs
     #define OUT_LOCATION(x)
 #else

--- a/External/TwBarLib/src/Shaders/LineRectPS.glsl
+++ b/External/TwBarLib/src/Shaders/LineRectPS.glsl
@@ -6,8 +6,8 @@
 //
 //  ---------------------------------------------------------------------------

-#if (GL_ES && __VERSION__ <= 300)
+#if (defined(GL_ES) && __VERSION__ <= 300)
     // GLES3.0 only supports layout location qualifiers for VS inputs
     #define IN_LOCATION(x)
 #else
     // Compiling glsl to SPIRV with glslang will fail if locations are not specified

--- a/External/TwBarLib/src/Shaders/LineRectVS.glsl
+++ b/External/TwBarLib/src/Shaders/LineRectVS.glsl
@@ -31,7 +31,7 @@ out gl_PerVertex
 #endif

-#if (GL_ES && __VERSION__ <= 300)
+#if (defined(GL_ES) && __VERSION__ <= 300)
     // GLES3.0 only supports layout location qualifiers for VS inputs
     #define OUT_LOCATION(x)
 #else

--- a/External/TwBarLib/src/Shaders/TextCstColorVS.glsl
+++ b/External/TwBarLib/src/Shaders/TextCstColorVS.glsl
@@ -17,7 +17,7 @@ layout( location = 0 ) in vec4 in_pos;
 layout( location = 1 ) in vec4 in_color;
 layout( location = 2 ) in vec2 in_tex;

-#if (GL_ES && __VERSION__ <= 300)
+#if (defined(GL_ES) && __VERSION__ <= 300)
     // GLES3.0 only supports layout location qualifiers for VS inputs
     #define OUT_LOCATION(x)
 #else

--- a/External/TwBarLib/src/Shaders/TextPS.glsl
+++ b/External/TwBarLib/src/Shaders/TextPS.glsl
@@ -8,8 +8,8 @@

 uniform sampler2D g_Font;

-#if (GL_ES && __VERSION__ <= 300)
+#if (defined(GL_ES) && __VERSION__ <= 300)
     // GLES3.0 only supports layout location qualifiers for VS inputs
     #define IN_LOCATION(x)
 #else
     // Compiling glsl to SPIRV with glslang will fail if locations are not specified

--- a/External/TwBarLib/src/Shaders/TextVS.glsl
+++ b/External/TwBarLib/src/Shaders/TextVS.glsl
@@ -18,7 +18,7 @@ layout( location = 0 ) in vec4 in_pos;
 layout( location = 1 ) in vec4 in_color;
 layout( location = 2 ) in vec2 in_tex;

-#if (GL_ES && __VERSION__ <= 300)
+#if (defined(GL_ES) && __VERSION__ <= 300)
     // GLES3.0 only supports layout location qualifiers for VS inputs
     #define OUT_LOCATION(x)
 #else

In Tutorial03_Texturing.cpp, I needed to move the pVS->GetShaderVariable("Constants")->Set(m_VSConstants); line before we create the first SRB. Otherwise, I would get a crash as follow:
2019-02-20 16:28:15.797768+0100 Tutorial03_Texturing[85735:18072814] [DYMTLInitPlatform] platform initialization successful
2019-02-20 16:28:39.913786+0100 Tutorial03_Texturing[85735:18072733] Metal GPU Frame Capture Enabled
2019-02-20 16:28:39.914745+0100 Tutorial03_Texturing[85735:18072733] Metal API Validation Enabled
Diligent Engine: Info: User-defined allocator is not provided. Using default allocator.
Diligent Engine: Warning: Extension VK_EXT_debug_utils is not available.
Diligent Engine: ERROR: Failed to find VK_LAYER_LUNARG_standard_validation layer. Validation will be disabled
Diligent Engine: Info: Using physical device 'AMD Radeon Pro 560'
Diligent Engine: Info: GPU dynamic heap created. Total buffer size: 8.00 MB
Diligent Engine: Info: Allocated new descriptor pool
Diligent Engine: Info: VulkanMemoryManager 'Global resource memory manager': created new device-local page. (16.00 MB, type idx: 0). Current allocated size: 16.00 MB
Diligent Engine: Info: Requested color buffer format TEX_FORMAT_RGBA8_UNORM_SRGB is not supported by the surace and will be replaced with TEX_FORMAT_BGRA8_UNORM_SRGB
Diligent Engine: Info: VulkanMemoryManager 'Global resource memory manager': created new host-visible page. (16.00 MB, type idx: 2). Current allocated size: 16.00 MB
Diligent Engine: ERROR: No resource is bound to static variable 'Constants' in shader 'Cube VS'
Diligent Engine: ERROR: Static resources in SRB of PSO 'Cube PSO' will not be successfully initialized because not all static resource bindings in shader 'Cube VS' are valid. Please make sure you bind all static resources to the shader before calling InitializeStaticResources() directly or indirectly by passing InitStaticResources=true to CreateShaderResourceBinding() method.
Diligent Engine: ERROR: No resource assigned to static shader variable 'Constants' in shader 'Cube VS'.
Diligent Engine: ERROR: No resource is bound to static variable 'Constants' in shader 'Cube VS'
validateFunctionArguments:3332: failed assertion `Vertex Function(main0): missing buffer binding at index 0 for v_25[0].'
(lldb)

@@ -92,9 +92,6 @@ void Tutorial03_Texturing::Initialize(IRenderDevice*   pDevice,
             // Create dynamic uniform buffer that will store our transformation matrix
             // Dynamic buffers can be frequently updated by the CPU
             CreateUniformBuffer(pDevice, sizeof(float4x4), "VS constants CB", &m_VSConstants);
-            // Since we did not explcitly specify the type for Constants, default type
-            // (SHADER_VARIABLE_TYPE_STATIC) will be used. Static variables never change and are bound directly
-            // through the shader (http://diligentgraphics.com/2016/03/23/resource-binding-model-in-diligent-engine-2-0/)
         }

         // Create pixel shader
@@ -247,13 +244,21 @@ void Tutorial03_Texturing::Initialize(IRenderDevice*   pDevice,
         m_TextureSRV = Tex->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
     }

+    // Since we did not explcitly specify the type for Constants, default type
+    // (SHADER_VARIABLE_TYPE_STATIC) will be used. Static variables never change and are bound directly
+    // through the shader (http://diligentgraphics.com/2016/03/23/resource-binding-model-in-diligent-engine-2-0/)
+    if (SeparateProgSupported)
+    {
+        pVS->GetShaderVariable("Constants")->Set(m_VSConstants);
+    }
+
     // Since we are using mutable variable, we must create shader resource binding object
     // http://diligentgraphics.com/2016/03/23/resource-binding-model-in-diligent-engine-2-0/
     m_pPSO->CreateShaderResourceBinding(&m_SRB, true);
+
     // Set texture SRV in the SRB
     if (SeparateProgSupported)
     {
-        pVS->GetShaderVariable("Constants")->Set(m_VSConstants);
         m_SRB->GetVariable(SHADER_TYPE_PIXEL, "g_Texture")->Set(m_TextureSRV);
     }
     else

In case of c preprocessor, #if UNDEFINED_MACRO is well-defined and naturally evaluates to false. Not 100% sure about compound conditions though, but to be on a safer side, updated twbar shaders (https://github.com/DiligentGraphics/DiligentSamples/commit/d0646b4e356989532c6f796667a7798ff47501e4)
@@ -72,7 +72,7 @@ String BuildGLSLSourceString(const ShaderCreationAttribs& CreationAttribs,
     versionss << "#version " << deviceCaps.MajorVersion << deviceCaps.MinorVersion << "0 es\n";
     GLSLSource.append(versionss.str());

-    if (deviceCaps.bSeparableProgramSupported)
+    if (deviceCaps.bSeparableProgramSupported && deviceCaps.MajorVersion == 3 && deviceCaps.MinorVersion == 0)
         GLSLSource.append("#extension GL_EXT_separate_shader_objects : enable\n");

Does this cause a problem if you try to redeclare the extension?
     if (deviceCaps.TexCaps.bCubemapArraysSupported)
@@ -163,7 +163,7 @@ String BuildGLSLSourceString(const ShaderCreationAttribs& CreationAttribs,
     }

     // Built-in variable 'gl_Position' must be redeclared before use, with separate shader objects.
-    if (deviceCaps.bSeparableProgramSupported && ShaderType == SHADER_TYPE_VERTEX)
+    if (deviceCaps.bSeparableProgramSupported && ShaderType == SHADER_TYPE_VERTEX && deviceCaps.MajorVersion == 3 && deviceCaps.MinorVersion == 0)
         GLSLSource.append("out vec4 gl_Position;\n");

This whole situation with redeclaring gl_Postion is so annoying. It is inconsistent between specs and devices, so you never know if it is going to work...
 #elif
@@ -257,6 +257,7 @@ String BuildGLSLSourceString(const ShaderCreationAttribs& CreationAttribs,
         Attribs.IncludeDefinitions = true;
         Attribs.InputFileName = CreationAttribs.FilePath;
         Attribs.SamplerSuffix = CreationAttribs.CombinedSamplerSuffix;
+        Attribs.UseInOutLocationQualifiers = (deviceCaps.MajorVersion == 3 && deviceCaps.MinorVersion == 0) ? false : true;
         auto ConvertedSource = Converter.Convert(Attribs);

         GLSLSource.append(ConvertedSource);

Yeah, this is exactly what I was going to do. But I also wanted to check if GLES3.0 device (like iPhone) supports separate shaders.
@@ -2973,7 +2973,8 @@ void HLSL2GLSLConverterImpl::ConversionStream::ProcessFragmentShaderArguments(st
                         PrologueSS << "    " << Getter << '(' << FullParamName << ");\n";
                     else
                     {
-                        auto InputVarName = BuildParameterName(MemberStack, '_', m_bUseInOutLocationQualifiers ? "_in_" : "_");
+                        auto InputVarName = BuildParameterName(MemberStack, '_', m_bUseInOutLocationQualifiers ? "_in_" : "_", m_bUseInOutLocationQualifiers ? "" : "main");
                         DefineInterfaceVar(m_bUseInOutLocationQualifiers ? InLocation++ : -1,
                                            RequiresFlatQualifier(Param.Type) ? "flat in" : "in",
                                            Param.Type, InputVarName, InterfaceVarsSS );

This is not a universal solution because this will only help in cases when vertex shader function uses return statement. The converter generates the following code for VS:
layout(location = 0) in float3 _vsin_pos;
layout(location = 1) in float2 _vsin_uv;
layout(location = 0) out float2 _vsout_main_uv;

#define _RETURN_(_RET_VAL_){\
_SET_GL_POSITION(_RET_VAL_.Pos);\
_vsout_main_uv = _RET_VAL_.uv;\
return;}

void main()
{
    float3 pos;
    pos = _vsin_pos;
    float2 uv;
    uv = _vsin_uv;

    PSInput ps;
    ps.Pos = mul( float4(pos,1.0), g_WorldViewProj);
    ps.uv = uv;
    _RETURN_( ps)
}

And the following for FS:
uniform sampler2D g_Texture;
SamplerState g_Texture_sampler; // By convention, texture samplers must use _sampler suffix

struct PSInput
{
    float4 Pos;
    float2 uv;
};

layout(location = 0) out float4 _psout_main;
layout(location = 0) in float2 _psin_ps_in_uv;

#define _RETURN_(_RET_VAL_){\
_psout_main = _RET_VAL_;\
return;}

void main()
{
    PSInput ps_in;
    _GET_GL_FRAG_COORD(ps_in.Pos);
    ps_in.uv = _psin_ps_in_uv;

    _RETURN_( Sample_2( g_Texture,g_Texture_sampler, ps_in.uv)_SWIZZLE0)
}

Shaders need to be updated as follows to make sure that names match exactly:
void vs_main(float3 pos : ATTRIB0,
             float2 uv : ATTRIB1,
             out PSInput vs_out)

float4 ps_main(PSInput vs_out) : SV_TARGET

Don't worry about other platforms for now. Like I mentioned, the only thing that will not work without separate shaders is binding static variables directly through shader objects. SRBs should work fine, and I will look into that
Render target tutorial would actually be super useful! There is Contributing section in the readme.

Does this cause a problem if you try to redeclare the extension?

Yes, the shader compiler will fail, stating that the extension is not available. This typically happens on my OpenGL ES 3.1+ compatible devices, on which separable programs are part of the core API.

This whole situation with redeclaring gl_Postion is so annoying. It is inconsistent between specs and devices, so you never know if it is going to work...

I totally agree. I don't know what's the best option to address that, though.

Yeah, this is exactly what I was going to do. But I also wanted to check if GLES3.0 device (like iPhone) supports separate shaders.

AFAIK iPhone 6 and higher devices do. That's not very scientific since I can't do a comprehensive check atm.

Few more updates:

Turned out that separate shader objects extension also allows input/output layout qualifiers for all shader stages, so this should hopefully work: https://github.com/DiligentGraphics/DiligentCore/commit/40bcea32df033a6ea453b6225b64697ac25c315b
Do not enable GLES extensions if they are part of the core API: https://github.com/DiligentGraphics/DiligentCore/commit/746ad343c7dbc565ff6008e58f7b85155694842e
Correct replacement for https://github.com/DiligentGraphics/DiligentCore/commit/65185af8ee76be8b753f5689dacd87dd74300c75 (plus some code cleanup): https://github.com/DiligentGraphics/DiligentCore/commit/d2ffc2c44c32c94bff4091c650fb51f09f819b7f

Still not sure what to do about gl_Position. Which device did you see the problem on?
If you target devices that do not support separate shaders, you will need to be more careful when writing HLSL shaders: do not use return statements and use out parameters instead, give PS input variable the exact same name as VS outputs and the names in the converted GLSL will perfectly match.
I can update HLSL shaders in the examples.

With the following changes: https://github.com/DiligentGraphics/DiligentCore/commit/01b7a5ff496b155f9b0fa610262cd888a30293cc, https://github.com/DiligentGraphics/DiligentCore/commit/ccbc4ecd6cb012de71cb4cafa04175d268aa64d3, and https://github.com/DiligentGraphics/DiligentSamples/commit/4302cb14ea97facee53ca5f9eb2cb33eb7fce465 the only remaining issue seems to be gl_Position. Other than that all samples and tutorials that don't lack required capabilities (GS, tessellation, CS) should run fine without any changes on GLES3.0 without separate shaders. Could you verify that they work now?

I'm afraid I didn't have time to do some tests yesterday. I'll try to free up some time to test your latest commits.

Hi :)
I did some tests with Tutorial03_Texturing on master with the devices below.
Samsung Galaxy Core Prime
I still have a crash since samplerCubeShadow, sampler2DShadow and sampler2DArrayShadow are still not commented out on master.
02-22 11:42:36.676 21471-21487/com.diligentengine.tutorial03_texturing.Tutorial03Application A/Diligent Engine: Diligent Engine: CRITICAL ERROR in ShaderGLImpl() (ShaderGLImpl.cpp, 113): Failed to compile shader file "TexRegionRender : Pixel shader isampler2D"
    InfoLog:
    (11:0) : error : invalid type field for default precision statement
    (12:0) : error : invalid type field for default precision statement
    (33:0) : error : undefined identifier: 'Constants'
    (33:0) : error : undefined identifier: 'Constants'

Since it seems that non-specs compliance is an issue quite recurring on Android devices, we could consider changing the code a bit as follow:
GLSLSource.append(
    "precision highp float;\n"
    "precision highp int;\n"
    //"precision highp uint;\n"  // This line causes shader compilation error on NVidia!

    "precision highp sampler2D;\n"
    "precision highp sampler3D;\n"
    "precision highp samplerCube;\n"
-    "precision highp samplerCubeShadow;\n"
-    "precision highp sampler2DShadow;\n"
    "precision highp sampler2DArray;\n"
-    "precision highp sampler2DArrayShadow;\n"

    "precision highp isampler2D;\n"
    "precision highp isampler3D;\n"
    "precision highp isamplerCube;\n"
    "precision highp isampler2DArray;\n"

    "precision highp usampler2D;\n"
    "precision highp usampler3D;\n"
    "precision highp usamplerCube;\n"
    "precision highp usampler2DArray;\n"
);
+
+ #ifdef PLATFORM_ANDROID
+ if (IsES31OrAbove)
+ #endif
+ {
+     GLSLSource.append(
+         "precision highp samplerCubeShadow;\n"
+         "precision highp sampler2DShadow;\n"
+         "precision highp sampler2DArrayShadow;\n"
+     );
+ }

After I fixed that, I got another crash:
02-22 12:40:48.106 23313-23329/com.diligentengine.tutorial03_texturing.Tutorial03Application A/Diligent Engine: Diligent Engine: CRITICAL ERROR in ShaderGLImpl() (ShaderGLImpl.cpp, 113): Failed to compile shader file "Cube VS"
    InfoLog:
    (1280:0) : error : White Space or New Line inputStream expected.
    (1292:0) : error : undefined identifier: 'g_WorldViewProj'
    (1295:0) : error : syntax error at '}'

Whose fix in HLSL2GLSLConverterImpl.cpp is — wait for it:
- ReturnHandlerSS << "#define " << ReturnMacroName << (bIsVoid ? "" : "(_RET_VAL_)") << "{\\\n";
+ ReturnHandlerSS << "#define " << ReturnMacroName << (bIsVoid ? "" : "(_RET_VAL_)") << " {\\\n";

Samsung Galaxy S7
I still have a crash with the compiler complaining about the gl_Position redefinition.
2019-02-22 11:38:07.253 9437-9454/com.diligentengine.tutorial03_texturing.Tutorial03Application A/Diligent Engine: Diligent Engine: CRITICAL ERROR in ShaderGLImpl() (ShaderGLImpl.cpp, 113): Failed to compile shader file "TexRegionRender : Vertex shader"
    InfoLog:
    0:42: L0006: Illegal identifier name 'gl_Position'
    0:42: S0022: Symbol 'gl_Position' redeclared

Maybe we could consider wrapping out the few problematic lines in GLSLSourceBuilder.cpp like as below:
+ #ifndef PLATFORM_ANDROID
// Built-in variable 'gl_Position' must be redeclared before use, with separate shader objects.
if (deviceCaps.bSeparableProgramSupported && ShaderType == SHADER_TYPE_VERTEX)
    GLSLSource.append("out vec4 gl_Position;\n");
+ #endif

Anyway, after removing the gl_Position redeclaration, everything is OK on that device.
Nokia 7 Plus
Same results as above-cons.
iPhone 7
Everything runs fine on master.
MacOS High Sierra
Everything runs fine on master with OpenGL 4.1 and Molten Vk.

By the way, since you now recommend to use output variables instead of return values, I'd suggest that we bring some code style consistency between the vertex shader and the pixel shader.
For example, the vertex shader could look like this:
cbuffer Constants
{
    float4x4 g_WorldViewProj;
};

struct PSInput
{
    float4 Pos : SV_POSITION;
    float2 UV : TEX_COORD;
};

// Vertex shader takes two inputs: vertex position and uv coordinates.
// By convention, Diligent Engine expects vertex shader inputs to be labeled as ATTRIBn, where n is the attribute number.
// Note that if separate shader objects are not supported (this is only the case for old GLES3.0 devices), vertex
// shader output variable name must match exactly the name of the pixel shader input variable.
// If the variable has structure type (like in this example), the structure declarations must also be indentical.
void main(in float3 Pos : ATTRIB0,
          in float2 UV  : ATTRIB1,
          out PSInput PSIn)
{
    PSIn.Pos = mul( float4(Pos, 1.0), g_WorldViewProj);
    PSIn.UV = UV;
}

And the pixel shader like this:
Texture2D g_Texture;
SamplerState g_Texture_sampler; // By convention, texture samplers must use _sampler suffix

struct PSInput
{
    float4 Pos : SV_POSITION;
    float2 UV : TEX_COORD;
};

struct PSOutput
{
    float4 Color : SV_TARGET;
};

void main(in PSInput PSIn,
          out PSOutput PSOut)
{
    PSOut.Color = g_Texture.Sample(g_Texture_sampler, PSIn.UV);
}

What do you think?

Since the bulk of the problems seems to be resolved now, I will close this issue because the thread became too large. I crated separate issues to track the remaining problems:
https://github.com/DiligentGraphics/DiligentCore/issues/61
https://github.com/DiligentGraphics/DiligentCore/issues/62
https://github.com/DiligentGraphics/DiligentCore/issues/63
https://github.com/DiligentGraphics/DiligentSamples/issues/5

That's fine by me. Thanks for everything.


attestation: handle multiple subjects

[x] Have you followed the guidelines in our Contributing document?
[x] Have you checked to ensure there aren't other open Pull Requests for the same change?
[x] Have you added an explanation of what your changes do and why you'd like us to include them?
[ ] Have you written new tests for your changes? Here's an example.

[x] Have you successfully run brew typecheck with your changes locally?
[x] Have you successfully run brew tests with your changes locally?

GitHub's Artifact Attestations feature began putting multiple subjects in a single bundle yesterday. This broke our assumption that each attestation has only one subject. To fix this, we generalize our search of the attestation's subject from just the first subject name to any name in the subject set.
This should fix the behavior observed in https://github.com/Homebrew/homebrew-core/issues/177384#issuecomment-2521141910 and below.
See also: https://github.blog/changelog/2024-12-04-artifact-attestations-now-support-multiple-subjects/

(Draft while I shore this up.)

Tests are green locally, but I haven't added a new multi-subject test yet. I can do that in a moment, or with a follow-up.


Update to elixir 1.10.0

https://github.com/elixir-lang/elixir/releases 1.10.0 was released 8 days ago. Would be great to have support for this

Sorry for the lack of updates. We updated to 1.10.2 as of Apr 7, and we'll update to 1.11.2 within the next few days.


Factorio: Updating to a beta will not update the game

Bug Report
System Information

Operating System (Including distribution name and version number)
Microsoft Windows Server 2016 Standard v1607 (Build 14393.3443) | 32720MB RAM | 1x AMD Ryzen 7 PRO 1700X Eight-Core Processor(8C/16T)
AMP version and build date
AMP Release "Lapetus" | v<IP_ADDRESS> built 11\02\2020 16:26
Which AMP release stream you're using (Mainline, Nightly or FastTrack)
Mainline

I confirm:

[x] that I have searched for an existing bug report for this issue.
[x] that I am using the latest available version of AMP.
[x] that my operating system is up-to-date.

Symptoms

What are you trying to do?
What are you expecting to happen?
What is actually happening? ('Nothing' is not an acceptable answer!)

Trying:
Updating an existing copy of Factorio (0.17.79 - Latest Stable)  to latest experimental ( 0.18.x ).
To make this happen, go to Configuration>Startup and set 0.18.x  at the Beta Version.
Expecting:
Hit Update, wait for the SteamCMD updating my game and get the latest experimental of Factorio.
What it does:
SteamCMD is trying to login as "anonymous" and will "Success" the existing copy ( which is 0.17.79 ).
Normally it should ask me for login details ( like the first time installing ) to access and download the Branch 0.18.x
Logs:
AMPLOG 2020-02-12 20-40-06.log (I hit Update multiple times on this one)
SteamCMD Content_log.txt cut-out

[2020-02-12 20:47:08] Loaded 0 apps from install folder "D:\AMPDatastore\Instances\Factorio01\factorio\steamapps\appmanifest_*.acf".
[2020-02-12 20:47:10] Loaded 1 apps from install folder "d:\ampdatastore\instances\factorio01\factorio\427520\steamapps\appmanifest_*.acf".
[2020-02-12 20:47:11] Start validating appID 427520
[2020-02-12 20:47:11] AppID 427520 scheduler update : Priority First, legacy=no, restore="", timeSinceLastPlayed=1581536831, appDisableSecondsRemaining=0
[2020-02-12 20:47:11] AppID 427520 state changed : Fully Installed,Update Queued,
[2020-02-12 20:47:11] AppID 427520 state changed : Fully Installed,Update Queued,Update Running,
[2020-02-12 20:47:11] AppID 427520 update changed : Running,
[2020-02-12 20:47:11] AppID 427520 update changed : Running,Reconfiguring,
[2020-02-12 20:47:11] AppID 427520 update changed : Running,
[2020-02-12 20:47:11] AppID 427520 update changed : Running,Validating,
[2020-02-12 20:47:11] Validating files (all active,full) ...
[2020-02-12 20:47:11] File validation finished: 0 files (0 bytes) total, 0 files (0 bytes) mismatched (46 msec).
[2020-02-12 20:47:11] AppID 427520 update changed : Running,
[2020-02-12 20:47:11] AppID 427520 update changed : None
[2020-02-12 20:47:11] AppID 427520 state changed : Fully Installed,Update Queued,
[2020-02-12 20:47:11] AppID 427520 state changed : Fully Installed,
[2020-02-12 20:47:11] AppID 427520 scheduler finished : removed from schedule

Reproduction

Create a new instance for the Module "Factorio"
switch into the Instance and hit Update. The Instance will ask for login details. Login and Enter Steam-Guard, if active.
After Update, go to Configuration > Startup and set Beta Version to 0.18.x
Back to Status hit again Update. Now, Login will not be required.
Start the instance and try login with a 0.18.x - Client onto the Server: Server version will not match. (It's awaiting 0.17.79-Clients)
Discuss with the Support ;)

[Edit] added Version and Build-Number of OS

Manual testing on how the SteamCMD and AMP are acting (first 3 executions) + how it should be (4th execution)
PS: i censored my login details 😉
D:\GUI\SteamCMD>steamcmd.exe +login "anonymous" +force_install_dir D:\test_install +app_update 427520 validate +quit
Redirecting stderr to 'D:\GUI\SteamCMD\logs\stderr.txt'
[  0%] Suche nach verfügbaren Updates...
[----] Installation wird überprüft...
Steam Console Client (c) Valve Corporation
-- type 'quit' to exit --
Loading Steam API...OK.

Connecting anonymously to Steam Public...Logged in OK
Waiting for user info...OK
ERROR! Failed to install app '427520' (No subscription)

D:\GUI\SteamCMD>steamcmd.exe +login (￣ ‘i ￣;) ≡(▔﹏▔)≡ +force_install_dir D:\test_install +app_update 427520 validate +quit
Redirecting stderr to 'D:\GUI\SteamCMD\logs\stderr.txt'
[  0%] Suche nach verfügbaren Updates...
[----] Installation wird überprüft...
Steam Console Client (c) Valve Corporation
-- type 'quit' to exit --
Loading Steam API...OK.
Logging in user ' (￣ ‘i ￣;)' to Steam Public ...

Enter the current code from your Steam Guard Mobile Authenticator app
Two-factor code:இ௰இ
Logged in OK
Waiting for user info...OK
 Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
 Update state (0x61) downloading, progress: 0.00 (0 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 3.88 (62479187 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 9.88 (158948179 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 16.12 (259357943 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 16.77 (269883866 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 17.74 (285520397 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 18.49 (297538323 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 19.95 (321075329 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 23.47 (377735107 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 25.73 (414115985 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 30.08 (484026430 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 32.69 (526145719 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 35.69 (574384717 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 39.71 (639141548 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 42.34 (681395593 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 43.82 (705214450 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 47.27 (760684099 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 50.49 (812584270 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 52.57 (845971612 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 54.03 (869524565 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 56.63 (911438665 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 59.65 (959983195 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 61.20 (984915149 /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 65.21<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 70.01<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 71.57<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 76.77<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 80.10<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 83.65<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 84.53<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 85.72<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 91.45<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 97.70<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x61) downloading, progress: 99.54<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x101) committing, progress: 16.04 (258130213 /<PHONE_NUMBER>)
 Update state (0x101) committing, progress: 16.04 (258130213 /<PHONE_NUMBER>)
 Update state (0x101) committing, progress: 60.09 (966995568 /<PHONE_NUMBER>)
 Update state (0x101) committing, progress: 83.00<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x101) committing, progress: 100.00<PHONE_NUMBER> /<PHONE_NUMBER>)
Success! App '427520' fully installed.

D:\GUI\SteamCMD>steamcmd.exe +login "anonymous" +force_install_dir D:\test_install +app_update 427520 -beta 0.18.x validate +quit
Redirecting stderr to 'D:\GUI\SteamCMD\logs\stderr.txt'
[  0%] Suche nach verfügbaren Updates...
[----] Installation wird überprüft...
Steam Console Client (c) Valve Corporation
-- type 'quit' to exit --
Loading Steam API...OK.

Connecting anonymously to Steam Public...Logged in OK
Waiting for user info...OK
 Update state (0x5) validating, progress: 0.00 (0 / 0)
Success! App '427520' fully installed.

D:\GUI\SteamCMD>steamcmd.exe +login  ╯︿╰  ┗( T﹏T )┛ +force_install_dir D:\test_install +app_update 427520 -beta 0.18.x validate +quit
Redirecting stderr to 'D:\GUI\SteamCMD\logs\stderr.txt'
[  0%] Suche nach verfügbaren Updates...
[----] Installation wird überprüft...
Steam Console Client (c) Valve Corporation
-- type 'quit' to exit --
Loading Steam API...OK.
Logging in user '╯︿╰ ' to Steam Public ...

Enter the current code from your Steam Guard Mobile Authenticator app
Two-factor code:≧ ﹏ ≦
Logged in OK
Waiting for user info...OK
 Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
 Update state (0x5) validating, progress: 8.64 (139025235 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 16.04 (258141112 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 16.28 (262084060 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 17.24 (277507042 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 17.39 (279923615 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 18.08 (291034646 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 18.55 (298503108 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 19.53 (314266276 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 20.58 (331218695 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 23.58 (379457211 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 25.60 (412003396 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 29.46 (474090400 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 32.95 (530224707 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 36.53 (587930080 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 38.17 (614223473 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 39.19 (630705210 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 42.45 (683122269 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 45.54 (732869214 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 47.86 (770239087 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 49.04 (789300585 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 51.23 (824461479 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 52.22 (840407736 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 54.57 (878186025 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 60.68 (976488732 /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 62.68<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 63.89<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 64.62<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 65.19<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 65.87<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 66.74<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 68.42<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 70.32<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 70.61<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 73.21<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 80.64<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 83.81<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 90.24<PHONE_NUMBER> /<PHONE_NUMBER>)
 Update state (0x5) validating, progress: 99.15<PHONE_NUMBER> /<PHONE_NUMBER>)
Success! App '427520' fully installed.

D:\GUI\SteamCMD>

Just been looking into this, it is actually a bug in SteamCMD itself. It does not correctly handle situations where you're upgrading from a non-beta to a beta.
If you delete the entire server, fill in the beta field and then hit update it will fetch the correct version. If you then remove that field, it still gets stuck on the Beta version.
I'll report this as a bug to VALVe.

Oh. It'll only success the "download" if started as anonymous... not as user ;)  I guess, validate will overtake the steamCMD, because the app_update to beta isn't successful due to needed subscription ;) ...
had to test this... brb

nvm... if validate is added or not, doesn't matter
D:\GUI\SteamCMD>steamcmd.exe +login anonymous +force_install_dir D:\test +app_update 427520 -beta 0.18.x validate +quit
Redirecting stderr to 'D:\GUI\SteamCMD\logs\stderr.txt'
[  0%] Suche nach verfügbaren Updates...
[----] Installation wird überprüft...
Steam Console Client (c) Valve Corporation
-- type 'quit' to exit --
Loading Steam API...OK.

Connecting anonymously to Steam Public...Logged in OK
Waiting for user info...OK
 Update state (0x5) validating, progress: 0.00 (0 / 0)
Success! App '427520' fully installed.

D:\GUI\SteamCMD>steamcmd.exe +login anonymous +force_install_dir D:\test +app_update 427520 -beta 0.18.x +quit
Redirecting stderr to 'D:\GUI\SteamCMD\logs\stderr.txt'
[  0%] Suche nach verfügbaren Updates...
[----] Installation wird überprüft...
Steam Console Client (c) Valve Corporation
-- type 'quit' to exit --
Loading Steam API...OK.

Connecting anonymously to Steam Public...Logged in OK
Waiting for user info...OK
Success! App '427520' already up to date.


Create HMS3010.py

Added an example to read an IP-based device. Addressing #12.

Thanks for the example!