Browse Source

* fixed bug in OpenGL texture manager

Bergmann89 4 years ago
parent
commit
acf68a7041
4 changed files with 23 additions and 21 deletions
  1. 8 7
      utsCharCache.pas
  2. 3 3
      utsFont.pas
  3. 6 6
      utsOpenGLUtils.pas
  4. 6 5
      utsUtils.pas

+ 8 - 7
utsCharCache.pas

@@ -73,7 +73,7 @@ type
73 73
     function GetChars(const aKey: TtsFont): TtsChars;
74 74
     function Find(const aMin, aMax: Integer; const aKey: TtsFont; out aIndex: Integer): Integer;
75 75
   protected
76
-    procedure DelSlave(const aSlave: TtsRefManager); override;
76
+    function DelSlave(const aSlave: TtsRefManager): Boolean; override;
77 77
   public
78 78
     property Chars[const aKey: TtsFont]: TtsChars read GetChars;
79 79
 
@@ -459,19 +459,22 @@ begin
459 459
 end;
460 460
 
461 461
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
462
-procedure TtsCharCache.DelSlave(const aSlave: TtsRefManager);
462
+function TtsCharCache.DelSlave(const aSlave: TtsRefManager): Boolean;
463 463
 var
464
+  f: TtsFont;
464 465
   pos, index: Integer;
465 466
   p: PtsCharCacheItem;
466 467
 begin
467
-  pos := Find(0, fItems.Count-1, aSlave as TtsFont, index);
468
+  f := (aSlave as TtsFont);
469
+  f.DelMaster(self);
470
+  pos := Find(0, fItems.Count-1, f, index);
468 471
   if (pos >= 0) then begin
469 472
     p := PtsCharCacheItem(fItems[pos]);
470 473
     fItems.Delete(pos);
471 474
     FreeAndNil(p^.val);
472 475
     Dispose(p);
473 476
   end;
474
-  inherited DelSlave(aSlave);
477
+  result := inherited DelSlave(aSlave);
475 478
 end;
476 479
 
477 480
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -482,10 +485,8 @@ var
482 485
 begin
483 486
   for i := 0 to fItems.Count-1 do begin
484 487
     p := PtsCharCacheItem(fItems[i]);
485
-    FreeAndNil(p^.val);
486
-    Dispose(p);
488
+    p^.key.DelMaster(self);
487 489
   end;
488
-  fItems.Clear;
489 490
 end;
490 491
 
491 492
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

+ 3 - 3
utsFont.pas

@@ -22,7 +22,7 @@ type
22 22
     fCharSpacing: Integer;
23 23
     fLineSpacing: Single;
24 24
   protected
25
-    {%H-}constructor Create(const aMaster: TtsRefManager; const aMetric: TtsFontMetric; const aNames: TtsFontNames);
25
+    {%H-}constructor Create(const aCreator: TtsRefManager; const aMetric: TtsFontMetric; const aNames: TtsFontNames);
26 26
   public
27 27
     property Names:         TtsFontNames     read fNames;
28 28
     property Metric:        TtsFontMetric    read fMetric;
@@ -42,9 +42,9 @@ implementation
42 42
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
43 43
 //TtsFont//////////////////////////////////////////////////////////////////////////////////////////////////////////////
44 44
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
45
-constructor TtsFont.Create(const aMaster: TtsRefManager; const aMetric: TtsFontMetric; const aNames: TtsFontNames);
45
+constructor TtsFont.Create(const aCreator: TtsRefManager; const aMetric: TtsFontMetric; const aNames: TtsFontNames);
46 46
 begin
47
-  inherited Create(aMaster);
47
+  inherited Create(aCreator);
48 48
   fMetric := aMetric;
49 49
   fNames  := aNames;
50 50
 end;

+ 6 - 6
utsOpenGLUtils.pas

@@ -149,6 +149,10 @@ begin
149 149
   if Assigned(aTexture^.Next) then
150 150
     aTexture^.Next^.Prev := aTexture^.Prev;
151 151
   Dispose(aTexture);
152
+  if (fFirstTexture = aTexture) then begin
153
+    fFirstTexture := nil;
154
+    fLastTexture  := nil;
155
+  end;
152 156
   aTexture := nil;
153 157
 end;
154 158
 
@@ -325,18 +329,14 @@ begin
325 329
       if (tex^.ID = ref.TextureID) then begin
326 330
         if not RemoveFromTree(tex^.Usage, 0, 0, tex^.Size, tex^.Size) then
327 331
           raise EtsRendererOpenGL.Create('unable to remove render ref from texture');
328
-        if IsEmtpy(tex^.Usage) then begin
329
-          if (tex = fFirstTexture) then
330
-            fFirstTexture := nil;
332
+        if IsEmtpy(tex^.Usage) then
331 333
           FreeTexture(tex);
332
-        end;
333 334
         tex := nil;
334 335
       end else
335 336
         tex := tex^.Next;
336 337
     end;
337 338
   finally
338
-    if Assigned(ref) then
339
-      ref.Free;
339
+    FreeAndNil(ref);
340 340
   end;
341 341
 end;
342 342
 

+ 6 - 5
utsUtils.pas

@@ -14,11 +14,11 @@ type
14 14
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
15 15
   TtsRefManager = class(TObject)
16 16
   private
17
-    fMasterRef: TtsRefManager;
18
-    fSlaveRefs: TObjectList;
17
+    fMasterRef: TtsRefManager;  // master of this object (master will destroy this object)
18
+    fSlaveRefs: TObjectList;    // slaves of this object (will destroy all slaves when this objects is destroyed)
19 19
   protected
20 20
     procedure AddSlave(const aSlave: TtsRefManager); virtual;
21
-    procedure DelSlave(const aSlave: TtsRefManager); virtual;
21
+    function DelSlave(const aSlave: TtsRefManager): Boolean; virtual;
22 22
   public
23 23
     constructor Create(const aMaster: TtsRefManager);
24 24
     destructor Destroy; override;
@@ -126,10 +126,11 @@ begin
126 126
 end;
127 127
 
128 128
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
129
-procedure TtsRefManager.DelSlave(const aSlave: TtsRefManager);
129
+function TtsRefManager.DelSlave(const aSlave: TtsRefManager): Boolean;
130 130
 begin
131
+  result := false;
131 132
   if Assigned(fSlaveRefs) then
132
-    fSlaveRefs.Remove(aSlave);
133
+    result := (fSlaveRefs.Remove(aSlave) >= 0);
133 134
 end;
134 135
 
135 136
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////