@@ -66,15 +66,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
6666
6767(define glCore: needsinit #t)
6868(define (glCoreInit)
69- (if (and glCore: customhook app: width app: height) (begin
69+ (if (and glCore: customhook app: width app: height) (begin
7070 (glDisable GL_BLEND)
71- (glCore: customhook)
71+ (glCore: customhook)
7272 (glDisable GL_CULL_FACE)
7373 (glDisable GL_DEPTH_TEST)
7474 (set! glCore: needsinit #t)))
7575 (if glCore: needsinit (begin
7676 (if (and app: width app: height) (begin
77- (glcore: log 5 "glCoreInit")
77+ (glcore: log 5 "glCoreInit")
7878 ;; suspend/resume might invalidate the textures
7979 (glCoreTextureReset)
8080 (glClearColor 0. 0. 0. 0.)
@@ -124,9 +124,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
124124 (set! glCore: alpha (color-alpha c)))
125125
126126(define (glCoreBegin type)
127- (set! glCore: cindex 0)
128- (set! glCore: vindex 0)
129- (set! glCore: tindex 0)
127+ (set! glCore: cindex 0)
128+ (set! glCore: vindex 0)
129+ (set! glCore: tindex 0)
130130 (set! glCore: type type)
131131 )
132132
@@ -135,10 +135,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
135135 (glVertexPointer (if glCore: use3D 3 2) GL_FLOAT 0 (if glCore: use3D glCore: varray3D glCore: varray))
136136 (glColorPointer 4 GL_UNSIGNED_BYTE 0 glCore: carray)
137137 (if (or (fx= glCore: type GL_LINES) (fx= glCore: type GL_LINE_LOOP) (fx= glCore: type GL_LINE_STRIP))
138- (begin
138+ (begin
139139 (glDisable GL_TEXTURE_2D)
140140 (glDisableClientState GL_TEXTURE_COORD_ARRAY)
141- )
141+ )
142142 (begin
143143 (glEnable GL_TEXTURE_2D)
144144 (glEnableClientState GL_TEXTURE_COORD_ARRAY)
@@ -198,7 +198,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
198198 )))
199199
200200;; ----------------------------------
201- ;; textures
201+ ;; textures
202202
203203(cond-expand ;; CONSTRUCTION-CASE
204204 ((or debug) ;; tentative changes
@@ -207,12 +207,47 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
207207 ;; ; 2. (short term) replace vector with distinct type
208208
209209 (define %%glCore: textures-ref)
210+ (define glCoreTextureCreate)
211+ (define glCoreTextureReset)
210212
211- (let ((glCore: textures (make-table)))
213+ (let (;; TBD: not thread safe, assert exclusive access at least in debug
214+ (glCore: textures (make-table))
215+ (glCore: tidx 0))
212216 ;; should we use `(##still-copy (make-table))` for glCore:textures?
213217 (define (glCore: textures-ref texture default)
214218 (table-ref glCore: textures texture default))
215- (set! %%glCore: textures-ref glCore: textures-ref))
219+
220+ (define (%%glCoreTextureCreate w h data . aux)
221+ (glcore: log 5 "glCoreTextureCreate")
222+ (let* ((o1x (pair? aux))
223+ (o2 (and o1x (cdr aux))))
224+ (let ((idx glCore: tidx)
225+ (pixeltype
226+ (cond
227+ ((fx= (u8vector-length data) (* w h)) GL_ALPHA)
228+ ((fx= (u8vector-length data) (* 3 w h)) GL_RGB)
229+ ((fx= (u8vector-length data) (* 4 w h)) GL_RGBA)
230+ (else (log-error "glCoreTextureCreate: Invalid data range") #f)))
231+ (interpolation (if o1x (car aux) GL_LINEAR))
232+ (wrap (if (pair? o2) (car o2) GL_CLAMP)))
233+ (table-set!
234+ glCore: textures idx
235+ (##still-copy
236+ (vector #f (u32vector 0) w h (##still-copy data) pixeltype interpolation wrap)))
237+ (set! glCore: tidx (fx+ glCore: tidx 1))
238+ idx)))
239+
240+ ;; clear all textures
241+ (define (%%glCoreTextureReset)
242+ (glcore: log 5 "glCoreTextureReset")
243+ (let ((tlist '()))
244+ (table-for-each (lambda (k v) (set! tlist (append tlist (list k)))) glCore: textures)
245+ (for-each (lambda (t) (_glCoreTextureReset t)) tlist)
246+ ))
247+
248+ (set! glCoreTextureReset %%glCoreTextureReset)
249+ (set! %%glCore: textures-ref glCore: textures-ref)
250+ (set! glCoreTextureCreate %%glCoreTextureCreate))
216251
217252 ) ;; end of tentative changes
218253 (else ;; old version
@@ -223,48 +258,58 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
223258 ;; forward compatible replacements
224259 (define (%%glCore: textures-ref texture default)
225260 (table-ref glCore: textures texture default))
261+
262+ (define (glCoreTextureCreate w h data . aux)
263+ (glcore: log 5 "glCoreTextureCreate")
264+ (let* ((o1x (pair? aux))
265+ (o2 (and o1x (cdr aux))))
266+ (let ((idx glCore: tidx)
267+ (pixeltype
268+ (cond
269+ ((fx= (u8vector-length data) (* w h)) GL_ALPHA)
270+ ((fx= (u8vector-length data) (* 3 w h)) GL_RGB)
271+ ((fx= (u8vector-length data) (* 4 w h)) GL_RGBA)
272+ (else (log-error "glCoreTextureCreate: Invalid data range") #f)))
273+ (interpolation (if o1x (car aux) GL_LINEAR))
274+ (wrap (if (pair? o2) (car o2) GL_CLAMP)))
275+ (table-set!
276+ glCore: textures idx
277+ (##still-copy
278+ (vector #f (u32vector 0) w h (##still-copy data) pixeltype interpolation wrap)))
279+ (set! glCore: tidx (fx+ glCore: tidx 1))
280+ idx)))
281+
282+ ;; clear all textures
283+ (define (glCoreTextureReset)
284+ (glcore: log 5 "glCoreTextureReset")
285+ (let ((tlist '()))
286+ (table-for-each (lambda (k v) (set! tlist (append tlist (list k)))) glCore: textures)
287+ (for-each (lambda (t) (_glCoreTextureReset t)) tlist)
288+ ))
289+
226290 ) ;; end of old version
227291 ) ;; end of CONSTRUCTION-CASE
228292
229- (define (glCoreTextureCreate w h data . aux)
230- (glcore: log 5 "glCoreTextureCreate")
231- (let* ((o1x (pair? aux))
232- (o2 (and o1x (cdr aux))))
233- (let ((idx glCore: tidx)
234- (pixeltype
235- (cond
236- ((fx= (u8vector-length data) (* w h)) GL_ALPHA)
237- ((fx= (u8vector-length data) (* 3 w h)) GL_RGB)
238- ((fx= (u8vector-length data) (* 4 w h)) GL_RGBA)
239- (else (log-error "glCoreTextureCreate: Invalid data range") #f)))
240- (interpolation (if o1x (car aux) GL_LINEAR))
241- (wrap (if (pair? o2) (car o2) GL_CLAMP)))
242- (table-set!
243- glCore: textures idx
244- (##still-copy
245- (vector #f (u32vector 0) w h (##still-copy data) pixeltype interpolation wrap)))
246- (set! glCore: tidx (fx+ glCore: tidx 1))
247- idx)))
248293
249294;; return texture width
250295(define (glCoreTextureWidth t)
251296 (glcore: log 5 "glCoreTextureWidth")
252- (let ((entry (table-ref glCore: textures t #f)))
297+ (let ((entry (%% glCore: textures-ref t #f)))
253298 (if entry (vector-ref entry 2) (begin
254299 (log-error "glCoreTextureWidth: unbound index " t) #f))))
255300
256301;; return texture height
257302(define (glCoreTextureHeight t)
258303 (glcore: log 5 "glCoreTextureWidth")
259- (let ((entry (table-ref glCore: textures t #f)))
304+ (let ((entry (%% glCore: textures-ref t #f)))
260305 (if entry (vector-ref entry 3) (begin
261306 (log-error "glCoreTextureHeight: unbound index " t) #f))))
262307
263308;; return texture data
264309(define (glCoreTextureData t)
265310 (glcore: log 5 "glCoreTextureData")
266- (let ((entry (table-ref glCore: textures t #f)))
267- (if entry (vector-ref entry 4) (begin
311+ (let ((entry (%% glCore: textures-ref t #f)))
312+ (if entry (vector-ref entry 4) (begin
268313 (log-error "glCoreTextureData: unbound index " t) #f))))
269314
270315;; %%%%%%%%%%%%%%%%%%%%
@@ -306,7 +351,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
306351;; polygons are not clipped at all
307352
308353(define (glCoreTextureDraw x y w0 h0 t x1 y1 x2 y2 r . colors)
309- (let ((entry (table-ref glCore: textures t #f)))
354+ (let ((entry (%% glCore: textures-ref t #f)))
310355 (if entry
311356 (let ((w (flo (if (fx= (fix w0) 0) (vector-ref entry 2) w0)))
312357 (h (flo (if (fx= (fix h0) 0) (vector-ref entry 3) h0))))
@@ -335,10 +380,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
335380 (glCoreBegin GL_TRIANGLE_STRIP)
336381 (if (null? colors)
337382 (begin
338- (glCoreVertex2f (fl- w2) h2 @x 1 @y 2)
339- (glCoreVertex2f w2 h2 @x 2 @y 2)
340- (glCoreVertex2f (fl- w2) (fl- h2) @x 1 @y 1)
341- (glCoreVertex2f w2 (fl- h2) @x 2 @y 1)
383+ (glCoreVertex2f (fl- w2) h2 @x 1 @y 2)
384+ (glCoreVertex2f w2 h2 @x 2 @y 2)
385+ (glCoreVertex2f (fl- w2) (fl- h2) @x 1 @y 1)
386+ (glCoreVertex2f w2 (fl- h2) @x 2 @y 1)
342387 )
343388 (let ((colors (list->vector (car colors))))
344389 (glCoreColor (vector-ref colors 0))
@@ -405,7 +450,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
405450;; draw a texture
406451(define (glCoreTexturePolygonDraw _cx _cy points t _r)
407452 (glcore: log 5 "glCoreTexturePolygonDraw")
408- (let ((entry (table-ref glCore: textures t #f)))
453+ (let ((entry (%% glCore: textures-ref t #f)))
409454 (if entry
410455 (let* ((cx (flo _cx)) (cy (flo _cy)) (r (flo _r)))
411456 (glPushMatrix)
@@ -432,7 +477,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
432477(define (glCoreTextureUpdate t)
433478 (glcore: log 5 "glCoreTextureUpdate")
434479 (_glCoreTextureBind t) ;; select the texture as current
435- (let* ((entry (table-ref glCore: textures t #f))
480+ (let* ((entry (%% glCore: textures-ref t #f))
436481 (w (vector-ref entry 2))
437482 (h (vector-ref entry 3))
438483 (data (vector-ref entry 4))
@@ -442,7 +487,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
442487
443488(define (_glCoreTextureBind t)
444489 (glcore: log 5 "_glCoreTextureBind")
445- (let ((entry (table-ref glCore: textures t #f)))
490+ (let ((entry (%% glCore: textures-ref t #f)))
446491 (if entry
447492 (begin
448493 (unless (vector-ref entry 0) (_glCoreTextureInit t)) ;; cache texture `t`
@@ -455,18 +500,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
455500
456501(define (_glCoreTextureInit t)
457502 (glcore: log 5 "_glCoreTextureInit")
458- (let* ((entry (table-ref glCore: textures t #f))
503+ (let* ((entry (%% glCore: textures-ref t #f))
459504 (u32t (vector-ref entry 1))
460505 (w (vector-ref entry 2))
461506 (h (vector-ref entry 3))
462507 (data (vector-ref entry 4))
463508 (pixeltype (vector-ref entry 5))
464509 (interp (vector-ref entry 6))
465510 (wrap (vector-ref entry 7)))
466- (glGenTextures 1 u32t)
511+ (glGenTextures 1 u32t)
467512 (if (or (= (u32vector-ref u32t 0) GL_INVALID_VALUE)
468513 ;this is a general check that gl is working in this thread
469- (= (glIsEnabled GL_TEXTURE_2D) 0))
514+ (= (glIsEnabled GL_TEXTURE_2D) 0))
470515 (glcore: log 5 "_glCoreTextureInit: failed to generate texture")
471516 (begin
472517 (vector-set! entry 0 #t) ;; mark as initialized
@@ -482,22 +527,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
482527;; reset a texture entry
483528(define (_glCoreTextureReset t)
484529 (glcore: log 5 "_glCoreTextureReset")
485- (let* ((entry (table-ref glCore: textures t #f))
530+ (let* ((entry (%% glCore: textures-ref t #f))
486531 (u32t (vector-ref entry 1)))
487- (if (vector-ref entry 0) (begin
532+ (if (vector-ref entry 0) (begin
488533 (glDeleteTextures 1 u32t)
489534 (vector-set! entry 0 #f) ;; mark as uninitialized
490535 ))
491536 ))
492537
493- ;; clear all textures
494- (define (glCoreTextureReset)
495- (glcore: log 5 "glCoreTextureReset")
496- (let ((tlist '()))
497- (table-for-each (lambda (k v) (set! tlist (append tlist (list k)))) glCore: textures)
498- (for-each (lambda (t) (_glCoreTextureReset t)) tlist)
499- ))
500-
501538;; take screen shot
502539(define (glCoreReadPixels x y w h)
503540 (let* ((data (make-u8vector (* w h 3) 0)))
0 commit comments