gtk: more gl

This commit is contained in:
Matthew Flatt 2010-10-13 12:01:45 -06:00
parent 1a2ffacbbe
commit b2981f05b2
7 changed files with 51 additions and 44 deletions

View File

@ -427,15 +427,14 @@
(let ([cfg (new gl-config%)]) (let ([cfg (new gl-config%)])
(send cfg set-multisample-size 4) (send cfg set-multisample-size 4)
(send cfg set-stencil-size 1) (send cfg set-stencil-size 1)
(super-new (style '(no-autoclear)) (gl-config cfg))) (super-new (style '(gl no-autoclear)) (gl-config cfg)))
(unless (send (get-dc) get-gl-context) (unless (send (get-dc) get-gl-context)
(message-box "Error" (message-box "Error"
(format (string-append (format (string-append
"~a requires OpenGL, but there was an error initializing" "~a requires OpenGL, but there was an error initializing"
" the OpenGL context. Probably OpenGL is not supported by" " the OpenGL context. Maybe OpenGL is not supported by"
" the current display, or it was disabled when PLT Scheme was" " the current display.")
" configured and compiled.")
who) who)
#f #f
'(ok stop)) '(ok stop))

View File

@ -310,15 +310,14 @@
(let ([cfg (new gl-config%)]) (let ([cfg (new gl-config%)])
(send cfg set-multisample-size 4) (send cfg set-multisample-size 4)
(send cfg set-stencil-size 1) (send cfg set-stencil-size 1)
(super-new (style '(no-autoclear)) (gl-config cfg))) (super-new (style '(gl no-autoclear)) (gl-config cfg)))
(inherit get-dc) (inherit get-dc)
(unless (send (get-dc) get-gl-context) (unless (send (get-dc) get-gl-context)
(message-box "Error" (message-box "Error"
(string-append "Jewel requires OpenGL, but there was an error initializing" (string-append "Jewel requires OpenGL, but there was an error initializing"
" the OpenGL context. Probably OpenGL is not supported by" " the OpenGL context. Maybe OpenGL is not supported by"
" the current display, or it was disabled when PLT Scheme was" " the current display.")
" configured and compiled.")
#f #f
'(ok stop)) '(ok stop))
(exit)) (exit))

View File

@ -17,6 +17,7 @@
"client-window.rkt" "client-window.rkt"
"widget.rkt" "widget.rkt"
"dc.rkt" "dc.rkt"
"gl-context.rkt"
"combo.rkt" "combo.rkt"
"pixbuf.rkt" "pixbuf.rkt"
"gcwin.rkt") "gcwin.rkt")
@ -186,7 +187,7 @@
x y w h x y w h
style style
[ignored-name #f] [ignored-name #f]
[gl-conf #f]) [gl-config #f])
(inherit get-gtk set-size get-size get-client-size (inherit get-gtk set-size get-size get-client-size
on-size get-top-win on-size get-top-win
@ -286,6 +287,9 @@
(define dc (new dc% [canvas this])) (define dc (new dc% [canvas this]))
(when (memq 'gl style)
(prepare-widget-gl-context client-gtk gl-config))
(gtk_widget_realize gtk) (gtk_widget_realize gtk)
(gtk_widget_realize client-gtk) (gtk_widget_realize client-gtk)
@ -337,9 +341,6 @@
(define/override (get-client-gtk) client-gtk) (define/override (get-client-gtk) client-gtk)
(define/override (handles-events? gtk) (not (ptr-equal? gtk combo-button-gtk))) (define/override (handles-events? gtk) (not (ptr-equal? gtk combo-button-gtk)))
(define gl-config gl-conf)
(define/public (get-gl-config) gl-config)
(define/override (get-client-delta) (define/override (get-client-delta)
(values margin margin)) (values margin margin))

View File

@ -86,9 +86,9 @@
(define gl #f) (define gl #f)
(define/override (get-gl-context) (define/override (get-gl-context)
(or gl (or gl
(create-widget-gl-context (let ([v (create-widget-gl-context (send canvas get-client-gtk))])
(send canvas get-client-gtk) (when v (set! gl v))
(send canvas get-gl-config)))) v)))
(define/override (make-backing-bitmap w h) (define/override (make-backing-bitmap w h)
(cond (cond

View File

@ -7,7 +7,8 @@
"types.rkt" "types.rkt"
"utils.rkt") "utils.rkt")
(provide create-widget-gl-context) (provide prepare-widget-gl-context
create-widget-gl-context)
(define gdkglext-lib (define gdkglext-lib
(ffi-lib "libgdkglext-x11-1.0" '("0"))) (ffi-lib "libgdkglext-x11-1.0" '("0")))
@ -30,6 +31,7 @@
(define-gtkglext gdk_gl_config_new (_fun (_list i _int) -> (_or-null _GdkGLConfig))) (define-gtkglext gdk_gl_config_new (_fun (_list i _int) -> (_or-null _GdkGLConfig)))
(define-gtkglext gdk_gl_config_new_for_screen (_fun _GdkScreen (_list i _int) -> (_or-null _GdkGLConfig))) (define-gtkglext gdk_gl_config_new_for_screen (_fun _GdkScreen (_list i _int) -> (_or-null _GdkGLConfig)))
(define-gtk gtk_widget_get_screen (_fun _GtkWidget -> _GdkScreen)) (define-gtk gtk_widget_get_screen (_fun _GtkWidget -> _GdkScreen))
(define-gtkglext gtk_widget_set_gl_capability (_fun _GtkWidget (define-gtkglext gtk_widget_set_gl_capability (_fun _GtkWidget
@ -73,18 +75,20 @@
;; ---------------------------------------- ;; ----------------------------------------
(define (config->GdkGLConfig d conf) (define (config->GdkGLConfig d conf)
(gdk_gl_config_new_for_screen d (gdk_gl_config_new (append
(list GDK_GL_USE_GL 1 (list GDK_GL_RGBA)
GDK_GL_DOUBLEBUFFER (if (send conf get-double-buffered) 1 0) (if (send conf get-double-buffered) (list GDK_GL_DOUBLEBUFFER) null)
GDK_GL_STEREO (if (send conf get-stereo) 1 0) (if (send conf get-stereo) (list GDK_GL_STEREO) null)
(list
GDK_GL_DEPTH_SIZE (send conf get-depth-size) GDK_GL_DEPTH_SIZE (send conf get-depth-size)
GDK_GL_STENCIL_SIZE (send conf get-stencil-size) GDK_GL_STENCIL_SIZE (send conf get-stencil-size)
GDK_GL_ACCUM_RED_SIZE (send conf get-accum-size) GDK_GL_ACCUM_RED_SIZE (send conf get-accum-size)
GDK_GL_ACCUM_GREEN_SIZE (send conf get-accum-size) GDK_GL_ACCUM_GREEN_SIZE (send conf get-accum-size)
GDK_GL_ACCUM_BLUE_SIZE (send conf get-accum-size) GDK_GL_ACCUM_BLUE_SIZE (send conf get-accum-size)
GDK_GL_ACCUM_ALPHA_SIZE (send conf get-accum-size) GDK_GL_ACCUM_ALPHA_SIZE (send conf get-accum-size))
GDK_GL_SAMPLES (send conf get-multisample-size) #;
GDK_GL_ATTRIB_LIST_NONE 0))) (list GDK_GL_SAMPLES (send conf get-multisample-size))
(list GDK_GL_ATTRIB_LIST_NONE))))
;; ---------------------------------------- ;; ----------------------------------------
@ -96,7 +100,7 @@
(define/override (draw:do-call-as-current t) (define/override (draw:do-call-as-current t)
(dynamic-wind (dynamic-wind
(lambda () (lambda ()
(gdk_gl_drawable_gl_begin gl drawable)) (gdk_gl_drawable_gl_begin drawable gl))
t t
(lambda () (lambda ()
(gdk_gl_drawable_gl_end drawable)))) (gdk_gl_drawable_gl_end drawable))))
@ -114,19 +118,23 @@
(set! inited? #t) (set! inited? #t)
(gdk_gl_init 0 #f))) (gdk_gl_init 0 #f)))
(define (create-widget-gl-context gtk config) (define (prepare-widget-gl-context gtk config)
(init!) (init!)
(let ([config (config->GdkGLConfig (gtk_widget_get_screen gtk) (let ([config (config->GdkGLConfig #f ; (gtk_widget_get_screen gtk)
(or config (or config
(new gl-config%)))]) (new gl-config%)))])
(and config (when config
(gtk_widget_set_gl_capability gtk (gtk_widget_set_gl_capability gtk
config config
#f #f
#t #t
#f) 0))))
(define (create-widget-gl-context gtk)
(init!)
(let ([gl (gtk_widget_get_gl_context gtk)]) (let ([gl (gtk_widget_get_gl_context gtk)])
(and gl (and gl
(new gl-context% (new gl-context%
[gl gl] [gl gl]
[drawable (gtk_widget_get_gl_window gtk)])))))) [drawable (gtk_widget_get_gl_window gtk)]))))

View File

@ -11,7 +11,7 @@
(define/public (get-double-buffered) double-buffered?) (define/public (get-double-buffered) double-buffered?)
(define/public (set-double-buffered v) (set! double-buffered? (and v #t))) (define/public (set-double-buffered v) (set! double-buffered? (and v #t)))
(define stereo? #t) (define stereo? #f)
(define/public (get-stereo) stereo?) (define/public (get-stereo) stereo?)
(define/public (set-stereo v) (set! stereo? (and v #t))) (define/public (set-stereo v) (set! stereo? (and v #t)))

View File

@ -19,7 +19,7 @@
;; Implemented by subclasses: ;; Implemented by subclasses:
(defclass gl-context% object% (defclass gl-context% object%
(define lock-thread #f) (define lock-thread #f)
(define lock (make-semaphore)) (define lock (make-semaphore 1))
(define/private (with-gl-lock t) (define/private (with-gl-lock t)
(if (eq? lock-thread (current-thread)) (if (eq? lock-thread (current-thread))