summaryrefslogtreecommitdiff
path: root/sly/render/shader.scm
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2016-02-15 14:52:03 -0500
committerDavid Thompson <dthompson2@worcester.edu>2016-02-15 14:52:03 -0500
commit0de5247b7653394bf9ceecfc17d188dab3c7bcd5 (patch)
tree6ef8d323c32ed62bbdd90ea72f541e414c848d25 /sly/render/shader.scm
parent000315b8f5e2cfe45db0ebfe42f9208c9c0d95e1 (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.scm28
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.