summaryrefslogtreecommitdiff
path: root/chickadee/graphics/gpu.scm
diff options
context:
space:
mode:
Diffstat (limited to 'chickadee/graphics/gpu.scm')
-rw-r--r--chickadee/graphics/gpu.scm248
1 files changed, 0 insertions, 248 deletions
diff --git a/chickadee/graphics/gpu.scm b/chickadee/graphics/gpu.scm
deleted file mode 100644
index c5d4702..0000000
--- a/chickadee/graphics/gpu.scm
+++ /dev/null
@@ -1,248 +0,0 @@
-;;; Chickadee Game Toolkit
-;;; Copyright © 2016, 2019 David Thompson <davet@gnu.org>
-;;;
-;;; Chickadee is free software: you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published
-;;; by the Free Software Foundation, either version 3 of the License,
-;;; or (at your option) any later version.
-;;;
-;;; Chickadee is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with this program. If not, see
-;;; <http://www.gnu.org/licenses/>.
-
-(define-module (chickadee graphics gpu)
- #:use-module (chickadee graphics gl)
- #:use-module (gl)
- #:use-module (gl enums)
- #:use-module (oop goops)
- #:use-module (srfi srfi-9)
- #:use-module (system foreign)
- #:export (make-gpu-state
- gpu-state-ref
- gpu-state-set!
-
- gpu-finalize
- gpu-guard
- gpu-reap!
-
- make-gpu
- current-gpu
- gpu?
- gpu-gl-context
- gpu-gl-version
- gpu-glsl-version
- gpu-max-texture-size
- gpu-blend-mode
- gpu-polygon-mode
- gpu-cull-face-mode
- gpu-depth-test
- gpu-stencil-test
- gpu-framebuffer
- gpu-shader
- gpu-texture
- gpu-vertex-buffer
- gpu-vertex-array
- gpu-viewport
- gpu-multisample
- gpu-color-mask
- set-gpu-blend-mode!
- set-gpu-polygon-mode!
- set-gpu-cull-face-mode!
- set-gpu-depth-test!
- set-gpu-stencil-test!
- set-gpu-framebuffer!
- set-gpu-shader!
- set-gpu-texture!
- set-gpu-vertex-buffer!
- set-gpu-vertex-array!
- set-gpu-viewport!
- set-gpu-multisample!
- set-gpu-color-mask!))
-
-
-;;;
-;;; GPU state
-;;;
-
-(define-record-type <gpu-state>
- (make-gpu-state bind value)
- gpu-state?
- (bind gpu-state-bind)
- (value gpu-state-ref %gpu-state-set!))
-
-(define (gpu-state-set! state new-value)
- (unless (eq? new-value (gpu-state-ref state))
- ((gpu-state-bind state) new-value)
- (%gpu-state-set! state new-value)))
-
-
-;;;
-;;; GPU
-;;;
-
-(define-record-type <gpu>
- (%make-gpu gl-context
- gl-version
- glsl-version
- guardian
- max-texture-size
- blend-mode
- polygon-mode
- cull-face-mode
- depth-test
- stencil-test
- framebuffer
- shader
- textures
- vertex-buffer
- vertex-array
- viewport
- multisample
- color-mask)
- gpu?
- (gl-context gpu-gl-context)
- (gl-version gpu-gl-version)
- (glsl-version gpu-glsl-version)
- (guardian gpu-guardian)
- (max-texture-size gpu-max-texture-size)
- (blend-mode %gpu-blend-mode)
- (polygon-mode %gpu-polygon-mode)
- (cull-face-mode %gpu-cull-face-mode)
- (depth-test %gpu-depth-test)
- (stencil-test %gpu-stencil-test)
- (framebuffer %gpu-framebuffer)
- (shader %gpu-shader)
- (textures gpu-textures)
- (vertex-buffer %gpu-vertex-buffer)
- (vertex-array %gpu-vertex-array)
- (viewport %gpu-viewport)
- (multisample %gpu-multisample)
- (color-mask %gpu-color-mask))
-
-(define current-gpu (make-parameter #f))
-
-(define-generic gpu-finalize)
-
-(define (gpu-guard obj)
- "Protect OBJ for the garbage collector until OBJ has been deleted
-from the GPU's memory."
- ((gpu-guardian (current-gpu)) obj)
- obj)
-
-(define (gpu-reap! gpu)
- "Delete all GPU objects that are no longer being referenced."
- (let ((guardian (gpu-guardian gpu)))
- (let loop ((obj (guardian)))
- (when obj
- (gpu-finalize obj)
- (loop (guardian))))))
-
-(define (max-texture-size)
- (let ((bv (make-s32vector 1)))
- (gl-get-integer-v (get-p-name max-texture-size)
- (bytevector->pointer bv))
- (s32vector-ref bv 0)))
-
-(define (apply-multisample multisample?)
- (if multisample?
- (gl-enable (version-1-3 multisample))
- (gl-disable (version-1-3 multisample))))
-
-(define (make-gpu gl-context)
- (define (extract-version attr)
- (car (string-split (pointer->string (gl-get-string attr)) #\space)))
- (let ((textures (make-vector 32))
- ;; Lazily resolve bindings to avoid circular dependencies.
- (blend-module (resolve-interface '(chickadee graphics blend)))
- (polygon-module (resolve-interface '(chickadee graphics polygon)))
- (depth-module (resolve-interface '(chickadee graphics depth)))
- (stencil-module (resolve-interface '(chickadee graphics stencil)))
- (buffer-module (resolve-interface '(chickadee graphics buffer)))
- (framebuffer-module (resolve-interface '(chickadee graphics framebuffer)))
- (shader-module (resolve-interface '(chickadee graphics shader)))
- (texture-module (resolve-interface '(chickadee graphics texture)))
- (viewport-module (resolve-interface '(chickadee graphics viewport)))
- (color-module (resolve-interface '(chickadee graphics color)))
- (gl-version (extract-version (string-name version)))
- (glsl-version (extract-version (version-2-0 shading-language-version))))
- ;; Create state for 32 texture units.
- (let loop ((i 0))
- (when (< i 32)
- (vector-set! textures i
- (let ((apply-texture (module-ref texture-module 'apply-texture)))
- (make-gpu-state (lambda (texture)
- (apply-texture i texture))
- (module-ref texture-module 'null-texture))))
- (loop (+ i 1))))
- (%make-gpu gl-context
- gl-version
- glsl-version
- (make-guardian)
- (max-texture-size)
- (make-gpu-state (module-ref blend-module 'apply-blend-mode)
- 'replace)
- (make-gpu-state (module-ref polygon-module 'apply-polygon-mode)
- (module-ref polygon-module 'fill-polygon-mode))
- (make-gpu-state (module-ref polygon-module 'apply-cull-face-mode)
- (module-ref polygon-module 'back-cull-face-mode))
- (make-gpu-state (module-ref depth-module 'apply-depth-test) #f)
- (make-gpu-state (module-ref stencil-module 'apply-stencil-test) #f)
- (make-gpu-state (module-ref framebuffer-module 'apply-framebuffer)
- (module-ref framebuffer-module 'null-framebuffer))
- (make-gpu-state (module-ref shader-module 'apply-shader)
- (module-ref shader-module 'null-shader))
- textures
- (make-gpu-state (module-ref buffer-module 'apply-buffer)
- (module-ref buffer-module 'null-buffer))
- (make-gpu-state (module-ref buffer-module 'apply-vertex-array)
- (module-ref buffer-module 'null-vertex-array))
- (make-gpu-state (module-ref viewport-module 'apply-viewport)
- (module-ref viewport-module 'null-viewport))
- (make-gpu-state apply-multisample #f)
- (make-gpu-state (module-ref color-module 'apply-color-mask)
- (module-ref color-module 'default-color-mask)))))
-
-(define-syntax-rule (define-gpu-getter name ref)
- (define (name gpu)
- (gpu-state-ref (ref gpu))))
-
-(define-gpu-getter gpu-blend-mode %gpu-blend-mode)
-(define-gpu-getter gpu-blend-mode %gpu-polygon-mode)
-(define-gpu-getter gpu-blend-mode %gpu-cull-face-mode)
-(define-gpu-getter gpu-depth-test %gpu-depth-test)
-(define-gpu-getter gpu-stencil-test %gpu-stencil-test)
-(define-gpu-getter gpu-framebuffer %gpu-framebuffer)
-(define-gpu-getter gpu-shader %gpu-shader)
-(define-gpu-getter gpu-vertex-buffer %gpu-vertex-buffer)
-(define-gpu-getter gpu-vertex-array %gpu-vertex-array)
-(define-gpu-getter gpu-viewport %gpu-viewport)
-(define-gpu-getter gpu-multisample %gpu-multisample)
-(define-gpu-getter gpu-color-mask %gpu-color-mask)
-
-(define-syntax-rule (define-gpu-setter name ref)
- (define (name gpu x)
- (gpu-state-set! (ref gpu) x)))
-
-(define-gpu-setter set-gpu-blend-mode! %gpu-blend-mode)
-(define-gpu-setter set-gpu-polygon-mode! %gpu-polygon-mode)
-(define-gpu-setter set-gpu-cull-face-mode! %gpu-cull-face-mode)
-(define-gpu-setter set-gpu-depth-test! %gpu-depth-test)
-(define-gpu-setter set-gpu-stencil-test! %gpu-stencil-test)
-(define-gpu-setter set-gpu-framebuffer! %gpu-framebuffer)
-(define-gpu-setter set-gpu-shader! %gpu-shader)
-(define-gpu-setter set-gpu-vertex-buffer! %gpu-vertex-buffer)
-(define-gpu-setter set-gpu-vertex-array! %gpu-vertex-array)
-(define-gpu-setter set-gpu-viewport! %gpu-viewport)
-(define-gpu-setter set-gpu-multisample! %gpu-multisample)
-(define-gpu-setter set-gpu-color-mask! %gpu-color-mask)
-
-(define (gpu-texture gpu texture-unit)
- (gpu-state-ref (vector-ref (gpu-textures gpu) texture-unit)))
-
-(define (set-gpu-texture! gpu texture-unit texture)
- (gpu-state-set! (vector-ref (gpu-textures gpu) texture-unit) texture))