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.scm555
1 files changed, 385 insertions, 170 deletions
diff --git a/chickadee/graphics/gpu.scm b/chickadee/graphics/gpu.scm
index ab9bb89..ab007f9 100644
--- a/chickadee/graphics/gpu.scm
+++ b/chickadee/graphics/gpu.scm
@@ -21,30 +21,51 @@
(define-module (chickadee graphics gpu)
#:use-module (chickadee graphics color)
+ #:use-module (chickadee math vector)
#:use-module (ice-9 match)
#:use-module (ice-9 threads)
#:use-module (rnrs bytevectors)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-9)
#:use-module (srfi srfi-9 gnu)
- #:export (make-gpu
- gpu-tick
- gpu-swap
- gpu-gc
- gpu-submit
- current-gpu
- define-gpu-backend
+ #:export (gpu-preferred-canvas-format
+ gpu-shader-language-features
+
+ make-gpu-adapter
+ gpu-adapter?
+ gpu-adapter-supported-features
+ gpu-adapter-supported-limits
+ gpu-adapter-fallback?
+ gpu-adapter-info
+ gpu-adapter-request-device
+
+ make-gpu-device
+ gpu-device-tick
+ gpu-device-swap
+ gpu-device-gc
+ gpu-device-submit
+ current-gpu-device
+ define-gpu-device-backend
make-buffer
buffer?
buffer-available?
buffer-destroyed?
buffer-mapped?
+ buffer-size
+ buffer-usage
buffer-destroy!
+ buffer-write!
buffer-map!
buffer-unmap!
bytevector->buffer
+ make-extent-3d
+ extent-3d?
+ extent-3d-width
+ extent-3d-height
+ extent-3d-depth
+
make-texture
texture-destroy!
texture?
@@ -53,7 +74,7 @@
texture-destroyed?
texture-width
texture-height
- texture-layers
+ texture-depth
texture-mip-level-count
texture-sample-count
texture-dimension
@@ -89,10 +110,56 @@
sampler-min-filter
sampler-mipmap-filter
+ make-buffer-binding-layout
+ buffer-binding-layout?
+ buffer-binding-layout-type
+ buffer-binding-layout-dynamic-offset?
+ buffer-binding-layout-min-binding-size
+
+ make-texture-binding-layout
+ texture-binding-layout?
+ texture-binding-layout-sample-type
+ texture-binding-layout-view-dimension
+ texture-binding-layout-multisampled?
+
+ make-storage-texture-binding-layout
+ storage-texture-binding-layout?
+ storage-texture-binding-layout-access
+ storage-texture-binding-layout-format
+ storage-texture-binding-layout-view-dimension
+
+ make-external-texture-binding-layout
+ external-texture-binding-layout?
+
+ make-bind-group-layout-entry
+ bind-group-layout-entry-binding
+ bind-group-layout-entry-visibility
+ bind-group-layout-entry-layout
+
+ make-bind-group-layout
+ bind-group-layout?
+ bind-group-layout-entries
+
+ make-bind-group-entry
+ bind-group-entry?
+ bind-group-entry-binding
+ bind-group-entry-resource
+
+ make-bind-group
+ bind-group?
+ bind-group-layout
+ bind-group-entries
+
+ make-pipeline-layout
+ pipeline-layout?
+ pipeline-layout-device
+ pipeline-layout-bind-group-layouts
+
make-shader-module
shader-module?
shader-module-vertex
shader-module-fragment
+ shader-module-destroyed?
make-vertex-attribute
vertex-attribute?
@@ -230,10 +297,17 @@
;;;
-;;; Generic GPU
+;;; Device Queue
;;;
-(define-syntax-rule (define-gpu-type name make pred
+
+
+
+;;;
+;;; Device
+;;;
+
+(define-syntax-rule (define-gpu-device-type name make pred
(mutex mutex-accessor)
(guardian guardian-accessor)
(internal internal-accessor)
@@ -250,109 +324,99 @@
(vfield vfield-accessor) ...)
(define* (make internal #:key vfield ...)
(%make (make-recursive-mutex) (make-guardian) internal vfield ...))
- (define (vfield-dispatch gpu vfield-dispatch-args ...)
- (with-mutex (mutex-accessor gpu)
- ((vfield-accessor gpu)
- (internal-accessor gpu)
+ (define (vfield-dispatch gpu-device vfield-dispatch-args ...)
+ (with-mutex (mutex-accessor gpu-device)
+ ((vfield-accessor gpu-device)
+ (internal-accessor gpu-device)
vfield-dispatch-args ...)))
...))
-(define-gpu-type <gpu>
- %make-gpu
- gpu?
- (mutex gpu-mutex)
- (guardian gpu-guardian)
- (internal gpu-internal)
- (tick %gpu-tick (gpu-tick))
- (swap %gpu-swap (gpu-swap))
- (enqueue %gpu-enqueue (backend:enqueue command-buffer))
- (make-buffer %gpu-make-buffer
+(define-gpu-device-type <gpu-device>
+ %make-gpu-device
+ gpu-device?
+ (mutex gpu-device-mutex)
+ (guardian gpu-device-guardian)
+ (internal gpu-device-internal)
+ (tick %gpu-device-tick (gpu-device-tick))
+ (swap %gpu-device-swap (gpu-device-swap))
+ (enqueue %gpu-device-enqueue (backend:enqueue command-buffer))
+ (make-buffer %gpu-device-make-buffer
(backend:make-buffer length usage))
- (buffer-destroy %gpu-buffer-destroy
+ (buffer-destroy %gpu-device-buffer-destroy
(backend:buffer-destroy buffer))
- (buffer-map %gpu-buffer-map
+ (buffer-map %gpu-device-buffer-map
(backend:buffer-map buffer mode offset sizes))
- (buffer-unmap %gpu-buffer-unmap
+ (buffer-unmap %gpu-device-buffer-unmap
(backend:buffer-unmap buffer))
- (buffer-write %gpu-buffer-write
+ (buffer-write %gpu-device-buffer-write
(backend:buffer-write buffer buffer-offset data data-offset
length))
- (make-texture %gpu-make-texture
+ (make-texture %gpu-device-make-texture
(backend:make-texture width height depth mip-level-count
sample-count dimension format usage
view-formats))
- (texture-destroy %gpu-texture-destroy (backend:texture-destroy texture))
- (make-texture-view %gpu-make-texture-view
+ (texture-destroy %gpu-device-texture-destroy (backend:texture-destroy texture))
+ (make-texture-view %gpu-device-make-texture-view
(backend:make-texture-view texture format dimension aspect
base-mip-level mip-level-count
base-depth depth))
- (texture-view-destroy %gpu-texture-view-destroy
+ (texture-view-destroy %gpu-device-texture-view-destroy
(backend:texture-view-destroy view))
- (make-sampler %gpu-make-sampler
+ (make-sampler %gpu-device-make-sampler
(backend:make-sampler address-mode-u address-mode-v
address-mode-w mag-filter min-filter
mipmap-filter))
- (sampler-destroy %gpu-sampler-destroy (backend:sampler-destroy module))
- (make-shader-module %gpu-make-shader-module
+ (sampler-destroy %gpu-device-sampler-destroy (backend:sampler-destroy module))
+ (make-shader-module %gpu-device-make-shader-module
(backend:make-shader-module vertex-source fragment-source))
- (shader-module-destroy %gpu-shader-module-destroy
+ (shader-module-destroy %gpu-device-shader-module-destroy
(backend:shader-module-destroy module))
- (make-render-pipeline %gpu-make-render-pipeline
+ (make-render-pipeline %gpu-device-make-render-pipeline
(backend:make-render-pipeline vertex fragment
primitive depth-stencil
multisample))
- (render-pipeline-destroy %gpu-render-pipeline-destroy
+ (render-pipeline-destroy %gpu-device-render-pipeline-destroy
(backend:render-pipeline-destroy pipeline)))
-(define (gpu-guard! gpu obj)
- ((gpu-guardian gpu) obj))
+(define (gpu-device-guard! gpu-device obj)
+ ((gpu-device-guardian gpu-device) obj))
-(define *gpu-backends* (make-hash-table))
+(define *gpu-device-backends* (make-hash-table))
-(define (gpu-backend-ref name)
- (hashq-ref *gpu-backends* name))
+(define (gpu-device-backend-ref name)
+ (hashq-ref *gpu-device-backends* name))
-(define (gpu-backend-set! name proc)
- (hashq-set! *gpu-backends* name proc))
+(define (gpu-device-backend-set! name proc)
+ (hashq-set! *gpu-device-backends* name proc))
-(define-syntax-rule (define-gpu-backend name
+(define-syntax-rule (define-gpu-device-backend name
internal-constructor
args ...)
- (gpu-backend-set! 'name
- (lambda (window context)
- (%make-gpu (internal-constructor window context)
- args ...))))
+ (gpu-device-backend-set! 'name
+ (lambda (window context)
+ (%make-gpu-device (internal-constructor window context)
+ args ...))))
-(define current-gpu (make-parameter #f))
-
-;; TODO: Respect the args according to WebGPU spec.
-;;
-;; TODO: Platform detection + open SDL window with proper GL, Vulkan,
-;; or Metal flag. Forcing OpenGL for now.
-(define* (make-gpu window context #:key
- power-preference
- (required-features '())
- (required-limits '()))
- ;; Include module at runtime to avoid circular reference.
- ;;
- ;; TODO: Programatically discover backend modules, load them, and
- ;; pick the "best" one.
- (module-use! (current-module)
- (resolve-interface
- '(chickadee graphics backend opengl)))
- ((gpu-backend-ref 'opengl) window context))
+(define current-gpu-device (make-parameter #f))
;;;
;;; Buffers
;;;
+;; (define-record-type* <buffer-descriptor>
+;; make-buffer-descriptor
+;; buffer-descriptor?
+;; (label buffer-descriptor-label "")
+;; (size buffer-descriptor-size #f)
+;; (mapped-at-creation? buffer-descriptor-mapped-at-creation? #f))
+
(define-record-type <buffer>
- (%make-buffer gpu handle length usage state map-state)
+ (%make-buffer device handle size usage state map-state)
buffer?
- (gpu buffer-gpu)
+ (device buffer-device)
(handle buffer-handle)
- (length buffer-length)
+ (size buffer-size)
(usage buffer-usage)
(state buffer-state set-buffer-state!)
(map-state buffer-map-state set-buffer-map-state!)
@@ -377,29 +441,37 @@
;; TODO: Validate length is > 0 and < max length.
;; TODO: Validate usage flags.
-(define* (make-buffer gpu length #:optional (usage '(vertex)))
- (let ((handle (backend:make-buffer gpu length usage)))
- (%make-buffer gpu handle length usage 'available 'unmapped)))
+(define* (make-buffer device length #:optional (usage '(vertex)))
+ (let ((handle (backend:make-buffer device length usage)))
+ (%make-buffer device handle length usage 'available 'unmapped)))
;; TODO: Ensure buffer is unmapped first.
(define (buffer-destroy! buffer)
(unless (buffer-destroyed? buffer)
- (backend:buffer-destroy (buffer-gpu buffer) (buffer-handle buffer))
+ (backend:buffer-destroy (buffer-device buffer)
+ (buffer-handle buffer))
(set-buffer-state! buffer 'destroyed)))
+(define (buffer-write! buffer at data start size)
+ (backend:buffer-write (buffer-device buffer)
+ (buffer-handle buffer)
+ 0 data 0 size))
+
(define (buffer-map! buffer mode offset size)
- (backend:buffer-map (buffer-gpu buffer) (buffer-handle buffer)
+ (backend:buffer-map (buffer-device buffer)
+ (buffer-handle buffer)
mode offset size))
(define (buffer-unmap! buffer)
(when (buffer-mapped? buffer)
- (backend:buffer-unmap (buffer-gpu buffer) (buffer-handle buffer))
+ (backend:buffer-unmap (buffer-device buffer)
+ (buffer-handle buffer))
(set-buffer-mapping! buffer #f)))
-(define* (bytevector->buffer gpu bv #:optional (usage '(vertex)))
- (let* ((length (bytevector-length bv))
- (buffer (make-buffer gpu length usage)))
- (backend:buffer-write gpu (buffer-handle buffer) 0 bv 0 (bytevector-length bv))
+(define* (bytevector->buffer gpu data #:optional (usage '(vertex)))
+ (let* ((size (bytevector-length data))
+ (buffer (make-buffer gpu size usage)))
+ (buffer-write! buffer 0 data 0 size)
buffer))
@@ -407,16 +479,23 @@
;;; Textures
;;;
+(define-record-type* <extent-3d>
+ make-extent-3d
+ extent-3d?
+ (width extent-3d-width #f)
+ (height extent-3d-height 1)
+ (depth extent-3d-depth 1))
+
(define-record-type <texture>
- (%make-texture gpu handle destroyed? width height layers mip-level-count
+ (%make-texture device handle destroyed? width height depth mip-level-count
sample-count dimension format usage view-formats)
texture?
- (gpu texture-gpu)
+ (device texture-device)
(handle texture-handle)
(destroyed? texture-destroyed? set-texture-destroyed!)
(width texture-width)
(height texture-height)
- (layers texture-layers)
+ (depth texture-depth)
(mip-level-count texture-mip-level-count)
(sample-count texture-sample-count)
(dimension texture-dimension)
@@ -426,43 +505,63 @@
(define (print-texture texture port)
(match texture
- (($ <texture> _ handle _ width height layers _ _ dimension format* usage)
- (format #t "#<texture handle: ~a width: ~a height: ~a layers: ~a dimension: ~a format: ~a usage: ~a>"
- handle width height layers dimension format* usage))))
+ (($ <texture> _ handle _ width height depth _ _ dimension format* usage)
+ (format #t "#<texture handle: ~a width: ~a height: ~a depth: ~a dimension: ~a format: ~a usage: ~a>"
+ handle width height depth dimension format* usage))))
(set-record-type-printer! <texture> print-texture)
-(define* (make-texture gpu #:key
- (width 1)
- (height 1)
- (layers 0)
+(define* (make-texture device #:key
+ (size (make-extent-3d #:width 1))
(mip-level-count 1)
(sample-count 1)
(dimension '2d)
format usage
(view-formats '()))
- (let ((handle (backend:make-texture gpu width height layers mip-level-count
- sample-count dimension format usage
- view-formats)))
- (%make-texture gpu handle #f width height layers mip-level-count
- sample-count dimension format usage view-formats)))
+ (match size
+ (($ <extent-3d> width height depth)
+ (let ((handle (backend:make-texture device width height depth mip-level-count
+ sample-count dimension format usage
+ view-formats)))
+ (%make-texture device handle #f width height depth mip-level-count
+ sample-count dimension format usage view-formats)))))
(define (texture-destroy! texture)
(unless (texture-destroyed? texture)
- (backend:texture-destroy (texture-gpu texture) (texture-handle texture))
+ (backend:texture-destroy (texture-device texture)
+ (texture-handle texture))
(set-texture-destroyed! texture #t)))
+(define-record-type* <image-data-layout>
+ make-image-data-layout
+ image-data-layout?
+ (offset image-data-layout-offset 0)
+ (bytes-per-row image-data-layout-bytes-per-row #f)
+ (rows-per-image image-data-layout-rows-per-image #f))
+
+(define-record-type* <image-copy-texture>
+ make-image-copy-texture
+ image-copy-texture?
+ (texture image-copy-texture-texture #f)
+ (mip-level image-copy-texture-mip-level 0)
+ (origin image-copy-texture-origin (vec3 0.0 0.0 0.0))
+ ;; all, depth-only, or stencil-only
+ (aspect image-copy-texture-aspect 'all))
+
+(define (texture-write! destination data data-layout size)
+ #t)
+
(define-record-type <texture-view>
- (%make-texture-view gpu handle destroyed? texture format dimension aspect
+ (%make-texture-view device handle destroyed? texture format dimension aspect
base-mip-level mip-level-count base-layer layer-count)
texture-view?
- (gpu texture-view-gpu)
+ (device texture-view-device)
(handle texture-view-handle)
(destroyed? texture-view-destroyed? set-texture-view-destroyed!)
(texture texture-view-texture)
(format texture-view-format)
- (dimension texture-view-dimension) ; 2d or 3d
- (aspect texture-view-aspect) ; all, stencil-only, depth-only
+ (dimension texture-view-dimension) ; 2d or 3d
+ (aspect texture-view-aspect) ; all, stencil-only, depth-only
(base-mip-level texture-view-base-mip-level)
(mip-level-count texture-view-mip-level-count)
(base-layer texture-view-base-layer)
@@ -476,7 +575,7 @@
(set-record-type-printer! <texture-view> print-texture-view)
-(define* (make-texture-view gpu texture #:key
+(define* (make-texture-view device texture #:key
format
(dimension '2d)
(aspect 'all)
@@ -484,25 +583,25 @@
(mip-level-count 0)
(base-layer 0)
(layer-count 0))
- (let ((handle (backend:make-texture-view gpu texture format dimension aspect
+ (let ((handle (backend:make-texture-view device texture format dimension aspect
base-mip-level mip-level-count
base-layer layer-count)))
- (%make-texture-view gpu handle #f texture format dimension aspect
+ (%make-texture-view device handle #f texture format dimension aspect
base-mip-level mip-level-count base-layer layer-count)))
(define (texture-view-destroy! view)
(unless (texture-view-destroyed? view)
- (backend:texture-view-destroy (texture-view-gpu view)
+ (backend:texture-view-destroy (texture-view-device view)
(texture-view-handle view))
(set-texture-view-destroyed! view #t)))
;; TODO: lod, compare, anisotropy.
(define-record-type <sampler>
- (%make-sampler gpu handle destroyed?
+ (%make-sampler device handle destroyed?
address-mode-u address-mode-v address-mode-w
mag-filter min-filter mipmap-filter)
sampler?
- (gpu sampler-gpu)
+ (device sampler-device)
(handle sampler-handle)
(destroyed? sampler-destroyed? set-sampler-destroyed!)
;; clamp-to-edge, repeat, or mirror-repeat
@@ -522,34 +621,132 @@
(set-record-type-printer! <sampler> print-sampler)
-(define* (make-sampler gpu #:key
+(define* (make-sampler device #:key
(address-mode-u 'clamp-to-edge)
(address-mode-v 'clamp-to-edge)
(address-mode-w 'clamp-to-edge)
(mag-filter 'nearest)
(min-filter 'nearest)
(mipmap-filter 'nearest))
- (let ((handle (backend:make-sampler gpu address-mode-u address-mode-v
+ (let ((handle (backend:make-sampler device address-mode-u address-mode-v
address-mode-w mag-filter min-filter
mipmap-filter)))
- (%make-sampler gpu handle #f address-mode-u address-mode-v
+ (%make-sampler device handle #f address-mode-u address-mode-v
address-mode-w mag-filter min-filter
mipmap-filter)))
(define (sampler-destroy! sampler)
(unless (sampler-destroyed? sampler)
- (backend:sampler-destroy (sampler-gpu sampler) (sampler-handle sampler))
+ (backend:sampler-destroy (sampler-device sampler)
+ (sampler-handle sampler))
(set-sampler-destroyed! sampler #t)))
;;;
+;;; Bind groups
+;;;
+
+(define-record-type* <buffer-binding-layout>
+ make-buffer-binding-layout
+ buffer-binding-layout?
+ ;; uniform, storage, or read-only-storage
+ (type buffer-binding-layout-type 'uniform)
+ (dynamic-offset? buffer-binding-layout-dynamic-offset? #f)
+ (min-binding-size buffer-binding-layout-min-binding-size 0))
+
+(define-record-type* <texture-binding-layout>
+ make-texture-binding-layout
+ texture-binding-layout?
+ ;; float, unfilterable-float, depth, sint, or uint
+ (sample-type texture-binding-layout-sample-type 'float)
+ ;; 2d or 3d
+ (view-dimension texture-binding-layout-view-dimension '2d)
+ (multisampled? texture-binding-layout-multisampled? #f))
+
+(define-record-type* <storage-texture-binding-layout>
+ make-storage-texture-binding-layout
+ storage-texture-binding-layout?
+ ;; write-only, read-only, or read-write
+ (access storage-texture-binding-layout-access 'write-only)
+ (format storage-texture-binding-layout-format #f)
+ ;; 2d or 3d
+ (view-dimension storage-texture-binding-layout-view-dimension '2d))
+
+(define-record-type* <external-texture-binding-layout>
+ make-external-texture-binding-layout
+ external-texture-binding-layout?)
+
+(define-record-type* <bind-group-layout-entry>
+ make-bind-group-layout-entry
+ bind-group-layout-entry?
+ (binding bind-group-layout-entry-binding (error "binding required"))
+ ;; A list of flags: vertex, fragment, compute
+ (visibility bind-group-layout-entry-visibility (error "visibility required"))
+ ;; Not following the spec here which has separate object keys for
+ ;; buffer, sampler, texture, storage texture, and external texture.
+ (layout bind-group-layout-entry-layout #f))
+
+(define-record-type <bind-group-layout>
+ (%make-bind-group-layout entries entry-map dynamic-offset-count exclusive-pipeline)
+ bind-group-layout?
+ (entries bind-group-layout-entries)
+ (entry-map bind-group-layout-entry-map)
+ (dynamic-offset-count bind-group-layout-dynamic-offset-count)
+ (exclusive-pipeline bind-group-layout-exclusive-pipeline))
+
+(define (make-bind-group-layout device entries)
+ (let ((entry-map
+ (map (match-lambda
+ ((and layout ($ <bind-group-layout-entry> binding))
+ (cons binding layout)))
+ entries))
+ (dynamic-offset-count
+ (fold (lambda (entry sum)
+ (match entry
+ (($ <bind-group-layout-entry> _ _
+ ($ <buffer-binding-layout> _ #t))
+ (+ sum 1))
+ (_ sum)))
+ 0
+ entries)))
+ (%make-bind-group-layout entries entry-map dynamic-offset-count #f)))
+
+(define-record-type* <bind-group-entry>
+ make-bind-group-entry
+ bind-group-entry?
+ (binding bind-group-entry-binding #f)
+ (resource bind-group-entry-resource #f))
+
+(define-record-type <bind-group>
+ (%make-bind-group device layout entries used-resources)
+ bind-group?
+ (device bind-group-device)
+ (layout bind-group-layout)
+ (entries bind-group-entries)
+ (used-resources bind-group-used-resources))
+
+(define* (make-bind-group device #:key layout (entries '()))
+ ;; TODO: compute used resources.
+ (%make-bind-group device layout entries #f))
+
+(define-record-type <pipeline-layout>
+ (%make-pipeline-layout device bind-group-layouts)
+ pipeline-layout?
+ (device pipeline-layout-device)
+ (bind-group-layouts pipeline-layout-bind-group-layouts))
+
+(define (make-pipeline-layout device bind-group-layouts)
+ (%make-pipeline-layout device bind-group-layouts))
+
+
+;;;
;;; Shader modules
;;;
(define-record-type <shader-module>
- (%make-shader-module gpu handle state)
+ (%make-shader-module device handle state)
shader-module?
- (gpu shader-module-gpu)
+ (device shader-module-device)
(handle shader-module-handle)
(state shader-module-state set-shader-module-state!))
@@ -572,7 +769,7 @@
(define (shader-module-destroy! module)
(unless (shader-module-destroyed? module)
- (backend:shader-module-destroy (shader-module-gpu module)
+ (backend:shader-module-destroy (shader-module-device module)
(shader-module-handle module))
(set-shader-module-state! module 'destroyed)))
@@ -714,56 +911,6 @@
(depth-stencil-attachment render-pass-descriptor-depth-stencil-attachment #f)
(max-draw-count render-pass-descriptor-max-draw-count 50000000))
-;; (define-record-type <buffer-binding-layout>
-;; (make-buffer-binding-layout type)
-;; buffer-binding-layout?
-;; ;; uniform, storage, or read-only-storage
-;; (type buffer-binding-layout-type))
-
-;; (define-record-type <sampler-binding-layout>
-;; (make-sampler-binding-layout type)
-;; ;; filtering or non-filtering
-;; (type sampler-binding-layout-type))
-
-;; (define-record-type <texture-binding-layout>
-;; (make-texture-binding-layout type dimension multisample?)
-;; texture-binding-layout?
-;; ;; float, unfilterable-float, depth, sint, uint
-;; (type texture-binding-layout-type)
-;; (dimension texture-binding-layout-dimension) ; 2d or 3d
-;; (multisample? texture-binding-layout-multisample?))
-
-;; (define-record-type <binding-layout>
-;; (make-binding-layout index stages kind)
-;; binding-layout?
-;; (index binding-layout-index) ; integer
-;; (stages binding-layout-stages) ; vertex, fragment, or compute
-;; (kind binding-layout-kind))
-
-;; (define-record-type <bind-group-entry>
-;; (make-bind-group-entry index resource)
-;; bind-group-entry?
-;; (index bind-group-entry-index)
-;; (resource bind-group-entry-resource))
-
-;; (define-record-type <bind-group>
-;; (make-bind-group layout bindings)
-;; bind-group?
-;; (layout bind-group-layout)
-;; (bindings bind-group-bindings))
-
-;; ;; A single GPU command. These objects are re-used over and over to
-;; ;; reduce allocation during rendering. Not directly exposed to users.
-;; (define-record-type <command>
-;; (make-render-command op arg1 arg2 arg3 arg4 arg5)
-;; render-command?
-;; (op render-command-op)
-;; (arg1 render-command-arg1)
-;; (arg2 render-command-arg2)
-;; (arg3 render-command-arg3)
-;; (arg4 render-command-arg4)
-;; (arg5 render-command-arg5))
-
;;;
;;; Commands
@@ -854,18 +1001,18 @@
first-vertex first-instance)))
(command-encoder-add! (render-pass-encoder-command-encoder pass) cmd)))
-(define (gpu-submit gpu command-buffer)
- (with-mutex (gpu-mutex gpu)
- (backend:enqueue gpu command-buffer)))
+(define (gpu-device-submit device command-buffer)
+ (with-mutex (gpu-device-mutex device)
+ (backend:enqueue device command-buffer)))
;;;
;;; Garbage collection
;;;
-(define (gpu-gc gpu)
- (with-mutex (gpu-mutex gpu)
- (let ((guardian (gpu-guardian gpu)))
+(define (gpu-device-gc device)
+ (with-mutex (gpu-device-mutex device)
+ (let ((guardian (gpu-device-guardian device)))
(let loop ()
(let ((obj (guardian)))
(when obj
@@ -874,3 +1021,71 @@
((? texture? texture) (texture-destroy! texture))
((? shader-module? module) (shader-module-destroy! module)))
(loop)))))))
+
+
+;;;
+;;; Adapter
+;;;
+
+(define (gpu-adapter-supported-features adapter)
+ (error "unimplemented"))
+
+(define (gpu-adapter-supported-limits adapter)
+ (error "unimplemented"))
+
+(define (gpu-adapter-fallback? adapter)
+ (error "unimplemented"))
+
+;; requestAdapterInfo
+(define (gpu-adapter-info adapter)
+ (error "unimplemented"))
+
+;; Feature names:
+;; depth-clip-control
+;; depth32float-stencil8
+;; texture-compression-bc
+;; texture-compression-etc2
+;; texture-compression-astc
+;; timestamp-query
+;; indirect-first-instance
+;; shader-f16
+;; rg11b10ufloat-renderable
+;; bgra8unorm-storage
+;; float32-filterable
+(define* (gpu-adapter-request-device adapter window context #:key
+ (required-features '())
+ (required-limits '())
+ default-queue)
+ ;; Include module at runtime to avoid circular reference.
+ ;;
+ ;; TODO: Programatically discover backend modules, load them, and
+ ;; pick the "best" one.
+ (module-use! (current-module)
+ (resolve-interface
+ '(chickadee graphics backend opengl)))
+ ((gpu-device-backend-ref 'opengl) window context))
+
+
+;;;
+;;; GPU
+;;;
+
+(define-record-type <gpu-adapter>
+ (%make-gpu-adapter power-preference force-fallback?)
+ gpu-adapter?
+ (power-preference gpu-adapter-power-preference)
+ (force-fallback? gpu-adapter-force-fallback?))
+
+;; navigator.gpu.requestAdapter
+;;
+;; Power preference can either be low-power or high-performance
+(define* (make-gpu-adapter #:key power-preference force-fallback?)
+ (%make-gpu-adapter power-preference force-fallback?))
+
+(define (gpu-preferred-canvas-format)
+ (error "unimplemented"))
+
+;; Avoiding the official name with "wgsl" in it because Chickadee has
+;; its own shader language and does not expose WGSL at all.
+(define (gpu-shader-language-features)
+ (error "unimplemented"))