Commit | Line | Data |
---|---|---|
37a0c0f3 DH |
1 | ;;; figl |
2 | ;;; Copyright (C) 2013 Daniel Hartwig <mandyke@gmail.com> | |
3 | ;;; | |
4 | ;;; Figl is free software: you can redistribute it and/or modify it | |
5 | ;;; under the terms of the GNU Lesser General Public License as | |
6 | ;;; published by the Free Software Foundation, either version 3 of the | |
7 | ;;; License, or (at your option) any later version. | |
8 | ;;; | |
9 | ;;; Figl is distributed in the hope that it will be useful, but WITHOUT | |
10 | ;;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
11 | ;;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General | |
12 | ;;; Public License for more details. | |
13 | ;;; | |
14 | ;;; You should have received a copy of the GNU Lesser General Public | |
15 | ;;; License along with this program. If not, see | |
16 | ;;; <http://www.gnu.org/licenses/>. | |
17 | ||
18 | ;;; Commentary: | |
19 | ;; | |
20 | ;; Mappings from OpenGL to FFI types. | |
21 | ;; | |
22 | ;;; Code: | |
23 | ||
7ec693ed | 24 | (define-module (figl gl types) |
93f72ad8 | 25 | #:use-module (figl runtime) |
e40b2a3d | 26 | #:use-module (rnrs bytevectors) |
93f72ad8 AW |
27 | #:use-module ((system foreign) #:renamer (symbol-prefix-proc 'ffi:)) |
28 | #:export (void | |
29 | GLboolean | |
37a0c0f3 DH |
30 | GLbyte |
31 | GLubyte | |
32 | GLchar | |
33 | GLshort | |
34 | GLushort | |
35 | GLint | |
36 | GLuint | |
37 | GLsizei | |
38 | GLenum | |
39 | GLintptr | |
40 | GLsizeiptr | |
41 | GLbitfield | |
42 | GLfloat | |
43 | GLclampf | |
44 | GLdouble | |
00239761 AW |
45 | GLclampd |
46 | ||
47 | GLboolean-* | |
78aa45b9 DH |
48 | GLbyte-* |
49 | GLubyte-* | |
00239761 | 50 | GLchar-* |
78aa45b9 DH |
51 | GLshort-* |
52 | GLushort-* | |
00239761 | 53 | GLint-* |
00239761 | 54 | GLuint-* |
78aa45b9 DH |
55 | GLsizei-* |
56 | GLenum-* | |
57 | GLfloat-* | |
58 | GLclampf-* | |
59 | GLdouble-* | |
60 | GLclampd-* | |
00239761 | 61 | GLvoid-* |
b002944d | 62 | GLvoid-** |
78aa45b9 DH |
63 | |
64 | const-GLboolean-* | |
65 | const-GLbyte-* | |
66 | const-GLubyte-* | |
f681b980 | 67 | const-GLubyte* |
00239761 AW |
68 | const-GLchar-* |
69 | const-GLchar-** | |
78aa45b9 DH |
70 | const-GLshort-* |
71 | const-GLushort-* | |
00239761 | 72 | const-GLint-* |
00239761 | 73 | const-GLuint-* |
78aa45b9 DH |
74 | const-GLsizei-* |
75 | const-GLenum-* | |
76 | const-GLfloat-* | |
77 | const-GLclampf-* | |
78 | const-GLdouble-* | |
79 | const-GLclampd-* | |
00239761 AW |
80 | const-GLvoid-* |
81 | const-GLvoid-** | |
82 | void-*)) | |
37a0c0f3 DH |
83 | |
84 | (define %ptr | |
93f72ad8 AW |
85 | (case (ffi:sizeof '*) |
86 | ((4) ffi:uint32) | |
87 | ((8) ffi:uint64) | |
37a0c0f3 DH |
88 | (else (error "unknown pointer size")))) |
89 | ||
93f72ad8 AW |
90 | (define-simple-foreign-type void ffi:void) |
91 | (define-simple-foreign-type GLboolean ffi:uint8) | |
92 | (define-simple-foreign-type GLbyte ffi:int8) | |
93 | (define-simple-foreign-type GLubyte ffi:uint8) | |
94 | (define-simple-foreign-type GLchar ffi:int8) | |
78aa45b9 | 95 | (define-simple-foreign-type GLshort ffi:int16) |
93f72ad8 AW |
96 | (define-simple-foreign-type GLushort ffi:uint16) |
97 | (define-simple-foreign-type GLint ffi:int32) | |
98 | (define-simple-foreign-type GLuint ffi:uint32) | |
99 | (define-simple-foreign-type GLsizei ffi:int32) | |
100 | (define-simple-foreign-type GLenum ffi:uint32) | |
101 | (define-simple-foreign-type GLintptr %ptr) | |
102 | (define-simple-foreign-type GLsizeiptr %ptr) | |
103 | (define-simple-foreign-type GLbitfield ffi:uint32) | |
104 | (define-simple-foreign-type GLfloat ffi:float) | |
105 | (define-simple-foreign-type GLclampf ffi:float) | |
106 | (define-simple-foreign-type GLdouble ffi:double) | |
107 | (define-simple-foreign-type GLclampd ffi:double) | |
93f72ad8 | 108 | (define-simple-foreign-type GLvoid-* '*) |
e40b2a3d | 109 | (define-simple-foreign-type void-* '*) |
93f72ad8 | 110 | (define-simple-foreign-type const-GLvoid-* '*) |
e40b2a3d | 111 | |
f6fb0de5 DH |
112 | (define (coerce-array-pointer x) |
113 | (cond | |
114 | ((ffi:pointer? x) | |
115 | x) | |
116 | ((bytevector? x) | |
117 | (ffi:bytevector->pointer x)) | |
118 | ;; TODO: (typed-array? x element-type) | |
119 | ((not x) | |
120 | ffi:%null-pointer) | |
121 | (else | |
122 | (error "unhandled array-pointer type" x)))) | |
c9820ad6 | 123 | |
e40b2a3d AW |
124 | (define-syntax define-array-foreign-type |
125 | (syntax-rules () | |
126 | ((_ name element-type) | |
127 | (define-foreign-type name '* | |
f6fb0de5 | 128 | coerce-array-pointer |
e40b2a3d AW |
129 | (lambda (x) x))))) |
130 | ||
131 | (define-array-foreign-type GLboolean-* GLboolean) | |
78aa45b9 DH |
132 | (define-array-foreign-type GLbyte-* GLbyte) |
133 | (define-array-foreign-type GLubyte-* GLubyte) | |
e40b2a3d | 134 | (define-array-foreign-type GLchar-* GLchar) |
78aa45b9 DH |
135 | (define-array-foreign-type GLshort-* GLshort) |
136 | (define-array-foreign-type GLushort-* GLushort) | |
e40b2a3d | 137 | (define-array-foreign-type GLint-* GLint) |
e40b2a3d | 138 | (define-array-foreign-type GLuint-* GLuint) |
78aa45b9 DH |
139 | (define-array-foreign-type GLsizei-* GLsizei) |
140 | (define-array-foreign-type GLenum-* GLenum) | |
141 | (define-array-foreign-type GLfloat-* GLfloat) | |
142 | (define-array-foreign-type GLclampf-* GLclampf) | |
143 | (define-array-foreign-type GLdouble-* GLdouble) | |
144 | (define-array-foreign-type GLclampd-* GLclampd) | |
e40b2a3d | 145 | |
78aa45b9 DH |
146 | (define-array-foreign-type const-GLboolean-* GLboolean) |
147 | (define-array-foreign-type const-GLbyte-* GLbyte) | |
e40b2a3d | 148 | (define-array-foreign-type const-GLubyte-* GLubyte) |
78aa45b9 DH |
149 | (define-array-foreign-type const-GLshort-* GLshort) |
150 | (define-array-foreign-type const-GLushort-* GLushort) | |
151 | (define-array-foreign-type const-GLint-* GLint) | |
e40b2a3d | 152 | (define-array-foreign-type const-GLuint-* GLuint) |
78aa45b9 DH |
153 | (define-array-foreign-type const-GLsizei-* GLsizei) |
154 | (define-array-foreign-type const-GLenum-* GLenum) | |
155 | (define-array-foreign-type const-GLfloat-* GLfloat) | |
156 | (define-array-foreign-type const-GLclampf-* GLclampf) | |
157 | (define-array-foreign-type const-GLdouble-* GLdouble) | |
158 | (define-array-foreign-type const-GLclampd-* GLclampd) | |
e40b2a3d AW |
159 | (define-array-foreign-type const-GLvoid-* GLvoid) |
160 | ||
161 | (define-foreign-type const-GLchar-* '* | |
162 | ffi:string->pointer | |
163 | ffi:pointer->string) | |
164 | ||
165 | ;; Functions with these types will need special help. | |
b002944d | 166 | (define-simple-foreign-type GLvoid-** '*) |
e40b2a3d | 167 | (define-simple-foreign-type const-GLchar-** '*) |
93f72ad8 | 168 | (define-simple-foreign-type const-GLvoid-** '*) |
f681b980 DH |
169 | |
170 | ;; TODO: Hacked for a typo in glGetString.xml. | |
171 | (define-array-foreign-type const-GLubyte* GLubyte) |