diff options
author | David Thompson <dthompson2@worcester.edu> | 2016-02-15 14:52:03 -0500 |
---|---|---|
committer | David Thompson <dthompson2@worcester.edu> | 2016-02-15 14:52:03 -0500 |
commit | 0de5247b7653394bf9ceecfc17d188dab3c7bcd5 (patch) | |
tree | 6ef8d323c32ed62bbdd90ea72f541e414c848d25 /sly/render/shader.scm | |
parent | 000315b8f5e2cfe45db0ebfe42f9208c9c0d95e1 (diff) |
Use a single foreign object guardian.
Rather than each foreign resource type creating its own guardian, let's
just use one instead so that there is only a single guardian to talk to
each frame.
* sly/guardian.scm: New file.
* Makefile.am (SOURCES): Add it.
* sly/game.scm (run-game-loop): Start guardian worker.
* sly/render/mesh.scm (mesh-guardian): Delete.
(free-mesh): New procedure.
(make-mesh): Guard newly created meshes.
* sly/render/shader.scm (shader-stage-guardian): Delete.
(free-shader-stage): New procedure.
(make-shader-stage): Guard newly created shader stages.
(shader-guardian): Delete.
(free-shader): New procedure.
(make-shader): Guard newly created shaders.
* sly/render/texture.scm (texture-guardian): Delete.
(free-texture): New procedure.
(make-texture): Guard newly created textures.
Diffstat (limited to 'sly/render/shader.scm')
-rw-r--r-- | sly/render/shader.scm | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/sly/render/shader.scm b/sly/render/shader.scm index 556d626..3367b57 100644 --- a/sly/render/shader.scm +++ b/sly/render/shader.scm @@ -26,6 +26,7 @@ #:use-module (gl) #:use-module (gl low-level) #:use-module (sly utils) + #:use-module (sly guardian) #:use-module (sly math transform) #:use-module (sly math vector) #:use-module (sly render color) @@ -88,10 +89,11 @@ (eq? (shader-stage-type stage) 'fragment)) ;; Reap GL shaders when their wrapper objects are GC'd. -(define-guardian shader-stage-guardian - (lambda (stage) - (false-if-exception - (glDeleteShader (shader-stage-id stage))))) +(define (free-shader-stage stage) + (false-if-exception + (glDeleteShader (shader-stage-id stage)))) + +(register-finalizer shader-stage? free-shader-stage) (define-status %shader-stage-compiled? glGetShaderiv compile-status) @@ -135,10 +137,9 @@ or 'fragment') and compile the GLSL program contained in the string SOURCE." (let* ((id (glCreateShader (gl-shader-type type))) (stage (%make-shader-stage type id))) - (shader-stage-guardian stage) (set-shader-stage-source stage source) (compile-shader-stage stage) - stage)) + (guard stage))) (define (make-vertex-shader-stage source) "Create a new GLSL vertex shader stage and compile the GLSL program @@ -205,10 +206,11 @@ stored in the file FILE-NAME." (uniform-location uniform) (error "Uniform not found: " name)))) -(define-guardian shader-guardian - (lambda (shader) - (false-if-exception - (glDeleteProgram (shader-id shader))))) +(define (free-shader shader) + (false-if-exception + (glDeleteProgram (shader-id shader)))) + +(register-finalizer shader? free-shader) (define-status shader-linked? glGetProgramiv link-status) (define-logger display-linking-error glGetProgramiv glGetProgramInfoLog) @@ -252,10 +254,8 @@ VERTEX-STAGE and FRAGMENT-STAGE." (for-each (lambda (stage) (glDetachShader id (shader-stage-id stage))) stages) - (let* ((uniforms (map build-uniform uniforms)) - (shader (%make-shader id uniforms))) - (shader-guardian shader) - shader)) + (let* ((uniforms (map build-uniform uniforms))) + (guard (%make-shader id uniforms)))) throw (lambda _ ;; Make sure to delete program in case linking fails. |