Skip to content

Commit 8469601

Browse files
committed
add cache_do, use in Labels
1 parent dbb73cd commit 8469601

1 file changed

Lines changed: 17 additions & 7 deletions

File tree

  • lib/PDL/Graphics/TriD

lib/PDL/Graphics/TriD/GL.pm

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}
149161
sub 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
);
368380
use PDL::Graphics::OpenGLQ;
369-
my (%FONT, $FONT_ID);
381+
my %FONT;
370382
sub _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

Comments
 (0)