pyopengl icon indicating copy to clipboard operation
pyopengl copied to clipboard

Support read-only numpy arrays

Open pauldmccarthy opened this issue 5 years ago • 1 comments

When using opengl-accelerate, many operations will fail if passed a numpy.array which is contiguous, but is not writeable, e.g.:

print(value.flags)
gl.glBufferData(gl.GL_ARRAY_BUFFER,
                value.nbytes,
                value,
                gl.GL_STATIC_DRAW)

results in:

  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : False
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False
Traceback (most recent call last):
 ...
  File ".../program.py", line 313, in setAtt
    gl.GL_STATIC_DRAW)
  File "latebind.pyx", line 44, in OpenGL_accelerate.latebind.Curry.__call__ (src/latebind.c:1201)
  File ".../OpenGL/GL/VERSION/GL_1_5.py", line 86, in glBufferData
    data = ArrayDatatype.asArray( data )
  File "arraydatatype.pyx", line 176, in OpenGL_accelerate.arraydatatype.ArrayDatatype.asArray (src/arraydatatype.c:4253)
  File "numpy_formathandler.pyx", line 112, in OpenGL_accelerate.numpy_formathandler.NumpyHandler.c_asArray (src/numpy_formathandler.c:2689)
  File "numpy_formathandler.pyx", line 132, in OpenGL_accelerate.numpy_formathandler.NumpyHandler.contiguous (src/numpy_formathandler.c:3045)
OpenGL.error.CopyError: ('Non-contiguous array passed', array([0.00093461, 0.00061148, 0.00495276, ..., 0.00381922, 0.00935766,
       0.00224066], dtype=float32))

This is because accelerate/src/numpy_formathandler.pyx uses the PyArray_ISCARRAY function to test whether an array is contiguous. However, PyArray_ISCARRAY also tests whether an array is writeable.

This PR simply changes numpy_formathandler.pyx so it uses PyArray_ISCARRAY_RO rather than PyArray_ISCARRAY, so that read-only arrays are accepted.

This issue has arisen in my work due to a recent change in numpy which causes data loaded via np.frombuffer to be set as read-only.

The change to numpy_formathandler.pyx seems to work fine for me, although I am not sure whether some circumstances do actually require arrays to be writeable. If this is the case, please disregard this PR.

pauldmccarthy avatar Apr 11 '19 18:04 pauldmccarthy

It appears that equivalent changes have been made to the codebase, so I think this PR should be closed.

whydoubt avatar Dec 02 '23 22:12 whydoubt