1 ! (c)2009 Joe Groff bsd license
2 USING: accessors alien alien.c-types arrays byte-arrays
3 combinators destructors gpu kernel locals math opengl opengl.gl
4 typed ui.gadgets.worlds variants ;
7 VARIANT: buffer-upload-pattern
8 stream-upload static-upload dynamic-upload ;
10 VARIANT: buffer-usage-pattern
11 draw-usage read-usage copy-usage ;
13 VARIANT: buffer-access-mode
14 read-access write-access read-write-access ;
17 vertex-buffer index-buffer
18 pixel-unpack-buffer pixel-pack-buffer
19 transform-feedback-buffer ;
21 TUPLE: buffer < gpu-object
22 { upload-pattern buffer-upload-pattern }
23 { usage-pattern buffer-usage-pattern }
24 { kind buffer-kind } ;
28 : gl-buffer-usage ( buffer -- usage )
29 [ upload-pattern>> ] [ usage-pattern>> ] bi 2array {
30 { { stream-upload draw-usage } [ GL_STREAM_DRAW ] }
31 { { stream-upload read-usage } [ GL_STREAM_READ ] }
32 { { stream-upload copy-usage } [ GL_STREAM_COPY ] }
34 { { static-upload draw-usage } [ GL_STATIC_DRAW ] }
35 { { static-upload read-usage } [ GL_STATIC_READ ] }
36 { { static-upload copy-usage } [ GL_STATIC_COPY ] }
38 { { dynamic-upload draw-usage } [ GL_DYNAMIC_DRAW ] }
39 { { dynamic-upload read-usage } [ GL_DYNAMIC_READ ] }
40 { { dynamic-upload copy-usage } [ GL_DYNAMIC_COPY ] }
43 : gl-access ( access -- gl-access )
45 { read-access [ GL_READ_ONLY ] }
46 { write-access [ GL_WRITE_ONLY ] }
47 { read-write-access [ GL_READ_WRITE ] }
50 : gl-target ( kind -- target )
52 { vertex-buffer [ GL_ARRAY_BUFFER ] }
53 { index-buffer [ GL_ELEMENT_ARRAY_BUFFER ] }
54 { pixel-unpack-buffer [ GL_PIXEL_UNPACK_BUFFER ] }
55 { pixel-pack-buffer [ GL_PIXEL_PACK_BUFFER ] }
56 { transform-feedback-buffer [ GL_TRANSFORM_FEEDBACK_BUFFER ] }
59 : get-buffer-int ( target enum -- value )
60 0 <int> [ glGetBufferParameteriv ] keep *int ; inline
62 : bind-buffer ( buffer -- target )
63 [ kind>> gl-target dup ] [ handle>> glBindBuffer ] bi ; inline
68 [ [ delete-gl-buffer ] when* f ] change-handle drop ;
71 { buffer buffer read-only }
72 { offset integer read-only } ;
73 C: <buffer-ptr> buffer-ptr
75 TUPLE: buffer-range < buffer-ptr
76 { size integer read-only } ;
77 C: <buffer-range> buffer-range
79 UNION: gpu-data-ptr buffer-ptr c-ptr ;
81 TYPED: buffer-size ( buffer: buffer -- size: integer )
82 bind-buffer GL_BUFFER_SIZE get-buffer-int ;
84 : buffer-ptr>range ( buffer-ptr -- buffer-range )
85 [ buffer>> ] [ offset>> ] bi
86 2dup [ buffer-size ] dip -
87 buffer-range boa ; inline
89 TYPED:: allocate-buffer ( buffer: buffer size: integer initial-data -- )
90 buffer bind-buffer :> target
91 target size initial-data buffer gl-buffer-usage glBufferData ;
93 TYPED: <buffer> ( upload: buffer-upload-pattern
94 usage: buffer-usage-pattern
100 [ [ gen-gl-buffer ] 3dip buffer boa dup ] 2dip allocate-buffer
103 TYPED: byte-array>buffer ( byte-array
104 upload: buffer-upload-pattern
105 usage: buffer-usage-pattern
110 [ byte-length ] [ ] bi <buffer> ;
112 TYPED:: update-buffer ( buffer-ptr: buffer-ptr size: integer data -- )
113 buffer-ptr buffer>> :> buffer
114 buffer bind-buffer :> target
115 target buffer-ptr offset>> size data glBufferSubData ;
117 TYPED:: read-buffer ( buffer-ptr: buffer-ptr size: integer -- data: byte-array )
118 buffer-ptr buffer>> :> buffer
119 buffer bind-buffer :> target
120 size <byte-array> :> data
121 target buffer-ptr offset>> size data glGetBufferSubData
124 TYPED:: copy-buffer ( to-buffer-ptr: buffer-ptr from-buffer-ptr: buffer-ptr size: integer -- )
125 GL_COPY_WRITE_BUFFER to-buffer-ptr buffer>> glBindBuffer
126 GL_COPY_READ_BUFFER from-buffer-ptr buffer>> glBindBuffer
128 GL_COPY_READ_BUFFER GL_COPY_WRITE_BUFFER
129 from-buffer-ptr offset>> to-buffer-ptr offset>>
130 size glCopyBufferSubData ;
132 :: with-mapped-buffer ( buffer access quot: ( alien -- ) -- )
133 buffer bind-buffer :> target
134 target access gl-access glMapBuffer
138 target glUnmapBuffer drop ; inline
140 :: with-bound-buffer ( buffer target quot: ( -- ) -- )
141 target gl-target buffer glBindBuffer
144 : with-buffer-ptr ( buffer-ptr target quot: ( c-ptr -- ) -- )
145 [ [ offset>> <alien> ] [ buffer>> handle>> ] bi ] 2dip
146 with-bound-buffer ; inline
148 : with-gpu-data-ptr ( gpu-data-ptr target quot: ( c-ptr -- ) -- )
151 [ [ gl-target 0 glBindBuffer ] dip call ] if ; inline