diff --git a/collects/mred/private/kernel.rkt b/collects/mred/private/kernel.rkt index 61b01afc..5680a684 100644 --- a/collects/mred/private/kernel.rkt +++ b/collects/mred/private/kernel.rkt @@ -5,25 +5,20 @@ "wx/common/queue.rkt" "wx/common/clipboard.rkt" "wx/common/cursor.rkt" - "wx/common/gl-config.rkt" "wx/common/procs.rkt" "wx/common/handlers.rkt" racket/class racket/draw) -(define gl-context<%> (class->interface gl-context%)) - (define (key-symbol-to-integer k) (error 'key-symbol-to-integer "not yet implemented")) (provide (all-from-out "wx/platform.rkt") clipboard<%> - gl-context<%> (all-from-out "wx/common/event.rkt" "wx/common/timer.rkt" "wx/common/clipboard.rkt" "wx/common/cursor.rkt" - "wx/common/gl-config.rkt" "wx/common/procs.rkt") (all-from-out racket/draw) diff --git a/collects/mred/private/wx/cocoa/platform.rkt b/collects/mred/private/wx/cocoa/platform.rkt index 24805c7e..60e8507e 100644 --- a/collects/mred/private/wx/cocoa/platform.rkt +++ b/collects/mred/private/wx/cocoa/platform.rkt @@ -37,7 +37,6 @@ dialog% frame% gauge% - gl-context% group-panel% item% list-box% diff --git a/collects/mred/private/wx/gtk/canvas.rkt b/collects/mred/private/wx/gtk/canvas.rkt index 8393b6de..0f84f0ad 100644 --- a/collects/mred/private/wx/gtk/canvas.rkt +++ b/collects/mred/private/wx/gtk/canvas.rkt @@ -186,7 +186,7 @@ x y w h style [ignored-name #f] - [gl-config #f]) + [gl-conf #f]) (inherit get-gtk set-size get-size get-client-size on-size get-top-win @@ -337,6 +337,9 @@ (define/override (get-client-gtk) client-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) (values margin margin)) diff --git a/collects/mred/private/wx/gtk/dc.rkt b/collects/mred/private/wx/gtk/dc.rkt index 8265735c..e6421f3b 100644 --- a/collects/mred/private/wx/gtk/dc.rkt +++ b/collects/mred/private/wx/gtk/dc.rkt @@ -6,6 +6,7 @@ "window.rkt" "x11.rkt" "win32.rkt" + "gl-context.rkt" "../../lock.rkt" "../common/backing-dc.rkt" racket/draw/cairo @@ -82,6 +83,13 @@ (super-new) + (define gl #f) + (define/override (get-gl-context) + (or gl + (create-widget-gl-context + (send canvas get-client-gtk) + (send canvas get-gl-config)))) + (define/override (make-backing-bitmap w h) (cond [(and (eq? 'unix (system-type)) diff --git a/collects/mred/private/wx/gtk/gl-context.rkt b/collects/mred/private/wx/gtk/gl-context.rkt index ba5d78e0..0ef54f59 100644 --- a/collects/mred/private/wx/gtk/gl-context.rkt +++ b/collects/mred/private/wx/gtk/gl-context.rkt @@ -1,11 +1,132 @@ -#lang scheme/base -(require scheme/class - "../../syntax.rkt") +#lang racket/base +(require racket/class + ffi/unsafe + ffi/unsafe/define + (prefix-in draw: racket/draw/gl-context) + racket/draw/gl-config + "types.rkt" + "utils.rkt") -(provide gl-context%) +(provide create-widget-gl-context) -(defclass gl-context% object% - (def/public-unimplemented call-as-current) - (def/public-unimplemented swap-buffers) - (def/public-unimplemented ok?) - (super-new)) +(define gdkglext-lib + (ffi-lib "libgdkglext-x11-1.0" '("0"))) +(define gtkglext-lib + (ffi-lib "libgtkglext-x11-1.0" '("0"))) + +(define-ffi-definer define-gdkglext gdkglext-lib + #:default-make-fail make-not-available) +(define-ffi-definer define-gtkglext gtkglext-lib + #:default-make-fail make-not-available) + +(define _GdkGLContext (_cpointer/null 'GdkGLContext)) +(define _GdkGLDrawable (_cpointer 'GdkGLDrawable)) +(define _GdkGLConfig (_cpointer 'GdkGLConfig)) + +(define-gdkglext gdk_gl_init (_fun (_ptr i _int) + (_ptr i _pointer) + -> _void) + #:fail void) + +(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-gtk gtk_widget_get_screen (_fun _GtkWidget -> _GdkScreen)) + +(define-gtkglext gtk_widget_set_gl_capability (_fun _GtkWidget + _GdkGLConfig + _GdkGLContext + _gboolean + _int + -> _gboolean) + #:fail (lambda args #f)) + +(define-gtkglext gtk_widget_get_gl_context (_fun _GtkWidget -> _GdkGLContext)) +(define-gtkglext gtk_widget_get_gl_window (_fun _GtkWidget -> _GdkGLDrawable)) + +(define-gdkglext gdk_gl_drawable_gl_begin (_fun _GdkGLDrawable + _GdkGLContext + -> _gboolean)) +(define-gdkglext gdk_gl_drawable_gl_end (_fun _GdkGLDrawable -> _void)) +(define-gdkglext gdk_gl_drawable_swap_buffers (_fun _GdkGLDrawable -> _void)) + +(define GDK_GL_USE_GL 1) +(define GDK_GL_BUFFER_SIZE 2) +(define GDK_GL_LEVEL 3) +(define GDK_GL_RGBA 4) +(define GDK_GL_DOUBLEBUFFER 5) +(define GDK_GL_STEREO 6) +(define GDK_GL_AUX_BUFFERS 7) +(define GDK_GL_RED_SIZE 8) +(define GDK_GL_GREEN_SIZE 9) +(define GDK_GL_BLUE_SIZE 10) +(define GDK_GL_ALPHA_SIZE 11) +(define GDK_GL_DEPTH_SIZE 12) +(define GDK_GL_STENCIL_SIZE 13) +(define GDK_GL_ACCUM_RED_SIZE 14) +(define GDK_GL_ACCUM_GREEN_SIZE 15) +(define GDK_GL_ACCUM_BLUE_SIZE 16) +(define GDK_GL_ACCUM_ALPHA_SIZE 17) +(define GDK_GL_SAMPLE_BUFFERS 100000) +(define GDK_GL_SAMPLES 100001) +(define GDK_GL_ATTRIB_LIST_NONE 0) + +;; ---------------------------------------- + +(define (config->GdkGLConfig d conf) + (gdk_gl_config_new_for_screen d + (list GDK_GL_USE_GL 1 + GDK_GL_DOUBLEBUFFER (if (send conf get-double-buffered) 1 0) + GDK_GL_STEREO (if (send conf get-stereo) 1 0) + GDK_GL_DEPTH_SIZE (send conf get-depth-size) + GDK_GL_STENCIL_SIZE (send conf get-stencil-size) + GDK_GL_ACCUM_RED_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_ALPHA_SIZE (send conf get-accum-size) + GDK_GL_SAMPLES (send conf get-multisample-size) + GDK_GL_ATTRIB_LIST_NONE 0))) + +;; ---------------------------------------- + +(define gl-context% + (class draw:gl-context% + (init-field [gl gl] + [drawable drawable]) + + (define/override (draw:do-call-as-current t) + (dynamic-wind + (lambda () + (gdk_gl_drawable_gl_begin gl drawable)) + t + (lambda () + (gdk_gl_drawable_gl_end drawable)))) + + (define/override (draw:do-swap-buffers) + (gdk_gl_drawable_swap_buffers drawable)) + + (super-new))) + +;; ---------------------------------------- + +(define inited? #f) +(define (init!) + (unless inited? + (set! inited? #t) + (gdk_gl_init 0 #f))) + +(define (create-widget-gl-context gtk config) + (init!) + (let ([config (config->GdkGLConfig (gtk_widget_get_screen gtk) + (or config + (new gl-config%)))]) + (and config + (gtk_widget_set_gl_capability gtk + config + #f + #t + #f) + (let ([gl (gtk_widget_get_gl_context gtk)]) + (and gl + (new gl-context% + [gl gl] + [drawable (gtk_widget_get_gl_window gtk)])))))) diff --git a/collects/mred/private/wx/gtk/platform.rkt b/collects/mred/private/wx/gtk/platform.rkt index 19a1bec5..df851f8a 100644 --- a/collects/mred/private/wx/gtk/platform.rkt +++ b/collects/mred/private/wx/gtk/platform.rkt @@ -9,7 +9,6 @@ "dialog.rkt" "frame.rkt" "gauge.rkt" - "gl-context.rkt" "group-panel.rkt" "item.rkt" "list-box.rkt" @@ -37,7 +36,6 @@ dialog% frame% gauge% - gl-context% group-panel% item% list-box% diff --git a/collects/mred/private/wx/gtk/procs.rkt b/collects/mred/private/wx/gtk/procs.rkt index 7c5dcfd9..95eaacfa 100644 --- a/collects/mred/private/wx/gtk/procs.rkt +++ b/collects/mred/private/wx/gtk/procs.rkt @@ -81,8 +81,6 @@ (define-unimplemented write-resource) (define-unimplemented get-resource) -(define _GdkScreen (_cpointer 'GdkScreen)) -(define-gdk gdk_screen_get_default (_fun -> _GdkScreen)) (define-gdk gdk_screen_get_width (_fun _GdkScreen -> _int)) (define-gdk gdk_screen_get_height (_fun _GdkScreen -> _int)) diff --git a/collects/mred/private/wx/gtk/types.rkt b/collects/mred/private/wx/gtk/types.rkt index 2f51e5e2..7ba1ab7b 100644 --- a/collects/mred/private/wx/gtk/types.rkt +++ b/collects/mred/private/wx/gtk/types.rkt @@ -5,6 +5,7 @@ (provide _GdkWindow _GtkWidget _GtkWindow _GdkDisplay + _GdkScreen _gpointer _GType @@ -36,6 +37,7 @@ (define _GtkWindow _GtkWidget) (define _GdkDisplay (_cpointer 'GdkDisplay)) +(define _GdkScreen (_cpointer 'GdkScreen)) (define _gpointer _GtkWidget) diff --git a/collects/mred/private/wx/gtk/utils.rkt b/collects/mred/private/wx/gtk/utils.rkt index 6a1007c8..7b879119 100644 --- a/collects/mred/private/wx/gtk/utils.rkt +++ b/collects/mred/private/wx/gtk/utils.rkt @@ -41,6 +41,8 @@ define-signal-handler + gdk_screen_get_default + ;; for declaring derived structures: _GtkObject) @@ -203,3 +205,5 @@ (cons ((ctype-c->scheme elem) (g-slist-data gl)) (L (g-slist-next gl))))) (g_slist_free gl))))) + +(define-gdk gdk_screen_get_default (_fun -> _GdkScreen)) diff --git a/collects/mred/private/wx/platform.rkt b/collects/mred/private/wx/platform.rkt index a3b1555a..10e6e4e0 100644 --- a/collects/mred/private/wx/platform.rkt +++ b/collects/mred/private/wx/platform.rkt @@ -21,7 +21,6 @@ dialog% frame% gauge% - gl-context% group-panel% item% list-box% diff --git a/collects/mred/private/wx/win32/platform.rkt b/collects/mred/private/wx/win32/platform.rkt index 96878af4..a1903094 100644 --- a/collects/mred/private/wx/win32/platform.rkt +++ b/collects/mred/private/wx/win32/platform.rkt @@ -37,7 +37,6 @@ dialog% frame% gauge% - gl-context% group-panel% item% list-box%