title: OpenGLES 3.0 Shader Compile error on Android Device for in and out storage qualifiers
body: <p>So I am updating my app to use OpenGLES 3.0 to take advantage of transform feedback, but the shader isn't compiling.</p>
  
  <p>error:</p>
  
  <pre><code>06-27 17:29:43.299  18593-18627/com.harmonicprocesses.penelopefree E/MyGLRenderer﹕ Could not compile shader 35633:
  06-27 17:29:43.299  18593-18627/com.harmonicprocesses.penelopefree E/MyGLRenderer﹕ ERROR: 0:1: 'in' : Syntax error:  syntax error
  INTERNAL ERROR: no main() function!
  ERROR: 1 compilation errors.  No code generated.
  </code></pre>
  
  <p>Here is the vertex shader code:</p>
  
  <pre><code>    private final String vertexShaderSrc =
          "in float inValue;" +
          "out float outValue;" +
  
          "void main() {" +
          "    outValue = sqrt(inValue);" +
          "}";
  </code></pre>
  
  <p>Here is the compilation code:</p>
  
  <pre><code>        int vertexShader = MyGLRenderer.loadShader(GLES30.GL_VERTEX_SHADER,
              vertexShaderSrc);
  </code></pre>
  
  <p>...</p>
  
  <pre><code>    public static int loadShader(int shaderType, String source) {
      int shader = GLES30.glCreateShader(shaderType);
      if (shader != 0) {
          GLES30.glShaderSource(shader, source);
          GLES30.glCompileShader(shader);
          int[] compiled = new int[1];
          GLES30.glGetShaderiv(shader, GLES30.GL_COMPILE_STATUS, compiled, 0);
          if (compiled[0] == 0) {
              Log.e(TAG, "Could not compile shader " + shaderType + ":");
              Log.e(TAG, GLES30.glGetShaderInfoLog(shader));
              GLES30.glDeleteShader(shader);
              shader = 0;
          }
      }
      return shader;
  }
  </code></pre>
  
  <p>Does anyone see anything wrong with this? If I change <code>in</code> and <code>out</code> to <code>attribute</code> <code>varying</code> respectively it doesn't throw an error, but glUseProgram throw gl error 1282 "Invalid Operation". </p>
  
  <p>This is how I set up GL for es version 3.0:</p>
  
  <pre><code>public MyGLSurfaceViewLegacy(Context context) {
      super(context);
      setListenForTouchOnTouchListener();
      NoteSpectrum = DSPEngine.staticCalcNoteBins(AudioConstants.defaultBufferSize*2, 
              AudioConstants.sampleRate);
      // Create an OpenGL ES 2.0 context.
      setEGLContextClientVersion(3);
      // Set the Renderer for drawing on the GLSurfaceView
      mRenderer = new MyGLRenderer(context,this);
      setEGLConfigChooser(8, 8, 8, 8, 16, 0);
      mContextFactory = new MyContextFactory();
      setEGLContextFactory(mContextFactory);
      //mEGLWindowSurfaceFactory = new MyEGLWindowSurfaceFactory();
      //setEGLWindowSurfaceFactory(mEGLWindowSurfaceFactory);
      setRenderer(mRenderer);
      getHolder().setFormat(PixelFormat.TRANSLUCENT);
  
      // Render the view only when there is a change in the drawing data
      setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
  
  
  
      mContext = context;
  
  
      drawOverlay = PreferenceManager.getDefaultSharedPreferences(mContext)
              .getBoolean("turn_on_visualization_key",true);
  }
  
  
  class MyContextFactory implements EGLContextFactory {
  private int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
  private EGLContext mEGLContext;
  private EGLDisplay mEGLDisplay;
  private MyGLSurfaceView mMyGLSurfaceView;
  private EGL10 mEGL;
  
  @Override
  public EGLContext createContext(EGL10 egl, EGLDisplay display,
          EGLConfig eglConfig) {
      int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 3,
              EGL10.EGL_NONE };
      mEGL = egl;
      mEGLContext = egl.eglGetCurrentContext();
      mEGLDisplay = display;
      mEGLContext = egl.eglCreateContext(display, eglConfig, 
              egl.eglGetCurrentContext(), attrib_list);
      return mEGLContext;
  }
  </code></pre>