Please confirm shader language version used in ARM GLES 3.1 emulator version 2.2? User guide attached with emulator(Mali OpenGL ES Emulator 2.2 User Guide.pdf, Page 19) suggests that it support 3.1
===========================================
Shading Language Version
For OpenGL ES 2.0 contexts, the Mali OpenGL ES Emulator supports up to version 1.2 of the OpenGL
ES Shader Language.
For OpenGL ES 3.0 contexts, OpenGL ES Shader Language version 3.0 is supported. For OpenGL ES
3.1 contexts, OpenGL ES Shader Language 3.1 is supported.
==================================================
Whereas when I compile shader with ;#version 310 es' as first line it gives following compilation error.
==========================================
Log START:
Error: 0:1: P0007: Language version '310' unknown, this compiler only supports up to version '300 es'Error: 0:1: P0007: Unexpected text found after #version directiveError: 0:3: L0001: Typename expected, found 'in'
Log END
================================================
Note: If current compiler supports upto version 300 es only, when can I expect next release with version '310 es'
Regards
Sunil
Hi Sunil,
I confirm that the Open GL ES Emulator 2.2 does support shaders with #version 310 es as stated in User Guide.
I'm not able to reproduce the problem you've reported by simply compiling a shader with this statement as the first shader line.
Therefore we would need more input from you to investigate where can cause the problem you're experiencing.
If you can please report us the OS and installation type you had for the 2.2 emulator.
Could you share a short snippet of your app code and the exact shader source that generates the problem?
Is the log output the only symptom you have or is there any glGetError-reported code at glCompileShader function call?
This type of error I would expect you to have when running 3.1 shaders on older (prior 2.0) emulator version. Can you share with us your output from glGetString(GL_RENDERER)?
Are there any particular environment variables you've adopted while running your app with emulator?
Regards,
Adam
If you had an older emulator build installed make sure it isn't before the new emulator on your PATH, otherwise you'll be picking up the wrong libraries. In general I'd recommend totally removing all but the latest emulator.
Pete
Thanks Adam and Peter for quick reply. Sorry but issue seems to be little different. It is writing following log whether shader compilation fails or succeeds i.e shader with #version 310 es as first line. So for me too it succeeds for basic shaders but is failing for some complex ones.
Error: 0:1: P0007: Language version '310' unknown, this compiler only supports up to version '300 es'
Error: 0:1: P0007: Unexpected text found after #version directive
Error: 0:8: L0001: Typename expected, found 'layout'
Error: 0:8: L0001: Expected identifier, found '('
My shader code starts with something like
----------------------------------------------------------------------------------------------
#version 310 es
#define SHADER_PROFILE 310
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
layout(row_major) uniform;
-------------------------------------------------------------------------------------------
So if compilation fails I can not locate real issue because only glGetShaderInfoLog returns only first 4 lines of compilation
Below information might help you in sorting out the issue.
GL_RENDERER - "Mali OpenGL ES Emulator 2.2"
OS - Windows 7
glGetError succeeds at glCompileShader()
My system has only one emulator installation i.e. Mali OpenGL ES Emulator 2.2.
Please find below graphics card detail
Renderer: Quadro 5000/PCIe/SSE2
Vendor: NVIDIA Corporation
Memory: 2560 MB
Version: 4.4.0 NVIDIA 353.06
Shading language version: 4.40 NVIDIA via Cg compiler
thanks for details, it helped a lot in finding the actual issue.
The #version 310 es is supported and your shaders should be correctly compiled (means - not error flag set), linked and can be used to run GL ES 3.1 programs on the Emulator.
However, there is misleading log message for this case only (version 310 es), which you've observed.
We've captured this one issue and there will be a fix for it making next release free from the inconvenience.
As a work-around, please take GL_NO_ERROR returned from glGetError() in the first place as indication whether shader compilation succeeded, and a bit less rely on text log analysis, if possible for the time being.
If you have ES 3.1 shader that set an error code on compilation attempt, then please have a look to the log to see whether the reason of it is indicated there. Don't hesitate to share your concerns if any expected language feature seems to be unsupported.
These two lines you can ignore for now:
The shader compilation results and the support for ES 3.1 language features in the Emulator have been tested with official conformance tests suite therefore I'm convinced you should be able to use the Emulator productively. However, the exact compilation log content, as vendor specific - was not part of the that detailed check
So, well spotted!
Thanks,
Hi Adam,
Thanks for quick update, Actually GLSL built in function 'mix' is causing problem. Linking log hints at this.
error C1115: unable to find compatible overloaded function "mix(float, float, float)"
error C1115: unable to find compatible overloaded function "mix(vec3, vec3, float)"
Removing 'mix' from fragment shader compiles/links successfully. Please suggest if there is any workaround.
Let's see. We are aware about some issues with 'mix' using uvec types.
As 'mix' comes with overloaded versions, can you point which particular one is troublesome in your case?
Is it possible you share the whole shader source that causes the problem?
cheers,
Built in function 'mix' is not working even for very basic example of mixing colors from two textures., it works if I remove outColor = mix(texture(tex1, texOut),texture(tex2,texOut),0.5f); by outColor = texture(tex1, texOut); It means problem lies with 'mix' function only.
----------------------------------------------
in vec3 vv3colour;
in vec2 texOut;
out vec4 outColor;
uniform sampler2D tex1;
uniform sampler2D tex2;
void main() {
outColor = mix(texture(tex1, texOut),texture(tex2,texOut),0.5f);
}
----------------------------------------
In another case where I can not share other share shader codes, I created sample fragment shader to reproduce. It seems mix(vec4,vec4,float) is not working and gives following error while linking
error C1115: unable to find compatible overloaded function "mix(vec3, vec3, float)" as shared in my above post.
-------------------------------------------------
outColor = mix(vec4(vv3colour,1.0),vec4(0.0,0.0,0.0,1.0),1.0);
--------------------------------------------------
Please let me know if it helps, and you can run above shaders successfully.
it was helpful indeed, and we have reproduction for the problem.
I confirm this is a valid issue for the Emulator and we'll prepare a fix for it.
The not-so-convenient and temporary workaround for the moment would be dropping the built-in and switching to custom mix(vec4,vec4,float) function in your shader, by declaring it:
-------------------
vec4 mix(vec4 x, vec4 y, float a) { return (1-a)*x + a*y; }
You can expect announcement on this thread when this issue gets resolution and the workaround is no longer necessary.
Thanks for your report,
Thanks again for your report.We have just released a new version of Mali OpenGL ES Emulator and the problems you have reported should now be fixed.You can download the latest Emulator 2.2.1 from http://malideveloper.arm.com/resources/tools/opengl-es-emulator/
Could you please try it and confirm that the problems are gone?
Jacek