gtk: more gl
This commit is contained in:
parent
1a2ffacbbe
commit
b2981f05b2
|
@ -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))
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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))
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
GDK_GL_DEPTH_SIZE (send conf get-depth-size)
|
(list
|
||||||
GDK_GL_STENCIL_SIZE (send conf get-stencil-size)
|
GDK_GL_DEPTH_SIZE (send conf get-depth-size)
|
||||||
GDK_GL_ACCUM_RED_SIZE (send conf get-accum-size)
|
GDK_GL_STENCIL_SIZE (send conf get-stencil-size)
|
||||||
GDK_GL_ACCUM_GREEN_SIZE (send conf get-accum-size)
|
GDK_GL_ACCUM_RED_SIZE (send conf get-accum-size)
|
||||||
GDK_GL_ACCUM_BLUE_SIZE (send conf get-accum-size)
|
GDK_GL_ACCUM_GREEN_SIZE (send conf get-accum-size)
|
||||||
GDK_GL_ACCUM_ALPHA_SIZE (send conf get-accum-size)
|
GDK_GL_ACCUM_BLUE_SIZE (send conf get-accum-size)
|
||||||
GDK_GL_SAMPLES (send conf get-multisample-size)
|
GDK_GL_ACCUM_ALPHA_SIZE (send conf get-accum-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))))
|
||||||
(let ([gl (gtk_widget_get_gl_context gtk)])
|
|
||||||
(and gl
|
(define (create-widget-gl-context gtk)
|
||||||
(new gl-context%
|
(init!)
|
||||||
[gl gl]
|
(let ([gl (gtk_widget_get_gl_context gtk)])
|
||||||
[drawable (gtk_widget_get_gl_window gtk)]))))))
|
(and gl
|
||||||
|
(new gl-context%
|
||||||
|
[gl gl]
|
||||||
|
[drawable (gtk_widget_get_gl_window gtk)]))))
|
||||||
|
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user