summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <[email protected]>2024-07-01 10:25:00 +0300
committerAntti Määttä <[email protected]>2024-07-08 09:54:00 +0300
commit9c4f41f15fe476b34c3346ff7cf8938a6fc66835 (patch)
treebb4a2f8e8d5b8ba0ba880dff641e4050f8789370
parent2b4ec2230eb21c277d82b80a729f1c8a5e2aee99 (diff)
Fix setting sourcepath with dynamic string handleHEADmaster
The dynamic string handle reference count needs to be incremented when it is set to another property to avoid deleting the string while it is being used. Task-number: QT3DS-4243 Change-Id: Ia3dce428a0c262e587581c7d231dc170ca4e3586 Reviewed-by: Janne Koskinen <[email protected]>
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp13
-rw-r--r--src/foundation/StringTable.cpp6
-rw-r--r--src/foundation/StringTable.h1
3 files changed, 19 insertions, 1 deletions
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
index 7c1700d..6fcb6bc 100644
--- a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
+++ b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
@@ -410,9 +410,20 @@ struct SRuntimePropertyParser
CRegisteredString theTemp;
ParseProperty<Qt3DSRenderDirtyFlags::Unknown>(theTemp);
CRegisteredString theNewStr = theTemp;
+
if (outValue.c_str() != theNewStr.c_str()) {
+ auto &strTable = m_RenderContext.GetStringTable();
SetDirty<TDirtyType>();
- outValue = theNewStr;
+ auto handle = strTable.findDynamicHandle(outValue.c_str());
+ auto newHandle = strTable.findDynamicHandle(theNewStr.c_str());
+ // If the new string is dynamic string, increment the ref count.
+ // Otherwise use the statically registered string directly.
+ if (newHandle)
+ outValue = strTable.HandleToStr(strTable.getDynamicHandle(theNewStr.c_str()));
+ else
+ outValue = theNewStr;
+ // Release ref count from the old string, can call even if the handle is 0.
+ strTable.releaseDynamicHandle(handle);
return true;
}
return false;
diff --git a/src/foundation/StringTable.cpp b/src/foundation/StringTable.cpp
index 7833639..0116ac6 100644
--- a/src/foundation/StringTable.cpp
+++ b/src/foundation/StringTable.cpp
@@ -691,6 +691,12 @@ public:
return CStringHandle::ISwearThisHasBeenRegistered(handle);
}
+ QT3DSU32 findDynamicHandle(const QByteArray &str) override
+ {
+ QT3DSU32 handle = m_dynamicStringToHandleMap.value(str, 0);
+ return handle;
+ }
+
void releaseDynamicHandle(QT3DSU32 strHandle) override
{
DynamicString *str = m_dynamicUsedHandlesMap.value(strHandle);
diff --git a/src/foundation/StringTable.h b/src/foundation/StringTable.h
index 0a25a32..d44d62a 100644
--- a/src/foundation/StringTable.h
+++ b/src/foundation/StringTable.h
@@ -249,6 +249,7 @@ namespace foundation {
virtual CStringHandle GetHandle(Qt3DSBCharPtr str) = 0;
virtual CStringHandle getDynamicHandle(const QByteArray &str) = 0;
+ virtual QT3DSU32 findDynamicHandle(const QByteArray &str) = 0;
virtual void releaseDynamicHandle(QT3DSU32 strHandle) = 0;
virtual CRegisteredString HandleToStr(QT3DSU32 strHandle) = 0;