widgets: move asset updates out of the draw function (#442)

* label: move asset updates out of the draw function

This allows us to check if the label has actually updated after the
callback from the asyncResourceGatherer. If it isn't we can requeue the
renderUpdate() function.

* image: move asset updates out of the draw function
This commit is contained in:
Maximilian Seidler 2024-07-24 21:18:11 +00:00 committed by GitHub
parent 3e71799b30
commit cf0e975fed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 46 additions and 42 deletions

View File

@ -20,7 +20,11 @@ static void onTimer(std::shared_ptr<CTimer> self, void* data) {
static void onAssetCallback(void* data) {
const auto PIMAGE = (CImage*)data;
PIMAGE->renderSuper();
PIMAGE->renderUpdate();
}
static void onAssetCallbackTimer(std::shared_ptr<CTimer> self, void* data) {
onAssetCallback(data);
}
void CImage::onTimerUpdate() {
@ -100,23 +104,6 @@ CImage::CImage(const Vector2D& viewport_, COutput* output_, const std::string& r
bool CImage::draw(const SRenderData& data) {
if (!pendingResourceID.empty()) {
auto newAsset = g_pRenderer->asyncResourceGatherer->getAssetByID(pendingResourceID);
if (newAsset) {
if (newAsset->texture.m_iType == TEXTURE_INVALID) {
g_pRenderer->asyncResourceGatherer->unloadAsset(newAsset);
} else if (resourceID != pendingResourceID) {
g_pRenderer->asyncResourceGatherer->unloadAsset(asset);
imageFB.release();
asset = newAsset;
resourceID = pendingResourceID;
firstRender = true;
}
pendingResourceID = "";
}
}
if (resourceID.empty())
return false;
@ -190,14 +177,25 @@ bool CImage::draw(const SRenderData& data) {
return data.opacity < 1.0;
}
static void onAssetCallbackTimer(std::shared_ptr<CTimer> self, void* data) {
const auto PIMAGE = (CImage*)data;
PIMAGE->renderSuper();
}
void CImage::renderUpdate() {
auto newAsset = g_pRenderer->asyncResourceGatherer->getAssetByID(pendingResourceID);
if (newAsset) {
if (newAsset->texture.m_iType == TEXTURE_INVALID) {
g_pRenderer->asyncResourceGatherer->unloadAsset(newAsset);
} else if (resourceID != pendingResourceID) {
g_pRenderer->asyncResourceGatherer->unloadAsset(asset);
imageFB.release();
void CImage::renderSuper() {
g_pHyprlock->renderOutput(output->stringPort);
asset = newAsset;
resourceID = pendingResourceID;
firstRender = true;
}
pendingResourceID = "";
} else if (!pendingResourceID.empty()) {
Debug::log(WARN, "Asset {} not available after the asyncResourceGatherer's callback!", pendingResourceID);
if (!pendingResourceID.empty()) /* did not consume the pending resource */
g_pHyprlock->addTimer(std::chrono::milliseconds(100), onAssetCallbackTimer, this);
}
g_pHyprlock->renderOutput(output->stringPort);
}

View File

@ -21,7 +21,7 @@ class CImage : public IWidget {
virtual bool draw(const SRenderData& data);
void renderSuper();
void renderUpdate();
void onTimerUpdate();
void plantTimer();

View File

@ -27,7 +27,11 @@ static void onTimer(std::shared_ptr<CTimer> self, void* data) {
static void onAssetCallback(void* data) {
const auto PLABEL = (CLabel*)data;
PLABEL->renderSuper();
PLABEL->renderUpdate();
}
static void onAssetCallbackTimer(std::shared_ptr<CTimer> self, void* data) {
onAssetCallback(data);
}
std::string CLabel::getUniqueResourceId() {
@ -122,19 +126,6 @@ bool CLabel::draw(const SRenderData& data) {
shadow.markShadowDirty();
}
if (!pendingResourceID.empty()) {
// new asset is pending
auto newAsset = g_pRenderer->asyncResourceGatherer->getAssetByID(pendingResourceID);
if (newAsset) {
// new asset is ready :D
g_pRenderer->asyncResourceGatherer->unloadAsset(asset);
asset = newAsset;
resourceID = pendingResourceID;
pendingResourceID = "";
shadow.markShadowDirty();
}
}
shadow.draw(data);
// calc pos
@ -147,6 +138,21 @@ bool CLabel::draw(const SRenderData& data) {
return false;
}
void CLabel::renderSuper() {
void CLabel::renderUpdate() {
auto newAsset = g_pRenderer->asyncResourceGatherer->getAssetByID(pendingResourceID);
if (newAsset) {
// new asset is ready :D
g_pRenderer->asyncResourceGatherer->unloadAsset(asset);
asset = newAsset;
resourceID = pendingResourceID;
pendingResourceID = "";
shadow.markShadowDirty();
} else {
Debug::log(WARN, "Asset {} not available after the asyncResourceGatherer's callback!", pendingResourceID);
g_pHyprlock->addTimer(std::chrono::milliseconds(100), onAssetCallbackTimer, this);
return;
}
g_pHyprlock->renderOutput(outputStringPort);
}

View File

@ -19,7 +19,7 @@ class CLabel : public IWidget {
virtual bool draw(const SRenderData& data);
void renderSuper();
void renderUpdate();
void onTimerUpdate();
void plantTimer();