Merge branch 'master' into Improve-HighlightedPopUpColor

This commit is contained in:
Phantom
2026-03-04 22:33:45 +01:00
12 changed files with 38 additions and 37 deletions

View File

@@ -247,7 +247,7 @@ VariantType::VariantType(VariantType&& other) noexcept
VariantType& VariantType::operator=(const Types& type)
{
Type = type;
if (StaticName)
if (!StaticName)
Allocator::Free(TypeName);
TypeName = nullptr;
StaticName = 0;
@@ -266,7 +266,7 @@ VariantType& VariantType::operator=(const VariantType& other)
{
ASSERT(this != &other);
Type = other.Type;
if (StaticName)
if (!StaticName)
Allocator::Free(TypeName);
StaticName = other.StaticName;
if (StaticName)
@@ -316,7 +316,7 @@ void VariantType::SetTypeName(const StringView& typeName)
{
if (StringUtils::Length(TypeName) != typeName.Length())
{
if (StaticName)
if (!StaticName)
Allocator::Free(TypeName);
StaticName = 0;
TypeName = static_cast<char*>(Allocator::Allocate(typeName.Length() + 1));
@@ -329,7 +329,7 @@ void VariantType::SetTypeName(const StringAnsiView& typeName, bool staticName)
{
if (StringUtils::Length(TypeName) != typeName.Length() || StaticName != staticName)
{
if (StaticName)
if (!StaticName)
Allocator::Free(TypeName);
StaticName = staticName;
if (staticName)

View File

@@ -136,6 +136,15 @@ void CmdBufferVulkan::EndEvent()
#endif
void CmdBufferVulkan::Wait(float timeoutSeconds)
{
PROFILE_CPU();
ASSERT(IsSubmitted());
const bool failed = _device->FenceManager.WaitForFence(GetFence(), timeoutSeconds);
ASSERT(!failed);
RefreshFenceStatus();
}
void CmdBufferVulkan::RefreshFenceStatus()
{
if (_state == State::Submitted)
@@ -186,9 +195,8 @@ CmdBufferVulkan::~CmdBufferVulkan()
auto& fenceManager = _device->FenceManager;
if (_state == State::Submitted)
{
// Wait 60ms
const uint64 waitForCmdBufferInNanoSeconds = 60 * 1000 * 1000LL;
fenceManager.WaitAndReleaseFence(_fence, waitForCmdBufferInNanoSeconds);
// Wait
fenceManager.WaitAndReleaseFence(_fence);
}
else
{
@@ -281,15 +289,6 @@ void CmdBufferManagerVulkan::SubmitActiveCmdBuffer(SemaphoreVulkan* signalSemaph
_activeCmdBuffer = nullptr;
}
void CmdBufferManagerVulkan::WaitForCmdBuffer(CmdBufferVulkan* cmdBuffer, float timeInSecondsToWait)
{
PROFILE_CPU();
ASSERT(cmdBuffer->IsSubmitted());
const bool failed = _device->FenceManager.WaitForFence(cmdBuffer->GetFence(), (uint64)(timeInSecondsToWait * 1e9));
ASSERT(!failed);
cmdBuffer->RefreshFenceStatus();
}
void CmdBufferManagerVulkan::PrepareForNewActiveCommandBuffer()
{
PROFILE_CPU();

View File

@@ -136,6 +136,7 @@ public:
void EndEvent();
#endif
void Wait(float timeoutSeconds = VULKAN_WAIT_TIMEOUT);
void RefreshFenceStatus();
};
@@ -206,7 +207,6 @@ public:
public:
void SubmitActiveCmdBuffer(SemaphoreVulkan* signalSemaphore = nullptr);
void WaitForCmdBuffer(CmdBufferVulkan* cmdBuffer, float timeInSecondsToWait = 1.0f);
void RefreshFenceStatus(CmdBufferVulkan* skipCmdBuffer = nullptr)
{
_pool.RefreshFenceStatus(skipCmdBuffer);

View File

@@ -49,4 +49,9 @@
#define VULKAN_USE_QUERIES 1
#endif
// Fence wait operation timeout in seconds
#ifndef VULKAN_WAIT_TIMEOUT
#define VULKAN_WAIT_TIMEOUT 5.0f
#endif
#endif

View File

@@ -2184,11 +2184,12 @@ FenceVulkan* FenceManagerVulkan::AllocateFence(bool createSignaled)
return fence;
}
bool FenceManagerVulkan::WaitForFence(FenceVulkan* fence, uint64 timeInNanoseconds) const
bool FenceManagerVulkan::WaitForFence(FenceVulkan* fence, float timeoutSeconds) const
{
ASSERT(_usedFences.Contains(fence));
ASSERT(!fence->IsSignaled);
const VkResult result = vkWaitForFences(_device->Device, 1, &fence->Handle, true, timeInNanoseconds);
uint64 timeNanoseconds = (uint64)((double)timeoutSeconds * 1000000000.0);
const VkResult result = vkWaitForFences(_device->Device, 1, &fence->Handle, true, timeNanoseconds);
LOG_VULKAN_RESULT(result);
if (result == VK_SUCCESS)
{
@@ -2216,11 +2217,11 @@ void FenceManagerVulkan::ReleaseFence(FenceVulkan*& fence)
fence = nullptr;
}
void FenceManagerVulkan::WaitAndReleaseFence(FenceVulkan*& fence, uint64 timeInNanoseconds)
void FenceManagerVulkan::WaitAndReleaseFence(FenceVulkan*& fence, float timeoutSeconds)
{
ScopeLock lock(_device->_fenceLock);
if (!fence->IsSignaled)
WaitForFence(fence, timeInNanoseconds);
WaitForFence(fence, timeoutSeconds);
ResetFence(fence);
_usedFences.Remove(fence);
_freeFences.Add(fence);

View File

@@ -88,7 +88,7 @@ public:
}
// Returns true if waiting timed out or failed, false otherwise.
bool WaitForFence(FenceVulkan* fence, uint64 timeInNanoseconds) const;
bool WaitForFence(FenceVulkan* fence, float timeoutSeconds = VULKAN_WAIT_TIMEOUT) const;
void ResetFence(FenceVulkan* fence) const;
@@ -96,7 +96,7 @@ public:
void ReleaseFence(FenceVulkan*& fence);
// Sets the fence handle to null
void WaitAndReleaseFence(FenceVulkan*& fence, uint64 timeInNanoseconds);
void WaitAndReleaseFence(FenceVulkan*& fence, float timeoutSeconds = VULKAN_WAIT_TIMEOUT);
private:
// Returns true if fence was signaled, otherwise false.

View File

@@ -62,11 +62,7 @@ void QueueVulkan::Submit(CmdBufferVulkan* cmdBuffer, uint32 signalSemaphoresCoun
const bool WaitForIdleOnSubmit = false;
if (WaitForIdleOnSubmit)
{
// Use 200ms timeout
bool success = _device->FenceManager.WaitForFence(fence, 200 * 1000 * 1000);
ASSERT(success);
ASSERT(_device->FenceManager.IsFenceSignaled(fence));
cmdBuffer->GetOwner()->RefreshFenceStatus();
cmdBuffer->Wait();
}
#endif

View File

@@ -2450,7 +2450,7 @@ void PhysicsBackend::SetRigidActorPose(void* actor, const Vector3& position, con
if (kinematic)
{
auto actorPhysX = (PxRigidDynamic*)actor;
if (actorPhysX->getActorFlags() & PxActorFlag::eDISABLE_SIMULATION)
if (actorPhysX->getActorFlags() & PxActorFlag::eDISABLE_SIMULATION || !(actorPhysX->getRigidBodyFlags() & PxRigidBodyFlag::eKINEMATIC))
{
// Ensures the disabled kinematic actor ends up in the correct pose after enabling simulation
actorPhysX->setGlobalPose(trans, wakeUp);

View File

@@ -437,8 +437,8 @@ namespace FlaxEngine.GUI
// Caret
if (IsFocused && CaretPosition > -1)
{
float alpha = Mathf.Saturate(Mathf.Cos(_animateTime * CaretFlashSpeed) * 0.5f + 0.7f);
alpha = alpha * alpha * alpha * alpha * alpha * alpha;
float alpha = Mathf.Saturate(Mathf.Cos(_animateTime * CaretFlashSpeed) * 0.5f + 0.8f);
alpha = alpha * alpha;
Render2D.FillRectangle(CaretBounds, CaretColor * alpha);
}

View File

@@ -310,8 +310,8 @@ namespace FlaxEngine.GUI
// Caret
if (IsFocused && CaretPosition > -1)
{
float alpha = Mathf.Saturate(Mathf.Cos(_animateTime * CaretFlashSpeed) * 0.5f + 0.7f);
alpha = alpha * alpha * alpha * alpha * alpha * alpha;
float alpha = Mathf.Saturate(Mathf.Cos(_animateTime * CaretFlashSpeed) * 0.5f + 0.8f);
alpha = alpha * alpha;
Render2D.FillRectangle(CaretBounds, CaretColor * alpha);
}

View File

@@ -275,7 +275,7 @@ namespace FlaxEngine.GUI
/// Gets or sets the speed of the caret flashing animation.
/// </summary>
[EditorDisplay("Caret Style"), EditorOrder(2021), Tooltip("The speed of the caret flashing animation.")]
public float CaretFlashSpeed { get; set; } = 6.0f;
public float CaretFlashSpeed { get; set; } = 6.5f;
/// <summary>
/// Gets or sets the speed of the selection background flashing animation.

View File

@@ -1300,10 +1300,10 @@ namespace Flax.Build.Bindings
else if (parameterInfo.Type.IsRef && !parameterInfo.Type.IsConst)
{
// Non-const lvalue reference parameters needs to be passed via temporary value
if (parameterInfo.IsOut || parameterInfo.IsRef)
contents.Append(indent).AppendFormat("{2}& {0}Temp = {1};", parameterInfo.Name, param, parameterInfo.Type.ToString(false)).AppendLine();
else
if (parameterInfo.Type.Type is "String" or "StringView" or "StringAnsi" or "StringAnsiView" && parameterInfo.Type.GenericArgs == null)
contents.Append(indent).AppendFormat("{2} {0}Temp = {1};", parameterInfo.Name, param, parameterInfo.Type.ToString(false)).AppendLine();
else
contents.Append(indent).AppendFormat("{2}& {0}Temp = {1};", parameterInfo.Name, param, parameterInfo.Type.ToString(false)).AppendLine();
callParams += parameterInfo.Name;
callParams += "Temp";
}