Skip to content

Commit 3e14870

Browse files
author
Nemirtingas
committed
Fix old resource was unallocated while in use in current frame.
1 parent 2e03d8b commit 3e14870

File tree

4 files changed

+45
-24
lines changed

4 files changed

+45
-24
lines changed

src/RendererHookInternal.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,18 @@ void RendererHookInternal_t::_LoadResources()
3737
if (_ResourcesToLoad.empty())
3838
return;
3939

40+
for (auto& resource : _OldResourcesToUnload)
41+
resource->UnloadOldResource();
42+
43+
_OldResourcesToUnload.clear();
44+
4045
auto batchSize = _ResourcesToLoad.size() > _BatchSize ? _BatchSize : _ResourcesToLoad.size();
46+
4147
for (int i = 0; i < batchSize; ++i)
4248
{
43-
if (_ResourcesToLoad[i]->IsLoaded())
44-
_ResourcesToLoad[i]->Unload(false);
49+
// Remove old resources next frame, it might be currently in use.
50+
if (_ResourcesToLoad[i]->AttachementChanged())
51+
_OldResourcesToUnload.emplace_back(_ResourcesToLoad[i]);
4552

4653
_ResourcesToLoad[i]->LoadAttachedResource();
4754
}

src/RendererHookInternal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class RendererHookInternal_t : public RendererHook_t
3535
ResourceAutoLoad_t _AutoLoad;
3636
uint32_t _BatchSize;
3737
std::vector<RendererResourceInternal_t*> _ResourcesToLoad;
38+
std::vector<RendererResourceInternal_t*> _OldResourcesToUnload;
3839

3940
protected:
4041
RendererHookInternal_t();

src/RendererResourceInternal.cpp

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,6 @@ bool RendererResourceInternal_t::_DoAutoLoad()
6262
return _DoImmediateLoad();
6363
}
6464

65-
bool RendererResourceInternal_t::_AttachementChanged()
66-
{
67-
return !_OldRendererResource.expired();
68-
}
69-
70-
void RendererResourceInternal_t::_UnloadOldResource()
71-
{
72-
if (auto r = _OldRendererResource.lock())
73-
_RendererHook->ReleaseImageResource(_OldRendererResource);
74-
75-
_OldRendererResource.reset();
76-
}
77-
7865
void RendererResourceInternal_t::Delete()
7966
{
8067
delete this;
@@ -104,7 +91,7 @@ bool RendererResourceInternal_t::LoadAttachedResource()
10491
{
10592
if (IsLoaded())
10693
{
107-
if (!_AttachementChanged())
94+
if (!AttachementChanged())
10895
return true;
10996

11097
Unload(false);
@@ -113,7 +100,6 @@ bool RendererResourceInternal_t::LoadAttachedResource()
113100
if (!CanBeLoaded())
114101
return false;
115102

116-
_UnloadOldResource();
117103
_RendererResource = _RendererHook->CreateImageResource(_Data, _Width, _Height);
118104
return !_RendererResource.expired();
119105
}
@@ -132,14 +118,26 @@ bool RendererResourceInternal_t::Load(const void* data, uint32_t width, uint32_t
132118

133119
uint64_t RendererResourceInternal_t::GetResourceId()
134120
{
135-
if (_AttachementChanged() || !IsLoaded())
121+
if (AttachementChanged() || !IsLoaded())
136122
{
137-
if (!_DoAutoLoad() && !_AttachementChanged())
123+
if (!_DoAutoLoad() && !AttachementChanged())
138124
return 0;
139125
}
140126

141-
auto r = !_AttachementChanged() ? _RendererResource.lock() : _OldRendererResource.lock();
142-
return r != nullptr ? *r : 0;
127+
if (IsLoaded())
128+
{
129+
auto r = _RendererResource.lock();
130+
if (r != nullptr)
131+
return *r;
132+
}
133+
if (AttachementChanged())
134+
{
135+
auto r = _OldRendererResource.lock();
136+
if (r != nullptr)
137+
return *r;
138+
}
139+
140+
return 0;
143141
}
144142

145143
uint32_t RendererResourceInternal_t::Width() const
@@ -176,7 +174,7 @@ void RendererResourceInternal_t::ClearAttachedResource()
176174

177175
void RendererResourceInternal_t::Unload(bool clearAttachedResource)
178176
{
179-
_UnloadOldResource();
177+
UnloadOldResource();
180178

181179
if (auto r = _RendererResource.lock())
182180
_RendererHook->ReleaseImageResource(_RendererResource);
@@ -187,4 +185,17 @@ void RendererResourceInternal_t::Unload(bool clearAttachedResource)
187185
ClearAttachedResource();
188186
}
189187

188+
bool RendererResourceInternal_t::AttachementChanged()
189+
{
190+
return !_OldRendererResource.expired();
191+
}
192+
193+
void RendererResourceInternal_t::UnloadOldResource()
194+
{
195+
if (auto r = _OldRendererResource.lock())
196+
_RendererHook->ReleaseImageResource(_OldRendererResource);
197+
198+
_OldRendererResource.reset();
199+
}
200+
190201
}

src/RendererResourceInternal.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ class RendererResourceInternal_t : public RendererResource_t
3535
bool _DoBatchLoad();
3636
bool _DoImmediateLoad();
3737
bool _DoAutoLoad();
38-
bool _AttachementChanged();
39-
void _UnloadOldResource();
4038

4139
public:
4240
std::weak_ptr<uint64_t> _OldRendererResource;
@@ -81,6 +79,10 @@ class RendererResourceInternal_t : public RendererResource_t
8179
virtual void ClearAttachedResource();
8280

8381
virtual void Unload(bool clearAttachedResource = true);
82+
83+
bool AttachementChanged();
84+
85+
void UnloadOldResource();
8486
};
8587

8688
}

0 commit comments

Comments
 (0)