]> gitweb.factorcode.org Git - factor.git/blob - extra/gpu/buffers/buffers.factor
set transform feedback format at program link
[factor.git] / extra / gpu / buffers / buffers.factor
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 ui.gadgets.worlds variants ;
5 IN: gpu.buffers
6
7 VARIANT: buffer-upload-pattern
8     stream-upload static-upload dynamic-upload ;
9
10 VARIANT: buffer-usage-pattern
11     draw-usage read-usage copy-usage ;
12
13 VARIANT: buffer-access-mode
14     read-access write-access read-write-access ;
15
16 VARIANT: buffer-kind
17     vertex-buffer index-buffer
18     pixel-unpack-buffer pixel-pack-buffer ;
19
20 TUPLE: buffer < gpu-object 
21     { upload-pattern buffer-upload-pattern }
22     { usage-pattern buffer-usage-pattern }
23     { kind buffer-kind } ;
24
25 <PRIVATE
26
27 : gl-buffer-usage ( buffer -- usage )
28     [ upload-pattern>> ] [ usage-pattern>> ] bi 2array {
29         { { stream-upload draw-usage } [ GL_STREAM_DRAW ] }
30         { { stream-upload read-usage } [ GL_STREAM_READ ] }
31         { { stream-upload copy-usage } [ GL_STREAM_COPY ] }
32
33         { { static-upload draw-usage } [ GL_STATIC_DRAW ] }
34         { { static-upload read-usage } [ GL_STATIC_READ ] }
35         { { static-upload copy-usage } [ GL_STATIC_COPY ] }
36
37         { { dynamic-upload draw-usage } [ GL_DYNAMIC_DRAW ] }
38         { { dynamic-upload read-usage } [ GL_DYNAMIC_READ ] }
39         { { dynamic-upload copy-usage } [ GL_DYNAMIC_COPY ] }
40     } case ; inline
41
42 : gl-access ( access -- gl-access )
43     {
44         { read-access [ GL_READ_ONLY ] }
45         { write-access [ GL_WRITE_ONLY ] }
46         { read-write-access [ GL_READ_WRITE ] }
47     } case ; inline
48
49 : gl-target ( kind -- target )
50     {
51         { vertex-buffer [ GL_ARRAY_BUFFER ] }
52         { index-buffer [ GL_ELEMENT_ARRAY_BUFFER ] }
53         { pixel-unpack-buffer [ GL_PIXEL_UNPACK_BUFFER ] }
54         { pixel-pack-buffer [ GL_PIXEL_PACK_BUFFER ] }
55     } case ; inline
56
57 : get-buffer-int ( target enum -- value )
58     0 <int> [ glGetBufferParameteriv ] keep *int ;
59
60 : bind-buffer ( buffer -- target )
61     [ kind>> gl-target dup ] [ handle>> glBindBuffer ] bi ;
62
63 PRIVATE>
64
65 M: buffer dispose
66     [ [ delete-gl-buffer ] when* f ] change-handle drop ;
67
68 TUPLE: buffer-ptr 
69     { buffer buffer read-only }
70     { offset integer read-only } ;
71 C: <buffer-ptr> buffer-ptr
72
73 TUPLE: buffer-range < buffer-ptr
74     { size integer read-only } ;
75 C: <buffer-range> buffer-range
76
77 UNION: gpu-data-ptr buffer-ptr c-ptr ;
78
79 : buffer-size ( buffer -- size )
80     bind-buffer GL_BUFFER_SIZE get-buffer-int ;
81
82 : buffer-ptr>range ( buffer-ptr -- buffer-range )
83     [ buffer>> ] [ offset>> ] bi
84     2dup [ buffer-size ] dip -
85     buffer-range boa ;
86
87 :: allocate-buffer ( buffer size initial-data -- )
88     buffer bind-buffer :> target
89     target size initial-data buffer gl-buffer-usage glBufferData ;
90
91 : <buffer> ( upload usage kind size initial-data -- buffer )
92     [ [ gen-gl-buffer ] 3dip buffer boa dup ] 2dip allocate-buffer
93     window-resource ;
94
95 : byte-array>buffer ( byte-array upload usage kind -- buffer )
96     [ ] 3curry dip
97     [ byte-length ] [ ] bi <buffer> ;
98
99 :: update-buffer ( buffer-ptr size data -- )
100     buffer-ptr buffer>> :> buffer
101     buffer bind-buffer :> target
102     target buffer-ptr offset>> size data glBufferSubData ;
103
104 :: read-buffer ( buffer-ptr size -- data )
105     buffer-ptr buffer>> :> buffer
106     buffer bind-buffer :> target
107     size <byte-array> :> data
108     target buffer-ptr offset>> size data glGetBufferSubData
109     data ;
110
111 :: copy-buffer ( to-buffer-ptr from-buffer-ptr size -- )
112     GL_COPY_WRITE_BUFFER to-buffer-ptr buffer>> glBindBuffer
113     GL_COPY_READ_BUFFER from-buffer-ptr buffer>> glBindBuffer
114
115     GL_COPY_READ_BUFFER GL_COPY_WRITE_BUFFER
116     from-buffer-ptr offset>> to-buffer-ptr offset>>
117     size glCopyBufferSubData ;
118
119 :: with-mapped-buffer ( buffer access quot: ( alien -- ) -- )
120     buffer bind-buffer :> target
121     target access gl-access glMapBuffer
122
123     quot call
124
125     target glUnmapBuffer ; inline
126
127 :: with-bound-buffer ( buffer target quot: ( -- ) -- )
128     target gl-target buffer glBindBuffer
129     quot call ; inline
130
131 : with-buffer-ptr ( buffer-ptr target quot: ( c-ptr -- ) -- )
132     [ [ offset>> <alien> ] [ buffer>> handle>> ] bi ] 2dip
133     with-bound-buffer ; inline
134
135 : with-gpu-data-ptr ( gpu-data-ptr target quot: ( c-ptr -- ) -- )
136     pick buffer-ptr?
137     [ with-buffer-ptr ]
138     [ [ gl-target 0 glBindBuffer ] dip call ] if ; inline
139