Compare commits

..

3 Commits

21 changed files with 1315 additions and 527 deletions

View File

@@ -227,6 +227,10 @@
<CustomBuild Include="src\UnitTest\RunUnitTests.cpp" /> <CustomBuild Include="src\UnitTest\RunUnitTests.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="include\Graphics\MeshRenderer.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\Graphics\MeshRenderer.cpp" />
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<ProjectGuid>{ab9c7e88-6c94-4f93-bc2a-7f5284b7d434}</ProjectGuid> <ProjectGuid>{ab9c7e88-6c94-4f93-bc2a-7f5284b7d434}</ProjectGuid>

View File

@@ -98,6 +98,34 @@ namespace Juliet
} }
} }
void PushBack(const Type* buffer, size_t amount)
{
Assert(Arena);
if (Count + amount > Capacity)
{
if (Capacity == 0 && Count + amount < ReserveSize)
{
Reserve(ReserveSize);
}
else
{
size_t newCapacity = Max(Capacity * 2, AlignPow2(Capacity + amount, AlignOf(Type)));
Reserve(newCapacity);
}
}
Type* dst = Data + Count;
MemCopy(dst, buffer, amount * sizeof(Type));
if (Count == 0)
{
DataFirst = dst;
}
DataLast = dst + amount;
Count += amount;
}
void PushBack(const Type& value) void PushBack(const Type& value)
{ {
Assert(Arena); Assert(Arena);
@@ -172,6 +200,8 @@ namespace Juliet
Capacity = 0; Capacity = 0;
} }
bool IsEmpty() const { return Count == 0; }
// C++ Accessors for loop supports and Index based access // C++ Accessors for loop supports and Index based access
Type& operator[](size_t index) { return DataFirst[index]; } Type& operator[](size_t index) { return DataFirst[index]; }
const Type& operator[](size_t index) const { return DataFirst[index]; } const Type& operator[](size_t index) const { return DataFirst[index]; }

View File

@@ -22,6 +22,7 @@ namespace Juliet
extern void JULIET_API LogScopeEnd(); extern void JULIET_API LogScopeEnd();
extern void JULIET_API Log(LogLevel level, LogCategory category, const char* fmt, ...); extern void JULIET_API Log(LogLevel level, LogCategory category, const char* fmt, ...);
extern void JULIET_API LogDebug(LogCategory category, const char* fmt, ...);
extern void JULIET_API LogMessage(LogCategory category, const char* fmt, ...); extern void JULIET_API LogMessage(LogCategory category, const char* fmt, ...);
extern void JULIET_API LogWarning(LogCategory category, const char* fmt, ...); extern void JULIET_API LogWarning(LogCategory category, const char* fmt, ...);
extern void JULIET_API LogError(LogCategory category, const char* fmt, ...); extern void JULIET_API LogError(LogCategory category, const char* fmt, ...);

View File

@@ -4,9 +4,10 @@ namespace Juliet
{ {
enum class LogLevel : uint8 enum class LogLevel : uint8
{ {
Message = 0, Debug = 0,
Warning = 1, Message = 1,
Error = 2, Warning = 2,
Error = 3,
}; };
enum class LogCategory : uint8 enum class LogCategory : uint8
@@ -15,7 +16,7 @@ namespace Juliet
Graphics = 1, Graphics = 1,
Networking = 2, Networking = 2,
Engine = 3, Engine = 3,
Tool = 4, Tool = 4,
Game = 5, Game = 5,
}; };
} // namespace Juliet } // namespace Juliet

View File

@@ -11,18 +11,10 @@ namespace Juliet
struct Mesh struct Mesh
{ {
Vertex* Vertices;
uint16* Indices;
size_t VertexCount; size_t VertexCount;
size_t IndexCount; size_t IndexCount;
index_t VertexOffset; index_t VertexOffset;
index_t IndexOffset; index_t IndexOffset;
index_t IndexByteOffset;
}; };
JULIET_API Mesh* CreateCubeMesh(NonNullPtr<Arena> arena);
JULIET_API Mesh* CreateQuadMesh(NonNullPtr<Arena> arena);
JULIET_API void DestroyMesh(NonNullPtr<Mesh> mesh);
} // namespace Juliet } // namespace Juliet

View File

@@ -0,0 +1,63 @@
#pragma once
#include <Core/Container/Vector.h>
#include <Core/Math/Matrix.h>
#include <Graphics/VertexData.h>
#include <Juliet.h>
namespace Juliet
{
struct GraphicsTransferBuffer;
struct RenderPass;
struct CommandList;
struct GraphicsBuffer;
struct Window;
struct GraphicsPipeline;
struct GraphicsDevice;
struct Mesh;
using MeshID = index_t;
constexpr size_t kGeometryPage = Megabytes(64);
constexpr size_t kIndexPage = Megabytes(32);
constexpr size_t kDefaultMeshNumber = 500;
constexpr size_t kDefaultVertexCount = 2'000'000; // Fit less than one geometry page
constexpr size_t kDefaultIndexCount = 16'000'000; // Fit less than one index page
struct MeshRenderer
{
// Note we prevent realloc for now.
VectorArena<Mesh, kDefaultMeshNumber, false> Meshes;
VectorArena<Vertex, kDefaultVertexCount, false> Vertices;
VectorArena<Index, kDefaultIndexCount, false> Indices;
GraphicsBuffer* VertexBuffer;
GraphicsBuffer* IndexBuffer;
GraphicsTransferBuffer* StreamCopyBuffer;
GraphicsTransferBuffer* LoadCopyBuffer;
GraphicsDevice* Device;
GraphicsPipeline* Pipeline;
};
struct PushData
{
Matrix ViewProjection;
uint32 BufferIndex;
};
[[nodiscard]] JULIET_API bool InitializeMeshRenderer(NonNullPtr<Arena> arena, NonNullPtr<GraphicsDevice> device,
NonNullPtr<Window> window);
JULIET_API void ShutdownMeshRenderer();
JULIET_API void LoadMeshesOnGPU(NonNullPtr<CommandList> cmdList);
JULIET_API void RenderMeshes(NonNullPtr<RenderPass> pass, NonNullPtr<CommandList> cmdList, PushData& pushData);
// Utils
[[nodiscard]] JULIET_API MeshID AddCube();
[[nodiscard]] JULIET_API MeshID AddQuad();
#if ALLOW_SHADER_HOT_RELOAD
JULIET_API void ReloadMeshRendererShaders();
#endif
} // namespace Juliet

View File

@@ -7,4 +7,6 @@ namespace Juliet
float Position[3]; float Position[3];
float Color[4]; float Color[4];
}; };
using Index = uint16;
} // namespace Juliet } // namespace Juliet

View File

@@ -28,6 +28,9 @@ namespace Juliet
}; };
DECLARE_QUEUE(LogsEntry); DECLARE_QUEUE(LogsEntry);
// TODO: Debug level per category
const bool kPrintDebugLog = false;
// A log scope accumulates log until end of scope. // A log scope accumulates log until end of scope.
// Can be used to accumulate then write in a log file each frame. // Can be used to accumulate then write in a log file each frame.
struct LogScope struct LogScope
@@ -133,6 +136,11 @@ namespace Juliet
void Log(LogLevel level, LogCategory category, const char* fmt, va_list args) void Log(LogLevel level, LogCategory category, const char* fmt, va_list args)
{ {
if (level == LogLevel::Debug && kPrintDebugLog == false)
{
return;
}
// TODO : Revisit, copy from https://github.com/Eclmist/Ether/blob/develop/src/common/logging/loggingmanager.cpp // TODO : Revisit, copy from https://github.com/Eclmist/Ether/blob/develop/src/common/logging/loggingmanager.cpp
char formattedBuffer[4096]; char formattedBuffer[4096];
@@ -163,6 +171,14 @@ namespace Juliet
va_end(args); va_end(args);
} }
void LogDebug(LogCategory category, const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
Log(LogLevel::Debug, category, fmt, args);
va_end(args);
}
void LogMessage(LogCategory category, const char* fmt, ...) void LogMessage(LogCategory category, const char* fmt, ...)
{ {
va_list args; va_list args;

View File

@@ -113,10 +113,10 @@ namespace Juliet::D3D12
{ {
heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD; heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD;
heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS; heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS;
initialState = D3D12_RESOURCE_STATE_GENERIC_READ;
} }
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
initialState = D3D12_RESOURCE_STATE_GENERIC_READ;
break; break;
} }
@@ -142,10 +142,10 @@ namespace Juliet::D3D12
{ {
heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD; heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD;
heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS; heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS;
initialState = D3D12_RESOURCE_STATE_GENERIC_READ;
} }
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
initialState = D3D12_RESOURCE_STATE_GENERIC_READ;
break; break;
} }
} }

View File

@@ -246,7 +246,8 @@ namespace Juliet::D3D12
d3d12Driver->GraphicsQueue->ExecuteCommandLists(1, ppCommandLists); d3d12Driver->GraphicsQueue->ExecuteCommandLists(1, ppCommandLists);
// Acquire a fence and set it to the in-flight fence // Acquire a fence and set it to the in-flight fence
d3d12CommandList->InFlightFence = Internal::AcquireFence(d3d12Driver); d3d12CommandList->InFlightFence =
Internal::AcquireFence(d3d12Driver JULIET_DEBUG_PARAM(ConstString("SubmitCommandLists")));
if (!d3d12CommandList->InFlightFence) if (!d3d12CommandList->InFlightFence)
{ {
return false; return false;
@@ -305,14 +306,22 @@ namespace Juliet::D3D12
windowData->WindowFrameCounter = (windowData->WindowFrameCounter + 1) % d3d12Driver->FramesInFlight; windowData->WindowFrameCounter = (windowData->WindowFrameCounter + 1) % d3d12Driver->FramesInFlight;
} }
// TODO : Correctly clean up and destroy
// Check for cleanups // Check for cleanups
for (int32 i = d3d12Driver->SubmittedCommandListCount - 1; i >= 0; i -= 1)
{ {
uint64 fenceValue = d3d12Driver->SubmittedCommandLists[i]->InFlightFence->Handle->GetCompletedValue(); int32 i = 0;
if (fenceValue == D3D12_FENCE_SIGNAL_VALUE) while (i < d3d12Driver->SubmittedCommandListCount)
{ {
success &= Internal::CleanCommandList(d3d12Driver, d3d12Driver->SubmittedCommandLists[i], false); uint64 fenceValue = d3d12Driver->SubmittedCommandLists[i]->InFlightFence->Handle->GetCompletedValue();
if (fenceValue == D3D12_FENCE_SIGNAL_VALUE)
{
success &= Internal::CleanCommandList(d3d12Driver, d3d12Driver->SubmittedCommandLists[i], false);
// CleanCommandList swaps [i] with last and decrements count.
// Don't increment — re-check the swapped-in element.
}
else
{
i += 1;
}
} }
} }
@@ -487,7 +496,8 @@ namespace Juliet::D3D12
// Release Fence if needed // Release Fence if needed
if (commandList->AutoReleaseFence) if (commandList->AutoReleaseFence)
{ {
ReleaseFence(driver.Get(), reinterpret_cast<Fence*>(commandList->InFlightFence)); ReleaseFence(driver.Get(), reinterpret_cast<Fence*>(commandList->InFlightFence)
JULIET_DEBUG_PARAM(ConstString("CleanCommandList")));
commandList->InFlightFence = nullptr; commandList->InFlightFence = nullptr;
} }
@@ -510,6 +520,7 @@ namespace Juliet::D3D12
{ {
driver->SubmittedCommandLists[idx] = driver->SubmittedCommandLists[driver->SubmittedCommandListCount - 1]; driver->SubmittedCommandLists[idx] = driver->SubmittedCommandLists[driver->SubmittedCommandListCount - 1];
driver->SubmittedCommandListCount -= 1; driver->SubmittedCommandListCount -= 1;
break;
} }
} }
} }

View File

@@ -604,7 +604,8 @@ namespace Juliet::D3D12
{ {
if (windowData->InFlightFences[idx] != nullptr) if (windowData->InFlightFences[idx] != nullptr)
{ {
ReleaseFence(driver, windowData->InFlightFences[idx]); ReleaseFence(driver,
windowData->InFlightFences[idx] JULIET_DEBUG_PARAM(ConstString("DeatchFromWindow")));
windowData->InFlightFences[idx] = nullptr; windowData->InFlightFences[idx] = nullptr;
} }
} }

View File

@@ -140,7 +140,8 @@ namespace Juliet::D3D12
{ {
// Wait until the fence for the frame is signaled. // Wait until the fence for the frame is signaled.
// In VSYNC this means waiting that the least recent presented frame is done // In VSYNC this means waiting that the least recent presented frame is done
if (!Wait(driver, true, &windowData->InFlightFences[windowData->WindowFrameCounter], 1)) if (!Wait(driver, true, &windowData->InFlightFences[windowData->WindowFrameCounter],
1 JULIET_DEBUG_PARAM(ConstString("AcquireSwapChainTexture"))))
{ {
return false; return false;
} }
@@ -155,7 +156,8 @@ namespace Juliet::D3D12
} }
} }
ReleaseFence(driver, windowData->InFlightFences[windowData->WindowFrameCounter]); ReleaseFence(driver, windowData->InFlightFences[windowData->WindowFrameCounter] JULIET_DEBUG_PARAM(
ConstString("AcquireSwapChainTexture")));
windowData->InFlightFences[windowData->WindowFrameCounter] = nullptr; windowData->InFlightFences[windowData->WindowFrameCounter] = nullptr;
} }
@@ -219,7 +221,8 @@ namespace Juliet::D3D12
if (windowData->InFlightFences[windowData->WindowFrameCounter] != nullptr) if (windowData->InFlightFences[windowData->WindowFrameCounter] != nullptr)
{ {
if (!Wait(d3d12Driver, true, &windowData->InFlightFences[windowData->WindowFrameCounter], 1)) if (!Wait(d3d12Driver, true, &windowData->InFlightFences[windowData->WindowFrameCounter],
1 JULIET_DEBUG_PARAM(ConstString("WaitForSwapchain"))))
{ {
return false; return false;
} }

View File

@@ -17,16 +17,21 @@ namespace Juliet::D3D12
driver->AvailableFenceCapacity = driver->AvailableFenceCapacity * 2; driver->AvailableFenceCapacity = driver->AvailableFenceCapacity * 2;
driver->AvailableFences = static_cast<D3D12Fence**>( driver->AvailableFences = static_cast<D3D12Fence**>(
Realloc(driver->AvailableFences, sizeof(D3D12Fence*) * driver->AvailableFenceCapacity)); Realloc(driver->AvailableFences, sizeof(D3D12Fence*) * driver->AvailableFenceCapacity));
LogDebug(LogCategory::Graphics, "ReleaseFenceToPool With Realloc");
} }
driver->AvailableFences[driver->AvailableFenceCount] = fence; driver->AvailableFences[driver->AvailableFenceCount] = fence;
driver->AvailableFenceCount += 1; driver->AvailableFenceCount += 1;
LogDebug(LogCategory::Graphics, "ReleaseFenceToPool %x fence. Handle %x | Event %x | Refcount %d",
fence.Get(), fence->Handle, fence->Event, fence->ReferenceCount);
} }
} // namespace } // namespace
bool WaitUntilGPUIsIdle(NonNullPtr<GPUDriver> driver) bool WaitUntilGPUIsIdle(NonNullPtr<GPUDriver> driver)
{ {
auto d3d12driver = static_cast<D3D12Driver*>(driver.Get()); auto d3d12driver = static_cast<D3D12Driver*>(driver.Get());
D3D12Fence* fence = Internal::AcquireFence(d3d12driver); D3D12Fence* fence = Internal::AcquireFence(d3d12driver JULIET_DEBUG_PARAM(ConstString("WaitUntilGPUIsIdle")));
if (!fence) if (!fence)
{ {
return false; return false;
@@ -56,14 +61,19 @@ namespace Juliet::D3D12
} }
} }
ReleaseFence(driver, reinterpret_cast<Fence*>(fence)); ReleaseFence(driver, reinterpret_cast<Fence*>(fence) JULIET_DEBUG_PARAM(ConstString("WaitUntilGPUIsIdle")));
bool result = true; bool result = true;
// Clean up // Clean up
for (int32 idx = d3d12driver->SubmittedCommandListCount - 1; idx >= 0; --idx)
{ {
result &= Internal::CleanCommandList(d3d12driver, d3d12driver->SubmittedCommandLists[idx], false); int32 idx = 0;
while (idx < d3d12driver->SubmittedCommandListCount)
{
result &= Internal::CleanCommandList(d3d12driver, d3d12driver->SubmittedCommandLists[idx], false);
// CleanCommandList swaps [idx] with last and decrements count.
// Don't increment — re-check the swapped-in element.
}
} }
Internal::DisposePendingResourcces(d3d12driver); Internal::DisposePendingResourcces(d3d12driver);
@@ -71,16 +81,17 @@ namespace Juliet::D3D12
return result; return result;
} }
bool Wait(NonNullPtr<GPUDriver> driver, bool waitForAll, Fence* const* fences, uint32 numFences) bool Wait(NonNullPtr<GPUDriver> driver, bool waitForAll, Fence* const* fences, uint32 numFences JULIET_DEBUG_PARAM(String querier))
{ {
auto d3d12driver = static_cast<D3D12Driver*>(driver.Get()); auto d3d12driver = static_cast<D3D12Driver*>(driver.Get());
// TODO: use scratch allocator for alloca (stack alloc) // TODO: use scratch allocator for alloca (stack alloc)
auto events = static_cast<HANDLE*>(alloca(sizeof(HANDLE) * numFences)); HANDLE* events = static_cast<HANDLE*>(alloca(sizeof(HANDLE) * numFences));
MemoryZero(events, sizeof(HANDLE) * numFences);
for (uint32 i = 0; i < numFences; ++i) for (uint32 i = 0; i < numFences; ++i)
{ {
auto fence = reinterpret_cast<D3D12Fence*>(fences[i]); D3D12Fence* fence = reinterpret_cast<D3D12Fence*>(fences[i]);
HRESULT res = fence->Handle->SetEventOnCompletion(D3D12_FENCE_SIGNAL_VALUE, fence->Event); HRESULT res = fence->Handle->SetEventOnCompletion(D3D12_FENCE_SIGNAL_VALUE, fence->Event);
if (FAILED(res)) if (FAILED(res))
@@ -91,6 +102,13 @@ namespace Juliet::D3D12
events[i] = fence->Event; events[i] = fence->Event;
} }
LogDebug(LogCategory::Graphics, "Waiting for %d fences. Querier %s", numFences JULIET_DEBUG_PARAM(CStr(querier)));
for (uint32 i = 0; i < numFences; ++i)
{
D3D12Fence* d3d12fence = reinterpret_cast<D3D12Fence*>(fences[i]);
LogDebug(LogCategory::Graphics, "Waiting for %x fence. Handle %x | Event %x | Refcount %d", d3d12fence,
d3d12fence->Handle, d3d12fence->Event, d3d12fence->ReferenceCount);
}
DWORD waitResult = WaitForMultipleObjects(numFences, events, waitForAll, INFINITE); DWORD waitResult = WaitForMultipleObjects(numFences, events, waitForAll, INFINITE);
if (waitResult == WAIT_FAILED) if (waitResult == WAIT_FAILED)
@@ -102,12 +120,19 @@ namespace Juliet::D3D12
bool result = true; bool result = true;
// Clean up // Clean up
for (int32 idx = d3d12driver->SubmittedCommandListCount - 1; idx >= 0; --idx -= 1)
{ {
uint64 fenceValue = d3d12driver->SubmittedCommandLists[idx]->InFlightFence->Handle->GetCompletedValue(); int32 idx = 0;
if (fenceValue == D3D12_FENCE_SIGNAL_VALUE) while (idx < d3d12driver->SubmittedCommandListCount)
{ {
result &= Internal::CleanCommandList(d3d12driver, d3d12driver->SubmittedCommandLists[idx], false); uint64 fenceValue = d3d12driver->SubmittedCommandLists[idx]->InFlightFence->Handle->GetCompletedValue();
if (fenceValue == D3D12_FENCE_SIGNAL_VALUE)
{
result &= Internal::CleanCommandList(d3d12driver, d3d12driver->SubmittedCommandLists[idx], false);
}
else
{
idx += 1;
}
} }
} }
@@ -122,11 +147,13 @@ namespace Juliet::D3D12
return true; return true;
} }
void ReleaseFence(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence) void ReleaseFence(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence JULIET_DEBUG_PARAM(String querier))
{ {
auto d3d12driver = static_cast<D3D12Driver*>(driver.Get()); auto d3d12driver = static_cast<D3D12Driver*>(driver.Get());
auto d3d12Fence = reinterpret_cast<D3D12Fence*>(fence.Get()); auto d3d12Fence = reinterpret_cast<D3D12Fence*>(fence.Get());
LogDebug(LogCategory::Graphics, "ReleaseFence Querier %s | %x fence. Handle %x | Event %x | Refcount %d",
CStr(querier), d3d12Fence, d3d12Fence->Handle, d3d12Fence->Event, d3d12Fence->ReferenceCount);
if (--d3d12Fence->ReferenceCount == 0) if (--d3d12Fence->ReferenceCount == 0)
{ {
ReleaseFenceToPool(d3d12driver, d3d12Fence); ReleaseFenceToPool(d3d12driver, d3d12Fence);
@@ -170,7 +197,7 @@ namespace Juliet::D3D12
} }
} }
D3D12Fence* AcquireFence(NonNullPtr<D3D12Driver> driver) D3D12Fence* AcquireFence(NonNullPtr<D3D12Driver> driver JULIET_DEBUG_PARAM(String querier))
{ {
D3D12Fence* fence; D3D12Fence* fence;
ID3D12Fence* handle; ID3D12Fence* handle;
@@ -180,7 +207,7 @@ namespace Juliet::D3D12
if (driver->AvailableFenceCount == 0) if (driver->AvailableFenceCount == 0)
{ {
HRESULT result = driver->D3D12Device->CreateFence(D3D12_FENCE_UNSIGNALED_VALUE, D3D12_FENCE_FLAG_NONE, HRESULT result = driver->D3D12Device->CreateFence(D3D12_FENCE_UNSIGNALED_VALUE, D3D12_FENCE_FLAG_NONE,
IID_ID3D12Fence, reinterpret_cast<void**>(&handle)); IID_ID3D12Fence, reinterpret_cast<void**>(&handle));
if (FAILED(result)) if (FAILED(result))
{ {
LogError(driver->D3D12Device, "Failed to create fence!", result); LogError(driver->D3D12Device, "Failed to create fence!", result);
@@ -197,15 +224,22 @@ namespace Juliet::D3D12
fence->Handle = handle; fence->Handle = handle;
fence->Event = CreateEvent(nullptr, false, false, nullptr); fence->Event = CreateEvent(nullptr, false, false, nullptr);
fence->ReferenceCount = 0; fence->ReferenceCount = 0;
LogDebug(LogCategory::Graphics, "Acquire Querier %s | Setting Signal to 0 NEW fence", CStr(querier));
} }
else else
{ {
fence = driver->AvailableFences[driver->AvailableFenceCount - 1]; fence = driver->AvailableFences[driver->AvailableFenceCount - 1];
driver->AvailableFenceCount -= 1; driver->AvailableFenceCount -= 1;
fence->Handle->Signal(D3D12_FENCE_UNSIGNALED_VALUE); fence->Handle->Signal(D3D12_FENCE_UNSIGNALED_VALUE);
LogDebug(LogCategory::Graphics, "Acquire Querier %s | Setting Signal to 0, RECYCLING", CStr(querier));
} }
fence->ReferenceCount += 1; fence->ReferenceCount += 1;
Assert(fence->ReferenceCount == 1);
LogDebug(LogCategory::Graphics, "Acquire Querier %s | %x fence. Handle %x | Event %x | Refcount %d",
CStr(querier), fence, fence->Handle, fence->Event, fence->ReferenceCount);
return fence; return fence;
} }

View File

@@ -26,9 +26,10 @@ namespace Juliet::D3D12
}; };
extern bool WaitUntilGPUIsIdle(NonNullPtr<GPUDriver> driver); extern bool WaitUntilGPUIsIdle(NonNullPtr<GPUDriver> driver);
extern bool Wait(NonNullPtr<GPUDriver> driver, bool waitForAll, Fence* const* fences, uint32 numFences); extern bool Wait(NonNullPtr<GPUDriver> driver, bool waitForAll, Fence* const* fences,
uint32 numFences JULIET_DEBUG_PARAM(String querier));
extern bool QueryFence(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence); extern bool QueryFence(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence);
extern void ReleaseFence(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence); extern void ReleaseFence(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence JULIET_DEBUG_PARAM(String querier));
namespace Internal namespace Internal
{ {
@@ -36,7 +37,7 @@ namespace Juliet::D3D12
D3D12_RESOURCE_STATES destinationState, ID3D12Resource* resource, D3D12_RESOURCE_STATES destinationState, ID3D12Resource* resource,
uint32 subresourceIndex, bool needsUavBarrier); uint32 subresourceIndex, bool needsUavBarrier);
extern D3D12Fence* AcquireFence(NonNullPtr<D3D12Driver> driver); extern D3D12Fence* AcquireFence(NonNullPtr<D3D12Driver> driver JULIET_DEBUG_PARAM(String querier));
extern void DestroyFence(NonNullPtr<D3D12Fence> fence); extern void DestroyFence(NonNullPtr<D3D12Fence> fence);
} // namespace Internal } // namespace Internal
} // namespace Juliet::D3D12 } // namespace Juliet::D3D12

View File

@@ -1,124 +1,124 @@
#include <algorithm>
#include <Core/Common/EnumUtils.h> #include <Core/Common/EnumUtils.h>
#include <Core/Logging/LogManager.h> #include <Core/Logging/LogManager.h>
#include <Core/Logging/LogTypes.h> #include <Core/Logging/LogTypes.h>
#include <Core/Memory/Allocator.h>
#include <Graphics/D3D12/D3D12CommandList.h> #include <Graphics/D3D12/D3D12CommandList.h>
#include <Graphics/D3D12/D3D12GraphicsDevice.h>
#include <Graphics/D3D12/D3D12Synchronization.h> #include <Graphics/D3D12/D3D12Synchronization.h>
#include <Graphics/D3D12/D3D12Texture.h> #include <Graphics/D3D12/D3D12Texture.h>
#include <Graphics/D3D12/D3D12GraphicsDevice.h>
#include <Graphics/D3D12/D3D12Utils.h> #include <Graphics/D3D12/D3D12Utils.h>
#include <Core/Memory/Allocator.h>
#include <algorithm>
namespace Juliet::D3D12 namespace Juliet::D3D12
{ {
namespace namespace
{ {
DXGI_FORMAT JulietToD3D12_TextureFormat[] = { DXGI_FORMAT JulietToD3D12_TextureFormat[] = {
DXGI_FORMAT_UNKNOWN, // INVALID DXGI_FORMAT_UNKNOWN, // INVALID
DXGI_FORMAT_A8_UNORM, // A8_UNORM DXGI_FORMAT_A8_UNORM, // A8_UNORM
DXGI_FORMAT_R8_UNORM, // R8_UNORM DXGI_FORMAT_R8_UNORM, // R8_UNORM
DXGI_FORMAT_R8G8_UNORM, // R8G8_UNORM DXGI_FORMAT_R8G8_UNORM, // R8G8_UNORM
DXGI_FORMAT_R8G8B8A8_UNORM, // R8G8B8A8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM, // R8G8B8A8_UNORM
DXGI_FORMAT_R16_UNORM, // R16_UNORM DXGI_FORMAT_R16_UNORM, // R16_UNORM
DXGI_FORMAT_R16G16_UNORM, // R16G16_UNORM DXGI_FORMAT_R16G16_UNORM, // R16G16_UNORM
DXGI_FORMAT_R16G16B16A16_UNORM, // R16G16B16A16_UNORM DXGI_FORMAT_R16G16B16A16_UNORM, // R16G16B16A16_UNORM
DXGI_FORMAT_R10G10B10A2_UNORM, // R10G10B10A2_UNORM DXGI_FORMAT_R10G10B10A2_UNORM, // R10G10B10A2_UNORM
DXGI_FORMAT_B5G6R5_UNORM, // B5G6R5_UNORM DXGI_FORMAT_B5G6R5_UNORM, // B5G6R5_UNORM
DXGI_FORMAT_B5G5R5A1_UNORM, // B5G5R5A1_UNORM DXGI_FORMAT_B5G5R5A1_UNORM, // B5G5R5A1_UNORM
DXGI_FORMAT_B4G4R4A4_UNORM, // B4G4R4A4_UNORM DXGI_FORMAT_B4G4R4A4_UNORM, // B4G4R4A4_UNORM
DXGI_FORMAT_B8G8R8A8_UNORM, // B8G8R8A8_UNORM DXGI_FORMAT_B8G8R8A8_UNORM, // B8G8R8A8_UNORM
DXGI_FORMAT_BC1_UNORM, // BC1_UNORM DXGI_FORMAT_BC1_UNORM, // BC1_UNORM
DXGI_FORMAT_BC2_UNORM, // BC2_UNORM DXGI_FORMAT_BC2_UNORM, // BC2_UNORM
DXGI_FORMAT_BC3_UNORM, // BC3_UNORM DXGI_FORMAT_BC3_UNORM, // BC3_UNORM
DXGI_FORMAT_BC4_UNORM, // BC4_UNORM DXGI_FORMAT_BC4_UNORM, // BC4_UNORM
DXGI_FORMAT_BC5_UNORM, // BC5_UNORM DXGI_FORMAT_BC5_UNORM, // BC5_UNORM
DXGI_FORMAT_BC7_UNORM, // BC7_UNORM DXGI_FORMAT_BC7_UNORM, // BC7_UNORM
DXGI_FORMAT_BC6H_SF16, // BC6H_FLOAT DXGI_FORMAT_BC6H_SF16, // BC6H_FLOAT
DXGI_FORMAT_BC6H_UF16, // BC6H_UFLOAT DXGI_FORMAT_BC6H_UF16, // BC6H_UFLOAT
DXGI_FORMAT_R8_SNORM, // R8_SNORM DXGI_FORMAT_R8_SNORM, // R8_SNORM
DXGI_FORMAT_R8G8_SNORM, // R8G8_SNORM DXGI_FORMAT_R8G8_SNORM, // R8G8_SNORM
DXGI_FORMAT_R8G8B8A8_SNORM, // R8G8B8A8_SNORM DXGI_FORMAT_R8G8B8A8_SNORM, // R8G8B8A8_SNORM
DXGI_FORMAT_R16_SNORM, // R16_SNORM DXGI_FORMAT_R16_SNORM, // R16_SNORM
DXGI_FORMAT_R16G16_SNORM, // R16G16_SNORM DXGI_FORMAT_R16G16_SNORM, // R16G16_SNORM
DXGI_FORMAT_R16G16B16A16_SNORM, // R16G16B16A16_SNORM DXGI_FORMAT_R16G16B16A16_SNORM, // R16G16B16A16_SNORM
DXGI_FORMAT_R16_FLOAT, // R16_FLOAT DXGI_FORMAT_R16_FLOAT, // R16_FLOAT
DXGI_FORMAT_R16G16_FLOAT, // R16G16_FLOAT DXGI_FORMAT_R16G16_FLOAT, // R16G16_FLOAT
DXGI_FORMAT_R16G16B16A16_FLOAT, // R16G16B16A16_FLOAT DXGI_FORMAT_R16G16B16A16_FLOAT, // R16G16B16A16_FLOAT
DXGI_FORMAT_R32_FLOAT, // R32_FLOAT DXGI_FORMAT_R32_FLOAT, // R32_FLOAT
DXGI_FORMAT_R32G32_FLOAT, // R32G32_FLOAT DXGI_FORMAT_R32G32_FLOAT, // R32G32_FLOAT
DXGI_FORMAT_R32G32B32A32_FLOAT, // R32G32B32A32_FLOAT DXGI_FORMAT_R32G32B32A32_FLOAT, // R32G32B32A32_FLOAT
DXGI_FORMAT_R11G11B10_FLOAT, // R11G11B10_UFLOAT DXGI_FORMAT_R11G11B10_FLOAT, // R11G11B10_UFLOAT
DXGI_FORMAT_R8_UINT, // R8_UINT DXGI_FORMAT_R8_UINT, // R8_UINT
DXGI_FORMAT_R8G8_UINT, // R8G8_UINT DXGI_FORMAT_R8G8_UINT, // R8G8_UINT
DXGI_FORMAT_R8G8B8A8_UINT, // R8G8B8A8_UINT DXGI_FORMAT_R8G8B8A8_UINT, // R8G8B8A8_UINT
DXGI_FORMAT_R16_UINT, // R16_UINT DXGI_FORMAT_R16_UINT, // R16_UINT
DXGI_FORMAT_R16G16_UINT, // R16G16_UINT DXGI_FORMAT_R16G16_UINT, // R16G16_UINT
DXGI_FORMAT_R16G16B16A16_UINT, // R16G16B16A16_UINT DXGI_FORMAT_R16G16B16A16_UINT, // R16G16B16A16_UINT
DXGI_FORMAT_R32_UINT, // R32_UINT DXGI_FORMAT_R32_UINT, // R32_UINT
DXGI_FORMAT_R32G32_UINT, // R32G32_UINT DXGI_FORMAT_R32G32_UINT, // R32G32_UINT
DXGI_FORMAT_R32G32B32A32_UINT, // R32G32B32A32_UINT DXGI_FORMAT_R32G32B32A32_UINT, // R32G32B32A32_UINT
DXGI_FORMAT_R8_SINT, // R8_INT DXGI_FORMAT_R8_SINT, // R8_INT
DXGI_FORMAT_R8G8_SINT, // R8G8_INT DXGI_FORMAT_R8G8_SINT, // R8G8_INT
DXGI_FORMAT_R8G8B8A8_SINT, // R8G8B8A8_INT DXGI_FORMAT_R8G8B8A8_SINT, // R8G8B8A8_INT
DXGI_FORMAT_R16_SINT, // R16_INT DXGI_FORMAT_R16_SINT, // R16_INT
DXGI_FORMAT_R16G16_SINT, // R16G16_INT DXGI_FORMAT_R16G16_SINT, // R16G16_INT
DXGI_FORMAT_R16G16B16A16_SINT, // R16G16B16A16_INT DXGI_FORMAT_R16G16B16A16_SINT, // R16G16B16A16_INT
DXGI_FORMAT_R32_SINT, // R32_INT DXGI_FORMAT_R32_SINT, // R32_INT
DXGI_FORMAT_R32G32_SINT, // R32G32_INT DXGI_FORMAT_R32G32_SINT, // R32G32_INT
DXGI_FORMAT_R32G32B32A32_SINT, // R32G32B32A32_INT DXGI_FORMAT_R32G32B32A32_SINT, // R32G32B32A32_INT
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, // R8G8B8A8_UNORM_SRGB DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, // R8G8B8A8_UNORM_SRGB
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, // B8G8R8A8_UNORM_SRGB DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, // B8G8R8A8_UNORM_SRGB
DXGI_FORMAT_BC1_UNORM_SRGB, // BC1_UNORM_SRGB DXGI_FORMAT_BC1_UNORM_SRGB, // BC1_UNORM_SRGB
DXGI_FORMAT_BC2_UNORM_SRGB, // BC2_UNORM_SRGB DXGI_FORMAT_BC2_UNORM_SRGB, // BC2_UNORM_SRGB
DXGI_FORMAT_BC3_UNORM_SRGB, // BC3_UNORM_SRGB DXGI_FORMAT_BC3_UNORM_SRGB, // BC3_UNORM_SRGB
DXGI_FORMAT_BC7_UNORM_SRGB, // BC7_UNORM_SRGB DXGI_FORMAT_BC7_UNORM_SRGB, // BC7_UNORM_SRGB
DXGI_FORMAT_R16_TYPELESS, // D16_UNORM DXGI_FORMAT_R16_TYPELESS, // D16_UNORM
DXGI_FORMAT_R24G8_TYPELESS, // D24_UNORM DXGI_FORMAT_R24G8_TYPELESS, // D24_UNORM
DXGI_FORMAT_R32_TYPELESS, // D32_FLOAT DXGI_FORMAT_R32_TYPELESS, // D32_FLOAT
DXGI_FORMAT_R24G8_TYPELESS, // D24_UNORM_S8_UINT DXGI_FORMAT_R24G8_TYPELESS, // D24_UNORM_S8_UINT
DXGI_FORMAT_R32G8X24_TYPELESS, // D32_FLOAT_S8_UINT DXGI_FORMAT_R32G8X24_TYPELESS, // D32_FLOAT_S8_UINT
DXGI_FORMAT_UNKNOWN, // ASTC_4x4_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_4x4_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_5x4_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_5x4_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_5x5_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_5x5_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_6x5_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_6x5_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_6x6_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_6x6_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_8x5_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_8x5_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_8x6_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_8x6_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_8x8_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_8x8_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_10x5_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_10x5_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_10x6_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_10x6_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_10x8_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_10x8_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_10x10_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_10x10_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_12x10_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_12x10_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_12x12_UNORM DXGI_FORMAT_UNKNOWN, // ASTC_12x12_UNORM
DXGI_FORMAT_UNKNOWN, // ASTC_4x4_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_4x4_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_5x4_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_5x4_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_5x5_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_5x5_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_6x5_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_6x5_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_6x6_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_6x6_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_8x5_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_8x5_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_8x6_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_8x6_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_8x8_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_8x8_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_10x5_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_10x5_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_10x6_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_10x6_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_10x8_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_10x8_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_10x10_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_10x10_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_12x10_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_12x10_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_12x12_UNORM_SRGB DXGI_FORMAT_UNKNOWN, // ASTC_12x12_UNORM_SRGB
DXGI_FORMAT_UNKNOWN, // ASTC_4x4_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_4x4_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_5x4_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_5x4_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_5x5_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_5x5_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_6x5_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_6x5_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_6x6_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_6x6_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_8x5_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_8x5_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_8x6_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_8x6_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_8x8_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_8x8_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_10x5_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_10x5_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_10x6_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_10x6_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_10x8_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_10x8_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_10x10_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_10x10_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_12x10_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_12x10_FLOAT
DXGI_FORMAT_UNKNOWN, // ASTC_12x12_FLOAT DXGI_FORMAT_UNKNOWN, // ASTC_12x12_FLOAT
}; };
static_assert(sizeof(JulietToD3D12_TextureFormat) / sizeof(JulietToD3D12_TextureFormat[0]) == static_assert(sizeof(JulietToD3D12_TextureFormat) / sizeof(JulietToD3D12_TextureFormat[0]) ==
ToUnderlying(TextureFormat::Count)); ToUnderlying(TextureFormat::Count));
@@ -375,13 +375,9 @@ namespace Juliet::D3D12
case TextureType::Texture_2D: case TextureType::Texture_2D:
case TextureType::Texture_2DArray: case TextureType::Texture_2DArray:
case TextureType::Texture_Cube: case TextureType::Texture_Cube:
case TextureType::Texture_CubeArray: case TextureType::Texture_CubeArray: desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; break;
desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
break;
case TextureType::Texture_3D: case TextureType::Texture_3D:
case TextureType::Texture_3DArray: case TextureType::Texture_3DArray: desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE3D; break;
desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE3D;
break;
} }
desc.Alignment = 0; desc.Alignment = 0;
@@ -396,17 +392,27 @@ namespace Juliet::D3D12
desc.Flags = D3D12_RESOURCE_FLAG_NONE; desc.Flags = D3D12_RESOURCE_FLAG_NONE;
if ((createInfo.Flags & TextureUsageFlag::ColorTarget) != TextureUsageFlag::None) if ((createInfo.Flags & TextureUsageFlag::ColorTarget) != TextureUsageFlag::None)
{
desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
}
if ((createInfo.Flags & TextureUsageFlag::DepthStencilTarget) != TextureUsageFlag::None) if ((createInfo.Flags & TextureUsageFlag::DepthStencilTarget) != TextureUsageFlag::None)
{
desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL; desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
}
if ((createInfo.Flags & TextureUsageFlag::ComputeStorageWrite) != TextureUsageFlag::None) if ((createInfo.Flags & TextureUsageFlag::ComputeStorageWrite) != TextureUsageFlag::None)
{
desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS; desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
}
D3D12_HEAP_PROPERTIES heapProps = {}; D3D12_HEAP_PROPERTIES heapProps = {};
heapProps.Type = D3D12_HEAP_TYPE_DEFAULT; heapProps.Type = D3D12_HEAP_TYPE_DEFAULT;
heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
heapProps.CreationNodeMask = 0; // We don't do multi-adapter operation
heapProps.VisibleNodeMask = 0; // We don't do multi-adapter operation
ID3D12Resource* resource = nullptr; ID3D12Resource* resource = nullptr;
D3D12_CLEAR_VALUE clearValue = {}; D3D12_CLEAR_VALUE clearValue = {};
D3D12_CLEAR_VALUE* pClearValue = nullptr; D3D12_CLEAR_VALUE* pClearValue = nullptr;
if (desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) if (desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL)
@@ -426,9 +432,10 @@ namespace Juliet::D3D12
pClearValue = &clearValue; pClearValue = &clearValue;
} }
D3D12_RESOURCE_STATES initialState = GetDefaultTextureResourceState(createInfo.Flags);
HRESULT hr = d3d12Driver->D3D12Device->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &desc, HRESULT hr = d3d12Driver->D3D12Device->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &desc,
D3D12_RESOURCE_STATE_COMMON, pClearValue, IID_ID3D12Resource, initialState, pClearValue, IID_ID3D12Resource,
reinterpret_cast<void**>(&resource)); reinterpret_cast<void**>(&resource));
if (FAILED(hr)) if (FAILED(hr))
{ {
@@ -451,10 +458,11 @@ namespace Juliet::D3D12
texture->Resource = resource; texture->Resource = resource;
texture->ReferenceCount = 1; texture->ReferenceCount = 1;
uint32 numLayers = std::max<uint32>(1, createInfo.LayerCount); uint32 numLayers = std::max<uint32>(1, createInfo.LayerCount);
uint32 numMips = std::max<uint32>(1, createInfo.MipLevelCount); uint32 numMips = std::max<uint32>(1, createInfo.MipLevelCount);
texture->SubresourceCount = numLayers * numMips; texture->SubresourceCount = numLayers * numMips;
texture->Subresources = static_cast<D3D12TextureSubresource*>(Calloc(texture->SubresourceCount, sizeof(D3D12TextureSubresource))); texture->Subresources =
static_cast<D3D12TextureSubresource*>(Calloc(texture->SubresourceCount, sizeof(D3D12TextureSubresource)));
for (uint32 layer = 0; layer < numLayers; ++layer) for (uint32 layer = 0; layer < numLayers; ++layer)
{ {
@@ -499,14 +507,14 @@ namespace Juliet::D3D12
Internal::D3D12Descriptor descriptor; Internal::D3D12Descriptor descriptor;
if (Internal::AssignDescriptor(d3d12Driver->BindlessDescriptorHeap, descriptor)) if (Internal::AssignDescriptor(d3d12Driver->BindlessDescriptorHeap, descriptor))
{ {
texture->SRVHandle = D3D12StagingDescriptor{}; texture->SRVHandle = D3D12StagingDescriptor{};
texture->SRVHandle.CpuHandleIndex = descriptor.Index; texture->SRVHandle.CpuHandleIndex = descriptor.Index;
texture->SRVHandle.CpuHandle = descriptor.CpuHandle; texture->SRVHandle.CpuHandle = descriptor.CpuHandle;
texture->SRVHandle.Heap = descriptor.Heap; texture->SRVHandle.Heap = descriptor.Heap;
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
srvDesc.Format = desc.Format; srvDesc.Format = desc.Format;
// Fix SRV format for Depth Buffers (TypeLess -> Typed) // Fix SRV format for Depth Buffers (TypeLess -> Typed)
if (createInfo.Format == TextureFormat::D32_FLOAT) if (createInfo.Format == TextureFormat::D32_FLOAT)
srvDesc.Format = DXGI_FORMAT_R32_FLOAT; srvDesc.Format = DXGI_FORMAT_R32_FLOAT;
@@ -517,11 +525,11 @@ namespace Juliet::D3D12
else if (createInfo.Format == TextureFormat::D32_FLOAT_S8_UINT) else if (createInfo.Format == TextureFormat::D32_FLOAT_S8_UINT)
srvDesc.Format = DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS; srvDesc.Format = DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS;
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MostDetailedMip = 0; srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = numMips; srvDesc.Texture2D.MipLevels = numMips;
srvDesc.Texture2D.PlaneSlice = 0; srvDesc.Texture2D.PlaneSlice = 0;
srvDesc.Texture2D.ResourceMinLODClamp = 0.0f; srvDesc.Texture2D.ResourceMinLODClamp = 0.0f;
d3d12Driver->D3D12Device->CreateShaderResourceView(resource, &srvDesc, descriptor.CpuHandle); d3d12Driver->D3D12Device->CreateShaderResourceView(resource, &srvDesc, descriptor.CpuHandle);
@@ -529,7 +537,6 @@ namespace Juliet::D3D12
} }
return reinterpret_cast<Texture*>(textureContainer); return reinterpret_cast<Texture*>(textureContainer);
} }
void DestroyTexture(NonNullPtr<GPUDriver> driver, NonNullPtr<Texture> texture) void DestroyTexture(NonNullPtr<GPUDriver> driver, NonNullPtr<Texture> texture)

View File

@@ -83,7 +83,7 @@ namespace Juliet
// Fences // Fences
bool (*WaitUntilGPUIsIdle)(NonNullPtr<GPUDriver> driver); bool (*WaitUntilGPUIsIdle)(NonNullPtr<GPUDriver> driver);
bool (*QueryFence)(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence); bool (*QueryFence)(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence);
void (*ReleaseFence)(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence); void (*ReleaseFence)(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence JULIET_DEBUG_PARAM(String querier));
// Shaders // Shaders
Shader* (*CreateShader)(NonNullPtr<GPUDriver> driver, ByteBuffer shaderByteCode, ShaderCreateInfo& shaderCreateInfo); Shader* (*CreateShader)(NonNullPtr<GPUDriver> driver, ByteBuffer shaderByteCode, ShaderCreateInfo& shaderCreateInfo);

View File

@@ -5,95 +5,5 @@
namespace Juliet namespace Juliet
{ {
Mesh* CreateCubeMesh(NonNullPtr<Arena> arena)
{
Mesh* result = ArenaPushStruct<Mesh>(arena.Get());
constexpr Vertex vertexData[] = {
// Front Face (Z = -0.5f)
{ { -0.5f, 0.5f, -0.5f }, { 0.0f, 0.0f } }, // 0: Top Left
{ { 0.5f, 0.5f, -0.5f }, { 1.0f, 0.0f } }, // 1: Top Right
{ { 0.5f, -0.5f, -0.5f }, { 1.0f, 1.0f } }, // 2: Bottom Right
{ { -0.5f, -0.5f, -0.5f }, { 0.0f, 1.0f } }, // 3: Bottom Left
// Back Face (Z = 0.5f)
{ { 0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 4: Top Left
{ { -0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 5: Top Right
{ { -0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 6: Bottom Right
{ { 0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } }, // 7: Bottom Left
// Top Face (Y = 0.5f)
{ { -0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 8: Top Left
{ { 0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 9: Top Right
{ { 0.5f, 0.5f, -0.5f }, { 1.0f, 1.0f } }, // 10: Bottom Right
{ { -0.5f, 0.5f, -0.5f }, { 0.0f, 1.0f } }, // 11: Bottom Left
// Bottom Face (Y = -0.5f)
{ { -0.5f, -0.5f, -0.5f }, { 0.0f, 0.0f } }, // 12: Top Left
{ { 0.5f, -0.5f, -0.5f }, { 1.0f, 0.0f } }, // 13: Top Right
{ { 0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 14: Bottom Right
{ { -0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } }, // 15: Bottom Left
// Right Face (X = 0.5f)
{ { 0.5f, 0.5f, -0.5f }, { 0.0f, 0.0f } }, // 16: Top Left
{ { 0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 17: Top Right
{ { 0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 18: Bottom Right
{ { 0.5f, -0.5f, -0.5f }, { 0.0f, 1.0f } }, // 19: Bottom Left
// Left Face (X = -0.5f)
{ { -0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 20: Top Left
{ { -0.5f, 0.5f, -0.5f }, { 1.0f, 0.0f } }, // 21: Top Right
{ { -0.5f, -0.5f, -0.5f }, { 1.0f, 1.0f } }, // 22: Bottom Right
{ { -0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } } // 23: Bottom Left
};
constexpr size_t cubeVertexCount = ArraySize(vertexData);
result->VertexCount = cubeVertexCount;
result->Vertices = ArenaPushArray<Vertex>(arena.Get(), cubeVertexCount);
MemCopy(result->Vertices, vertexData, sizeof(Vertex) * cubeVertexCount);
constexpr uint16 indices[] = { 0, 1, 2, 0, 2, 3, // Front
4, 5, 6, 4, 6, 7, // Back
8, 9, 10, 8, 10, 11, // Top
12, 13, 14, 12, 14, 15, // Bottom
16, 17, 18, 16, 18, 19, // Right
20, 21, 22, 20, 22, 23 }; // Left
constexpr size_t indexCubeCount = ArraySize(indices);
result->IndexCount = indexCubeCount;
result->Indices = ArenaPushArray<uint16>(arena.Get(), indexCubeCount JULIET_DEBUG_PARAM("Indices"));
MemCopy(result->Indices, indices, sizeof(uint16) * indexCubeCount);
return result;
}
Mesh* CreateQuadMesh(NonNullPtr<Arena> arena)
{
Mesh* result = ArenaPushStruct<Mesh>(arena.Get());
// Using the exact 6 vertices from the working triangles!
constexpr Vertex vertexData[] = {
// Triangle 1 (Clockwise)
{ { -0.5f, -0.5f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, // 0: Red
{ { 0.0f, 0.5f, 0.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }, // 1: Green
{ { 0.5f, -0.5f, 0.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } }, // 2: Blue
// Triangle 2 (Clockwise)
{ { -0.5f, 0.5f, 0.0f }, { 1.0f, 1.0f, 0.0f, 1.0f } }, // 3: Yellow
{ { 0.0f, 0.8f, 0.0f }, { 0.0f, 1.0f, 1.0f, 1.0f } }, // 4: Cyan
{ { 0.5f, 0.5f, 0.0f }, { 1.0f, 0.0f, 1.0f, 1.0f } } // 5: Magenta
};
constexpr size_t triVertexCount = ArraySize(vertexData);
result->VertexCount = triVertexCount;
result->Vertices = ArenaPushArray<Vertex>(arena.Get(), triVertexCount);
MemCopy(result->Vertices, vertexData, sizeof(Vertex) * triVertexCount);
// Just the 6 indices for the two triangles
constexpr uint16 indices[] = { 0, 1, 2, 3, 4, 5 };
constexpr size_t triIndexCount = ArraySize(indices);
result->IndexCount = triIndexCount;
result->Indices = ArenaPushArray<uint16>(arena.Get(), triIndexCount JULIET_DEBUG_PARAM("Indices"));
MemCopy(result->Indices, indices, sizeof(uint16) * triIndexCount);
return result;
}
} // namespace Juliet } // namespace Juliet

View File

@@ -0,0 +1,315 @@
#include <Graphics/MeshRenderer.h>
#include <Core/Logging/LogManager.h>
#include <Core/Logging/LogTypes.h>
#include <Core/Math/Matrix.h>
#include <Graphics/GraphicsDevice.h>
#include <Graphics/Mesh.h>
#include <Graphics/VertexData.h>
namespace Juliet
{
namespace
{
MeshRenderer g_MeshRenderer;
} // namespace
bool InitializeMeshRenderer(NonNullPtr<Arena> arena, NonNullPtr<GraphicsDevice> device, NonNullPtr<Window> window)
{
(void)arena;
(void)device;
(void)window;
return true;
// bool result = true;
//
// g_MeshRenderer.Meshes.Create(arena JULIET_DEBUG_PARAM("Meshes"));
// g_MeshRenderer.Vertices.Create(arena JULIET_DEBUG_PARAM("Vertices"));
// g_MeshRenderer.Indices.Create(arena JULIET_DEBUG_PARAM("Indices"));
//
// GraphicsDevice* graphicsDevice = g_MeshRenderer.Device = device.Get();
//
// // Create graphics pipeline
// String entryPoint = WrapString("main");
// ShaderCreateInfo shaderCI = {};
// shaderCI.EntryPoint = entryPoint;
//
// // TODO: Assets management that handles path to assets or something.
// String shaderPath = WrapString("../../Assets/compiled/Triangle.vert.dxil");
// shaderCI.Stage = ShaderStage::Vertex;
// Shader* vertexShader = CreateShader(graphicsDevice, shaderPath, shaderCI);
//
// shaderPath = WrapString("../../Assets/compiled/SolidColor.frag.dxil");
// shaderCI.Stage = ShaderStage::Fragment;
// Shader* fragmentShader = CreateShader(graphicsDevice, shaderPath, shaderCI);
//
// ColorTargetDescription colorTargetDescription = {};
// colorTargetDescription.Format = GetSwapChainTextureFormat(graphicsDevice, window);
//
// GraphicsPipelineCreateInfo pipelineCI = {};
// pipelineCI.VertexShader = vertexShader;
// pipelineCI.FragmentShader = fragmentShader;
// pipelineCI.PrimitiveType = PrimitiveType::TriangleList;
// pipelineCI.TargetInfo = { .ColorTargetDescriptions = &colorTargetDescription,
// .NumColorTargets = 1,
// .DepthStencilFormat = TextureFormat::D32_FLOAT,
// .HasDepthStencilTarget = true };
// pipelineCI.RasterizerState.FillMode = FillMode::Solid;
// pipelineCI.DepthStencilState.EnableDepthTest = true;
// pipelineCI.DepthStencilState.EnableDepthWrite = true;
// pipelineCI.DepthStencilState.CompareOperation = CompareOperation::Less;
//
// g_MeshRenderer.Pipeline = CreateGraphicsPipeline(graphicsDevice, pipelineCI);
// if (g_MeshRenderer.Pipeline == nullptr)
// {
// LogError(LogCategory::Graphics, "Failed to create graphics pipeline!");
// result = false;
// }
//
// // Create the vertex and index buffers
// BufferCreateInfo vertexBufferCI = {};
// vertexBufferCI.Size = kGeometryPage;
// vertexBufferCI.Usage = BufferUsage::VertexBuffer;
// g_MeshRenderer.VertexBuffer = CreateGraphicsBuffer(graphicsDevice, vertexBufferCI);
//
// BufferCreateInfo indexBufferCI = {};
// indexBufferCI.Size = kIndexPage;
// indexBufferCI.Usage = BufferUsage::IndexBuffer;
// g_MeshRenderer.IndexBuffer = CreateGraphicsBuffer(graphicsDevice, indexBufferCI);
//
// if (vertexShader)
// {
// DestroyShader(graphicsDevice, vertexShader);
// }
// if (fragmentShader)
// {
// DestroyShader(graphicsDevice, fragmentShader);
// }
//
// return result;
}
void ShutdownMeshRenderer()
{
return;
// DestroyGraphicsBuffer(g_MeshRenderer.Device, g_MeshRenderer.IndexBuffer);
// DestroyGraphicsBuffer(g_MeshRenderer.Device, g_MeshRenderer.VertexBuffer);
//
// g_MeshRenderer.Indices.Destroy();
// g_MeshRenderer.Vertices.Destroy();
// g_MeshRenderer.Meshes.Destroy();
}
void LoadMeshesOnGPU(NonNullPtr<CommandList> cmdList)
{
if (g_MeshRenderer.Meshes.IsEmpty())
{
return;
}
// Loading everything in one go.
// Destroy the buffer at the end
TransferBufferCreateInfo uploadBCI = {};
uploadBCI.Usage = TransferBufferUsage::Upload;
uploadBCI.Size = kGeometryPage + kIndexPage;
g_MeshRenderer.LoadCopyBuffer = CreateGraphicsTransferBuffer(g_MeshRenderer.Device, uploadBCI);
void* map = MapGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer);
Vertex* vertices = g_MeshRenderer.Vertices.Data;
if (!vertices)
{
return;
}
Index* indices = g_MeshRenderer.Indices.Data;
if (!indices)
{
return;
}
// Copy all meshes! This supports only one page for now
// Copy ALL Vertices in one block
size_t totalVertexBytes = g_MeshRenderer.Vertices.Count * sizeof(Vertex);
MemCopy(map, g_MeshRenderer.Vertices.Data, totalVertexBytes);
// Copy ALL Indices in one block
size_t indexOfByteOffset = (kGeometryPage + 255) & static_cast<size_t>(~255);
uint8* ptrOneByte = static_cast<uint8*>(map);
size_t totalIndexBytes = g_MeshRenderer.Indices.Count * sizeof(Index);
MemCopy(ptrOneByte + indexOfByteOffset, g_MeshRenderer.Indices.Data, totalIndexBytes);
// index_t index = 0;
// for (Mesh& mesh : g_MeshRenderer.Meshes)
// {
// // Vertices first
// Vertex* mapVertices = static_cast<Vertex*>(map);
// MemCopy(mapVertices + index, vertices + mesh.VertexOffset, mesh.VertexCount * sizeOfVertex);
//
// // Indices next
// uint8* ptrOneByte = static_cast<uint8*>(map);
// uint16* dst = reinterpret_cast<uint16*>(ptrOneByte + indexOfByteOffset);
// MemCopy(dst, indices, mesh.IndexCount * sizeOfIndex);
//
// ++index;
// }
CopyBuffer(cmdList, g_MeshRenderer.VertexBuffer, g_MeshRenderer.LoadCopyBuffer, totalVertexBytes, 0, 0);
CopyBuffer(cmdList, g_MeshRenderer.IndexBuffer, g_MeshRenderer.LoadCopyBuffer, totalIndexBytes, 0, indexOfByteOffset);
// Transition vertex buffer to SRV state (this barrier waits for copy to complete)
TransitionBufferToReadable(cmdList, g_MeshRenderer.VertexBuffer);
TransitionBufferToReadable(cmdList, g_MeshRenderer.IndexBuffer);
}
void RenderMeshes(NonNullPtr<RenderPass> pass, NonNullPtr<CommandList> cmdList, PushData& pushData)
{
// First destroy any buffer that needs to be
if (g_MeshRenderer.LoadCopyBuffer)
{
WaitUntilGPUIsIdle(g_MeshRenderer.Device);
UnmapGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer);
DestroyGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer);
g_MeshRenderer.LoadCopyBuffer = nullptr;
}
BindGraphicsPipeline(pass, g_MeshRenderer.Pipeline);
uint32 vertexDescriptorIndex = GetDescriptorIndex(g_MeshRenderer.Device, g_MeshRenderer.VertexBuffer);
pushData.BufferIndex = vertexDescriptorIndex;
SetPushConstants(cmdList, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData);
for (Mesh& mesh : g_MeshRenderer.Meshes)
{
SetIndexBuffer(cmdList, g_MeshRenderer.IndexBuffer, IndexFormat::UInt16, mesh.IndexCount, 0);
// DrawIndexedPrimitives(pass, static_cast<uint32>(mesh.IndexCount), 1, static_cast<uint32>(mesh.IndexOffset),
// static_cast<uint32>(mesh.VertexOffset), 0);
}
}
MeshID AddCube()
{
Mesh result = {};
constexpr Vertex vertexData[] = {
// Front Face (Z = -0.5f)
{ { -0.5f, 0.5f, -0.5f }, { 0.0f, 0.0f } }, // 0: Top Left
{ { 0.5f, 0.5f, -0.5f }, { 1.0f, 0.0f } }, // 1: Top Right
{ { 0.5f, -0.5f, -0.5f }, { 1.0f, 1.0f } }, // 2: Bottom Right
{ { -0.5f, -0.5f, -0.5f }, { 0.0f, 1.0f } }, // 3: Bottom Left
// Back Face (Z = 0.5f)
{ { 0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 4: Top Left
{ { -0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 5: Top Right
{ { -0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 6: Bottom Right
{ { 0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } }, // 7: Bottom Left
// Top Face (Y = 0.5f)
{ { -0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 8: Top Left
{ { 0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 9: Top Right
{ { 0.5f, 0.5f, -0.5f }, { 1.0f, 1.0f } }, // 10: Bottom Right
{ { -0.5f, 0.5f, -0.5f }, { 0.0f, 1.0f } }, // 11: Bottom Left
// Bottom Face (Y = -0.5f)
{ { -0.5f, -0.5f, -0.5f }, { 0.0f, 0.0f } }, // 12: Top Left
{ { 0.5f, -0.5f, -0.5f }, { 1.0f, 0.0f } }, // 13: Top Right
{ { 0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 14: Bottom Right
{ { -0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } }, // 15: Bottom Left
// Right Face (X = 0.5f)
{ { 0.5f, 0.5f, -0.5f }, { 0.0f, 0.0f } }, // 16: Top Left
{ { 0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 17: Top Right
{ { 0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 18: Bottom Right
{ { 0.5f, -0.5f, -0.5f }, { 0.0f, 1.0f } }, // 19: Bottom Left
// Left Face (X = -0.5f)
{ { -0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 20: Top Left
{ { -0.5f, 0.5f, -0.5f }, { 1.0f, 0.0f } }, // 21: Top Right
{ { -0.5f, -0.5f, -0.5f }, { 1.0f, 1.0f } }, // 22: Bottom Right
{ { -0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } } // 23: Bottom Left
};
constexpr size_t cubeVertexCount = ArraySize(vertexData);
result.VertexCount = cubeVertexCount;
result.VertexOffset = g_MeshRenderer.Vertices.Count;
g_MeshRenderer.Vertices.PushBack(vertexData, cubeVertexCount);
constexpr uint16 indices[] = { 0, 1, 2, 0, 2, 3, // Front
4, 5, 6, 4, 6, 7, // Back
8, 9, 10, 8, 10, 11, // Top
12, 13, 14, 12, 14, 15, // Bottom
16, 17, 18, 16, 18, 19, // Right
20, 21, 22, 20, 22, 23 }; // Left
constexpr size_t indexCubeCount = ArraySize(indices);
result.IndexCount = indexCubeCount;
result.IndexOffset = g_MeshRenderer.Indices.Count;
g_MeshRenderer.Indices.PushBack(indices, indexCubeCount);
MeshID id = g_MeshRenderer.Meshes.Count;
g_MeshRenderer.Meshes.PushBack(result);
return id;
}
MeshID AddQuad()
{
// Mesh result = {};
// // Using the exact 6 vertices from the working triangles!
// constexpr Vertex vertexData[] = {
// // Triangle 1 (Clockwise)
// { { -0.5f, -0.5f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, // 0: Red
// { { 0.0f, 0.5f, 0.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }, // 1: Green
// { { 0.5f, -0.5f, 0.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } }, // 2: Blue
//
// // Triangle 2 (Clockwise)
// { { -0.5f, 0.5f, 0.0f }, { 1.0f, 1.0f, 0.0f, 1.0f } }, // 3: Yellow
// { { 0.0f, 0.8f, 0.0f }, { 0.0f, 1.0f, 1.0f, 1.0f } }, // 4: Cyan
// { { 0.5f, 0.5f, 0.0f }, { 1.0f, 0.0f, 1.0f, 1.0f } } // 5: Magenta
// };
// constexpr size_t triVertexCount = ArraySize(vertexData);
// result.VertexCount = triVertexCount;
// result.Vertices = ArenaPushArray<Vertex>(arena.Get(), triVertexCount);
// MemCopy(result.Vertices, vertexData, sizeof(Vertex) * triVertexCount);
//
// // Just the 6 indices for the two triangles
// constexpr uint16 indices[] = { 0, 1, 2, 3, 4, 5 };
// constexpr size_t triIndexCount = ArraySize(indices);
// result.IndexCount = triIndexCount;
// result.Indices = ArenaPushArray<uint16>(arena.Get(), triIndexCount JULIET_DEBUG_PARAM("Indices"));
// MemCopy(result.Indices, indices, sizeof(uint16) * triIndexCount);
//
// g_MeshRenderer.Meshes.PushBack(std::move(result));
return g_MeshRenderer.Meshes.Count - 1;
}
#if ALLOW_SHADER_HOT_RELOAD
void ReloadMeshRendererShaders()
{
auto* pipeline = g_MeshRenderer.Pipeline;
auto* device = g_MeshRenderer.Device;
String entryPoint = WrapString("main");
ShaderCreateInfo shaderCI = {};
shaderCI.EntryPoint = entryPoint;
String shaderPath = WrapString("../../Assets/compiled/Triangle.vert.dxil");
shaderCI.Stage = ShaderStage::Vertex;
Shader* vertexShader = CreateShader(device, shaderPath, shaderCI);
shaderPath = WrapString("../../Assets/compiled/SolidColor.frag.dxil");
shaderCI.Stage = ShaderStage::Fragment;
Shader* fragmentShader = CreateShader(device, shaderPath, shaderCI);
UpdateGraphicsPipelineShaders(device, pipeline, vertexShader, fragmentShader);
if (vertexShader)
{
DestroyShader(device, vertexShader);
}
if (fragmentShader)
{
DestroyShader(device, fragmentShader);
}
}
#endif
} // namespace Juliet

View File

@@ -21,6 +21,7 @@
#include <Graphics/GraphicsConfig.h> #include <Graphics/GraphicsConfig.h>
#include <Graphics/GraphicsPipeline.h> #include <Graphics/GraphicsPipeline.h>
#include <Graphics/Mesh.h> #include <Graphics/Mesh.h>
#include <Graphics/MeshRenderer.h>
#include <Graphics/RenderPass.h> #include <Graphics/RenderPass.h>
#include <Graphics/VertexData.h> #include <Graphics/VertexData.h>
#include <Juliet.h> #include <Juliet.h>
@@ -63,6 +64,8 @@ namespace
} Game; } Game;
const char* GameFunctionTable[] = { "GameInit", "GameShutdown", "GameUpdate" }; const char* GameFunctionTable[] = { "GameInit", "GameShutdown", "GameUpdate" };
Arena* PlatformArena = nullptr;
} // namespace } // namespace
void JulietApplication::Init() void JulietApplication::Init()
@@ -71,6 +74,8 @@ void JulietApplication::Init()
Log(LogLevel::Message, LogCategory::Tool, "%s", CStr(GetBasePath())); Log(LogLevel::Message, LogCategory::Tool, "%s", CStr(GetBasePath()));
PlatformArena = ArenaAllocate({ .AllowRealloc = true } JULIET_DEBUG_PARAM("Platform Arena"));
GraphicsConfig config; GraphicsConfig config;
#if JULIET_DEBUG #if JULIET_DEBUG
config.EnableDebug = true; config.EnableDebug = true;
@@ -85,42 +90,7 @@ void JulietApplication::Init()
{ {
AttachToWindow(GraphicsDevice, MainWindow); AttachToWindow(GraphicsDevice, MainWindow);
{ {
// Create graphics pipeline Running = InitializeMeshRenderer(PlatformArena, GraphicsDevice, MainWindow);
String entryPoint = WrapString("main");
ShaderCreateInfo shaderCI = {};
shaderCI.EntryPoint = entryPoint;
// TODO: Assets management that handles path to assets or something.
String shaderPath = WrapString("../../Assets/compiled/Triangle.vert.dxil");
shaderCI.Stage = ShaderStage::Vertex;
Shader* vertexShader = CreateShader(GraphicsDevice, shaderPath, shaderCI);
shaderPath = WrapString("../../Assets/compiled/SolidColor.frag.dxil");
shaderCI.Stage = ShaderStage::Fragment;
Shader* fragmentShader = CreateShader(GraphicsDevice, shaderPath, shaderCI);
ColorTargetDescription colorTargetDescription = {};
colorTargetDescription.Format = GetSwapChainTextureFormat(GraphicsDevice, MainWindow);
GraphicsPipelineCreateInfo pipelineCI = {};
pipelineCI.VertexShader = vertexShader;
pipelineCI.FragmentShader = fragmentShader;
pipelineCI.PrimitiveType = PrimitiveType::TriangleList;
pipelineCI.TargetInfo = { .ColorTargetDescriptions = &colorTargetDescription,
.NumColorTargets = 1,
.DepthStencilFormat = TextureFormat::D32_FLOAT,
.HasDepthStencilTarget = true };
pipelineCI.RasterizerState.FillMode = FillMode::Solid;
pipelineCI.DepthStencilState.EnableDepthTest = true;
pipelineCI.DepthStencilState.EnableDepthWrite = true;
pipelineCI.DepthStencilState.CompareOperation = CompareOperation::Less;
GraphicsPipeline = CreateGraphicsPipeline(GraphicsDevice, pipelineCI);
if (GraphicsPipeline == nullptr)
{
LogError(LogCategory::Game, "Failed to create graphics pipeline!");
Running = false;
}
// Create Depth Buffer // Create Depth Buffer
TextureCreateInfo depthCI = {}; TextureCreateInfo depthCI = {};
@@ -139,50 +109,11 @@ void JulietApplication::Init()
Running = false; Running = false;
} }
// Create Buffers - Using StructuredBuffer for bindless SRV access in shader // std::ignore = AddCube();
BufferCreateInfo bufferCI = {}; //
bufferCI.Size = 1024; // CommandList* loadCmd = AcquireCommandList(GraphicsDevice);
bufferCI.Usage = BufferUsage::StructuredBuffer; // SRV for ResourceDescriptorHeap access // LoadMeshesOnGPU(loadCmd);
StructuredBuffer = CreateGraphicsBuffer(GraphicsDevice, bufferCI); // SubmitCommandLists(loadCmd);
TransferBufferCreateInfo transferCI = {};
transferCI.Size = 1024;
transferCI.Usage = TransferBufferUsage::Upload;
TransferBuffer = CreateGraphicsTransferBuffer(GraphicsDevice, transferCI);
// Upload Static Data for Test
if (TransferBuffer && StructuredBuffer)
{
void* data = MapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
if (data)
{
Matrix projection = PerspectiveFov(60.0f * (3.14159f / 180.0f), 1200.0f / 800.0f, 0.1f, 1000.0f);
Matrix view = LookAt({ 30.0f, 0.0f, 10.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 1.0f });
Matrix model = Matrix::Identity();
Matrix mvp = projection * view * model;
MemCopy(data, &mvp, sizeof(Matrix));
UnmapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
CommandList* initCmd = AcquireCommandList(GraphicsDevice);
CopyBuffer(initCmd, StructuredBuffer, TransferBuffer, 256);
TransitionBufferToReadable(initCmd, StructuredBuffer);
SubmitCommandLists(initCmd);
}
}
CubeArena = ArenaAllocate({ .ReserveSize = Kilobytes(1llu), .CommitSize = Kilobytes(1llu) } JULIET_DEBUG_PARAM("CubeArena"));
CubeMesh = CreateCubeMesh(CubeArena);
// CubeMesh = CreateQuadMesh(CubeArena);
if (vertexShader)
{
DestroyShader(GraphicsDevice, vertexShader);
}
if (fragmentShader)
{
DestroyShader(GraphicsDevice, fragmentShader);
}
if (Running == false) if (Running == false)
{ {
@@ -208,8 +139,6 @@ void JulietApplication::Shutdown()
{ {
Log(LogLevel::Message, LogCategory::Tool, "Shutting down Juliet Application..."); Log(LogLevel::Message, LogCategory::Tool, "Shutting down Juliet Application...");
ArenaRelease(CubeArena);
if (GameCode.IsValid) if (GameCode.IsValid)
{ {
Game.Shutdown(); Game.Shutdown();
@@ -220,19 +149,14 @@ void JulietApplication::Shutdown()
{ {
DestroyGraphicsPipeline(GraphicsDevice, GraphicsPipeline); DestroyGraphicsPipeline(GraphicsDevice, GraphicsPipeline);
} }
if (StructuredBuffer)
{
DestroyGraphicsBuffer(GraphicsDevice, StructuredBuffer);
}
if (TransferBuffer)
{
DestroyGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
}
if (DepthBuffer) if (DepthBuffer)
{ {
DestroyTexture(GraphicsDevice, DepthBuffer); DestroyTexture(GraphicsDevice, DepthBuffer);
} }
ShutdownMeshRenderer();
if (MainWindow && GraphicsDevice) if (MainWindow && GraphicsDevice)
{ {
DetachFromWindow(GraphicsDevice, MainWindow); DetachFromWindow(GraphicsDevice, MainWindow);
@@ -248,6 +172,8 @@ void JulietApplication::Shutdown()
DestroyGraphicsDevice(GraphicsDevice); DestroyGraphicsDevice(GraphicsDevice);
} }
ArenaRelease(PlatformArena);
Log(LogLevel::Message, LogCategory::Tool, "Juliet App shutdown Completed"); Log(LogLevel::Message, LogCategory::Tool, "Juliet App shutdown Completed");
} }
@@ -281,7 +207,7 @@ void JulietApplication::Update()
} }
#ifdef JULIET_ENABLE_IMGUI #ifdef JULIET_ENABLE_IMGUI
ImGui::ShowDemoWindow(); // ImGui::ShowDemoWindow();
#endif #endif
DebugDisplay_DrawLine({ 0.0f, 0.0f, 0.0f }, { 1.0f, 0.0f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f }, false); DebugDisplay_DrawLine({ 0.0f, 0.0f, 0.0f }, { 1.0f, 0.0f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f }, false);
@@ -301,27 +227,7 @@ void JulietApplication::Update()
WaitUntilGPUIsIdle(GraphicsDevice); WaitUntilGPUIsIdle(GraphicsDevice);
#if ALLOW_SHADER_HOT_RELOAD #if ALLOW_SHADER_HOT_RELOAD
String entryPoint = WrapString("main"); ReloadMeshRendererShaders();
ShaderCreateInfo shaderCI = {};
shaderCI.EntryPoint = entryPoint;
String shaderPath = WrapString("../../Assets/compiled/Triangle.vert.dxil");
shaderCI.Stage = ShaderStage::Vertex;
Shader* vertexShader = CreateShader(GraphicsDevice, shaderPath, shaderCI);
shaderPath = WrapString("../../Assets/compiled/SolidColor.frag.dxil");
shaderCI.Stage = ShaderStage::Fragment;
Shader* fragmentShader = CreateShader(GraphicsDevice, shaderPath, shaderCI);
UpdateGraphicsPipelineShaders(GraphicsDevice, GraphicsPipeline, vertexShader, fragmentShader);
if (vertexShader)
{
DestroyShader(GraphicsDevice, vertexShader);
}
if (fragmentShader)
{
DestroyShader(GraphicsDevice, fragmentShader);
}
#endif #endif
} }
@@ -361,76 +267,16 @@ void JulietApplication::Update()
ArenaClear(GameScratchArena); ArenaClear(GameScratchArena);
} }
void JulietApplication::OnPreRender(CommandList* cmd) void JulietApplication::OnPreRender(CommandList* /*cmd*/) {}
void JulietApplication::OnRender(RenderPass*, CommandList*)
{ {
index_t index = 0; // PushData pushData = {};
// pushData.ViewProjection = Camera_GetViewProjectionMatrix(GetDebugCamera());
// Buffer uploads // RenderMeshes(pass, cmd, pushData);
if (StructuredBuffer && TransferBuffer)
{
void* ptr = MapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
if (ptr)
{
Vertex* vertices = static_cast<Vertex*>(ptr);
// // Triangle 1 // SetPushConstants(cmd, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData);
// vertices[index++] = { { -0.5f, -0.5f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }; // Red
// vertices[index++] = { { 0.0f, 0.5f, 0.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }; // Green
// vertices[index++] = { { 0.5f, -0.5f, 0.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } }; // Blue
//
// // Triangle 2
// vertices[index++] = { { -0.5f, 0.5f, 0.0f }, { 1.0f, 1.0f, 0.0f, 1.0f } }; // Yellow
// vertices[index++] = { { 0.0f, 0.8f, 0.0f }, { 0.0f, 1.0f, 1.0f, 1.0f } }; // Cyan
// vertices[index++] = { { 0.5f, 0.5f, 0.0f }, { 1.0f, 0.0f, 1.0f, 1.0f } }; // Magenta
if (CubeMesh)
{
CubeMesh->VertexOffset = index;
size_t vertexSize = CubeMesh->VertexCount * sizeof(Vertex);
MemCopy(vertices + index, CubeMesh->Vertices, vertexSize);
CubeMesh->IndexByteOffset = (index + CubeMesh->VertexCount) * sizeof(Vertex);
// Align
CubeMesh->IndexByteOffset = (CubeMesh->IndexByteOffset + 255) & static_cast<size_t>(~255);
size_t indexSize = CubeMesh->IndexCount * sizeof(uint16);
CubeMesh->IndexOffset = 0;
uint8* ptrOneByte = static_cast<uint8*>(ptr);
uint16* dst = reinterpret_cast<uint16*>(ptrOneByte + CubeMesh->IndexByteOffset);
MemCopy(dst, CubeMesh->Indices, indexSize);
}
UnmapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
}
CopyBuffer(cmd, StructuredBuffer, TransferBuffer, CubeMesh->IndexByteOffset + (CubeMesh->IndexCount * sizeof(uint16)));
TransitionBufferToReadable(cmd, StructuredBuffer);
}
}
void JulietApplication::OnRender(RenderPass* pass, CommandList* cmd)
{
BindGraphicsPipeline(pass, GraphicsPipeline);
uint32 descriptorIndex = GetDescriptorIndex(GraphicsDevice, StructuredBuffer);
struct PushData
{
Matrix ViewProjection;
uint32 BufferIndex;
} pushData = {};
pushData.BufferIndex = descriptorIndex;
pushData.ViewProjection = Camera_GetViewProjectionMatrix(GetDebugCamera());
SetPushConstants(cmd, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData);
SetIndexBuffer(cmd, StructuredBuffer, IndexFormat::UInt16, CubeMesh->IndexCount, CubeMesh->IndexByteOffset);
// DrawIndexedPrimitives(pass, static_cast<uint32>(CubeMesh->IndexCount), 1, 0, 0, 0);
DrawIndexedPrimitives(pass, static_cast<uint32>(CubeMesh->IndexCount), 1,
static_cast<uint32>(CubeMesh->IndexOffset), static_cast<uint32>(CubeMesh->VertexOffset), 0);
} }
ColorTargetInfo JulietApplication::GetColorTargetInfo(Texture* swapchainTexture) ColorTargetInfo JulietApplication::GetColorTargetInfo(Texture* swapchainTexture)

View File

@@ -38,19 +38,13 @@ class JulietApplication : public Juliet::IApplication
int GetAutoCloseFrameCount() const { return AutoCloseFrameCount; } int GetAutoCloseFrameCount() const { return AutoCloseFrameCount; }
private: private:
Juliet::Window* MainWindow = {}; Juliet::Window* MainWindow = {};
Juliet::GraphicsDevice* GraphicsDevice = {}; Juliet::GraphicsDevice* GraphicsDevice = {};
Juliet::HotReloadCode GameCode = {}; Juliet::HotReloadCode GameCode = {};
Juliet::GraphicsPipeline* GraphicsPipeline = {}; Juliet::GraphicsPipeline* GraphicsPipeline = {};
Juliet::GraphicsBuffer* StructuredBuffer = {}; Juliet::Texture* DepthBuffer = {};
Juliet::GraphicsTransferBuffer* TransferBuffer = {}; Juliet::Arena* GameArena = nullptr;
Juliet::Texture* DepthBuffer = {}; Juliet::Arena* GameScratchArena = nullptr;
Juliet::Mesh* CubeMesh = {};
Juliet::Arena* CubeArena = nullptr;
Juliet::Arena* GameArena = nullptr;
Juliet::Arena* GameScratchArena = nullptr;
int AutoCloseFrameCount = -1; int AutoCloseFrameCount = -1;
bool Running = false; bool Running = false;

View File

@@ -1,73 +1,630 @@
[2026-02-16 16:02:02.4149977] Starting Unit Tests... [2026-02-21 23:07:28.6894112] Starting Unit Tests...
Running Paged Memory Arena Tests... Running Paged Memory Arena Tests...
[2026-02-16 16:02:02.4153152] Allocating from W:\Classified\Juliet\Juliet\src\Core\Memory\MemoryArenaTests.cpp : 23l [2026-02-21 23:07:28.6896698] Allocating from W:\Classified\Juliet\Juliet\src\Core\Memory\MemoryArenaTests.cpp : 23l
[2026-02-16 16:02:02.4154229] Allocating from W:\Classified\Juliet\Juliet\src\Core\Memory\MemoryArena.cpp : 181l [2026-02-21 23:07:28.6897701] Allocating from W:\Classified\Juliet\Juliet\src\Core\Memory\MemoryArena.cpp : 181l
[2026-02-16 16:02:02.4264282] Allocating from W:\Classified\Juliet\Juliet\src\Core\Memory\MemoryArenaTests.cpp : 122l [2026-02-21 23:07:28.7003022] Allocating from W:\Classified\Juliet\Juliet\src\Core\Memory\MemoryArenaTests.cpp : 122l
[2026-02-16 16:02:02.4266593] Allocating from W:\Classified\Juliet\Juliet\src\Core\Memory\MemoryArenaTests.cpp : 141l [2026-02-21 23:07:28.7005045] Allocating from W:\Classified\Juliet\Juliet\src\Core\Memory\MemoryArenaTests.cpp : 141l
All Paged MemoryArena tests passed. All Paged MemoryArena tests passed.
[2026-02-16 16:02:02.4268147] Allocating from Juliet/include\Core/Container/Vector.h : 22l [2026-02-21 23:07:28.7006190] Allocating from Juliet/include\Core/Container/Vector.h : 22l
[2026-02-16 16:02:02.4269590] Allocating from Juliet/include\Core/Container/Vector.h : 22l [2026-02-21 23:07:28.7007239] Allocating from Juliet/include\Core/Container/Vector.h : 22l
[2026-02-16 16:02:02.4270984] Allocating from Juliet/include\Core/Container/Vector.h : 22l [2026-02-21 23:07:28.7008239] Allocating from Juliet/include\Core/Container/Vector.h : 22l
[2026-02-16 16:02:02.4272310] Allocating from Juliet/include\Core/Container/Vector.h : 22l [2026-02-21 23:07:28.7009231] Allocating from Juliet/include\Core/Container/Vector.h : 22l
[2026-02-16 16:02:02.4273792] Allocating from W:\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest.cpp : 152l [2026-02-21 23:07:28.7010362] Allocating from W:\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest.cpp : 152l
[2026-02-16 16:02:02.4275180] Allocating from W:\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest.cpp : 212l [2026-02-21 23:07:28.7011542] Allocating from W:\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest.cpp : 212l
[2026-02-16 16:02:02.4276613] Allocating from W:\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest.cpp : 231l [2026-02-21 23:07:28.7013055] Allocating from W:\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest.cpp : 231l
[2026-02-16 16:02:02.4277980] Allocating from W:\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest.cpp : 258l [2026-02-21 23:07:28.7014501] Allocating from W:\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest.cpp : 258l
[2026-02-16 16:02:02.4279316] Allocating from W:\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest.cpp : 275l [2026-02-21 23:07:28.7015854] Allocating from W:\Classified\Juliet\Juliet\src\UnitTest\Container\VectorUnitTest.cpp : 275l
[2026-02-16 16:02:02.4280555] Unit Tests Completed Successfully. [2026-02-21 23:07:28.7017277] Unit Tests Completed Successfully.
[2026-02-16 16:02:02.4281360] Allocating from W:\Classified\Juliet\Juliet\src\Core\HAL\Display\Display.cpp : 26l [2026-02-21 23:07:28.7018198] Allocating from W:\Classified\Juliet\Juliet\src\Core\HAL\Display\Display.cpp : 26l
[2026-02-16 16:02:02.4282502] Allocating from Juliet/include\Core/Container/Vector.h : 22l [2026-02-21 23:07:28.7019410] Allocating from Juliet/include\Core/Container/Vector.h : 22l
[2026-02-16 16:02:02.4283584] Initializing Juliet Application... [2026-02-21 23:07:28.7020442] Initializing Juliet Application...
[2026-02-16 16:02:02.4284436] w:\Classified\Juliet\bin\x64Clang-Debug\ [2026-02-21 23:07:28.7021156] W:\Classified\Juliet\bin\x64Clang-Debug\
[2026-02-16 16:02:02.6190578] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12GraphicsDevice.cpp : 709l [2026-02-21 23:07:28.7021800] Allocating from W:\Classified\Juliet\JulietApp\main.cpp : 77l
[2026-02-16 16:02:02.6205209] D3D12 Driver Infos: [2026-02-21 23:07:28.9129941] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12GraphicsDevice.cpp : 710l
[2026-02-16 16:02:02.6206266] D3D12 Adapter: AMD Radeon RX 5700 XT [2026-02-21 23:07:28.9142381] D3D12 Driver Infos:
[2026-02-16 16:02:02.6206942] D3D12 Driver Version: 32.0.21041.1000 [2026-02-21 23:07:28.9143146] D3D12 Adapter: AMD Radeon RX 5700 XT
[2026-02-16 16:02:02.7715117] DX12: D3D12Device Created: 000001AE0FCD6AC0 [2026-02-21 23:07:28.9143699] D3D12 Driver Version: 32.0.21041.1000
[2026-02-16 16:02:02.7716961] DX12: Debug Info Logger Initialized [2026-02-21 23:07:29.0218143] DX12: D3D12Device Created: 000001E74B43C060
[2026-02-16 16:02:02.7759926] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Common.cpp : 52l [2026-02-21 23:07:29.0219203] DX12: Debug Info Logger Initialized
[2026-02-16 16:02:02.7762940] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Common.cpp : 52l [2026-02-21 23:07:29.0252979] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Common.cpp : 52l
[2026-02-16 16:02:02.7764796] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Common.cpp : 52l [2026-02-21 23:07:29.0255980] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Common.cpp : 52l
[2026-02-16 16:02:02.7767423] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Common.cpp : 52l [2026-02-21 23:07:29.0257980] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Common.cpp : 52l
[2026-02-16 16:02:02.7769776] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12DescriptorHeap.cpp : 15l [2026-02-21 23:07:29.0260445] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12Common.cpp : 52l
[2026-02-16 16:02:02.7862548] Allocating from W:\Classified\Juliet\Juliet\src\Core\HAL\Display\Display.cpp : 83l [2026-02-21 23:07:29.0262559] Allocating from W:\Classified\Juliet\Juliet\src\Graphics\D3D12\D3D12DescriptorHeap.cpp : 15l
[2026-02-16 16:02:02.8281025] CreateBuffer: Device=000001AE0FCD6AC0, Size=1024, Type=Base Use=StructuredBuffer [2026-02-21 23:07:29.0329752] Allocating from W:\Classified\Juliet\Juliet\src\Core\HAL\Display\Display.cpp : 83l
[2026-02-16 16:02:02.8287554] -> SRV DescriptorIndex=1 [2026-02-21 23:07:29.0726746] Allocating from W:\Classified\Juliet\Juliet\src\Core\HotReload\HotReload.cpp : 14l
[2026-02-16 16:02:02.8288672] CreateBuffer: Device=000001AE0FCD6AC0, Size=1024, Type=TransferUpload Use=None [2026-02-21 23:07:29.1009264] Allocating from W:\Classified\Juliet\JulietApp\main.cpp : 131l
[2026-02-16 16:02:02.8304524] Allocating from W:\Classified\Juliet\JulietApp\main.cpp : 174l [2026-02-21 23:07:29.1010784] Allocating from W:\Classified\Juliet\JulietApp\main.cpp : 132l
[2026-02-16 16:02:02.8306076] Allocating from W:\Classified\Juliet\Juliet\src\Core\HotReload\HotReload.cpp : 14l Game Arena Allocated: 000001E718000080
[2026-02-16 16:02:02.8561774] Allocating from W:\Classified\Juliet\JulietApp\main.cpp : 200l
[2026-02-16 16:02:02.8563269] Allocating from W:\Classified\Juliet\JulietApp\main.cpp : 201l
Game Arena Allocated: 000001AE56E00080
Door is Opened Door is Opened
Rock has 100 health points Rock has 100 health points
[2026-02-16 16:02:02.8565687] CreateBuffer: Device=000001AE0FCD6AC0, Size=458752, Type=Base Use=StructuredBuffer [2026-02-21 23:07:29.1012934] CreateBuffer: Device=000001E74B43C060, Size=458752, Type=Base Use=StructuredBuffer
[2026-02-16 16:02:02.8575789] -> SRV DescriptorIndex=2 [2026-02-21 23:07:29.1021401] -> SRV DescriptorIndex=1
[2026-02-16 16:02:02.8576717] CreateBuffer: Device=000001AE0FCD6AC0, Size=458752, Type=TransferUpload Use=None [2026-02-21 23:07:29.1022149] CreateBuffer: Device=000001E74B43C060, Size=458752, Type=TransferUpload Use=None
[2026-02-16 16:02:02.8583558] Allocating from W:\Classified\Juliet\Juliet\src\Core\ImGui\ImGuiService.cpp : 44l [2026-02-21 23:07:29.1039161] Acquire Querier SubmitCommandLists | Setting Signal to 0 NEW fence
ImGuiRenderer_Initialize: device=000001AE2B1AC730, g_ImGuiState=00007FFE66A66140, Initialized=0 [2026-02-21 23:07:29.1040168] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-16 16:02:02.8634723] CreateBuffer: Device=000001AE0FCD6AC0, Size=262144, Type=TransferUpload Use=None [2026-02-21 23:07:29.1049359] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
ImGuiService: Running Unit Tests... [2026-02-21 23:07:29.1080351] Acquire Querier SubmitCommandLists | Setting Signal to 0 NEW fence
TestImGui: Context Verified. [2026-02-21 23:07:29.1081700] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
TestImGui: IO Verified. Backend: imgui_impl_win32 [2026-02-21 23:07:29.1086393] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
TestImGui: Version Verified: 1.92.6 WIP [2026-02-21 23:07:29.1094686] Waiting for 1 fences. Querier AcquireSwapChainTexture
TestImGui: Fonts Verified. [2026-02-21 23:07:29.1095416] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
TestImGui: Fonts Built Status: 1 [2026-02-21 23:07:29.1096043] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
TestImGui: Font Atlas Verified. [2026-02-21 23:07:29.1096697] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
TestImGui: Style Verified. [2026-02-21 23:07:29.1100872] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
TestImGui: About to DrawList check. [2026-02-21 23:07:29.1101673] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
ImGui tests passed (Exhaustive). [2026-02-21 23:07:29.1115502] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-16 16:02:02.8744932] CreateBuffer: Device=000001AE0FCD6AC0, Size=101400, Type=Base Use=StructuredBuffer [2026-02-21 23:07:29.1116597] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-16 16:02:02.8754236] -> SRV DescriptorIndex=4 [2026-02-21 23:07:29.1117262] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-16 16:02:02.8755349] CreateBuffer: Device=000001AE0FCD6AC0, Size=101400, Type=TransferUpload Use=None [2026-02-21 23:07:29.1117877] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-16 16:02:02.8762446] CreateBuffer: Device=000001AE0FCD6AC0, Size=20258, Type=Base Use=IndexBuffer [2026-02-21 23:07:29.1119523] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-16 16:02:02.8768422] CreateBuffer: Device=000001AE0FCD6AC0, Size=20258, Type=TransferUpload Use=None [2026-02-21 23:07:29.1120219] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-16 16:02:02.8797340] CreateBuffer: Device=000001AE0FCD6AC0, Size=101400, Type=Base Use=StructuredBuffer [2026-02-21 23:07:29.1219018] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-16 16:02:02.8805045] -> SRV DescriptorIndex=5 [2026-02-21 23:07:29.1220233] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-16 16:02:02.8806249] CreateBuffer: Device=000001AE0FCD6AC0, Size=101400, Type=TransferUpload Use=None [2026-02-21 23:07:29.1548977] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-16 16:02:02.8812642] CreateBuffer: Device=000001AE0FCD6AC0, Size=20258, Type=Base Use=IndexBuffer [2026-02-21 23:07:29.1550120] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-16 16:02:02.8819564] CreateBuffer: Device=000001AE0FCD6AC0, Size=20258, Type=TransferUpload Use=None [2026-02-21 23:07:29.1550761] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-16 16:02:03.7970638] Auto-closing application as requested. [2026-02-21 23:07:29.1552723] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-16 16:02:03.8504471] Shutting down Juliet Application... [2026-02-21 23:07:29.1553462] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
Shutting down game... [2026-02-21 23:07:29.1556713] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-16 16:02:03.8768023] Juliet App shutdown Completed [2026-02-21 23:07:29.1557420] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.1883044] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.1884217] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.1884842] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.1886605] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.1887304] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.1890054] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.1890773] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.2217941] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.2219489] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.2220127] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.2221841] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.2222537] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.2225840] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.2229455] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.2383337] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.2384502] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.2385116] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.2386715] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.2387404] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.2390131] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.2390831] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.2550069] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.2551509] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.2552277] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.2554968] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.2555885] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.2559458] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.2560186] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.2716329] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.2717566] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.2718188] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.2719830] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.2720524] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.2723588] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.2724293] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.2883261] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.2884544] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.2885176] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.2886957] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.2887651] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.2890525] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.2891224] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.3049791] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.3051053] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.3051742] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.3053687] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.3054490] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.3057488] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.3058663] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.3217358] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.3221037] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.3221787] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.3223392] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.3224151] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.3226868] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.3227563] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.3384015] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.3385231] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.3385849] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.3387972] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.3388806] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.3391764] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.3392454] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.3549502] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.3550678] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.3551300] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.3553365] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.3554239] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.3557324] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.3558173] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.3718790] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.3720342] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.3720964] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.3722930] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.3723626] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.3727154] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.3727858] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.3883475] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.3884716] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.3885407] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.3887072] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.3887751] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.3890449] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.3891139] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.4050130] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.4051451] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.4052211] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.4057504] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.4058242] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.4061362] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.4062069] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.4220033] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.4221699] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.4222655] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.4224440] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.4225130] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.4228507] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.4230289] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.4383211] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.4384322] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.4384929] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.4386460] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.4387140] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.4389800] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.4390485] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.4551206] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.4552471] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.4553160] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.4555175] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.4555999] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.4559124] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.4559860] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.4716976] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.4718104] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.4718706] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.4720319] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.4720992] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.4723706] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.4724395] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.4885510] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.4886733] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.4887339] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.4889002] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.4889685] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.4897593] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.4898428] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.5050352] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.5051512] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.5052118] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.5053676] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.5054354] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.5057139] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.5057836] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.5217239] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.5218315] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.5218914] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.5220452] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.5221130] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.5223847] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.5224647] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.5386262] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.5387997] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.5388616] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.5391048] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.5391783] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.5395836] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.5396547] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.5551587] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.5552707] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.5553349] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.5554919] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.5555694] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.5558460] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.5559151] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.5718849] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.5720184] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.5720876] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.5722595] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.5723368] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.5725932] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.5726729] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.5884407] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.5888274] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.5889019] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.5890669] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.5891355] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.5894190] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.5894895] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.6050657] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.6051767] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.6052379] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.6053974] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.6054653] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.6057525] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.6058220] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.6219736] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.6221289] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.6221919] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.6223510] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.6224542] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.6228430] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.6229127] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.6384486] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.6385667] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.6386281] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.6387914] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.6388594] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.6391646] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.6392352] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.6552723] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.6554321] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.6555066] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.6556890] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.6557586] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.6561253] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.6561985] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.6718770] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.6719922] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.6723202] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.6725049] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.6725750] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.6728510] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.6729221] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.6885332] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.6886638] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.6887277] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.6888980] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.6889667] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.6892578] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.6893267] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.7051422] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.7052573] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.7053184] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.7054859] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.7055545] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.7058434] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.7059136] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.7218363] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.7219475] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.7220075] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.7221733] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.7222401] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.7225114] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.7225796] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.7385886] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.7387196] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.7388121] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.7389703] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.7390388] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.7394514] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.7395229] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.7552948] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.7554259] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.7554947] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.7557460] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.7558396] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.7564970] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.7565703] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.7721069] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.7722609] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.7723235] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.7725031] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.7725708] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.7728847] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.7729540] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.7884869] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.7886006] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.7886609] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.7888126] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.7888803] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.7891520] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.7892211] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.8051647] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.8052788] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.8053391] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.8054907] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.8055588] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.8058434] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.8059125] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.8221185] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.8222806] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.8223454] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.8225130] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.8225832] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.8228357] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.8229053] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.8385143] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.8386319] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.8387099] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.8388683] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.8389361] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.8392851] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.8393554] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.8554379] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.8556217] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.8556853] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.8558672] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.8559452] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.8562899] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.8563617] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.8718738] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.8719845] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.8720455] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.8721995] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.8722675] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.8725372] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.8726060] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.8888543] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.8890323] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.8890972] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.8892723] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.8893406] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.8896374] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.8897080] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.9053885] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.9055292] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.9056066] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.9057839] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.9058523] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.9061407] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.9062118] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.9219003] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.9220143] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.9220750] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.9222255] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.9222932] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.9225559] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.9226248] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.9385972] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.9387316] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.9391049] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.9393074] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.9393908] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.9396707] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.9397408] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.9552388] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.9553648] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.9554337] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.9556054] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.9556743] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.9559709] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.9560405] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.9720518] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:29.9722343] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.9723022] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:29.9724586] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.9725273] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:29.9728006] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.9728701] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.9886030] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:29.9887199] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.9887806] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:29.9889336] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:29.9890017] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:29.9892699] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:29.9893386] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.0053965] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.0055551] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.0056632] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.0058710] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.0059511] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.0065715] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.0066695] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.0220242] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.0221446] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.0222055] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.0223888] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.0226947] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.0229638] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.0230325] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.0385920] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.0387046] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.0387652] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.0389172] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.0389853] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.0393007] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.0393702] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.0553859] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.0555243] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.0555846] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.0557679] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.0558741] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.0561754] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.0562440] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.0719620] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.0720909] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.0721606] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.0723293] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.0724063] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.0727013] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.0727731] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.0886654] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.0887876] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.0888576] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.0890166] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.0890853] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.0893541] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.0894225] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.1053791] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.1054946] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.1055561] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.1057296] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.1057975] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.1060846] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.1064736] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.1219319] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.1220436] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.1221049] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.1222529] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.1223210] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.1225809] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.1226495] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.1387337] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.1388585] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.1389202] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.1390910] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.1391698] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.1394527] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.1395222] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.1552434] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.1553487] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.1554091] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.1555737] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.1556415] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.1559313] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.1560008] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.1721813] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.1723668] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.1724335] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.1725905] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.1726615] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.1729352] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.1730046] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.1887324] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.1888483] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.1889222] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.1890923] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.1891606] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.1894484] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.1895234] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.2053935] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.2057938] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.2058855] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.2061346] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.2062079] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.2065537] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.2066251] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.2222746] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.2224296] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.2224985] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.2226857] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.2227538] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.2230474] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.2231175] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.2387549] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.2388843] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.2389575] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.2391549] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.2392265] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.2394901] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.2395599] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.2555491] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.2557219] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.2558055] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.2560121] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.2560826] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.2563404] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.2564116] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.2721597] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.2722730] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.2723342] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.2724929] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.2725609] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.2729482] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.2730210] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.2887908] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.2889096] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.2889737] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.2895087] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.2896327] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.2899473] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.2900204] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.3054322] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.3055509] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.3056132] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.3057819] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.3058519] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.3061179] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.3062166] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.3220754] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.3221880] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.3222493] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.3224018] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.3224704] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.3226892] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.3227585] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.3389273] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.3390824] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.3391478] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.3393716] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.3394602] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.3397041] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.3397750] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.3555356] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.3556975] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.3557637] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.3559530] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.3560228] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.3563415] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.3564125] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.3721616] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.3722919] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.3723610] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.3725537] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.3726308] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.3731823] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.3732560] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.3887177] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.3888432] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.3889060] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.3890684] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.3891373] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.3894137] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.3894829] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.4055045] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.4056302] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.4057001] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.4058699] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.4059384] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.4062185] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.4062876] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.4221815] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.4223273] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.4224015] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.4225832] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.4226683] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.4229462] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.4230153] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.4387783] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.4388909] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.4389524] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.4391155] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.4391837] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.4394582] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.4395415] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.4556329] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.4557807] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.4558415] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.4560476] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.4561199] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.4564434] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.4565142] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.4722121] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.4725697] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.4726403] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.4728061] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.4728767] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.4731873] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.4732570] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.4889794] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.4891407] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.4892059] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.4893632] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.4894306] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.4897096] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.4897784] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.5055772] ReleaseFence Querier CleanCommandList | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2
[2026-02-21 23:07:30.5056931] ReleaseFence Querier AcquireSwapChainTexture | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.5057674] ReleaseFenceToPool 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 0
[2026-02-21 23:07:30.5059404] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.5060086] Acquire Querier SubmitCommandLists | 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 1
[2026-02-21 23:07:30.5062940] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.5063641] Waiting for 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.5222066] ReleaseFence Querier CleanCommandList | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 2
[2026-02-21 23:07:30.5223329] ReleaseFence Querier AcquireSwapChainTexture | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.5224054] ReleaseFenceToPool 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 0
[2026-02-21 23:07:30.5225742] Acquire Querier SubmitCommandLists | Setting Signal to 0, RECYCLING
[2026-02-21 23:07:30.5226521] Acquire Querier SubmitCommandLists | 71da7ca0 fence. Handle 7de99b70 | Event 464 | Refcount 1
[2026-02-21 23:07:30.5229129] Waiting for 1 fences. Querier AcquireSwapChainTexture
[2026-02-21 23:07:30.5229827] Waiting for 71da7640 fence. Handle 71e5a8b0 | Event 4a4 | Refcount 2