常规更新

This commit is contained in:
2026-07-23 11:10:17 +08:00
parent d1aac0e679
commit a3a385f8da
31 changed files with 736 additions and 255 deletions
+57 -39
View File
@@ -45,9 +45,7 @@ namespace YSG {
if (mLock) mLock->lock();
}
RenderAble::RenderPipeline::RenderPipeline() {
frontColor = &colorBuffers[0];
readyColor = &colorBuffers[1];
renderColor = &colorBuffers[2];
colorControl.reset();
}
void RenderAble::RenderPipeline::markEditState() {
editStateVersion.fetch_add(1, std::memory_order_release);
@@ -55,33 +53,48 @@ namespace YSG {
bool RenderAble::RenderPipeline::hasNewState() const {
return RenderAble::version_newer(editStateVersion.load(std::memory_order_acquire), renderStateVersion);
}
RenderAble::ColorBuffer* RenderAble::RenderPipeline::currentRenderColor() const {
return renderColor;
RenderAble::ColorBuffer* RenderAble::RenderPipeline::colorByIndex(std::uint8_t index) {
return &colorBuffers[index];
}
RenderAble::ColorBuffer* RenderAble::RenderPipeline::colorByRole(std::uint8_t role) {
return colorByIndex(colorControl.read_view()[role]);
}
RenderAble::ColorBufferLease RenderAble::RenderPipeline::waitRenderColor() {
auto lease = colorControl.wait_mark_use_role(Color_Render);
return {colorByIndex(lease.index), lease};
}
RenderAble::ColorBufferLease RenderAble::RenderPipeline::tryFrontColor() {
auto record = colorControl.try_mark_use_role(Color_Front);
if(record.result != Triple_Buffer_Result::Success) {
return {};
}
return {colorByIndex(record.lease.index), record.lease};
}
void RenderAble::RenderPipeline::unmarkColor(ColorBufferLease lease) {
colorControl.unmark_use(lease.lease);
}
QRegion RenderAble::RenderPipeline::publishRenderColor() {
QRegion updateRegion;
SpinLockGuard guard(&colorLock);
if(RenderAble::version_newer(renderColor->version, readyColor->version)) {
std::swap(readyColor, renderColor);
dirtyRegion += readyColor->dirtyRegion;
colorControl.wait_swap_role(Color_Ready, Color_Render, [this](const Triple_Buffer_View& view) {
auto render = colorByIndex(view[Color_Render]);
auto ready = colorByIndex(view[Color_Ready]);
return RenderAble::version_newer(render->version.load(std::memory_order_acquire), ready->version.load(std::memory_order_acquire));
});
auto view = colorControl.read_view();
auto ready = colorByIndex(view[Color_Ready]);
auto front = colorByIndex(view[Color_Front]);
if(RenderAble::version_newer(ready->version.load(std::memory_order_acquire), front->version.load(std::memory_order_acquire)) && !paintRequestPending.exchange(true, std::memory_order_acq_rel)) {
return ready->dirtyRegion;
}
if(RenderAble::version_newer(readyColor->version, frontColor->version)) {
if(dirtyRegion.isEmpty()) dirtyRegion = readyColor->dirtyRegion;
if(!paintRequestPending) {
paintRequestPending = true;
updateRegion = dirtyRegion;
}
}
return updateRegion;
return {};
}
RenderAble::ColorBuffer* RenderAble::RenderPipeline::consumeReadyColor() {
SpinLockGuard guard(&colorLock);
if(RenderAble::version_newer(readyColor->version, frontColor->version)) {
std::swap(frontColor, readyColor);
}
paintRequestPending = false;
dirtyRegion = QRegion();
return frontColor;
RenderAble::ColorBufferLease RenderAble::RenderPipeline::consumeReadyColor() {
colorControl.try_swap_role(Color_Front, Color_Ready, [this](const Triple_Buffer_View& view) {
auto ready = colorByIndex(view[Color_Ready]);
auto front = colorByIndex(view[Color_Front]);
return RenderAble::version_newer(ready->version.load(std::memory_order_acquire), front->version.load(std::memory_order_acquire));
});
paintRequestPending.store(false, std::memory_order_release);
return tryFrontColor();
}
RenderEditGuard::RenderEditGuard(RenderData* data) : mData(data) {
}
@@ -95,22 +108,23 @@ namespace YSG {
plot->mLayerMap[layerName]->mRenderAbles.append(this);
mPlot = plot;
if(!dPtr) dPtr = createRenderData();
delete dPtr->mRenderState;
delete dPtr->mRenderStateCache;
delete dPtr->mTempData;
delete dPtr->mTempDataCache;
dPtr->mRenderState = createRenderState();
dPtr->mRenderStateCache = createRenderState();
dPtr->mTempData = createTempData();
dPtr->mTempDataCache = createTempData();
dPtr->mRenderState->dPtr = dPtr;
dPtr->mRenderStateCache->dPtr = dPtr;
dPtr->clearStateBuffers();
delete dPtr->mRenderTempData;
delete dPtr->mEditTempData;
dPtr->mStateBuffers[State_Edit] = createRenderState();
dPtr->mStateBuffers[State_Ready] = createRenderState();
dPtr->mStateBuffers[State_Render] = createRenderState();
dPtr->mRenderTempData = createTempData();
dPtr->mEditTempData = createTempData();
for(RenderState* state : dPtr->mStateBuffers) {
state->dPtr = dPtr;
}
dPtr->qPtr = this;
dPtr->mRenderStateCache->version = 1;
dPtr->mStateBuffers[State_Edit]->version = 1;
if(mPlot) mPlot->markRenderStateDirty();
}
void RenderAble::markStateDirty() {
if(dPtr && dPtr->mRenderStateCache) ++dPtr->mRenderStateCache->version;
if(dPtr) ++dPtr->state(State_Edit)->version;
if(mPlot) mPlot->markRenderStateDirty();
}
bool RenderAble::ok() const {
@@ -224,6 +238,10 @@ namespace YSG {
}
SRC RenderState::src() {
return dPtr->mRenderState == this ? SRC::Render : SRC::Cache;
auto view = dPtr->mStateControl.read_view();
for(std::uint8_t role = State_Edit; role <= State_Render; ++role) {
if(dPtr->mStateBuffers[view[role]] == this) return static_cast<SRC>(role);
}
return SRC::Edit;
}
}