[Openmcl-devel] opengl macptr advice please
R. Matthew Emerson
rme at acm.org
Wed Mar 15 18:26:12 PDT 2017
> On Mar 15, 2017, at 12:04 PM, Arthur Cater <arthur.cater at ucd.ie> wrote:
>
> Hello,
> I’ve gathered my Mac’s Open GL does not support glLineWidth > 1, but I don’t
> understand what I need to do to use #_glGetFloatv to find out from gl info such as this.
> I’d like to learn.
>
>
> On finding I needed a MACPTR (rather than a raw lisp vector) I tried
>
> (gui::execute-in-gui #'(lambda nil
> (let ((v (make-array 2 :initial-element 0.0 :element-type 'single-float)))
> (with-macptrs (v2 v) (#_glGetFloatv #$GL_ALIASED_LINE_WIDTH_RANGE v2))
> v)))
> but that gives a kernel error (10) through AltConsole.
Lisp data and foreign data live in two separate worlds, so you can't pass the address of a lisp array to foreign code. (The gc might move the lisp array, and then the foreign pointer would become invalid.)
There's a macro called ccl:with-pointer-to-ivector that you could possibly use here. I'm not a big fan of that macro, since it's body runs with the gc disabled.
You could also look up make-heap-ivector in the manual.
>
> I also tried
> (gui::execute-in-gui #'(lambda nil
> (let ((v (make-array 2 :initial-element 0.0 :element-type 'single-float)))
> (ccl::%stack-block ((v2 8))
> (#_glGetFloatv #$GL_ALIASED_LINE_WIDTH_RANGE v2)
> (ccl::%copy-ptr-to-ivector v2 0 v 0 8))
> v)))
> which gave #(0.0, 0.0) — i.e. no change to v, where I’d hope for #(1.0, 1.0)
>
> And I tried
> (gui::execute-in-gui #'(lambda nil
> (let ((v (make-array 2 :initial-element 130.0 :element-type 'single-float)))
> (ccl::%stack-block ((v2 8))
> (ccl::%copy-ivector-to-ptr v 0 v2 0 8)
> (#_glGetFloatv #$GL_ALIASED_LINE_WIDTH_RANGE v2)
> (ccl::%get-single-float v2 4)))))
> which gave 130.0 (showing I think that the stack-allocated array is unchanged)
There are some primitive foreign memory accessors that you can use instead of messing around with the internal %copy-ivector-to-ptr or vice versa.
ccl:%stack-block gives to a pointer to some foreign memory on the stack. In principle, you should be able to say
(ccl:%stack-block ((params 8))
(#_glGetFloatv #$GL_ALIASED_LINE_WIDTH_RANGE params)
(values (%get-single-float params 0)
(%get-single-float params 4)))
Note, however, that when I tried this on my Mac, I crashed my lisp. I don't know if I need to have an OpenGL context or something active before doing this or what.
Note that the rlet macro can be a little nicer to use. The FFI's type system even has a notion of foreign arrays. They are manipulated like so:
(rletz ((params (:array #>GLfloat 2)))
(setf (paref params (:* #>GLfloat) 0) 100.0)
(setf (paref params (:* #>GLfloat) 1) 200.0)
(values (paref params (:* #>GLfloat) 0)
(paref params (:* #>GLfloat) 1)))
If this doesn't get you unstuck, please post again.
More information about the Openmcl-devel
mailing list