summaryrefslogtreecommitdiff
path: root/sly/render
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2015-08-25 06:41:46 -0400
committerDavid Thompson <dthompson2@worcester.edu>2015-08-25 06:41:46 -0400
commita0b33ff9274b0fb682e36a42e3aa70ce5581df7c (patch)
treeb34f0315c365e171c2245ed77367ccccd40111c2 /sly/render
parent273c77383226dcce24a2f5af461cb4afb7244f9f (diff)
Optimize matrix operations.
Guile's array procedures are slow, so switch to using raw bytevectors instead. Additionally, converting the bytevector to a pointer is also slow, so the pointer is now cached for redundant calls. There's more to be done, but this was low hanging fruit. * sly/math/transform.scm (<transform>)[ptr]: New field. (transform-ptr): New accessor. (set-transform-ptr!): New setter. (make-4x4-matrix): Implement using bytevectors. (matrix-set!, matrix-ref): New procedures. (make-transform, transform-vector2, transform-position): Use 'matrix-set!' and 'matrix-ref'. (transpose, transform+, transform*): Use new transform constructor. (transform->pointer): Cache pointer. * sly/render/context.scm (copy-transform!): Use 'bytevector-copy!' * sly/render/shader.scm: Use 'transform->pointer' in the transform uniform setter.
Diffstat (limited to 'sly/render')
-rw-r--r--sly/render/context.scm5
-rw-r--r--sly/render/shader.scm4
2 files changed, 5 insertions, 4 deletions
diff --git a/sly/render/context.scm b/sly/render/context.scm
index fe16104..a83b612 100644
--- a/sly/render/context.scm
+++ b/sly/render/context.scm
@@ -22,6 +22,7 @@
;;; Code:
(define-module (sly render context)
+ #:use-module (rnrs bytevectors)
#:use-module (ice-9 match)
#:use-module (ice-9 q)
#:use-module (srfi srfi-9)
@@ -155,7 +156,9 @@
(compose q-pop! render-context-transform-stack))
(define (copy-transform! src dest)
- (array-copy! (transform-matrix src) (transform-matrix dest)))
+ (bytevector-copy! (transform-matrix src) 0
+ (transform-matrix dest) 0
+ 64))
;; emacs: (put 'with-transform-excursion 'scheme-indent-function 1)
(define-syntax-rule (with-transform-excursion context body ...)
diff --git a/sly/render/shader.scm b/sly/render/shader.scm
index 9f80d2a..392ebc5 100644
--- a/sly/render/shader.scm
+++ b/sly/render/shader.scm
@@ -353,9 +353,7 @@ location."
(register-uniform-setter! transform?
(lambda (location t)
- (let ((pointer
- (bytevector->pointer
- (array-contents (transform-matrix t)))))
+ (let ((pointer (transform->pointer t)))
(glUniformMatrix4fv location 1 #f
pointer))))