常规更新
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user