|
|
@ -41,8 +41,8 @@ class SamplesQueryBank : public VideoCommon::BankBase { |
|
|
public: |
|
|
public: |
|
|
static constexpr size_t BANK_SIZE = 256; |
|
|
static constexpr size_t BANK_SIZE = 256; |
|
|
static constexpr size_t QUERY_SIZE = 8; |
|
|
static constexpr size_t QUERY_SIZE = 8; |
|
|
explicit SamplesQueryBank(const Device& device_, size_t index_) |
|
|
|
|
|
: BankBase(BANK_SIZE), device{device_}, index{index_} { |
|
|
|
|
|
|
|
|
explicit SamplesQueryBank(const Device& device_, Scheduler& scheduler_, size_t index_) |
|
|
|
|
|
: BankBase(BANK_SIZE), device{device_}, scheduler{scheduler_}, index{index_} { |
|
|
const auto& dev = device.GetLogical(); |
|
|
const auto& dev = device.GetLogical(); |
|
|
query_pool = dev.CreateQueryPool({ |
|
|
query_pool = dev.CreateQueryPool({ |
|
|
.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, |
|
|
.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, |
|
|
@ -60,12 +60,28 @@ public: |
|
|
void Reset() override { |
|
|
void Reset() override { |
|
|
ASSERT(references == 0); |
|
|
ASSERT(references == 0); |
|
|
VideoCommon::BankBase::Reset(); |
|
|
VideoCommon::BankBase::Reset(); |
|
|
const auto& dev = device.GetLogical(); |
|
|
|
|
|
dev.ResetQueryPool(*query_pool, 0, BANK_SIZE); |
|
|
|
|
|
|
|
|
if (device.IsHostQueryResetSupported()) { |
|
|
|
|
|
const auto& dev = device.GetLogical(); |
|
|
|
|
|
dev.ResetQueryPool(*query_pool, 0, BANK_SIZE); |
|
|
|
|
|
} else { |
|
|
|
|
|
scheduler.RequestOutsideRenderPassOperationContext(); |
|
|
|
|
|
scheduler.Record([pool = *query_pool](vk::CommandBuffer cmdbuf) { |
|
|
|
|
|
cmdbuf.ResetQueryPool(pool, 0, BANK_SIZE); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
host_results.fill(0ULL); |
|
|
host_results.fill(0ULL); |
|
|
next_bank = 0; |
|
|
next_bank = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void AddReference(size_t how_many = 1) { |
|
|
|
|
|
BankBase::AddReference(how_many); |
|
|
|
|
|
last_used_tick = scheduler.CurrentTick(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[[nodiscard]] bool IsDead() const { |
|
|
|
|
|
return BankBase::IsDead() && scheduler.IsFree(last_used_tick); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void Sync(size_t start, size_t size) { |
|
|
void Sync(size_t start, size_t size) { |
|
|
const auto& dev = device.GetLogical(); |
|
|
const auto& dev = device.GetLogical(); |
|
|
const VkResult query_result = dev.GetQueryResults( |
|
|
const VkResult query_result = dev.GetQueryResults( |
|
|
@ -98,9 +114,11 @@ public: |
|
|
|
|
|
|
|
|
private: |
|
|
private: |
|
|
const Device& device; |
|
|
const Device& device; |
|
|
|
|
|
Scheduler& scheduler; |
|
|
const size_t index; |
|
|
const size_t index; |
|
|
vk::QueryPool query_pool; |
|
|
vk::QueryPool query_pool; |
|
|
std::array<u64, BANK_SIZE> host_results; |
|
|
std::array<u64, BANK_SIZE> host_results; |
|
|
|
|
|
u64 last_used_tick{}; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
using BaseStreamer = VideoCommon::SimpleStreamer<VideoCommon::HostQueryBase>; |
|
|
using BaseStreamer = VideoCommon::SimpleStreamer<VideoCommon::HostQueryBase>; |
|
|
@ -431,7 +449,7 @@ private: |
|
|
void ReserveBank() { |
|
|
void ReserveBank() { |
|
|
current_bank_id = |
|
|
current_bank_id = |
|
|
bank_pool.ReserveBank([this](std::deque<SamplesQueryBank>& queue, size_t index) { |
|
|
bank_pool.ReserveBank([this](std::deque<SamplesQueryBank>& queue, size_t index) { |
|
|
queue.emplace_back(device, index); |
|
|
|
|
|
|
|
|
queue.emplace_back(device, scheduler, index); |
|
|
}); |
|
|
}); |
|
|
if (current_bank) { |
|
|
if (current_bank) { |
|
|
current_bank->next_bank = current_bank_id + 1; |
|
|
current_bank->next_bank = current_bank_id + 1; |
|
|
@ -620,6 +638,15 @@ public: |
|
|
VideoCommon::BankBase::Reset(); |
|
|
VideoCommon::BankBase::Reset(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void AddReference(size_t how_many = 1) { |
|
|
|
|
|
BankBase::AddReference(how_many); |
|
|
|
|
|
last_used_tick = scheduler.CurrentTick(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[[nodiscard]] bool IsDead() const { |
|
|
|
|
|
return BankBase::IsDead() && scheduler.IsFree(last_used_tick); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void Sync(StagingBufferRef& stagging_buffer, size_t extra_offset, size_t start, size_t size) { |
|
|
void Sync(StagingBufferRef& stagging_buffer, size_t extra_offset, size_t start, size_t size) { |
|
|
scheduler.RequestOutsideRenderPassOperationContext(); |
|
|
scheduler.RequestOutsideRenderPassOperationContext(); |
|
|
scheduler.Record([this, dst_buffer = stagging_buffer.buffer, extra_offset, start, |
|
|
scheduler.Record([this, dst_buffer = stagging_buffer.buffer, extra_offset, start, |
|
|
@ -645,6 +672,7 @@ private: |
|
|
Scheduler& scheduler; |
|
|
Scheduler& scheduler; |
|
|
const size_t index; |
|
|
const size_t index; |
|
|
vk::Buffer buffer; |
|
|
vk::Buffer buffer; |
|
|
|
|
|
u64 last_used_tick{}; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
class PrimitivesSucceededStreamer; |
|
|
class PrimitivesSucceededStreamer; |
|
|
|