mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-10 21:28:32 +09:00
[Perf] (MG_Backend/DirectVulkan): re-land content-version texture early-out; bump content version on glGenerateMipmap so cached sampled views re-sync (fixes Iris shader retrace)
This commit is contained in:
@@ -1065,6 +1065,22 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
||||
|
||||
Bool VkTextureManager::SyncTexture(MG_State::GLState::ITextureObject &texture,
|
||||
TextureResource &outResource) {
|
||||
// Cross-draw fast path: if the resource is already built and neither the texture's
|
||||
// pixel content (bumped in MarkStorageDirty) nor its params changed since the last
|
||||
// sync, there is nothing to re-check or re-upload - skip CheckMipmapCompleteness,
|
||||
// SyncTextureResource, SyncTextureViews and the per-level dirty scan. Layout is
|
||||
// maintained separately by the transition path, so the resource still reflects truth.
|
||||
const Uint64 syncingContentVersion = texture.GetContentVersion();
|
||||
const auto* syncingMipTexture = MG_State::GLState::AsMipmapTexture(&texture);
|
||||
const Uint32 syncingMipLevelCount =
|
||||
syncingMipTexture != nullptr ? syncingMipTexture->GetMipmapLevelCount() : 0u;
|
||||
if (outResource.image != VK_NULL_HANDLE &&
|
||||
outResource.syncedContentVersion == syncingContentVersion &&
|
||||
outResource.syncedTextureParamsVersion == texture.GetTextureParamsVersion() &&
|
||||
outResource.syncedMipLevelCount == syncingMipLevelCount) {
|
||||
return true;
|
||||
}
|
||||
|
||||
TextureUploadTarget uploadTarget = TextureUploadTarget::Unknown;
|
||||
IntVec3 texelSize{0, 0, 0};
|
||||
SizeT byteSize = 0;
|
||||
@@ -1111,6 +1127,8 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
||||
DumpTextureSyncStats(texture.GetExternalIndex(), texture.GetFormat(), uploadTarget, mipLevelCount,
|
||||
texelSize, byteSize, hasDirtyMipLevel);
|
||||
if (!hasDirtyMipLevel) {
|
||||
outResource.syncedContentVersion = syncingContentVersion;
|
||||
outResource.syncedMipLevelCount = syncingMipLevelCount;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1118,6 +1136,8 @@ namespace MobileGL::MG_Backend::DirectVulkan {
|
||||
MGLOG_D("%s: UploadDirtyMipLevels failed", __func__);
|
||||
return false;
|
||||
}
|
||||
outResource.syncedContentVersion = syncingContentVersion;
|
||||
outResource.syncedMipLevelCount = syncingMipLevelCount;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -97,6 +97,13 @@ public:
|
||||
VkImageViewType viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||
VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT;
|
||||
Uint16 syncedTextureParamsVersion = 0;
|
||||
// Snapshot of ITextureObject::GetContentVersion() at the last successful sync;
|
||||
// lets SyncTexture skip the whole re-check/re-upload when content is unchanged.
|
||||
Uint64 syncedContentVersion = 0;
|
||||
// Snapshot of the defined mip-level count at the last sync. Folded into the early-out key
|
||||
// as defense-in-depth: any path that grows the level set (which resizes the sampled view)
|
||||
// busts the skip even if it failed to bump the content version.
|
||||
Uint32 syncedMipLevelCount = 0;
|
||||
|
||||
TextureResource() = default;
|
||||
TextureResource(const TextureResource&) = delete;
|
||||
@@ -120,6 +127,8 @@ public:
|
||||
std::swap(this->viewType, that.viewType);
|
||||
std::swap(this->sampleCount, that.sampleCount);
|
||||
std::swap(this->syncedTextureParamsVersion, that.syncedTextureParamsVersion);
|
||||
std::swap(this->syncedContentVersion, that.syncedContentVersion);
|
||||
std::swap(this->syncedMipLevelCount, that.syncedMipLevelCount);
|
||||
}
|
||||
|
||||
void Reset() {
|
||||
@@ -166,6 +175,8 @@ public:
|
||||
viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||
sampleCount = VK_SAMPLE_COUNT_1_BIT;
|
||||
syncedTextureParamsVersion = 0;
|
||||
syncedContentVersion = 0;
|
||||
syncedMipLevelCount = 0;
|
||||
}
|
||||
|
||||
~TextureResource() {
|
||||
|
||||
Reference in New Issue
Block a user