Skip to content

Commit 967b9c5

Browse files
committed
GLCORE: rearrange code to factor out global variable
1 parent 6f26742 commit 967b9c5

File tree

1 file changed

+92
-55
lines changed

1 file changed

+92
-55
lines changed

modules/ln_glcore/glcore.scm

Lines changed: 92 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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 @x1 @y2)
339-
(glCoreVertex2f w2 h2 @x2 @y2)
340-
(glCoreVertex2f (fl- w2) (fl- h2) @x1 @y1)
341-
(glCoreVertex2f w2 (fl- h2) @x2 @y1)
383+
(glCoreVertex2f (fl- w2) h2 @x1 @y2)
384+
(glCoreVertex2f w2 h2 @x2 @y2)
385+
(glCoreVertex2f (fl- w2) (fl- h2) @x1 @y1)
386+
(glCoreVertex2f w2 (fl- h2) @x2 @y1)
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

Comments
 (0)