Skip to content

Commit a7f2634

Browse files
authored
Refactor asset management to use shared_ptr (#870)
* Refactor asset management to use shared_ptr * Replace shared_ptr with ASP for SPreloadedAsset usage
1 parent 450ae1e commit a7f2634

File tree

10 files changed

+63
-53
lines changed

10 files changed

+63
-53
lines changed

src/renderer/AsyncResourceGatherer.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,25 +59,25 @@ void CAsyncResourceGatherer::enqueueScreencopyFrames() {
5959
}
6060
}
6161

62-
SPreloadedAsset* CAsyncResourceGatherer::getAssetByID(const std::string& id) {
62+
ASP<SPreloadedAsset> CAsyncResourceGatherer::getAssetByID(const std::string& id) {
6363
if (id.contains(CScreencopyFrame::RESOURCEIDPREFIX)) {
6464
for (auto& frame : scframes) {
6565
if (id == frame->m_resourceID)
66-
return frame->m_asset.ready ? &frame->m_asset : nullptr;
66+
return frame->m_asset->ready ? frame->m_asset : nullptr;
6767
}
6868

6969
return nullptr;
7070
}
7171

7272
for (auto& a : assets) {
7373
if (a.first == id)
74-
return &a.second;
74+
return a.second;
7575
}
7676

7777
if (apply()) {
7878
for (auto& a : assets) {
7979
if (a.first == id)
80-
return &a.second;
80+
return a.second;
8181
}
8282
};
8383

@@ -133,7 +133,7 @@ void CAsyncResourceGatherer::gather() {
133133
}
134134

135135
// TODO: Wake this thread when all scframes are done instead of busy waiting.
136-
while (!g_pHyprlock->m_bTerminate && std::ranges::any_of(scframes, [](const auto& d) { return !d->m_asset.ready; })) {
136+
while (!g_pHyprlock->m_bTerminate && std::ranges::any_of(scframes, [](const auto& d) { return !d->m_asset->ready; })) {
137137
std::this_thread::sleep_for(std::chrono::milliseconds(1));
138138
}
139139

@@ -161,7 +161,10 @@ bool CAsyncResourceGatherer::apply() {
161161

162162
for (auto& t : currentPreloadTargets) {
163163
if (t.type == TARGET_IMAGE) {
164-
const auto ASSET = &assets[t.id];
164+
if (!assets.contains(t.id)) {
165+
assets[t.id] = makeAtomicShared<SPreloadedAsset>();
166+
}
167+
const auto ASSET = assets[t.id];
165168

166169
const cairo_status_t SURFACESTATUS = (cairo_status_t)t.cairosurface->status();
167170
const auto CAIROFORMAT = cairo_image_surface_get_format(t.cairosurface->cairo());
@@ -362,8 +365,8 @@ void CAsyncResourceGatherer::requestAsyncAssetPreload(const SPreloadRequest& req
362365
asyncLoopState.requestsCV.notify_all();
363366
}
364367

365-
void CAsyncResourceGatherer::unloadAsset(SPreloadedAsset* asset) {
366-
std::erase_if(assets, [asset](const auto& a) { return &a.second == asset; });
368+
void CAsyncResourceGatherer::unloadAsset(ASP<SPreloadedAsset> asset) {
369+
std::erase_if(assets, [asset](const auto& a) { return a.second == asset; });
367370
}
368371

369372
void CAsyncResourceGatherer::notify() {

src/renderer/AsyncResourceGatherer.hpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include "Screencopy.hpp"
4+
#include "../defines.hpp"
45
#include <thread>
56
#include <atomic>
67
#include <vector>
@@ -21,9 +22,9 @@ class CAsyncResourceGatherer {
2122
std::atomic<float> progress = 0;
2223

2324
/* only call from ogl thread */
24-
SPreloadedAsset* getAssetByID(const std::string& id);
25+
ASP<SPreloadedAsset> getAssetByID(const std::string& id);
2526

26-
bool apply();
27+
bool apply();
2728

2829
enum eTargetType {
2930
TARGET_IMAGE = 0,
@@ -44,7 +45,7 @@ class CAsyncResourceGatherer {
4445
};
4546

4647
void requestAsyncAssetPreload(const SPreloadRequest& request);
47-
void unloadAsset(SPreloadedAsset* asset);
48+
void unloadAsset(ASP<SPreloadedAsset> asset);
4849

4950
private:
5051
void notify();
@@ -78,15 +79,15 @@ class CAsyncResourceGatherer {
7879
Vector2D size;
7980
};
8081

81-
std::vector<UP<CScreencopyFrame>> scframes;
82+
std::vector<UP<CScreencopyFrame>> scframes;
8283

83-
std::vector<SPreloadTarget> preloadTargets;
84-
std::mutex preloadTargetsMutex;
84+
std::vector<SPreloadTarget> preloadTargets;
85+
std::mutex preloadTargetsMutex;
8586

86-
std::unordered_map<std::string, SPreloadedAsset> assets;
87+
std::unordered_map<std::string, ASP<SPreloadedAsset>> assets;
8788

88-
void gather();
89-
void enqueueScreencopyFrames();
89+
void gather();
90+
void enqueueScreencopyFrames();
9091
};
9192

9293
inline UP<CAsyncResourceGatherer> g_pAsyncResourceGatherer;

src/renderer/Screencopy.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ std::string CScreencopyFrame::getResourceId(SP<COutput> pOutput) {
2828
}
2929

3030
CScreencopyFrame::CScreencopyFrame(SP<COutput> pOutput) : m_outputRef(pOutput) {
31+
m_asset = makeAtomicShared<SPreloadedAsset>();
3132
captureOutput();
3233

3334
static const auto SCMODE = g_pConfigManager->getValue<Hyprlang::INT>("general:screencopy_mode");
@@ -201,7 +202,7 @@ bool CSCDMAFrame::onBufferDone() {
201202
return true;
202203
}
203204

204-
bool CSCDMAFrame::onBufferReady(SPreloadedAsset& asset) {
205+
bool CSCDMAFrame::onBufferReady(ASP<SPreloadedAsset> asset) {
205206
static constexpr struct {
206207
EGLAttrib fd;
207208
EGLAttrib offset;
@@ -255,19 +256,19 @@ bool CSCDMAFrame::onBufferReady(SPreloadedAsset& asset) {
255256
return false;
256257
}
257258

258-
asset.texture.allocate();
259-
asset.texture.m_vSize = {m_w, m_h};
260-
glBindTexture(GL_TEXTURE_2D, asset.texture.m_iTexID);
259+
asset->texture.allocate();
260+
asset->texture.m_vSize = {m_w, m_h};
261+
glBindTexture(GL_TEXTURE_2D, asset->texture.m_iTexID);
261262
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
262263
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
263264
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
264265
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
265266
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_image);
266267
glBindTexture(GL_TEXTURE_2D, 0);
267268

268-
Debug::log(LOG, "Got dma frame with size {}", asset.texture.m_vSize);
269+
Debug::log(LOG, "Got dma frame with size {}", asset->texture.m_vSize);
269270

270-
asset.ready = true;
271+
asset->ready = true;
271272

272273
return true;
273274
}
@@ -459,14 +460,14 @@ void CSCSHMFrame::convertBuffer() {
459460
}
460461
}
461462

462-
bool CSCSHMFrame::onBufferReady(SPreloadedAsset& asset) {
463+
bool CSCSHMFrame::onBufferReady(ASP<SPreloadedAsset> asset) {
463464
convertBuffer();
464465

465-
asset.texture.allocate();
466-
asset.texture.m_vSize.x = m_w;
467-
asset.texture.m_vSize.y = m_h;
466+
asset->texture.allocate();
467+
asset->texture.m_vSize.x = m_w;
468+
asset->texture.m_vSize.y = m_h;
468469

469-
glBindTexture(GL_TEXTURE_2D, asset.texture.m_iTexID);
470+
glBindTexture(GL_TEXTURE_2D, asset->texture.m_iTexID);
470471

471472
void* buffer = m_convBuffer ? m_convBuffer : m_shmData;
472473

@@ -477,9 +478,9 @@ bool CSCSHMFrame::onBufferReady(SPreloadedAsset& asset) {
477478
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_w, m_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
478479
glBindTexture(GL_TEXTURE_2D, 0);
479480

480-
Debug::log(LOG, "[sc] [shm] Got screenshot with size {}", asset.texture.m_vSize);
481+
Debug::log(LOG, "[sc] [shm] Got screenshot with size {}", asset->texture.m_vSize);
481482

482-
asset.ready = true;
483+
asset->ready = true;
483484

484485
return true;
485486
}

src/renderer/Screencopy.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ class ISCFrame {
1414
ISCFrame() = default;
1515
virtual ~ISCFrame() = default;
1616

17-
virtual bool onBufferDone() = 0;
18-
virtual bool onBufferReady(SPreloadedAsset& asset) = 0;
17+
virtual bool onBufferDone() = 0;
18+
virtual bool onBufferReady(ASP<SPreloadedAsset> asset) = 0;
1919

2020
SP<CCWlBuffer> m_wlBuffer = nullptr;
2121
};
@@ -33,7 +33,7 @@ class CScreencopyFrame {
3333
SP<CCZwlrScreencopyFrameV1> m_sc = nullptr;
3434

3535
std::string m_resourceID;
36-
SPreloadedAsset m_asset;
36+
ASP<SPreloadedAsset> m_asset;
3737

3838
private:
3939
WP<COutput> m_outputRef;
@@ -48,7 +48,7 @@ class CSCDMAFrame : public ISCFrame {
4848
CSCDMAFrame(SP<CCZwlrScreencopyFrameV1> sc);
4949
virtual ~CSCDMAFrame();
5050

51-
virtual bool onBufferReady(SPreloadedAsset& asset);
51+
virtual bool onBufferReady(ASP<SPreloadedAsset> asset);
5252
virtual bool onBufferDone();
5353

5454
private:
@@ -78,7 +78,7 @@ class CSCSHMFrame : public ISCFrame {
7878
virtual bool onBufferDone() {
7979
return m_ok;
8080
}
81-
virtual bool onBufferReady(SPreloadedAsset& asset);
81+
virtual bool onBufferReady(ASP<SPreloadedAsset> asset);
8282
void convertBuffer();
8383

8484
private:

src/renderer/widgets/Background.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,9 +324,10 @@ void CBackground::startCrossFade() {
324324
crossFadeProgress->setCallbackOnEnd(
325325
[REF = m_self](auto) {
326326
if (const auto PSELF = REF.lock()) {
327-
PSELF->asset = PSELF->pendingAsset;
328-
PSELF->pendingAsset = nullptr;
329-
g_pAsyncResourceGatherer->unloadAsset(PSELF->pendingAsset);
327+
if (PSELF->asset)
328+
g_pAsyncResourceGatherer->unloadAsset(PSELF->asset);
329+
PSELF->asset = PSELF->pendingAsset;
330+
PSELF->pendingAsset = nullptr;
330331
PSELF->resourceID = PSELF->pendingResourceID;
331332
PSELF->pendingResourceID = "";
332333

src/renderer/widgets/Background.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "../../defines.hpp"
34
#include "IWidget.hpp"
45
#include "../../helpers/AnimatedVariable.hpp"
56
#include "../../helpers/Color.hpp"
@@ -73,9 +74,9 @@ class CBackground : public IWidget {
7374
PHLANIMVAR<float> crossFadeProgress;
7475

7576
CHyprColor color;
76-
SPreloadedAsset* asset = nullptr;
77-
SPreloadedAsset* scAsset = nullptr;
78-
SPreloadedAsset* pendingAsset = nullptr;
77+
ASP<SPreloadedAsset> asset = nullptr;
78+
ASP<SPreloadedAsset> scAsset = nullptr;
79+
ASP<SPreloadedAsset> pendingAsset = nullptr;
7980
bool isScreenshot = false;
8081
bool firstRender = true;
8182

src/renderer/widgets/Image.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "../../defines.hpp"
34
#include "IWidget.hpp"
45
#include "../../helpers/Color.hpp"
56
#include "../../helpers/Math.hpp"
@@ -64,6 +65,6 @@ class CImage : public IWidget {
6465

6566
std::string resourceID;
6667
std::string pendingResourceID; // if reloading image
67-
SPreloadedAsset* asset = nullptr;
68+
ASP<SPreloadedAsset> asset = nullptr;
6869
CShadowable shadow;
6970
};

src/renderer/widgets/Label.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "../../defines.hpp"
34
#include "IWidget.hpp"
45
#include "Shadowable.hpp"
56
#include "../../helpers/Math.hpp"
@@ -47,7 +48,7 @@ class CLabel : public IWidget {
4748
std::string pendingResourceID; // if dynamic label
4849
std::string halign, valign;
4950
std::string onclickCommand;
50-
SPreloadedAsset* asset = nullptr;
51+
ASP<SPreloadedAsset> asset = nullptr;
5152

5253
std::string outputStringPort;
5354

src/renderer/widgets/PasswordInputField.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ bool CPasswordInputField::draw(const SRenderData& data) {
302302
}
303303

304304
if (passwordLength == 0 && !checkWaiting && !placeholder.resourceID.empty()) {
305-
SPreloadedAsset* currAsset = nullptr;
305+
ASP<SPreloadedAsset> currAsset = nullptr;
306306

307307
if (!placeholder.asset)
308308
placeholder.asset = g_pAsyncResourceGatherer->getAssetByID(placeholder.resourceID);

src/renderer/widgets/PasswordInputField.hpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include "IWidget.hpp"
4+
#include "../../defines.hpp"
45
#include "../../helpers/Color.hpp"
56
#include "../../helpers/Math.hpp"
67
#include "../../core/Timer.hpp"
@@ -59,14 +60,14 @@ class CPasswordInputField : public IWidget {
5960
int outThick, rounding;
6061

6162
struct {
62-
PHLANIMVAR<float> currentAmount;
63-
bool center = false;
64-
float size = 0;
65-
float spacing = 0;
66-
int rounding = 0;
67-
std::string textFormat = "";
68-
std::string textResourceID;
69-
SPreloadedAsset* textAsset = nullptr;
63+
PHLANIMVAR<float> currentAmount;
64+
bool center = false;
65+
float size = 0;
66+
float spacing = 0;
67+
int rounding = 0;
68+
std::string textFormat = "";
69+
std::string textResourceID;
70+
ASP<SPreloadedAsset> textAsset = nullptr;
7071
} dots;
7172

7273
struct {
@@ -78,7 +79,7 @@ class CPasswordInputField : public IWidget {
7879

7980
struct {
8081
std::string resourceID = "";
81-
SPreloadedAsset* asset = nullptr;
82+
ASP<SPreloadedAsset> asset = nullptr;
8283

8384
std::string currentText = "";
8485
size_t failedAttempts = 0;

0 commit comments

Comments
 (0)