RHI: Refactor Fence module to pure timeline semantics
- Remove IsSignaled() from RHIFence interface (semantic inconsistency) - Remove Reset() from OpenGL implementation (no D3D12 counterpart) - OpenGL Fence now uses single GLsync + CPU counters for timeline simulation - OpenGL Fence Initialize() now accepts uint64_t initialValue (was bool) - Add comprehensive timeline semantics tests for all backends: - Signal increment/decrement scenarios - Multiple signals - Wait smaller than completed value - GetCompletedValue stages verification - Update documentation to reflect actual implementation
This commit is contained in:
@@ -22,7 +22,6 @@ public:
|
||||
void Signal(uint64_t value) override;
|
||||
void Wait(uint64_t value) override;
|
||||
uint64_t GetCompletedValue() const override;
|
||||
bool IsSignaled() const override { return m_fence->GetCompletedValue() >= m_signalValue; }
|
||||
void* GetEventHandle() { return m_eventHandle; }
|
||||
|
||||
void* GetNativeHandle() override { return m_fence.Get(); }
|
||||
@@ -31,7 +30,6 @@ public:
|
||||
private:
|
||||
ComPtr<ID3D12Fence> m_fence;
|
||||
void* m_eventHandle;
|
||||
uint64_t m_signalValue = UINT64_MAX;
|
||||
};
|
||||
|
||||
} // namespace RHI
|
||||
|
||||
@@ -1,44 +1,34 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <atomic>
|
||||
|
||||
#include "../RHIFence.h"
|
||||
|
||||
namespace XCEngine {
|
||||
namespace RHI {
|
||||
|
||||
enum class FenceStatus {
|
||||
Signaled,
|
||||
Unsignaled,
|
||||
Error
|
||||
};
|
||||
|
||||
class OpenGLFence : public RHIFence {
|
||||
public:
|
||||
OpenGLFence();
|
||||
~OpenGLFence() override;
|
||||
|
||||
bool Initialize(bool signaled = false);
|
||||
bool Initialize(uint64_t initialValue = 0);
|
||||
void Shutdown() override;
|
||||
|
||||
void Signal() override;
|
||||
void Signal(uint64_t value) override;
|
||||
void Wait(uint64_t value) override;
|
||||
void Reset();
|
||||
|
||||
bool IsSignaled() const override;
|
||||
FenceStatus GetStatus() const;
|
||||
uint64_t GetCompletedValue() const override;
|
||||
uint64_t GetCurrentValue() const { return m_fenceValue; }
|
||||
|
||||
void* GetNativeHandle() override;
|
||||
|
||||
private:
|
||||
void* m_sync;
|
||||
uint64_t m_fenceValue;
|
||||
uint64_t m_completedValue;
|
||||
bool m_signaled;
|
||||
std::atomic<uint64_t> m_signaledValue;
|
||||
std::atomic<uint64_t> m_completedValue;
|
||||
};
|
||||
|
||||
} // namespace RHI
|
||||
} // namespace XCEngine
|
||||
} // namespace XCEngine
|
||||
@@ -15,7 +15,6 @@ public:
|
||||
virtual void Signal(uint64_t value) = 0;
|
||||
virtual void Wait(uint64_t value) = 0;
|
||||
virtual uint64_t GetCompletedValue() const = 0;
|
||||
virtual bool IsSignaled() const = 0;
|
||||
|
||||
virtual void* GetNativeHandle() = 0;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user