mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 14:18:31 +09:00
[Perf] (MG_Backend/DirectVulkan): skip cross-draw re-sync of unchanged textures via a content-version early-out; SyncTextureAndGetDescriptor 8.9%->2.4%
This commit is contained in:
@@ -207,6 +207,10 @@ namespace MobileGL {
|
||||
return m_textureParamsVersion;
|
||||
}
|
||||
|
||||
Uint64 TextureObjectBase::GetContentVersion() const {
|
||||
return m_contentVersion;
|
||||
}
|
||||
|
||||
Int TextureObjectBase::GetSamples() const {
|
||||
return m_samples;
|
||||
}
|
||||
@@ -257,6 +261,9 @@ namespace MobileGL {
|
||||
|
||||
void TextureObjectWithOneMipmap::MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel,
|
||||
Bool dirty) {
|
||||
if (dirty) {
|
||||
++m_contentVersion;
|
||||
}
|
||||
m_textureStorage.MarkDirty(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, dirty);
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,10 @@ namespace MobileGL::MG_State::GLState {
|
||||
virtual Uint GetImmutableLevels() const = 0;
|
||||
virtual void SetImmutableLevels(Uint levels) = 0;
|
||||
virtual Uint16 GetTextureParamsVersion() const = 0;
|
||||
// Monotonic counter bumped on every CPU-side pixel mutation (see MarkStorageDirty).
|
||||
// Backends compare it against a per-resource snapshot to skip re-syncing unchanged
|
||||
// textures across draws (e.g. the block atlas bound across a whole terrain batch).
|
||||
virtual Uint64 GetContentVersion() const = 0;
|
||||
virtual Int GetSamples() const = 0;
|
||||
virtual void SetSamples(Int samples) = 0;
|
||||
virtual Bool HasFixedSampleLocations() const = 0;
|
||||
@@ -86,6 +90,7 @@ namespace MobileGL::MG_State::GLState {
|
||||
Uint GetImmutableLevels() const override;
|
||||
void SetImmutableLevels(Uint levels) override;
|
||||
Uint16 GetTextureParamsVersion() const override;
|
||||
Uint64 GetContentVersion() const override;
|
||||
Int GetSamples() const override;
|
||||
void SetSamples(Int samples) override;
|
||||
Bool HasFixedSampleLocations() const override;
|
||||
@@ -108,6 +113,9 @@ namespace MobileGL::MG_State::GLState {
|
||||
UintVec2 m_levelRange = {0, 1000};
|
||||
Uint m_immutableLevels = 0;
|
||||
Uint16 m_textureParamsVersion = 0;
|
||||
// Starts at 1 so a freshly-created backend resource (snapshot 0) never spuriously
|
||||
// matches before its first sync. Bumped only on dirty=true in MarkStorageDirty.
|
||||
Uint64 m_contentVersion = 1;
|
||||
Int m_samples = 0;
|
||||
Bool m_fixedSampleLocations = true;
|
||||
};
|
||||
|
||||
@@ -41,6 +41,9 @@ namespace MobileGL {
|
||||
}
|
||||
|
||||
void TextureObject2DCube::MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, bool dirty) {
|
||||
if (dirty) {
|
||||
++m_contentVersion;
|
||||
}
|
||||
m_textureStorage.MarkDirty(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, dirty);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user