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 ?
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);