@@ -129,7 +129,7 @@ use OpenGL::Modern qw(
129129 glCreateShader glDeleteShader glShaderSource_p glCompileShader
130130 glAttachShader glDetachShader
131131 glGetShaderiv_p glGetShaderInfoLog_p
132- glCreateProgram glDeleteProgram glLinkProgram glUseProgram
132+ glCreateProgram glDeleteProgram glLinkProgram glUseProgram glIsProgram
133133 glGetProgramiv_p glGetProgramInfoLog_p
134134 glGetAttribLocation glEnableVertexAttribArray glDisableVertexAttribArray
135135 glGetUniformLocation glUniform1i
@@ -146,6 +146,18 @@ use OpenGL::Modern qw(
146146 GL_TEXTURE_2D GL_TEXTURE_BINDING_2D
147147 GL_FLOAT GL_STATIC_DRAW
148148) ;
149+ my (%TYPE2CHECKFUNC , %OBJ_CACHE ) = (
150+ tex => \&glIsTexture,
151+ prog => \&glIsProgram,
152+ );
153+ sub cache_do {
154+ my ($this , $type , $key , $make ) = @_ ;
155+ PDL::barf " cache_do: unknown type '$type '" unless my $check_func = $TYPE2CHECKFUNC {$type };
156+ my $val_ref = \$OBJ_CACHE {ref $this }{$key };
157+ return $$val_ref if defined $$val_ref and my $check = $check_func -> ($$val_ref );
158+ %OBJ_CACHE = () if !($check // 1); # context went away
159+ $$val_ref = $make -> ();
160+ }
149161sub load_buffer {
150162 my ($this , $idname , $pdl , $target , $usage ) = @_ ;
151163 PDL::barf ref ($this )." ::load_buffer: undef ndarray" if !defined $pdl ;
@@ -366,7 +378,7 @@ use OpenGL::Modern qw(
366378 GL_RGBA32F GL_RGBA
367379) ;
368380use PDL::Graphics::OpenGLQ;
369- my ( %FONT , $FONT_ID ) ;
381+ my %FONT ;
370382sub _font_setup {
371383 my ($fref ) = @_ ;
372384 my ($texture , $rightbound , $orig ) = gl_font_texture();
@@ -394,11 +406,9 @@ sub togl_setup {
394406 my ($this ,$points ) = @_ ;
395407 print " togl_setup $this \n " if $PDL::Graphics::TriD::verbose ;
396408 _font_setup(\%FONT ) if !keys %FONT ;
397- if (defined $FONT_ID and glIsTexture($FONT_ID )) {
398- $this -> {Impl }{font_id } = $FONT_ID ;
399- } else {
400- $FONT_ID = $this -> load_texture(font_id => $FONT {texture }, GL_RGBA32F, ($FONT {texture }-> dims)[1,2], GL_RGBA);
401- }
409+ $this -> {Impl }{font_id } = $this -> cache_do(tex => ' tex' , sub {
410+ $this -> load_texture(font_id => $FONT {texture }, GL_RGBA32F, ($FONT {texture }-> dims)[1,2], GL_RGBA);
411+ });
402412 $points //= $this -> {Points }; # as Labels is used in Graph
403413 my $numchars = $FONT {numchars };
404414 my $vert_template = PDL-> new(PDL::float, [0,0,1], [0,0,0], [1,0,1], [1,0,0]);
0 commit comments