Merge remote-tracking branch 'origin/master' into 1.6
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||
|
||||
#include "ObjectsRemovalService.h"
|
||||
#include "Utilities.h"
|
||||
#include "Collections/Dictionary.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "Engine/Engine/EngineService.h"
|
||||
@@ -8,6 +9,11 @@
|
||||
#include "Engine/Profiler/ProfilerCPU.h"
|
||||
#include "Engine/Scripting/ScriptingObject.h"
|
||||
|
||||
const Char* BytesSizesData[] = { TEXT("b"), TEXT("Kb"), TEXT("Mb"), TEXT("Gb"), TEXT("Tb"), TEXT("Pb"), TEXT("Eb"), TEXT("Zb"), TEXT("Yb") };
|
||||
const Char* HertzSizesData[] = { TEXT("Hz"), TEXT("KHz"), TEXT("MHz"), TEXT("GHz"), TEXT("THz"), TEXT("PHz"), TEXT("EHz"), TEXT("ZHz"), TEXT("YHz") };
|
||||
Span<const Char*> Utilities::Private::BytesSizes(BytesSizesData, ARRAY_COUNT(BytesSizesData));
|
||||
Span<const Char*> Utilities::Private::HertzSizes(HertzSizesData, ARRAY_COUNT(HertzSizesData));
|
||||
|
||||
namespace ObjectsRemovalServiceImpl
|
||||
{
|
||||
CriticalSection PoolLocker;
|
||||
|
||||
@@ -4,12 +4,19 @@
|
||||
|
||||
#include "Types/BaseTypes.h"
|
||||
#include "Types/String.h"
|
||||
#include "Types/Span.h"
|
||||
#if _MSC_VER && PLATFORM_SIMD_SSE4_2
|
||||
#include <intrin.h>
|
||||
#endif
|
||||
|
||||
namespace Utilities
|
||||
{
|
||||
struct Private
|
||||
{
|
||||
static FLAXENGINE_API Span<const Char*> BytesSizes;
|
||||
static FLAXENGINE_API Span<const Char*> HertzSizes;
|
||||
};
|
||||
|
||||
// Round floating point value up to 1 decimal place
|
||||
template<typename T>
|
||||
FORCE_INLINE T RoundTo1DecimalPlace(T value)
|
||||
@@ -31,20 +38,41 @@ namespace Utilities
|
||||
return (T)round((double)value * 1000.0) / (T)1000;
|
||||
}
|
||||
|
||||
// Converts units to the best fitting human-readable denominator
|
||||
// @param units Units count
|
||||
// @param divider Amount of units required for the next size
|
||||
// @param sizes Array with human-readable sizes to convert from
|
||||
// @return The best fitting string of the units
|
||||
template<typename T>
|
||||
String UnitsToText(T units, int32 divider, const Span<const Char*> sizes)
|
||||
{
|
||||
if (sizes.Length() == 0)
|
||||
return String::Format(TEXT("{0}"), units);
|
||||
int32 i = 0;
|
||||
double dblSUnits = static_cast<double>(units);
|
||||
for (; static_cast<uint64>(units / static_cast<double>(divider)) > 0; i++, units /= divider)
|
||||
dblSUnits = units / static_cast<double>(divider);
|
||||
if (i >= sizes.Length())
|
||||
i = 0;
|
||||
return String::Format(TEXT("{0} {1}"), RoundTo2DecimalPlaces(dblSUnits), sizes[i]);
|
||||
}
|
||||
|
||||
// Converts size of the file (in bytes) to the best fitting string
|
||||
// @param bytes Size of the file in bytes
|
||||
// @return The best fitting string of the file size
|
||||
template<typename T>
|
||||
String BytesToText(T bytes)
|
||||
{
|
||||
static const Char* sizes[] = { TEXT("B"), TEXT("KB"), TEXT("MB"), TEXT("GB"), TEXT("TB") };
|
||||
uint64 i = 0;
|
||||
double dblSByte = static_cast<double>(bytes);
|
||||
for (; static_cast<uint64>(bytes / 1024.0) > 0; i++, bytes /= 1024)
|
||||
dblSByte = bytes / 1024.0;
|
||||
if (i >= ARRAY_COUNT(sizes))
|
||||
return String::Empty;
|
||||
return String::Format(TEXT("{0} {1}"), RoundTo2DecimalPlaces(dblSByte), sizes[i]);
|
||||
return UnitsToText(bytes, 1024, Private::BytesSizes);
|
||||
}
|
||||
|
||||
// Converts hertz to the best fitting string
|
||||
// @param hertz Hertz for convertion
|
||||
// @return The best fitting string
|
||||
template<typename T>
|
||||
String HertzToText(T hertz)
|
||||
{
|
||||
return UnitsToText(hertz, 1000, Private::HertzSizes);
|
||||
}
|
||||
|
||||
// Returns the amount of set bits in 32-bit integer.
|
||||
|
||||
@@ -114,7 +114,15 @@ GPUDevice* GPUDeviceDX11::Create()
|
||||
// Create DXGI factory
|
||||
#if PLATFORM_WINDOWS
|
||||
IDXGIFactory1* dxgiFactory;
|
||||
HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory));
|
||||
IDXGIFactory6* dxgiFactory6;
|
||||
HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory6));
|
||||
if (hr == S_OK)
|
||||
dxgiFactory = dxgiFactory6;
|
||||
else
|
||||
{
|
||||
dxgiFactory6 = nullptr;
|
||||
hr = CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory));
|
||||
}
|
||||
#else
|
||||
IDXGIFactory2* dxgiFactory;
|
||||
HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory));
|
||||
@@ -126,16 +134,17 @@ GPUDevice* GPUDeviceDX11::Create()
|
||||
}
|
||||
|
||||
// Enumerate the DXGIFactory's adapters
|
||||
int32 selectedAdapterIndex = -1;
|
||||
Array<GPUAdapterDX> adapters;
|
||||
IDXGIAdapter* tmpAdapter;
|
||||
for (uint32 index = 0; dxgiFactory->EnumAdapters(index, &tmpAdapter) != DXGI_ERROR_NOT_FOUND; index++)
|
||||
IDXGIAdapter* tempAdapter;
|
||||
for (uint32 index = 0; dxgiFactory->EnumAdapters(index, &tempAdapter) != DXGI_ERROR_NOT_FOUND; index++)
|
||||
{
|
||||
GPUAdapterDX adapter;
|
||||
if (tmpAdapter && TryCreateDevice(tmpAdapter, maxAllowedFeatureLevel, &adapter.MaxFeatureLevel))
|
||||
if (tempAdapter && TryCreateDevice(tempAdapter, maxAllowedFeatureLevel, &adapter.MaxFeatureLevel))
|
||||
{
|
||||
adapter.Index = index;
|
||||
VALIDATE_DIRECTX_RESULT(tmpAdapter->GetDesc(&adapter.Description));
|
||||
uint32 outputs = RenderToolsDX::CountAdapterOutputs(tmpAdapter);
|
||||
VALIDATE_DIRECTX_RESULT(tempAdapter->GetDesc(&adapter.Description));
|
||||
uint32 outputs = RenderToolsDX::CountAdapterOutputs(tempAdapter);
|
||||
|
||||
LOG(Info, "Adapter {1}: '{0}', DirectX {2}", adapter.Description.Description, index, RenderToolsDX::GetFeatureLevelString(adapter.MaxFeatureLevel));
|
||||
LOG(Info, " Dedicated Video Memory: {0}, Dedicated System Memory: {1}, Shared System Memory: {2}, Output(s): {3}", Utilities::BytesToText(adapter.Description.DedicatedVideoMemory), Utilities::BytesToText(adapter.Description.DedicatedSystemMemory), Utilities::BytesToText(adapter.Description.SharedSystemMemory), outputs);
|
||||
@@ -143,14 +152,41 @@ GPUDevice* GPUDeviceDX11::Create()
|
||||
adapters.Add(adapter);
|
||||
}
|
||||
}
|
||||
#if PLATFORM_WINDOWS
|
||||
// Find the best performing adapter and prefer using it instead of the first device
|
||||
const auto gpuPreference = DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE;
|
||||
if (dxgiFactory6 != nullptr && selectedAdapterIndex == -1)
|
||||
{
|
||||
if (dxgiFactory6->EnumAdapterByGpuPreference(0, gpuPreference, IID_PPV_ARGS(&tempAdapter)) != DXGI_ERROR_NOT_FOUND)
|
||||
{
|
||||
GPUAdapterDX adapter;
|
||||
if (tempAdapter && TryCreateDevice(tempAdapter, maxAllowedFeatureLevel, &adapter.MaxFeatureLevel))
|
||||
{
|
||||
DXGI_ADAPTER_DESC desc;
|
||||
VALIDATE_DIRECTX_RESULT(tempAdapter->GetDesc(&desc));
|
||||
for (int i = 0; i < adapters.Count(); i++)
|
||||
{
|
||||
if (adapters[i].Description.AdapterLuid.LowPart == desc.AdapterLuid.LowPart &&
|
||||
adapters[i].Description.AdapterLuid.HighPart == desc.AdapterLuid.HighPart)
|
||||
{
|
||||
selectedAdapterIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Select the adapter to use
|
||||
if (adapters.Count() == 0)
|
||||
if (selectedAdapterIndex < 0)
|
||||
selectedAdapterIndex = 0;
|
||||
if (adapters.Count() == 0 || selectedAdapterIndex >= adapters.Count())
|
||||
{
|
||||
LOG(Error, "Failed to find valid DirectX adapter!");
|
||||
return nullptr;
|
||||
}
|
||||
GPUAdapterDX selectedAdapter = adapters[0];
|
||||
GPUAdapterDX selectedAdapter = adapters[selectedAdapterIndex];
|
||||
uint32 vendorId = 0;
|
||||
if (CommandLine::Options.NVIDIA)
|
||||
vendorId = GPU_VENDOR_ID_NVIDIA;
|
||||
@@ -185,6 +221,15 @@ GPUDevice* GPUDeviceDX11::Create()
|
||||
Delete(device);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#if PLATFORM_WINDOWS
|
||||
if (dxgiFactory6 != nullptr)
|
||||
dxgiFactory6->Release();
|
||||
else
|
||||
#endif
|
||||
{
|
||||
dxgiFactory->Release();
|
||||
}
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
@@ -89,7 +89,15 @@ GPUDevice* GPUDeviceDX12::Create()
|
||||
|
||||
// Create DXGI factory (CreateDXGIFactory2 is supported on Windows 8.1 or newer)
|
||||
IDXGIFactory4* dxgiFactory;
|
||||
HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory));
|
||||
IDXGIFactory6* dxgiFactory6;
|
||||
HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory6));
|
||||
if (hr == S_OK)
|
||||
dxgiFactory = dxgiFactory6;
|
||||
else
|
||||
{
|
||||
dxgiFactory6 = nullptr;
|
||||
hr = CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory));
|
||||
}
|
||||
if (hr != S_OK)
|
||||
{
|
||||
LOG(Error, "Cannot create DXGI adapter. Error code: {0:x}.", hr);
|
||||
@@ -97,6 +105,7 @@ GPUDevice* GPUDeviceDX12::Create()
|
||||
}
|
||||
|
||||
// Enumerate the DXGIFactory's adapters
|
||||
int32 selectedAdapterIndex = -1;
|
||||
Array<GPUAdapterDX> adapters;
|
||||
IDXGIAdapter* tempAdapter;
|
||||
for (uint32 index = 0; dxgiFactory->EnumAdapters(index, &tempAdapter) != DXGI_ERROR_NOT_FOUND; index++)
|
||||
@@ -118,13 +127,39 @@ GPUDevice* GPUDeviceDX12::Create()
|
||||
}
|
||||
}
|
||||
|
||||
// Find the best performing adapter and prefer using it instead of the first device
|
||||
const auto gpuPreference = DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE;
|
||||
if (dxgiFactory6 != nullptr && selectedAdapterIndex == -1)
|
||||
{
|
||||
if (dxgiFactory6->EnumAdapterByGpuPreference(0, gpuPreference, IID_PPV_ARGS(&tempAdapter)) != DXGI_ERROR_NOT_FOUND)
|
||||
{
|
||||
GPUAdapterDX adapter;
|
||||
if (tempAdapter && CheckDX12Support(tempAdapter))
|
||||
{
|
||||
DXGI_ADAPTER_DESC desc;
|
||||
VALIDATE_DIRECTX_RESULT(tempAdapter->GetDesc(&desc));
|
||||
for (int i = 0; i < adapters.Count(); i++)
|
||||
{
|
||||
if (adapters[i].Description.AdapterLuid.LowPart == desc.AdapterLuid.LowPart &&
|
||||
adapters[i].Description.AdapterLuid.HighPart == desc.AdapterLuid.HighPart)
|
||||
{
|
||||
selectedAdapterIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Select the adapter to use
|
||||
if (adapters.Count() == 0)
|
||||
if (selectedAdapterIndex < 0)
|
||||
selectedAdapterIndex = 0;
|
||||
if (adapters.Count() == 0 || selectedAdapterIndex >= adapters.Count())
|
||||
{
|
||||
LOG(Error, "Failed to find valid DirectX adapter!");
|
||||
return nullptr;
|
||||
}
|
||||
GPUAdapterDX selectedAdapter = adapters[0];
|
||||
GPUAdapterDX selectedAdapter = adapters[selectedAdapterIndex];
|
||||
uint32 vendorId = 0;
|
||||
if (CommandLine::Options.NVIDIA)
|
||||
vendorId = GPU_VENDOR_ID_NVIDIA;
|
||||
@@ -167,6 +202,15 @@ GPUDevice* GPUDeviceDX12::Create()
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#if !(PLATFORM_XBOX_SCARLETT || PLATFORM_XBOX_ONE)
|
||||
if (dxgiFactory6 != nullptr)
|
||||
dxgiFactory6->Release();
|
||||
else
|
||||
#endif
|
||||
{
|
||||
dxgiFactory->Release();
|
||||
}
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,9 +40,11 @@ typedef IGraphicsUnknown IDXGISwapChain3;
|
||||
#include <d3d11_1.h>
|
||||
#include <dxgi1_3.h>
|
||||
#include <dxgi1_5.h>
|
||||
#include <dxgi1_6.h>
|
||||
#endif
|
||||
#if GRAPHICS_API_DIRECTX12
|
||||
#include <dxgi1_5.h>
|
||||
#include <dxgi1_6.h>
|
||||
#endif
|
||||
|
||||
#pragma comment(lib, "DXGI.lib")
|
||||
|
||||
@@ -1155,6 +1155,7 @@ GPUDevice* GPUDeviceVulkan::Create()
|
||||
#endif
|
||||
|
||||
// Enumerate all GPU devices and pick one
|
||||
int32 selectedAdapterIndex = -1;
|
||||
uint32 gpuCount = 0;
|
||||
VALIDATE_VULKAN_RESULT(vkEnumeratePhysicalDevices(Instance, &gpuCount, nullptr));
|
||||
if (gpuCount <= 0)
|
||||
@@ -1187,6 +1188,9 @@ GPUDevice* GPUDeviceVulkan::Create()
|
||||
break;
|
||||
case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU:
|
||||
type = TEXT("Discrete GPU");
|
||||
// Select the first discrete GPU device
|
||||
if (selectedAdapterIndex == -1)
|
||||
selectedAdapterIndex = gpuIndex;
|
||||
break;
|
||||
case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU:
|
||||
type = TEXT("Virtual GPU");
|
||||
@@ -1203,12 +1207,13 @@ GPUDevice* GPUDeviceVulkan::Create()
|
||||
}
|
||||
|
||||
// Select the adapter to use
|
||||
if (adapters.Count() == 0)
|
||||
if (selectedAdapterIndex < 0)
|
||||
selectedAdapterIndex = 0;
|
||||
if (adapters.Count() == 0 || selectedAdapterIndex >= adapters.Count())
|
||||
{
|
||||
LOG(Error, "Failed to find valid Vulkan adapter!");
|
||||
return nullptr;
|
||||
}
|
||||
int32 selectedAdapter = 0;
|
||||
uint32 vendorId = 0;
|
||||
if (CommandLine::Options.NVIDIA)
|
||||
vendorId = GPU_VENDOR_ID_NVIDIA;
|
||||
@@ -1222,15 +1227,15 @@ GPUDevice* GPUDeviceVulkan::Create()
|
||||
{
|
||||
if (adapters[i].GetVendorId() == vendorId)
|
||||
{
|
||||
selectedAdapter = i;
|
||||
selectedAdapterIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ASSERT(selectedAdapter != -1 && adapters[selectedAdapter].IsValid());
|
||||
ASSERT(adapters[selectedAdapterIndex].IsValid());
|
||||
|
||||
// Create device
|
||||
auto device = New<GPUDeviceVulkan>(ShaderProfile::Vulkan_SM5, New<GPUAdapterVulkan>(adapters[selectedAdapter]));
|
||||
auto device = New<GPUDeviceVulkan>(ShaderProfile::Vulkan_SM5, New<GPUAdapterVulkan>(adapters[selectedAdapterIndex]));
|
||||
if (device->Init())
|
||||
{
|
||||
LOG(Warning, "Graphics Device init failed");
|
||||
|
||||
@@ -26,9 +26,8 @@ protected:
|
||||
|
||||
public:
|
||||
/// <summary>
|
||||
/// Gets the text entered during the current frame.
|
||||
/// Gets the text entered during the current frame (Unicode format).
|
||||
/// </summary>
|
||||
/// <returns>The input text (Unicode).</returns>
|
||||
API_PROPERTY() StringView GetInputText() const
|
||||
{
|
||||
return StringView(_state.InputText, _state.InputTextLength);
|
||||
|
||||
@@ -58,7 +58,6 @@ public:
|
||||
/// <summary>
|
||||
/// Gets the position of the mouse in the screen-space coordinates.
|
||||
/// </summary>
|
||||
/// <returns>The mouse position</returns>
|
||||
API_PROPERTY() FORCE_INLINE Float2 GetPosition() const
|
||||
{
|
||||
return _state.MousePosition;
|
||||
@@ -72,7 +71,6 @@ public:
|
||||
/// <summary>
|
||||
/// Gets the delta position of the mouse in the screen-space coordinates.
|
||||
/// </summary>
|
||||
/// <returns>The mouse position delta</returns>
|
||||
API_PROPERTY() FORCE_INLINE Float2 GetPositionDelta() const
|
||||
{
|
||||
return _state.MousePosition - _prevState.MousePosition;
|
||||
@@ -81,7 +79,6 @@ public:
|
||||
/// <summary>
|
||||
/// Gets the mouse wheel change during the last frame.
|
||||
/// </summary>
|
||||
/// <returns>Mouse wheel value delta</returns>
|
||||
API_PROPERTY() FORCE_INLINE float GetScrollDelta() const
|
||||
{
|
||||
return _state.MouseWheelDelta;
|
||||
|
||||
@@ -13,22 +13,27 @@ API_INTERFACE(Namespace = "FlaxEngine.Networking") class FLAXENGINE_API INetwork
|
||||
DECLARE_SCRIPTING_TYPE_MINIMAL(INetworkObject);
|
||||
public:
|
||||
/// <summary>
|
||||
/// Event called when network objects gets spawned.
|
||||
/// Event called when network object gets spawned.
|
||||
/// </summary>
|
||||
API_FUNCTION() virtual void OnNetworkSpawn() = 0;
|
||||
API_FUNCTION() virtual void OnNetworkSpawn() {};
|
||||
|
||||
/// <summary>
|
||||
/// Event called when network objects gets despawned.
|
||||
/// Event called when network object gets despawned.
|
||||
/// </summary>
|
||||
API_FUNCTION() virtual void OnNetworkDespawn() = 0;
|
||||
API_FUNCTION() virtual void OnNetworkDespawn() {};
|
||||
|
||||
/// <summary>
|
||||
/// Event called before network object gets replicated (before reading data).
|
||||
/// </summary>
|
||||
API_FUNCTION() virtual void OnNetworkSerialize() = 0;
|
||||
API_FUNCTION() virtual void OnNetworkSerialize() {};
|
||||
|
||||
/// <summary>
|
||||
/// Event called when network objects gets replicated (after reading data).
|
||||
/// Event called when network object gets replicated (after reading data).
|
||||
/// </summary>
|
||||
API_FUNCTION() virtual void OnNetworkDeserialize() = 0;
|
||||
API_FUNCTION() virtual void OnNetworkDeserialize() {};
|
||||
|
||||
/// <summary>
|
||||
/// Event called when network object gets synced (called only once upon initial sync).
|
||||
/// </summary>
|
||||
API_FUNCTION() virtual void OnNetworkSync() {};
|
||||
};
|
||||
|
||||
@@ -109,12 +109,14 @@ struct NetworkReplicatedObject
|
||||
uint32 LastOwnerFrame = 0;
|
||||
NetworkObjectRole Role;
|
||||
uint8 Spawned : 1;
|
||||
uint8 Synced : 1;
|
||||
DataContainer<uint32> TargetClientIds;
|
||||
INetworkObject* AsNetworkObject;
|
||||
|
||||
NetworkReplicatedObject()
|
||||
{
|
||||
Spawned = 0;
|
||||
Synced = 0;
|
||||
}
|
||||
|
||||
bool operator==(const NetworkReplicatedObject& other) const
|
||||
@@ -637,7 +639,14 @@ void InvokeObjectReplication(NetworkReplicatedObject& item, uint32 ownerFrame, b
|
||||
}
|
||||
|
||||
if (item.AsNetworkObject)
|
||||
{
|
||||
item.AsNetworkObject->OnNetworkDeserialize();
|
||||
if (!item.Synced)
|
||||
{
|
||||
item.Synced = true;
|
||||
item.AsNetworkObject->OnNetworkSync();
|
||||
}
|
||||
}
|
||||
|
||||
// Speed up replication of client-owned objects to other clients from server to reduce lag (data has to go from client to server and then to other clients)
|
||||
if (NetworkManager::IsServer())
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "Engine/Platform/MemoryStats.h"
|
||||
#include "Engine/Platform/MessageBox.h"
|
||||
#include "Engine/Platform/FileSystem.h"
|
||||
#include "Engine/Platform/Window.h"
|
||||
#include "Engine/Platform/User.h"
|
||||
#include "Engine/Core/Log.h"
|
||||
#include "Engine/Core/Types/DateTime.h"
|
||||
@@ -157,7 +158,7 @@ void PlatformBase::LogInfo()
|
||||
LOG(Info, "CPU package count: {0}, Core count: {1}, Logical processors: {2}", cpuInfo.ProcessorPackageCount, cpuInfo.ProcessorCoreCount, cpuInfo.LogicalProcessorCount);
|
||||
LOG(Info, "CPU Page size: {0}, cache line size: {1} bytes", Utilities::BytesToText(cpuInfo.PageSize), cpuInfo.CacheLineSize);
|
||||
LOG(Info, "L1 cache: {0}, L2 cache: {1}, L3 cache: {2}", Utilities::BytesToText(cpuInfo.L1CacheSize), Utilities::BytesToText(cpuInfo.L2CacheSize), Utilities::BytesToText(cpuInfo.L3CacheSize));
|
||||
LOG(Info, "Clock speed: {0} GHz", Utilities::RoundTo2DecimalPlaces(cpuInfo.ClockSpeed * 1e-9f));
|
||||
LOG(Info, "Clock speed: {0}", Utilities::HertzToText(cpuInfo.ClockSpeed));
|
||||
|
||||
const MemoryStats memStats = Platform::GetMemoryStats();
|
||||
LOG(Info, "Physical Memory: {0} total, {1} used ({2}%)", Utilities::BytesToText(memStats.TotalPhysicalMemory), Utilities::BytesToText(memStats.UsedPhysicalMemory), Utilities::RoundTo2DecimalPlaces((float)memStats.UsedPhysicalMemory * 100.0f / (float)memStats.TotalPhysicalMemory));
|
||||
@@ -520,6 +521,21 @@ void PlatformBase::CreateGuid(Guid& result)
|
||||
result = Guid(dateThingHigh, randomThing | (sequentialThing << 16), cyclesThing, dateThingLow);
|
||||
}
|
||||
|
||||
Float2 PlatformBase::GetMousePosition()
|
||||
{
|
||||
const Window* win = Engine::MainWindow;
|
||||
if (win)
|
||||
return win->ClientToScreen(win->GetMousePosition());
|
||||
return Float2::Minimum;
|
||||
}
|
||||
|
||||
void PlatformBase::SetMousePosition(const Float2& position)
|
||||
{
|
||||
const Window* win = Engine::MainWindow;
|
||||
if (win)
|
||||
win->SetMousePosition(win->ScreenToClient(position));
|
||||
}
|
||||
|
||||
Rectangle PlatformBase::GetMonitorBounds(const Float2& screenPos)
|
||||
{
|
||||
return Rectangle(Float2::Zero, Platform::GetDesktopSize());
|
||||
|
||||
@@ -651,6 +651,18 @@ public:
|
||||
API_FUNCTION() static void OpenUrl(const StringView& url) = delete;
|
||||
|
||||
public:
|
||||
/// <summary>
|
||||
/// Gets the mouse cursor position in screen-space coordinates.
|
||||
/// </summary>
|
||||
/// <returns>Mouse cursor coordinates.</returns>
|
||||
API_PROPERTY() static Float2 GetMousePosition();
|
||||
|
||||
/// <summary>
|
||||
/// Sets the mouse cursor position in screen-space coordinates.
|
||||
/// </summary>
|
||||
/// <param name="position">Cursor position to set.</param>
|
||||
API_PROPERTY() static void SetMousePosition(const Float2& position);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the origin position and size of the monitor at the given screen-space location.
|
||||
/// </summary>
|
||||
|
||||
@@ -89,6 +89,7 @@ X11::Cursor Cursors[(int32)CursorType::MAX];
|
||||
X11::XcursorImage* CursorsImg[(int32)CursorType::MAX];
|
||||
Dictionary<StringAnsi, X11::KeyCode> KeyNameMap;
|
||||
Array<KeyboardKeys> KeyCodeMap;
|
||||
Delegate<void*> LinuxPlatform::xEventRecieved;
|
||||
|
||||
// Message boxes configuration
|
||||
#define LINUX_DIALOG_MIN_BUTTON_WIDTH 64
|
||||
@@ -2232,10 +2233,12 @@ void LinuxPlatform::Tick()
|
||||
{
|
||||
X11::XEvent event;
|
||||
X11::XNextEvent(xDisplay, &event);
|
||||
|
||||
if (X11::XFilterEvent(&event, 0))
|
||||
continue;
|
||||
|
||||
// External event handling
|
||||
xEventRecieved(&event);
|
||||
|
||||
LinuxWindow* window;
|
||||
switch (event.type)
|
||||
{
|
||||
@@ -2640,10 +2643,8 @@ Float2 LinuxPlatform::GetMousePosition()
|
||||
{
|
||||
if (!xDisplay)
|
||||
return Float2::Zero;
|
||||
|
||||
int32 x, y;
|
||||
int32 x = 0, y = 0;
|
||||
uint32 screenCount = (uint32)X11::XScreenCount(xDisplay);
|
||||
|
||||
for (uint32 i = 0; i < screenCount; i++)
|
||||
{
|
||||
X11::Window outRoot, outChild;
|
||||
@@ -2652,7 +2653,6 @@ Float2 LinuxPlatform::GetMousePosition()
|
||||
if (X11::XQueryPointer(xDisplay, X11::XRootWindow(xDisplay, i), &outRoot, &outChild, &x, &y, &childX, &childY, &mask))
|
||||
break;
|
||||
}
|
||||
|
||||
return Float2((float)x, (float)y);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,11 @@ public:
|
||||
/// <returns>The user home directory.</returns>
|
||||
static const String& GetHomeDirectory();
|
||||
|
||||
/// <summary>
|
||||
/// An event that is fired when an XEvent is received during platform tick.
|
||||
/// </summary>
|
||||
static Delegate<void*> xEventRecieved;
|
||||
|
||||
public:
|
||||
|
||||
// [UnixPlatform]
|
||||
|
||||
@@ -158,27 +158,6 @@ void UWPPlatform::OpenUrl(const StringView& url)
|
||||
// TODO: add support for OpenUrl on UWP
|
||||
}
|
||||
|
||||
Float2 UWPPlatform::GetMousePosition()
|
||||
{
|
||||
// Use the main window
|
||||
auto win = Engine::MainWindow;
|
||||
if (win)
|
||||
{
|
||||
return win->ClientToScreen(win->GetMousePosition());
|
||||
}
|
||||
return Float2::Minimum;
|
||||
}
|
||||
|
||||
void UWPPlatform::SetMousePosition(const Float2& pos)
|
||||
{
|
||||
// Use the main window
|
||||
auto win = Engine::MainWindow;
|
||||
if (win)
|
||||
{
|
||||
win->SetMousePosition(win->ScreenToClient(pos));
|
||||
}
|
||||
}
|
||||
|
||||
Float2 UWPPlatform::GetDesktopSize()
|
||||
{
|
||||
Float2 result;
|
||||
|
||||
@@ -37,8 +37,6 @@ public:
|
||||
static bool GetHasFocus();
|
||||
static bool CanOpenUrl(const StringView& url);
|
||||
static void OpenUrl(const StringView& url);
|
||||
static Float2 GetMousePosition();
|
||||
static void SetMousePosition(const Float2& pos);
|
||||
static Float2 GetDesktopSize();
|
||||
static Window* CreateWindow(const CreateWindowSettings& settings);
|
||||
static void* LoadLibrary(const Char* filename);
|
||||
|
||||
@@ -109,7 +109,7 @@ public:
|
||||
static void CreateGuid(Guid& result);
|
||||
static String GetMainDirectory();
|
||||
static String GetExecutableFilePath();
|
||||
static struct Guid GetUniqueDeviceId();
|
||||
static Guid GetUniqueDeviceId();
|
||||
static String GetWorkingDirectory();
|
||||
static bool SetWorkingDirectory(const String& path);
|
||||
static void FreeLibrary(void* handle);
|
||||
|
||||
@@ -830,6 +830,18 @@ void WindowsPlatform::OpenUrl(const StringView& url)
|
||||
::ShellExecuteW(nullptr, TEXT("open"), *url, nullptr, nullptr, SW_SHOWNORMAL);
|
||||
}
|
||||
|
||||
Float2 WindowsPlatform::GetMousePosition()
|
||||
{
|
||||
POINT cursorPos;
|
||||
GetCursorPos(&cursorPos);
|
||||
return Float2((float)cursorPos.x, (float)cursorPos.y);
|
||||
}
|
||||
|
||||
void WindowsPlatform::SetMousePosition(const Float2& pos)
|
||||
{
|
||||
::SetCursorPos((int)pos.X, (int)pos.Y);
|
||||
}
|
||||
|
||||
struct GetMonitorBoundsData
|
||||
{
|
||||
Float2 Pos;
|
||||
|
||||
@@ -71,6 +71,8 @@ public:
|
||||
static bool GetHasFocus();
|
||||
static bool CanOpenUrl(const StringView& url);
|
||||
static void OpenUrl(const StringView& url);
|
||||
static Float2 GetMousePosition();
|
||||
static void SetMousePosition(const Float2& pos);
|
||||
static Rectangle GetMonitorBounds(const Float2& screenPos);
|
||||
static Float2 GetDesktopSize();
|
||||
static Rectangle GetVirtualDesktopBounds();
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
#include "Engine/Graphics/GPUResourceProperty.h"
|
||||
#include "Engine/Graphics/GPUDevice.h"
|
||||
#include "Engine/Graphics/GPUSwapChain.h"
|
||||
#include "Engine/Engine/Engine.h"
|
||||
#include "Engine/Threading/ThreadPoolTask.h"
|
||||
#include "Engine/Engine/Globals.h"
|
||||
#if COMPILE_WITH_TEXTURE_TOOL
|
||||
|
||||
Reference in New Issue
Block a user