diff options
Diffstat (limited to 'chickadee/render/buffer.scm')
-rw-r--r-- | chickadee/render/buffer.scm | 234 |
1 files changed, 117 insertions, 117 deletions
diff --git a/chickadee/render/buffer.scm b/chickadee/render/buffer.scm index e784456..19d1e8d 100644 --- a/chickadee/render/buffer.scm +++ b/chickadee/render/buffer.scm @@ -51,25 +51,25 @@ unmap-buffer! with-mapped-buffer *buffer-state* - make-typed-buffer - make-streaming-typed-buffer - typed-buffer? - typed-buffer->buffer - typed-buffer->vector - typed-buffer-name - typed-buffer-offset - typed-buffer-component-type - typed-buffer-normalized? - typed-buffer-count - typed-buffer-type - typed-buffer-max - typed-buffer-min - typed-buffer-sparse - typed-buffer-data - typed-buffer-divisor - map-typed-buffer! - unmap-typed-buffer! - with-mapped-typed-buffer + make-buffer-view + make-streaming-buffer-view + buffer-view? + buffer-view->buffer + buffer-view->vector + buffer-view-name + buffer-view-offset + buffer-view-component-type + buffer-view-normalized? + buffer-view-count + buffer-view-type + buffer-view-max + buffer-view-min + buffer-view-sparse + buffer-view-data + buffer-view-divisor + map-buffer-view! + unmap-buffer-view! + with-mapped-buffer-view make-vertex-array vertex-array? vertex-array-indices @@ -237,29 +237,29 @@ vertex buffer data back to the GPU." ;;; -;;; Typed Buffers +;;; Buffer Views ;;; -(define-record-type <typed-buffer> - (%make-typed-buffer name buffer offset component-type - normalized? length type max min sparse divisor) - typed-buffer? - (name typed-buffer-name) - (buffer typed-buffer->buffer) - (offset typed-buffer-offset) - (component-type typed-buffer-component-type) - (normalized? typed-buffer-normalized?) - (length typed-buffer-length) - (type typed-buffer-type) - (max typed-buffer-max) - (min typed-buffer-min) - (sparse typed-buffer-sparse) - (divisor typed-buffer-divisor)) ; for instanced rendering - -(define (typed-buffer-stride typed-buffer) - (or (buffer-stride (typed-buffer->buffer typed-buffer)) - (* (type-size (typed-buffer-type typed-buffer)) - (component-type-size (typed-buffer-component-type typed-buffer))))) +(define-record-type <buffer-view> + (%make-buffer-view name buffer offset component-type + normalized? length type max min sparse divisor) + buffer-view? + (name buffer-view-name) + (buffer buffer-view->buffer) + (offset buffer-view-offset) + (component-type buffer-view-component-type) + (normalized? buffer-view-normalized?) + (length buffer-view-length) + (type buffer-view-type) + (max buffer-view-max) + (min buffer-view-min) + (sparse buffer-view-sparse) + (divisor buffer-view-divisor)) ; for instanced rendering + +(define (buffer-view-stride buffer-view) + (or (buffer-stride (buffer-view->buffer buffer-view)) + (* (type-size (buffer-view-type buffer-view)) + (component-type-size (buffer-view-component-type buffer-view))))) (define (num-elements byte-length byte-offset type component-type) (inexact->exact @@ -269,21 +269,21 @@ vertex buffer data back to the GPU." (type-size type)))))) -(define* (make-typed-buffer #:key - (name "anonymous") - buffer - type - component-type - normalized? - (offset 0) - (length (num-elements (buffer-length buffer) - offset - type - component-type)) - max - min - sparse - divisor) +(define* (make-buffer-view #:key + (name "anonymous") + buffer + type + component-type + normalized? + (offset 0) + (length (num-elements (buffer-length buffer) + offset + type + component-type)) + max + min + sparse + divisor) "Return a new typed buffer view for BUFFER starting at byte index OFFSET of LENGTH elements, where each element is of TYPE and composed of COMPONENT-TYPE values. @@ -314,8 +314,8 @@ divisor of 0 means that a single element is used for every instance and is used for the data being instanced. A divisor of 1 means that each element is used for 1 instance. A divisor of 2 means that each element is used for 2 instances, and so on." - (%make-typed-buffer name buffer offset component-type - normalized? length type max min sparse divisor)) + (%make-buffer-view name buffer offset component-type + normalized? length type max min sparse divisor)) (define (type-size type) (match type @@ -337,11 +337,11 @@ element is used for 2 instances, and so on." ('float 4) ('double 8))) -(define* (make-streaming-typed-buffer type component-type length #:key - (name "anonymous") - (target 'vertex) - data - divisor) +(define* (make-streaming-buffer-view type component-type length #:key + (name "anonymous") + (target 'vertex) + data + divisor) "Return a new typed buffer to hold LENGTH elements of TYPE whose components are comprised of COMPONENT-TYPE values. The underlying untyped buffer is configured for GPU streaming. Optonally, a NAME can @@ -359,32 +359,32 @@ which attributes advance when rendering multiple instances." (make-streaming-buffer buffer-length #:name name #:target target)))) - (make-typed-buffer #:name name - #:buffer buffer - #:type type - #:component-type component-type - #:length length - #:divisor divisor))) - -(define (display-typed-buffer typed-buffer port) - (format port "#<typed-buffer name: ~s buffer: ~a type: ~s component-type: ~s length: ~d offset: ~d>" - (typed-buffer-name typed-buffer) - (typed-buffer->buffer typed-buffer) - (typed-buffer-type typed-buffer) - (typed-buffer-component-type typed-buffer) - (typed-buffer-length typed-buffer) - (typed-buffer-offset typed-buffer))) - -(set-record-type-printer! <typed-buffer> display-typed-buffer) - -(define (typed-buffer-type-size typed-buffer) - (type-size (typed-buffer-type typed-buffer))) - -(define (typed-buffer-data typed-buffer) - (buffer-data (typed-buffer->buffer typed-buffer))) - -(define (typed-buffer-type-gl typed-buffer) - (match (typed-buffer-component-type typed-buffer) + (make-buffer-view #:name name + #:buffer buffer + #:type type + #:component-type component-type + #:length length + #:divisor divisor))) + +(define (display-buffer-view buffer-view port) + (format port "#<buffer-view name: ~s buffer: ~a type: ~s component-type: ~s length: ~d offset: ~d>" + (buffer-view-name buffer-view) + (buffer-view->buffer buffer-view) + (buffer-view-type buffer-view) + (buffer-view-component-type buffer-view) + (buffer-view-length buffer-view) + (buffer-view-offset buffer-view))) + +(set-record-type-printer! <buffer-view> display-buffer-view) + +(define (buffer-view-type-size buffer-view) + (type-size (buffer-view-type buffer-view))) + +(define (buffer-view-data buffer-view) + (buffer-data (buffer-view->buffer buffer-view))) + +(define (buffer-view-type-gl buffer-view) + (match (buffer-view-component-type buffer-view) ('byte (data-type byte)) ('unsigned-byte (data-type unsigned-byte)) ('short (data-type short)) @@ -394,33 +394,33 @@ which attributes advance when rendering multiple instances." ('float (data-type float)) ('double (data-type double)))) -(define (map-typed-buffer! typed-buffer) - (map-buffer! (typed-buffer->buffer typed-buffer))) +(define (map-buffer-view! buffer-view) + (map-buffer! (buffer-view->buffer buffer-view))) -(define (unmap-typed-buffer! typed-buffer) - (unmap-buffer! (typed-buffer->buffer typed-buffer))) +(define (unmap-buffer-view! buffer-view) + (unmap-buffer! (buffer-view->buffer buffer-view))) -(define-syntax-rule (with-mapped-typed-buffer typed-buffer body ...) - (with-mapped-buffer (typed-buffer->buffer typed-buffer) body ...)) +(define-syntax-rule (with-mapped-buffer-view buffer-view body ...) + (with-mapped-buffer (buffer-view->buffer buffer-view) body ...)) -(define* (apply-typed-buffer typed-buffer #:optional attribute-index) - (gpu-state-set! *buffer-state* (typed-buffer->buffer typed-buffer)) +(define* (apply-buffer-view buffer-view #:optional attribute-index) + (gpu-state-set! *buffer-state* (buffer-view->buffer buffer-view)) ;; If there is no attribute-index, we assume this is being bound for ;; use as an index buffer. (when attribute-index (gl-enable-vertex-attrib-array attribute-index) (gl-vertex-attrib-pointer attribute-index - (typed-buffer-type-size typed-buffer) - (typed-buffer-type-gl typed-buffer) - (typed-buffer-normalized? typed-buffer) - (typed-buffer-stride typed-buffer) - (make-pointer (typed-buffer-offset typed-buffer))) - (let ((divisor (typed-buffer-divisor typed-buffer))) + (buffer-view-type-size buffer-view) + (buffer-view-type-gl buffer-view) + (buffer-view-normalized? buffer-view) + (buffer-view-stride buffer-view) + (make-pointer (buffer-view-offset buffer-view))) + (let ((divisor (buffer-view-divisor buffer-view))) (when divisor (gl-vertex-attrib-divisor attribute-index divisor))))) ;; TODO: Handle 4-byte alignment rule for the types that need it. -(define (typed-buffer->vector typed-buffer) +(define (buffer-view->vector buffer-view) (define (component-parser type) (match type ('byte bytevector-s8-ref) @@ -490,13 +490,13 @@ which attributes advance when rendering multiple instances." (parse-component bv (+ i (* component-type-size 13))) (parse-component bv (+ i (* component-type-size 14))) (parse-component bv (+ i (* component-type-size 15))))))))) - (with-mapped-typed-buffer typed-buffer - (let* ((data (typed-buffer-data typed-buffer)) - (length (typed-buffer-length typed-buffer)) - (offset (typed-buffer-offset typed-buffer)) - (stride (typed-buffer-stride typed-buffer)) - (type (typed-buffer-type typed-buffer)) - (component-type (typed-buffer-component-type typed-buffer)) + (with-mapped-buffer-view buffer-view + (let* ((data (buffer-view-data buffer-view)) + (length (buffer-view-length buffer-view)) + (offset (buffer-view-offset buffer-view)) + (stride (buffer-view-stride buffer-view)) + (type (buffer-view-type buffer-view)) + (component-type (buffer-view-component-type buffer-view)) (type-byte-size (* (type-size type) (component-type-size component-type))) (v (make-vector length)) @@ -574,10 +574,10 @@ argument may be overridden. The following values are supported: mode)))) (gpu-state-set! *vertex-array-state* array) (for-each (match-lambda - ((index . typed-buffer) - (apply-typed-buffer typed-buffer index))) + ((index . buffer-view) + (apply-buffer-view buffer-view index))) attributes) - (apply-typed-buffer indices) + (apply-buffer-view indices) (gpu-state-set! *vertex-array-state* null-vertex-array) array)) @@ -596,8 +596,8 @@ argument may be overridden. The following values are supported: (let ((indices (vertex-array-indices array))) (gl-draw-elements (vertex-array-mode-gl array) (or count - (typed-buffer-length indices)) - (typed-buffer-type-gl indices) + (buffer-view-length indices)) + (buffer-view-type-gl indices) %null-pointer))) (define* (render-vertices/instanced array instances #:optional count) @@ -605,7 +605,7 @@ argument may be overridden. The following values are supported: (let ((indices (vertex-array-indices array))) (gl-draw-elements-instanced (vertex-array-mode-gl array) (or count - (typed-buffer-length indices)) - (typed-buffer-type-gl indices) + (buffer-view-length indices)) + (buffer-view-type-gl indices) %null-pointer instances))) |