[racket] question on OpenGL support

From: Stephan Houben (stephanh at planet.nl)
Date: Mon Apr 11 15:32:00 EDT 2011

Hi list,

On 04/09/2011 05:51 AM, Jay Kominek wrote:
> The OpenGL APIs, all the versions, all the
> extensions, are described in some fairly parseable files available
> fromhttp://www.opengl.org/registry/  - look for the .spec files
> towards the bottom. I'm pretty sure you should be able to generate the
> bindings from those files, and more easily than dealing with C
> headers.

I wrote a bit of code to parse these files and it works fine so far.
I would like some advice though on how to wrap arrays in "output" mode.

Take for example the following function:

GetTexLevelParameteriv(target, level, pname, params)
	return		void
	param		target		TextureTarget in value
	param		level		CheckedInt32 in value
	param		pname		GetTextureParameter in value
	param		params		Int32 out array [COMPSIZE(pname)]

This corresponds to the C header:

    void glGetTexLevelParameteriv( GLenum target,
                                       GLint level,
                                       GLenum pname,
                                       GLint *params )



This function fills array "params" with some data.
The length of params depends on pname and is not directly specified.

I now wrap this as follows:

(_fun (target : _int32) (level : _int32) (pname : _int32) (params : _pointer) -> _void)

So params is just a raw pointer. I should perhaps use _i32vector in "output" mode instead but:
1. I don't have an expression for the length, and
2. I don't want to have the wrapper allocate and return an array; rather I want to mirror
    the C api exactly and pass in an array which is filled by the function.

The latter I consider especially important, since it ensures that all the docs for the C API can be used directly.

So what I really want is that a _i32vector is passed in for parameter "params", and then filled
by the function, so that the Racket program can observe the mutated vector.
Can this be achieved?

Thanks,

Stephan


Posted on the users mailing list.