Search code examples
opengl-esbuffertransform-feedback

glMapBufferRange returns null and produces a GL_INVALID_ENUM?


OpenGL ES 3.0 here. I am trying to read back the contents of a TRANSFORM_FEEDBACK buffer like this:

GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo );
GLES30.glBeginTransformFeedback( GLES30.GL_POINTS);
GLES30.glEnable(GL_RASTERIZER_DISCARD);
GLES30.glDrawArrays( GLES30.GL_POINTS, 0, mNumVertices );
GLES30.glDisable(GL_RASTERIZER_DISCARD);
GLES30.glEndTransformFeedback();

int error1 = GLES30.glGetError();
Log.e("mesh", "begin, error="+error1);

ByteBuffer buffer = (ByteBuffer)GLES30.glMapBufferRange( GLES30.GL_TRANSFORM_FEEDBACK, 0, 4*mNumVertices, GLES30.GL_MAP_READ_BIT);

if( buffer!=null )
  {
  // use it
  }
else
  {
  int error2 = GLES30.glGetError();
  Log.e("mesh", "failed to map tf buffer, error="+error2);
  }

GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);

and the output is

E: begin, error=0
E: failed to map tf buffer, error=1280

i.e. it really looks like glMapBufferRange() generates error 1280, which Google tells me is GL_INVALID_ENUM.

Problem:

according to https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glMapBufferRange.xhtml, glMapBufferRange is never supposed to generate such error. Only GL_INVALID_VALUE, GL_INVALID_OPERATION and GL_OUT_OF_MEMORY ?


Solution

  • Of course glMapBufferRange can cause an GL_INVALID_ENUM error.
    See OpenGL ES 3.2 Specification - MapBufferRange

    An INVALID_ENUM error is generated if target is not one of the targets listed in table 6.1.

    Note, this khronos pages are not the OpenGL (ES) specification. This pages are just for help and wiki purpose.


    The enumerator constant GL_TRANSFORM_FEEDBACK is the target for the operation glBindTransformFeedback.

    A valid target for glMapBufferRange is GL_TRANSFORM_FEEDBACK_BUFFER:

    ByteBuffer buffer = (ByteBuffer)GLES30.glMapBufferRange(
        GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 4*mNumVertices, GLES30.GL_MAP_READ_BIT);